require 'rails_helper'


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

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

	let(:atributos_invalidos) {
		{local_publicado: ""}
	}

	let(:projeto) {
		FactoryBot.attributes_for(:licitacao_projeto)
	}


	describe "GET #new" do
		before(:each) do
			@projeto = Licitacao::Projeto.create! projeto
		end

		it "atribui um(a) novo(a) publicacao à @publicacao" do
			get :new, projeto_id: @projeto.to_param
			expect(assigns(:publicacao)).to be_a_new(Licitacao::Publicacao)
		end
	end

	describe "GET #edit" do
		before(:each) do
			@projeto = Licitacao::Projeto.create! projeto
		end

		it "atribui o(a) publicacao requisitado à @publicacao" do
			publicacao = Licitacao::Publicacao.create! atributos_validos
			get :edit, params: {id: publicacao.to_param, projeto_id: @projeto.to_param}
			expect(assigns(:publicacao)).to eq(publicacao)
		end
	end

	describe "POST #create" do
		context "com parâmetros válidos" do
			before(:each) do
				@projeto = Licitacao::Projeto.create! projeto
			end

			it "cria um(a) novo(a) Licitacao::Publicacao" do
				expect {
					post :create, params: {licitacao_publicacao: atributos_validos, projeto_id: @projeto.to_param, licitacao_projeto: {data_da_sessao: "2018-11-24", horario_da_abertura: "12:30"}}
				}.to change(Licitacao::Publicacao, :count).by(1)
			end

			it "atribui o(a) publicacao recém criado(a) à @publicacao" do
				post :create, params: {licitacao_publicacao: atributos_validos, projeto_id: @projeto.to_param, licitacao_projeto: {data_da_sessao: "2018-11-24", horario_da_abertura: "12:30"}}
				expect(assigns(:publicacao)).to be_a(Licitacao::Publicacao)
				expect(assigns(:publicacao)).to be_persisted
			end

			it "redireciona para o processo da publicação criado(a)" do
				post :create, params: {licitacao_publicacao: atributos_validos, projeto_id: @projeto.to_param, licitacao_projeto: {data_da_sessao: "2018-11-24", horario_da_abertura: "12:30"}}
				projeto = Licitacao::Publicacao.last.projeto
				expect(response).to redirect_to(licitacao_processo_path(projeto) + "?tab=publicacoes")
			end
		end

		context "com parâmetros inválidos" do
			before(:each) do
				@projeto = Licitacao::Projeto.create! projeto
			end

			it "atribui um(a) publicacao recém criado(a), mas não salvo(a), à @publicacao" do
				post :create, params: {licitacao_publicacao: atributos_invalidos, projeto_id: @projeto.to_param, licitacao_projeto: {data_da_sessao: "2018-11-24", horario_da_abertura: "12:30"}}
				expect(assigns(:publicacao)).to be_a_new(Licitacao::Publicacao)
			end

			it "re-renderiza o template 'new'" do
				post :create, params: {licitacao_publicacao: atributos_invalidos, projeto_id: @projeto.to_param, licitacao_projeto: {data_da_sessao: "2018-11-24", horario_da_abertura: "12:30"}}
				expect(response).to render_template("new")
			end
		end
	end

	describe "PUT #update" do
		context "com parâmetros válidos" do

			before(:each) do
				@projeto = Licitacao::Projeto.create! projeto
			end

			let(:novos_atributos) {
				data_da_publicacao "2017-11-32"
			}

			it "atribui o(a) publicacao requisitado(a) à @publicacao" do
				publicacao = FactoryBot.create( :licitacao_publicacao, projeto_id: @projeto.id)
				post :update, params: {id: publicacao.to_param, licitacao_publicacao: atributos_validos}
				expect(assigns(:publicacao)).to eq(publicacao)
			end

			it "redireciona para o(a) publicacao" do
				publicacao = FactoryBot.create( :licitacao_publicacao, projeto_id: @projeto.id)
				post :update, params: {id: publicacao.to_param, licitacao_publicacao: atributos_validos, projeto_id: @projeto.to_param}
				expect(response).to redirect_to(licitacao_processo_path(@projeto) + "?tab=publicacoes")
			end
		end

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

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

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

		it "redireciona para a lista de publicacoes" do
			publicacao = Licitacao::Publicacao.create! atributos_validos
			delete :destroy, params: {:id => publicacao.to_param}
			expect(response).to redirect_to(licitacao_processo_path(publicacao.projeto) + "?tab=publicacoes")
		end
	end
end
