2022-05-20 10:19:09 +02:00
|
|
|
describe Dossier do
|
|
|
|
describe '#can_rebase?' do
|
2022-12-14 09:17:09 +01:00
|
|
|
let(:procedure) { create(:procedure, :with_type_de_champ_mandatory, :with_type_de_champ_private, :with_yes_no) }
|
2022-05-20 10:19:09 +02:00
|
|
|
let(:attestation_template) { procedure.draft_revision.attestation_template.find_or_revise! }
|
2022-11-16 12:46:33 +01:00
|
|
|
let(:type_de_champ) { procedure.active_revision.types_de_champ_public.find { |tdc| !tdc.mandatory? } }
|
2022-12-14 09:17:09 +01:00
|
|
|
let(:private_type_de_champ) { procedure.active_revision.types_de_champ_private.first }
|
2022-11-16 12:46:33 +01:00
|
|
|
let(:mandatory_type_de_champ) { procedure.active_revision.types_de_champ_public.find(&:mandatory?) }
|
2022-05-20 10:19:09 +02:00
|
|
|
|
|
|
|
context 'en_construction' do
|
|
|
|
let(:dossier) { create(:dossier, :en_construction, procedure: procedure) }
|
|
|
|
|
|
|
|
before do
|
|
|
|
procedure.publish!
|
|
|
|
procedure.reload
|
|
|
|
dossier
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'with added type de champ' do
|
|
|
|
before do
|
|
|
|
procedure.draft_revision.add_type_de_champ({
|
|
|
|
type_champ: TypeDeChamp.type_champs.fetch(:text),
|
|
|
|
libelle: "Un champ text"
|
|
|
|
})
|
|
|
|
procedure.publish_revision!
|
|
|
|
dossier.reload
|
|
|
|
end
|
|
|
|
|
2022-12-14 09:17:09 +01:00
|
|
|
it 'should be true' do
|
|
|
|
expect(dossier.pending_changes).not_to be_empty
|
|
|
|
expect(dossier.can_rebase?).to be_truthy
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'with added mandatory type de champ' do
|
|
|
|
before do
|
|
|
|
procedure.draft_revision.add_type_de_champ({
|
|
|
|
type_champ: TypeDeChamp.type_champs.fetch(:text),
|
|
|
|
libelle: "Un champ text",
|
|
|
|
mandatory: true
|
|
|
|
})
|
|
|
|
procedure.publish_revision!
|
|
|
|
dossier.reload
|
|
|
|
end
|
|
|
|
|
2022-05-20 10:19:09 +02:00
|
|
|
it 'should be false' do
|
|
|
|
expect(dossier.pending_changes).not_to be_empty
|
|
|
|
expect(dossier.can_rebase?).to be_falsey
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'with type de champ made optional' do
|
|
|
|
before do
|
2022-05-25 09:40:02 +02:00
|
|
|
procedure.draft_revision.find_and_ensure_exclusive_use(mandatory_type_de_champ.stable_id).update(mandatory: false)
|
2022-05-20 10:19:09 +02:00
|
|
|
procedure.publish_revision!
|
|
|
|
dossier.reload
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'should be true' do
|
|
|
|
expect(dossier.pending_changes).not_to be_empty
|
|
|
|
expect(dossier.can_rebase?).to be_truthy
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'with type de champ made mandatory' do
|
|
|
|
before do
|
2022-05-25 09:40:02 +02:00
|
|
|
procedure.draft_revision.find_and_ensure_exclusive_use(type_de_champ.stable_id).update(mandatory: true)
|
2022-05-20 10:19:09 +02:00
|
|
|
procedure.publish_revision!
|
|
|
|
dossier.reload
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'should be false' do
|
|
|
|
expect(dossier.pending_changes).not_to be_empty
|
|
|
|
expect(dossier.can_rebase?).to be_falsey
|
|
|
|
end
|
2022-12-22 13:08:04 +01:00
|
|
|
|
|
|
|
context 'with a value' do
|
|
|
|
before do
|
|
|
|
dossier.champs.find_by(type_de_champ: type_de_champ).update(value: 'a value')
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'should be true' do
|
|
|
|
expect(dossier.pending_changes).not_to be_empty
|
|
|
|
expect(dossier.can_rebase?).to be_truthy
|
|
|
|
end
|
|
|
|
end
|
2022-05-20 10:19:09 +02:00
|
|
|
end
|
|
|
|
|
2022-12-14 09:17:09 +01:00
|
|
|
context 'with type de champ change type' do
|
|
|
|
context 'type de champ public' do
|
|
|
|
before do
|
|
|
|
procedure.draft_revision.find_and_ensure_exclusive_use(type_de_champ.stable_id).update(type_champ: :checkbox)
|
|
|
|
procedure.publish_revision!
|
|
|
|
dossier.reload
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'should be false' do
|
|
|
|
expect(dossier.pending_changes).not_to be_empty
|
|
|
|
expect(dossier.can_rebase?).to be_falsey
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'type de champ private' do
|
|
|
|
before do
|
|
|
|
procedure.draft_revision.find_and_ensure_exclusive_use(private_type_de_champ.stable_id).update(type_champ: :checkbox)
|
|
|
|
procedure.publish_revision!
|
|
|
|
dossier.reload
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'should be true' do
|
|
|
|
expect(dossier.pending_changes).not_to be_empty
|
|
|
|
expect(dossier.can_rebase?).to be_truthy
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2022-05-20 10:19:09 +02:00
|
|
|
context 'with removed type de champ' do
|
|
|
|
before do
|
|
|
|
procedure.draft_revision.remove_type_de_champ(type_de_champ.stable_id)
|
|
|
|
procedure.publish_revision!
|
|
|
|
dossier.reload
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'should be true' do
|
|
|
|
expect(dossier.pending_changes).not_to be_empty
|
|
|
|
expect(dossier.can_rebase?).to be_truthy
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'en_instruction' do
|
|
|
|
let(:dossier) { create(:dossier, :en_instruction, procedure: procedure) }
|
|
|
|
|
|
|
|
before do
|
|
|
|
procedure.publish!
|
|
|
|
procedure.reload
|
|
|
|
dossier
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'with added type de champ' do
|
|
|
|
before do
|
|
|
|
procedure.draft_revision.add_type_de_champ({
|
|
|
|
type_champ: TypeDeChamp.type_champs.fetch(:text),
|
|
|
|
libelle: "Un champ text"
|
|
|
|
})
|
|
|
|
procedure.publish_revision!
|
|
|
|
dossier.reload
|
|
|
|
end
|
|
|
|
|
2022-12-14 09:17:09 +01:00
|
|
|
it 'should be true' do
|
2022-05-20 10:19:09 +02:00
|
|
|
expect(dossier.pending_changes).not_to be_empty
|
2022-12-14 09:17:09 +01:00
|
|
|
expect(dossier.can_rebase?).to be_truthy
|
2022-05-20 10:19:09 +02:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2022-12-14 09:17:09 +01:00
|
|
|
context 'with added mandatory type de champ' do
|
2022-05-20 10:19:09 +02:00
|
|
|
before do
|
2022-12-14 09:17:09 +01:00
|
|
|
procedure.draft_revision.add_type_de_champ({
|
|
|
|
type_champ: TypeDeChamp.type_champs.fetch(:text),
|
|
|
|
libelle: "Un champ text",
|
|
|
|
mandatory: true
|
|
|
|
})
|
2022-05-20 10:19:09 +02:00
|
|
|
procedure.publish_revision!
|
|
|
|
dossier.reload
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'should be false' do
|
|
|
|
expect(dossier.pending_changes).not_to be_empty
|
|
|
|
expect(dossier.can_rebase?).to be_falsey
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'with type de champ made optional' do
|
|
|
|
before do
|
2022-05-25 09:40:02 +02:00
|
|
|
procedure.draft_revision.find_and_ensure_exclusive_use(mandatory_type_de_champ.stable_id).update(mandatory: false)
|
2022-05-20 10:19:09 +02:00
|
|
|
procedure.publish_revision!
|
|
|
|
dossier.reload
|
|
|
|
end
|
|
|
|
|
2022-12-14 09:17:09 +01:00
|
|
|
it 'should be true' do
|
|
|
|
expect(dossier.pending_changes).not_to be_empty
|
|
|
|
expect(dossier.can_rebase?).to be_truthy
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'with type de champ made mandatory' do
|
|
|
|
before do
|
|
|
|
procedure.draft_revision.find_and_ensure_exclusive_use(type_de_champ.stable_id).update(mandatory: true)
|
|
|
|
procedure.publish_revision!
|
|
|
|
dossier.reload
|
|
|
|
end
|
|
|
|
|
2022-05-20 10:19:09 +02:00
|
|
|
it 'should be false' do
|
|
|
|
expect(dossier.pending_changes).not_to be_empty
|
|
|
|
expect(dossier.can_rebase?).to be_falsey
|
|
|
|
end
|
|
|
|
end
|
2022-12-14 09:17:09 +01:00
|
|
|
|
|
|
|
context 'with type de champ change type' do
|
|
|
|
context 'type de champ public' do
|
|
|
|
before do
|
|
|
|
procedure.draft_revision.find_and_ensure_exclusive_use(type_de_champ.stable_id).update(type_champ: :checkbox)
|
|
|
|
procedure.publish_revision!
|
|
|
|
dossier.reload
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'should be false' do
|
|
|
|
expect(dossier.pending_changes).not_to be_empty
|
|
|
|
expect(dossier.can_rebase?).to be_falsey
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'type de champ private' do
|
|
|
|
before do
|
|
|
|
procedure.draft_revision.find_and_ensure_exclusive_use(private_type_de_champ.stable_id).update(type_champ: :checkbox)
|
|
|
|
procedure.publish_revision!
|
|
|
|
dossier.reload
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'should be true' do
|
|
|
|
expect(dossier.pending_changes).not_to be_empty
|
|
|
|
expect(dossier.can_rebase?).to be_truthy
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'with removed type de champ' do
|
|
|
|
before do
|
|
|
|
procedure.draft_revision.remove_type_de_champ(type_de_champ.stable_id)
|
|
|
|
procedure.publish_revision!
|
|
|
|
dossier.reload
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'should be true' do
|
|
|
|
expect(dossier.pending_changes).not_to be_empty
|
|
|
|
expect(dossier.can_rebase?).to be_truthy
|
|
|
|
end
|
|
|
|
end
|
2022-05-20 10:19:09 +02:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe "#rebase" do
|
2023-01-26 17:58:41 +01:00
|
|
|
let(:procedure) { create(:procedure, types_de_champ_public: [{ type: :text, mandatory: true }, { type: :repetition, children: [{ type: :text }] }, { type: :datetime }, { type: :yes_no }, { type: :integer_number }]) }
|
2022-05-20 10:19:09 +02:00
|
|
|
let(:dossier) { create(:dossier, procedure: procedure) }
|
|
|
|
|
2022-11-16 12:46:33 +01:00
|
|
|
let(:yes_no_type_de_champ) { procedure.active_revision.types_de_champ_public.find { |tdc| tdc.type_champ == TypeDeChamp.type_champs.fetch(:yes_no) } }
|
2022-05-20 10:19:09 +02:00
|
|
|
|
2022-11-16 12:46:33 +01:00
|
|
|
let(:text_type_de_champ) { procedure.active_revision.types_de_champ_public.find(&:mandatory?) }
|
2022-11-10 22:21:14 +01:00
|
|
|
let(:text_champ) { dossier.champs_public.find(&:mandatory?) }
|
|
|
|
let(:rebased_text_champ) { dossier.champs_public.find { |c| c.type_champ == TypeDeChamp.type_champs.fetch(:text) } }
|
2022-05-20 10:19:09 +02:00
|
|
|
|
2023-01-26 17:58:41 +01:00
|
|
|
let(:rebased_number_champ) { dossier.champs_public.find { |c| c.type_champ == TypeDeChamp.type_champs.fetch(:integer_number) } }
|
|
|
|
|
2022-11-16 12:46:33 +01:00
|
|
|
let(:datetime_type_de_champ) { procedure.active_revision.types_de_champ_public.find { |tdc| tdc.type_champ == TypeDeChamp.type_champs.fetch(:datetime) } }
|
2022-11-10 22:21:14 +01:00
|
|
|
let(:datetime_champ) { dossier.champs_public.find { |c| c.type_champ == TypeDeChamp.type_champs.fetch(:datetime) } }
|
|
|
|
let(:rebased_datetime_champ) { dossier.champs_public.find { |c| c.type_champ == TypeDeChamp.type_champs.fetch(:date) } }
|
2022-05-20 10:19:09 +02:00
|
|
|
|
2022-11-16 12:46:33 +01:00
|
|
|
let(:repetition_type_de_champ) { procedure.active_revision.types_de_champ_public.find { |tdc| tdc.type_champ == TypeDeChamp.type_champs.fetch(:repetition) } }
|
2022-05-20 10:19:09 +02:00
|
|
|
let(:repetition_text_type_de_champ) { procedure.active_revision.children_of(repetition_type_de_champ).find { |tdc| tdc.type_champ == TypeDeChamp.type_champs.fetch(:text) } }
|
2022-11-10 22:21:14 +01:00
|
|
|
let(:repetition_champ) { dossier.champs_public.find { |c| c.type_champ == TypeDeChamp.type_champs.fetch(:repetition) } }
|
|
|
|
let(:rebased_repetition_champ) { dossier.champs_public.find { |c| c.type_champ == TypeDeChamp.type_champs.fetch(:repetition) } }
|
2022-05-20 10:19:09 +02:00
|
|
|
|
|
|
|
before do
|
|
|
|
procedure.publish!
|
|
|
|
procedure.draft_revision.add_type_de_champ({
|
|
|
|
type_champ: TypeDeChamp.type_champs.fetch(:text),
|
|
|
|
libelle: "Un champ text"
|
|
|
|
})
|
2022-05-25 09:40:02 +02:00
|
|
|
procedure.draft_revision.find_and_ensure_exclusive_use(text_type_de_champ).update(mandatory: false, libelle: "nouveau libelle")
|
|
|
|
procedure.draft_revision.find_and_ensure_exclusive_use(datetime_type_de_champ).update(type_champ: TypeDeChamp.type_champs.fetch(:date))
|
|
|
|
procedure.draft_revision.find_and_ensure_exclusive_use(repetition_text_type_de_champ).update(libelle: "nouveau libelle dans une repetition")
|
2022-05-20 10:19:09 +02:00
|
|
|
procedure.draft_revision.add_type_de_champ({
|
|
|
|
type_champ: TypeDeChamp.type_champs.fetch(:checkbox),
|
|
|
|
libelle: "oui ou non",
|
2022-07-02 16:20:42 +02:00
|
|
|
parent_stable_id: repetition_type_de_champ.stable_id
|
2022-05-20 10:19:09 +02:00
|
|
|
})
|
|
|
|
procedure.draft_revision.remove_type_de_champ(yes_no_type_de_champ.stable_id)
|
|
|
|
|
2023-01-12 17:42:02 +01:00
|
|
|
datetime_champ.update(value: Time.zone.now.to_s)
|
2022-05-20 10:19:09 +02:00
|
|
|
text_champ.update(value: 'bonjour')
|
|
|
|
# Add two rows then remove previous to last row in order to create a "hole" in the sequence
|
|
|
|
repetition_champ.add_row(repetition_champ.dossier.revision)
|
|
|
|
repetition_champ.add_row(repetition_champ.dossier.revision)
|
2022-12-16 15:07:26 +01:00
|
|
|
repetition_champ.champs.where(row_id: repetition_champ.rows[-2].first.row_id).destroy_all
|
2022-05-20 10:19:09 +02:00
|
|
|
repetition_champ.reload
|
|
|
|
end
|
|
|
|
|
|
|
|
it "updates the brouillon champs with the latest revision changes" do
|
|
|
|
revision_id = dossier.revision_id
|
|
|
|
libelle = text_type_de_champ.libelle
|
|
|
|
|
|
|
|
expect(dossier.revision).to eq(procedure.published_revision)
|
2023-01-26 17:58:41 +01:00
|
|
|
expect(dossier.champs_public.size).to eq(5)
|
2022-05-20 10:19:09 +02:00
|
|
|
expect(repetition_champ.rows.size).to eq(2)
|
|
|
|
expect(repetition_champ.rows[0].size).to eq(1)
|
|
|
|
expect(repetition_champ.rows[1].size).to eq(1)
|
|
|
|
|
|
|
|
procedure.publish_revision!
|
|
|
|
perform_enqueued_jobs
|
|
|
|
procedure.reload
|
|
|
|
dossier.reload
|
|
|
|
|
|
|
|
expect(procedure.revisions.size).to eq(3)
|
|
|
|
expect(dossier.revision).to eq(procedure.published_revision)
|
2023-01-26 17:58:41 +01:00
|
|
|
expect(dossier.champs_public.size).to eq(5)
|
2022-05-20 10:19:09 +02:00
|
|
|
expect(rebased_text_champ.value).to eq(text_champ.value)
|
|
|
|
expect(rebased_text_champ.type_de_champ_id).not_to eq(text_champ.type_de_champ_id)
|
|
|
|
expect(rebased_datetime_champ.type_champ).to eq(TypeDeChamp.type_champs.fetch(:date))
|
|
|
|
expect(rebased_datetime_champ.value).to be_nil
|
|
|
|
expect(rebased_repetition_champ.rows.size).to eq(2)
|
|
|
|
expect(rebased_repetition_champ.rows[0].size).to eq(2)
|
|
|
|
expect(rebased_repetition_champ.rows[1].size).to eq(2)
|
|
|
|
expect(rebased_text_champ.rebased_at).not_to be_nil
|
|
|
|
expect(rebased_datetime_champ.rebased_at).not_to be_nil
|
2023-01-26 17:58:41 +01:00
|
|
|
expect(rebased_number_champ.rebased_at).to be_nil
|
2022-05-20 10:19:09 +02:00
|
|
|
end
|
|
|
|
end
|
2022-05-20 11:55:20 +02:00
|
|
|
|
|
|
|
context 'small grained' do
|
|
|
|
subject do
|
|
|
|
procedure.publish_revision!
|
|
|
|
perform_enqueued_jobs
|
|
|
|
|
|
|
|
dossier.reload
|
|
|
|
end
|
|
|
|
|
2022-05-23 11:23:14 +02:00
|
|
|
context 'with a procedure with a dropdown tdc' do
|
|
|
|
let!(:procedure) do
|
|
|
|
create(:procedure).tap do |p|
|
2023-01-06 12:57:15 +01:00
|
|
|
p.draft_revision.add_type_de_champ(type_champ: :drop_down_list, libelle: 'l1', drop_down_list_value: "option\nv1\n")
|
2022-05-23 11:23:14 +02:00
|
|
|
p.publish!
|
|
|
|
end
|
|
|
|
end
|
|
|
|
let!(:dossier) { create(:dossier, procedure: procedure) }
|
|
|
|
|
2023-01-06 12:57:15 +01:00
|
|
|
context 'when a dropdown option is added' do
|
2022-05-23 11:23:14 +02:00
|
|
|
before do
|
2022-11-10 22:21:14 +01:00
|
|
|
dossier.champs_public.first.update(value: 'v1')
|
2022-05-23 11:23:14 +02:00
|
|
|
|
|
|
|
stable_id = procedure.draft_revision.types_de_champ.find_by(libelle: 'l1')
|
2022-05-25 09:40:02 +02:00
|
|
|
tdc_to_update = procedure.draft_revision.find_and_ensure_exclusive_use(stable_id)
|
2023-01-06 12:57:15 +01:00
|
|
|
tdc_to_update.update(drop_down_list_value: "option\nupdated\nv1")
|
|
|
|
end
|
|
|
|
|
|
|
|
it { expect { subject }.not_to change { dossier.champs_public.first.value } }
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when a dropdown option is removed' do
|
|
|
|
before do
|
|
|
|
dossier.champs_public.first.update(value: 'v1')
|
|
|
|
|
|
|
|
stable_id = procedure.draft_revision.types_de_champ.find_by(libelle: 'l1')
|
|
|
|
tdc_to_update = procedure.draft_revision.find_and_ensure_exclusive_use(stable_id)
|
|
|
|
tdc_to_update.update(drop_down_list_value: "option\nupdated")
|
2022-05-23 11:23:14 +02:00
|
|
|
end
|
|
|
|
|
2022-11-10 22:21:14 +01:00
|
|
|
it { expect { subject }.to change { dossier.champs_public.first.value }.from('v1').to(nil) }
|
2022-05-23 11:23:14 +02:00
|
|
|
end
|
2023-01-06 12:57:15 +01:00
|
|
|
|
|
|
|
context 'when a dropdown unused option is removed' do
|
|
|
|
before do
|
|
|
|
dossier.champs_public.first.update(value: 'v1')
|
|
|
|
|
|
|
|
stable_id = procedure.draft_revision.types_de_champ.find_by(libelle: 'l1')
|
|
|
|
tdc_to_update = procedure.draft_revision.find_and_ensure_exclusive_use(stable_id)
|
|
|
|
tdc_to_update.update(drop_down_list_value: "v1\nupdated")
|
|
|
|
end
|
|
|
|
|
|
|
|
it { expect { subject }.not_to change { dossier.champs_public.first.value } }
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'with a procedure with a multiple dropdown tdc' do
|
|
|
|
let!(:procedure) do
|
|
|
|
create(:procedure).tap do |p|
|
|
|
|
p.draft_revision.add_type_de_champ(type_champ: :multiple_drop_down_list, libelle: 'l1', drop_down_list_value: "option\nv1\n")
|
|
|
|
p.publish!
|
|
|
|
end
|
|
|
|
end
|
|
|
|
let!(:dossier) { create(:dossier, procedure: procedure) }
|
|
|
|
|
|
|
|
context 'when a dropdown option is added' do
|
|
|
|
before do
|
|
|
|
dossier.champs_public.first.update(value: '["v1"]')
|
|
|
|
|
|
|
|
stable_id = procedure.draft_revision.types_de_champ.find_by(libelle: 'l1')
|
|
|
|
tdc_to_update = procedure.draft_revision.find_and_ensure_exclusive_use(stable_id)
|
|
|
|
tdc_to_update.update(drop_down_list_value: "option\nupdated\nv1")
|
|
|
|
end
|
|
|
|
|
|
|
|
it { expect { subject }.not_to change { dossier.champs_public.first.value } }
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when a dropdown option is removed' do
|
|
|
|
before do
|
|
|
|
dossier.champs_public.first.update(value: '["v1", "option"]')
|
|
|
|
|
|
|
|
stable_id = procedure.draft_revision.types_de_champ.find_by(libelle: 'l1')
|
|
|
|
tdc_to_update = procedure.draft_revision.find_and_ensure_exclusive_use(stable_id)
|
|
|
|
tdc_to_update.update(drop_down_list_value: "option\nupdated")
|
|
|
|
end
|
|
|
|
|
|
|
|
it { expect { subject }.to change { dossier.champs_public.first.value }.from('["v1", "option"]').to('["option"]') }
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when a dropdown unused option is removed' do
|
|
|
|
before do
|
|
|
|
dossier.champs_public.first.update(value: '["v1"]')
|
|
|
|
|
|
|
|
stable_id = procedure.draft_revision.types_de_champ.find_by(libelle: 'l1')
|
|
|
|
tdc_to_update = procedure.draft_revision.find_and_ensure_exclusive_use(stable_id)
|
|
|
|
tdc_to_update.update(drop_down_list_value: "v1\nupdated")
|
|
|
|
end
|
|
|
|
|
|
|
|
it { expect { subject }.not_to change { dossier.champs_public.first.value } }
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'with a procedure with a linked dropdown tdc' do
|
|
|
|
let!(:procedure) do
|
|
|
|
create(:procedure).tap do |p|
|
|
|
|
p.draft_revision.add_type_de_champ(type_champ: :linked_drop_down_list, libelle: 'l1', drop_down_list_value: "--titre1--\noption\nv1\n--titre2--\noption2\nv2\n")
|
|
|
|
p.publish!
|
|
|
|
end
|
|
|
|
end
|
|
|
|
let!(:dossier) { create(:dossier, procedure: procedure) }
|
|
|
|
|
|
|
|
context 'when a dropdown option is added' do
|
|
|
|
before do
|
|
|
|
dossier.champs_public.first.update(value: '["v1",""]')
|
|
|
|
|
|
|
|
stable_id = procedure.draft_revision.types_de_champ.find_by(libelle: 'l1')
|
|
|
|
tdc_to_update = procedure.draft_revision.find_and_ensure_exclusive_use(stable_id)
|
|
|
|
tdc_to_update.update(drop_down_list_value: "--titre1--\noption\nv1\nupdated\n--titre2--\noption2\nv2\n")
|
|
|
|
end
|
|
|
|
|
|
|
|
it { expect { subject }.not_to change { dossier.champs_public.first.value } }
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when a dropdown option is removed' do
|
|
|
|
before do
|
|
|
|
dossier.champs_public.first.update(value: '["v1","option2"]')
|
|
|
|
|
|
|
|
stable_id = procedure.draft_revision.types_de_champ.find_by(libelle: 'l1')
|
|
|
|
tdc_to_update = procedure.draft_revision.find_and_ensure_exclusive_use(stable_id)
|
|
|
|
tdc_to_update.update(drop_down_list_value: "--titre1--\noption\nupdated\n--titre2--\noption2\nv2\n")
|
|
|
|
end
|
|
|
|
|
|
|
|
it { expect { subject }.to change { dossier.champs_public.first.value }.from('["v1","option2"]').to(nil) }
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when a dropdown unused option is removed' do
|
|
|
|
before do
|
|
|
|
dossier.champs_public.first.update(value: '["v1",""]')
|
|
|
|
|
|
|
|
stable_id = procedure.draft_revision.types_de_champ.find_by(libelle: 'l1')
|
|
|
|
tdc_to_update = procedure.draft_revision.find_and_ensure_exclusive_use(stable_id)
|
|
|
|
tdc_to_update.update(drop_down_list_value: "--titre1--\nv1\nupdated\n--titre2--\noption2\nv2\n")
|
|
|
|
end
|
|
|
|
|
|
|
|
it { expect { subject }.not_to change { dossier.champs_public.first.value } }
|
|
|
|
end
|
2022-05-23 11:23:14 +02:00
|
|
|
end
|
|
|
|
|
|
|
|
context 'with a procedure with a carte tdc' do
|
|
|
|
let!(:procedure) do
|
|
|
|
create(:procedure).tap do |p|
|
|
|
|
champ = p.draft_revision.add_type_de_champ(type_champ: :carte, libelle: 'l1', cadastres: true)
|
|
|
|
p.publish!
|
|
|
|
end
|
|
|
|
end
|
|
|
|
let!(:dossier) { create(:dossier, procedure: procedure) }
|
|
|
|
|
|
|
|
context 'and the cadastre are removed' do
|
|
|
|
before do
|
2022-11-10 22:21:14 +01:00
|
|
|
dossier.champs_public.first.update(value: 'v1', geo_areas: [create(:geo_area, :cadastre)])
|
2022-05-23 11:23:14 +02:00
|
|
|
|
|
|
|
stable_id = procedure.draft_revision.types_de_champ.find_by(libelle: 'l1')
|
2022-05-25 09:40:02 +02:00
|
|
|
tdc_to_update = procedure.draft_revision.find_and_ensure_exclusive_use(stable_id)
|
2022-05-23 11:23:14 +02:00
|
|
|
tdc_to_update.update(cadastres: false)
|
|
|
|
end
|
|
|
|
|
2022-11-10 22:21:14 +01:00
|
|
|
it { expect { subject }.to change { dossier.champs_public.first.cadastres.count }.from(1).to(0) }
|
2022-05-23 11:23:14 +02:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2022-05-20 11:55:20 +02:00
|
|
|
context 'with a procedure with 2 tdc' do
|
|
|
|
let!(:procedure) do
|
|
|
|
create(:procedure).tap do |p|
|
|
|
|
p.draft_revision.add_type_de_champ(type_champ: :text, libelle: 'l1')
|
|
|
|
p.draft_revision.add_type_de_champ(type_champ: :text, libelle: 'l2')
|
|
|
|
p.publish!
|
|
|
|
end
|
|
|
|
end
|
|
|
|
let!(:dossier) { create(:dossier, procedure: procedure) }
|
|
|
|
|
2022-11-10 22:21:14 +01:00
|
|
|
def champ_libelles = dossier.champs_public.map(&:libelle)
|
2022-05-20 11:55:20 +02:00
|
|
|
|
|
|
|
context 'when a tdc is added in the middle' do
|
|
|
|
before do
|
|
|
|
added_tdc = procedure.draft_revision.add_type_de_champ(type_champ: :text, libelle: 'l3')
|
|
|
|
procedure.draft_revision.move_type_de_champ(added_tdc.stable_id, 1)
|
|
|
|
end
|
|
|
|
|
|
|
|
it { expect { subject }.to change { champ_libelles }.from(['l1', 'l2']).to(['l1', 'l3', 'l2']) }
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when the first tdc is removed' do
|
|
|
|
before do
|
2022-05-23 11:23:14 +02:00
|
|
|
stable_id = procedure.draft_revision.types_de_champ.find_by(libelle: 'l1')
|
2022-05-25 09:40:02 +02:00
|
|
|
tdc_to_remove = procedure.draft_revision.find_and_ensure_exclusive_use(stable_id)
|
2022-05-20 11:55:20 +02:00
|
|
|
procedure.draft_revision.remove_type_de_champ(tdc_to_remove.stable_id)
|
|
|
|
end
|
|
|
|
|
|
|
|
it { expect { subject }.to change { champ_libelles }.from(['l1', 'l2']).to(['l2']) }
|
|
|
|
end
|
|
|
|
|
2022-05-23 11:23:14 +02:00
|
|
|
context 'when the second tdc is moved at the first place' do
|
|
|
|
before do
|
|
|
|
stable_id = procedure.draft_revision.types_de_champ.find_by(libelle: 'l2')
|
|
|
|
procedure.draft_revision.move_type_de_champ(stable_id, 0)
|
|
|
|
end
|
|
|
|
|
|
|
|
it { expect { subject }.to change { champ_libelles }.from(['l1', 'l2']).to(['l2', 'l1']) }
|
|
|
|
end
|
|
|
|
|
2022-05-20 11:55:20 +02:00
|
|
|
context 'when the first tdc libelle is updated' do
|
|
|
|
before do
|
2022-05-23 11:23:14 +02:00
|
|
|
stable_id = procedure.draft_revision.types_de_champ.find_by(libelle: 'l1')
|
2022-05-25 09:40:02 +02:00
|
|
|
tdc_to_update = procedure.draft_revision.find_and_ensure_exclusive_use(stable_id)
|
2022-05-20 11:55:20 +02:00
|
|
|
tdc_to_update.update(libelle: 'l1 updated')
|
|
|
|
end
|
|
|
|
|
|
|
|
it { expect { subject }.to change { champ_libelles }.from(['l1', 'l2']).to(['l1 updated', 'l2']) }
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when the first tdc type is updated' do
|
2022-11-10 22:21:14 +01:00
|
|
|
def first_champ = dossier.champs_public.first
|
2022-05-23 11:23:14 +02:00
|
|
|
|
2022-05-20 11:55:20 +02:00
|
|
|
before do
|
2022-05-23 11:23:14 +02:00
|
|
|
first_champ.update(value: 'v1', external_id: '123', geo_areas: [create(:geo_area)])
|
|
|
|
first_champ.update(data: { a: 1 })
|
|
|
|
|
|
|
|
first_champ.piece_justificative_file.attach(
|
|
|
|
io: StringIO.new("toto"),
|
|
|
|
filename: "toto.txt",
|
|
|
|
content_type: "text/plain",
|
|
|
|
# we don't want to run virus scanner on this file
|
|
|
|
metadata: { virus_scan_result: ActiveStorage::VirusScanner::SAFE }
|
|
|
|
)
|
|
|
|
|
2022-05-24 15:14:14 +02:00
|
|
|
first_champ.update_column('updated_at', Time.zone.parse('01/01/1901'))
|
|
|
|
|
2022-05-23 11:23:14 +02:00
|
|
|
stable_id = procedure.draft_revision.types_de_champ.find_by(libelle: 'l1')
|
2022-05-25 09:40:02 +02:00
|
|
|
tdc_to_update = procedure.draft_revision.find_and_ensure_exclusive_use(stable_id)
|
2022-05-20 11:55:20 +02:00
|
|
|
tdc_to_update.update(type_champ: :integer_number)
|
|
|
|
end
|
|
|
|
|
2022-11-10 22:21:14 +01:00
|
|
|
it { expect { subject }.to change { dossier.champs_public.map(&:type_champ) }.from(['text', 'text']).to(['integer_number', 'text']) }
|
2022-05-23 11:23:14 +02:00
|
|
|
it { expect { subject }.to change { first_champ.class }.from(Champs::TextChamp).to(Champs::IntegerNumberChamp) }
|
|
|
|
it { expect { subject }.to change { first_champ.value }.from('v1').to(nil) }
|
|
|
|
it { expect { subject }.to change { first_champ.external_id }.from('123').to(nil) }
|
|
|
|
it { expect { subject }.to change { first_champ.data }.from({ 'a' => 1 }).to(nil) }
|
|
|
|
it { expect { subject }.to change { first_champ.geo_areas.count }.from(1).to(0) }
|
|
|
|
it { expect { subject }.to change { first_champ.piece_justificative_file.attached? }.from(true).to(false) }
|
2022-12-14 09:17:09 +01:00
|
|
|
it { expect { subject }.not_to change { first_champ.updated_at }.from(Time.zone.parse('01/01/1901')) }
|
2022-05-20 11:55:20 +02:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'with a procedure with a repetition' do
|
|
|
|
let!(:procedure) do
|
|
|
|
create(:procedure).tap do |p|
|
2022-05-23 11:23:14 +02:00
|
|
|
repetition = p.draft_revision.add_type_de_champ(type_champ: :repetition, libelle: 'p1')
|
2022-07-02 16:20:42 +02:00
|
|
|
p.draft_revision.add_type_de_champ(type_champ: :text, libelle: 'c1', parent_stable_id: repetition.stable_id)
|
|
|
|
p.draft_revision.add_type_de_champ(type_champ: :text, libelle: 'c2', parent_stable_id: repetition.stable_id)
|
2022-05-20 11:55:20 +02:00
|
|
|
p.publish!
|
|
|
|
end
|
|
|
|
end
|
|
|
|
let!(:dossier) { create(:dossier, procedure: procedure) }
|
|
|
|
let(:repetition_stable_id) { procedure.draft_revision.types_de_champ.find(&:repetition?) }
|
|
|
|
|
2022-11-10 22:21:14 +01:00
|
|
|
def child_libelles = dossier.champs_public.first.champs.map(&:libelle)
|
2022-05-20 11:55:20 +02:00
|
|
|
|
|
|
|
context 'when a child tdc is added in the middle' do
|
|
|
|
before do
|
2022-07-02 16:20:42 +02:00
|
|
|
added_tdc = procedure.draft_revision.add_type_de_champ(type_champ: :text, libelle: 'c3', parent_stable_id: repetition_stable_id)
|
2022-05-20 11:55:20 +02:00
|
|
|
procedure.draft_revision.move_type_de_champ(added_tdc.stable_id, 1)
|
|
|
|
end
|
|
|
|
|
|
|
|
it { expect { subject }.to change { child_libelles }.from(['c1', 'c2']).to(['c1', 'c3', 'c2']) }
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when the first child tdc is removed' do
|
|
|
|
before do
|
|
|
|
tdc_to_remove = procedure.draft_revision.types_de_champ.find_by(libelle: 'c1')
|
|
|
|
procedure.draft_revision.remove_type_de_champ(tdc_to_remove.stable_id)
|
|
|
|
end
|
|
|
|
|
|
|
|
it { expect { subject }.to change { child_libelles }.from(['c1', 'c2']).to(['c2']) }
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when the first child libelle tdc is updated' do
|
|
|
|
before do
|
|
|
|
stable_id = procedure.draft_revision.types_de_champ.find_by(libelle: 'c1')
|
2022-05-25 09:40:02 +02:00
|
|
|
tdc_to_update = procedure.draft_revision.find_and_ensure_exclusive_use(stable_id)
|
2022-05-20 11:55:20 +02:00
|
|
|
tdc_to_update.update(libelle: 'c1 updated')
|
|
|
|
end
|
|
|
|
|
|
|
|
it { expect { subject }.to change { child_libelles }.from(['c1', 'c2']).to(['c1 updated', 'c2']) }
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when the first child tdc type is updated' do
|
|
|
|
before do
|
|
|
|
stable_id = procedure.draft_revision.types_de_champ.find_by(libelle: 'c1')
|
2022-05-25 09:40:02 +02:00
|
|
|
tdc_to_update = procedure.draft_revision.find_and_ensure_exclusive_use(stable_id)
|
2022-05-20 11:55:20 +02:00
|
|
|
tdc_to_update.update(type_champ: :integer_number)
|
|
|
|
end
|
|
|
|
|
2022-11-10 22:21:14 +01:00
|
|
|
it { expect { subject }.to change { dossier.champs_public.first.champs.map(&:type_champ) }.from(['text', 'text']).to(['integer_number', 'text']) }
|
2022-05-20 11:55:20 +02:00
|
|
|
end
|
2022-05-23 11:23:14 +02:00
|
|
|
|
|
|
|
context 'when the parents type is changed' do
|
|
|
|
before do
|
|
|
|
stable_id = procedure.draft_revision.types_de_champ.find_by(libelle: 'p1')
|
2022-05-25 09:40:02 +02:00
|
|
|
parent = procedure.draft_revision.find_and_ensure_exclusive_use(stable_id)
|
2022-05-23 11:23:14 +02:00
|
|
|
parent.update(type_champ: :integer_number)
|
|
|
|
end
|
|
|
|
|
2022-11-10 22:21:14 +01:00
|
|
|
it { expect { subject }.to change { dossier.champs_public.first.champs.count }.from(2).to(0) }
|
2022-05-23 11:23:14 +02:00
|
|
|
it { expect { subject }.to change { Champ.count }.from(3).to(1) }
|
|
|
|
end
|
2022-05-20 11:55:20 +02:00
|
|
|
end
|
|
|
|
end
|
2022-05-20 10:19:09 +02:00
|
|
|
end
|