From 95a3f179760dff0f126de9ee2605bac02e6fd433 Mon Sep 17 00:00:00 2001 From: benoitqueyron <72251526+Benoit-MINT@users.noreply.github.com> Date: Thu, 21 Nov 2024 17:54:52 +0100 Subject: [PATCH] test: instructeurs_procedure_spec --- spec/factories/instructeurs_procedure.rb | 8 +++ spec/models/instructeur_spec.rb | 63 ++++++++++++++++++++++++ 2 files changed, 71 insertions(+) create mode 100644 spec/factories/instructeurs_procedure.rb diff --git a/spec/factories/instructeurs_procedure.rb b/spec/factories/instructeurs_procedure.rb new file mode 100644 index 000000000..e872fea74 --- /dev/null +++ b/spec/factories/instructeurs_procedure.rb @@ -0,0 +1,8 @@ +# frozen_string_literal: true + +FactoryBot.define do + factory :instructeurs_procedure do + association :instructeur + association :procedure + end +end diff --git a/spec/models/instructeur_spec.rb b/spec/models/instructeur_spec.rb index 5ac18c0df..bf4603322 100644 --- a/spec/models/instructeur_spec.rb +++ b/spec/models/instructeur_spec.rb @@ -862,6 +862,69 @@ describe Instructeur, type: :model do end end + describe '.ensure_instructeur_procedures_for' do + let(:instructeur) { create(:instructeur) } + let!(:procedures) { create_list(:procedure, 5, published_at: Time.current) } + + context 'when some procedures are missing for the instructeur' do + before do + create(:instructeurs_procedure, instructeur: instructeur, procedure: procedures.first, position: 0) + end + + it 'creates missing instructeurs_procedures with correct positions' do + expect { + instructeur.ensure_instructeur_procedures_for(procedures) + }.to change { InstructeursProcedure.count }.by(4) + + instructeur_procedures = InstructeursProcedure.where(instructeur: instructeur) + expect(instructeur_procedures.pluck(:procedure_id)).to match_array(procedures.map(&:id)) + expect(instructeur_procedures.pluck(:position)).to eq([0, 1, 2, 3, 4]) + end + end + + context 'when all procedures already exist for the instructeur' do + before do + procedures.each_with_index do |procedure, index| + create(:instructeurs_procedure, instructeur: instructeur, procedure: procedure, position: index + 1) + end + end + + it 'does not create any new instructeurs_procedures' do + expect { + instructeur.ensure_instructeur_procedures_for(procedures) + }.not_to change { InstructeursProcedure.count } + end + end + end + + describe '.update_instructeur_procedures_positions' do + let(:instructeur) { create(:instructeur) } + let!(:procedures) { create_list(:procedure, 5, published_at: Time.current) } + + before do + procedures.each_with_index do |procedure, index| + create(:instructeurs_procedure, instructeur: instructeur, procedure: procedure, position: index + 1) + end + end + + it 'updates the positions of the specified instructeurs_procedures' do + instructeur.update_instructeur_procedures_positions(procedures.map(&:id)) + + updated_positions = InstructeursProcedure + .where(instructeur:) + .order(:procedure_id) + .pluck(:procedure_id, :position) + + expect(updated_positions).to match_array([ + [procedures[0].id, 4], + [procedures[1].id, 3], + [procedures[2].id, 2], + [procedures[3].id, 1], + [procedures[4].id, 0] + ]) + end + end + private def assign(procedure_to_assign, instructeur_assigne: instructeur)