require 'rails_helper'

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

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

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

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

	describe 'GET #new' do
	  it 'atribui uma nova meta física à @meta_fisica_da_liquidacao' do
			meta_fisica_da_liquidacao = Contabilidade::MetaFisicaDaLiquidacao.find_or_create_by!( atributos_validos )
			get :new, liquidacao_id: meta_fisica_da_liquidacao.liquidacao_id
			expect( assigns( :meta_fisica_da_liquidacao ) ).to be_a_new( Contabilidade::MetaFisicaDaLiquidacao )
	  end
	end

	describe 'POST #create' do
		before do
			@liquidacao = Contabilidade::Liquidacao.find_or_create_by!( atributos_da_liquidacao )
		end

		context "com parâmetros válidos" do
			it "cria uma novoa meta_fisica_da_liquidacao" do
				expect {
					post :create, params: {liquidacao_id: @liquidacao.to_param, contabilidade_meta_fisica_da_liquidacao: atributos_validos}
				}.to change( Contabilidade::MetaFisicaDaLiquidacao, :count ).by( 1 )
			end

			it "atribui a meta_fisica_da_liquidacao recém criada a @meta_fisica_da_liquidacao" do
				post :create, params: {liquidacao_id: @liquidacao.to_param, contabilidade_meta_fisica_da_liquidacao: atributos_validos}

				expect( assigns( :meta_fisica_da_liquidacao ) ).to be_a( Contabilidade::MetaFisicaDaLiquidacao )
				expect( assigns( :meta_fisica_da_liquidacao ) ).to be_persisted
			end

			it "redireciona para a meta_fisica_da_liquidacao criada" do
				post :create, params: {liquidacao_id: @liquidacao.to_param, contabilidade_meta_fisica_da_liquidacao: atributos_validos}
				expect( response ).to redirect_to ( contabilidade_liquidacao_path( @liquidacao ) + "?tab=metas" )
			end
		end

		context "com parâmetros inválidos" do
			it "atribui uma meta_fisica_da_liquidacao recém criada, mas não salva, a @meta_fisica_da_liquidacao" do
				post :create, params: {liquidacao_id: @liquidacao.to_param, contabilidade_meta_fisica_da_liquidacao: atributos_invalidos}
				expect( assigns( :meta_fisica_da_liquidacao ) ).to be_a_new( Contabilidade::MetaFisicaDaLiquidacao )
			end

			it "re-renderiza o template 'new'" do
				post :create, params: {liquidacao_id: @liquidacao.to_param, contabilidade_meta_fisica_da_liquidacao: atributos_invalidos}
				expect( response ).to render_template( "new" )
			end
		end
	end

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

		it "redireciona para a lista de metas fisicas da liquidação" do
			meta_fisica_da_liquidacao = Contabilidade::MetaFisicaDaLiquidacao.find_or_create_by!( atributos_validos )
			delete :destroy, params: { id: meta_fisica_da_liquidacao.to_param}
			expect( response ).to redirect_to( contabilidade_liquidacao_path( meta_fisica_da_liquidacao.liquidacao ) + "?tab=metas" )
		end
	end

end
