require 'rails_helper'

RSpec.describe GestaoDeEstoque::ItemDaTransferencia, type: :model do
  it { is_expected.to belong_to(:estoque) }
  it { is_expected.to belong_to(:unidade_de_medida_de_conversao).with_foreign_key(:unidade_de_medida_de_conversao_id) }
  it { is_expected.to belong_to(:transferencia) }
  it { is_expected.to belong_to(:item).class_name("Base::Item") }

  it { is_expected.to have_many(:movimentacoes_do_estoque) }

  context "Completa informações do Item" do
    it "Quando tem Estoque" do
      estoque = FactoryBot.build(:gestao_de_estoque_estoque,
        item_id: 1, unidade_de_medida_id: 1,
        almoxarifado_id: 1, unidade_orcamentaria_id: 1)
      estoque.save(validate: false)
      item = FactoryBot.build(:gestao_de_estoque_item_da_transferencia, estoque_id: estoque.id)
      expect(item.preenche_item_id).to be_truthy
    end
    it "Quando não tem Estoque" do
      item = FactoryBot.build(:gestao_de_estoque_item_da_transferencia)
      expect(item.preenche_item_id).to be_falsey
    end
  end

  context "Unidade de Medida Destacada" do
    it "Quando tem Unidade de Medida" do
      item = FactoryBot.create(:caderno, descricao: "Produto")
      estoque = FactoryBot.build(:gestao_de_estoque_estoque,
        item_id: item.id, unidade_de_medida_id: item.unidade_de_medida_id,
        almoxarifado_id: 1, unidade_orcamentaria_id: 1)
      estoque.save(validate: false)
      transferencia = FactoryBot.build(:gestao_de_estoque_transferencia,
         almoxarifado_id: 1, unidade_orcamentaria_id: 1)
      transferencia.save(validate: false)
      item_da_tranferencia = FactoryBot.build(:gestao_de_estoque_item_da_transferencia,
      item_id: item.id, unidade_de_medida_de_conversao_id: item.unidade_de_medida_id,
      transferencia_id: transferencia.id)
      expect(item_da_tranferencia.unidade_de_medida_destacada).to eq "#{item_da_tranferencia.item.id} - PRODUTO <strong>(#{estoque.unidade_de_medida.descricao})</strong>"
    end
    it "Quando nao tem Unidade de Medida" do
      item = FactoryBot.build(:gestao_de_estoque_item_da_transferencia)
      expect(item.unidade_de_medida_destacada).to be_blank
    end
  end

  context "Valida quantidade maior que zero" do
    before(:each) do
      @transferencia = FactoryBot.build(:gestao_de_estoque_transferencia,
        almoxarifado_id: 1, unidade_orcamentaria_id: 1, status: :aberto)
      @transferencia.save(validate: false)
      @estoque = FactoryBot.build(:gestao_de_estoque_estoque,
        item_id: 1, unidade_de_medida_id: 1,
        almoxarifado_id: 1, unidade_orcamentaria_id: 1)
      @estoque.save(validate: false)
      @movimentacao = FactoryBot.build(:gestao_de_estoque_movimentacao_do_estoque,
        estoque_id: @estoque.id ,quantidade_entrada: 2)
      @movimentacao.save(validate: false)
    end
    it "Quando é maior que zero" do
      item = FactoryBot.build(:gestao_de_estoque_item_da_transferencia, item_id: 1,
      transferencia_id: @transferencia.id, quantidade: 1, estoque_id: @estoque.id)
      item.validate
      expect(item.errors[:quantidade]).to be_blank
    end
    it "Quando é menor que zero" do
      item = FactoryBot.build(:gestao_de_estoque_item_da_transferencia, item_id: 1,
      transferencia_id: @transferencia.id, quantidade: 3, estoque_id: @estoque.id)
      item.validate
      expect(item.errors[:quantidade]).to include "Quantidade maior que a do estoque"
    end
  end

  context "Saldo do Item" do
    before(:each) do
      @transferencia = FactoryBot.build(:gestao_de_estoque_transferencia,
        almoxarifado_id: 1, unidade_orcamentaria_id: 1, status: :aberto)
      @transferencia.save(validate: false)
      @estoque = FactoryBot.build(:gestao_de_estoque_estoque,
        item_id: 1, unidade_de_medida_id: 1,
        almoxarifado_id: 1, unidade_orcamentaria_id: 1)
      @estoque.save(validate: false)
      @movimentacao = FactoryBot.build(:gestao_de_estoque_movimentacao_do_estoque,
        estoque_id: @estoque.id ,quantidade_entrada: 2)
      @movimentacao.save(validate: false)
    end
    it "Quando transferência está aberta" do
      item = FactoryBot.build(:gestao_de_estoque_item_da_transferencia, item_id: 1,
      transferencia_id: @transferencia.id, quantidade: 1, estoque_id: @estoque.id)
      expect(item.saldo_do_item).to eq 1
    end
    it "Quando transferência não está aberta" do
      @transferencia.status = :recebido
      @transferencia.save(validate: false)
      @transferencia.reload
      item = FactoryBot.build(:gestao_de_estoque_item_da_transferencia, item_id: 1,
      transferencia_id: @transferencia.id, quantidade: 1, estoque_id: @estoque.id)
      expect(item.saldo_do_item).to eq 2
    end
  end
end
