require 'rails_helper'

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

	let(:atributos_validos) {
		FactoryBot.attributes_for( :projecao_de_receita_2020 )
	}

	let(:atributos_invalidos) {
		{descricao: ""}
	}

	it { is_expected.to use_before_action(:verifica_se_tem_contexto_valido_na_sessao!) }

	describe "#copiar_calculos_de_projecoes" do
		it 'receitas não encontradas' do
			ppa = Ppa::Ppa.find_by(FactoryBot.attributes_for :ppa_fortaleza_2014)
			ppa.projecao_de_receita.update(receitas_importadas: true)
			projecao_de_receita = ppa.projecao_de_receita
			FactoryBot.create(:calculo_de_projecao_para_2011, projecao_de_receita_id: projecao_de_receita.id,exercicio_base: 2014, exercicio_destino: 2017)

			get :copiar_calculos_de_projecoes, {:exercicio_para_copia => projecao_de_receita.exercicio_projecao_final}
			expect(response).to redirect_to(copiar_calculo_de_projecoes_path( id: projecao_de_receita.id ))
		end

		it 'com receitas'do
			calculo_de_exercicio = FactoryBot.create(:calculo_do_exercicio_de_2016,:receita, importado:true)
			calculo_de_projecao = FactoryBot.create(:calculo_do_exercicio_de_2016, :receita_do_calculo_de_projecao, exercicio: 2017)

			ppa = Ppa::Ppa.find(calculo_de_exercicio.receita.projecao_de_receita.planejamento_id)

			@request.session[:contexto_id] = ppa.id
			@request.session[:contexto_tipo] = ppa.class.name

			get :copiar_calculos_de_projecoes, {:exercicio_para_copia => calculo_de_projecao.exercicio}
			expect(response).to redirect_to(copiar_calculo_de_projecoes_path( id: ppa.projecao_de_receita.id ))
		end
	end

	describe "GET #show" do
		it "atribui a projecaodereceita requisitado(a) à @projecaodereceita" do
			ppa = Ppa::Ppa.find_by(FactoryBot.attributes_for :ppa_fortaleza_2014)
			projecao_de_receita = ppa.projecao_de_receita
			get :show
			expect(assigns(:projecao_de_receita)).to eq(projecao_de_receita)
		end
	end

	describe "GET #edit" do
		context "quando não as receitas ainda não foram importadas" do
			it "atribui o(a) projecaodereceita requisitado à @projecaodereceita" do
				ppa = Ppa::Ppa.find_by(FactoryBot.attributes_for :ppa_fortaleza_2014)
				projecao_de_receita = ppa.projecao_de_receita
				get :notas_explicativas, {id: projecao_de_receita.to_param}
				expect(assigns(:projecao_de_receita)).to eq(projecao_de_receita)
			end
		end
	end

	describe "PUT #update_notas_explicativas" do
		context "com parâmetros válidos" do
			let(:novos_atributos) {
				{notas_explicativas: 'notas_explicativas'}
			}

			it "adicionando a nota explicativa" do
				ppa = Ppa::Ppa.find_by(FactoryBot.attributes_for :ppa_fortaleza_2014)
				projecao_de_receita = ppa.projecao_de_receita

				put :update_notas_explicativas, {id: projecao_de_receita.to_param, projecao_projecao_de_receita: novos_atributos}
				projecao_de_receita.reload
				expect(response).to redirect_to(projecao_de_receita)

			end

			it "atribui a projecao_de_receita requisitada à @projecao_de_receita" do
				ppa = Ppa::Ppa.find_by(FactoryBot.attributes_for :ppa_fortaleza_2014)
				projecao_de_receita = ppa.projecao_de_receita

				put :update_notas_explicativas, {id: projecao_de_receita.to_param, projecao_projecao_de_receita: atributos_validos}

				expect(assigns(:projecao_de_receita)).to eq(projecao_de_receita)
			end

			it "redireciona para a projecao de receita" do
				ppa = Ppa::Ppa.find_by(FactoryBot.attributes_for :ppa_fortaleza_2014)
				projecao_de_receita = ppa.projecao_de_receita

				put :update_notas_explicativas, {id: projecao_de_receita.to_param, projecao_projecao_de_receita: atributos_validos}

				expect(response).to redirect_to(projecao_de_receita)
			end
		end

		context "sem parâmetros" do
			let(:novos_atributos) {
				nil
			}

			it "remove as notas explicativas" do
				ppa = Ppa::Ppa.find_by(FactoryBot.attributes_for :ppa_fortaleza_2014)
				projecao_de_receita = ppa.projecao_de_receita

				projecao_de_receita.notas_explicativas = ["nota 1", "nota 2", "nota 3"]
				projecao_de_receita.save
				put :update_notas_explicativas, {id: projecao_de_receita.to_param, projecao_projecao_de_receita: novos_atributos}
				projecao_de_receita.reload
				expect(projecao_de_receita.notas_explicativas.count).to eq 0
			end
		end
	end


	describe '#new_copiar_calculos_de_projecoes' do
		context 'com parametros validos' do
			it "re-renderiza o template 'form_copiar_calculo_de_projecoes'" do
				ppa = Ppa::Ppa.find_by(FactoryBot.attributes_for :ppa_fortaleza_2014)
				projecao_de_receita = ppa.projecao_de_receita
				get :new_copiar_calculos_de_projecoes, {:id => projecao_de_receita.to_param}
				expect(response).to render_template("form_copiar_calculo_de_projecoes")
			end

			it "atribui a lista_de_calculos requisitada à @lista_de_calculos" do
				ppa = Ppa::Ppa.find_by(FactoryBot.attributes_for :ppa_fortaleza_2014)
				projecao_de_receita = ppa.projecao_de_receita
				get :new_copiar_calculos_de_projecoes, {:id => projecao_de_receita.to_param}
				expect(assigns(:lista_de_calculos)).to eq(projecao_de_receita.calculo_de_projecoes)
			end
		end
	end
end
