Skip to content

Commit f9f53a1

Browse files
tchakclaude
andcommitted
test: hoist per-example procedure creation in dossier spec
Use let_it_be for custom procedures (sva/svr, declarative, prefill, attestation champs) and before_all for fleet setups (unread messages, archivable_by_month), and reuse seeded procedures where the factory default sufficed. Full spec: ~38.5s -> ~33s (-38% vs factory baseline). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
1 parent b0c87c5 commit f9f53a1

1 file changed

Lines changed: 54 additions & 38 deletions

File tree

spec/models/dossier_spec.rb

Lines changed: 54 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -103,36 +103,41 @@
103103
travel_to(5.months.ago) do
104104
create(:dossier,
105105
state: :brouillon,
106+
procedure: procedures.demo,
106107
brouillon_close_to_expiration_notice_sent_at: 1.day.ago)
107108
end
108109
end
109110

110111
let!(:dossier_brouillon_not_expired) do
111112
travel_to(1.month.ago) do
112113
create(:dossier,
113-
state: :brouillon)
114+
state: :brouillon,
115+
procedure: procedures.demo)
114116
end
115117
end
116118

117119
let!(:dossier_brouillon_expired_but_noticed_recently) do
118120
travel_to(5.months.ago) do
119121
create(:dossier,
120122
state: :brouillon,
123+
procedure: procedures.demo,
121124
brouillon_close_to_expiration_notice_sent_at: (4.months + 20.days).from_now)
122125
end
123126
end
124127

125128
let!(:dossier_brouillon_expired_but_not_noticed_yet) do
126129
travel_to(5.months.ago) do
127130
create(:dossier,
128-
state: :brouillon)
131+
state: :brouillon,
132+
procedure: procedures.demo)
129133
end
130134
end
131135

132136
let!(:dossier_instruction_expired) do
133137
travel_to(5.months.ago) do
134138
create(:dossier,
135139
state: :en_instruction,
140+
procedure: procedures.demo,
136141
brouillon_close_to_expiration_notice_sent_at: 1.day.ago)
137142
end
138143
end
@@ -141,6 +146,7 @@
141146
travel_to(5.months.ago) do
142147
create(:dossier,
143148
state: :brouillon,
149+
procedure: procedures.demo,
144150
brouillon_close_to_expiration_notice_sent_at: 1.day.ago,
145151
hidden_by_user_at: Time.zone.now)
146152
end
@@ -159,9 +165,9 @@
159165
end
160166

161167
describe '.brouillon_expired_without_notice' do
162-
let(:published_procedure) { create(:procedure, :published) }
163-
let(:closed_procedure) { create(:procedure, :closed) }
164-
let(:draft_procedure) { create(:procedure, :draft) }
168+
let(:published_procedure) { procedures.demo }
169+
let_it_be(:closed_procedure) { create(:procedure, :closed) }
170+
let_it_be(:draft_procedure) { create(:procedure, :draft) }
165171

166172
# targets: expired + structurally never notified
167173
let!(:expired_on_closed) { create(:dossier, procedure: closed_procedure).tap { |d| d.update_column(:expired_at, 1.day.ago) } }
@@ -402,7 +408,7 @@
402408
end
403409

404410
context 'when the dossier belongs to a procedure for individuals' do
405-
let(:procedure) { create(:procedure, for_individual: true) }
411+
let(:procedure) { procedures.demo }
406412

407413
it 'creates a default individual' do
408414
subject
@@ -435,7 +441,7 @@
435441
end
436442

437443
context 'when the dossier belongs to a procedure for moral personas' do
438-
let(:procedure) { create(:procedure, for_individual: false) }
444+
let(:procedure) { procedures.entreprise }
439445

440446
it 'doesn’t create a individual' do
441447
subject
@@ -445,7 +451,7 @@
445451
end
446452

447453
describe '#prefill_champs_from_france_connect' do
448-
let(:procedure) { create(:procedure, :for_individual, types_de_champ_public: [{ type: :date }]) }
454+
let_it_be(:procedure) { create(:procedure, :for_individual, types_de_champ_public: [{ type: :date }]) }
449455
let(:user) { create(:user, france_connect_informations: [build(:france_connect_information)]) }
450456
let(:dossier) { create(:dossier, procedure:, user:) }
451457
let(:tdc) { procedure.active_revision.types_de_champ_public.first }
@@ -515,9 +521,8 @@
515521
end
516522

517523
describe '#update_for_tiers' do
518-
let(:procedure) { create(:procedure, :for_individual) }
519524
let(:individual) { build(:individual, nom: 'Dupont', prenom: 'Jean', gender: Individual::GENDER_MALE, birthdate: Date.new(1980, 1, 1)) }
520-
let(:dossier) { create(:dossier, procedure:, user:, individual:) }
525+
let(:dossier) { create(:dossier, procedure: procedures.demo, user:, individual:) }
521526

522527
context 'when user is connected via FranceConnect with one identity' do
523528
let(:user) { create(:user, france_connect_informations: [build(:france_connect_information)]) }
@@ -888,13 +893,13 @@
888893
end
889894

890895
describe '.with_unread_messages_for_user' do
891-
let(:dossier_with_unread_instructeur) { create(:dossier, :en_construction, procedure: procedures.demo) }
892-
let(:dossier_with_read_instructeur) { create(:dossier, :en_construction, procedure: procedures.demo) }
893-
let(:dossier_with_unread_expert) { create(:dossier, :en_construction, procedure: procedures.demo) }
894-
let(:dossier_with_only_usager_message) { create(:dossier, :en_construction, procedure: procedures.demo) }
895-
let(:dossier_with_discarded_unread) { create(:dossier, :en_construction, procedure: procedures.demo) }
896+
let_it_be(:dossier_with_unread_instructeur) { create(:dossier, :en_construction, procedure: procedures.demo) }
897+
let_it_be(:dossier_with_read_instructeur) { create(:dossier, :en_construction, procedure: procedures.demo) }
898+
let_it_be(:dossier_with_unread_expert) { create(:dossier, :en_construction, procedure: procedures.demo) }
899+
let_it_be(:dossier_with_only_usager_message) { create(:dossier, :en_construction, procedure: procedures.demo) }
900+
let_it_be(:dossier_with_discarded_unread) { create(:dossier, :en_construction, procedure: procedures.demo) }
896901

897-
before do
902+
before_all do
898903
create(:commentaire, dossier: dossier_with_unread_instructeur, instructeur: create(:instructeur), seen_by_recipient_at: nil)
899904
create(:commentaire, dossier: dossier_with_read_instructeur, instructeur: create(:instructeur), seen_by_recipient_at: 1.day.ago)
900905
create(:commentaire, dossier: dossier_with_unread_expert, expert: create(:expert), seen_by_recipient_at: nil)
@@ -1112,22 +1117,34 @@
11121117
end
11131118

11141119
describe "#unspecified_attestation_champs" do
1115-
let(:procedure) { create(:procedure, attestation_acceptation_template:, types_de_champ_public:, types_de_champ_private:) }
1116-
let(:dossier) { create(:dossier, :en_instruction, procedure:) }
1120+
def types_de_champ_public
1121+
[
1122+
{ libelle: "specified champ-in-title" },
1123+
{ libelle: "unspecified champ-in-title" },
1124+
{ libelle: "specified champ-in-body" },
1125+
{ libelle: "unspecified champ-in-body" },
1126+
]
1127+
end
11171128

1118-
let(:types_de_champ_public) { [tdc_1, tdc_2, tdc_3, tdc_4] }
1119-
let(:types_de_champ_private) { [tdc_5, tdc_6, tdc_7, tdc_8] }
1129+
def types_de_champ_private
1130+
[
1131+
{ libelle: "specified annotation privée-in-title" },
1132+
{ libelle: "unspecified annotation privée-in-title" },
1133+
{ libelle: "specified annotation privée-in-body" },
1134+
{ libelle: "unspecified annotation privée-in-body" },
1135+
]
1136+
end
11201137

1121-
let(:tdc_1) { { libelle: "specified champ-in-title" } }
1122-
let(:tdc_2) { { libelle: "unspecified champ-in-title" } }
1123-
let(:tdc_3) { { libelle: "specified champ-in-body" } }
1124-
let(:tdc_4) { { libelle: "unspecified champ-in-body" } }
1125-
let(:tdc_5) { { libelle: "specified annotation privée-in-title" } }
1126-
let(:tdc_6) { { libelle: "unspecified annotation privée-in-title" } }
1127-
let(:tdc_7) { { libelle: "specified annotation privée-in-body" } }
1128-
let(:tdc_8) { { libelle: "unspecified annotation privée-in-body" } }
1138+
let_it_be(:procedure) { create(:procedure, types_de_champ_public:, types_de_champ_private:) }
1139+
let_it_be(:dossier) { create(:dossier, :en_instruction, procedure:) }
11291140

11301141
before do
1142+
# reset association caches: each example rolls back to the group snapshot
1143+
procedure.reload
1144+
dossier.reload
1145+
1146+
procedure.attestation_acceptation_template = attestation_acceptation_template if attestation_acceptation_template
1147+
11311148
(dossier.project_champs_public + dossier.project_champs_private)
11321149
.filter { |c| c.libelle.match?(/^specified/) }
11331150
.each { |c| c.update_attribute(:value, "specified") }
@@ -1586,7 +1603,7 @@
15861603
describe '#accepter_automatiquement!' do
15871604
let(:last_operation) { dossier.dossier_operation_logs.last }
15881605
let!(:now) { Time.zone.parse('01/01/2100') }
1589-
let(:procedure) { create(:procedure, :for_individual, :published) }
1606+
let(:procedure) { procedures.demo }
15901607
let!(:attestation_template) { create(:attestation_template, procedure:, kind: :acceptation, state: :published) }
15911608

15921609
before do
@@ -1621,7 +1638,7 @@
16211638
end
16221639

16231640
context 'as sva procedure' do
1624-
let(:procedure) { create(:procedure, :for_individual, :published, :sva) }
1641+
let_it_be(:procedure) { create(:procedure, :for_individual, :published, :sva) }
16251642
let(:dossier) { create(:dossier, :en_instruction, :with_individual, procedure:, sva_svr_decision_on: Date.current, en_instruction_at: DateTime.new(2021, 5, 1, 12)) }
16261643
let!(:attestation_template) { create(:attestation_template, procedure:, kind: :acceptation, state: :published) }
16271644

@@ -1644,7 +1661,7 @@
16441661
describe '#refuser_automatiquement' do
16451662
context 'as svr procedure' do
16461663
let(:last_operation) { dossier.dossier_operation_logs.last }
1647-
let(:procedure) { create(:procedure, :for_individual, :published, :svr) }
1664+
let_it_be(:procedure) { create(:procedure, :for_individual, :published, :svr) }
16481665
let(:dossier) { create(:dossier, :en_instruction, :with_individual, procedure:, sva_svr_decision_on: Date.current, en_instruction_at: DateTime.new(2021, 5, 1, 12)) }
16491666

16501667
before {
@@ -1722,7 +1739,7 @@
17221739
let(:instructeur) { create(:instructeur) }
17231740

17241741
context "via procedure declarative en instruction" do
1725-
let(:dossier) { create(:dossier, :en_construction, :with_declarative_en_instruction) }
1742+
let(:dossier) { create(:dossier, :en_construction, :with_declarative_en_instruction, procedure: procedures.demo) }
17261743

17271744
subject do
17281745
dossier.process_declarative!
@@ -1742,7 +1759,7 @@
17421759
end
17431760

17441761
context "via procedure sva" do
1745-
let(:procedure) { create(:procedure, :sva, :published, :for_individual) }
1762+
let_it_be(:procedure) { create(:procedure, :sva, :published, :for_individual) }
17461763
let(:dossier) { create(:dossier, :en_construction, :with_individual, procedure:, sva_svr_decision_on: 10.days.from_now) }
17471764
let(:sva_svr_decision_on) { SVASVRDecisionDateCalculatorService.new(dossier, procedure).decision_date }
17481765

@@ -2047,10 +2064,9 @@
20472064

20482065
describe "can't transition to terminer when annotations privees are not valid" do
20492066
let(:instructeur) { create(:instructeur) }
2050-
let(:procedure) { create(:procedure, types_de_champ_private:) }
2067+
let_it_be(:procedure) { create(:procedure, types_de_champ_private: [{ type: :text, mandatory: true }]) }
20512068
let(:dossier_incomplete) { create(:dossier, :en_instruction, procedure:) }
20522069
let(:dossier_ok) { create(:dossier, :en_instruction, :with_populated_annotations, procedure:) }
2053-
let(:types_de_champ_private) { [{ type: :text, mandatory: true }] }
20542070

20552071
context "when dossier is en_instruction" do
20562072
it "can't accepter" do
@@ -2873,10 +2889,10 @@
28732889
end
28742890

28752891
describe '#archivable_by_month' do
2876-
let(:procedure) { create(:procedure, :published, groupe_instructeurs: [groupe_instructeurs]) }
2877-
let(:groupe_instructeurs) { create(:groupe_instructeur) }
2892+
let_it_be(:groupe_instructeurs) { create(:groupe_instructeur) }
2893+
let_it_be(:procedure) { create(:procedure, :published, groupe_instructeurs: [groupe_instructeurs]) }
28782894

2879-
before do
2895+
before_all do
28802896
create_dossier_for_month(procedure, 2021, 3)
28812897
create_dossier_for_month(procedure, 2021, 3)
28822898
create_archived_dossier_for_month(procedure, 2021, 3)

0 commit comments

Comments
 (0)