describe Service, type: :model do
  describe 'validation' do
    let(:administrateur) { create(:administrateur) }
    let(:params) do
      {
        nom: 'service des jardins',
        organisme: 'mairie des iles',
        type_organisme: Service.type_organismes.fetch(:association),
        email: 'super@email.com',
        telephone: '012345678',
        horaires: 'du lundi au vendredi',
        adresse: '12 rue des schtroumpfs',
        administrateur_id: administrateur.id
      }
    end

    it { expect(Service.new(params).valid?).to be_truthy }

    it 'should forbid invalid phone numbers' do
      service = Service.create(params)
      invalid_phone_numbers = ["1", "NĂ©ant", "01 60 50 40 30 20"]

      invalid_phone_numbers.each do |tel|
        service.telephone = tel
        expect(service.valid?).to be_falsey
      end
    end

    it 'should accept no phone numbers' do
      service = Service.create(params)
      service.telephone = nil

      expect(service.valid?).to be_truthy
    end

    it 'should accept valid phone numbers' do
      service = Service.create(params)
      valid_phone_numbers = ["3646", "273115", "0160376983", "01 60 50 40 30 ", "+33160504030"]

      valid_phone_numbers.each do |tel|
        service.telephone = tel
        expect(service.valid?).to be_truthy
      end
    end

    context 'when a first service exists' do
      before { Service.create(params) }

      context 'checks uniqueness of administrateur, name couple' do
        it { expect(Service.create(params).valid?).to be_falsey }
      end
    end

    context 'of type_organisme' do
      it 'should be set' do
        expect(Service.new(params.except(:type_organisme)).valid?).to be_falsey
      end
    end

    context 'of nom' do
      it 'should be set' do
        expect(Service.new(params.except(:nom)).valid?).to be_falsey
      end
    end

    context 'of administrateur' do
      it 'should be set' do
        expect(Service.new(params.except(:administrateur_id)).valid?).to be_falsey
      end
    end

    context 'of type_organisme' do
      it 'should belong to the enum' do
        expect { Service.new(params.merge(type_organisme: 'choucroute')) }.to raise_error(ArgumentError)
      end
    end
  end
end