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

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

	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 'geração das movimentações reversas do evento contábil' 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_pai = FactoryBot.create factory_pai

			@conta_debito.reload
			@conta_credito.reload

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

			if modelo.eql?(Contabilidade::EstornoDeLiquidacao)
				@gerador = FactoryBot.create factory, liquidacao_id: @gerador_pai.id
			elsif modelo.eql?(Contabilidade::EstornoDePagamento)
				@gerador = FactoryBot.create factory, pagamento_id: @gerador_pai.id
			elsif modelo.eql?(Contabilidade::AnulacaoDoEmpenho)
				@gerador = FactoryBot.create factory, empenho_id: @gerador_pai.id, valor: 4.45, tipo_de_anulacao: 'parcial'
			elsif modelo.eql?(Contabilidade::AnulacaoDoTalaoDeReceita)
				@gerador = FactoryBot.create factory, talao_de_receita_id: @gerador_pai.id, valor: 4.45, tipo_de_anulacao: 'parcial'
			end
		end

		context '#after_create' do
			it 'cria a(s) movimentacão(ões) de acordo com o número de contas do pai do 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
				@conta_debito.reload
				@conta_credito.reload

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