From e1c15749315e2c817f42aafe316b398090cbc2d2 Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Sat, 7 Nov 2020 00:02:49 +0000 Subject: [PATCH] Refactor BulkInvoiceService to use ActiveJob Removes use of #handle_asynchronously, which we need to do elsewhere. Fixes: BulkInvoiceService#start_pdf_job starts a background process to create a pdf with multiple invoices Failure/Error: expect do service.start_pdf_job [1, 2] end.to enqueue_job Delayed::PerformableMethod expected to enqueue exactly 1 jobs, but enqueued 0 # ./spec/services/bulk_invoice_service_spec.rb:8:in `block (3 levels) in ' --- app/jobs/bulk_invoice_job.rb | 25 ++++++++++++++++++++++ app/services/bulk_invoice_service.rb | 19 +--------------- spec/services/bulk_invoice_service_spec.rb | 4 +--- 3 files changed, 27 insertions(+), 21 deletions(-) create mode 100644 app/jobs/bulk_invoice_job.rb diff --git a/app/jobs/bulk_invoice_job.rb b/app/jobs/bulk_invoice_job.rb new file mode 100644 index 0000000000..7335c552d6 --- /dev/null +++ b/app/jobs/bulk_invoice_job.rb @@ -0,0 +1,25 @@ +# frozen_string_literal: true + +class BulkInvoiceJob < ActiveJob::Base + def perform(order_ids, filepath) + pdf = CombinePDF.new + + orders_from(order_ids).each do |order| + invoice = renderer.render_to_string(order) + + pdf << CombinePDF.parse(invoice) + end + + pdf.save filepath + end + + private + + def orders_from(order_ids) + Spree::Order.where(id: order_ids).order("completed_at DESC") + end + + def renderer + @renderer ||= InvoiceRenderer.new + end +end diff --git a/app/services/bulk_invoice_service.rb b/app/services/bulk_invoice_service.rb index ab69df03ca..6776ad448a 100644 --- a/app/services/bulk_invoice_service.rb +++ b/app/services/bulk_invoice_service.rb @@ -6,17 +6,8 @@ class BulkInvoiceService end def start_pdf_job(order_ids) - pdf = CombinePDF.new - - orders_from(order_ids).each do |order| - invoice = renderer.render_to_string(order) - - pdf << CombinePDF.parse(invoice) - end - - pdf.save "#{file_directory}/#{@id}.pdf" + BulkInvoiceJob.perform_later order_ids, "#{file_directory}/#{@id}.pdf" end - handle_asynchronously :start_pdf_job def invoice_created?(invoice_id) File.exist? filepath(invoice_id) @@ -28,10 +19,6 @@ class BulkInvoiceService private - def orders_from(order_ids) - Spree::Order.where(id: order_ids).order("completed_at DESC") - end - def new_invoice_id Time.zone.now.to_i.to_s end @@ -40,10 +27,6 @@ class BulkInvoiceService 'tmp/invoices' end - def renderer - @renderer ||= InvoiceRenderer.new - end - def file_directory Dir.mkdir(directory) unless File.exist?(directory) directory diff --git a/spec/services/bulk_invoice_service_spec.rb b/spec/services/bulk_invoice_service_spec.rb index 687e680bcc..af06476e74 100644 --- a/spec/services/bulk_invoice_service_spec.rb +++ b/spec/services/bulk_invoice_service_spec.rb @@ -7,9 +7,7 @@ describe BulkInvoiceService do it "starts a background process to create a pdf with multiple invoices" do expect do service.start_pdf_job [1, 2] - end.to enqueue_job Delayed::PerformableMethod - - expect(Delayed::Job.last.payload_object.method_name).to eq :start_pdf_job_without_delay + end.to enqueue_job BulkInvoiceJob end it "creates a PDF invoice" do