require 'rails_helper'

# This spec was generated by rspec-rails when you ran the scaffold generator.
# It demonstrates how one might use RSpec to specify the controller code that
# was generated by Rails when you ran the scaffold generator.
#
# It assumes that the implementation code is generated by the rails scaffold
# generator.  If you are using any extension libraries to generate different
# controller code, this generated spec may or may not pass.
#
# It only uses APIs available in rails and/or rspec-rails.  There are a number
# of tools you can use to make these specs even more expressive, but we're
# sticking to rails and rspec-rails APIs to keep things simple and stable.
#
# Compared to earlier versions of this generator, there is very limited use of
# stubs and message expectations in this spec.  Stubs are only used when there
# is no simpler way to get a handle on the object needed for the example.
# Message expectations are only used when there is no simpler way to specify
# that an instance is receiving a specific message.

RSpec.describe  Base::TecnicosController, type: :controller do
	sign_in_admin
	set_ppa_id_na_sessao
	# This should return the minimal set of attributes required to create a valid
	#  Base::Tecnico. As you add validations to Ppa::Tecnico, be sure to
	# adjust the attributes here as well.
	let(:valid_attributes) {
		FactoryBot.attributes_for( :tecnico, :ppa_2014, :orgao )
	}

	let(:invalid_attributes) {
		{ nome: "" }
	}

	# This should return the minimal set of values that should be in the session
	# in order to pass any filters (e.g. authentication) defined in
	# Ppa::TecnicosController. Be sure to keep this updated too.
	let(:valid_session) { {} }


	describe "GET #index" do
		it "uma lista com os tecnicos do contexto atual" do
			tecnico_2010 = FactoryBot.create(:tecnico, :ppa_2010, :orgao, modulo_id:  @ppa.id)
			tecnico_2014 = FactoryBot.create(:tecnico, :ppa_2014, :orgao )

			get :index, modulo_id: @ppa.id
			expect( assigns[:base_tecnicos] ).to include(tecnico_2010)
		end
	end


	describe "GET #new" do
		it "assigns a new base_tecnico as @v_tecnico" do
			get :new, params: {}, valid_session
			expect(assigns(:base_tecnico)).to be_a_new(Base::Tecnico)
		end
	end

	describe "GET #edit" do
		it "assigns the requested base_tecnico as @base_tecnico" do
			tecnico = Base::Tecnico.create! valid_attributes
			get :edit, params: {:id => tecnico.to_param}, valid_session
			expect(assigns(:base_tecnico)).to eq(tecnico)
		end
	end

	describe "POST #create" do
		context "with valid params" do
			it "creates a new Base::Tecnico" do
				expect {
					post :create, params: {:base_tecnico => valid_attributes}, valid_session
				}.to change(Base::Tecnico, :count).by(1)
			end

			it "o tecnico recém criado deve ter o id do contexto da sessão" do
				post :create, params: {base_tecnico: valid_attributes}
				expect( Base::Tecnico.last.modulo_id ).to eq controller.contexto_atual.id
			end

			it "assigns a newly created base_tecnico as @base_tecnico" do
				post :create, params: {:base_tecnico => valid_attributes}, valid_session
				expect(assigns(:base_tecnico)).to be_a(Base::Tecnico)
				expect(assigns(:base_tecnico)).to be_persisted
			end

			it "redirects to the tecnicos lista" do
				post :create, params: {:base_tecnico => valid_attributes}, valid_session
				expect(response).to redirect_to base_tecnicos_path
			end
		end

		context "with invalid params" do
			it "assigns a newly created but unsaved base_tecnico as @base_tecnico" do
				post :create, params: {:base_tecnico => invalid_attributes}, valid_session
				expect(assigns(:base_tecnico)).to be_a_new(Base::Tecnico)
			end

			it "re-renders the 'new' template" do
				post :create, params: {:base_tecnico => invalid_attributes}, valid_session
				expect(response).to render_template("new")
			end
		end
	end

	describe "PUT #update" do
		context "with valid params" do
			let(:new_attributes) {
				{
					nome: "Novo nome",
					de_um_orgao: 'true'
				}
			}

			it "updates the requested base_tecnico" do
				tecnico = Base::Tecnico.create! valid_attributes
				post :update, params: {:id => tecnico.to_param, :base_tecnico => new_attributes}, valid_session
				tecnico.reload
				expect( tecnico.nome ).to eq 'Novo nome'
			end

			it "assigns the requested base_tecnico as @base_tecnico" do
				tecnico =  Base::Tecnico.create! valid_attributes
				post :update, params: {:id => tecnico.to_param, :base_tecnico => valid_attributes}, valid_session
				expect(assigns(:base_tecnico)).to eq(tecnico)
			end

			it "redirects to the base_tecnico" do
				tecnico =  Base::Tecnico.create! valid_attributes
				post :update, params: {:id => tecnico.to_param, :base_tecnico => valid_attributes}, valid_session
				expect(response).to redirect_to(base_tecnicos_path)
			end
		end

		context "with invalid params" do
			it "assigns the base_tecnico as @base_tecnico" do
				tecnico =  Base::Tecnico.create! valid_attributes
				post :update, params: {:id => tecnico.to_param, :base_tecnico => invalid_attributes}, valid_session
				expect(assigns(:base_tecnico)).to eq(tecnico)
			end

			it "re-renders the 'edit' template" do
				tecnico =  Base::Tecnico.create! valid_attributes
				post :update, params: {:id => tecnico.to_param, :base_tecnico => invalid_attributes}, valid_session
				expect(response).to render_template("edit")
			end
		end
	end

	describe "DELETE #destroy" do
		it "destroys the requested base_tecnico" do
			tecnico =  Base::Tecnico.create! valid_attributes
			expect {
				delete :destroy, params: {:id => tecnico.to_param}, valid_session
			}.to change( Base::Tecnico, :count).by(-1)
		end

		it "redirects to the base_tecnicos list" do
			tecnico =  Base::Tecnico.create! valid_attributes
			delete :destroy, params: {:id => tecnico.to_param}, valid_session
			expect(response).to redirect_to(base_tecnicos_url)
		end
	end

end
