require 'rails_helper'

RSpec.describe Loa::Gestor, type: :model do
	it { is_expected.to belong_to(:unidade_gestora) }
	it { is_expected.to belong_to(:agente_publico_municipal).class_name("Base::AgentePublicoMunicipal") }
	it { is_expected.to delegate_method(:cpf_e_nome).to(:agente_publico_municipal) }
	it { is_expected.to delegate_method(:cpf).to(:agente_publico_municipal) }
	it { is_expected.to delegate_method(:nome).to(:agente_publico_municipal) }

	[:unidade_gestora_id, :agente_publico_municipal_id, :inicio_da_gestao].each do |campo|
		it { is_expected.to validate_presence_of campo }
	end

	describe '#apenas_um_gestor_ativo' do
		let(:gestor_atual) { FactoryBot.create(:loa_gestor, inicio_da_gestao: '2018-01-01', fim_da_gestao: nil) }
		context 'quando há gestores ativos' do
			it 'retorna erro' do
				gestor_atual
				gestor = Loa::Gestor.new(FactoryBot.attributes_for(:loa_gestor, inicio_da_gestao: '2018-01-01', fim_da_gestao: nil))
				gestor.save
				expect(gestor.errors[:fim_da_gestao]).to include("Essa unidade gestora já possui um gestor ativo")
			end
		end
		context 'quando não há gestores ativos' do
			it 'salva o gestor' do
				expect(gestor_atual).to be_persisted
			end
		end
		context 'ao atualizar gestor ativo' do
			it 'salva' do
				gestor = gestor_atual
				gestor.touch
				expect(gestor_atual).to be_persisted
			end
		end
	end

	describe '#coincidencia_de_periodos_de_gestao' do
		before do
			FactoryBot.create(:loa_gestor, inicio_da_gestao: '2017-03-01', fim_da_gestao: '2017-06-01')
		end
		context 'retorna erro' do
			it 'quando novo gestor tem período dentro de período já existente' do
				gestor = Loa::Gestor.new(FactoryBot.attributes_for(:loa_gestor, inicio_da_gestao: '2017-04-01', fim_da_gestao: '2017-05-01'))
				gestor.save
				expect(gestor.errors[:base]).to include("Esse período coincide com o de outro gestor")
			end
			it 'quando gestão inicia em período já existente mas termina fora' do
				gestor = Loa::Gestor.new(FactoryBot.attributes_for(:loa_gestor, inicio_da_gestao: '2017-05-01', fim_da_gestao: '2017-08-01'))
				gestor.save
				expect(gestor.errors[:base]).to include("Esse período coincide com o de outro gestor")
			end
			it 'quando gestão inicia fora de período já existente mas termina dentro' do
				gestor = Loa::Gestor.new(FactoryBot.attributes_for(:loa_gestor, inicio_da_gestao: '2017-01-01', fim_da_gestao: '2017-05-01'))
				gestor.save
				expect(gestor.errors[:base]).to include("Esse período coincide com o de outro gestor")
			end
		end
		context 'salva' do
			it 'quando novo período é antes de período já existente' do
				gestor = Loa::Gestor.new(FactoryBot.attributes_for(:loa_gestor, inicio_da_gestao: '2017-01-01', fim_da_gestao: '2017-02-01'))
				gestor.save
				expect(gestor).to be_persisted
			end
			it 'quando novo período é depois de período já existente' do
				gestor = Loa::Gestor.new(FactoryBot.attributes_for(:loa_gestor, inicio_da_gestao: '2017-07-01', fim_da_gestao: '2017-09-01'))
				gestor.save
				expect(gestor).to be_persisted
			end
		end
	end
end
