
require 'rails_helper'

RSpec.describe Base::FonteDeRecursos, type: :model do

	it{ is_expected.to belong_to(:modulo).required }

	it{ is_expected.to have_many(:orcamento_da_receita).dependent(:destroy) }
	it{ is_expected.to have_many(:orcamentos_da_despesa).dependent(:restrict_with_exception) }
	it{ is_expected.to have_many(:elementos_de_despesa_por_subacao).through(:orcamentos_da_despesa) }
	it{ is_expected.to have_many(:subacoes).through(:elementos_de_despesa_por_subacao) }
	it{ is_expected.to have_many(:transferencias_de_recursos).dependent(:restrict_with_exception) }

	it{ is_expected.to validate_presence_of :codigo }
	it{ is_expected.to validate_presence_of :descricao }
	it{ is_expected.to validate_presence_of :modulo_id }
	it{ is_expected.to validate_presence_of :modulo_type }

	# it{ is_expected.to validate_uniqueness_of(:codigo).scoped_to(:modulo_id, :modulo_type) }
	# it{ is_expected.to validate_uniqueness_of(:descricao).scoped_to(:modulo_id, :modulo_type) }

	it { is_expected.to validate_numericality_of(:percentual_minimo_de_destinacao).is_greater_than_or_equal_to(0).allow_nil }
	it { is_expected.to validate_numericality_of(:percentual_minimo_de_destinacao).is_less_than(100).allow_nil }

	# describe "#percentual_minimo_de_destinacao" do
	#
	# 	it "não permite salvar percentual de saude menor que 15%" do
	# 		fonte_de_recursos = FactoryBot.create(:saude)
	# 		fonte_de_recursos.percentual_minimo_de_destinacao = 10
	# 		fonte_de_recursos.save
	# 		expect( fonte_de_recursos.errors[:percentual_minimo_de_destinacao] ).to include 'O percentual para sáude não pode ser menor que 15%'
	# 	end
	#
	#
	# 	it "não permite salvar percentual de educação menor que 25%" do
	# 		fonte_de_recursos = FactoryBot.create(:educacao)
	# 		fonte_de_recursos.percentual_minimo_de_destinacao = 15
	# 		fonte_de_recursos.save
	# 		expect( fonte_de_recursos.errors[:percentual_minimo_de_destinacao] ).to include 'O percentual para educação não pode ser menor que 25%'
	# 	end
	#
	# end

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

	it "não permite alterações no atributo modulo_type" do
		fonte_de_recursos = FactoryBot.create( :alienacao_de_bens )
		fonte_de_recursos.modulo_type = 'Ppa::Ppa'
		fonte_de_recursos.save
		expect( fonte_de_recursos.errors[:modulo_type] ).to include "não pode ser alterado"
	end

	it 'total_da_despesa_por_grupo_de_natureza_da_despesa_tipo_de_orcamento_e_uo' do
		orcamento_da_despesa = FactoryBot.create( :orcamento_da_despesa_saude)
		tipo_de_orcamento = orcamento_da_despesa.elemento_de_despesa_por_subacao.subacao.tipo_de_orcamento
		fonte = orcamento_da_despesa.fonte_de_recursos
		grupo = orcamento_da_despesa.elemento_de_despesa_por_subacao.elemento_de_despesa.modalidade_de_aplicacao.grupo_de_natureza_da_despesa
		unidade_orcamentaria = orcamento_da_despesa.elemento_de_despesa_por_subacao.subacao.unidade_orcamentaria
		expect( fonte.total_da_despesa_por_grupo_de_natureza_da_despesa_tipo_de_orcamento_e_uo(grupo.id,tipo_de_orcamento.id,unidade_orcamentaria.id) ).to eq 12345.67
	end

	it 'valor_previsto_por_unidade_orcamentaria' do
		orcamento_saude = FactoryBot.create( :orcamento_da_despesa_saude )
		expect(orcamento_saude.fonte_de_recursos.valor_previsto_por_unidade_orcamentaria(orcamento_saude.elemento_de_despesa_por_subacao.subacao.unidade_orcamentaria)).to eq 12345.67
	end

	describe '#total_da_despesa' do
		before(:each) do
			@orcamento_da_despesa_fiscal = FactoryBot.create :orcamento_da_despesa_fundo_especial_saude, valor: 100
			@orcamento_da_despesa_social = FactoryBot.create :orcamento_da_despesa_educacao, valor: 50

			@fonte_de_recursos = @orcamento_da_despesa_fiscal.fonte_de_recursos
		end
		context 'quando passado um id de tipo de orçamento' do
			context 'fiscal' do
				it 'retorna o total da despesa fiscal da fonte' do
					tipo_fiscal = Base::TipoDeOrcamento.find_by_numero(1)
					expect(@fonte_de_recursos.total_da_despesa(tipo_fiscal.id)).to eq 100
				end
			end
			context 'social' do
				it 'retorna o total da despesa social da fonte' do
					tipo_social = Base::TipoDeOrcamento.find_by_numero(2)
					expect(@fonte_de_recursos.total_da_despesa(tipo_social.id)).to eq 50
				end
			end
		end
		context 'quando não é passado um id de tipo de orçamento' do
			it 'retorna o total da despesa da fonte' do
				expect(@fonte_de_recursos.total_da_despesa).to eq 150
			end
		end
	end

	describe 'métodos de fontes específicas: ' do
		before(:each) do
		  @orcamento = FactoryBot.create :orcamento_2017
			allow(Rails.env).to receive(:test?).and_return(false)
			@orcamento.cria_fontes_de_recursos
			allow(Rails.env).to receive(:test?).and_return(true)
		end
		describe '#recursos_ordinarios' do
			it 'retorna fonte de recurso ordinária do orçamento' do
				expect(@orcamento.fontes_de_recursos.recursos_ordinarios.codigo_completo).to eq "101"
			end
		end
		describe '#recursos_de_saude' do
			it 'retorna fonte de recurso de saúde do orçamento' do
				expect(@orcamento.fontes_de_recursos.recursos_de_saude.codigo_completo).to eq "103"
			end
		end
		describe '#recursos_de_educacao' do
			it 'retorna fonte de recurso de educação do orçamento' do
				expect(@orcamento.fontes_de_recursos.recursos_de_educacao.codigo_completo).to eq "102"
			end
		end
	end
end
