require 'rails_helper'

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

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

	[:orcamento_da_receita_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
		it "com o valor positivo" do
			orcamento_da_receita = Loa::OrcamentoDaReceita.new
			orcamento_da_receita.save(validate: false)

			lancamento_do_orcamento_da_receita = FactoryBot.build(:contabilidade_lancamento_do_orcamento_da_receita, valor: 20.21, orcamento_da_receita: orcamento_da_receita)
			lancamento_do_orcamento_da_receita.save(validate: false)

			expect( lancamento_do_orcamento_da_receita.orcamento_da_receita.valor_arrecadado.to_f ).to eq 20.21
		end

		it "com valor negativo" do
			orcamento_da_receita = Loa::OrcamentoDaReceita.new
			orcamento_da_receita.save(validate: false)

			lancamento_do_orcamento_da_receita = FactoryBot.build(:contabilidade_lancamento_do_orcamento_da_receita, valor: -12.73, orcamento_da_receita: orcamento_da_receita)
			lancamento_do_orcamento_da_receita.save(validate: false)

			expect( lancamento_do_orcamento_da_receita.orcamento_da_receita.valor_arrecadado.to_f ).to eq -12.73
		end
	end

	context "feito um novo lançamento e em seguida o lancamento foi apagado" do
		it "com o valor positivo" do
			orcamento_da_receita = Loa::OrcamentoDaReceita.new
			orcamento_da_receita.save(validate: false)

			lancamento_do_orcamento_da_receita = FactoryBot.build(:contabilidade_lancamento_do_orcamento_da_receita, valor: 20.21, orcamento_da_receita: orcamento_da_receita)
			lancamento_do_orcamento_da_receita.save(validate: false)

			lancamento_do_orcamento_da_receita.destroy

			expect( lancamento_do_orcamento_da_receita.orcamento_da_receita.valor_arrecadado.to_f ).to eq 0
		end

		it "com valor negativo" do
			orcamento_da_receita = Loa::OrcamentoDaReceita.new
			orcamento_da_receita.save(validate: false)

			lancamento_do_orcamento_da_receita = FactoryBot.build(:contabilidade_lancamento_do_orcamento_da_receita, valor: -12.73, orcamento_da_receita: orcamento_da_receita)
			lancamento_do_orcamento_da_receita.save(validate: false)

			lancamento_do_orcamento_da_receita.destroy

			expect( lancamento_do_orcamento_da_receita.orcamento_da_receita.valor_arrecadado.to_f ).to eq 0
		end
	end

	context "referente a" do
		it "talao de receita" do
			talao_de_receita = Contabilidade::TalaoDeReceita.create!(FactoryBot.attributes_for(:contabilidade_talao_de_receita))

			lancamento_do_orcamento_da_receita = Contabilidade::LancamentoDoOrcamentoDaReceita.new(modulo: talao_de_receita)

			expect( lancamento_do_orcamento_da_receita.referente_a ).to eq "Lançamento do Talão de Receita \##{talao_de_receita.numero_do_talao}"
		end

		it "anulação do talao de receita" do
			talao_de_receita = Contabilidade::TalaoDeReceita.create!(FactoryBot.attributes_for(:contabilidade_talao_de_receita))

			anulacao_do_talao_de_receita = Contabilidade::AnulacaoDoTalaoDeReceita.find_or_create_by!( FactoryBot.attributes_for(:anulacao_do_talao_de_receita, talao_de_receita: talao_de_receita, valor: talao_de_receita.valor) )

			lancamento_do_orcamento_da_receita = Contabilidade::LancamentoDoOrcamentoDaReceita.new(modulo: anulacao_do_talao_de_receita)

			expect( lancamento_do_orcamento_da_receita.referente_a ).to eq "Anulação #{lancamento_do_orcamento_da_receita.modulo.try(:tipo_de_anulacao).try(:humanize)} do Talão de Receita \##{lancamento_do_orcamento_da_receita.modulo.try(:talao_de_receita).try(:numero_do_talao)}"
		end
	end
end
