From ff6bcb113fb77d2a95ffb48177b1fdf4ce6d6c12 Mon Sep 17 00:00:00 2001 From: Maikel Linke Date: Thu, 12 Oct 2023 17:21:18 +1100 Subject: [PATCH] Create report file where the content is generated In the past, we needed the report blob to know when the report has been finished and uploaded. But not we use cable_ready to notify when the report is done and we don't need the blob in the controller. --- app/controllers/admin/reports_controller.rb | 5 ++--- app/jobs/report_job.rb | 3 ++- spec/jobs/report_job_spec.rb | 22 ++++++++++----------- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/app/controllers/admin/reports_controller.rb b/app/controllers/admin/reports_controller.rb index 9aff9f597f..ac6f1b73b4 100644 --- a/app/controllers/admin/reports_controller.rb +++ b/app/controllers/admin/reports_controller.rb @@ -80,11 +80,10 @@ module Admin block: "start" ).broadcast - blob = ReportBlob.create_for_upload_later!(report_filename) - ReportJob.perform_later( report_class:, user: spree_current_user, params:, - format:, blob:, channel: ScopedChannel.for_id(params[:uuid]), + format:, filename: report_filename, + channel: ScopedChannel.for_id(params[:uuid]), ) head :no_content diff --git a/app/jobs/report_job.rb b/app/jobs/report_job.rb index 9d1e081433..f2268f794d 100644 --- a/app/jobs/report_job.rb +++ b/app/jobs/report_job.rb @@ -9,11 +9,12 @@ class ReportJob < ApplicationJob NOTIFICATION_TIME = 5.seconds - def perform(report_class:, user:, params:, format:, blob:, channel: nil) + def perform(report_class:, user:, params:, format:, filename:, channel: nil) start_time = Time.zone.now report = report_class.new(user, params, render: true) result = report.render_as(format) + blob = ReportBlob.create_for_upload_later!(filename) blob.store(result) execution_time = Time.zone.now - start_time diff --git a/spec/jobs/report_job_spec.rb b/spec/jobs/report_job_spec.rb index c99f5fc38a..b37b19540a 100644 --- a/spec/jobs/report_job_spec.rb +++ b/spec/jobs/report_job_spec.rb @@ -4,15 +4,14 @@ require 'spec_helper' describe ReportJob do let(:report_args) { - { report_class:, user:, params:, format:, - blob: } + { report_class:, user:, params:, format:, filename: } } let(:report_class) { Reporting::Reports::UsersAndEnterprises::Base } let(:user) { enterprise.owner } let(:enterprise) { create(:enterprise) } let(:params) { {} } let(:format) { :csv } - let(:blob) { ReportBlob.create_for_upload_later!("report.csv") } + let(:filename) { "report.csv" } it "generates a report" do job = perform_enqueued_jobs(only: ReportJob) do @@ -22,12 +21,14 @@ describe ReportJob do end it "enqueues a job for async processing" do - job = ReportJob.perform_later(**report_args) - expect(blob.content_stored?).to eq false + expect { + ReportJob.perform_later(**report_args) + }.to_not change { ActiveStorage::Blob.count } - perform_enqueued_jobs(only: ReportJob) + expect { + perform_enqueued_jobs(only: ReportJob) + }.to change { ActiveStorage::Blob.count } - expect(blob.content_stored?).to eq true expect_csv_report end @@ -44,10 +45,9 @@ describe ReportJob do ReportJob.perform_later(**report_args) perform_enqueued_jobs(only: ReportJob) }.to enqueue_mail(ReportMailer, :report_ready).with( - params: { + params: hash_including( to: user.email, - blob:, - }, + ), args: [], ) end @@ -76,7 +76,7 @@ describe ReportJob do end def expect_csv_report - blob.reload + blob = ReportBlob.last expect(blob.filename.to_s).to eq "report.csv" expect(blob.content_type).to eq "text/csv"