diff --git a/plugins/discourse-narrative-bot/plugin.rb b/plugins/discourse-narrative-bot/plugin.rb index 0cf53ee3b1e..7c951dbd90f 100644 --- a/plugins/discourse-narrative-bot/plugin.rb +++ b/plugins/discourse-narrative-bot/plugin.rb @@ -114,6 +114,18 @@ after_initialize do end self.add_model_callback(User, :after_commit, on: :create) do + if SiteSetting.discourse_narrative_bot_welcome_post_delay == 0 + self.enqueue_bot_welcome_post + end + end + + self.on(:user_first_logged_in) do |user| + if SiteSetting.discourse_narrative_bot_welcome_post_delay > 0 + user.enqueue_bot_welcome_post + end + end + + self.add_to_class(:user, :enqueue_bot_welcome_post) do return if SiteSetting.disable_discourse_narrative_bot_welcome_post delay = SiteSetting.discourse_narrative_bot_welcome_post_delay diff --git a/plugins/discourse-narrative-bot/spec/integration/discobot_welcome_post_spec.rb b/plugins/discourse-narrative-bot/spec/integration/discobot_welcome_post_spec.rb new file mode 100644 index 00000000000..d47ea393266 --- /dev/null +++ b/plugins/discourse-narrative-bot/spec/integration/discobot_welcome_post_spec.rb @@ -0,0 +1,67 @@ +require 'rails_helper' + +describe "Discobot welcome post" do + let(:user) { Fabricate(:user) } + + before do + SiteSetting.queue_jobs = true + SiteSetting.discourse_narrative_bot_enabled = true + end + + after do + Jobs::NarrativeInit.jobs.clear + end + + context 'when discourse_narrative_bot_welcome_post_delay is 0' do + it 'should not delay the welcome post' do + user + expect { sign_in(user) }.to_not change { Jobs::NarrativeInit.jobs.count } + end + end + + context 'When discourse_narrative_bot_welcome_post_delay is greater than 0' do + before do + SiteSetting.discourse_narrative_bot_welcome_post_delay = 5 + end + + context 'when user logs in normally' do + it 'should delay the welcome post until user logs in' do + expect { sign_in(user) }.to change { Jobs::NarrativeInit.jobs.count }.by(1) + expect(Jobs::NarrativeInit.jobs.first["args"].first["user_id"]).to eq(user.id) + end + end + + context 'when user redeems an invite' do + let(:invite) { Fabricate(:invite, invited_by: Fabricate(:admin), email: 'testing@gmail.com') } + + it 'should delay the welcome post until the user logs in' do + invite + + expect do + xhr :put, "/invites/show/#{invite.invite_key}", + username: 'somename', + name: 'testing', + password: 'asodaasdaosdhq' + end.to change { User.count }.by(1) + + expect(Jobs::NarrativeInit.jobs.first["args"].first["user_id"]).to eq(User.last.id) + end + end + + context 'when user redeems a disposable invite' do + it 'should delay the welcome post until the user logs in' do + token = Invite.generate_disposable_tokens(user).first + + expect do + xhr :get, "/invites/redeem/#{token}", + email: 'testing@gmail.com', + username: 'somename', + name: 'testing', + password: 'asodaasdaosdhq' + end.to change { User.count }.by(1) + + expect(Jobs::NarrativeInit.jobs.first["args"].first["user_id"]).to eq(User.last.id) + end + end + end +end diff --git a/plugins/discourse-narrative-bot/spec/user_spec.rb b/plugins/discourse-narrative-bot/spec/user_spec.rb index a18d48837ce..326631fc654 100644 --- a/plugins/discourse-narrative-bot/spec/user_spec.rb +++ b/plugins/discourse-narrative-bot/spec/user_spec.rb @@ -30,7 +30,7 @@ describe User do end end - describe 'enabled' do + context 'enabled' do before do SiteSetting.disable_discourse_narrative_bot_welcome_post = false end @@ -58,30 +58,16 @@ describe User do end end - describe 'when welcome message is delayed' do + describe 'when welcome message is configured to be delayed' do before do SiteSetting.discourse_narrative_bot_welcome_post_delay = 100 SiteSetting.queue_jobs = true end - it 'should delay the initialization of the new user track' do - Timecop.freeze do - user + it 'should delay the welcome post until user logs in' do + user - expect(Jobs::NarrativeInit.jobs.first['at']) - .to be_within(1.second).of(Time.zone.now.to_f + 100) - end - end - - it 'should delay sending the welcome message' do - SiteSetting.discourse_narrative_bot_welcome_post_type = 'welcome_message' - - Timecop.freeze do - user - - expect(Jobs::SendDefaultWelcomeMessage.jobs.first['at']) - .to be_within(1.second).of(Time.zone.now.to_f + 100) - end + expect(Jobs::NarrativeInit.jobs.count).to eq(0) end end end