require 'rails_helper'

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

	before(:each) do
		Ppa::Ppa.first.projecao_de_receita(receitas_importadas: true)

		@projecao_de_receita = Ppa::Ppa.first.projecao_de_receita
		@calculo_de_projecao = FactoryBot.create(:calculo_de_projecao_para_ppa_atual)
		@indice_de_projecao = FactoryBot.create(:igpm, projecao_de_receita_id: @projecao_de_receita.id)
	end

	let(:atributos_validos) {
		{
			indices_do_calculo_de_projecao_attributes: {
				"0" => {
					indice_de_projecao_id: @indice_de_projecao.id,
					percentual: 2.8
				}
			}
		}
	}

	let(:atributos_invalidos) {
		{
			indices_do_calculo_de_projecao_attributes: {
				"0" => {
					indice_de_projecao_id: @indice_de_projecao.id,
					percentual: ''
				}
			}
		}
	}

	describe 'get #edit' do
		it 'renderiza template :edit' do
			get :edit, params: {calculo_id: @calculo_de_projecao.id}
			is_expected.to render_template :edit
		end

		it 'atribui o cálculo de projeção à @calculo_de_projecao' do
			get :edit, params: {calculo_id: @calculo_de_projecao.id}
			expect(assigns(:calculo_de_projecao)).to eq @calculo_de_projecao
		end

		it 'atribui os índices de projeção à @indices' do
			get :edit, params: {calculo_id: @calculo_de_projecao.id}
			expect(assigns(:indices)).to include @indice_de_projecao
		end
	end

	describe 'put #update' do
		context 'quando não é passado o parâmetro :id' do
			context 'com parâmetros válidos' do
				it 'cria um novo indice do calculo de projecao' do
					expect {
						post :update, params: {calculo_id: @calculo_de_projecao.id, projecao_calculo_de_projecao: atributos_validos}
					}.to change(Projecao::IndiceDoCalculoDeProjecao, :count).by(1)
				end

				it 'redireciona para a aba de indices do cálculo de projeção' do
					post :update, params: {calculo_id: @calculo_de_projecao.id, projecao_calculo_de_projecao: atributos_validos}
					is_expected.to redirect_to projecao_calculo_de_projecao_path(id: @calculo_de_projecao.id, tab: 'indices')
				end
			end

			context 'com parâmetros inválidos' do
				it 'cria um novo indice do calculo de projecao' do
					expect {
						post :update, params: {calculo_id: @calculo_de_projecao.id, projecao_calculo_de_projecao: atributos_invalidos}
					}.not_to change(Projecao::IndiceDoCalculoDeProjecao, :count)
				end

				it 'renderiza o template :edit' do
					post :update, params: {calculo_id: @calculo_de_projecao.id, projecao_calculo_de_projecao: atributos_invalidos}
					is_expected.to render_template :edit
				end
			end
		end

		context 'quando é passado o parâmetro :id' do
			context 'com parâmetros válidos' do
				before(:each) do
					@indice_do_calculo_de_projecao = FactoryBot.create(:igpm_aplicado_para_projecao_2017, calculo_de_projecao_id: @calculo_de_projecao.id, indice_de_projecao_id: @indice_de_projecao.id)
					atributos_validos[:indices_do_calculo_de_projecao_attributes]['0'][:id] = @indice_do_calculo_de_projecao.id
				end

				it 'atualiza o indice do calculo de projeção' do
					post :update, params: {calculo_id: @calculo_de_projecao.id, projecao_calculo_de_projecao: atributos_validos}
					@indice_do_calculo_de_projecao.reload
					expect(@indice_do_calculo_de_projecao.percentual.to_f).to eq 2.8
				end

				it 'redireciona para a aba de indices do cálculo de projeção' do
					post :update, params: {calculo_id: @calculo_de_projecao.id, projecao_calculo_de_projecao: atributos_validos}
					is_expected.to redirect_to projecao_calculo_de_projecao_path(id: @calculo_de_projecao.id, tab: 'indices')
				end
			end

			context 'com parâmetros inválidos' do
				before(:each) do
					@indice_do_calculo_de_projecao = FactoryBot.create(:igpm_aplicado_para_projecao_2017, calculo_de_projecao_id: @calculo_de_projecao.id, indice_de_projecao_id: @indice_de_projecao.id)
					atributos_invalidos[:indices_do_calculo_de_projecao_attributes]['0'][:id] = @indice_do_calculo_de_projecao.id
				end

				it 'não atualiza o indice do calculo de projeção' do
					post :update, params: {calculo_id: @calculo_de_projecao.id, projecao_calculo_de_projecao: atributos_invalidos}
					@indice_do_calculo_de_projecao.reload
					expect(@indice_do_calculo_de_projecao.percentual.to_f).not_to eq 2.8
				end

				it 'renderiza o template de :edit' do
					post :update, params: {calculo_id: @calculo_de_projecao.id, projecao_calculo_de_projecao: atributos_invalidos}
					is_expected.to render_template :edit
				end
			end
		end

		context 'quando é passado o parâmetro :_destroy' do
			before(:each) do
				@indice_do_calculo_de_projecao = FactoryBot.create(:igpm_aplicado_para_projecao_2017, calculo_de_projecao_id: @calculo_de_projecao.id, indice_de_projecao_id: @indice_de_projecao.id)
				atributos_validos[:indices_do_calculo_de_projecao_attributes]['0'][:id] = @indice_do_calculo_de_projecao.id
				atributos_validos[:indices_do_calculo_de_projecao_attributes]['0'][:_destroy] = 1
			end

			it 'apaga os índices do calculo de projeção requisiado' do
				expect {
					post :update, params: {calculo_id: @calculo_de_projecao.id, projecao_calculo_de_projecao: atributos_validos}
				}.to change(Projecao::IndiceDoCalculoDeProjecao, :count).by(-1)
			end

			it 'redireciona para a aba de indices do cálculo de projeção' do
				post :update, params: {calculo_id: @calculo_de_projecao.id, projecao_calculo_de_projecao: atributos_validos}
				is_expected.to redirect_to projecao_calculo_de_projecao_path(id: @calculo_de_projecao.id, tab: 'indices')
			end
		end
	end

	describe 'delete #destroy' do
		it 'remove o registro requisitado' do
			indice_do_calculo_de_projecao = FactoryBot.create(:igpm_aplicado_para_projecao_2017, calculo_de_projecao_id: @calculo_de_projecao.id, indice_de_projecao_id: @indice_de_projecao.id)
			expect {
				delete :destroy, params: {id: indice_do_calculo_de_projecao.id}
			}.to change(Projecao::IndiceDoCalculoDeProjecao, :count).by(-1)
		end

		it 'redireciona para a aba de indices do cálculo de projeção' do
			indice_do_calculo_de_projecao = FactoryBot.create(:igpm_aplicado_para_projecao_2017, calculo_de_projecao_id: @calculo_de_projecao.id, indice_de_projecao_id: @indice_de_projecao.id)
			delete :destroy, params: {id: indice_do_calculo_de_projecao.id}
			is_expected.to redirect_to projecao_calculo_de_projecao_path(id: indice_do_calculo_de_projecao.calculo_de_projecao.id, tab: 'indices')
		end
	end
end
