require 'rails_helper'
include ActiveSupport::Testing::TimeHelpers

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

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

	let(:atributos_invalidos) {
		{ itens_do_pedido_por_pessoa: { marca: nil } }
	}

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

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

			it "atualiza o(a) pessoa_do_pedido requisitado(a)" do
				pessoa_do_pedido = Licitacao::PessoaDoPedido.create! atributos_validos

				post :update, params: {id: pessoa_do_pedido.to_param, licitacao_pessoa_do_pedido: novos_atributos}
				pessoa_do_pedido.reload
				expect(pessoa_do_pedido.nome_do_responsavel).to eq "Cicrano"
			end

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

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

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

			it "re-renderiza o template 'edit'" do
				pessoa_do_pedido = Licitacao::PessoaDoPedido.create! atributos_validos
				post :update, params: {id: pessoa_do_pedido.to_param, licitacao_pessoa_do_pedido: {itens_do_pedido_por_pessoa_attributes: [{ preco_de_cotacao: nil, marca: "nissin" }]}}
				expect(response).to render_template("edit")
			end
		end
	end

	describe 'GET #cotar' do
		before(:each) do
			@pessoa_do_pedido = FactoryBot.create :pessoa_do_pedido, codigo_de_acesso: "codigo", validade_codigo_de_acesso: Date.parse("28/12/2017")
			@pessoa_do_pedido.pedido.status = "coleta_de_preco"
			@pessoa_do_pedido.pedido.save(validate: false)
		end

		context 'quando o pedido está com status de coleta_de_preco' do
			it 'permite que o usuário entre sem estar logado' do
				sign_out Usuario.last
				get :cotar, {codigo_de_acesso: 'codigo'}
				expect(response).to have_http_status(:success)
			end

			context 'quando o parâmetro corresponde a um código de acesso válido' do
				it 'renderiza tela de cotação' do
					sign_out Usuario.last
					travel_to Date.parse('20/12/2017') do
						get :cotar, {codigo_de_acesso: "codigo" }
						expect(response).to render_template('licitacao/pessoas_do_pedido/edit')
					end
				end
			end

			context 'quando o parâmetro corresponde é inválido' do
				context 'por conta do código de acesso' do
					it 'renderiza mensagem de erro de código' do
						get :cotar, { codigo_de_acesso: "qualquer_coisa" }
						expect(response).to render_template('licitacao/pessoas_do_pedido/cotar_mensagem')
						expect(assigns(:mensagem)).to eq "Solicitação não encontrada, verifique se o código de acesso informado é válido."
					end
				end
				context 'por conta da validade do código de acesso' do
					it 'renderiza mensagem de erro de validade do código' do
						travel_to Date.parse('31/12/2017') do
							get :cotar, { codigo_de_acesso: "codigo" }
							expect(response).to render_template('licitacao/pessoas_do_pedido/cotar_mensagem')
							expect(assigns(:mensagem)).to eq "O prazo para enviar essa cotação expirou, entre em contato com o setor responsável."
						end
					end
				end
			end
		end

		[:cancelado, :aguardando_outras_unidades, :aberto].each do |status|
			context "quando pedido está com status #{status}" do
				it "redireciona para o pedido" do
					@pessoa_do_pedido.pedido.status = status
					@pessoa_do_pedido.pedido.save(validate: false)

					get :cotar, { codigo_de_acesso: "codigo" }
					expect(response).to render_template('licitacao/pessoas_do_pedido/cotar_mensagem', "layouts/login")
				end
			end
		end
	end
end
