require 'rails_helper'

RSpec.describe GestaoDeEstoque::Transferencia, type: :model do
  it { is_expected.to belong_to(:unidade_orcamentaria) }
  it { is_expected.to belong_to(:unidade_orcamentaria_de_destino).with_foreign_key(:unidade_orcamentaria_de_destino_id)}
  it { is_expected.to belong_to(:almoxarifado) }
  it { is_expected.to belong_to(:almoxarifado_de_destino).with_foreign_key(:almoxarifado_de_destino_id) }
  it { is_expected.to belong_to(:orcamento) }

  it { is_expected.to have_many(:recebimento_de_materiais) }
  it { is_expected.to have_many(:requisicoes_de_materiais) }
  it { is_expected.to have_many(:itens_da_transferencia) }

  [:tipo_de_material , :almoxarifado_id , :almoxarifado_de_destino_id , :unidade_orcamentaria_id,
    :unidade_orcamentaria_de_destino_id, :classificacao_tipo_de_material,
    :data_de_transferencia].each do |atributo|
      it { is_expected.to validate_presence_of(atributo) }
    end

    it { should validate_length_of(:observacao).is_at_most(600) }

  it{ is_expected.to accept_nested_attributes_for(:itens_da_transferencia).allow_destroy(true) }

  context "Gerador do código" do
    it "Quando gera um código" do
      transferencia = FactoryBot.build(:gestao_de_estoque_transferencia, orcamento_id: 1,
          data_de_transferencia: "06/10/2021")
      transferencia.atribui_codigo_disponivel
      expect(transferencia.codigo).to eq "06100001"
    end
  end

  context "Quando transfere todos os itens" do
    it "Quando é selecionado transferir todos os itens" do
      estoque = FactoryBot.build(:gestao_de_estoque_estoque,
        item_id: 1, unidade_de_medida_id: 1,
        almoxarifado_id: 1, unidade_orcamentaria_id: 1)
      transferencia = FactoryBot.build(:gestao_de_estoque_transferencia, orcamento_id: 1,
          data_de_transferencia: "06/10/2021", transferir_todos_os_itens: true,
          almoxarifado_id: estoque.almoxarifado_id,
          unidade_orcamentaria_id: estoque.unidade_orcamentaria_id )
      expect(transferencia.preencher_itens).to be_truthy
    end

    it "Quando não é selecioando transferir todos os itens" do
      transferencia = FactoryBot.build(:gestao_de_estoque_transferencia, orcamento_id: 1,
          data_de_transferencia: "06/10/2021", transferir_todos_os_itens: false)
      expect(transferencia.preencher_itens).to be_falsey
    end
  end

  context "AASM" do
    it "Aberto -> Confirmado" do
      transferencia = FactoryBot.build(:gestao_de_estoque_transferencia)
      expect(transferencia).to transition_from(:aberto).to(:confirmado).on_event(:confirmar_transferencia)
    end
    it "Confirmado -> Recebido" do
      transferencia = FactoryBot.build(:gestao_de_estoque_transferencia, status: :confirmado)
      expect(transferencia).to transition_from(:confirmado).to(:recebido).on_event(:confirmar_recebimento_da_transferencia)
    end
  end
end
