require 'rails_helper'

RSpec.describe Contabilidade::SituacaoDaObra, type: :model do
	it{ is_expected.to belong_to :obra }
	it{ is_expected.to belong_to :engenheiro_da_obra }

	it{ is_expected.to validate_presence_of :obra_id }
	it{ is_expected.to validate_presence_of :engenheiro_da_obra_id }
	it{ is_expected.to validate_presence_of :tipo_de_status_da_obra }
	it{ is_expected.to validate_presence_of :data_da_situacao }

	it{ is_expected.to validate_length_of(:tombo_do_bem).is_at_most(20) }

	it { is_expected.to allow_value('').for(:data_do_termo_de_conclusao) }
	it { is_expected.to_not allow_value('00/').for(:data_do_termo_de_conclusao) }

	it { is_expected.to allow_value('01/01/2016').for(:data_da_situacao) }
	it { is_expected.to_not allow_value('').for(:data_da_situacao) }
	it { is_expected.to_not allow_value('00/').for(:data_da_situacao) }

	describe "#save" do
		context "quando status da obra é concluída" do
			it "valida presença do termo de conclusão" do
				situacao_da_obra = FactoryBot.build( :situacao_concluida, data_do_termo_de_conclusao: '', tipo_de_termo: '')
				situacao_da_obra.save
				expect(situacao_da_obra.errors[:data_do_termo_de_conclusao]).to include "não pode ficar em branco"
				expect(situacao_da_obra.errors[:tipo_de_termo]).to include "não pode ficar em branco"
			end
		end

		context "quando status da obra não é concluída" do
			it "não valida a presença do termo de conclusão" do
				situacao_da_obra = FactoryBot.build( :situacao_em_andamento )
				situacao_da_obra.save
				expect(situacao_da_obra.errors[:data_do_termo_de_conclusao]).not_to include "não pode ficar em branco"
				expect(situacao_da_obra.errors[:tombo_do_bem]).not_to include "não pode ficar em branco"
				expect(situacao_da_obra.errors[:tipo_de_termo]).not_to include "não pode ficar em branco"
			end

			it "valida que o termo de conclusão não deve ser preenchido" do
				situacao_da_obra = FactoryBot.build( :situacao_paralisada, data_do_termo_de_conclusao: Date.today, tombo_do_bem: "123123", tipo_de_termo: "permanente" )
				situacao_da_obra.save
				expect(situacao_da_obra.errors[:data_do_termo_de_conclusao]).to include "não deve ser preenchido para esse tipo de situação"
				expect(situacao_da_obra.errors[:tombo_do_bem]).to include "não deve ser preenchido para esse tipo de situação"
				expect(situacao_da_obra.errors[:tipo_de_termo]).to include "não deve ser preenchido para esse tipo de situação"
			end
		end
	end

	context "data nao pode ser anterior a data de inicio da obra" do
		it "data anterior a data de inicio da obra" do
			obra_0001 = FactoryBot.create(:obra_0001, codigo: '0001')
			situacao_01_da_obra = FactoryBot.build(:situacao_em_andamento, obra_id: obra_0001.id, data_da_situacao: obra_0001.data_de_inicio - 1)
			situacao_01_da_obra.validate

			expect(situacao_01_da_obra.errors[:data_da_situacao]).to include("deve ser a partir do inicio da obra #{obra_0001.data_de_inicio}")
		end

		it "data apos a data de inicio da obra" do
			obra_0001 = FactoryBot.create(:obra_0001, codigo: '0001')
			situacao_01_da_obra = FactoryBot.build(:situacao_em_andamento, obra_id: obra_0001.id, data_da_situacao: obra_0001.data_de_inicio + 1)
			situacao_01_da_obra.validate

			expect(situacao_01_da_obra.errors[:data_da_situacao]).not_to include("deve ser a partir do inicio da obra #{obra_0001.data_de_inicio}")
		end
	end

	it "já é a situação atual" do
		obra_0001 = FactoryBot.create(:obra_0001, codigo: '0001')
		situacao_01_da_obra = FactoryBot.create(:situacao_em_andamento, obra_id: obra_0001.id)
		situacao_02_da_obra = FactoryBot.build(:situacao_em_andamento, obra_id: obra_0001.id, data_da_situacao: situacao_01_da_obra.data_da_situacao + 1)
		situacao_02_da_obra.validate

		expect(situacao_02_da_obra.errors[:tipo_de_status_da_obra]).to include("já é a situação atual")
	end

	it "não é a situação atual" do
		obra_0001 = FactoryBot.create(:obra_0001, codigo: '0001')
		situacao_01_da_obra = FactoryBot.create(:situacao_em_andamento, obra_id: obra_0001.id)
		situacao_02_da_obra = FactoryBot.create(:situacao_paralisada, obra_id: obra_0001.id, data_da_situacao: situacao_01_da_obra.data_da_situacao + 1)

		expect(situacao_02_da_obra.errors[:tipo_de_status_da_obra]).not_to include("já é a situação atual")
	end

	context "tipo de status nao pode ser alterado para nao iniciado apos inicio" do
		it "selecionado o tipo nao iniciado apos iniciar obra" do
			obra_0001 = FactoryBot.create(:obra_0001, codigo: '0001')
			situacao_01_da_obra = FactoryBot.create(:situacao_em_andamento, obra_id: obra_0001.id)
			situacao_02_da_obra = FactoryBot.build(:situacao_nao_iniciada, obra_id: obra_0001.id)
			situacao_02_da_obra.validate
			
			expect(situacao_02_da_obra.errors[:tipo_de_status_da_obra]).to include("obra já iniciada não pode ser alterado para não iniciado")
		end

		it "não é a situação atual" do
			obra_0001 = FactoryBot.create(:obra_0001, codigo: '0001')
			situacao_01_da_obra = FactoryBot.create(:situacao_em_andamento, obra_id: obra_0001.id)
			situacao_02_da_obra = FactoryBot.build(:situacao_paralisada, obra_id: obra_0001.id)
			situacao_02_da_obra.validate

			expect(situacao_02_da_obra.errors[:tipo_de_status_da_obra]).not_to include("obra já iniciada não pode ser alterado para não iniciado")
		end
	end
end
