require 'rails_helper'

RSpec.describe Licitacao::UnidadeOrcamentariaPorPedido, type: :model do
	it{ is_expected.to belong_to(:pedido).required }
	it{ is_expected.to belong_to(:unidade_orcamentaria).required }

	it { is_expected.to have_many(:itens_do_pedido_por_unidade_orcamentaria).dependent(:destroy) }
	it{ is_expected.to have_many(:itens_do_pedido).through(:itens_do_pedido_por_unidade_orcamentaria) }
	it{ is_expected.to have_many(:contratos).dependent(:restrict_with_exception) }


	it "não permite criar pedidos unidade orçamentaria sem odenador" do
		unidade_orcamentaria = Loa::UnidadeOrcamentaria.find_or_create_by!(FactoryBot.attributes_for(:loa_fes, :orcamento_2016))
		unidade_orcamentaria_por_pedido = FactoryBot.build( :unidade_orcamentaria_por_pedido, unidade_orcamentaria_id: unidade_orcamentaria.id )
		unidade_orcamentaria_por_pedido.save
		expect( unidade_orcamentaria_por_pedido.errors[:unidade_orcamentaria_id] ).to include "Essa unidade orçamentaria não possui ordenador de despesa"
	end

	describe '#update' do
		it 'validate_uniqueness_of item no escopo de pedido' do
			pedido = FactoryBot.create :pedido

			atributos_unidades_orcamentarias =  {
				unidades_orcamentarias_por_pedido_attributes: {
						'0': {
							unidade_orcamentaria_id: Loa::UnidadeOrcamentaria.find_or_create_by(FactoryBot.attributes_for :loa_hgf, :orcamento_2016).id,
						},
						'1': {
							unidade_orcamentaria_id: Loa::UnidadeOrcamentaria.find_or_create_by(FactoryBot.attributes_for :loa_hgf, :orcamento_2016).id,
						}
				}
			}

			pedido.update(atributos_unidades_orcamentarias)
			expect(pedido.errors[:unidades_orcamentarias_por_pedido]).to include("unidade orçamentária deve ser única dentro de um pedido")
		end
	end

	describe '#valor_total_itens' do
		it 'retorna valor total dos itens' do
			unidade = FactoryBot.create :unidade_orcamentaria_por_pedido
			item_do_pedido = FactoryBot.create(:item_do_pedido, pedido_id: unidade.pedido_id)
			_item_da_unidade = FactoryBot.create(:item_da_unidade_orcamentaria,unidade_orcamentaria_por_pedido_id: unidade.id, item_do_pedido_id: item_do_pedido.id)
			_item_do_pedido_por_pessoa = FactoryBot.create(:licitacao_item_do_pedido_por_pessoa,item_do_pedido_id: item_do_pedido.id)

			expect( unidade.valor_total_itens ).to eq 72
		end
	end

	describe '#quantidade_de_itens_por_preco' do
		it 'retorna valor total dos itens' do
			unidade = FactoryBot.create :unidade_orcamentaria_por_pedido
			item_do_pedido = FactoryBot.create(:item_do_pedido, pedido_id: unidade.pedido_id)
			item_do_pedido_desconto = FactoryBot.create(:item_do_pedido, pedido_id: unidade.pedido_id, tipo:'por_desconto')
			_item_da_unidade = FactoryBot.create(:item_da_unidade_orcamentaria,unidade_orcamentaria_por_pedido_id: unidade.id, item_do_pedido_id: item_do_pedido.id)
			_item_da_unidade = FactoryBot.create(:item_da_unidade_orcamentaria,unidade_orcamentaria_por_pedido_id: unidade.id, item_do_pedido_id: item_do_pedido_desconto.id)
			expect( unidade.quantidade_de_itens_por_preco ).to eq 8
		end
	end

	describe '#preenchido?' do
		it 'retorna true' do
			unidade = FactoryBot.create :unidade_orcamentaria_por_pedido
			item_do_pedido = FactoryBot.create(:item_do_pedido, pedido_id: unidade.pedido_id)
			_item_da_unidade = FactoryBot.create(:item_da_unidade_orcamentaria,unidade_orcamentaria_por_pedido_id: unidade.id, item_do_pedido_id: item_do_pedido.id)
			_item_do_pedido_por_pessoa = FactoryBot.create(:licitacao_item_do_pedido_por_pessoa,item_do_pedido_id: item_do_pedido.id)

			expect( unidade.preenchido? ).to be_truthy
		end
		it 'retorna false' do
			unidade = FactoryBot.create :unidade_orcamentaria_por_pedido
			expect( unidade.preenchido? ).to be_falsey
		end
	end
end
