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.
Para instalar as dependências basta executar:
$ yarn
É 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
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
.
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