Prompt new users to customize their feed (#6979)

This commit is contained in:
Mac Siri 2020-03-31 17:32:11 -04:00 committed by GitHub
parent d1fc988ed0
commit fc728af0cd
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 66 additions and 7 deletions

View file

@ -17,6 +17,7 @@ module Broadcasts
send_welcome_notification unless notification_enqueued
send_authentication_notification unless notification_enqueued
send_ux_customization_notification unless notification_enqueued
send_feed_customization_notification unless notification_enqueued
end
private
@ -38,12 +39,18 @@ module Broadcasts
end
def send_ux_customization_notification
return if received_notification?(customize_broadcast) || user.created_at > 5.days.ago
return if received_notification?(customize_ux_broadcast) || user.created_at > 5.days.ago
Notification.send_welcome_notification(user.id, customize_broadcast.id)
Notification.send_welcome_notification(user.id, customize_ux_broadcast.id)
@notification_enqueued = true
end
def send_feed_customization_notification
return if user_is_following_tags? || received_notification?(customize_feed_broadcast) || user.created_at > 3.days.ago
Notification.send_welcome_notification(user.id, customize_feed_broadcast.id)
end
def received_notification?(broadcast)
Notification.exists?(notifiable: broadcast, user: user)
end
@ -57,12 +64,20 @@ module Broadcasts
identities.count == SiteConfig.authentication_providers.count
end
def user_is_following_tags?
user.cached_followed_tag_names.count > 1
end
def welcome_broadcast
@welcome_broadcast ||= Broadcast.find_by(title: "Welcome Notification: welcome_thread")
end
def customize_broadcast
@customize_broadcast ||= Broadcast.find_by(title: "Welcome Notification: customize_experience")
def customize_ux_broadcast
@customize_ux_broadcast ||= Broadcast.find_by(title: "Welcome Notification: customize_experience")
end
def customize_feed_broadcast
@customize_feed_broadcast ||= Broadcast.find_by(title: "Welcome Notification: customize_feed")
end
def identities

View file

@ -250,6 +250,7 @@ broadcast_messages = {
welcome_thread: "Sloan here again! 👋 DEV is a friendly community. Why not introduce yourself by leaving a comment in <a href='/welcome'>the welcome thread</a>!",
twitter_connect: "You're on a roll! 🎉 Let's connect your <a href='/settings'> Twitter account</a> to complete your identity so that we don't think you're a robot. 🤖",
github_connect: "You're on a roll! 🎉 Let's connect your <a href='/settings'> GitHub account</a> to complete your identity so that we don't think you're a robot. 🤖",
customize_feed: "Hi, it's me again! 👋 Now that you're a part of the DEV community, let's focus on personalizing your content. You can start by <a href='/tags'>following some tags</a> to help customize your feed! 🎉",
customize_experience: "Sloan here! 👋 Did you know that that you can customize your DEV experience? Try changing <a href='settings/ux'>your font and theme</a> and find the best style for you!"
}

View file

@ -20,12 +20,18 @@ FactoryBot.define do
processed_html { "You're on a roll! 🎉 Let's connect your <a href='/settings'> GitHub account</a> to complete your identity so that we don't think you're a robot. 🤖" }
end
factory :customize_broadcast do
factory :customize_ux_broadcast do
title { "Welcome Notification: customize_experience" }
type_of { "Welcome" }
processed_html { "Sloan here! 👋 Did you know that that you can customize your DEV experience? Try changing <a href='settings/ux'>your font and theme</a> and find the best style for you!" }
end
factory :customize_feed_broadcast do
title { "Welcome Notification: customize_feed" }
type_of { "Welcome" }
processed_html { "Hi, it's me again! 👋 Now that you're a part of the DEV community, let's focus on personalizing your content. You can start by <a href='/tags'>following some tags</a> to help customize your feed! 🎉" }
end
# TODO: [@thepracticaldev/delightful] Remove onboarding factory once welcome notifications are live.
factory :onboarding_broadcast do
title { "Welcome Notification" }

View file

@ -6,7 +6,8 @@ RSpec.describe Broadcasts::WelcomeNotification::Generator, type: :service do
let!(:welcome_broadcast) { create(:welcome_broadcast) }
let!(:twitter_connect_broadcast) { create(:twitter_connect_broadcast) }
let!(:github_connect_broadcast) { create(:github_connect_broadcast) }
let!(:customize_broadcast) { create(:customize_broadcast) }
let!(:customize_ux_broadcast) { create(:customize_ux_broadcast) }
let!(:customize_feed_broadcast) { create(:customize_feed_broadcast) }
before do
allow(Notification).to receive(:send_welcome_notification).and_call_original
@ -126,7 +127,7 @@ RSpec.describe Broadcasts::WelcomeNotification::Generator, type: :service do
it "generates the correct broadcast type and sends the notification to the user" do
sidekiq_perform_enqueued_jobs { described_class.new(user.id).send(:send_ux_customization_notification) }
expect(user.notifications.count).to eq(1)
expect(user.notifications.first.notifiable).to eq(customize_broadcast)
expect(user.notifications.first.notifiable).to eq(customize_ux_broadcast)
end
it "does not send duplicate notifications" do
@ -136,4 +137,40 @@ RSpec.describe Broadcasts::WelcomeNotification::Generator, type: :service do
expect(user.notifications.count).to eq(1)
end
end
describe "#send_feed_customization_notification" do
let!(:user) { create(:user, :with_identity, identities: %w[twitter github], created_at: 3.days.ago) }
it "does not send a notification to a newly-created user" do
user.update!(created_at: Time.zone.now)
sidekiq_perform_enqueued_jobs { described_class.new(user.id).send(:send_feed_customization_notification) }
expect(Notification).not_to have_received(:send_welcome_notification)
end
it "does not send a notification to a user that is following 2 tags" do
2.times { user.follow(create(:tag)) }
sidekiq_perform_enqueued_jobs { described_class.new(user.id).send(:send_feed_customization_notification) }
expect(Notification).not_to have_received(:send_welcome_notification)
end
it "sends a notification to a user with 0 tag follows" do
sidekiq_perform_enqueued_jobs { described_class.new(user.id).send(:send_feed_customization_notification) }
expect(user.notifications.count).to eq(1)
expect(user.notifications.first.notifiable).to eq(customize_feed_broadcast)
end
it "does not send duplicate notifications" do
2.times do
sidekiq_perform_enqueued_jobs { described_class.new(user.id).send(:send_feed_customization_notification) }
end
expect(user.notifications.count).to eq(1)
end
end
context "when sending a set_up_profile notification" do
xit "generates the appropriate broadcast to be sent to a user"
xit "it sends a welcome notification for that broadcast"
xit "it does not send duplicate welcome notification for that broadcast"
xit "does not send a notification to a user who has set up their profile"
end
end