shared_examples "gera eventos contábeis" do |acao, modelo, factory|

	subject { FactoryBot.build factory }
	it{ is_expected.to belong_to( :evento_contabil ) }

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

	it{ is_expected.to validate_presence_of :evento_contabil_id }

	describe '.acao_do_sistema' do
		it "retorna a ação do sistema #{acao}" do
			load File.expand_path('seed_acoes_do_sistema.rb', Rails.root.to_s + '/db')
			expect(modelo.acao_do_sistema.nome).to eq acao
		end
	end

	describe '#deve_ter_conta_debito_e_credito_no_evento_contabil' do
		it "retorna mensagem de erro, se não houver contas relacionados ao gerador da ação que chama o evento" do
			evento_contabil = FactoryBot.create :evento_contabil, acao.downcase.to_sym
			evento_contabil.contas_por_eventos_contabeis.destroy_all
			gerador = FactoryBot.build factory, evento_contabil: evento_contabil
			gerador.save

			expect(gerador.errors[:evento_contabil_id]).to include "O evento contábil associado com a ação #{modelo.acao_do_sistema.nome}, não possui contas de débito e crédito p/ realizar as movimentações, portanto não é possível concluir à ação."
		end
	end

	describe 'geração das movimentações dos eventos contábeis' do
		before(:each) do
			@evento_contabil = FactoryBot.create :evento_contabil, acao.downcase.to_sym

			@conta_debito = FactoryBot.create :conta_patrimonial, :sem_validacao
			@conta_credito = FactoryBot.create :conta_patrimonial_dois, :sem_validacao

			@conta_debito_do_evento_contabil = FactoryBot.create :conta_patrimonial_evento_padrao, :debito, evento_contabil: @evento_contabil, conta_id: @conta_debito.id
			@conta_credito_do_evento_contabil = FactoryBot.create :conta_patrimonial_evento_padrao, :credito, evento_contabil: @evento_contabil, conta_id: @conta_credito.id

			@gerador = FactoryBot.create factory, evento_contabil: @evento_contabil

			@conta_debito.reload
			@conta_credito.reload

			@saldo_debito = @conta_debito.saldo.to_f
			@saldo_credito = @conta_credito.saldo.to_f
		end

		context '#after_create' do
			it 'cria a(s) movimentacão(ões) de acordo com o número de contas do evento gerador' do
				expect(@evento_contabil.contas_por_eventos_contabeis.count).to eq @gerador.movimentacoes_do_plano_de_contas.count
			end

			it 'o valor das movimentações é o valor do gerador' do
				@gerador.movimentacoes_do_plano_de_contas.each { |movimentacao| expect(movimentacao.valor.to_f).to eq @gerador.valor.to_f }
			end
		end

		context '#before_destroy' do
			it 'cria a(s) movimentacão(ões) de acordo com o número de contas do evento gerador' do
				expect(@evento_contabil.contas_por_eventos_contabeis.count).to eq @gerador.movimentacoes_do_plano_de_contas.count
			end

			it 'o valor das movimentações é o valor do gerador' do
				@gerador.movimentacoes_do_plano_de_contas.each { |movimentacao| expect(movimentacao.valor.to_f).to eq @gerador.valor.to_f }
			end

			it "retira o valor do gerador que foi movimentado nas contas" do
				@gerador.destroy

				@conta_debito.reload
				@conta_credito.reload

				expect(@conta_debito.saldo.to_f).to eq (@saldo_debito + @gerador.valor.to_f)
				expect(@conta_credito.saldo.to_f).to eq (@saldo_credito - @gerador.valor.to_f)
			end
		end
	end
end
