require 'rails_helper'

RSpec.describe Projecao::ReceitaDoCalculoDeProjecao, type: :model do
	it { is_expected.to belong_to :receita }
	it { is_expected.to belong_to(:calculo_de_projecao).required }

	it { is_expected.to have_one( :calculo_por_exercicio ).dependent( :destroy ) }

	it { is_expected.to validate_presence_of :receita_id }
	it { is_expected.to validate_presence_of :calculo_de_projecao_id }

	it "#valor_calculado_da_receita" do
		receita_do_calculo = FactoryBot.create(:projecao_receita_do_calculo_de_projecao)
		FactoryBot.create(:calculo_do_exercicio_de_2016, total: 500.0, receita_do_calculo_de_projecao_id: receita_do_calculo.id, tipo: 'realizado')
		expect(receita_do_calculo.valor_calculado_da_receita).to eq 500.0
	end

	it "#exercicio" do
		receita_do_calculo = FactoryBot.create(:projecao_receita_do_calculo_de_projecao)
		FactoryBot.create(:calculo_do_exercicio_de_2016, total: 500.0, exercicio: 2100, receita_do_calculo_de_projecao_id: receita_do_calculo.id, tipo: 'realizado')
		expect(receita_do_calculo.exercicio).to eq 2100
	end

	describe '#cria_calculo_por_exercicio_de_projecao' do
		describe 'quando o exercicio base do calculo de projeção' do
			context 'está presente nos exercicios base da projeção' do
				it 'cria calculo com valor baseado num calculo de exercicio realizado cujo pai é uma receita' do
					calculo_de_projecao = FactoryBot.create :calculo_de_projecao_para_2017, exercicio_base: 2015
					_indice = FactoryBot.create :igpm_aplicado_para_projecao_2017, calculo_de_projecao_id: calculo_de_projecao.id, percentual: 100
					receita = calculo_de_projecao.projecao_de_receita.receitas.new
					receita.save(validate: false)

					receita.calculo_por_exercicios.create(exercicio: 2015, total: 20.0, tipo: "realizado" )
					receita_do_calculo_de_projecao = Projecao::ReceitaDoCalculoDeProjecao.create(receita_id: receita.id, calculo_de_projecao_id: calculo_de_projecao.id)
					expect(receita_do_calculo_de_projecao.calculo_por_exercicio.total).to eq 40.0
				end
			end
			context 'é igual ao exercicio corrente da projeção' do
				it 'cria calculo com valor baseado num calculo de exercicio cujo pai é uma receita e cujo tipo é revisado' do
					calculo_de_projecao = FactoryBot.create :calculo_de_projecao_para_2017, exercicio_base: 2016
					_indice = FactoryBot.create :igpm_aplicado_para_projecao_2017, calculo_de_projecao_id: calculo_de_projecao.id, percentual: 100
					receita = calculo_de_projecao.projecao_de_receita.receitas.new
					receita.save(validate: false)

					receita.calculo_por_exercicios.create(exercicio: 2016, total: 100.0, tipo: "orcado")
					receita.calculo_por_exercicios.create(exercicio: 2016, total: 200.0, tipo: "revisado")
					receita_do_calculo_de_projecao = Projecao::ReceitaDoCalculoDeProjecao.create( receita_id: receita.id, calculo_de_projecao_id: calculo_de_projecao.id )
					expect(receita_do_calculo_de_projecao.calculo_por_exercicio.total).to eq 400.0
				end
			end
			context 'está presente nos exercicios correntes da projeção' do
				it 'cria calculo com valor baseado num calculo de exercicio cujo pai é uma receita do calculo de projeção' do
					_indice_2016_para_2017 = FactoryBot.create :igpm_aplicado_para_projecao_2017, percentual: 50
					receita_do_calculo_de_projecao = FactoryBot.create :projecao_receita_do_calculo_de_projecao
					#O primeiro calculo_por_exercicio criado terá o valor de 10* 1,5 = 15

					projecao_de_receita = receita_do_calculo_de_projecao.calculo_de_projecao.projecao_de_receita
					receita = receita_do_calculo_de_projecao.receita

					calculo_de_projecao = Projecao::CalculoDeProjecao.create(exercicio_base: 2017, exercicio_destino: 2018, memoria_de_calculo: "teste",
						projecao_de_receita_id: projecao_de_receita.id)
					_indice_2017_para_2018 = FactoryBot.create :igpm_aplicado_para_projecao_2017, calculo_de_projecao_id: calculo_de_projecao.id, percentual: 100
					receita_do_calculo_de_projecao = Projecao::ReceitaDoCalculoDeProjecao.create( receita_id: receita.id, calculo_de_projecao_id: calculo_de_projecao.id )
					#O segundo calculo_por_exercicio criado terá o valor de 15 * 2 = 30

					expect(receita_do_calculo_de_projecao.calculo_por_exercicio.total).to eq 30.0
				end
			end
		end
	end
end
