require 'rails_helper'

RSpec.describe Contabilidade::ContaPorEventoContabil, type: :model do
	cria_configuracao_default

	it { is_expected.to belong_to(:conta_par).class_name('Contabilidade::Conta')}
	it { is_expected.to belong_to(:evento_contabil).required }
	it { is_expected.to belong_to(:conta).required }

	it { is_expected.to have_many(:movimentacoes_do_plano_de_contas).dependent(:restrict_with_exception) }

	# it { is_expected.to validate_uniqueness_of(:conta_id).scoped_to(:evento_contabil_id, :conta_par_id) }
	it { is_expected.to validate_uniqueness_of(:ordem_de_lancamento).scoped_to(:evento_contabil_id) }

	it { is_expected.to validate_presence_of :evento_contabil_id }
	it { is_expected.to validate_presence_of :conta_id }
	it { is_expected.to validate_presence_of :tipo_de_lancamento }
	it { is_expected.to validate_presence_of :ordem_de_lancamento }

	describe '#pertence_ao_mesmo_grupo_de_conta?' do
		before(:each) do
		  @conta_patrimonial = FactoryBot.build :conta_patrimonial_evento_padrao, :conta_credor, :debito
		  @conta_patrimonial_dois = FactoryBot.build :conta_patrimonial_evento_padrao, :conta_devedor, :credito
			@conta_controle = FactoryBot.build :conta_patrimonial_evento_padrao, :conta_controle, :credito
		end

		context 'quando não pertencem ao mesmo grupo de conta' do
			it 'retorna false' do
				expect(@conta_patrimonial.pertence_ao_mesmo_grupo_de_conta?(@conta_controle)).to be_falsey
			end

			it 'adiciona mensagem de erro na base' do
				@conta_patrimonial.pertence_ao_mesmo_grupo_de_conta?(@conta_controle)

				expect(@conta_patrimonial.errors[:base]).to include 'As contas selecionadas não pertencem ao mesmo grupo de contas.'
			end
		end

		context 'quando pertencem ao mesmo grupo de conta' do
			it 'retorna false' do
				expect(@conta_patrimonial.pertence_ao_mesmo_grupo_de_conta?(@conta_patrimonial_dois)).to be_truthy
			end

			it 'não adiciona mensagem de erro na base' do
				@conta_patrimonial.pertence_ao_mesmo_grupo_de_conta?(@conta_patrimonial_dois)

				expect(@conta_patrimonial.errors[:base]).to_not include 'As contas selecionadas não pertencem ao mesmo grupo de contas.'
			end
		end
	end

	describe '#conta_deve_ser_analitica' do
		context 'caso a conta não seja analitica' do
			it "retorna erro" do
				conta = FactoryBot.create( :conta_patrimonial, :sem_validacao, analitica: false )
				conta_patrimonial = Contabilidade::ContaPorEventoContabil.create( FactoryBot.attributes_for :conta_patrimonial_evento_padrao, :conta_credor, :debito, conta_id: conta.id )
				expect(conta_patrimonial.errors[:conta_id]).to include 'deve ser analítica'
			end
		end
		context 'caso a conta seja analitica' do
			it "salva" do
				conta = FactoryBot.create( :conta_patrimonial, :sem_validacao, analitica: true)
				conta_patrimonial = FactoryBot.create :conta_patrimonial_evento_padrao, :conta_credor, :debito, conta_id: conta.id
				expect(conta_patrimonial).to be_persisted
			end
		end
	end

	describe "#evento_nao_pode_ter_movimentacoes" do
		# context 'caso o evento tenha movimentações' do
		#   it 'retorna erro' do
		# 		movimentacao = FactoryBot.create :movimentacao_empenho_padrao
		# 		evento = movimentacao.conta_por_evento_contabil.evento_contabil
		# 		conta_patrimonial = Contabilidade::ContaPorEventoContabil.create( FactoryBot.attributes_for :conta_patrimonial_evento_padrao, :conta_credor, :debito, evento_contabil_id: evento.id )
		# 		expect(conta_patrimonial.errors[:base]).to include 'Não é possível adicionar contas a um evento que já possui movimentações'
		#   end
		# end
		context 'caso o evento não tenha movimentações' do
		  it 'salva' do
				evento = FactoryBot.create :evento_contabil, :empenhar
				conta_patrimonial = Contabilidade::ContaPorEventoContabil.create( FactoryBot.attributes_for :conta_patrimonial_evento_padrao, :conta_controle, :debito, evento_contabil_id: evento.id )
				expect(conta_patrimonial).to be_persisted
		  end
		end
	end
end
