require 'rails_helper'

RSpec.describe GestaoDeEstoque::ItemDoRecebimentoDeMaterial, type: :model do
  it { is_expected.to belong_to(:item).class_name('Base::Item') }
  it { is_expected.to belong_to(:unidade_de_medida_de_conversao).class_name('UnidadeDeMedida').with_foreign_key(:unidade_de_medida_de_conversao_id) }
  it { is_expected.to belong_to(:recebimento_de_material).class_name('GestaoDeEstoque::RecebimentoDeMaterial') }

  it { is_expected.to have_many(:movimentacoes_do_estoque) }
  it { is_expected.to have_many(:informacoes_extras) }

  [:item_id, :quantidade, :total, :valor_unitario].each do |atributo|
    it { is_expected.to validate_presence_of(atributo)}
  end

  before(:each) do
    @unidade_orcamentaria = FactoryBot.build(:loa_hgf)
    @unidade_orcamentaria.save(validate: false)
    @almoxarifado = FactoryBot.build(:gestao_de_estoque_almoxarifado)
    @almoxarifado.unidades_orcamentarias_do_almoxarifado.build(unidade_orcamentaria_id: @unidade_orcamentaria.id)
    @almoxarifado.save(validate: false)
    @almoxarifado_de_destino =  FactoryBot.build(:gestao_de_estoque_almoxarifado, nome: "Segundo Almoxarifado")
    @almoxarifado_de_destino.unidades_orcamentarias_do_almoxarifado.build(unidade_orcamentaria_id: @unidade_orcamentaria.id)
    @almoxarifado_de_destino.save(validate: false)
    @empenho = FactoryBot.build(:empenho_22090001)
    @empenho.itens_do_empenho.build(FactoryBot.attributes_for(:item_do_empenho, empenho_id: @empenho.id, quantidade: 100))
    @empenho.save(validate: false)
    @empenho.reload
    @ordem_de_compra = FactoryBot.create(:licitacao_ordem_de_compra, empenho_id: @empenho.id)
    @sub_elemento_de_despesa = FactoryBot.create(:sub_elemento_de_despesa_outros_materiais_de_consumo)
    @recebimento_de_material = FactoryBot.build(:gestao_de_estoque_recebimento_de_material, ordem_de_compra: @ordem_de_compra, almoxarifado: @almoxarifado, unidade_orcamentaria: @unidade_orcamentaria, sub_elemento_de_despesa_id: @sub_elemento_de_despesa.id)
    @recebimento_de_material.save(validate: false)
    @item_da_ordem_de_compra = FactoryBot.create(:licitacao_item_da_ordem_de_compra, ordem_de_compra_id: @ordem_de_compra.id, item_id: @empenho.itens_do_empenho.first.item_id)
    @item_do_recebimento = FactoryBot.build(:gestao_de_estoque_itens_do_recebimento_de_material, quantidade: 10, recebimento_de_material_id: @recebimento_de_material.id, item_id: @empenho.itens_do_empenho.first.item_id)
  end

  context "Quando É necessário Criar um Novo Estoque" do
    it "Quando Almoxarifado é Destino" do
      recebimento_de_material =  FactoryBot.build(:gestao_de_estoque_recebimento_de_material, ordem_de_compra_id: @ordem_de_compra.id, almoxarifado_id: @almoxarifado.id, almoxarifado_de_destino_id: @almoxarifado_de_destino.id, unidade_orcamentaria_id: @unidade_orcamentaria.id, unidade_orcamentaria_de_destino_id: @unidade_orcamentaria.id)
      recebimento_de_material.save(validate: false)

      item_do_recebimento = FactoryBot.build(:gestao_de_estoque_itens_do_recebimento_de_material, recebimento_de_material_id: recebimento_de_material.id, quantidade: 10)
      item_do_recebimento.save(validate: false)

      expect(item_do_recebimento.cria_estoque(true)).to be_truthy
      estoque = GestaoDeEstoque::Estoque.last
      expect(estoque.almoxarifado_id).to be @almoxarifado_de_destino.id
    end
    it "Quando Almoxarifado Não é Destino" do
      recebimento_de_material =  FactoryBot.build(:gestao_de_estoque_recebimento_de_material, ordem_de_compra_id: @ordem_de_compra.id, almoxarifado_id: @almoxarifado.id, unidade_orcamentaria_id: @unidade_orcamentaria.id)
      recebimento_de_material.save(validate: false)

      item_do_recebimento = FactoryBot.build(:gestao_de_estoque_itens_do_recebimento_de_material, recebimento_de_material_id: recebimento_de_material.id, quantidade: 10)
      item_do_recebimento.save(validate: false)
      expect(item_do_recebimento.cria_estoque(false)).to be_truthy

      estoque = GestaoDeEstoque::Estoque.last
      expect(estoque.almoxarifado_id).to be @almoxarifado.id
    end
  end

  context "Válida se quantidade é maior que saldo disponível na ordem de compra" do
    it "Quando o saldo é menor ou igual" do
      @item_do_recebimento.delete
      @recebimento_de_material.reload
      item_do_recebimento = FactoryBot.build(:gestao_de_estoque_itens_do_recebimento_de_material, recebimento_de_material_id: @recebimento_de_material.id, item_id: @item_da_ordem_de_compra.item_id, quantidade: 9)
      item_do_recebimento.validate
      expect(item_do_recebimento.errors[:quantidade]).to_not include "A quantidade informada é maior que saldo disponível"
    end
    it "Quando o saldo é maior" do
      item_do_recebimento = FactoryBot.build(:gestao_de_estoque_itens_do_recebimento_de_material, recebimento_de_material_id: @recebimento_de_material.id, item_id: @item_da_ordem_de_compra.item_id, quantidade: 10)
      item_do_recebimento.validate

      expect(item_do_recebimento.errors[:quantidade]).to include "A quantidade informada é maior que saldo disponível"
    end
  end

  context "Item se deleta se quantidade for igual a 0" do
    before(:each) do
      @item_do_recebimento = FactoryBot.build(:gestao_de_estoque_itens_do_recebimento_de_material)
    end
    it "Quando quantidade é igual a 0" do
      @item_do_recebimento.update_attribute(:quantidade, 0)
      expect(@item_do_recebimento.remover_este_item_se_quantidade_igual_a_zero).to be_truthy
    end
    it "Quando quantidade é maior que 0" do
      @item_do_recebimento.update_attribute(:quantidade, 1)
      expect(@item_do_recebimento.remover_este_item_se_quantidade_igual_a_zero).to be_falsey
    end
  end

  context "Adiciona ou atualiza saldo no estoque" do
    it "Quando não tem estoque (Cria um estoque)" do
      expect(@item_do_recebimento.adiciona_ou_atualiza_saldo_no_estoque).to be_truthy
    end
    it "Quando tem estoque (Atuliza o saldo do mesmo)" do
      @item_do_recebimento.update_attribute(:quantidade, 10)
      estoque = FactoryBot.create(:gestao_de_estoque_estoque, :estoque_sem_movimentacao, item_id: @item_do_recebimento.item_id, unidade_de_medida_id: @item_do_recebimento.item.unidade_de_medida_id, almoxarifado_id: @almoxarifado.id, unidade_orcamentaria_id: @unidade_orcamentaria.id, sub_elemento_de_despesa_id: @recebimento_de_material.sub_elemento_de_despesa_id)
      @item_do_recebimento.adiciona_ou_atualiza_saldo_no_estoque
      estoque.reload
      expect(estoque.saldo_da_ordem_de_compra).to eq 10
    end
  end

  context "Cria movimentação do estoque" do
    it "Quando tem um estoque" do
      recebimento_de_material = FactoryBot.build(:gestao_de_estoque_recebimento_de_material, almoxarifado_id: @almoxarifado.id, unidade_orcamentaria_id: @unidade_orcamentaria.id, ordem_de_compra: @ordem_de_compra)
      recebimento_de_material.save(validate: false)

      @item_do_recebimento.update_attribute(:recebimento_de_material_id, recebimento_de_material.id)

      estoque = FactoryBot.create(:gestao_de_estoque_estoque, item_id: @item_do_recebimento.item_id, unidade_de_medida_id: @item_do_recebimento.item.unidade_de_medida_id, almoxarifado_id: @almoxarifado.id, unidade_orcamentaria_id: @unidade_orcamentaria.id)
      expect(@item_do_recebimento.adiciona_movimentacao_no_estoque(estoque)).to be_truthy
    end
    it "Quando não tem estoque" do
      expect(@item_do_recebimento.adiciona_movimentacao_no_estoque(nil)).to be_falsey
    end
  end

  context "Possui classificação" do
    it "Quando recebimento possui classificação" do
      @recebimento_de_material.update_attribute(:classificacao, :doacao)
      expect(@item_do_recebimento.possui_classificacao?).to be_truthy
    end
    it "Quando recebimento não possui classificação" do
      expect(@item_do_recebimento.possui_classificacao?).to be_falsey
    end
  end

  context "Possui saldo disponivel" do
    before(:each) do
      estoque = FactoryBot.create(:gestao_de_estoque_estoque, item_id: @item_do_recebimento.item_id, unidade_de_medida_id: @item_do_recebimento.item.unidade_de_medida_id, almoxarifado_id: @almoxarifado.id, unidade_orcamentaria_id: @unidade_orcamentaria.id, sub_elemento_de_despesa_id: @recebimento_de_material.sub_elemento_de_despesa_id)
      FactoryBot.build(:gestao_de_estoque_movimentacao_do_estoque, estoque_id: estoque.id, quantidade_entrada: 10).save(validate: false)
    end
    it "Quando possui uma classificação" do
      @recebimento_de_material.update_attribute(:classificacao, :doacao)
      expect(@item_do_recebimento.possui_saldo_disponivel?).to be_truthy
    end
    it "Quando possui uma ordem de compra" do
      expect(@item_do_recebimento.possui_saldo_disponivel?).to be_truthy
    end
    it "Quando não possui nem classificação e nem ordem de compra" do
      @recebimento_de_material.update_attribute(:ordem_de_compra_id, nil)
      @recebimento_de_material.update_attribute(:classificacao, nil)
      expect(@item_do_recebimento.possui_saldo_disponivel?).to be_falsey
    end
  end

  context "Saldo do estoque" do
    it "Quando tem um estoque com movimentação" do
      estoque = FactoryBot.create(:gestao_de_estoque_estoque, :estoque_sem_movimentacao, item_id: @item_do_recebimento.item_id, unidade_de_medida_id: @item_do_recebimento.item.unidade_de_medida_id, almoxarifado_id: @almoxarifado.id, unidade_orcamentaria_id: @unidade_orcamentaria.id, sub_elemento_de_despesa_id: @recebimento_de_material.sub_elemento_de_despesa_id)
      FactoryBot.build(:gestao_de_estoque_movimentacao_do_estoque, estoque_id: estoque.id, quantidade_entrada: 10).save(validate: false)

      expect(@item_do_recebimento.saldo_do_estoque).to eq 20
    end
    it "Quando não tem um estoque" do
      expect(@item_do_recebimento.saldo_do_estoque).to eq 10
    end
    it "Quando não tem quantidade" do
      @item_do_recebimento.update_attribute(:quantidade, nil)
      expect(@item_do_recebimento.saldo_do_estoque).to eq 0
    end
  end

  context "Código e descrição com unidade de medida" do
    it "Quando tem o item para coletar o texto" do
      recebimento_de_material = FactoryBot.build(:gestao_de_estoque_recebimento_de_material, ordem_de_compra: @ordem_de_compra, almoxarifado_id: @almoxarifado.id, unidade_orcamentaria_id: @unidade_orcamentaria.id)
      recebimento_de_material.save(validate: false)

      item_do_recebimento = FactoryBot.build(:gestao_de_estoque_itens_do_recebimento_de_material, recebimento_de_material_id: recebimento_de_material.id)
      expect(item_do_recebimento.codigo_e_descricao_com_unidade_de_medida_especifica).to eq "#{item_do_recebimento.item.codigo_e_descricao} -  (#{item_do_recebimento.item.unidade_de_medida.descricao})"
    end
    it "Quando não tem o item para coltar o texto" do
      item_do_recebimento = FactoryBot.build(:gestao_de_estoque_itens_do_recebimento_de_material, recebimento_de_material: @recebimento_de_material, item_id: nil)
      expect(item_do_recebimento.codigo_e_descricao_com_unidade_de_medida_especifica).to eq " -  ()"
    end
  end

  context "Código e descrição com unidade de medida destacada" do
    it "Quando tem item para coletar o texto" do
      item_do_recebimento = FactoryBot.build(:gestao_de_estoque_itens_do_recebimento_de_material, recebimento_de_material: @recebimento_de_material)
      expect(item_do_recebimento.codigo_e_descricao_com_unidade_de_medida_especifica_destacada).to eq "#{item_do_recebimento.item.codigo_e_descricao} <strong>(#{item_do_recebimento.item.unidade_de_medida.descricao})</strong>"
    end
    it "Quando não tem item para coletar o texto" do
      item_do_recebimento = FactoryBot.build(:gestao_de_estoque_itens_do_recebimento_de_material, item_id: nil, recebimento_de_material: @recebimento_de_material)
      expect(item_do_recebimento.codigo_e_descricao_com_unidade_de_medida_especifica_destacada).to eq " <strong>()</strong>"
    end
  end

  context "Retorna unidade de medida ou unidade de medida de conversão" do
    it "Quando possui unidade de medida de conversão" do
      unidade_de_medida = FactoryBot.create(:unidade_de_medida)
      item_do_recebimento = FactoryBot.build(:gestao_de_estoque_itens_do_recebimento_de_material, recebimento_de_material: @recebimento_de_material, unidade_de_medida_de_conversao_id: unidade_de_medida.id)
      expect(item_do_recebimento.retorna_unidade_de_medida_ou_conversao).to eq unidade_de_medida
    end
    it "Quando não possui unidade de medida de conversão" do
      item_do_recebimento = FactoryBot.build(:gestao_de_estoque_itens_do_recebimento_de_material, recebimento_de_material: @recebimento_de_material)
      expect(item_do_recebimento.retorna_unidade_de_medida_ou_conversao).to eq item_do_recebimento.item.unidade_de_medida
    end
    it "Quando não possui unidade de medida ou unidade de conversão" do
      item_do_recebimento = FactoryBot.build(:gestao_de_estoque_itens_do_recebimento_de_material, recebimento_de_material: @recebimento_de_material, item_id: nil)
      expect(item_do_recebimento.retorna_unidade_de_medida_ou_conversao).to be_falsey
    end
  end

  context "Retorna quantidade ou quantidade de conversão" do
    it "Quando possui quantidade de conversão" do
      unidade_de_medida = FactoryBot.create(:unidade_de_medida)
      item_do_recebimento = FactoryBot.build(:gestao_de_estoque_itens_do_recebimento_de_material, recebimento_de_material: @recebimento_de_material, quantidade_de_conversao: 20, unidade_de_medida_de_conversao_id: unidade_de_medida.id)
      expect(item_do_recebimento.retorna_quantidade_ou_quantidade_de_conversao).to eq 20
    end
    it "Quando não possui quantidade de conversão" do
      item_do_recebimento = FactoryBot.build(:gestao_de_estoque_itens_do_recebimento_de_material, recebimento_de_material: @recebimento_de_material, quantidade: 10)
      expect(item_do_recebimento.retorna_quantidade_ou_quantidade_de_conversao).to eq 10
    end
    it "Quando não possui quantidade ou quantidade de conversão" do
      item_do_recebimento = FactoryBot.build(:gestao_de_estoque_itens_do_recebimento_de_material, recebimento_de_material: @recebimento_de_material, quantidade: nil, quantidade_de_conversao: nil)
      expect(item_do_recebimento.retorna_quantidade_ou_quantidade_de_conversao).to eq 0
    end
  end

  context "Quantidade total disponivel na ordem de compra" do
    it "Quando tem ordem de compra com saldo disponivel" do
      recebimento_de_material = FactoryBot.build(:gestao_de_estoque_recebimento_de_material, ordem_de_compra: @ordem_de_compra)
      recebimento_de_material.save(validate: false)

      item_da_ordem_de_compra = recebimento_de_material.ordem_de_compra.itens_da_ordem_de_compra.last
      item_da_ordem_de_compra.update_attribute(:quantidade, 10)

      item_do_recebimento = FactoryBot.build(:gestao_de_estoque_itens_do_recebimento_de_material, recebimento_de_material_id: recebimento_de_material.id, item_id: item_da_ordem_de_compra.item_id)
      expect(item_do_recebimento.quantidade_total_disponivel_da_ordem_de_compra).to eq 10
    end
    it "Quando não tem ordem de compra" do
      recebimento_de_material = FactoryBot.build(:gestao_de_estoque_recebimento_de_material, ordem_de_compra: @ordem_de_compra)
      recebimento_de_material.save(validate: false)
      recebimento_de_material.update_attribute(:ordem_de_compra_id, nil)

      item_do_recebimento = FactoryBot.build(:gestao_de_estoque_itens_do_recebimento_de_material, recebimento_de_material_id: recebimento_de_material.id)
      expect(item_do_recebimento.quantidade_total_disponivel_da_ordem_de_compra).to eq 0
    end
  end

  context "Quantidade total do item na ordem de compra" do
    it "Quando tem ordem de compra com saldo disponivel" do
      recebimento_de_material = FactoryBot.build(:gestao_de_estoque_recebimento_de_material, ordem_de_compra: @ordem_de_compra)
      recebimento_de_material.save(validate: false)

      item_da_ordem_de_compra = FactoryBot.build(:licitacao_item_da_ordem_de_compra, ordem_de_compra_id: recebimento_de_material.ordem_de_compra_id, quantidade: 9)
      item_da_ordem_de_compra.save(validate: false)

      item_do_recebimento = FactoryBot.build(:gestao_de_estoque_itens_do_recebimento_de_material, recebimento_de_material_id: recebimento_de_material.id, item_id: item_da_ordem_de_compra.item_id)
      expect(item_do_recebimento.quantidade_total_do_item_na_ordem_de_compra).to eq 9
    end
    it "Quando não tem ordem de compra" do
      recebimento_de_material = FactoryBot.build(:gestao_de_estoque_recebimento_de_material, ordem_de_compra: @ordem_de_compra)
      recebimento_de_material.save(validate: false)
      recebimento_de_material.update_attribute(:ordem_de_compra_id, nil)

      item_do_recebimento = FactoryBot.build(:gestao_de_estoque_itens_do_recebimento_de_material, recebimento_de_material_id: recebimento_de_material.id)
      expect(item_do_recebimento.quantidade_total_do_item_na_ordem_de_compra).to eq 0
    end
  end

  context "Valor total na ordem de compra" do
    it "Quando tem ordem de compra com saldo disponivel" do
      recebimento_de_material = FactoryBot.build(:gestao_de_estoque_recebimento_de_material, ordem_de_compra: @ordem_de_compra)
      recebimento_de_material.save(validate: false)

      item_da_ordem_de_compra = recebimento_de_material.ordem_de_compra.itens_da_ordem_de_compra.last
      item_da_ordem_de_compra.update_attribute(:total, 10)

      item_do_recebimento = FactoryBot.build(:gestao_de_estoque_itens_do_recebimento_de_material, recebimento_de_material_id: recebimento_de_material.id, item_id: item_da_ordem_de_compra.item_id)
      expect(item_do_recebimento.valor_total_disponivel_da_ordem_de_compra).to eq 10
    end
    it "Quando não tem ordem de compra" do
      recebimento_de_material = FactoryBot.build(:gestao_de_estoque_recebimento_de_material, ordem_de_compra: @ordem_de_compra)
      recebimento_de_material.save(validate: false)
      recebimento_de_material.update_attribute(:ordem_de_compra_id, nil)

      item_do_recebimento = FactoryBot.build(:gestao_de_estoque_itens_do_recebimento_de_material, recebimento_de_material_id: recebimento_de_material.id)
      expect(item_do_recebimento.valor_total_disponivel_da_ordem_de_compra).to eq 0
    end
  end

  context "Saldo atual da ordem de compra do estoque" do
    before(:each) do
      @item_do_recebimento = FactoryBot.build(:gestao_de_estoque_itens_do_recebimento_de_material, recebimento_de_material_id: @recebimento_de_material.id)
    end
    it "Quando tem estoque" do
      FactoryBot.create(:gestao_de_estoque_estoque, item_id: @item_do_recebimento.item_id, unidade_de_medida_id: @item_do_recebimento.item.unidade_de_medida_id, almoxarifado_id: @almoxarifado.id, unidade_orcamentaria_id: @unidade_orcamentaria.id, saldo_da_ordem_de_compra: 10, sub_elemento_de_despesa_id: @recebimento_de_material.sub_elemento_de_despesa_id)
      expect(@item_do_recebimento.saldo_atual_da_ordem_de_compra).to eq 10
    end
    it "Quando não tem estoque" do
      expect(@item_do_recebimento.saldo_atual_da_ordem_de_compra).to eq 0
    end
  end

  context "Saldo atual da ordem de compra em valor untiario" do
    before(:each) do
      @item_do_recebimento = FactoryBot.build(:gestao_de_estoque_itens_do_recebimento_de_material, recebimento_de_material_id: @recebimento_de_material.id , valor_unitario: 10)
    end
    it "Quando tem estoque" do
      FactoryBot.create(:gestao_de_estoque_estoque, item_id: @item_do_recebimento.item_id, unidade_de_medida_id: @item_do_recebimento.item.unidade_de_medida_id, almoxarifado_id: @almoxarifado.id, unidade_orcamentaria_id: @unidade_orcamentaria.id, saldo_da_ordem_de_compra: 10, sub_elemento_de_despesa_id: @recebimento_de_material.sub_elemento_de_despesa_id)
      expect(@item_do_recebimento.saldo_atual_em_valor_da_ordem_de_compra).to eq 100
    end
    it "Quando não tem estoque" do
      expect(@item_do_recebimento.saldo_atual_em_valor_da_ordem_de_compra).to eq 0
    end
  end

  context "Retorna saldo total do estoque" do
    it "Quando tem estoque" do
        estoque = FactoryBot.create(:gestao_de_estoque_estoque, :estoque_sem_movimentacao, item_id: @item_do_recebimento.item_id, unidade_de_medida_id: @item_do_recebimento.item.unidade_de_medida_id, almoxarifado_id: @almoxarifado.id, unidade_orcamentaria_id: @unidade_orcamentaria.id, sub_elemento_de_despesa_id: @recebimento_de_material.sub_elemento_de_despesa_id)

        FactoryBot.build(:gestao_de_estoque_movimentacao_do_estoque, estoque_id: estoque.id, quantidade_entrada: 10).save(validate: false)
        expect(@item_do_recebimento.saldo_atual_do_recebimento_de_material).to eq 10
    end
    it "Quando não tem estoque" do
      expect(@item_do_recebimento.saldo_atual_do_recebimento_de_material).to eq 0
    end
  end

  describe "#valida_quantidade_informacoes_extras" do
    before(:each) do
      @item_do_recebimento.save(validate: false)
    end
    context "Quando tem informação extra e a soma não bate com a quantidade do item" do
      it "Retorna o error" do
        FactoryBot.create(:gestao_de_estoque_informacao_extra, item_do_recebimento_de_material_id: @item_do_recebimento.id, quantidade: 0)
        @item_do_recebimento.reload

        @item_do_recebimento.validate
        expect(@item_do_recebimento.errors[:base]).to include("A soma das quantidades deve ser igual a #{@item_do_recebimento.quantidade}")
      end
    end

    context "Quando tem informação extra e a soma bate com a quantidade do item" do
      it "Não retorna o error" do
        FactoryBot.create(:gestao_de_estoque_informacao_extra, item_do_recebimento_de_material_id: @item_do_recebimento.id, quantidade: @item_do_recebimento.quantidade)
        @item_do_recebimento.reload

        @item_do_recebimento.validate
        expect(@item_do_recebimento.errors[:base]).to_not include("A soma das quantidades deve ser igual a #{@item_do_recebimento.quantidade}")

      end
    end
  end

  describe "#busca_ou_cria_sub_estoque_por_validade" do
    context "Quando ja existe um sub estoque" do
      it "incrementa o saldo" do
        estoque = FactoryBot.create(:gestao_de_estoque_estoque, :estoque_com_sub_estoque)
        sub_estoque = estoque.sub_estoques_por_validade.last
        sub_estoque.update_attribute(:quantidade, 5)
        sub_estoque.update_attribute(:validade, Date.today)

        @item_do_recebimento.update_attribute(:quantidade, 10)
        FactoryBot.create(:gestao_de_estoque_informacao_extra, quantidade: 10, item_do_recebimento_de_material_id: @item_do_recebimento.id, validade: Date.today)
        @item_do_recebimento.reload
        @item_do_recebimento.busca_ou_cria_sub_estoque_por_validade(estoque)

        expect(sub_estoque.reload.quantidade).to eq 15
      end
    end
    context "Quando nao existe um sub estoque" do
      it "cria um novo sub estoque com saldo atual da informacao extra" do
        estoque = FactoryBot.create(:gestao_de_estoque_estoque, :estoque_com_sub_estoque)

        @item_do_recebimento.update_attribute(:quantidade, 10)
        FactoryBot.create(:gestao_de_estoque_informacao_extra, quantidade: 7, item_do_recebimento_de_material_id: @item_do_recebimento.id, validade: Date.today)
        @item_do_recebimento.reload
        @item_do_recebimento.busca_ou_cria_sub_estoque_por_validade(estoque)
        expect(GestaoDeEstoque::InformacaoExtra.last.quantidade).to eq 7
      end
    end
  end

end
