US2009 - ArthurSchiavom/gestao-informacao-chao-de-fabrica--projeto-academico GitHub Wiki

US2009

=======================================

1. Requisitos

Como Gestor de Produção, eu pretendo importar ordens de produção através de um ficheiro CSV.

SSD

2. Análise

Testes unitários

  • O identificador da ordem de produção é único
  • Quantidade a produzir é maior que 0.
  • A data de emissão têm que ser anterior a data prevista de execução
  • As datas não podem estar no futuro

3. Design

Classe do domínio: OrdemProducao Controlador: ImportarOrdemProducaoController Repositório: OrdemProducaoRepository

3.1. Realização da Funcionalidade

SD

3.2 Diagrama de classes

CD

3.3. Padrões Aplicados

  • Command - Para implementar a ação de registar novas categorias
  • Repository Pattern - Para abstrair o sistema de persistência de objetos, facilitando a implementação com diferentes tecnologias
  • Controller - Para separar o layer da interface do layer de domínio, introduzindo então um layer de aplicação encarregue do processamento, mas não responsável por caracterizar o negócio ou interagir com o utilizador.
  • Polymorphism & Template method - Usado na implementação do repositório específico de cada entidade.
  • Liskov Substitution principle & Dependency inversion - Em todas as implementações de interfaces e extensões de classes.
  • Pure fabrication - Controller e UI.
  • Information expert & HC/LC - Sempre presente: cada classe tem uma responsabilidade bem definida, visando a sua independência de outras classes.
  • Singleton - Utilizado na RepositoryFactory
  • Strategy - Caso haja ficheiros diferentes, pode ser aplicado a strategy necessária durante runtime

3.4. Testes

Testes: São explicitos pelo nome dos métodos

package eapli.base.gestaoproducao.ordemProducao.domain;

import eapli.base.gestaoproducao.ordemProducao.application.OrdemProducaoDTO; import org.junit.Test;

import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List;

import static org.junit.Assert.*;

public class OrdemProducaoTest {

OrdemProducao op = new OrdemProducao(new Identificador("dak"), new QuantidadeAProduzir(123), new ArrayList<>(),
        new Date(),
        new Date(), Estado.EM_EXECUCAO);
OrdemProducao op1 = new OrdemProducao(new Identificador("dak"), new QuantidadeAProduzir(1234), new ArrayList<>(),
        new Date(),
        new Date(), Estado.EM_EXECUCAO);
OrdemProducao op2 = new OrdemProducao(new Identificador("dake"), new QuantidadeAProduzir(123), new ArrayList<>(),
        new Date(),
        new Date(), Estado.EM_EXECUCAO);


@Test(expected = IllegalArgumentException.class)
public void testConstructorDataNoFuturo() {
    SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy");
    String s = "12-12-2030";
    Date data;

    try {
        data = sdf.parse(s);
        OrdemProducao op5 = new OrdemProducao(new Identificador("dake"), new QuantidadeAProduzir(123), new ArrayList<>(),
                data,
                new Date(), Estado.EM_EXECUCAO);

    } catch (ParseException e) {
    }
}

@Test(expected = IllegalArgumentException.class)
public void testConstructorQuantidadeNegativa() {
    SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy");
    String s = "12-12-2030";
    Date data;

    try {
        data = sdf.parse(s);
        OrdemProducao op5 = new OrdemProducao(new Identificador("dake"), new QuantidadeAProduzir(-1), new ArrayList<>(),
                new Date(),
                new Date(), Estado.EM_EXECUCAO);

    } catch (ParseException e) {
    }
}

@Test
public void testConstructorDataCorreta() {
    SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy");
    String s = "12-12-2030";
    Date data;

    try {
        data = sdf.parse(s);
        OrdemProducao op5 = new OrdemProducao(new Identificador("dake"), new QuantidadeAProduzir(123), new ArrayList<>(),
                new Date(),
                data, Estado.EM_EXECUCAO);

    } catch (ParseException e) {
    }
}

@Test
public void identityAttributeName() {
    assertEquals("identificador", OrdemProducao.identityAttributeName());
}

@Test
public void identity() {
    assertEquals(op1.identity(), new Identificador("dak"));
}

@Test
public void gerarOrdensProducaoDTO() {
    assertTrue(OrdemProducao.gerarOrdensProducaoDTO(op).information.equals(new OrdemProducaoDTO(op).information));
}

@Test
public void testGerarOrdensProducaoDTO() {
    List<OrdemProducao> ordens = new ArrayList<>();
    ordens.add(op);
    ordens.add(op1);
    ordens.add(op2);

    List<OrdemProducaoDTO> opDTO = OrdemProducao.gerarOrdensProducaoDTO(ordens);
    List<OrdemProducaoDTO> ordensDTO = new ArrayList<>();
    ordensDTO.add(OrdemProducao.gerarOrdensProducaoDTO(op));
    ordensDTO.add(OrdemProducao.gerarOrdensProducaoDTO(op1));
    ordensDTO.add(OrdemProducao.gerarOrdensProducaoDTO(op2));

    int i = 0;
    for (OrdemProducaoDTO o : ordensDTO) {
        assertEquals(ordensDTO.get(i).information, opDTO.get(i).information);
        i++;
    }
}

    @Test(expected = IllegalArgumentException.class)
public void testConstructor(){
    QuantidadeAProduzir qap = new QuantidadeAProduzir(-1);
}

@Test
public void testConstructor2(){
    QuantidadeAProduzir qap = new QuantidadeAProduzir(0);
    QuantidadeAProduzir qap1 = new QuantidadeAProduzir(1);
    QuantidadeAProduzir qap2 = new QuantidadeAProduzir(1000);
}

@Test
public void testEquals() {
    QuantidadeAProduzir qap = new QuantidadeAProduzir(0);
    QuantidadeAProduzir qap2 = new QuantidadeAProduzir(0);
    QuantidadeAProduzir qap1 = new QuantidadeAProduzir(1);
    assertFalse(qap.equals(qap1));
    assertTrue(qap.equals(qap2));
}

@Test
public void compareTo() {
    QuantidadeAProduzir qap = new QuantidadeAProduzir(0);
    QuantidadeAProduzir qap2 = new QuantidadeAProduzir(0);
    QuantidadeAProduzir qap1 = new QuantidadeAProduzir(1);
    assertTrue(qap.compareTo(qap2)==0);
    assertTrue(qap.compareTo(qap1)<0);
}

}

⚠️ **GitHub.com Fallback** ⚠️