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

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

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

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

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

		it "redireciona para o talão de receita se tipo de anulação não informada" do
			talao_de_receita = Contabilidade::TalaoDeReceita.find_or_create_by!( FactoryBot.attributes_for(:contabilidade_talao_de_receita) )
			get :new, params: { talao_de_receita_id: talao_de_receita.id }
			expect(response).to redirect_to(talao_de_receita)
		end

		it "redireciona para o talão de receita se o talão já está anulado" do
			talao_de_receita = Contabilidade::TalaoDeReceita.find_or_create_by!( FactoryBot.attributes_for(:contabilidade_talao_de_receita) )
			talao_de_receita.update_attribute(:valor_anulado, talao_de_receita.valor.to_f)
			get :new, params: { talao_de_receita_id: talao_de_receita.id, tipo: "parcial" }
			expect(response).to redirect_to(talao_de_receita)
		end

		it "redireciona para o talão de receita se o talão foi lançado no dia que está sendo anulado" do
			travel_to Date.parse('29/06/2016')
			talao_de_receita = Contabilidade::TalaoDeReceita.find_or_create_by!( FactoryBot.attributes_for(:contabilidade_talao_de_receita, data_do_talao: Date.parse('29/06/2016')) )
			get :new, params: { talao_de_receita_id: talao_de_receita.id, tipo: "parcial" }
			expect(response).to redirect_to(talao_de_receita)
			travel_back
		end
	end

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

			it "atribui o(a) anulacaodotalaodereceita recém criado(a) à @anulacao_do_talao_de_receita" do
				post :create, params: {contabilidade_anulacao_do_talao_de_receita: atributos_validos, talao_de_receita_id: atributos_validos[:talao_de_receita_id]}
				expect(assigns(:anulacao_do_talao_de_receita)).to be_a(Contabilidade::AnulacaoDoTalaoDeReceita)
				expect(assigns(:anulacao_do_talao_de_receita)).to be_persisted
			end

			it "redireciona para o(a) anulacao_do_talao_de_receita criado(a)" do
				post :create, params: {:contabilidade_anulacao_do_talao_de_receita => atributos_validos, talao_de_receita_id: atributos_validos[:talao_de_receita_id]}
				expect(response).to redirect_to(Contabilidade::AnulacaoDoTalaoDeReceita.last.talao_de_receita)
			end

			it "redireciona para o relançamento do talão da receita" do
				anulacao_do_talao_da_receita = atributos_validos
				anulacao_do_talao_da_receita[:relancamento] = true
				post :create, params: {:contabilidade_anulacao_do_talao_de_receita => anulacao_do_talao_da_receita, talao_de_receita_id: atributos_validos[:talao_de_receita_id]}
				expect(response).to redirect_to new_contabilidade_talao_de_receita_path(@contabilidade.exercicio)  + "?relancamento=1"
			end
		end

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

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