# frozen_string_literal: true

describe AssignTo, type: :model do
  describe '#procedure_presentation_or_default_and_errors' do
    let(:procedure) { create(:procedure) }
    let(:assign_to) { create(:assign_to, procedure: procedure, instructeur: create(:instructeur)) }

    let(:procedure_presentation_and_errors) { assign_to.procedure_presentation_or_default_and_errors }
    let(:procedure_presentation_or_default) { procedure_presentation_and_errors.first }
    let(:errors) { procedure_presentation_and_errors.second }

    context "without a preexisting procedure_presentation" do
      it 'creates a default pp' do
        expect(procedure_presentation_or_default).to be_persisted
        expect(procedure_presentation_or_default).to be_valid
        expect(errors).to be_nil
      end
    end

    context "with a preexisting procedure_presentation" do
      let!(:procedure_presentation) { ProcedurePresentation.create(assign_to:) }

      it 'returns the preexisting pp' do
        expect(procedure_presentation_or_default).to eq(procedure_presentation)
        expect(procedure_presentation_or_default).to be_valid
        expect(errors).to be_nil
      end
    end

    context "with an invalid procedure_presentation" do
      let!(:procedure_presentation) do
        pp = ProcedurePresentation.create(assign_to: assign_to)

        sql = <<-SQL.squish
          UPDATE procedure_presentations
          SET displayed_columns =  ARRAY['{\"procedure_id\":666}'::jsonb]
          WHERE id = #{pp.id} ;
        SQL

        pp.class.connection.execute(sql)

        assign_to.reload
      end

      it do
        expect(procedure_presentation_or_default).to be_persisted
        expect(procedure_presentation_or_default).to be_valid
        expect(errors.full_messages).to include(/unable to find procedure 666/)
        expect(assign_to.procedure_presentation).not_to be(procedure_presentation)
      end
    end
  end
end