Migrate subscribe to mailchimp newsletter job to sidekiq worker (#5423)

* Start migrating job to sidekiq worker
* Only check for badge jobs queued to sidekiq
This commit is contained in:
Jenna Pederson 2020-01-10 08:43:13 -06:00 committed by Molly Struve
parent 47c77dbee9
commit 5c9302f5f1
5 changed files with 46 additions and 12 deletions

View file

@ -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?

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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