Merge pull request #9021 from colinux/feat-en-construction-fork
ETQ usager, je modifie et soumets à nouveau mon dossier “en construction"
This commit is contained in:
commit
79f450a422
53 changed files with 839 additions and 303 deletions
128
spec/models/concern/dossier_clone_concern_spec.rb
Normal file
128
spec/models/concern/dossier_clone_concern_spec.rb
Normal file
|
@ -0,0 +1,128 @@
|
|||
RSpec.describe DossierCloneConcern do
|
||||
let(:procedure) do
|
||||
create(:procedure, types_de_champ_public: [
|
||||
{ type: :text, libelle: "Un champ text", stable_id: 99 },
|
||||
{ type: :text, libelle: "Un autre champ text", stable_id: 991 },
|
||||
{ type: :yes_no, libelle: "Un champ yes no", stable_id: 992 },
|
||||
{ type: :repetition, libelle: "Un champ répétable", stable_id: 993, mandatory: true, children: [{ type: :text, libelle: 'Nom', stable_id: 994 }] }
|
||||
])
|
||||
end
|
||||
let(:dossier) { create(:dossier, procedure:) }
|
||||
let(:forked_dossier) { dossier.find_or_create_editing_fork(dossier.user) }
|
||||
|
||||
before { procedure.publish! }
|
||||
|
||||
describe '#make_diff' do
|
||||
subject { dossier.make_diff(forked_dossier) }
|
||||
|
||||
context 'with no changes' do
|
||||
it { is_expected.to eq(added: [], updated: [], removed: []) }
|
||||
end
|
||||
|
||||
context 'with updated groupe instructeur' do
|
||||
before {
|
||||
dossier.update(groupe_instructeur: nil)
|
||||
forked_dossier.assign_to_groupe_instructeur(dossier.procedure.defaut_groupe_instructeur)
|
||||
}
|
||||
|
||||
it { is_expected.to eq(added: [], updated: [], removed: []) }
|
||||
it { expect(forked_dossier.forked_with_changes?).to be_truthy }
|
||||
end
|
||||
|
||||
context 'with updated champ' do
|
||||
let(:updated_champ) { forked_dossier.champs.find { _1.stable_id == 99 } }
|
||||
|
||||
before { updated_champ.update(value: 'new value') }
|
||||
|
||||
it { is_expected.to eq(added: [], updated: [updated_champ], removed: []) }
|
||||
it 'forked_with_changes? should reflect dossier state' do
|
||||
expect(dossier.forked_with_changes?).to be_falsey
|
||||
expect(forked_dossier.forked_with_changes?).to be_truthy
|
||||
expect(updated_champ.forked_with_changes?).to be_truthy
|
||||
end
|
||||
end
|
||||
|
||||
context 'with new revision' do
|
||||
let(:added_champ) { forked_dossier.champs.find { _1.libelle == "Un nouveau champ text" } }
|
||||
let(:removed_champ) { dossier.champs.find { _1.stable_id == 99 } }
|
||||
|
||||
before do
|
||||
procedure.draft_revision.add_type_de_champ({
|
||||
type_champ: TypeDeChamp.type_champs.fetch(:text),
|
||||
libelle: "Un nouveau champ text"
|
||||
})
|
||||
procedure.draft_revision.remove_type_de_champ(removed_champ.stable_id)
|
||||
procedure.publish_revision!
|
||||
end
|
||||
|
||||
it {
|
||||
expect(dossier.revision_id).to eq(procedure.revisions.first.id)
|
||||
expect(forked_dossier.revision_id).to eq(procedure.published_revision_id)
|
||||
is_expected.to eq(added: [added_champ], updated: [], removed: [removed_champ])
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
describe '#merge_fork' do
|
||||
subject { dossier.merge_fork(forked_dossier) }
|
||||
|
||||
context 'with updated champ' do
|
||||
let(:updated_champ) { forked_dossier.champs.find { _1.stable_id == 99 } }
|
||||
let(:updated_repetition_champ) { forked_dossier.champs.find { _1.stable_id == 994 } }
|
||||
|
||||
before do
|
||||
dossier.champs.each do |champ|
|
||||
champ.update(value: 'old value')
|
||||
end
|
||||
updated_champ.update(value: 'new value')
|
||||
updated_repetition_champ.update(value: 'new value in repetition')
|
||||
end
|
||||
|
||||
it { expect { subject }.to change { dossier.reload.champs.size }.by(0) }
|
||||
it { expect { subject }.not_to change { dossier.reload.champs.order(:created_at).reject { _1.stable_id.in?([99, 994]) }.map(&:value) } }
|
||||
it { expect { subject }.to change { dossier.reload.champs.find { _1.stable_id == 99 }.value }.from('old value').to('new value') }
|
||||
it { expect { subject }.to change { dossier.reload.champs.find { _1.stable_id == 994 }.value }.from('old value').to('new value in repetition') }
|
||||
|
||||
it 'update dossier search terms' do
|
||||
expect { subject }.to have_enqueued_job(DossierUpdateSearchTermsJob).with(dossier)
|
||||
end
|
||||
|
||||
it 'fork is hidden after merge' do
|
||||
subject
|
||||
expect(forked_dossier.reload.hidden_by_reason).to eq("stale_fork")
|
||||
expect(dossier.reload.editing_forks).to be_empty
|
||||
end
|
||||
end
|
||||
|
||||
context 'with new revision' do
|
||||
let(:added_champ) { forked_dossier.champs.find { _1.libelle == "Un nouveau champ text" } }
|
||||
let(:removed_champ) { dossier.champs.find { _1.stable_id == 99 } }
|
||||
|
||||
before do
|
||||
dossier.champs.each do |champ|
|
||||
champ.update(value: 'old value')
|
||||
end
|
||||
procedure.draft_revision.add_type_de_champ({
|
||||
type_champ: TypeDeChamp.type_champs.fetch(:text),
|
||||
libelle: "Un nouveau champ text"
|
||||
})
|
||||
procedure.draft_revision.remove_type_de_champ(removed_champ.stable_id)
|
||||
procedure.publish_revision!
|
||||
end
|
||||
|
||||
it { expect { subject }.to change { dossier.reload.champs.size }.by(0) }
|
||||
it { expect { subject }.to change { dossier.reload.champs.order(:created_at).map(&:to_s) }.from(['old value', 'old value', 'Non', 'old value', 'old value']).to(['old value', 'Non', 'old value', 'old value', '']) }
|
||||
|
||||
it "dossier after merge should be on last published revision" do
|
||||
expect(dossier.revision_id).to eq(procedure.revisions.first.id)
|
||||
expect(forked_dossier.revision_id).to eq(procedure.published_revision_id)
|
||||
|
||||
subject
|
||||
perform_enqueued_jobs only: DestroyRecordLaterJob
|
||||
|
||||
expect(dossier.revision_id).to eq(procedure.published_revision_id)
|
||||
expect(Dossier.exists?(forked_dossier.id)).to be_falsey
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
41
spec/models/concern/dossier_searchable_concern_spec.rb
Normal file
41
spec/models/concern/dossier_searchable_concern_spec.rb
Normal file
|
@ -0,0 +1,41 @@
|
|||
describe DossierSearchableConcern do
|
||||
let(:champ_public) { dossier.champs_public.first }
|
||||
let(:champ_private) { dossier.champs_private.first }
|
||||
|
||||
subject { dossier }
|
||||
|
||||
describe '#update_search_terms' do
|
||||
let(:etablissement) { dossier.etablissement }
|
||||
let(:dossier) { create(:dossier, :with_entreprise, user: user) }
|
||||
let(:etablissement) { build(:etablissement, entreprise_nom: 'Dupont', entreprise_prenom: 'Thomas', association_rna: '12345', association_titre: 'asso de test', association_objet: 'tests unitaires') }
|
||||
let(:procedure) { create(:procedure, :with_type_de_champ, :with_type_de_champ_private) }
|
||||
let(:dossier) { create(:dossier, etablissement: etablissement, user: user, procedure: procedure) }
|
||||
let(:france_connect_information) { build(:france_connect_information, given_name: 'Chris', family_name: 'Harrisson') }
|
||||
let(:user) { build(:user, france_connect_information: france_connect_information) }
|
||||
|
||||
before do
|
||||
champ_public.update_attribute(:value, "champ public")
|
||||
champ_private.update_attribute(:value, "champ privé")
|
||||
|
||||
dossier.update_search_terms
|
||||
end
|
||||
|
||||
it { expect(dossier.search_terms).to eq("#{user.email} champ public #{etablissement.entreprise_siren} #{etablissement.entreprise_numero_tva_intracommunautaire} #{etablissement.entreprise_forme_juridique} #{etablissement.entreprise_forme_juridique_code} #{etablissement.entreprise_nom_commercial} #{etablissement.entreprise_raison_sociale} #{etablissement.entreprise_siret_siege_social} #{etablissement.entreprise_nom} #{etablissement.entreprise_prenom} #{etablissement.association_rna} #{etablissement.association_titre} #{etablissement.association_objet} #{etablissement.siret} #{etablissement.naf} #{etablissement.libelle_naf} #{etablissement.adresse} #{etablissement.code_postal} #{etablissement.localite} #{etablissement.code_insee_localite}") }
|
||||
it { expect(dossier.private_search_terms).to eq('champ privé') }
|
||||
|
||||
context 'with an update' do
|
||||
before do
|
||||
dossier.update(
|
||||
champs_public_attributes: [{ id: champ_public.id, value: 'nouvelle valeur publique' }],
|
||||
champs_private_attributes: [{ id: champ_private.id, value: 'nouvelle valeur privee' }]
|
||||
)
|
||||
|
||||
perform_enqueued_jobs(only: DossierUpdateSearchTermsJob)
|
||||
dossier.reload
|
||||
end
|
||||
|
||||
it { expect(dossier.search_terms).to include('nouvelle valeur publique') }
|
||||
it { expect(dossier.private_search_terms).to include('nouvelle valeur privee') }
|
||||
end
|
||||
end
|
||||
end
|
|
@ -279,38 +279,6 @@ describe Dossier do
|
|||
|
||||
subject { dossier }
|
||||
|
||||
describe '#update_search_terms' do
|
||||
let(:etablissement) { build(:etablissement, entreprise_nom: 'Dupont', entreprise_prenom: 'Thomas', association_rna: '12345', association_titre: 'asso de test', association_objet: 'tests unitaires') }
|
||||
let(:procedure) { create(:procedure, :with_type_de_champ, :with_type_de_champ_private) }
|
||||
let(:dossier) { create(:dossier, etablissement: etablissement, user: user, procedure: procedure) }
|
||||
let(:france_connect_information) { build(:france_connect_information, given_name: 'Chris', family_name: 'Harrisson') }
|
||||
let(:user) { build(:user, france_connect_information: france_connect_information) }
|
||||
let(:champ_public) { dossier.champs_public.first }
|
||||
let(:champ_private) { dossier.champs_private.first }
|
||||
|
||||
before do
|
||||
champ_public.update_attribute(:value, "champ public")
|
||||
champ_private.update_attribute(:value, "champ privé")
|
||||
|
||||
dossier.update_search_terms
|
||||
end
|
||||
|
||||
it { expect(dossier.search_terms).to eq("#{user.email} champ public #{etablissement.entreprise_siren} #{etablissement.entreprise_numero_tva_intracommunautaire} #{etablissement.entreprise_forme_juridique} #{etablissement.entreprise_forme_juridique_code} #{etablissement.entreprise_nom_commercial} #{etablissement.entreprise_raison_sociale} #{etablissement.entreprise_siret_siege_social} #{etablissement.entreprise_nom} #{etablissement.entreprise_prenom} #{etablissement.association_rna} #{etablissement.association_titre} #{etablissement.association_objet} #{etablissement.siret} #{etablissement.naf} #{etablissement.libelle_naf} #{etablissement.adresse} #{etablissement.code_postal} #{etablissement.localite} #{etablissement.code_insee_localite}") }
|
||||
it { expect(dossier.private_search_terms).to eq('champ privé') }
|
||||
|
||||
context 'with an update' do
|
||||
before do
|
||||
dossier.update(
|
||||
champs_public_attributes: [{ id: champ_public.id, value: 'nouvelle valeur publique' }],
|
||||
champs_private_attributes: [{ id: champ_private.id, value: 'nouvelle valeur privee' }]
|
||||
)
|
||||
end
|
||||
|
||||
it { expect(dossier.search_terms).to include('nouvelle valeur publique') }
|
||||
it { expect(dossier.private_search_terms).to include('nouvelle valeur privee') }
|
||||
end
|
||||
end
|
||||
|
||||
describe '#create' do
|
||||
let(:procedure) { create(:procedure, :with_type_de_champ, :with_type_de_champ_private) }
|
||||
let(:dossier) { create(:dossier, procedure: procedure, user: user) }
|
||||
|
@ -612,12 +580,12 @@ describe Dossier do
|
|||
let(:dossier) { create(:dossier, :en_construction, procedure: procedure) }
|
||||
|
||||
it "can change groupe instructeur" do
|
||||
expect(dossier.assign_to_groupe_instructeur(new_groupe_instructeur_new_procedure)).to be_falsey
|
||||
dossier.assign_to_groupe_instructeur(new_groupe_instructeur_new_procedure)
|
||||
expect(dossier.groupe_instructeur).not_to eq(new_groupe_instructeur_new_procedure)
|
||||
end
|
||||
|
||||
it "can not change groupe instructeur if new groupe is from another procedure" do
|
||||
expect(dossier.assign_to_groupe_instructeur(new_groupe_instructeur)).to be_truthy
|
||||
dossier.assign_to_groupe_instructeur(new_groupe_instructeur)
|
||||
expect(dossier.groupe_instructeur).to eq(new_groupe_instructeur)
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
describe RoutingEngine, type: :model do
|
||||
include Logic
|
||||
|
||||
before { Flipper.enable(:routing_rules, procedure) }
|
||||
|
||||
describe '.compute' do
|
||||
let(:procedure) do
|
||||
create(:procedure).tap do |p|
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue