From be6c27826a108dab3784f3abeaae9b248f9c6076 Mon Sep 17 00:00:00 2001 From: baarkerlounger Date: Thu, 31 Mar 2022 12:19:20 +0100 Subject: [PATCH] Controller response --- app/controllers/case_logs_controller.rb | 5 +++++ app/models/case_log.rb | 1 + app/models/concerns/generate_csv.rb | 15 +++++++++++++ spec/requests/case_logs_controller_spec.rb | 26 ++++++++++++++++++++++ 4 files changed, 47 insertions(+) create mode 100644 app/models/concerns/generate_csv.rb diff --git a/app/controllers/case_logs_controller.rb b/app/controllers/case_logs_controller.rb index 1f84d7a15..5be791d51 100644 --- a/app/controllers/case_logs_controller.rb +++ b/app/controllers/case_logs_controller.rb @@ -8,6 +8,11 @@ class CaseLogsController < ApplicationController def index @pagy, @case_logs = pagy(current_user.case_logs) + + respond_to do |format| + format.html + format.csv { send_data @case_logs.to_csv, filename: "case-logs-#{Time.zone.now}" } + end end def create diff --git a/app/models/case_log.rb b/app/models/case_log.rb index d3271083c..c64d8687b 100644 --- a/app/models/case_log.rb +++ b/app/models/case_log.rb @@ -18,6 +18,7 @@ end class CaseLog < ApplicationRecord include Validations::SoftValidations + include GenerateCsv has_paper_trail diff --git a/app/models/concerns/generate_csv.rb b/app/models/concerns/generate_csv.rb new file mode 100644 index 000000000..36aaa8462 --- /dev/null +++ b/app/models/concerns/generate_csv.rb @@ -0,0 +1,15 @@ +module GenerateCsv + extend ActiveSupport::Concern + + class_methods do + def to_csv + CSV.generate(headers: true) do |csv| + csv << self.attribute_names + + all.each do |record| + csv << record.attributes.values + end + end + end + end +end diff --git a/spec/requests/case_logs_controller_spec.rb b/spec/requests/case_logs_controller_spec.rb index 2ff388757..581e5c554 100644 --- a/spec/requests/case_logs_controller_spec.rb +++ b/spec/requests/case_logs_controller_spec.rb @@ -400,6 +400,32 @@ RSpec.describe CaseLogsController, type: :request do end end + describe "CSV download" do + let(:headers) { { "Accept" => "text/csv" } } + let(:user) { FactoryBot.create(:user) } + let(:organisation) { user.organisation } + let(:other_organisation) { FactoryBot.create(:organisation) } + let!(:case_log) do + FactoryBot.create( + :case_log, + owning_organisation: organisation, + managing_organisation: organisation, + ) + end + + before do + sign_in user + get "/logs", headers: headers, params: {} + end + + it "downloads a CSV file with headers" do + csv = CSV.parse(response.body) + expect(csv.count).to eq(2) + expect(csv.first.first).to eq("id") + expect(csv.second.first).to eq(case_log.id.to_s) + end + end + describe "PATCH" do let(:case_log) do FactoryBot.create(:case_log, :in_progress, tenant_code: "Old Value", postcode_full: "M1 1AE")