require 'rails_helper'

RSpec.describe Contabilidade::AnulacaoDoItemDoEmpenho, type: :model do
	it { is_expected.to belong_to(:item_do_empenho).required }
	it { is_expected.to belong_to(:anulacao_do_empenho).required }

	# describe do
	# 	subject { FactoryBot.build :contabilidade_anulacao_do_item_do_empenho, :parcial }
	# 	it { is_expected.to validate_presence_of :quantidade }
	# 	it { is_expected.to validate_presence_of :total }
	# 	it { is_expected.to validate_numericality_of(:quantidade).is_greater_than(0) }
	# end

	describe '#correspondencia_do_empenho' do
		let(:empenho) {
			empenho = Contabilidade::Empenho.new
			empenho.save(validate: false)
			empenho
		}
		let(:outro_empenho) {
			empenho = Contabilidade::Empenho.new
			empenho.save(validate: false)
			empenho
		}
		context 'quando empenho for igual no item e na anulação' do
			it 'não retorna erro' do
				item_do_empenho = Contabilidade::ItemDoEmpenho.new(empenho: empenho)
				item_do_empenho.save(validate: false)

				anulacao_do_empenho = Contabilidade::AnulacaoDoEmpenho.new(empenho: empenho)
				anulacao_do_empenho.save(validate: false)

				anulacao_do_item_do_empenho = Contabilidade::AnulacaoDoItemDoEmpenho.new(item_do_empenho: item_do_empenho, anulacao_do_empenho: anulacao_do_empenho)
				anulacao_do_item_do_empenho.save(validate: false)

				anulacao_do_item_do_empenho.validate

				expect(anulacao_do_item_do_empenho.errors[:base]).not_to include('item não pertence ao empenho anulado')
			end
		end
		context 'quando empenho for diferente no item e na anulação' do
			it 'retorna erro' do
				item_do_empenho = Contabilidade::ItemDoEmpenho.new(empenho_id: empenho.id)
				item_do_empenho.save(validate: false)

				anulacao_do_empenho = Contabilidade::AnulacaoDoEmpenho.new(empenho_id: outro_empenho.id)
				anulacao_do_empenho.save(validate: false)

				anulacao_do_item_do_empenho = Contabilidade::AnulacaoDoItemDoEmpenho.new(item_do_empenho_id: item_do_empenho.id, anulacao_do_empenho: anulacao_do_empenho)
				anulacao_do_item_do_empenho.save(validate: false)

				anulacao_do_item_do_empenho.validate

				expect(anulacao_do_item_do_empenho.errors[:base]).to include('item não pertence ao empenho anulado')
			end
		end
	end
end
