require 'rails_helper'

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

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

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

	let(:atributos_invalidos) {
		{
			quantidade: 0
		}
	}

	describe "GET #index" do
		it "atribui a lista de itens do empenho à @itens_do_empenho" do
			item_do_empenho = Contabilidade::ItemDoEmpenho.create! atributos_validos
			get :index, { empenho_id: item_do_empenho.empenho.id }
			expect(assigns(:itens_do_empenho)).to eq([item_do_empenho])
		end
	end

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

		describe 'combo de itens' do
			before(:each) do
				FactoryBot.create_list(:caderno, 2)
				@projeto = FactoryBot.create :licitacao_projeto
			end

			context 'quando o empenho deriva de licitação' do
				it 'mostra apenas os itens daquela licitação' do
					empenho = FactoryBot.create(:empenho, projeto_id: @projeto.id)
					quantidade_de_itens = empenho.projeto.itens_do_lote.count
					expect(quantidade_de_itens).to eq 2

					get :new,  { empenho_id: empenho.id }
					expect(assigns(:itens).size).to eq quantidade_de_itens
				end
			end

			context 'quando o empenho não deriva de licitação' do
				it 'mostra todos os itens' do
					empenho = FactoryBot.create :empenho
					quantidade_de_itens = Base::Item.count
					expect(quantidade_de_itens).to eq 4

					get :new, params: { empenho_id: empenho.id }
					expect(assigns(:itens).size).to eq quantidade_de_itens
				end
			end
		end
	end

	describe "POST #create" do
		before do
			@empenho = Contabilidade::Empenho.create! empenho
		end

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

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

			it "redireciona para os itens do empenho" do
				post :create,  { empenho_id: @empenho.id, contabilidade_item_do_empenho: atributos_validos }
				expect(response).to redirect_to(contabilidade_empenho_path(@empenho) + "?tab=itens")
			end
		end

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

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

end
