require 'rails_helper'

RSpec.describe Ppa::Orgao, type: :model do
	it{ is_expected.to belong_to :ppa }

	it{ is_expected.to have_many(:programas).dependent(:restrict_with_exception) }
	it{ is_expected.to have_many(:objetivos).dependent(:restrict_with_exception) }
	it{ is_expected.to have_many(:unidades_orcamentarias).dependent(:restrict_with_exception) }

	it{ is_expected.to validate_presence_of :ppa_id }
	it{ is_expected.to validate_presence_of :nome }
	it{ is_expected.to validate_presence_of :sigla }
	it{ is_expected.to validate_presence_of :codigo }

	it { is_expected.to validate_numericality_of(:codigo).is_greater_than(0) }
	it { is_expected.to validate_numericality_of(:codigo).is_less_than(100) }

	describe 'validate_presence_of :secretario' do
		context 'quando órgão participa da elaboração, valida presença' do
			subject { FactoryBot.build(:orgao_secretaria_da_fazenda, :ppa_2010, participa_da_elaboracao_do_ppa: true) }
			it{ is_expected.to validate_presence_of :secretario }
		end

		context 'quando órgão não participa da elaboração, não valida presença' do
			subject { FactoryBot.build(:orgao_secretaria_da_fazenda, :ppa_2010, participa_da_elaboracao_do_ppa: false) }
			it{ is_expected.not_to validate_presence_of :secretario }
		end
	end

	it{ is_expected.to validate_uniqueness_of( :nome ).scoped_to( :ppa_id ) }
	it{ is_expected.to validate_uniqueness_of( :sigla ).scoped_to( :ppa_id ) }
	it{ is_expected.to validate_uniqueness_of( :codigo ).scoped_to( :ppa_id ) }

	it { is_expected.to allow_value('01/01/2016').for(:data_da_legislacao) }
	it { is_expected.to allow_value('').for(:data_da_legislacao) }
	it { is_expected.to_not allow_value('00/').for(:data_da_legislacao) }

	it "não permite alterações no atributo ppa_id" do
		sefaz = FactoryBot.create( :orgao_secretaria_da_fazenda, :ppa_2014 )
		sefaz.ppa_id = sefaz.ppa_id + 1
		sefaz.save
		expect( sefaz.errors[:ppa_id] ).to include "não pode ser alterado"
	end

	describe "#codigo_e_nome" do
		it "retorna 'XX - NOME', onde XX é o código e NOME é o nome do orgão" do
			orgao = Ppa::Orgao.new( codigo: '01', nome: 'SEDUC' )
			expect( orgao.codigo_e_nome ).to eq '01 - SEDUC'
		end
	end

	describe "#sugestao_de_codigo" do
		context "quando não há orgãos cadastrados" do
			it "retorna 01" do
				orgao = Ppa::Orgao.new( FactoryBot.attributes_for(:orgao_secretaria_da_fazenda, :ppa_2014, codigo: '') )

				expect(orgao.codigo).to eq 1
			end
		end

		context "quando há orgãos cadastrados" do
			it "retorna o próximo código" do
				orgao_01 = Ppa::Orgao.new( FactoryBot.attributes_for(:orgao_secretaria_da_fazenda, :ppa_2014, codigo: '01') )
				orgao_01.save

				orgao_02 = Ppa::Orgao.new( FactoryBot.attributes_for(:orgao_gabinete_do_secretario, :ppa_2014, codigo: '') )

				expect(orgao_02.codigo).to eq 2
			end
		end

		context "quando há lacunas na sequência dos códigos" do
			it "retorna a primeira lacuna" do
				orgao_01 = Ppa::Orgao.new(FactoryBot.attributes_for(:orgao_secretaria_da_fazenda, :ppa_2014, codigo: ''))
				orgao_02 = FactoryBot.create(:orgao_gabinete_do_secretario, :ppa_2014, codigo: '02')

				expect(orgao_01.codigo).to eq 1
			end
		end
	end

	describe "#codigo_e_sigla" do
		it "retorna o código e a sigla no formato '01 - SIGLA'" do
			orgao = Ppa::Orgao.new( codigo: 2, sigla: 'DETRAN' )
			expect( orgao.codigo_e_sigla ).to eq '02 - DETRAN'
		end
	end

	describe "#codigo_com_zeros" do
		context "quando o código é menor que 10" do
			it "retorna o código com os zeros necessário à esquerda" do
				orgao = Ppa::Orgao.new
				orgao.codigo = 4
				expect( orgao.codigo_com_zeros ).to eq '04'
			end
		end

		context "quando o código é maior que 10" do
			it "retorna o código sem zeros à esquerda" do
				orgao = Ppa::Orgao.new
				orgao.codigo = 105
				expect( orgao.codigo_com_zeros ).to eq '105'
			end
		end
	end

	describe "#save" do
		context "ao salvar uma data da legislação que não exista" do
			it "retorna mensagem de data invalida" do
				ppa = Ppa::Ppa.new( data_da_legislacao: '32/01/2016' )
				ppa.save

				expect(ppa.errors[:data_da_legislacao]).to include 'não é uma data válida'
			end
		end
	end
end
