diff --git a/app/models/user.rb b/app/models/user.rb index 76dfb368c..5fc92d352 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -170,7 +170,7 @@ class User < ApplicationRecord after_save :bust_cache after_save :subscribe_to_mailchimp_newsletter after_save :conditionally_resave_articles - after_create :estimate_default_language + after_create_commit :estimate_default_language before_create :set_default_language before_validation :set_username # make sure usernames are not empty, to be able to use the database unique index @@ -489,7 +489,7 @@ class User < ApplicationRecord end def estimate_default_language - Users::EstimateDefaultLanguageJob.perform_later(id) + Users::EstimateDefaultLanguageWorker.perform_async(id) end def set_default_language diff --git a/app/workers/users/estimate_default_language_worker.rb b/app/workers/users/estimate_default_language_worker.rb new file mode 100644 index 000000000..d46ff87c2 --- /dev/null +++ b/app/workers/users/estimate_default_language_worker.rb @@ -0,0 +1,14 @@ +module Users + class EstimateDefaultLanguageWorker + include Sidekiq::Worker + + sidekiq_options queue: :high_priority, retry: 10 + + def perform(user_id) + user = User.find_by(id: user_id) + return unless user + + Users::EstimateDefaultLanguage.call(user) + end + end +end diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index 643ea712f..11608d4b0 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -442,32 +442,41 @@ RSpec.describe User, type: :model do describe "#estimated_default_language" do it "estimates default language to be nil" do - perform_enqueued_jobs do + sidekiq_perform_enqueued_jobs do expect(user.estimated_default_language).to be(nil) end end it "estimates default language to be japanese with .jp email" do - perform_enqueued_jobs do + user = nil + + sidekiq_perform_enqueued_jobs do user = create(:user, email: "ben@hello.jp") - expect(user.reload.estimated_default_language).to eq("ja") end + + expect(user.reload.estimated_default_language).to eq("ja") end it "estimates default language based on ID dump" do - perform_enqueued_jobs do + new_user = nil + + sidekiq_perform_enqueued_jobs do new_user = user_from_authorization_service(:twitter, nil, "navbar_basic") - expect(new_user.estimated_default_language).to eq(nil) end + + expect(new_user.estimated_default_language).to eq(nil) end end describe "#preferred_languages_array" do it "returns proper preferred_languages_array" do - perform_enqueued_jobs do + user = nil + + sidekiq_perform_enqueued_jobs do user = create(:user, email: "ben@hello.jp") - expect(user.reload.preferred_languages_array).to eq(%w[en ja]) end + + expect(user.reload.preferred_languages_array).to eq(%w[en ja]) end it "returns a correct array when language settings are in a new format" do diff --git a/spec/workers/users/estimate_default_language_worker_spec.rb b/spec/workers/users/estimate_default_language_worker_spec.rb new file mode 100644 index 000000000..7d535d574 --- /dev/null +++ b/spec/workers/users/estimate_default_language_worker_spec.rb @@ -0,0 +1,24 @@ +require "rails_helper" + +RSpec.describe Users::EstimateDefaultLanguageWorker, type: :worker do + # Passing in a random user_id since the worker doesn't actually run + include_examples "#enqueues_on_correct_queue", "high_priority", [456] + + describe "#perform" do + let(:user) { create(:user) } + let(:service) { Users::EstimateDefaultLanguage } + let(:worker) { subject } + + before { allow(service).to receive(:call) } + + it "calls a service" do + worker.perform(user.id) + expect(service).to have_received(:call).with(user).once + end + + it "doesn't to anything for a non-existent user" do + worker.perform(User.maximum(:id).to_i + 1) + expect(service).not_to have_received(:call) + end + end +end