require 'rails_helper'

RSpec.describe GestaoDeEstoque::DevolucaoDeMaterial, type: :model do

  it { is_expected.to belong_to(:requisicao_de_material).class_name("Administrativo::RequisicaoDeMaterial") }
  it { is_expected.to belong_to(:orcamento).class_name("Orcamento") }
  it{ is_expected.to have_many(:itens_das_devolucoes_de_materiais).class_name('GestaoDeEstoque::ItemDaDevolucaoDeMaterial') }

  it { is_expected.to validate_presence_of(:data_da_devolucao) }
  it { is_expected.to validate_presence_of(:tipo_de_devolucao) }

  context "Valida a atualização da requisição da devolução" do
    it "se existe outra devolucao valida parcial" do
      requisicao_de_material = FactoryBot.create(:administrativo_requisicao_de_material, status: :enviado_ao_almoxarifado)
      requisicao_de_material.itens_das_requisicoes_de_materiais.new(FactoryBot.attributes_for(:administrativo_item_da_requisicao_de_material))
      requisicao_de_material.save(validate: false)
      devolucao_de_material = FactoryBot.create(:gestao_de_estoque_devolucao_de_material, requisicao_de_material_id: requisicao_de_material.id, tipo_de_devolucao: :devolucao_parcial)
      devolucao_de_material.itens_das_devolucoes_de_materiais.new(FactoryBot.attributes_for(:gestao_de_estoque_item_da_devolucao_de_material, quantidade_devolvida: 5, item_id: requisicao_de_material.itens_das_requisicoes_de_materiais.last.item_id))
      devolucao_de_material.save
      devolução_de_material_recusada = FactoryBot.create(:gestao_de_estoque_devolucao_de_material, requisicao_de_material_id: requisicao_de_material.id, status: :recusado)

      expect(requisicao_de_material.reload.status).to eq "devolvido_parcialmente_ao_almoxarifado"
    end

    it "se existe devolucao valida total" do
      requisicao_de_material = FactoryBot.create(:administrativo_requisicao_de_material, status: :enviado_ao_almoxarifado)
      requisicao_de_material.itens_das_requisicoes_de_materiais.new(FactoryBot.attributes_for(:administrativo_item_da_requisicao_de_material))
      requisicao_de_material.save(validate: false)
      devolucao_de_material = FactoryBot.create(:gestao_de_estoque_devolucao_de_material, requisicao_de_material_id: requisicao_de_material.id, tipo_de_devolucao: :devolucao_total)
      devolucao_de_material.itens_das_devolucoes_de_materiais.new(FactoryBot.attributes_for(:gestao_de_estoque_item_da_devolucao_de_material, quantidade_devolvida: 10, item_id: requisicao_de_material.itens_das_requisicoes_de_materiais.last.item_id))
      devolucao_de_material.save

      expect(requisicao_de_material.reload.status).to eq "devolvido_ao_almoxarifado"
    end

    context "se não existe outra devolucao valida" do
      it 'requisicao atentida total' do
        requisicao_de_material = FactoryBot.create(:administrativo_requisicao_de_material, status: :enviado_ao_almoxarifado)
        requisicao_de_material.itens_das_requisicoes_de_materiais.new(FactoryBot.attributes_for(:administrativo_item_da_requisicao_de_material))
        requisicao_de_material.save(validate: false)
        devolução_de_material_recusada = FactoryBot.create(:gestao_de_estoque_devolucao_de_material, requisicao_de_material_id: requisicao_de_material.id, status: :recusado)

        expect(requisicao_de_material.reload.status).to eq "atendido"
      end

      it 'requisicao atentida parcial' do
        requisicao_de_material = FactoryBot.create(:administrativo_requisicao_de_material, status: :enviado_ao_almoxarifado)
        requisicao_de_material.itens_das_requisicoes_de_materiais.new(FactoryBot.attributes_for(:administrativo_item_da_requisicao_de_material, quantidade_atendida: 5))
        requisicao_de_material.save(validate: false)
        devolução_de_material_recusada = FactoryBot.create(:gestao_de_estoque_devolucao_de_material, requisicao_de_material_id: requisicao_de_material.id, status: :recusado)

        expect(requisicao_de_material.reload.status).to eq "atendido_parcialmente"
      end
    end
  end
end
