require 'rails_helper'


RSpec.describe Contabilidade::EventosContabeisController, type: :controller do
	sign_in_admin
	cria_configuracao_default
	set_contabilidade_na_sessao
	# Isso deve retornar o mínimo de atributos obrigatórios para criar um
	# Contabilidade::EventoContabil válido.

	let(:atributos_validos) {
		FactoryBot.attributes_for(:evento_contabil, :empenhar)
	}

	let(:orcamento_2016) {
		FactoryBot.attributes_for( :orcamento_2016 )
	}

	let(:atributos_invalidos) {
		{
			nome: nil
		}
	}


	describe "GET #index" do
		it "atribui a lista de eventos_contabeis à @eventos_contabeis" do
			evento_contabil = Contabilidade::EventoContabil.create! atributos_validos
			get :index, exercicio: @contabilidade.exercicio
			expect(assigns(:eventos_contabeis)).to eq([evento_contabil])
		end
	end

	describe "GET #show" do
		it "atribui a evento_contabil requisitado(a) à @evento_contabil" do
			evento_contabil = Contabilidade::EventoContabil.create! atributos_validos
			get :show, params: {id: evento_contabil.to_param}
			expect(assigns(:evento_contabil)).to eq(evento_contabil)
		end
	end

	describe "GET #new" do
		it "atribui um(a) novo(a) evento_contabil à @evento_contabil" do
			get :new, exercicio: @contabilidade.exercicio
			expect(assigns(:evento_contabil)).to be_a_new(Contabilidade::EventoContabil)
		end
	end

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

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

			it "atribui o(a) evento_contabil recém criado(a) à @evento_contabil" do
				post :create, params: {contabilidade_evento_contabil: atributos_validos, exercicio: @contabilidade.exercicio}
				expect(assigns(:evento_contabil)).to be_a(Contabilidade::EventoContabil)
				expect(assigns(:evento_contabil)).to be_persisted
			end

			it "redireciona para o(a) evento_contabil criado(a)" do
				post :create, params: {:contabilidade_evento_contabil => atributos_validos, exercicio: @contabilidade.exercicio}
				expect(response).to redirect_to(Contabilidade::EventoContabil.last)
			end
		end

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

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

	describe "PUT #update" do
		context "com parâmetros válidos" do
			let(:novos_atributos) { { nome: "novo nome" } }

			it "atualiza o(a) evento_contabil requisitado(a)" do
				evento_contabil = Contabilidade::EventoContabil.create! atributos_validos
				post :update, params: {id: evento_contabil.to_param, contabilidade_evento_contabil: novos_atributos}
				evento_contabil.reload
				expect( evento_contabil.nome ).to eq 'novo nome'
			end

			it "atribui o(a) evento_contabil requisitado(a) à @evento_contabil" do
				evento_contabil = Contabilidade::EventoContabil.create! atributos_validos
				post :update, params: {id: evento_contabil.to_param, contabilidade_evento_contabil: atributos_validos}
				expect(assigns(:evento_contabil)).to eq(evento_contabil)
			end

			it "redireciona para o(a) evento_contabil" do
				evento_contabil = Contabilidade::EventoContabil.create! atributos_validos
				post :update, params: {id: evento_contabil.to_param, contabilidade_evento_contabil: atributos_validos}
				expect(response).to redirect_to(evento_contabil)
			end
		end

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

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

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

		it "redireciona para a lista de eventos_contabeis" do
			evento_contabil = Contabilidade::EventoContabil.create! atributos_validos
			delete :destroy, params: {:id => evento_contabil.to_param}
			expect(response).to redirect_to(contabilidade_eventos_contabeis_url(@contabilidade.exercicio))
		end
	end
end
