require 'rails_helper'

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

	it { is_expected.to belong_to(:orcamento_da_despesa).class_name('Loa::OrcamentoDaDespesa').required(true)}
	it { is_expected.to belong_to(:modulo).required(true) }

	[:orcamento_da_despesa_id, :data_do_lancamento, :valor, :modulo_id, :modulo_type].each do |atributo|
		it{ is_expected.to validate_presence_of atributo }
	end

	it { validate_numericality_of(:valor) }

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

	context "feito um novo lançamento" do
		before do
			@orcamento_da_despesa = FactoryBot.create( :orcamento_da_despesa_saude, valor_empenhado: 9.99 )
		end

		it "com o valor positivo" do
			lancamento_do_orcamento_da_despesa = FactoryBot.build( :contabilidade_lancamento_do_orcamento_da_despesa, valor: 20.21 )
			lancamento_do_orcamento_da_despesa.save(validate: false)

			expect( lancamento_do_orcamento_da_despesa.orcamento_da_despesa.valor_empenhado.to_f ).to eq 30.2
		end

		it "com valor negativo" do
			lancamento_do_orcamento_da_despesa = FactoryBot.build( :contabilidade_lancamento_do_orcamento_da_despesa, valor: -12.73, saldo: 20 )
			lancamento_do_orcamento_da_despesa.save(validate: false)

			expect( lancamento_do_orcamento_da_despesa.orcamento_da_despesa.valor_empenhado.to_f ).to eq -2.74
		end
	end

	context "feito um novo lançamento e em seguida o lancamento foi apagado" do
		before do
			@orcamento_da_despesa = FactoryBot.create( :orcamento_da_despesa_saude )
		end

		it "com o valor positivo" do
			lancamento_do_orcamento_da_despesa = FactoryBot.build( :contabilidade_lancamento_do_orcamento_da_despesa, valor: 20.21, orcamento_da_despesa: @orcamento_da_despesa )
			lancamento_do_orcamento_da_despesa.save(validate: false)
			lancamento_do_orcamento_da_despesa.destroy

			expect( lancamento_do_orcamento_da_despesa.orcamento_da_despesa.valor_empenhado.to_f ).to eq 0
		end

		it "com valor negativo" do
			lancamento_do_orcamento_da_despesa = FactoryBot.build( :contabilidade_lancamento_do_orcamento_da_despesa, valor: -12.73, orcamento_da_despesa: @orcamento_da_despesa )
			lancamento_do_orcamento_da_despesa.save(validate: false)
			lancamento_do_orcamento_da_despesa.destroy

			expect( lancamento_do_orcamento_da_despesa.orcamento_da_despesa.valor_empenhado.to_f ).to eq 0
		end
	end

	context "referente a" do
		it "empenho" do
			empenho = FactoryBot.create( :empenho_22090001 )
			lancamento_do_orcamento_da_despesa = Contabilidade::LancamentoDoOrcamentoDaDespesa.new(modulo: empenho)

			expect( lancamento_do_orcamento_da_despesa.referente_a ).to eq "Lançamento do Empenho \##{empenho.numero_do_empenho}"
		end

		it "anulação do empenho" do
			empenho = FactoryBot.create( :empenho_22090001, descriminacao_obrigatoria_de_itens: false )
			anulacao_do_empenho = Contabilidade::AnulacaoDoEmpenho.find_or_create_by!( FactoryBot.attributes_for(:anulacao_do_empenho_total, empenho: empenho, valor: empenho.valor) )
			lancamento_do_orcamento_da_despesa = Contabilidade::LancamentoDoOrcamentoDaDespesa.new(modulo: anulacao_do_empenho)

			expect( lancamento_do_orcamento_da_despesa.referente_a ).to eq "Anulação #{lancamento_do_orcamento_da_despesa.modulo.try(:tipo_de_anulacao).try(:humanize)} do Empenho \##{lancamento_do_orcamento_da_despesa.modulo.try(:empenho).try(:numero_do_empenho)}"
		end

	end
end
