require 'rails_helper'

RSpec.describe Base::AgentePublicoMunicipal, type: :model do
	[:unidade_orcamentaria, :usuario, :pessoa].each do |campo|
		it { is_expected.to belong_to campo }
	end

	it { is_expected.to have_one(:ordenador_de_despesa).dependent(:restrict_with_exception) }

	it { is_expected.to have_many(:documentos_do_processo).class_name("Licitacao::DocumentoDoProcesso") }

	[:cpf, :nome, :identidade, :orgao_expedidor, :endereco_completo, :telefone, :data_de_nascimento, :estado_civil, :dependentes].each do |campo|
		it { is_expected.to delegate_method(campo).to(:pessoa) }
	end

	[:pessoa_id, :unidade_orcamentaria_id, :ingresso_sistema_publico_municipal, :tipo_relacao_servico_publico, :data_da_posse, :tipo_de_cargo, :numero_de_posse].each do |campo|
		it{ is_expected.to validate_presence_of campo }
	end

	it{ is_expected.to validate_uniqueness_of(:pessoa_id).scoped_to(:unidade_orcamentaria_id).with_message('Pessoa já cadastrada nesta unidade orçamentária.') }

	it { is_expected.to validate_length_of(:numero_de_posse).is_at_most(10) }
	it { is_expected.to validate_length_of(:matricula_municipal).is_at_most(10) }
	it { is_expected.to validate_length_of(:codigo_pis_pasep).is_at_most(11) }
	it { is_expected.to validate_length_of(:titulo_de_eleitor).is_at_most(15) }
	it { is_expected.to validate_length_of(:nome_da_mae).is_at_most(40) }
	it { is_expected.to validate_length_of(:nome_do_pai).is_at_most(40) }

	it { is_expected.to validate_numericality_of(:carga_horaria_semanal).is_greater_than(0).allow_nil }

	describe '#deve_ser_pessoa_fisica' do
		context 'quando pessoa é pessoa física' do
			it 'não retorna erro' do
				pessoa = FactoryBot.create :pessoa_fisica
				agente = FactoryBot.build( :agente_publico, pessoa: pessoa )
				agente.validate
				expect(agente.errors[:pessoa_id]).not_to include "deve ser uma pessoa física"
			end
		end
		context 'quando pessoa é pessoa juridica' do
			it 'retorna erro' do
				pessoa = FactoryBot.create :pessoa_juridica
				agente = FactoryBot.build( :agente_publico, pessoa: pessoa )
				agente.validate
				expect(agente.errors[:pessoa_id]).to include "deve ser uma pessoa física"
			end
		end
	end
end
