require 'rails_helper'

RSpec.describe Ppa::Quantitativo, type: :model do

	it{ is_expected.to belong_to :meta }
	it{ is_expected.to belong_to :unidade_de_medida }

	# [:meta, :exercicio, :indice_de_referencia].each do |atributo|
	it { is_expected.to validate_presence_of :meta}
	it { is_expected.to validate_presence_of :exercicio}
	# end

	it{ is_expected.to validate_presence_of( :unidade_de_medida_id ).on(:update)}

	it { validate_numericality_of(:valor).is_greater_than_or_equal_to(0) }

	it "não permite alterações no atributo meta" do
		objetivo = FactoryBot.create(:ppa_objetivo)
		meta = FactoryBot.create(:meta_contratar_profissionais, objetivo_id: objetivo.id)
		quantitativo = meta.quantitativos.first
		quantitativo.save
		quantitativo.update(meta_id: 99999)
		expect(quantitativo.errors[:meta_id] ).to include "não pode ser alterado"
	end

	it "não permite alterações no atributo exercicio" do
		objetivo = FactoryBot.create(:ppa_objetivo)
		meta = FactoryBot.create(:meta_contratar_profissionais, objetivo_id: objetivo.id)
		quantitativo = meta.quantitativos.first
		quantitativo.exercicio += 5
		quantitativo.save
		expect( quantitativo.errors[:exercicio] ).to include "deve ser menor ou igual a 2017"
	end


	it "valida unicidade do exercicio para a mesma meta" do
		allow_any_instance_of( Ppa::Quantitativo )
			.to receive( :ppa )
			.and_return( FactoryBot.create(:ppa_fortaleza_2014) )
		is_expected.to validate_uniqueness_of(:exercicio).scoped_to([:meta_id])
	end

	it "deve ter o exercicio maior ou igual que o exercicio inicial do PPA" do
		meta = FactoryBot.create(:meta_contratar_profissionais)
		quantitativo = meta.quantitativos.new
		quantitativo.exercicio = quantitativo.ppa.exercicio_inicial - 1
		quantitativo.save
		expect( quantitativo.errors[:exercicio] ).to include "deve ser maior ou igual a 2014"
	end

	it "deve ter o exercicio menor ou igual que o exercicio final do PPA" do
		meta = FactoryBot.create(:meta_contratar_profissionais)
		quantitativo = meta.quantitativos.new
		quantitativo.exercicio = quantitativo.ppa.exercicio_final + 1
		quantitativo.save
		expect( quantitativo.errors[:exercicio] ).to include "deve ser menor ou igual a 2017"
	end

	describe "#ppa" do
		it "retorna o ppa, através da meta > objetivo > programa" do
			meta = FactoryBot.create(:meta_contratar_profissionais)
			quantitativo = meta.quantitativos.first
			expect( quantitativo.ppa ).to eq meta.objetivo.programa.ppa
		end
	end

	describe '#quando_unidade_de_medida_for_percentual_as_metas_fisicas_devem_somar_cem_porcento' do
		it 'retorna mensagem de erro' do
			unidade_de_medida = FactoryBot.create :percentual
			meta = FactoryBot.create(:meta_contratar_profissionais)
			meta.quantitativos.each do |quantitativo|
				quantitativo.update(indice_de_referencia: 20)
			end
			quantitativo = meta.quantitativos.first
			quantitativo.update(unidade_de_medida_id: unidade_de_medida.id)

			expect(quantitativo.errors[:indice_de_referencia]).to include 'a soma do valor dos quatro exercícios deve ser 100%'
		end
	end

	describe "#permitir cadastrar valores com casas decimais com base na configuração da unidade de medida" do
		it 'retorna erro' do
			unidade_de_medida = FactoryBot.create :unidade_de_medida
			objetivo = FactoryBot.create(:ppa_objetivo)
			meta = FactoryBot.create(:meta_contratar_profissionais, objetivo_id: objetivo.id)
			quantitativo = meta.quantitativos.first
			quantitativo.unidade_de_medida_id = unidade_de_medida.id
			quantitativo.indice_de_referencia = 55.88
			quantitativo.save
			expect(quantitativo.errors[:indice_de_referencia] ).to include "Para essa unidade de medida valor deve ser inteiro."
		end
	end
end
