require 'rails_helper'
include ActiveSupport::Testing::TimeHelpers

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

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

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

	describe 'GET #index' do
		context 'quando modulo é administrativo' do
			it 'retorna lista completa de anulações do contexto'
		end

		context 'quando modulo é contabilidade' do
			it 'retorna lista completa de anulações confirmadas do contexto'
		end
	end

	describe 'GET #show' do
		it 'atribui anulacao à @anulacao_do_empenho'
	end

	describe "GET #new" do
		it "atribui um(a) novo(a) anulacao_do_empenho à @anulacao_do_empenho" do
			get :new, params: { empenho_id: atributos_validos[:empenho_id] }
			expect(assigns(:anulacao_do_empenho)).to be_a_new(Contabilidade::AnulacaoDoEmpenho)
		end

		it "redireciona para o empenho se tipo de anulação não informada" do
			empenho = Contabilidade::Empenho.find_or_create_by!( FactoryBot.attributes_for(:empenho_22090001) )
			get :new, params: { empenho_id: empenho.id }
			expect(response).to redirect_to(empenho)
		end

		it "redireciona para o empenho se não possui saldo" do
			empenho = Contabilidade::Empenho.find_or_create_by!( FactoryBot.attributes_for(:empenho_22090001) )
			empenho.update_attribute(:valor_anulado, empenho.valor.to_f)
			get :new, params: { empenho_id: empenho.id, tipo: "parcial" }
			expect(response).to redirect_to(empenho)
		end

		it "redireciona para o empenho se foi lançado no dia da anulação" do
			travel_to Date.parse('29/06/2016')
			empenho = Contabilidade::Empenho.find_or_create_by!( FactoryBot.attributes_for(:empenho_22090001, data_do_empenho: Date.parse('29/06/2016')) )
			get :new, params: { empenho_id: empenho.id, tipo: "parcial" }
			expect(response).to redirect_to(empenho)
			travel_back
		end
	end

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

			it "atribui o(a) anulacao_do_empenho recém criado(a) à @anulacao_do_empenho" do
				post :create, params: {contabilidade_anulacao_do_empenho: atributos_validos, empenho_id: atributos_validos[:empenho_id]}
				expect(assigns(:anulacao_do_empenho)).to be_a(Contabilidade::AnulacaoDoEmpenho)
				expect(assigns(:anulacao_do_empenho)).to be_persisted
			end

			it "redireciona para o(a) anulacao_do_empenho criado(a)" do
				post :create, params: {:contabilidade_anulacao_do_empenho => atributos_validos, empenho_id: atributos_validos[:empenho_id]}
				expect(response).to redirect_to(contabilidade_empenho_path(Contabilidade::AnulacaoDoEmpenho.last.empenho) + "?tab=anulacoes")
			end
		end

		context "com parâmetros inválidos" do
			it "atribui um(a) anulacao_do_empenho recém criado(a), mas não salvo(a), à @anulacao_do_empenho" do
				post :create, params: {contabilidade_anulacao_do_empenho: atributos_invalidos, empenho_id: atributos_validos[:empenho_id]}
				expect(assigns(:anulacao_do_empenho)).to be_a_new(Contabilidade::AnulacaoDoEmpenho)
			end

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

	describe 'PATCH #enviar_para_controladoria' do
		it 'envia para controladoria'
	end

	describe 'PATCH #enviar_para_contabilidade' do
		it 'envia para contabilidade'
	end

	describe 'PATCH #confirmar_anulacao' do
		it 'confirma anulação'
	end

	describe 'PATCH #retornar_para_administrativo' do
		it 'retorna para administrativo'
	end
end
