require 'rails_helper'


RSpec.describe Tcm::LotesController, type: :controller do
	# Isso deve retornar o mínimo de atributos obrigatórios para criar um
	# Tcm::Lote válido.
	sign_in_admin
	set_orcamento_na_sessao

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

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

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

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

	before(:each) do
		FactoryBot.create(:configuracao)
	end

	describe "GET #index" do
		it "atribui a lista de lotes à @lotes" do
			lote = Tcm::Lote.create! atributos_validos
			get :index, exercicio: orcamento[:exercicio]
			expect(assigns(:lotes)).to eq([lote])
		end
	end

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

	describe "GET #new" do
		it "atribui um(a) novo(a) lote à @lote" do
			get :new, exercicio: orcamento[:exercicio]
			expect(assigns(:lote)).to be_a_new(Tcm::Lote)
		end

		it "atribui um(a) novo(a) lote à @lote e não está configurado o código do municipio no tcm" do
			configuracao = Configuracao.last
			configuracao.codigo_do_municipio_no_tcm = nil
			configuracao.save(validate: false)
			get :new, exercicio: orcamento[:exercicio]
			expect(response).to redirect_to(tcm_lotes_url(exercicio: orcamento[:exercicio]))
		end
	end

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

			it "atribui o(a) lote recém criado(a) à @lote" do
				post :create, params: {tcm_lote: atributos_validos, exercicio: orcamento[:exercicio]}
				expect(assigns(:lote)).to be_a(Tcm::Lote)
				expect(assigns(:lote)).to be_persisted
			end

			it "redireciona para o(a) lote criado(a)" do
				post :create, params: {:tcm_lote => atributos_validos, exercicio: orcamento[:exercicio]}
				expect(response).to redirect_to(Tcm::Lote.last)
			end
		end

		context "com parâmetros inválidos" do
			it "atribui um(a) lote recém criado(a), mas não salvo(a), à @lote" do
				post :create, params: {tcm_lote: atributos_invalidos, exercicio: orcamento[:exercicio]}
				expect(assigns(:lote)).to be_a_new(Tcm::Lote)
			end

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

	describe "DELETE #destroy" do
		it "cancela o(a) lote requisitado(a)" do
			lote = Tcm::Lote.create! atributos_validos
			delete :destroy, params: {:id => lote.to_param}
			expect(lote.reload.situacao).to eq "cancelado"
		end

		it "redireciona para a lista de lotes" do
			lote = Tcm::Lote.create! atributos_validos
			delete :destroy, params: {:id => lote.to_param}
			expect(response).to redirect_to(tcm_lotes_url(exercicio: orcamento[:exercicio]))
		end
	end
end
