require 'rails_helper'

RSpec.describe Licitacao::Publicacao, type: :model do
	it { is_expected.to belong_to(:projeto).class_name("Licitacao::Projeto") }

	[:projeto_id, :sequencia, :data_da_publicacao, :tipo_de_publicacao, :data_de_publicacao_no_flanelografo].each do |atributo|
		it { is_expected.to validate_presence_of atributo }
	end

	describe "#valida_data_da_publicacao" do
		context "quando a data da publicação é anterior a data do projeto" do
			let(:projeto) { FactoryBot.create(:licitacao_projeto, data_do_projeto: "2016-10-25") }
			let(:publicacao) { FactoryBot.build(:licitacao_publicacao, data_da_publicacao: "2016-10-24", projeto_id: projeto.id) }

			it "não permite salvar a publicação e inclui um erro" do
				expect(publicacao).to be_invalid
				expect(publicacao.save).to be false
				expect(publicacao.errors[:data_da_publicacao]).to include "Data da publicação não deve ser anterior à data do projeto (25/10/2016)"
			end
		end

		context "quando a data da publicação é igual a data do projeto" do
			let(:projeto) { FactoryBot.create(:licitacao_projeto, data_do_projeto: "2016-10-24") }
			let(:publicacao) { FactoryBot.build(:licitacao_publicacao, data_da_publicacao: "2016-10-24", data_de_publicacao_no_flanelografo: "2016-10-24", projeto_id: projeto.id) }

			it "permite salvar a publicação com sucesso" do
				expect(publicacao).to be_valid
				expect(publicacao.save).to be true
			end
		end

		context "quando a data da publicação é posterior a data do projeto" do
			let(:projeto) { FactoryBot.create(:licitacao_projeto, data_do_projeto: "2016-10-24") }
			let(:publicacao) { FactoryBot.build(:licitacao_publicacao, data_da_publicacao: "2016-10-25", data_de_publicacao_no_flanelografo: "2016-10-24", projeto_id: projeto.id) }

			it "permite salvar a publicação com sucesso" do
				expect(publicacao).to be_valid
				expect(publicacao.save).to be true
			end
		end

		context "quando a data da publicação não é um dia útil" do
			let(:publicacao) { FactoryBot.build(:licitacao_publicacao, data_da_publicacao: "2019-06-23") } # Domingo

			it "não permite salvar a publicação e inclui um erro" do
				configuracao = FactoryBot.create(:configuracao, :sem_lancamentos_no_sabado_domingo_ou_feriado)
				expect(publicacao).to be_invalid
				expect(publicacao.save).to be false
				expect(publicacao.errors[:data_da_publicacao]).to include "não pode ser lançado no domingo"
			end
		end
	end

	describe "#valida_data_de_publicacao_no_flanelografo" do
		context "quando a data de publicação no flanelógrafo é anterior à data de publicação" do
			let(:publicacao) { FactoryBot.build(:licitacao_publicacao, data_de_publicacao_no_flanelografo: "2019-06-24", data_da_publicacao: "2019-06-25") }

			it "permite salvar a publicação com sucesso" do
				expect(publicacao).to be_valid
				expect(publicacao.save).to be true
			end
		end

		context "quando a data de publicação no flanelógrafo é igual à data de publicação" do
			let(:publicacao) { FactoryBot.build(:licitacao_publicacao, data_de_publicacao_no_flanelografo: "2019-06-24", data_da_publicacao: "2019-06-24") }

			it "permite salvar a publicação com sucesso" do
				expect(publicacao).to be_valid
				expect(publicacao.save).to be true
			end
		end

		context "quando a data de publicação no flanelógrafo é posterior à data de publicação" do
			let(:publicacao) { FactoryBot.build(:licitacao_publicacao, data_de_publicacao_no_flanelografo: "2019-06-25", data_da_publicacao: "2019-06-24") }

			it "não permite salvar a publicação e adiciona 1 erro" do
				expect(publicacao).to be_invalid
				expect(publicacao.save).to be false
				expect(publicacao.errors[:data_de_publicacao_no_flanelografo]).to include "Data da publicação no flanelógrafo não pode ser posterior à data de publicação"
			end
		end

		context "quando a data de publicação no flanelógrafo não é um dia útil" do
			let(:publicacao) { FactoryBot.build(:licitacao_publicacao, data_de_publicacao_no_flanelografo: "2019-06-23", data_da_publicacao: "2019-06-24") }

			it "não permite salvar a publicação e adiciona 1 erro" do
				configuracao = FactoryBot.create(:configuracao, :sem_lancamentos_no_sabado_domingo_ou_feriado)
				expect(publicacao).to be_invalid
				expect(publicacao.save).to be false
				expect(publicacao.errors[:data_de_publicacao_no_flanelografo]).to include "não pode ser lançado no domingo"
			end
		end
	end

	it 'atribui_numero' do
		publicacao = FactoryBot.create :licitacao_publicacao
		expect(publicacao.sequencia).to eq 1
	end

	context 'quando tentar publicação de um processo homologado' do
		it 'retorna mensagem de erro' do
			projeto = FactoryBot.create(:licitacao_projeto, status:'homologado')
			publicacao = FactoryBot.build :licitacao_publicacao, projeto_id: projeto.id
			publicacao.save
			expect { publicacao.destroy }.to raise_error('Não é possivel deletar, processo já está homologado')
		end
	end

end
