require 'rails_helper'

RSpec.describe Contabilidade::LiquidacoesController, type: :controller do
	sign_in_admin
	cria_configuracao_default
	set_contabilidade_na_sessao

	let(:empenho){
		FactoryBot.attributes_for( :empenho_22090001)
	}

	let(:atributos) {
		FactoryBot.attributes_for(:liquidacao_001)
	}

	let(:atributos_validos) {
		atributos.except(:evento_contabil).merge({evento_contabil_id: atributos[:evento_contabil][:id]})
	}

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

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

	describe "GET #new" do
		it "atribui um(a) novo(a) liquidacao à @liquidacao" do
			liquidacao = Contabilidade::Liquidacao.create! atributos_validos
			get :new, params: { empenho_id: liquidacao.empenho.id }
			expect(assigns(:liquidacao)).to be_a_new(Contabilidade::Liquidacao)
		end
	end

	describe "GET #edit" do
		context 'abre tela de editar da liquidação requisitada' do
			it 'atribui a empenho requisitado(a) à @empenho' do
				liquidacao = Contabilidade::Liquidacao.create! atributos_validos
				get :edit,params: {id: liquidacao.to_param}
				expect(assigns(:liquidacao)).to eq(liquidacao)
			end
		end
	end

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

			it "atualiza o(a) empenho requisitado(a)" do
				liquidacao = Contabilidade::Liquidacao.create! atributos_validos
				put :update, params: {id: liquidacao.to_param, contabilidade_liquidacao: novos_atributos}
				liquidacao.reload
				expect( liquidacao.valor.to_f ).to eq  29.99
			end

			it "atribui o(a) liquidacao requisitado(a) à @liquidacao" do
				liquidacao = Contabilidade::Liquidacao.create! atributos_validos
				put :update,params: {id: liquidacao.to_param, contabilidade_liquidacao: atributos_validos}
				expect(assigns(:liquidacao)).to eq(liquidacao)
			end

			it "redireciona para o(a) liquidacao" do
				liquidacao = Contabilidade::Liquidacao.create! atributos_validos
				put :update,params: {id: liquidacao.to_param, contabilidade_liquidacao: atributos_validos}
				expect(response).to redirect_to(contabilidade_liquidacao_url(liquidacao))
			end
		end

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

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


	describe "POST #create" do
		before(:each) do
			load File.expand_path('seed_acoes_do_sistema.rb', Rails.root.to_s + '/db')
			@empenho = Contabilidade::Empenho.create! empenho
		end

		context "com parâmetros válidos" do
			it "cria um(a) novo(a) liquidacao" do
				expect {
					post :create,params: {empenho_id: @empenho.id, contabilidade_liquidacao: atributos_validos }
				}.to change(@empenho.liquidacoes, :count).by( 1 )
			end

			it "atribui o(a) liquidacao recém criado(a) à @liquidacao" do
				post :create, params: { empenho_id: @empenho.id, contabilidade_liquidacao: atributos_validos }
				expect(assigns(:liquidacao)).to be_a(Contabilidade::Liquidacao)
				expect(assigns(:liquidacao)).to be_persisted
			end

			it "redireciona para a liquidacao criada" do
				post :create, params: { empenho_id: @empenho.id, contabilidade_liquidacao: atributos_validos }
				expect(response).to redirect_to(Contabilidade::Liquidacao.last)
			end
		end

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

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

	describe 'PATCH #confirmar' do
		it 'atribui o status confirmado' do
			configuracao = Configuracao.find_by(permite_envio_de_email: false)
			configuracao.update(envia_liquidacao_para_contabilidade: true)
			liquidacao = Contabilidade::Liquidacao.create! atributos_validos
			liquidacao.update(status: 4)
			patch :confirmar, params: {id: liquidacao.id}
			expect(liquidacao.reload.confirmado?).to be_truthy
		end
	end

	describe 'PATCH #enviar_para_o_financeiro' do
		it 'atribui o status enviado_para_o_financeiro' do
			configuracao = Configuracao.find_by(permite_envio_de_email: false)
			configuracao.update(envia_liquidacao_para_contabilidade: true)
			liquidacao = Contabilidade::Liquidacao.create! atributos_validos
			liquidacao.update(status: 4)
			patch :enviar_para_o_financeiro, params: {id: liquidacao.id}
			expect(liquidacao.reload.enviado_para_o_financeiro?).to be_truthy
		end
	end

	describe 'PATCH #receber' do
		it 'atribui o status recebido' do
			configuracao = Configuracao.find_by(permite_envio_de_email: false)
			configuracao.update(envia_liquidacao_para_contabilidade: true)
			liquidacao = Contabilidade::Liquidacao.create! atributos_validos
			liquidacao.update(status: 3)
			patch :receber, params: {id: liquidacao.id}
			expect(liquidacao.reload.recebido?).to be_truthy
		end
	end

	describe 'PATCH #recebido_pelo_financeiro' do
		it 'atribui o status recebido' do
			configuracao = Configuracao.find_by(permite_envio_de_email: false)
			configuracao.update(envia_liquidacao_para_contabilidade: true)
			liquidacao = Contabilidade::Liquidacao.create! atributos_validos
			liquidacao.update(status: 5)
			patch :receber_pelo_financeiro, params: {id: liquidacao.id}
			expect(liquidacao.reload.recebido_pelo_financeiro?).to be_truthy
		end
	end

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

		it "redireciona para o empenho da liquidacao" do
			liquidacao = Contabilidade::Liquidacao.create! atributos_validos
			delete :destroy, params: { id: liquidacao.to_param }
			expect(response).to redirect_to(empenho_path(liquidacao.empenho))
		end
	end
end
