Skip to content

Commit 5fef6bc

Browse files
tchakclaude
andcommitted
test: run dossier spec on oaken seeds
Tag the whole spec with :oaken (one seed load for 251 examples) and migrate the state-transition describes to seeded records. Rewrite the four assertions that required an empty database (default_scope, without_followers, brouillons_recently_updated, with_notifiable_procedure) and harden six time-window scope tests against background data. Seeded individuals get an identity, required by operation log serialization. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
1 parent 10e29d8 commit 5fef6bc

2 files changed

Lines changed: 60 additions & 29 deletions

File tree

db/seeds/dossiers.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
user: users.usager,
1111
revision: procedure.active_revision,
1212
groupe_instructeur: procedure.defaut_groupe_instructeur,
13-
individual: Individual.new,
13+
individual: Individual.new(gender: "Mme", nom: "Dupont", prenom: "Jeanne", birthdate: Date.new(1985, 3, 12)),
1414
autorisation_donnees: true
1515
)
1616
dossier.build_default_values

spec/models/dossier_spec.rb

Lines changed: 59 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# frozen_string_literal: true
22

3-
describe Dossier, type: :model do
3+
describe Dossier, :oaken, type: :model do
44
include ActionView::Helpers::SanitizeHelper
55

66
let(:user) { create(:user) }
@@ -22,21 +22,29 @@
2222

2323
subject { Dossier.all }
2424

25-
it { is_expected.to match_array([dossier]) }
25+
it { is_expected.to include(dossier) }
2626
end
2727

2828
describe '.without_followers' do
2929
let!(:dossier_with_follower) { create(:dossier, :followed, :with_entreprise, user: user) }
3030
let!(:dossier_without_follower) { create(:dossier, :with_entreprise, user: user) }
3131

32-
it { expect(Dossier.without_followers.to_a).to eq([dossier_without_follower]) }
32+
it do
33+
expect(Dossier.without_followers).to include(dossier_without_follower)
34+
expect(Dossier.without_followers).not_to include(dossier_with_follower)
35+
end
3336
end
3437

3538
describe 'brouillons_recently_updated' do
3639
let!(:dossier_en_brouillon) { create(:dossier) }
3740
let!(:dossier_en_brouillon_2) { create(:dossier) }
3841

39-
it { expect(Dossier.brouillons_recently_updated).to eq([dossier_en_brouillon_2, dossier_en_brouillon]) }
42+
it 'returns brouillons most recently updated first' do
43+
recently_updated = Dossier.brouillons_recently_updated.to_a
44+
45+
expect(recently_updated).to include(dossier_en_brouillon_2, dossier_en_brouillon)
46+
expect(recently_updated.index(dossier_en_brouillon_2)).to be < recently_updated.index(dossier_en_brouillon)
47+
end
4048
end
4149

4250
describe 'by_statut' do
@@ -137,7 +145,14 @@
137145
end
138146

139147
it 'returns only visible brouillon dossiers whose expiration notice period has passed' do
140-
expect(Dossier.brouillon_expired_after_notice_grace).to contain_exactly(dossier_brouillon_expired_and_noticed_long_time_ago)
148+
expect(Dossier.brouillon_expired_after_notice_grace).to include(dossier_brouillon_expired_and_noticed_long_time_ago)
149+
expect(Dossier.brouillon_expired_after_notice_grace).not_to include(
150+
dossier_brouillon_not_expired,
151+
dossier_brouillon_expired_but_noticed_recently,
152+
dossier_brouillon_expired_but_not_noticed_yet,
153+
dossier_instruction_expired,
154+
dossier_hidden
155+
)
141156
end
142157
end
143158

@@ -160,7 +175,9 @@
160175

161176
it 'returns only expired brouillons structurally outside the notice path' do
162177
expect(Dossier.brouillon_expired_without_notice)
163-
.to contain_exactly(expired_on_closed, expired_on_draft, expired_preview)
178+
.to include(expired_on_closed, expired_on_draft, expired_preview)
179+
expect(Dossier.brouillon_expired_without_notice)
180+
.not_to include(expired_on_published, not_expired_on_closed, hidden_on_closed, en_construction_on_closed)
164181
end
165182
end
166183
end
@@ -1535,11 +1552,11 @@
15351552
end
15361553

15371554
describe '#accepter!' do
1538-
let(:procedure) { create(:procedure, :for_individual, :published) }
1539-
let(:dossier) { create(:dossier, :en_instruction, :with_individual, procedure:) }
1555+
let(:procedure) { procedures.demo }
1556+
let(:dossier) { dossiers.en_instruction }
15401557
let(:last_operation) { dossier.dossier_operation_logs.last }
15411558
let(:operation_serialized) { last_operation.data }
1542-
let!(:instructeur) { create(:instructeur) }
1559+
let(:instructeur) { instructeurs.demo }
15431560
let!(:now) { Time.zone.parse('01/01/2100') }
15441561
let!(:attestation_template) { create(:attestation_template, procedure:, kind: :acceptation, state: :published) }
15451562

@@ -1673,10 +1690,10 @@
16731690
end
16741691

16751692
describe '#passer_en_instruction!' do
1676-
let(:dossier) { create(:dossier, :en_construction) }
1693+
let(:dossier) { dossiers.en_construction }
16771694
let(:last_operation) { dossier.dossier_operation_logs.last }
16781695
let(:operation_serialized) { last_operation.data }
1679-
let(:instructeur) { create(:instructeur) }
1696+
let(:instructeur) { instructeurs.demo }
16801697
let!(:correction) { create(:dossier_correction, dossier:) } # correction has a commentaire
16811698

16821699
subject(:passer_en_instruction) { dossier.passer_en_instruction!(instructeur: instructeur) }
@@ -2317,12 +2334,21 @@
23172334
end
23182335

23192336
describe '#repasser_en_instruction!' do
2320-
let(:dossier) { create(:dossier, :refuse, :with_attestation_acceptation, :with_justificatif, archived: true, termine_close_to_expiration_notice_sent_at: Time.zone.now, sva_svr_decision_on: 1.day.ago) }
2321-
let!(:instructeur) { create(:instructeur) }
2337+
let(:dossier) { dossiers.refuse }
2338+
let(:instructeur) { instructeurs.demo }
23222339
let(:last_operation) { dossier.dossier_operation_logs.last }
23232340

23242341
before do
23252342
freeze_time
2343+
create(:attestation_template, procedure: dossier.procedure, state: :published)
2344+
AttestationPdfGenerationJob.perform_now(dossier)
2345+
dossier.justificatif_motivation.attach(
2346+
io: StringIO.new('Hello World'),
2347+
filename: 'hello.txt',
2348+
# we don't want to run virus scanner on this file
2349+
metadata: { virus_scan_result: ActiveStorage::VirusScanner::SAFE }
2350+
)
2351+
dossier.update!(archived: true, termine_close_to_expiration_notice_sent_at: Time.zone.now, sva_svr_decision_on: 1.day.ago)
23262352
allow(NotificationMailer).to receive(:send_repasser_en_instruction_notification).and_return(double(deliver_later: true))
23272353
dossier.repasser_en_instruction!(instructeur: instructeur)
23282354
dossier.reload
@@ -2483,8 +2509,8 @@
24832509
end
24842510

24852511
it do
2486-
expect(Dossier.en_brouillon_expired_to_delete.count).to eq(2)
2487-
expect(Dossier.en_construction_expired_to_delete.count).to eq(2)
2512+
expect(Dossier.en_brouillon_expired_to_delete.where(user:).count).to eq(2)
2513+
expect(Dossier.en_construction_expired_to_delete.where(user:).count).to eq(2)
24882514
end
24892515
end
24902516

@@ -2552,14 +2578,16 @@
25522578
let(:dossiers) { Dossier.with_notifiable_procedure(notify_on_closed: notify_on_closed) }
25532579

25542580
it 'should find dossiers with notifiable procedure' do
2555-
expect(dossiers).to match_array([dossier_on_published_procedure, dossier_on_unpublished_procedure])
2581+
expect(dossiers).to include(dossier_on_published_procedure, dossier_on_unpublished_procedure)
2582+
expect(dossiers).not_to include(dossier_on_test_procedure, dossier_on_closed_procedure)
25562583
end
25572584

25582585
context 'when notify on closed is true' do
25592586
let(:notify_on_closed) { true }
25602587

25612588
it 'should find dossiers with notifiable procedure' do
2562-
expect(dossiers).to match_array([dossier_on_published_procedure, dossier_on_closed_procedure, dossier_on_unpublished_procedure])
2589+
expect(dossiers).to include(dossier_on_published_procedure, dossier_on_closed_procedure, dossier_on_unpublished_procedure)
2590+
expect(dossiers).not_to include(dossier_on_test_procedure)
25632591
end
25642592
end
25652593
end
@@ -2815,35 +2843,32 @@
28152843

28162844
describe '#archivable_in_month' do
28172845
let(:dossier_accepte_at) { DateTime.new(2022, 3, 31, 12, 0) }
2818-
before do
2819-
travel_to(dossier_accepte_at) do
2820-
dossier = create(:dossier, :accepte)
2821-
end
2822-
end
2846+
let!(:dossier) { travel_to(dossier_accepte_at) { create(:dossier, :accepte) } }
28232847

28242848
context 'given a date' do
28252849
let(:archive_date) { Date.new(2022, 3, 1) }
28262850
it 'includes a dossier processed_at at last day of month' do
2827-
expect(Dossier.archivable_in_month(archive_date).count).to eq(1)
2851+
expect(Dossier.archivable_in_month(archive_date)).to include(dossier)
28282852
end
28292853
end
28302854

28312855
context 'given a datetime' do
28322856
let(:archive_date) { DateTime.new(2022, 3, 1, 12, 0) }
28332857
it 'includes a dossier processed_at at last day of month' do
2834-
expect(Dossier.archivable_in_month(archive_date).count).to eq(1)
2858+
expect(Dossier.archivable_in_month(archive_date)).to include(dossier)
28352859
end
28362860
end
28372861

28382862
context 'with a dossier hidden by administration' do
2839-
before do
2863+
let!(:hidden_dossier) do
28402864
travel_to(dossier_accepte_at) do
28412865
create(:dossier, :accepte, :hidden_by_administration)
28422866
end
28432867
end
28442868

28452869
it 'excludes hidden dossiers' do
2846-
expect(Dossier.archivable_in_month(Date.new(2022, 3, 1)).count).to eq(1)
2870+
expect(Dossier.archivable_in_month(Date.new(2022, 3, 1))).to include(dossier)
2871+
expect(Dossier.archivable_in_month(Date.new(2022, 3, 1))).not_to include(hidden_dossier)
28472872
end
28482873
end
28492874
end
@@ -3012,13 +3037,19 @@
30123037

30133038
subject { Dossier.never_touched_brouillon_expired }
30143039

3015-
it { is_expected.to contain_exactly(dossier) }
3040+
it do
3041+
is_expected.to include(dossier)
3042+
is_expected.not_to include(dossier_2, dossier_with_champ_updated, dossier_en_construction)
3043+
end
30163044

30173045
context 'when the dossier has been cloned' do
30183046
let!(:cloned_dossier) { travel_to(3.weeks.ago) { dossier.clone } }
30193047
let!(:cloned_dossier_2) { travel_to(3.weeks.ago) { dossier_with_champ_updated.clone } }
30203048

3021-
it { is_expected.to contain_exactly(dossier) }
3049+
it do
3050+
is_expected.to include(dossier)
3051+
is_expected.not_to include(cloned_dossier, cloned_dossier_2)
3052+
end
30223053
end
30233054

30243055
context 'when the dossier has an etablissement' do

0 commit comments

Comments
 (0)