require 'rails_helper'

RSpec.describe Ppa::Objetivo, type: :model do
	it{ is_expected.to validate_presence_of :descricao}
	it{ is_expected.to validate_presence_of :programa_id}
	it{ is_expected.to validate_presence_of :codigo}
	it{ is_expected.to validate_presence_of :orgao_id}

	it{ is_expected.to belong_to :programa }
	it{ is_expected.to belong_to :orgao }

	it{ is_expected.to have_many( :metas ).dependent(:destroy) }
	it{ is_expected.to have_many( :iniciativas ).dependent(:restrict_with_exception) }

	it{ is_expected.to validate_uniqueness_of( :descricao ).scoped_to( :programa_id ) }
	it{ is_expected.to validate_uniqueness_of( :codigo ).scoped_to( :programa_id ) }

	it "não pode ter o ppa_id do programa diferente do ppa_id do seu orgão" do
		objetivo = FactoryBot.build( :ppa_objetivo )
		objetivo.programa.ppa_id = objetivo.programa.ppa_id + 1
		objetivo.orgao.ppa_id = objetivo.orgao.ppa_id + 2
		objetivo.save
		expect( objetivo.errors[:programa_id] ).to include "deve pertencer ao mesmo PPA do Orgão Responsável"
	end

	it "valida se metodo codigo_com_zeros esta retornando zeros necessarios" do
		objetivo = FactoryBot.create( :ppa_objetivo )
		expect( objetivo.codigo_com_zeros ).to eq( objetivo.codigo.digitos(3) )
	end

	describe "#sugestao_de_codigo" do
		context "quando não há programas cadastrados" do
			it "retorna 01" do
				programa_de_governo = Ppa::Objetivo.new( FactoryBot.attributes_for( :ppa_objetivo, codigo: '' ) )

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

		context "quando há programas cadastrados" do
			it "retorna o próximo código" do
				objetivo_0001 = FactoryBot.create( :ppa_objetivo, codigo: '001' )
				objetivo_0002 = Ppa::Objetivo.new( FactoryBot.attributes_for( :ppa_objetivo, codigo: '', programa: objetivo_0001.programa ) )

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

		context "quando há lacunas na sequência dos códigos" do
			it "retorna a primeira lacuna" do
				objetivo_0003 = FactoryBot.create( :ppa_objetivo, codigo: '003' )
				objetivo_0001 = Ppa::Objetivo.new( FactoryBot.attributes_for( :ppa_objetivo, codigo: '', programa: objetivo_0003.programa ) )

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