Merge pull request #6633 from betagouv/improve-procedure-factory

This commit is contained in:
Pierre de La Morinerie 2021-11-23 14:04:15 +01:00 committed by GitHub
commit a82ce9a13c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
23 changed files with 212 additions and 128 deletions

View file

@ -131,7 +131,7 @@ describe NewAdministrateur::ServicesController, type: :controller do
end
it { expect(service.reload).not_to be_nil }
it { expect(flash.alert).to eq("la démarche #{procedure.libelle} utilise encore le service service. Veuillez l'affecter à un autre service avant de pouvoir le supprimer") }
it { expect(flash.alert).to eq("la démarche #{procedure.libelle} utilise encore le service #{service.nom}. Veuillez l'affecter à un autre service avant de pouvoir le supprimer") }
it { expect(flash.notice).to be_nil }
it { expect(response).to redirect_to(admin_services_path(procedure_id: 12)) }
end

View file

@ -1,15 +1,35 @@
describe RechercheController, type: :controller do
let(:dossier) { create(:dossier, :en_construction, :with_populated_annotations) }
let(:dossier2) { create(:dossier, :en_construction, procedure: dossier.procedure) }
let(:procedure) {
create(:procedure,
:published,
:for_individual,
:with_type_de_champ,
:with_type_de_champ_private,
types_de_champ_count: 2,
types_de_champ_private_count: 2)
}
let(:dossier) { create(:dossier, :en_construction, :with_individual, procedure: procedure) }
let(:instructeur) { create(:instructeur) }
let(:dossier_with_expert) { avis.dossier }
let(:avis) { create(:avis, dossier: create(:dossier, :en_construction, :with_populated_annotations)) }
let(:dossier_with_expert) { create(:dossier, :en_construction, :with_individual, procedure: procedure) }
let(:avis) { create(:avis, dossier: dossier_with_expert) }
let(:user) { instructeur.user }
before do
instructeur.assign_to_procedure(dossier.procedure)
dossier.champs[0].value = "Name of district A"
dossier.champs[1].value = "Name of city A"
dossier.champs_private[0].value = "Dossier A is complete"
dossier.champs_private[1].value = "Dossier A is valid"
dossier.save!
dossier_with_expert.champs[0].value = "Name of district B"
dossier_with_expert.champs[1].value = "name of city B"
dossier_with_expert.champs_private[0].value = "Dossier B is incomplete"
dossier_with_expert.champs_private[1].value = "Dossier B is invalid"
dossier_with_expert.save!
end
describe 'GET #index' do
@ -46,8 +66,8 @@ describe RechercheController, type: :controller do
end
context 'when instructeur do not own the dossier' do
let(:dossier3) { create(:dossier, :en_construction) }
let(:query) { dossier3.id }
let(:dossier2) { create(:dossier, :en_construction) }
let(:query) { dossier2.id }
it { is_expected.to have_http_status(200) }
@ -69,29 +89,49 @@ describe RechercheController, type: :controller do
end
end
describe 'by private annotations' do
context 'when instructeur search by private annotations' do
let(:query) { dossier.private_search_terms }
describe 'by champs' do
let(:query) { 'district A' }
before { subject }
before { subject }
it { is_expected.to have_http_status(200) }
it { is_expected.to have_http_status(200) }
it 'returns the expected dossier' do
expect(assigns(:projected_dossiers).count).to eq(1)
expect(assigns(:projected_dossiers).first.dossier_id).to eq(dossier.id)
end
it 'returns the expected dossier' do
expect(assigns(:projected_dossiers).count).to eq(1)
expect(assigns(:projected_dossiers).first.dossier_id).to eq(dossier.id)
end
context 'when expert search by private annotations' do
context 'as an expert' do
let(:user) { avis.experts_procedure.expert.user }
let(:query) { dossier_with_expert.private_search_terms }
before { subject }
let(:query) { 'district' }
it { is_expected.to have_http_status(200) }
it 'returns 0 dossiers' do
it 'returns only the dossier available to the expert' do
expect(assigns(:projected_dossiers).count).to eq(1)
expect(assigns(:projected_dossiers).first.dossier_id).to eq(dossier_with_expert.id)
end
end
end
describe 'by private annotations' do
let(:query) { 'invalid' }
before { subject }
it { is_expected.to have_http_status(200) }
it 'returns the expected dossier' do
expect(assigns(:projected_dossiers).count).to eq(1)
expect(assigns(:projected_dossiers).first.dossier_id).to eq(dossier_with_expert.id)
end
context 'as an expert' do
let(:user) { avis.experts_procedure.expert.user }
it { is_expected.to have_http_status(200) }
it 'does not allow experts to search in private annotations' do
expect(assigns(:projected_dossiers).count).to eq(0)
end
end

View file

@ -190,7 +190,7 @@ FactoryBot.define do
end
factory :champ_siret, class: 'Champs::SiretChamp' do
association :type_de_champ, factory: [:type_de_champ_siret]
type_de_champ { association :type_de_champ_siret, procedure: dossier.procedure }
association :etablissement, factory: [:etablissement]
value { '44011762001530' }
end

View file

@ -2,27 +2,19 @@ FactoryBot.define do
factory :dossier do
autorisation_donnees { true }
state { Dossier.states.fetch(:brouillon) }
association :user
user { association :user }
groupe_instructeur { procedure.routee? ? nil : procedure.defaut_groupe_instructeur }
revision { procedure.active_revision }
individual { association(:individual, :empty, dossier: instance, strategy: :build) if procedure.for_individual? }
transient do
procedure { nil }
end
after(:build) do |dossier, evaluator|
if evaluator.procedure.present?
procedure = evaluator.procedure
else
procedure = create(:procedure, :published, :with_type_de_champ, :with_type_de_champ_private)
end
dossier.revision = procedure.active_revision
# Assign the procedure to the dossier through the groupe_instructeur
if dossier.groupe_instructeur.nil?
dossier.groupe_instructeur = procedure.routee? ? nil : procedure.defaut_groupe_instructeur
end
dossier.build_default_individual
for_individual? { false }
# For now a dossier must use a `create`d procedure, even if the dossier is only built (and not created).
# This is because saving the dossier fails when the procedure has not been saved beforehand
# (due to some internal ActiveRecord error).
# TODO: find a way to find the issue and just `build` the procedure.
procedure { create(:procedure, :published, :with_type_de_champ, :with_type_de_champ_private, for_individual: for_individual?) }
end
trait :with_entreprise do
@ -42,12 +34,11 @@ FactoryBot.define do
end
trait :with_individual do
after(:build) do |dossier, evaluator|
# If the procedure was implicitely created by the factory,
# mark it automatically as for_individual.
if evaluator.procedure.nil?
dossier.procedure.update(for_individual: true)
end
transient do
for_individual? { true }
end
after(:build) do |dossier, _evaluator|
if !dossier.procedure.for_individual?
raise 'Inconsistent factory: attempting to create a dossier :with_individual on a procedure that is not `for_individual?`'
end
@ -99,9 +90,7 @@ FactoryBot.define do
end
trait :with_commentaires do
after(:create) do |dossier, _evaluator|
dossier.commentaires += create_list(:commentaire, 2)
end
commentaires { [build(:commentaire), build(:commentaire)] }
end
trait :followed do

View file

@ -4,5 +4,9 @@ FactoryBot.define do
factory :groupe_instructeur do
label { generate(:groupe_label) }
association :procedure
trait :default do
label { GroupeInstructeur::DEFAUT_LABEL }
end
end
end

View file

@ -5,5 +5,12 @@ FactoryBot.define do
prenom { 'Xavier' }
birthdate { Date.new(1991, 11, 01) }
association :dossier
trait :empty do
gender { nil }
nom { nil }
prenom { nil }
birthdate { nil }
end
end
end

View file

@ -1,5 +1,6 @@
FactoryBot.define do
sequence(:published_path) { |n| "fake_path#{n}" }
factory :procedure do
sequence(:libelle) { |n| "Procedure #{n}" }
description { "Demande de subvention à l'intention des associations" }
@ -12,6 +13,9 @@ FactoryBot.define do
lien_site_web { "https://mon-site.gouv" }
path { SecureRandom.uuid }
groupe_instructeurs { [association(:groupe_instructeur, :default, procedure: instance, strategy: :build)] }
administrateurs { administrateur.present? ? [administrateur] : [association(:administrateur)] }
transient do
administrateur { }
instructeurs { [] }
@ -21,29 +25,16 @@ FactoryBot.define do
end
after(:build) do |procedure, evaluator|
if evaluator.administrateur
procedure.administrateurs = [evaluator.administrateur]
elsif procedure.administrateurs.empty?
procedure.administrateurs = [build(:administrateur)]
end
procedure.draft_revision = build(:procedure_revision, procedure: procedure)
initial_revision = build(:procedure_revision, procedure: procedure)
add_types_de_champs(evaluator.types_de_champ, to: initial_revision, scope: :public)
add_types_de_champs(evaluator.types_de_champ_private, to: initial_revision, scope: :private)
evaluator.types_de_champ.each do |type_de_champ|
type_de_champ.revision = procedure.draft_revision
type_de_champ.private = false
type_de_champ.revision.revision_types_de_champ << build(:procedure_revision_type_de_champ,
revision: procedure.draft_revision,
position: type_de_champ.order_place,
type_de_champ: type_de_champ)
end
evaluator.types_de_champ_private.each do |type_de_champ|
type_de_champ.revision = procedure.draft_revision
type_de_champ.private = true
type_de_champ.revision.revision_types_de_champ_private << build(:procedure_revision_type_de_champ,
revision: procedure.draft_revision,
position: type_de_champ.order_place,
type_de_champ: type_de_champ)
if procedure.brouillon?
procedure.draft_revision = initial_revision
else
procedure.published_revision = initial_revision
procedure.published_revision.published_at = Time.zone.now
procedure.draft_revision = build(:procedure_revision, from_original: initial_revision)
end
end
@ -71,11 +62,12 @@ FactoryBot.define do
end
factory :simple_procedure do
published
for_individual { true }
after(:build) do |procedure, _evaluator|
procedure.for_individual = true
build(:type_de_champ, libelle: 'Texte obligatoire', mandatory: true, procedure: procedure)
procedure.path = generate(:published_path)
procedure.publish!
end
end
@ -88,9 +80,7 @@ FactoryBot.define do
end
trait :with_service do
after(:build) do |procedure, _evaluator|
procedure.service = create(:service)
end
service { association :service, administrateur: administrateurs.first }
end
trait :with_instructeur do
@ -106,9 +96,7 @@ FactoryBot.define do
end
trait :for_individual do
after(:build) do |procedure, _evaluator|
procedure.for_individual = true
end
for_individual { true }
end
trait :with_auto_archive do
@ -218,26 +206,27 @@ FactoryBot.define do
end
trait :published do
after(:build) do |procedure, _evaluator|
procedure.path = generate(:published_path)
procedure.publish!
end
aasm_state { :publiee }
path { generate(:published_path) }
published_at { Time.zone.now }
unpublished_at { nil }
closed_at { nil }
end
trait :closed do
after(:build) do |procedure, _evaluator|
procedure.path = generate(:published_path)
procedure.publish!
procedure.close!
end
published
aasm_state { :close }
published_at { Time.zone.now - 1.second }
closed_at { Time.zone.now }
end
trait :unpublished do
after(:build) do |procedure, _evaluator|
procedure.path = generate(:published_path)
procedure.publish!
procedure.unpublish!
end
published
aasm_state { :depubliee }
published_at { Time.zone.now - 1.second }
unpublished_at { Time.zone.now }
end
trait :discarded do
@ -308,3 +297,17 @@ FactoryBot.define do
end
end
end
def add_types_de_champs(types_de_champ, to: nil, scope: :public)
revision = to
association_name = scope == :private ? :revision_types_de_champ_private : :revision_types_de_champ
types_de_champ.each do |type_de_champ|
type_de_champ.revision = revision
type_de_champ.private = (scope == :private)
type_de_champ.revision.public_send(association_name) << build(:procedure_revision_type_de_champ,
revision: revision,
position: type_de_champ.order_place,
type_de_champ: type_de_champ)
end
end

View file

@ -1,4 +1,21 @@
FactoryBot.define do
factory :procedure_revision do
transient do
from_original { nil }
end
after(:build) do |revision, evaluator|
if evaluator.from_original
original = evaluator.from_original
revision.procedure = original.procedure
original.revision_types_de_champ.each do |r_tdc|
revision.revision_types_de_champ << build(:procedure_revision_type_de_champ, from_original: r_tdc)
end
original.revision_types_de_champ_private.each do |r_tdc|
revision.revision_types_de_champ_private << build(:procedure_revision_type_de_champ, from_original: r_tdc)
end
end
end
end
end

View file

@ -1,4 +1,16 @@
FactoryBot.define do
factory :procedure_revision_type_de_champ do
transient do
from_original { nil }
end
after(:build) do |revision_type_de_champ, evaluator|
if evaluator.from_original
original = evaluator.from_original
revision_type_de_champ.type_de_champ = original.type_de_champ
revision_type_de_champ.position = original.position
end
end
end
end

View file

@ -1,6 +1,6 @@
FactoryBot.define do
factory :service do
nom { 'service' }
sequence(:nom) { |n| "Service #{n}" }
organisme { 'organisme' }
type_organisme { Service.type_organismes.fetch(:association) }
email { 'email@toto.com' }

View file

@ -49,7 +49,7 @@ RSpec.describe DossierHelper, type: :helper do
let(:procedure) { create(:simple_procedure, :for_individual) }
context "when the individual is not provided" do
let(:individual) { nil }
let(:individual) { build(:individual, :empty) }
it { is_expected.to be_blank }
end

View file

@ -6,7 +6,7 @@ RSpec.describe APIEntreprise::Job, type: :job do
describe '#perform' do
let(:dossier) { create(:dossier, :with_entreprise) }
context 'when a un retryable error is raised' do
context 'when an un-retriable error is raised' do
let(:errors) { [:standard_error] }
it 'does not retry' do
@ -14,7 +14,7 @@ RSpec.describe APIEntreprise::Job, type: :job do
end
end
context 'when a retryable error is raised' do
context 'when a retriable error is raised' do
let(:errors) { [:service_unavaible, :bad_gateway, :timed_out] }
it 'retries 5 times' do

View file

@ -1,6 +1,6 @@
RSpec.describe ApplicationMailer, type: :mailer do
describe 'dealing with invalid emails' do
let(:dossier) { create(:dossier, procedure: build(:simple_procedure)) }
let(:dossier) { create(:dossier, procedure: create(:simple_procedure)) }
subject { DossierMailer.notify_new_draft(dossier) }
describe 'invalid emails are not sent' do

View file

@ -12,7 +12,7 @@ RSpec.describe DossierMailer, type: :mailer do
end
describe '.notify_new_draft' do
let(:dossier) { create(:dossier, procedure: build(:simple_procedure, :with_auto_archive)) }
let(:dossier) { create(:dossier, procedure: create(:simple_procedure, :with_auto_archive)) }
subject { described_class.notify_new_draft(dossier) }
@ -27,7 +27,7 @@ RSpec.describe DossierMailer, type: :mailer do
end
describe '.notify_new_answer with dossier brouillon' do
let(:dossier) { create(:dossier, procedure: build(:simple_procedure)) }
let(:dossier) { create(:dossier, procedure: create(:simple_procedure)) }
let(:commentaire) { create(:commentaire, dossier: dossier) }
subject { described_class.with(commentaire: commentaire).notify_new_answer }
@ -39,8 +39,9 @@ RSpec.describe DossierMailer, type: :mailer do
end
describe '.notify_new_answer with dossier en construction' do
let(:dossier) { create(:dossier, state: "en_construction", procedure: build(:simple_procedure)) }
let(:dossier) { create(:dossier, :en_construction, procedure: create(:simple_procedure)) }
let(:commentaire) { create(:commentaire, dossier: dossier) }
subject { described_class.with(commentaire: commentaire).notify_new_answer }
it { expect(subject.subject).to include("Nouveau message") }
@ -51,7 +52,7 @@ RSpec.describe DossierMailer, type: :mailer do
end
describe '.notify_new_answer with commentaire discarded' do
let(:dossier) { create(:dossier, procedure: build(:simple_procedure)) }
let(:dossier) { create(:dossier, procedure: create(:simple_procedure)) }
let(:commentaire) { create(:commentaire, dossier: dossier, discarded_at: 2.minutes.ago) }
subject { described_class.with(commentaire: commentaire).notify_new_answer }
@ -83,7 +84,7 @@ RSpec.describe DossierMailer, type: :mailer do
end
describe '.notify_revert_to_instruction' do
let(:dossier) { create(:dossier, procedure: build(:simple_procedure)) }
let(:dossier) { create(:dossier, procedure: create(:simple_procedure)) }
subject { described_class.notify_revert_to_instruction(dossier) }

View file

@ -1,4 +1,3 @@
describe Champs::IbanChamp do
describe '#valid?' do
it do

View file

@ -193,11 +193,21 @@ describe Dossier do
expect(dossier.champs.count).to eq(1)
expect(dossier.champs_private.count).to eq(1)
end
end
describe '#build_default_individual' do
let(:dossier) { build(:dossier, procedure: procedure, user: user) }
subject do
dossier.individual = nil
dossier.build_default_individual
end
context 'when the dossier belongs to a procedure for individuals' do
let(:procedure) { create(:procedure, :with_type_de_champ, for_individual: true) }
let(:procedure) { create(:procedure, for_individual: true) }
it 'creates a default individual' do
subject
expect(dossier.individual).to be_present
expect(dossier.individual.nom).to be_nil
expect(dossier.individual.prenom).to be_nil
@ -209,6 +219,7 @@ describe Dossier do
let(:user) { build(:user, france_connect_information: france_connect_information) }
it 'fills the individual with the informations from France Connect' do
subject
expect(dossier.individual.nom).to eq('DUBOIS')
expect(dossier.individual.prenom).to eq('Angela Claire Louise')
expect(dossier.individual.gender).to eq(Individual::GENDER_FEMALE)
@ -217,9 +228,10 @@ describe Dossier do
end
context 'when the dossier belongs to a procedure for moral personas' do
let(:procedure) { create(:procedure, :with_type_de_champ, for_individual: false) }
let(:procedure) { create(:procedure, for_individual: false) }
it 'doesnt create a individual' do
subject
expect(dossier.individual).to be_nil
end
end

View file

@ -262,14 +262,14 @@ describe Instructeur, type: :model do
end
describe '#notifications_for_groupe_instructeurs' do
# one procedure, one group, 2 instructeurs
# a procedure, one group, 2 instructeurs
let(:procedure) { create(:simple_procedure, :routee, :with_type_de_champ_private, :for_individual) }
let(:gi_p1) { procedure.groupe_instructeurs.last }
let!(:dossier) { create(:dossier, :with_individual, :followed, groupe_instructeur: gi_p1, state: Dossier.states.fetch(:en_construction)) }
let!(:dossier) { create(:dossier, :with_individual, :followed, procedure: procedure, groupe_instructeur: gi_p1, state: Dossier.states.fetch(:en_construction)) }
let(:instructeur) { dossier.follows.first.instructeur }
let!(:instructeur_2) { create(:instructeur, groupe_instructeurs: [gi_p1]) }
# one other procedure, dossier followed by a third instructeur
# another procedure, dossier followed by a third instructeur
let!(:dossier_on_procedure_2) { create(:dossier, :followed, state: Dossier.states.fetch(:en_construction)) }
let!(:instructeur_on_procedure_2) { dossier_on_procedure_2.follows.first.instructeur }
let(:gi_p2) { dossier.groupe_instructeur }

View file

@ -16,7 +16,7 @@ describe ProcedurePresentation do
context 'for a published procedure' do
let(:procedure) { create(:procedure, :published) }
let!(:tdc) { { type_champ: :number, libelle: 'libelle 1' } }
let(:tdc) { { type_champ: :number, libelle: 'libelle 1' } }
before do
procedure.draft_revision.add_type_de_champ(tdc)
@ -26,7 +26,7 @@ describe ProcedurePresentation do
it { is_expected.to match(['libelle 1']) }
context 'when there is another published revision with an added tdc' do
let!(:added_tdc) { { type_champ: :number, libelle: 'libelle 2' } }
let(:added_tdc) { { type_champ: :number, libelle: 'libelle 2' } }
before do
procedure.draft_revision.add_type_de_champ(added_tdc)
@ -37,7 +37,7 @@ describe ProcedurePresentation do
end
context 'add one tdc above the first one' do
let!(:tdc2) { { type_champ: :number, libelle: 'libelle 2' } }
let(:tdc2) { { type_champ: :number, libelle: 'libelle 2' } }
before do
created_tdc2 = procedure.draft_revision.add_type_de_champ(tdc2)
@ -47,7 +47,7 @@ describe ProcedurePresentation do
it { is_expected.to match(['libelle 2', 'libelle 1']) }
context 'and finaly, when this tdc is removed' do
context 'and finally, when this tdc is removed' do
let!(:previous_tdc2) { procedure.published_revision.types_de_champ.find_by(libelle: 'libelle 2') }
before do

View file

@ -320,8 +320,8 @@ describe ProcedurePresentation do
let(:procedure) { create(:procedure, :for_individual) }
let!(:first_dossier) { create(:dossier, procedure: procedure, individual: create(:individual, gender: 'M', prenom: 'Alain', nom: 'Antonelli')) }
let!(:last_dossier) { create(:dossier, procedure: procedure, individual: create(:individual, gender: 'Mme', prenom: 'Zora', nom: 'Zemmour')) }
let!(:first_dossier) { create(:dossier, procedure: procedure, individual: build(:individual, gender: 'M', prenom: 'Alain', nom: 'Antonelli')) }
let!(:last_dossier) { create(:dossier, procedure: procedure, individual: build(:individual, gender: 'Mme', prenom: 'Zora', nom: 'Zemmour')) }
context 'for gender column' do
let(:column) { 'gender' }
@ -617,8 +617,8 @@ describe ProcedurePresentation do
context 'for individual table' do
let(:procedure) { create(:procedure, :for_individual) }
let!(:kept_dossier) { create(:dossier, procedure: procedure, individual: create(:individual, gender: 'Mme', prenom: 'Josephine', nom: 'Baker')) }
let!(:discarded_dossier) { create(:dossier, procedure: procedure, individual: create(:individual, gender: 'M', prenom: 'Jean', nom: 'Tremblay')) }
let!(:kept_dossier) { create(:dossier, procedure: procedure, individual: build(:individual, gender: 'Mme', prenom: 'Josephine', nom: 'Baker')) }
let!(:discarded_dossier) { create(:dossier, procedure: procedure, individual: build(:individual, gender: 'M', prenom: 'Jean', nom: 'Tremblay')) }
context 'for gender column' do
let(:filter) { [{ 'table' => 'individual', 'column' => 'gender', 'value' => 'Mme' }] }
@ -646,7 +646,7 @@ describe ProcedurePresentation do
]
end
let!(:other_kept_dossier) { create(:dossier, procedure: procedure, individual: create(:individual, gender: 'M', prenom: 'Romuald', nom: 'Pistis')) }
let!(:other_kept_dossier) { create(:dossier, procedure: procedure, individual: build(:individual, gender: 'M', prenom: 'Romuald', nom: 'Pistis')) }
it 'returns every dossier that matches any of the search criteria for a given column' do
is_expected.to contain_exactly(kept_dossier.id, other_kept_dossier.id)

View file

@ -21,11 +21,11 @@ describe DossierSerializer do
let(:dossier) { create(:dossier, :en_construction, procedure: create(:procedure, :published, :with_type_de_champ)) }
before do
dossier.champs << build(:champ_carte)
dossier.champs << build(:champ_siret)
dossier.champs << build(:champ_integer_number)
dossier.champs << build(:champ_decimal_number)
dossier.champs << build(:champ_linked_drop_down_list)
dossier.champs << build(:champ_carte, dossier: dossier)
dossier.champs << build(:champ_siret, dossier: dossier)
dossier.champs << build(:champ_integer_number, dossier: dossier)
dossier.champs << build(:champ_decimal_number, dossier: dossier)
dossier.champs << build(:champ_linked_drop_down_list, dossier: dossier)
end
it {

View file

@ -92,7 +92,7 @@ describe DossierProjectionService do
context 'for individual table' do
let(:table) { 'individual' }
let(:procedure) { create(:procedure, :for_individual, :with_type_de_champ, :with_type_de_champ_private) }
let(:dossier) { create(:dossier, procedure: procedure, individual: create(:individual, nom: 'Martin', prenom: 'Jacques', gender: 'M.')) }
let(:dossier) { create(:dossier, procedure: procedure, individual: build(:individual, nom: 'Martin', prenom: 'Jacques', gender: 'M.')) }
context 'for prenom column' do
let(:column) { 'prenom' }

View file

@ -1,5 +1,5 @@
describe 'wcag rules for usager', js: true do
let(:procedure) { create(:procedure, :with_type_de_champ, :with_all_champs, :with_service, :for_individual, :published) }
let(:procedure) { create(:procedure, :published, :with_all_champs, :with_service, :for_individual) }
let(:password) { 'a very complicated password' }
let(:litteraire_user) { create(:user, password: password) }

View file

@ -32,7 +32,7 @@ describe 'shared/dossiers/demande.html.haml', type: :view do
end
context 'when dossier was created by an individual' do
let(:individual) { create(:individual) }
let(:individual) { build(:individual) }
it 'renders the individual identity infos' do
expect(subject).to include(individual.gender)