require 'rails_helper'

RSpec.describe Ppa::IniciativasController, type: :controller do
	sign_in_admin
	set_ppa_id_na_sessao
  	cria_tipos_de_despesa

	# Isso deve retornar o mínimo de atributos obrigatórios para criar um
	# Ppa::Iniciativa válido.
	let(:atributos_validos) {
		FactoryBot.attributes_for(:ppa_iniciativa_para_ensino_fundamental)
	}

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

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

	describe "GET #new" do
		it "atribui um(a) novo(a) ppa_iniciativa à @ppa_iniciativa" do
			iniciativa = FactoryBot.create(:ppa_iniciativa_para_ensino_fundamental)
			get :new, objetivo_id: iniciativa.objetivo_id
			expect(assigns(:ppa_iniciativa)).to be_a_new(Ppa::Iniciativa)
		end
	end

	describe "GET #edit" do
		it "atribui o(a) ppa_iniciativa requisitado à @ppa_iniciativa" do
			iniciativa = Ppa::Iniciativa.create! atributos_validos
			get :edit, params: {id: iniciativa.to_param}
			expect(assigns(:ppa_iniciativa)).to eq(iniciativa)
		end
	end

	describe "POST #create" do
		context "com parâmetros válidos" do
			it "cria um(a) novo(a) Ppa::Iniciativa" do
				expect {
					post :create, params: {ppa_iniciativa: atributos_validos}
				}.to change(Ppa::Iniciativa, :count).by(1)
			end

			it "atribui o(a) ppa_iniciativa recém criado(a) à @ppa_iniciativa" do
				post :create, params: {ppa_iniciativa: atributos_validos}
				expect(assigns(:ppa_iniciativa)).to be_a(Ppa::Iniciativa)
				expect(assigns(:ppa_iniciativa)).to be_persisted
			end

			context "com o param 'manter_form'" do
				it "redireciona para o form de cadastro" do
					post :create, params: {:ppa_iniciativa => atributos_validos, manter_form: true}
					expect(response).to redirect_to(action: :new, objetivo_id: assigns(:ppa_iniciativa).objetivo_id)
				end
			end

			context "sem o param 'manter_form'" do
				it "redireciona para os quantitativos da iniciativa criada" do
					post :create, params: {:ppa_iniciativa => atributos_validos}
					expect(response).to redirect_to(Ppa::Iniciativa.last.objetivo)
				end
			end
		end

		context "com parâmetros inválidos" do
			it "atribui um(a) ppa_iniciativa recém criado(a), mas não salvo(a), à @ppa_iniciativa" do
				post :create, params: {ppa_iniciativa: atributos_invalidos}
				expect(assigns(:ppa_iniciativa)).to be_a_new(Ppa::Iniciativa)
			end

			it "re-renderiza o template 'new'" do
				post :create, params: {ppa_iniciativa: atributos_invalidos}
				expect(response).to render_template("new")
			end
		end
	end

	describe "PUT #update" do
		context "com parâmetros válidos" do
			let(:novos_atributos) {
				{descricao: 'Nova descrição'}
			}

			it "atualiza o(a) ppa_iniciativa requisitado(a)" do
				iniciativa = Ppa::Iniciativa.create! atributos_validos
				post :update, params: {id: iniciativa.to_param, ppa_iniciativa: novos_atributos}
				iniciativa.reload
				expect( iniciativa.descricao ).to eq 'Nova descrição'
			end

			it "atribui o(a) ppa_iniciativa requisitado(a) à @ppa_iniciativa" do
				iniciativa = Ppa::Iniciativa.create! atributos_validos
				post :update, params: {id: iniciativa.to_param, ppa_iniciativa: atributos_validos}
				expect(assigns(:ppa_iniciativa)).to eq(iniciativa)
			end

			it "redireciona para os quantitativos da iniciativa criada" do
				iniciativa = Ppa::Iniciativa.create! atributos_validos
				post :update, params: {id: iniciativa.to_param, ppa_iniciativa: atributos_validos}
				expect(response).to redirect_to(iniciativa.objetivo)
			end
		end

		context "com parâmetros inválidos" do
			it "atribui o(a) ppa_iniciativa à @ppa_iniciativa" do
				iniciativa = Ppa::Iniciativa.create! atributos_validos
				post :update, params: {id: iniciativa.to_param, ppa_iniciativa: atributos_invalidos}
				expect(assigns(:ppa_iniciativa)).to eq(iniciativa)
			end

			it "re-renderiza o template 'edit'" do
				iniciativa = Ppa::Iniciativa.create! atributos_validos
				post :update, params: {id: iniciativa.to_param, ppa_iniciativa: atributos_invalidos}
				expect(response).to render_template("edit")
			end
		end
	end

	describe "DELETE #destroy" do
		it "destrói o(a) ppa_iniciativa requisitado(a)" do
			iniciativa = Ppa::Iniciativa.create! atributos_validos
			expect {
				delete :destroy, params: {:id => iniciativa.to_param}
			}.to change(Ppa::Iniciativa, :count).by(-1)
		end

		it "redireciona paro objetivo da iniciativa excluída" do
			iniciativa = Ppa::Iniciativa.create! atributos_validos
			delete :destroy, params: {:id => iniciativa.to_param}
			expect(response).to redirect_to(iniciativa.objetivo)
		end
	end
end
