require 'rails_helper'


RSpec.describe Licitacao::AditivosController, 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::Aditivo válido.

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

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

	describe "GET #show" do
		it "atribui a aditivo requisitado(a) à @aditivo" do
			aditivo = FactoryBot.create :licitacao_aditivo
			get :show, params: {id: aditivo.to_param}
			expect(assigns(:aditivo)).to eq(aditivo)
		end
	end

	describe "GET #new" do
		it "atribui um(a) novo(a) aditivo à @aditivo" do
			get :new, params: {contrato_id: atributos_validos[:contrato_id]}
			expect(assigns(:aditivo)).to be_a_new(Licitacao::Aditivo)
		end
	end

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

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

			it "atribui o(a) aditivo recém criado(a) à @aditivo" do
				post :create, params: {licitacao_aditivo: atributos_validos, contrato_id: atributos_validos[:contrato_id]}
				expect(assigns(:aditivo)).to be_a(Licitacao::Aditivo)
				expect(assigns(:aditivo)).to be_persisted
			end

			it "redireciona para o(a) contrato do aditivo criado(a)" do
				post :create, params: {:licitacao_aditivo => atributos_validos, contrato_id: atributos_validos[:contrato_id]}
				expect(response).to redirect_to(licitacao_contrato_path(Licitacao::Aditivo.last.contrato, tab: "aditivos"))
			end
		end

		context "com parâmetros inválidos" do
			it "atribui um(a) aditivo recém criado(a), mas não salvo(a), à @aditivo" do
				post :create, params: {licitacao_aditivo: atributos_invalidos, contrato_id: atributos_validos[:contrato_id]}
				expect(assigns(:aditivo)).to be_a_new(Licitacao::Aditivo)
			end

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

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

			it "atualiza o(a) aditivo requisitado(a)" do
				aditivo = Licitacao::Aditivo.create! atributos_validos
				post :update, params: {id: aditivo.to_param, licitacao_aditivo: novos_atributos}
				aditivo.reload
				expect(aditivo.reducao?).to be_truthy
			end

			it "atribui o(a) aditivo requisitado(a) à @aditivo" do
				aditivo = Licitacao::Aditivo.create! atributos_validos
				post :update, params: {id: aditivo.to_param, licitacao_aditivo: atributos_validos}
				expect(assigns(:aditivo)).to eq(aditivo)
			end

			it "redireciona para o aditivo" do
				aditivo = FactoryBot.create :licitacao_aditivo
				post :update, params: {id: aditivo.to_param, licitacao_aditivo: atributos_validos}
				expect(response).to redirect_to(aditivo)
			end
		end

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

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

	describe "DELETE #destroy" do
		it "destrói o(a) aditivo requisitado(a)" do
			aditivo = Licitacao::Aditivo.create! atributos_validos
			expect {
				delete :destroy, params: {:id => aditivo.to_param}
			}.to change(Licitacao::Aditivo, :count).by(-1)
		end

		it "redireciona para a lista de aditivos" do
			aditivo = Licitacao::Aditivo.create! atributos_validos
			delete :destroy, params: {:id => aditivo.to_param}
			expect(response).to redirect_to(licitacao_contrato_path(aditivo.contrato, tab: nil))
		end
	end

	describe "PATCH #nao_enviar_para_sim" do
		it "for aditivo de dispensa" do
			aditivo = Licitacao::Aditivo.create! atributos_validos
			aditivo.update_column(:envia_pro_sim, false)
			expect redirect_to(aditivo)
		end
	end

	describe "PATCH #enviar_para_sim" do
		it "for aditivo de dispensa" do
			aditivo = Licitacao::Aditivo.create! atributos_validos
			aditivo.update_column(:envia_pro_sim, true)
			expect redirect_to(aditivo)
		end
	end

	describe "GET #editar_data_de_envio_pro_sim" do
		it "atribui o aditivo requisitado à @aditivo" do
			aditivo = FactoryBot.create :licitacao_aditivo
			get :editar_data_de_envio_pro_sim, {id: aditivo.to_param}
			expect(assigns(:aditivo)).to eq(aditivo)
		end
	end

	describe "PATCH #atualizar_data_de_envio_pro_sim" do
		context "com parâmetros válidos" do
			let(:data_valida) {
				{ envia_pro_sim: true }
				{ data_de_envio_pro_sim: Date.today }
			}

			it "atualiza o processo requisitado e redireciona pro @processo" do
				aditivo = Licitacao::Aditivo.create! atributos_validos
				patch :atualizar_data_de_envio_pro_sim, { id: aditivo.to_param, licitacao_aditivo: data_valida }
				aditivo.reload
				expect(aditivo.data_de_envio_pro_sim).to eq Date.today
			end
		end

		context "com parâmetros inválidos" do
			let(:data_invalida) {
				{ envia_pro_sim: true }
				{ data_de_envio_pro_sim: nil }
			}

			it "não atualiza o processo e re-renderiza o template :editar_data_de_envio_pro_sim" do
				aditivo = Licitacao::Aditivo.create! atributos_validos
				patch :atualizar_data_de_envio_pro_sim, {id: aditivo.to_param, licitacao_aditivo: data_invalida}
				expect(response).to render_template("editar_data_de_envio_pro_sim")
			end
		end
	end
end
