/rover-test

Primary LanguageTypeScript

Descrição

O objetivo desse projeto é calcular hipoteticamente a posição final de rovers em determinados platôs. Para isso deve-se considerar como entrada um arquivo de texto no seguinte padrão:

Linha 1: Dimensão do platô. Exemplo: 5 5 (Significa nos eixos x e y o platô tem de 0 a 5 unidades de espaço).

Linha 2: A coordenada inicial do rover + direção representado pela inicial de um dos pontos cardeais em inglês. Exemplo: 1 2 N (Significa que o rover inicia no eixo x na unidade 1 e no eixo y na unidade 2, com direção para o Norte).

Linha 3: Os movimentos que o rover fará, sendo M para indicar que o rover deve se mover uma posição na direção em que está, L e R para indicar uma rotação de 90º para a esquerda ou direita, respectivamente. Exemplo: MLMRMM.

É possível adicionar quantos rovers forem desejados seguindo as orientações das linhas 2 e 3 sequencialmente (respeitando o limite máximo de tamanho de arquivo configurado).

A estrutura de pastas adotada é uma adaptação da proposta padrão do próprio framework (Nestjs) com adição de algumas boas práticas de separação em camadas. Nesse caso, o diretório common sendo o módulo comum que contém arquivos de configuração para configurações adicionais como cors e swagger. Já o diretório rover sendo o módulo que contém as camadas de domínio, de infraestrutura e de aplicação da entidade rover, contendo as entidades que fazem sentido para este domínio com seus atributos e comportamentos (modelos não anêmicos), os dtos necessários, mappers para algumas estruturas, a camada de infraestrutura que nesse caso é representada pelo controller que possui o ponto de entrada mapeado (endpoint) e a camada de aplicação representada pelo serviço ou caso de uso. Por fim, foi separado no diretório test ( ao lado do src) tudo o que era relacionado a testes e a execução dos mesmos.

Instalação

Para instalar as dependências basta executar:

$ yarn

Executando a aplicação

É possível executar a aplicação de duas maneiras diferentes.

A primeira e mais comum, é executando algum dos comandos abaixo:

# desenvolvimento
$ yarn start

# mode observador
$ yarn start:dev

# produção
$ yarn start:prod

A segunda é através de um container configurado apenas para desenvolvimento e com reload automático sempre que algum dos arquivos observados é salvo. Para isso basta executar:

$ docker-compose up
# ou
$ docker-compose up -d

Documentação

Uma vez que a aplicação estiver executando é possível fazer as chamadas HTTP diretamente para ela. Caso prefira uma outra abordagem, foi configurado junto da aplicação uma documentação swagger, nesse caso basta acessar http://localhost:3333/api e a página será carregada contendo os recursos adicionados.

OBS: Arquivos que podem ser usados como teste podem ser encontrados em /test/mocks.

Testes

Foram feitos dois tipos de testes automatizados, de unidade e de integração (que por convenção do framework utilizado é chamado de e2e).

O propósito do teste unitário é testar o serviço ou caso de uso passando por todos os fluxos e linhas do arquivo validando o funcionamento correto em cenários de sucesso e de exceção.

Já o propósito do teste de integração ou e2e é validar o método HTTP, o endpoint utilizado e as entradas de dados. Por exemplo, foram feitas validações de tamanho e tipo de arquivo de entrada que são validados nesses testes.

Para executar os testes basta executar:

$ yarn test