require 'rails_helper'


RSpec.describe Controladoria::VistosController, type: :controller do
	sign_in_admin
	cria_configuracao_default
	set_orcamento_na_sessao

	# Isso deve retornar o mínimo de atributos obrigatórios para criar um
	# Controladoria::Visto válido.

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

	let(:atributos_invalidos) {
		FactoryBot.attributes_for( :controladoria_visto, mensagem: '', aprovado: false)
	}

	let(:empenho) {
		Contabilidade::Empenho.find_or_create_by!(FactoryBot.attributes_for(:empenho))
	}

	#ESTES TESTES SERVEM APENAS PARA O NESTED RESOURCE DE VISTO EM EMPENHO
	context 'Em Empenhos' do
		describe "GET #new" do
			it "atribui um novo visto à @visto" do
				get :new, empenho_id: empenho.id
				expect(assigns(:visto)).to be_a_new(Controladoria::Visto)
			end
		end

		describe "GET #edit" do
			it "atribui o visto requisitado à @visto" do
				visto = Controladoria::Visto.create! atributos_validos
				get :edit, params: {empenho_id: empenho.id ,id: visto.to_param}
				expect(assigns(:visto)).to eq(visto)
			end
		end

		describe "POST #create" do
			context "com parâmetros válidos" do
				it "cria um novo Controladoria::Visto" do
					expect {
						post :create, params: {empenho_id: empenho.id, controladoria_visto: atributos_validos}
					}.to change(Controladoria::Visto, :count).by(1)
				end

				it "atribui o visto recém criado à @visto" do
					post :create, params: {empenho_id: empenho.id, controladoria_visto: atributos_validos}
					expect(assigns(:visto)).to be_a(Controladoria::Visto)
					expect(assigns(:visto)).to be_persisted
				end

				it "redireciona para o visto criado" do
					post :create, params: {empenho_id: empenho.id, :controladoria_visto => atributos_validos}
					expect(response).to redirect_to(empenho_path(Controladoria::Visto.last.vistoriavel)+"?tab=vistos")
				end

				it 'salva o usuário que criou o visto' do
					post :create, params: {empenho_id: empenho.id, :controladoria_visto => atributos_validos}
					expect(assigns(:visto).vistoriador.email).to eq('admin@admin.com')
				end
			end

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

				it "re-renderiza o template 'new'" do
					post :create, params: {empenho_id: empenho.id, controladoria_visto: 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) {
					{ mensagem: "texto atualizado" }
				}

				it "atualiza o visto requisitado" do
					visto = Controladoria::Visto.create! atributos_validos
					post :update, params: {empenho_id: empenho.id ,id: visto.to_param, controladoria_visto: novos_atributos}
					visto.reload
					expect(visto.mensagem).to eq("texto atualizado")
				end

				it "atribui o visto requisitado à @visto" do
					visto = Controladoria::Visto.create! atributos_validos
					post :update, params: {empenho_id: empenho.id, id: visto.to_param, controladoria_visto: atributos_validos}
					expect(assigns(:visto)).to eq(visto)
				end

				it "redireciona para o visto" do
					visto = Controladoria::Visto.create! atributos_validos
					post :update, params: { id: visto.to_param, empenho_id:visto.vistoriavel_id, controladoria_visto: atributos_validos}
					expect(response).to redirect_to(empenho_path(visto.vistoriavel)+"?tab=vistos")
				end
			end

			context "com parâmetros inválidos" do
				it "atribui o visto à @visto" do
					visto = Controladoria::Visto.create! atributos_validos
					post :update, params: {empenho_id: empenho.id, id: visto.to_param, controladoria_visto: atributos_invalidos}
					expect(assigns(:visto)).to eq(visto)
				end

				it "re-renderiza o template 'edit'" do
					visto = Controladoria::Visto.create! atributos_validos
					post :update, params: {empenho_id: empenho.id, id: visto.to_param, controladoria_visto: atributos_invalidos}
					expect(response).to render_template("edit")
				end
			end
		end
	end
end
