Browse Source

Add generate_missing_answers_report task and method

pull/1892/head
Kat 3 years ago
parent
commit
2276dc77c4
  1. 31
      app/services/imports/import_report_service.rb
  2. 9
      lib/tasks/full_import.rake
  3. 2
      spec/fixtures/files/imported_lettings_logs_missing_answers_report.csv
  4. 26
      spec/lib/tasks/full_import_spec.rb
  5. 21
      spec/services/imports/import_report_service_spec.rb

31
app/services/imports/import_report_service.rb

@ -84,5 +84,36 @@ module Imports
@logger.info("Unassigned logs report available in s3 import bucket at #{report_name}")
end
def generate_missing_answers_report(report_suffix)
Rails.logger.info("Generating missing imported lettings logs answers report")
rep = CSV.generate do |report|
headers = ["Missing answers", "Total number of affected logs"]
report << headers
unanswered_question_counts = {}
LettingsLog.where.not(old_id: nil).where(status: "in_progress").each do |lettings_log|
applicable_questions = lettings_log.form.subsections.map { |s| s.applicable_questions(lettings_log).select { |q| q.enabled?(lettings_log) } }.flatten
unanswered_questions = applicable_questions.filter { |q| q.unanswered?(lettings_log) }.map(&:id) - lettings_log.optional_fields
if unanswered_question_counts[unanswered_questions.join(", ")].present?
unanswered_question_counts[unanswered_questions.join(", ")] += 1
else
unanswered_question_counts[unanswered_questions.join(", ")] = 1
end
end
unanswered_question_counts.each do |missing_answers, count|
report << [missing_answers, count]
end
end
report_name = "MissingAnswersReport_#{report_suffix}.csv"
@storage_service.write_file(report_name, BYTE_ORDER_MARK + rep)
@logger.info("Missing answers report available in s3 import bucket at #{report_name}")
end
end
end

9
lib/tasks/full_import.rake

@ -117,6 +117,15 @@ namespace :import do
Imports::ImportReportService.new(s3_service, institutions_csv).create_reports(institutions_csv_name)
end
desc "Generate migrated logs report"
task :generate_missing_answers_report, %i[file_suffix] => :environment do |_task, args|
file_suffix = args[:file_suffix]
raise "Usage: rake import:generate_reports['file_suffix']" if file_suffix.blank?
s3_service = Storage::S3Service.new(PlatformHelper.is_paas? ? Configuration::PaasConfigurationService.new : Configuration::EnvConfigurationService.new, ENV["IMPORT_PAAS_INSTANCE"])
Imports::ImportReportService.new(s3_service, nil).generate_missing_answers_report(file_suffix)
end
desc "Run import from logs step to end"
task :logs_onwards, %i[institutions_csv_name] => %i[environment logs trigger_invites generate_reports]

2
spec/fixtures/files/imported_lettings_logs_missing_answers_report.csv vendored

@ -0,0 +1,2 @@
Missing answers,Total number of affected logs
age1_known,11
1 Missing answers Total number of affected logs
2 age1_known 11

26
spec/lib/tasks/full_import_spec.rb

@ -54,6 +54,32 @@ describe "full import", type: :task do
end
end
describe "import:generate_missing_answers_report" do
subject(:task) { Rake::Task["import:generate_missing_answers_report"] }
before do
Rake.application.rake_require("tasks/full_import")
Rake::Task.define_task(:environment)
task.reenable
end
context "when generating a missing answers report" do
let(:import_report_service) { instance_double(Imports::ImportReportService) }
before do
allow(Imports::ImportReportService).to receive(:new).and_return(import_report_service)
allow(ENV).to receive(:[]).with("VCAP_SERVICES").and_return("dummy")
end
it "creates a missing answers report" do
expect(Storage::S3Service).to receive(:new).with(paas_config_service, instance_name)
expect(Imports::ImportReportService).to receive(:new).with(storage_service, nil)
expect(import_report_service).to receive(:generate_missing_answers_report).with("some_name")
task.invoke("some_name")
end
end
end
describe "import:initial" do
subject(:task) { Rake::Task["import:initial"] }

21
spec/services/imports/import_report_service_spec.rb

@ -98,4 +98,25 @@ RSpec.describe Imports::ImportReportService do
end
end
end
describe "#generate_missing_answers_report" do
context "when there are in progress imported logs" do
let(:institutions_csv) { nil }
let(:expected_content) { File.read("spec/fixtures/files/imported_lettings_logs_missing_answers_report.csv") }
before do
create_list(:lettings_log, 11, :completed, age1_known: nil) do |log, _i|
log.old_id = Faker::Name.initials(number: 10)
log.save!
end
create_list(:lettings_log, 2, :completed, age1_known: nil)
end
it "generates a csv with expected missing fields" do
expect(storage_service).to receive(:write_file).with("MissingAnswersReport_report_suffix.csv", "#{expected_content}")
report_service.generate_missing_answers_report("report_suffix")
end
end
end
end

Loading…
Cancel
Save