From bbc44fe3396e12de64bfd71f5a323aff10422c64 Mon Sep 17 00:00:00 2001 From: Paul Chavard Date: Fri, 17 Jun 2022 11:33:48 +0200 Subject: [PATCH] fix(export): no crash on empty repetitions --- app/models/dossier.rb | 2 +- app/services/procedure_export_service.rb | 5 +++-- spec/services/procedure_export_service_spec.rb | 12 ++++++++++++ 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/app/models/dossier.rb b/app/models/dossier.rb index 89a129494..0c06e42d1 100644 --- a/app/models/dossier.rb +++ b/app/models/dossier.rb @@ -482,7 +482,7 @@ class Dossier < ApplicationRecord end dossiers.each do |dossier| - load_dossier(dossier, champs_by_dossier[dossier.id], champs_by_dossier_by_parent[dossier.id]) + load_dossier(dossier, champs_by_dossier[dossier.id], champs_by_dossier_by_parent[dossier.id] || {}) end end diff --git a/app/services/procedure_export_service.rb b/app/services/procedure_export_service.rb index 9d496b3ac..a4a9887a4 100644 --- a/app/services/procedure_export_service.rb +++ b/app/services/procedure_export_service.rb @@ -102,11 +102,12 @@ class ProcedureExportService .repetition .filter_map do |type_de_champ_repetition| types_de_champ = procedure.types_de_champ_for_procedure_presentation(type_de_champ_repetition).to_a + rows = champs_by_stable_id.fetch(type_de_champ_repetition.stable_id, []).flat_map(&:rows_for_export) - if types_de_champ.present? + if types_de_champ.present? && rows.present? { sheet_name: type_de_champ_repetition.libelle_for_export, - instances: champs_by_stable_id.fetch(type_de_champ_repetition.stable_id, []).flat_map(&:rows_for_export), + instances: rows, spreadsheet_columns: Proc.new { |instance| instance.spreadsheet_columns(types_de_champ) } } end diff --git a/spec/services/procedure_export_service_spec.rb b/spec/services/procedure_export_service_spec.rb index 5f6a53c3f..5dfaaceb3 100644 --- a/spec/services/procedure_export_service_spec.rb +++ b/spec/services/procedure_export_service_spec.rb @@ -405,6 +405,18 @@ describe ProcedureExportService do expect(subject.sheets.map(&:name)).to eq(['Dossiers', 'Etablissements', 'Avis', another_champ_repetition.libelle_for_export, champ_repetition.libelle_for_export]) end end + + context 'with empty repetition' do + before do + dossiers.flat_map { |dossier| dossier.champs.filter(&:repetition?) }.each do |champ| + champ.champs.destroy_all + end + end + + it 'should not have data' do + expect(repetition_sheet).to be_nil + end + end end end