require 'rails_helper'


RSpec.describe Licitacao::AtasDeRegistroDePrecosController, type: :controller do
	sign_in_admin
	cria_configuracao_default
	set_licitacao_na_sessao

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

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

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

	let(:processo) { FactoryBot.create :licitacao_processo }

	let(:ata_de_registro_de_preco_diferente) {
		ata = FactoryBot.create( :ata_de_registro_de_precos, numero:"121231" )
		ata.processo.pedido.unidades_orcamentarias_por_pedido.first.update_column(:unidade_orcamentaria_id, FactoryBot.create(:loa_fes, :orcamento_2016).id )
		ata
	}

	describe "GET #index" do
		before do
			@ata_de_registro = FactoryBot.create( :ata_de_registro_de_precos )
			@outra_ata_de_registro = ata_de_registro_de_preco_diferente
		end
		context 'quando o usuário acessa todas as unidades' do
			it "atribui a lista completa de ata de registro de preços solicitados à @atas_de_registro_de_precos " do
				sign_in FactoryBot.create(:usuario_comum)
				get :index
				expect(assigns(:atas_de_registro_de_precos)).to include(@ata_de_registro, @outra_ata_de_registro)
			end
		end
		context 'quando o usuário possui unidades selecionadas' do
			sign_in_secretario
			it 'retorna apenas atas_de_registro_de_precos solicitados das unidades do usuário' do
				get :index
				expect(assigns(:atas_de_registro_de_precos)).to eq([@ata_de_registro])
			end
		end
	end

	describe "GET #show" do
		sign_in_secretario
		context 'quando o usuário pode acessar unidade da ata' do
			it 'atribui a ata_de_registro_de_precos requisitada à @ata_de_registro_de_precos' do
				ata_de_registro_de_precos = Licitacao::AtaDeRegistroDePrecos.create! atributos_validos
				get :show, params: {id: ata_de_registro_de_precos.to_param}
				expect(assigns(:ata_de_registro_de_precos)).to eq(ata_de_registro_de_precos)
			end
		end

		context 'e o usuário não pode acessar unidade da ata' do
			it 'redireciona para o index' do
				get :show, params: { id: ata_de_registro_de_preco_diferente.to_param }
				expect(response).to redirect_to(licitacao_ata_de_registro_de_precos_path)
			end
		end
	end

	describe "GET #new" do
		context 'caso processo não contenha ata' do
			it "atribui uma nova ata_de_registro_de_precos à @ata_de_registro_de_precos" do
				get :new, processo_id: processo.id
				expect(assigns(:ata_de_registro_de_precos)).to be_a_new(Licitacao::AtaDeRegistroDePrecos)
			end
		end
		context 'caso processo já contenha ata' do
			it 'redireciona de volta para process com erro' do
				FactoryBot.create :ata_de_registro_de_precos, projeto_id: processo.id
				get :new, processo_id: processo.id
				expect(response).to redirect_to processo
			end
		end
	end

	describe "GET #edit" do
		it "atribui a ata_de_registro_de_precos requisitado à @ata_de_registro_de_precos" do
			ata_de_registro_de_precos = Licitacao::AtaDeRegistroDePrecos.create! atributos_validos
			ata_de_registro_de_precos
			get :edit, params: {id: ata_de_registro_de_precos.to_param}
			expect(assigns(:ata_de_registro_de_precos)).to eq(ata_de_registro_de_precos)
		end
	end

	describe "POST #create" do
		context "com parâmetros válidos" do
			it "cria uma nova Licitacao::AtaDeRegistroDePrecos" do
				expect {
					post :create, params: {licitacao_ata_de_registro_de_precos: atributos_validos, processo_id: processo.id}
				}.to change(Licitacao::AtaDeRegistroDePrecos, :count).by(1)
			end

			it "atribui a ata_de_registro_de_precos recém criada à @ata_de_registro_de_precos" do
				post :create, params: {licitacao_ata_de_registro_de_precos: atributos_validos, processo_id: processo.id}
				expect(assigns(:ata_de_registro_de_precos)).to be_a(Licitacao::AtaDeRegistroDePrecos)
				expect(assigns(:ata_de_registro_de_precos)).to be_persisted
			end

			it "redireciona para a Ata" do
				post :create, params: {:licitacao_ata_de_registro_de_precos => atributos_validos, processo_id: processo.id}
				expect(response).to redirect_to(Licitacao::AtaDeRegistroDePrecos.last)
			end

			context 'se já existe Ata' do
				it 'não sobrescreve' do
					ata_de_registro_de_precos = processo.create_ata_de_registro_de_precos(numero: "999", texto_da_ata: "texto")
					post :create, params: { licitacao_ata_de_registro_de_precos: {
						numero: "1000", texto_da_ata: "texto_novo"
					}, processo_id: processo.id }
					expect(processo.ata_de_registro_de_precos).to eq ata_de_registro_de_precos
					expect(flash[:alert]).to include 'Esse processo já possui ata de registro de preços'
				end
			end
		end

		context "com parâmetros inválidos" do
			it "atribui uma ata_de_registro_de_precos recém criada, mas não salva, à @ata_de_registro_de_precos" do
				post :create, params: {licitacao_ata_de_registro_de_precos: atributos_invalidos, processo_id: processo.id}
				expect(assigns(:ata_de_registro_de_precos)).to be_a_new(Licitacao::AtaDeRegistroDePrecos)
			end

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

	describe "PUT #update" do
		context "com parâmetros válidos" do
			let(:novos_atributos) {
				{texto_da_ata: "Texto editado"}
			}

			it "atualiza a ata_de_registro_de_precos requisitada" do
				ata_de_registro_de_precos = Licitacao::AtaDeRegistroDePrecos.create! atributos_validos
				post :update, params: {id: ata_de_registro_de_precos.to_param, licitacao_ata_de_registro_de_precos: novos_atributos}
				ata_de_registro_de_precos.reload
				expect(ata_de_registro_de_precos.texto_da_ata).to eq "Texto editado"
			end

			it "atribui a ata_de_registro_de_precos requisitada à @ata_de_registro_de_precos" do
				ata_de_registro_de_precos = Licitacao::AtaDeRegistroDePrecos.create! atributos_validos
				post :update, params: {id: ata_de_registro_de_precos.to_param, licitacao_ata_de_registro_de_precos: atributos_validos}
				expect(assigns(:ata_de_registro_de_precos)).to eq(ata_de_registro_de_precos)
			end

			it "redireciona para a ata_de_registro_de_precos" do
				ata_de_registro_de_precos = Licitacao::AtaDeRegistroDePrecos.create! atributos_validos
				post :update, params: {id: ata_de_registro_de_precos.to_param, licitacao_ata_de_registro_de_precos: atributos_validos}
				expect(response).to redirect_to(ata_de_registro_de_precos)
			end
		end

		context "com parâmetros inválidos" do
			it "atribui a ata_de_registro_de_precos à @ata_de_registro_de_precos" do
				ata_de_registro_de_precos = Licitacao::AtaDeRegistroDePrecos.create! atributos_validos
				post :update, params: {id: ata_de_registro_de_precos.to_param, licitacao_ata_de_registro_de_precos: atributos_invalidos}
				expect(assigns(:ata_de_registro_de_precos)).to eq(ata_de_registro_de_precos)
			end

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