diff --git a/app/models/user.rb b/app/models/user.rb index 45823b983..c366856c0 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -392,7 +392,7 @@ class User < ApplicationRecord return unless email.present? && email.include?("@") return if saved_changes["unconfirmed_email"] && saved_changes["confirmation_sent_at"] - Users::SubscribeToMailchimpNewsletterJob.perform_later(id) + Users::SubscribeToMailchimpNewsletterWorker.perform_async(id) end def a_sustaining_member? diff --git a/app/workers/users/subscribe_to_mailchimp_newsletter_worker.rb b/app/workers/users/subscribe_to_mailchimp_newsletter_worker.rb new file mode 100644 index 000000000..41b8e0d5f --- /dev/null +++ b/app/workers/users/subscribe_to_mailchimp_newsletter_worker.rb @@ -0,0 +1,12 @@ +module Users + class SubscribeToMailchimpNewsletterWorker + include Sidekiq::Worker + sidekiq_options queue: :low_priority, retry: 10 + + def perform(user_id) + user = User.find_by(id: user_id) + + MailchimpBot.new(user).upsert if user + end + end +end diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index 00dc4c381..a57dc7524 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -489,29 +489,31 @@ RSpec.describe User, type: :model do end context "when callbacks are triggered after save" do - describe "subscribing to mailchip newsletter" do - it "enqueues SubscribeToMailchimpNewsletterJob" do - expect do + describe "subscribing to mailchimp newsletter" do + let(:user) { build(:user) } + + it "enqueues SubscribeToMailchimpNewsletterWorker" do + sidekiq_assert_enqueued_with(job: Users::SubscribeToMailchimpNewsletterWorker, args: user.id) do user.save - end.to have_enqueued_job(Users::SubscribeToMailchimpNewsletterJob).exactly(:once).with(user.id) + end end it "does not enqueue without an email" do - expect do + sidekiq_assert_no_enqueued_jobs(only: Users::SubscribeToMailchimpNewsletterWorker) do user.update(email: "") - end.not_to have_enqueued_job(Users::SubscribeToMailchimpNewsletterJob).exactly(:once).with(user.id) + end end it "does not enqueue with an invalid email" do - expect do + sidekiq_assert_no_enqueued_jobs(only: Users::SubscribeToMailchimpNewsletterWorker) do user.update(email: "foobar") - end.not_to have_enqueued_job(Users::SubscribeToMailchimpNewsletterJob).exactly(:once).with(user.id) + end end it "does not enqueue with an unconfirmed email" do - expect do + sidekiq_assert_no_enqueued_jobs(only: Users::SubscribeToMailchimpNewsletterWorker) do user.update(unconfirmed_email: "bob@bob.com", confirmation_sent_at: Time.current) - end.not_to have_enqueued_job(Users::SubscribeToMailchimpNewsletterJob).exactly(:once).with(user.id) + end end end end diff --git a/spec/system/internal/admin_awards_badges_spec.rb b/spec/system/internal/admin_awards_badges_spec.rb index 87162a94e..4c6c10603 100644 --- a/spec/system/internal/admin_awards_badges_spec.rb +++ b/spec/system/internal/admin_awards_badges_spec.rb @@ -41,7 +41,7 @@ RSpec.describe "Admin awards badges", type: :system do it "notifies users of new badges" do assert_enqueued_jobs(2, only: BadgeAchievements::SendEmailNotificationJob) do - sidekiq_assert_enqueued_jobs(2) do + sidekiq_assert_enqueued_jobs(2, only: Notifications::NewBadgeAchievementWorker) do award_two_badges end end diff --git a/spec/workers/users/subscribe_to_mailchimp_newsletter_worker_spec.rb b/spec/workers/users/subscribe_to_mailchimp_newsletter_worker_spec.rb new file mode 100644 index 000000000..59d609d17 --- /dev/null +++ b/spec/workers/users/subscribe_to_mailchimp_newsletter_worker_spec.rb @@ -0,0 +1,20 @@ +require "rails_helper" + +RSpec.describe Users::SubscribeToMailchimpNewsletterWorker, type: :worker do + include_examples "#enqueues_on_correct_queue", "low_priority", 1 + + describe "#perform_now" do + let(:worker) { subject } + let(:user) { FactoryBot.create(:user) } + + it "subscribes user to mailchimp newsletter" do + mailchimp_bot = double + allow(MailchimpBot).to receive(:new).and_return(mailchimp_bot) + allow(mailchimp_bot).to receive(:upsert) + + worker.perform(user.id) + + expect(mailchimp_bot).to have_received(:upsert) + end + end +end