require 'rails_helper'

RSpec.describe Base::ModalidadeDeAplicacao, type: :model do
	it{ is_expected.to belong_to :grupo_de_natureza_da_despesa}

	it{ is_expected.to have_many(:elementos_de_despesa_por_subacao).through(:elementos_de_despesa) }
	it{ is_expected.to have_many(:orcamentos_da_despesa).through(:elementos_de_despesa_por_subacao) }

	it{ is_expected.to have_many :elementos_de_despesa }
	[:codigo, :descricao].each do |atributo|
		it{ is_expected.to validate_presence_of atributo }
		it{ is_expected.to validate_uniqueness_of(atributo).scoped_to :grupo_de_natureza_da_despesa_id }
	end

	describe "#save" do
		# context "quando código ou descrição não estão contigos no seed base de naturezas da despesa'" do
		# 	context "quando não é reserva de contingência" do
		# 		it "adiciona erros nos atributos" do
		# 			modalidade_de_aplicacao = Base::ModalidadeDeAplicacao.new( codigo: 'AA', descricao: 'qualquer uma' )
		# 			modalidade_de_aplicacao.save
		#
		# 			expect( modalidade_de_aplicacao.errors[:codigo] ).to include 'não existe modalidade de aplicação com esse código'
		# 			expect( modalidade_de_aplicacao.errors[:descricao] ).to include 'não existe modalidade de aplicação com essa descrição'
		# 		end
		# 	end
		#
		# 	context "quando é reserva de contingência" do
		# 		it "não adiciona erros ns atributos" do
		# 			modalidade_de_aplicacao = Base::ModalidadeDeAplicacao.new( codigo: '99990000', descricao: 'Reserva de Contingência' )
		# 			modalidade_de_aplicacao.save
		#
		# 			expect( modalidade_de_aplicacao.errors[:codigo] ).to_not include 'não existe modalidade de aplicação com esse código'
		# 			expect( modalidade_de_aplicacao.errors[:descricao] ).to_not include 'não existe modalidade de aplicação com essa descrição'
		# 		end
		# 	end
		# end

		context "quando código ou descrição estão contigos no seed base de naturezas da despesa'" do
			it "não adiciona erros nos atributos" do
				modalidade_de_aplicacao = FactoryBot.create(:aplicacoes_diretas)
				modalidade_de_aplicacao.save

				expect( modalidade_de_aplicacao.errors[:codigo] ).to_not include 'não existe modalidade de aplicação com esse código'
				expect( modalidade_de_aplicacao.errors[:descricao] ).to_not include 'não existe modalidade de aplicação com essa descrição'
			end
		end
	end

	describe "#reserva_de_contingencia?" do
		context "quando o código e nome forem 99990000 e Reserva de Contingência" do
			it "return true" do
				modalidade_de_aplicacao = Base::ModalidadeDeAplicacao.new( codigo: '99990000', descricao: 'Reserva de Contingência' )
				expect( modalidade_de_aplicacao ).to be_reserva_de_contingencia
			end
		end

		context "quando o código e nome não forem 99990000 e Reserva de Contingência" do
			it "retorna false" do
				modalidade_de_aplicacao = Base::ModalidadeDeAplicacao.new( codigo: '31000000', descricao: 'PESSOAL E ENCARGOS SOCIAIS' )
				expect( modalidade_de_aplicacao ).to_not be_reserva_de_contingencia
			end
		end
	end

	it 'valor_previsto_por_unidade_orcamentaria' do
		orcamento_da_despesa = Loa::OrcamentoDaDespesa.create( FactoryBot.attributes_for( :orcamento_da_despesa_educacao) )
		unidade_orcamentaria = orcamento_da_despesa.elemento_de_despesa_por_subacao.subacao.unidade_orcamentaria
		modalidade_de_aplicacao = orcamento_da_despesa.elemento_de_despesa_por_subacao.elemento_de_despesa.modalidade_de_aplicacao
		expect(modalidade_de_aplicacao.valor_previsto_por_unidade_orcamentaria(unidade_orcamentaria)).to eq 20
	end
end
