require 'rails_helper'


RSpec.describe Base::AgentesPublicosMunicipaisController, type: :controller do
	sign_in_admin
	set_orcamento_na_sessao

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

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


	describe "GET #index" do
		it "atribui a lista de agentes publicos municipais" do
			agente_publico_municipal = Base::AgentePublicoMunicipal.create! atributos_validos
			get :index
			expect(assigns(:agentes_publicos_municipais)).to eq([agente_publico_municipal])
		end
	end

	describe "GET #show" do
		it "atribui a agente publico municipal requisitado" do
			agente_publico_municipal = Base::AgentePublicoMunicipal.create! atributos_validos
			get :show, params: {id: agente_publico_municipal.to_param}
			expect(assigns(:agente_publico_municipal)).to eq(agente_publico_municipal)
		end
	end

	describe "GET #new" do
		it "atribui um(a) novo(a) agente publico municipal" do
			get :new
			expect(assigns(:agente_publico_municipal)).to be_a_new(Base::AgentePublicoMunicipal)
		end
	end

	describe "GET #edit" do
		it "atribui o(a) agente publico municipal" do
			agente_publico_municipal = Base::AgentePublicoMunicipal.create! atributos_validos
			get :edit, params: {id: agente_publico_municipal.to_param}
			expect(assigns(:agente_publico_municipal)).to eq(agente_publico_municipal)
		end
	end

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

			it "atribui o agente publico municipal recém criado" do
				post :create, params: {base_agente_publico_municipal: atributos_validos}
				expect(assigns(:agente_publico_municipal)).to be_a(Base::AgentePublicoMunicipal)
				expect(assigns(:agente_publico_municipal)).to be_persisted
			end

			it "redireciona para o agente publico municipal criado" do
				post :create, params: {:base_agente_publico_municipal => atributos_validos}
				expect(response).to redirect_to(Base::AgentePublicoMunicipal.last)
			end
		end

		context "com parâmetros inválidos" do
			it "atribui um agentepublicomunicipal recém criado, mas não salvo" do
				post :create, params: {base_agente_publico_municipal: atributos_invalidos}
				expect(assigns(:agente_publico_municipal)).to be_a_new(Base::AgentePublicoMunicipal)
			end

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

	describe "PUT #update" do
		context "com parâmetros válidos" do
			let(:novos_atributos) {
					{nome: 'Joaquim'}
			}

			it "atribui o agente publico municipal requisitado" do
				agente_publico_municipal = Base::AgentePublicoMunicipal.create! atributos_validos
				post :update, params: {id: agente_publico_municipal.to_param, base_agente_publico_municipal: atributos_validos}
				expect(assigns(:agente_publico_municipal)).to eq(agente_publico_municipal)
			end

			it "redireciona para o(a) agente publico municipal" do
				agente_publico_municipal = Base::AgentePublicoMunicipal.create! atributos_validos
				post :update, params: {id: agente_publico_municipal.to_param, base_agente_publico_municipal: atributos_validos}
				expect(response).to redirect_to(agente_publico_municipal)
			end
		end

		context "com parâmetros inválidos" do
			it "atribui o agente publico municipal" do
				agente_publico_municipal = Base::AgentePublicoMunicipal.create! atributos_validos
				post :update, params: {id: agente_publico_municipal.to_param, base_agente_publico_municipal: atributos_invalidos}
				expect(assigns(:agente_publico_municipal)).to eq(agente_publico_municipal)
			end

			it "re-renderiza o template 'edit'" do
				agente_publico_municipal = Base::AgentePublicoMunicipal.create! atributos_validos
				post :update, params: {id: agente_publico_municipal.to_param, base_agente_publico_municipal: atributos_invalidos}
				expect(response).to render_template("edit")
			end
		end
	end

	describe "DELETE #destroy" do
		it "destrói o agente publico municipal requisitado" do
			agente_publico_municipal = Base::AgentePublicoMunicipal.create! atributos_validos
			expect {
				delete :destroy, params: {:id => agente_publico_municipal.to_param}
			}.to change(Base::AgentePublicoMunicipal, :count).by(-1)
		end

		it "redireciona para a lista de agentes publicos municipais" do
			agente_publico_municipal = Base::AgentePublicoMunicipal.create! atributos_validos
			delete :destroy, params: {:id => agente_publico_municipal.to_param}
			expect(response).to redirect_to(base_agentes_publicos_municipais_url)
		end
	end

	describe 'GET #pesquisa' do
		it 'retorna partial de pesquisa' do
			get :pesquisa
			expect(response).to render_template("pesquisa")
		end
	end

	describe 'GET #resultado' do
		it 'retorna partial de resultado' do
			get :resultado
			expect(response).to render_template("resultado")
		end
		it 'retorna agentes publicos conforme query' do
			agente = FactoryBot.create :agente_publico, numero_de_posse: "234432"
			get :resultado, {q: {numero_de_posse_cont: "234"}}
			expect(assigns(:agentes_publicos_municipais)).to eq([agente])
		end
	end
end
