From 3b60a59ef8404987d978b812623afaa7ae71f13a Mon Sep 17 00:00:00 2001 From: rhymes Date: Tue, 16 Apr 2019 20:01:00 +0200 Subject: [PATCH] Move exporting into a job (#2299) --- app/controllers/users_controller.rb | 2 +- app/jobs/export_content_job.rb | 8 ++++++++ spec/jobs/export_content_job_spec.rb | 26 ++++++++++++++++++++++++++ spec/requests/user_settings_spec.rb | 14 ++++++++------ 4 files changed, 43 insertions(+), 7 deletions(-) create mode 100644 app/jobs/export_content_job.rb create mode 100644 spec/jobs/export_content_job_spec.rb diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index c8d1965d2..18d47027d 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -27,7 +27,7 @@ class UsersController < ApplicationController notice = "Your profile was successfully updated." if @user.export_requested? notice += " The export will be emailed to you shortly." - Exporter::Service.new(@user).delay.export(send_email: true) + ExportContentJob.perform_later(@user.id) end cookies.permanent[:user_experience_level] = @user.experience_level.to_s if @user.experience_level.present? follow_hiring_tag(@user) diff --git a/app/jobs/export_content_job.rb b/app/jobs/export_content_job.rb new file mode 100644 index 000000000..ddab6e5dc --- /dev/null +++ b/app/jobs/export_content_job.rb @@ -0,0 +1,8 @@ +class ExportContentJob < ApplicationJob + queue_as :export_content + + def perform(user_id, exporter = Exporter::Service) + user = User.find_by(id: user_id) + exporter.new(user).export(send_email: true) if user + end +end diff --git a/spec/jobs/export_content_job_spec.rb b/spec/jobs/export_content_job_spec.rb new file mode 100644 index 000000000..0b5bb37fe --- /dev/null +++ b/spec/jobs/export_content_job_spec.rb @@ -0,0 +1,26 @@ +require "rails_helper" + +RSpec.describe ExportContentJob, type: :job do + include_examples "#enqueues_job", "export_content", 1 + + describe "#perform_now" do + let(:exporter_service) { double } + let(:exporter) { double } + let(:user) { create(:user) } + + before do + allow(exporter).to receive(:export) + allow(exporter_service).to receive(:new).and_return(exporter) + end + + it "calls the service" do + described_class.perform_now(user.id, exporter_service) + expect(exporter).to have_received(:export).once + end + + it "doesn't call the service if non existent user ID is given" do + described_class.perform_now(9999, exporter_service) + expect(exporter).not_to have_received(:export) + end + end +end diff --git a/spec/requests/user_settings_spec.rb b/spec/requests/user_settings_spec.rb index 0d412f703..3b2c4089f 100644 --- a/spec/requests/user_settings_spec.rb +++ b/spec/requests/user_settings_spec.rb @@ -70,6 +70,10 @@ RSpec.describe "UserSettings", type: :request do end context "when requesting an export of the articles" do + before do + ActiveJob::Base.queue_adapter = :test + end + def send_request(flag = true) put "/users/#{user.id}", params: { user: { tab: "misc", export_requested: flag } @@ -99,15 +103,13 @@ RSpec.describe "UserSettings", type: :request do end it "sends an email" do - run_background_jobs_immediately do - expect { send_request }.to change { ActionMailer::Base.deliveries.count }.by(1) - end + ActiveJob::Base.queue_adapter = :inline + expect { send_request }.to change { ActionMailer::Base.deliveries.count }.by(1) end it "does not send an email if there was no request" do - run_background_jobs_immediately do - expect { send_request(false) }.not_to(change { ActionMailer::Base.deliveries.count }) - end + ActiveJob::Base.queue_adapter = :inline + expect { send_request(false) }.not_to(change { ActionMailer::Base.deliveries.count }) end end end