require 'rails_helper'

RSpec.describe Projecao::ReceitasDosCalculosDeProjecaoController, type: :controller do
	sign_in_admin
	set_ppa_id_na_sessao

	let(:atributos_receita) {
		FactoryBot.attributes_for( :receita )
	}

	let(:atributos_receita_pai) {
		FactoryBot.attributes_for( :receita_corrente_pai )
	}

	before(:each) do
		@projecao_de_receita = Ppa::Ppa.first.projecao_de_receita
		@projecao_de_receita.update(receitas_importadas: true)
		@calculo_do_exercicio = FactoryBot.create( :calculo_do_exercicio_para_ppa_criado, :receita, exercicio: 2012)
		@calculo_de_projecao = FactoryBot.create( :calculo_de_projecao_para_2017, projecao_de_receita_id: @projecao_de_receita.id, exercicio_base: 2012 )
		@receita =  @projecao_de_receita.receitas.first
	end

	describe 'GET #new' do
		it 'atribui a lista de receitas disponíveis para serem selecionadas para o cálculo à @receitas' do
			FactoryBot.create( :igpm_aplicado_para_projecao_2017, calculo_de_projecao_id: @calculo_de_projecao.id )
			get :new, calculo_de_projecao_id: @calculo_de_projecao.id

			expect(assigns(:receitas)).to eq([@receita])
		end
	end

	describe 'POST #create' do
		context 'caso todas as receitas tenham valor base calculado' do
			it 'cria uma nova Projecao::ReceitaDoCalculoDeProjecao para o cálculo de projeção requisitado' do
				post :create, calculo_de_projecao_id: @calculo_de_projecao.id, receitas: { @receita.id.to_s => @receita.id }

				expect( @calculo_de_projecao.receitas_dos_calculos_de_projecao.count).to eq(1)
			end

			it 'redireciona para calculo de projecao' do
				post :create, calculo_de_projecao_id: @calculo_de_projecao.id, receitas: { @receita.id.to_s => @receita.id }

				expect(response).to redirect_to(@calculo_de_projecao)
			end
		end

		context 'caso algumas receitas não tenham valor base calculado' do
			it 'mostra tela de resultado com uma lista de receitas com erro' do
				receita = Projecao::Receita.create! atributos_receita_pai
				post :create, calculo_de_projecao_id: @calculo_de_projecao.id, receitas: { receita.id.to_s => receita.id }
				expect(response).to render_template('resultado')
				expect(assigns(:receitas_com_erro).first.receita_id).to eq(receita.id)
			end
		end
	end

	describe 'DELETE #destroy' do
		it 'destrói a Projecao::ReceitaDoCalculoDeProjecao requisitada' do
			receita_do_calculo = FactoryBot.create( :projecao_receita_do_calculo_de_projecao, calculo_de_projecao_id: @calculo_de_projecao.id, receita_id: @receita.id )
			expect{
				delete :destroy, id: receita_do_calculo.id
			}.to change(Projecao::ReceitaDoCalculoDeProjecao, :count).by(-1)
		end
	end
end
