Boas-vindas ao repositorio do projeto Zoo Functions!
Para realizar o projeto, atente-se a cada passo descrito a seguir, e se tiver qualquer duvida, nos envie por Slack! #vqv
Aqui voce vai encontrar os detalhes de como estruturar o desenvolvimento do seu projeto a partir deste repositorio, utilizando uma branch especifica e um Pull Request para colocar seus codigos.
Termos e acordos
Ao iniciar este projeto, voce concorda com as diretrizes do Codigo de Conduta e do Manual da Pessoa Estudante da Trybe.
Entregaveis
Como entregar
Para entregar o seu projeto voce devera criar um Pull Request neste repositorio.
Lembre-se que voce pode consultar nosso conteudo sobre Git & GitHub e nosso Blog - Git & GitHub sempre que precisar!
O que devera ser desenvolvido
Sabendo das suas habilidades com ES6, Higher Order Functions e testes, a prefeitura da cidade te deu uma importante missao: organizar as informacoes do zoologico!
Voce vai ser responsavel por desenvolver funcoes que buscam informacoes sobre os animais do zoologico como: especie e local de origem. Alem disso, voce tambem vai buscar dados sobre as pessoas que colaboram com a manutencao e cuidado do zoologico.
E nao para por ai!
Voce ja aprendeu sobre a importancia de ter uma mentalidade orientada a testes, nao e mesmo? E tambem ja sabe como a implementacao de testes contribui para a escrita de codigos mais confiaveis e com boa performance.
A sequencia dos requisitos desse projeto foi disposta de forma a te proporcionar a experiencia de entender na pratica como o desenvolvimento orientado a testes ajuda a garantir um codigo de qualidade. Para isso, voce vai implementar testes para funcoes ja existentes, percebendo os casos de uso da sua aplicacao e garantindo que ela esta funcionando da maneira correta!
Data de Entrega
-
Este projeto e individual
-
Sao
4dias de projeto -
Data para entrega final do projeto:
03/06/2022 14:00
Orientacoes
!! Antes de comecar a desenvolver
-
Clone o repositorio
- Use o comando:
git clone git@github.com:tryber/sd-022-b-project-zoo-functions.git
- Use o comando:
-
Entre na pasta do repositorio que voce acabou de clonar:
cd sd-022-b-project-zoo-functions
-
Instale as dependencias
- Para isso, use o seguinte comando:
npm install
- Para isso, use o seguinte comando:
-
Crie uma branch a partir da branch
main- Verifique se voce esta na branch
main- Exemplo:
git branch
- Exemplo:
- Se nao estiver, mude para a branch
main- Exemplo:
git checkout main
- Exemplo:
- Agora, crie uma branch para qual voce vai submeter os
commitsdo seu projeto:- Voce deve criar uma branch no seguinte formato:
nome-de-usuario-nome-do-projeto - Exemplo:
git checkout -b luiza-zoo-functions-project
- Voce deve criar uma branch no seguinte formato:
- Verifique se voce esta na branch
-
Adicione as mudancas ao stage do Git e faca um
commit-
Verifique que as mudancas ainda nao estao no stage
- Exemplo:
git status(os arquivos no diretoriosrcdevem aparecer em vermelho)
- Exemplo:
-
Adicione o novo arquivo ao stage do Git
- Exemplo:
git add .(adicionando todas as mudancas - que estavam em vermelho - ao stage do Git) git status(deve aparecer listado os arquivos do diretoriosrcem verde)
- Exemplo:
-
Faca o
commitinicial- Exemplo:
git commit -m 'iniciando o projeto. VAMOS COM TUDO :rocket:'(fazendo o primeiro commit)
- Exemplo:
-
git status(deve aparecer uma mensagem tipo nothing to commit )
-
-
Adicione a sua branch com o novo
commitao repositorio remoto- Usando o exemplo anterior:
git push -u origin luiza-zoo-functions-project
- Usando o exemplo anterior:
-
Crie um novo
Pull Request(PR)- Va ate a pagina de Pull Requests do repositorio no GitHub
- Clique no botao verde "New pull request"
- Clique na caixa de selecao "Compare" e escolha a sua branch com atencao
- Coloque um titulo para o seu Pull Request
- Exemplo: "Cria tela de busca"
- Clique no botao verde "Create pull request"
- Adicione uma descricao para o Pull Request e clique no botao verde "Create pull request"
- Nao se preocupe em preencher mais nada por enquanto!
- Volte ate a pagina de Pull Requests do repositorio e confira que o seu Pull Request esta criado.
Durante o desenvolvimento
-
Faca
commitsdas alteracoes que voce fizer no codigo regularmente; -
Lembre-se de sempre apos um (ou alguns)
commitsatualizar o repositorio remoto; -
Os comandos que voce utilizara com mais frequencia sao:
-
git status(para verificar o que esta em vermelho - fora do stage - e o que esta em verde - no stage); -
git add(para adicionar arquivos ao stage do Git); -
git commit(para criar um commit com os arquivos que estao no stage do Git); -
git push -u origin nome-da-branch(para enviar o commit para o repositorio remoto na primeira vez que fizer opushde uma nova branch); -
git push(para enviar o commit para o repositorio remoto apos o passo anterior).
Depois de terminar o desenvolvimento (opcional)
Para sinalizar que o seu projeto esta pronto para o 'Code Review' dos seus colegas, faca o seguinte:
-
Va ate a pagina DO SEU Pull Request, adicione a label de 'code-review' e marque seus colegas:
-
No menu a direita, clique no link 'Labels' e escolha a label code-review;
-
No menu a direita, clique no link 'Assignees' e escolha o seu usuario;
-
No menu a direita, clique no link 'Reviewers' e digite
students, selecione o timetryber/students-sd-022-b.
Caso tenha alguma duvida, aqui tem um video explicativo.
Revisando um pull request
Use o conteudo sobre Code Review para te ajudar a revisar os Pull Requests.
Linter
Usaremos o ESLint para fazer a analise estatica do seu codigo.
Para garantir a qualidade do codigo, vamos utilizar neste projeto o ESLint. Assim o codigo estara alinhado com as boas praticas de desenvolvimento, sendo mais legivel e de facil manutencao!
Para poder rodar o ESLint certifique-se de ter executado o comando npm install dentro do projeto.
Para roda-los localmente no projeto, execute os comandos abaixo:
Se a analise do ESLint encontrar problemas no seu codigo, tais problemas serao mostrados no seu terminal. Se nao houver problema no seu codigo, nada sera impresso no seu terminal.
Voce pode tambem instalar o plugin do ESLint no VSCode. Para isso, basta fazer o download do plugin ESLint e instala-lo.
Em caso de duvidas, confira o material na plataforma sobre ESLint e Stylelint.
Testes
Para que os testes sejam executados localmente, verifique se a versao do node na sua maquina e a 16:
Caso a versao seja diferente, voce pode utilizar o nvm para trocar de versao com o seguinte comando:
Caso voce nao tenha o nvm instalado na sua maquina, voce pode consultar o conteudo para instalacao do nvm
Todos os requisitos do projeto serao testados automaticamente por meio do Jest.
Para testar todas funcoes no terminal, basta executar o comando abaixo:
Caso queira testar apenas uma funcao rode o comando abaixo:
Por exemplo:
Cobertura de testes
Nesse projeto voce precisara implementar testes para duas funcoes ja criadas: handlerElephants e getOpeningHours.
Essa cobertura avalia a eficacia dos testes implementados de acordo com os requisitos, determinando se cobrem o que foi pedido ou nao.
Conforme voce for realizando os testes do projeto, a porcentagem da cobertura total ira aumentar. Para cada requisito de teste, sera avaliada uma porcentagem de cobertura.
Para executar e acompanhar a implementacao da sua cobertura de testes, rode o comando abaixo:
Ao executar o comando voce vai ter um resultado similar a este:
Neste projeto iremos focar na cobertura de statements (ou seja, as instrucoes em JavaScript). Sera avaliada a porcentagem de cobertura das instrucoes das funcoes, conforme destacado na figura abaixo:
Alem disso, a tabela tambem vai mostrar quais linhas ainda nao cobertas por testes. Ou seja, quando nao existe caso de teste que execute aquela instrucao.
Verifique com npm test se todos os itens da cobertura dos testes estao passando corretamente.
Ao rodar o comando de cobertura de teste, a pasta coverage sera criada, com um arquivo index.html. Este arquivo apresenta um relatorio da analise de cobertura. Neste relatorio e possivel visualizar quais linhas nao estao sendo cobertas pelos testes.
Estrutura do projeto
Na pasta raiz do projeto, temos as pastas src, test, evaluator e data.
A pasta src e composta por arquivos referentes a cada uma das funcoes que voce ira implementar, a pasta data contem o arquivo zoo_data.js, que armazena os dados que voce vai utilizar para retornar as informacoes sobre o zoologico.
Este projeto possui tambem alguns requisitos para a implementacao de testes. A pasta test, contem os arquivos em que voce implementara os testes unitarios correspondentes a cada funcao, o nome do arquivo e o nome da funcao alvo acrescido do sufixo .test.js.
Por exemplo: o arquivo src/getOpeningHours.js contera a implementacao da funcao getOpeningHours e o arquivo test/getOpeningHours.test.js deve conter os testes que voce vai desenvolver referentes a ela.
A pasta evaluator possui os testes automatizados que avaliarao o seu projeto; os conteudos desta pasta nao devem ser alterados.
O arquivo zoo_data.js contem um objeto no seguinte formato:
species: [
{
id: lionId,
name: 'lions',
popularity: 4,
location: 'NE',
availability: ['Tuesday', 'Thursday', 'Saturday', 'Sunday'],
residents: [
{
name: 'Zena',
sex: 'female',
age: 12,
}
],
}
],
employees: [
{
id: 'c5b83cb3-a451-49e2-ac45-ff3f54fbe7e1',
firstName: 'Nigel',
lastName: 'Nelson',
managers: [burlId, olaId],
responsibleFor: [lionId, tigersId],
}
],
hours: {
Tuesday: { open: 8, close: 6 },
Wednesday: { open: 8, close: 6 },
Thursday: { open: 10, close: 8 },
Friday: { open: 10, close: 8 },
Saturday: { open: 8, close: 10 },
Sunday: { open: 8, close: 8 },
Monday: { open: 0, close: 0 },
},
prices: {
adult: 49.99,
senior: 24.99,
child: 20.99,
},
}
O array species guarda as informacoes de cada especie do zoologico
| Chave | Descricao |
|---|---|
id |
e o identificador da especie |
name |
e o nome da especie, por exemplo, lions |
popularity |
e o popularidade daquela especie |
location |
e a regiao que a especie do animal veio, pode ter os seguintes valores: - NE: nordeste; - NW: noroeste; - SE: sudeste; - SW: sudoeste. |
availability |
e a disponibilidade de visitacao dos animais dessa especie |
residents |
sao as informacoes dos animais daquela especie que residem no zoologico, onde: - name: e o nome do animal, por exemplo 'Zena'; - sex: e o sexo do animal, por exemplo: 'female' (femea); - age: e a idade do animal. |
O array employees e onde ficam as informacoes de cada pessoa colaboradora
| Chave | Descricao |
|---|---|
id |
e o identificador dessa pessoa |
firstName |
e o primeiro nome dessa pessoa |
lastName |
e o ultimo nome dessa pessoa |
managers |
sao os ids das liderancas dessa pessoa |
responsibleFor |
sao os ids das especies que essa pessoa e responsavel |
O objeto hours guarda as informacoes sobre o horarios de funcionamento do zoologico
| Chave | Descricao |
|---|---|
TuesdayWednesdayThursdayFridaySaturdaySundayMonday |
sao os dias da semana: - open: e o horario que o zoologico abre; - close: e o horario que o zoologico fecha. |
O objeto prices e responsavel por guardar as informacoes sobre o valor da entrada do zoologico
| Chave | Descricao |
|---|---|
adult |
e o preco para adultos |
senior |
e o preco para idosos |
child |
e o preco para criancas |
Todos os arquivos estritamente necessarios para finalizar o projeto ja estao criados, nao sendo necessaria a criacao de outros arquivos.
O que voce deve desenvolver
Voce deve complementar as funcoes criadas dentro da pasta src e devera criar testes para as funcoes ja prontas handlerElephants e getOpeningHours.
Dica
Ao trabalhar com desenvolvimento, voce vai se deparar com varios tipos de desafios, por isso e muito importante que os problemas sejam quebrados em partes menores, para que sejam resolvidos aos poucos. Isso vai te ajudar a encontrar uma solucao de maneira mais facil. Dessa forma, um bom jeito de comecar a desenvolver um projeto e lembrar que as funcoes sao compostas por pequenos blocos de logica que tem um objetivo especifico.
Nao se esqueca de verificar o que cada parte do seu codigo retorna! Voce pode fazer isso utilizando o console.log, que e um otimo aliado na visualizacao do seu codigo!
Nos de feedbacks sobre o projeto!
Ao finalizar e submeter o projeto, nao se esqueca de avaliar sua experiencia preenchendo o formulario. Leva menos de 3 minutos!
Compartilhe seu portfolio!
Voce sabia que o LinkedIn e a principal rede social profissional e compartilhar o seu aprendizado la e muito importante para quem deseja construir uma carreira de sucesso? Compartilhe esse projeto no seu LinkedIn, marque o perfil da Trybe (@trybe) e mostre para a sua rede toda a sua evolucao.
Requisitos Obrigatorios
1. Implemente a funcao getSpeciesByIds
Busque as especies dos animais por meio de um id e retorne um array contendo todos os animais dessa especie.
-
Faca com que a funcao
getSpeciesByIdspossa receber varios parametros; -
Retorne um array vazio se a funcao nao receber um
id; -
Retorne as seguintes informacoes do arquivo
data:-
Se a funcao receber apenas um
id, retorne a especie do animal referente a esteid; -
Se a funcao receber varios
ids, retorne todas as especies referente a essesids.
-
O que sera testado:
-
Caso receba nenhum parametro, e necessario retornar um array vazio;
-
Ao receber como parametro um unico
id, retorna um array com a especie referente a esseid; -
Ao receber mais de um
id, retorna um array com as especies referentes aosids.
2. Implemente a funcao getAnimalsOlderThan
Ao receber uma especie e uma idade como parametro, retorne se todos os animais dessa especie possuem essa idade ou sao mais velhos.
-
Verifique se todos os animais da especie passada como parametro possuem a idade minima:
- Os animais devem ter essa idade ou serem mais velhos.
-
Retorne um valor booleano.
O que sera testado:
- Ao passar o nome de uma especie e uma idade, testa se todos os animais desta especie possuem a idade minima especificada.
3. Implemente a funcao getEmployeeByName
Busque as pessoas colaboradoras pelo primeiro ou ultimo nome delas
-
Retorne um objeto vazio caso a funcao nao receba parametros;
-
Retorne as informacoes da pessoa colaboradora caso o parametro seja igual ao nome ou igual ao ultimo nome no seguinte formato:
id: 'c5b83cb3-a451-49e2-ac45-ff3f54fbe7e1',
firstName: 'Nigel',
lastName: 'Nelson',
managers: ['0e7b460e-acf4-4e17-bcb3-ee472265db83', 'fdb2543b-5662-46a7-badc-93d960fdc0a8'],
responsibleFor: ['0938aa23-f153-4937-9f88-4858b24d6bce', 'e8481c1d-42ea-4610-8e11-1752cfc05a46'],
}
O que sera testado:
-
Sem parametros, deve retornar um objeto vazio;
-
Quando informado o primeiro nome da pessoa colaboradora, deve retornar o objeto da pessoa colaboradora;
-
Quando informado o ultimo nome da pessoa colaboradora, deve retornar o objeto da pessoa colaboradora;
4. Implemente a funcao getRelatedEmployees
Verifique se uma pessoa colaboradora e gerente e quais pessoas ela lidera
Considerando a boa pratica de dividir o codigo em partes menores, o arquivo tera duas funcoes:
-
isManagerque sera responsavel por verificar se uma pessoa colaboradora e gerente:- Retorne
truese oidpassado for de uma pessoa gerente; - Retorne
falsese oidpassado nao for de uma pessoa gerente.
- Retorne
-
getRelatedEmployeesque retorna as pessoas lideradas pela gerencia:-
Utilize a funcao
isManagerpara verificar se a pessoa e gerente ou nao e faca as seguintes verificacoes:- Caso a pessoa seja gerente, retorne um array contendo nome e sobrenome das pessoas colaboradoras gerenciadas por essa pessoa.
Exemplo de output:
[ 'Burl Bethea', 'Ola Orloff', 'Emery Elser' ];- Caso a pessoa nao seja gerente, dispare um erro com a mensagem: 'O id inserido nao e de uma pessoa colaboradora gerente!'.
Para lancar o erro, voce vai utilizar a funcao construtora Error da biblioteca padrao do JavaScript.
Exemplo:
throw new Error('O id inserido nao e de uma pessoa colaboradora gerente!');Voce pode ler mais sobre a funcao construtora Error, neste link.
-
O que sera testado:
-
Retorna
truese oidpassado for de uma pessoa gerente; -
Retorna
falsese oidpassado nao for de uma pessoa gerente; -
Se o
idpassado for da pessoa gerente, retorna um array contendo nome e sobrenome das pessoas colaboradoras que ela e responsavel; -
Se o
idpassado nao for da pessoa gerente, dispara um erro com a mensagem:'O id inserido nao e de uma pessoa colaboradora gerente!'.
5. Implemente a funcao countAnimals
Contabilize a quantidade de especies de animais residentes no zoologico
A funcao countAnimals e responsavel por contar a quantidade e animais que residem no zoologico.
- Retorne a quantidade de animais residentes por especie, caso a funcao nao receba parametro. O retorno devera ser um objeto cujo o nome de cada especie e a chave e o total de animais (residentes) dessa especie e o valor. Por exemplo:
lions: 4,
// [...]
}
-
Retorne a quantidade de animais residentes no zoologico da especie passada por parametro. Por exemplo:
-
ao receber o argumento
{ specie: 'penguins' }, retorna apenas a quantidade (numero) de pinguins que residem no zoologico; -
ao passar o argumento
{ specie: 'giraffes', sex: 'female' }, retorna apenas a quantidade (numero) de girafas femeas que residem no zoologico.
-
O que sera testado:
-
Sem parametros, retorna todas as especies e a quantidade de residentes de cada uma;
-
Recebendo como parametro um objeto com a chave
specie, retorna a quantidade de animais daquela especie; -
Recebendo como parametro um objeto com a chave
specieesex, retorna a quantidade de animais daquela especie, no sexo selecionado.
6. Obtenha ao menos 80% de cobertura de testes na funcao handlerElephants
Implemente os testes da funcao handlerElephants para obter ao menos 80% de cobertura
Essa funcao retorna informacoes referentes aos elefantes conforme o argumento passado:
| Argumento | Informacao |
|---|---|
count |
retorna a quantidade de elefantes |
names |
retorna um array com a relacao dos nomes de todos os elefantes |
averageAge |
retorna a media de idade dos elefantes |
location |
retorna a localizacao dos elefantes dentro do Zoologico |
popularity |
retorna a popularidade dos elefantes |
availability |
retorna um array com a relacao de dias em que e possivel visitar os elefantes |
De olho na dica : Antes de comecar a escrever os testes, leia a funcao
handlerElephantse procure entende-la linha a linha
-
Implemente os testes nos arquivos da pasta
testque esta na raiz do projeto; -
A funcao
handlerElephantsja esta implementada, sendo necessario apenas criar os testes; -
A funcao e case sensitive;
-
Use o comando
npm test handlerElephantspara verificar se seus testes estao passando; -
Use o comando
npm run test:coveragepara testar a cobertura.
A cobertura ira checar apenas as funcoes destacadas e nao toda a aplicacao!
describe.
Dicas do que voce pode testar:
-
Para o argumento
countdeve retornar o numero inteiro4; -
Para o argumento
namesdeve retornar um array de nomes que possui o nomeJefferson; -
Para o argumento
averageAgedeve retornar um numero proximo a10.5;
7. Obtenha ao menos 90% de cobertura de testes na funcao handlerElephants
Implemente os testes da funcao handlerElephants para obter ao menos 90% de cobertura
Essa funcao retorna informacoes referentes aos elefantes conforme o argumento passado:
| Argumento | Informacao |
|---|---|
count |
retorna a quantidade de elefantes |
names |
retorna um array com a relacao dos nomes de todos os elefantes |
averageAge |
retorna a media de idade dos elefantes |
location |
retorna a localizacao dos elefantes dentro do Zoologico |
popularity |
retorna a popularidade dos elefantes |
availability |
retorna um array com a relacao de dias em que e possivel visitar os elefantes |
-
A funcao e case sensitive;
-
Use o comando
npm test handlerElephantspara verificar se seus testes estao passando; -
Use o comando
npm run test:coveragepara testar a cobertura.
describe.
Dicas do que voce pode testar:
-
Para o argumento
countdeve retornar o numero inteiro4; -
Para o argumento
namesdeve retornar um array de nomes que possui o nomeJefferson; -
Para o argumento
averageAgedeve retornar um numero proximo a10.5; -
Para o argumento
locationdeve retornar a stringNW; -
Para o argumento
popularitydeve retornar um numero igual ou maior a 5; -
Para o argumento
availabilitydeve retornar um array de dias da semana que nao contemMonday; -
Nao passando argumentos a funcao deve retornar
undefined;
8. Implemente a funcao calculateEntry
Calcule o valor total da entrada dos visitantes do zoologico
O valor das entradas do zoologico e calculado a partir da faixa etaria, onde:
-
child: sao pessoas menores de 18 anos; -
adult: sao pessoas com idade maior ou igual a 18 anos e menor que 50 anos; -
senior: sao pessoas com idade maior ou igual a 50 anos.
Considerando a boa pratica de dividir o codigo em partes menores, o arquivo tera duas funcoes, chamadas de countEntrants e calculateEntry.
As duas funcoes recebem um array no seguinte formato:
{ name: 'Lara Carvalho', age: 5 },
{ name: 'Frederico Moreira', age: 5 },
{ name: 'Pedro Henrique Carvalho', age: 5 },
{ name: 'Maria Costa', age: 18 },
{ name: 'Nubia Souza', age: 18 },
{ name: 'Carlos Nogueira', age: 50 },
];
countEntrantssera responsavel por calcular a quantidade de visitantes por faixa etaria:
Ela recebe um array e deve retornar um objeto. Para isso:
-
Realize a soma da quantidade de visitantes por faixa etaria;
-
Retorne um objeto em um formato como esse:
{ child: 3, adult: 2, senior: 1 }.
calculateEntrysera responsavel por somar o valor da entrada das pessoas no zoologico:
Ela recebe um array e deve retornar a soma total dos valores do ingresso. Para isso:
-
Retorne
0se nenhum parametro for passado ou seja um array vazio; -
Utilize a funcao
countEntrantspara ter a quantidade total de pessoas por faixa etaria; -
Realize a soma dos valores dos ingressos por faixa etaria. Seu retorno deve ser parecido com esse:
187.94.
De olho na dica : O valor a ser cobrado pela faixa de idades tambem consta no arquivo de dados.
Exemplo de uso da funcao calculateEntry:
Saida:
O que sera testado:
Na funcao countEntrants:
- Ao receber um array de visitantes, retorna um objeto com a contagem.
Na funcao calculateEntry:
-
Retorna 0 se nenhum argumento for passado;
-
Retorna 0 se um objeto vazio for passado;
-
Ao receber um array de pessoas com 3 criancas, 2 pessoas adultas e 1 pessoa mais velha retorna o valor correto;
-
Ao receber um array com 1 pessoa adulta retorna o valor correto;
-
Ao receber um array com 1 pessoa mais velha retorna o valor correto;
-
Ao receber um array com 1 crianca retorna o valor correto;
-
Ao receber um array com 1 crianca e 1 pessoa mais velha retorna o valor correto.
9. Implemente a funcao getSchedule
Crie um cronograma com os horarios de visita disponiveis para cada especie de animal
As informacoes dos horarios dos animais devem ser disponibilizadas em uma consulta para as pessoas que estao visitando o zoologico, que podem querer ter acesso ao cronograma da semana, de um dia ou de um animal especifico.
-
Retorne um array com os dias da semana em que um animal esta disponivel para visitacao caso o parametro da funcao seja um animal. Por exemplo:
[ 'Tuesday', 'Thursday', 'Saturday', 'Sunday' ]; -
Retorne todos os horarios disponiveis para cada dia da semana caso a funcao:
-
nao receba parametro;
-
o parametro passado para a funcao nao seja um animal ou um dia;
Para isso:
-
Crie um objeto e adicione todos os dias da semana como chave;
-
Os valores de cada dia da semana deve ser um objeto, possuindo as chaves
officeHoureexhibition:-
officeHourdeve possuir o texto com o horario que o zoologico abre e fecha naquele dia da semana; -
exhibitiondeve possuir um array com o nome de todos os animais disponiveis para visitacao naquele dia da semana.
-
-
O retorno deve ser parecido com esse:
Tuesday: { // Dia da semana
officeHour: 'Open from 8am until 6pm', // n
exhibition: [ 'lions', 'tigers', 'bears', 'penguins', 'elephants', 'giraffes' ],
},
Wednesday: {
officeHour: 'Open from 8am until 6pm',
exhibition: [ 'tigers', 'bears', 'penguins', 'otters', 'frogs', 'giraffes' ],
},
// [...]
}
- Retorne os animais disponiveis no dia, caso o parametro da funcao seja apenas um dia da semana;
De olho na dica : Quebre o problema em funcoes menores para que fique mais simples de administrar a responsabilidade de cada uma delas.
O que sera testado:
-
Se o nome de um animal for passado, devera retornar um array com os dias em que ele estara em exibicao;
-
Sem parametros, retorna os horarios para cada dia e quais animais estarao disponiveis;
-
Com parametros que nao sejam nem um animal e nem um dia, retorna os horarios para cada dia e quais animais estarao disponiveis;
-
Se um unico dia for passado, retorna os horarios para aquele dia e quais animais estarao disponiveis.
10. Implemente a funcao getOldestFromFirstSpecies
Encontre o animal mais velho de uma especie que e gerenciado por uma pessoa colaboradora
A funcao recebe um parametro id referente a pessoa colaboradora e a partir desse id:
-
Encontre a pessoa colaboradora que possui o
idpassado por parametro; -
Encontre a primeira especie de animal que a pessoa colaboradora e responsavel;
-
Encontre o animal mais velho daquela especie;
-
Retorne um array com as informacoes do animal mais velho daquela especie.
O que sera testado:
- Passado o id de uma pessoa colaboradora, encontra a primeira especie de animal gerenciado por essa pessoa, e retorna um array com nome, sexo e idade do animal mais velho dessa especie.
11. Implemente a funcao getEmployeesCoverage
Busque as informacoes sobre a pessoa colaboradora e por quais especies ela e responsavel
A funcao vai receber um objeto como parametro que vai determinar o seu comportamento, sendo:
-
name: o nome ou sobrenome da pessoa a ser buscada; -
id: o id da pessoa a ser buscada.
E deve retornar um objeto no seguinte formato:
id: "4b40a139-d4dc-4f09-822d-ec25e819a5ad", // id da pessoa
fullName: "Sharonda Spry", // nome completo: firstName + lastName
species: [ "otters", "frogs" ], // especies as quais a pessoa e responsavel
locations: [ "SE", "SW" ], // Um array contendo todas as localizacoes das especies
}
Para isso:
-
Retorne as informacoes da pessoa correspondente ao receber um objeto com a propriedade
name:- a propriedade
namepode possuir como valor o primeiro ou ultimo nome da pessoa colaboradora, portanto garanta que seu codigo funciona das duas maneiras.
- a propriedade
-
Retorne as informacoes da pessoa correspondente ao receber um objeto com a propriedade
id; -
Retorne um array com as informacoes de todas as pessoas colaboradoras caso a funcao nao receba parametro;
-
Lance um erro caso o
idseja invalido.
Exemplos de uso da funcao getEmployeesCoverage:
Caso o parametro seja um objeto com nome e id, retorne as informacoes da pessoa colaboradora
ENTRADA:
getEmployeesCoverage({ name: 'Spry' }); // name recebe o ultimo nome como parametro ou
getEmployeesCoverage({ id: '4b40a139-d4dc-4f09-822d-ec25e819a5ad' }); // recebe um id como parametro
SAIDA:
"id": "4b40a139-d4dc-4f09-822d-ec25e819a5ad",
"fullName": "Sharonda Spry",
"species": [ "otters", "frogs" ],
"locations": [ "SE", "SW" ]
}
Caso a funcao nao receba parametros, retorne um array com a informacao de todas as pessoas colaboradoras
ENTRADA:
SAIDA:
{
"id": "c5b83cb3-a451-49e2-ac45-ff3f54fbe7e1",
"fullName": "Nigel Nelson",
"species": [ "lions", "tigers" ],
"locations": [ "NE", "NW" ],
},
{
"id": "0e7b460e-acf4-4e17-bcb3-ee472265db83",
"fullName": "Burl Bethea",
"species": [ "lions", "tigers", "bears", "penguins" ],
"locations": [ "NE", "NW", "NW", "SE" ],
},
{
"id": "fdb2543b-5662-46a7-badc-93d960fdc0a8",
"fullName": "Ola Orloff",
"species": [ "otters", "frogs", "snakes", "elephants" ],
"locations": [ "SE", "SW", "SW", "NW" ],
},
//[...]
];
Caso nenhuma pessoa seja encontrada com o nome, sobrenome ou id, lance um erro
Caso nenhuma pessoa seja encontrada com o nome, sobrenome ou id, devera ser lancado um erro gerado com a funcao construtora Error da biblioteca padrao do JavaScript com a mensagem "Informacoes invalidas". Exemplo:
Voce pode ler mais sobre a funcao construtora Error, neste link.
De olho na dica : Crie funcoes que dividam as tarefas em partes menores. Por exemplo, voce pode criar uma funcao
getSpeciesencarregada somente por buscar o nome das especies que a pessoa e responsavel.
O que sera testado:
-
Se o objeto de opcoes tiver a propriedade
name, retorna somente a pessoa correspondente; -
A propriedade name do objeto de opcoes tambem funciona usando o segundo nome;
-
Se o objeto de opcoes tiver a propriedade
id, retorna somente a pessoa correspondente; -
Sem parametros, retorna uma lista com a cobertura de todas as pessoas colaboradoras;
-
Caso nao haja nenhuma pessoa com o
nameouidespecificados devera ser lancado umerror.
12. Obtenha ao menos 85% de cobertura de testes na funcao getOpeningHours
Implemente os testes da funcao getOpeningHours para obter ao menos 85% de cobertura
Esta funcao recebe como argumentos um dia da semana e um horario, e retorna uma mensagem informando se o zoologico esta aberto ou nao naquela data e hora.
De olho na dica : Antes de comecar a escrever os testes, leia a funcao
getOpeningHourse procure entende-la linha a linha.
-
Implemente os testes nos arquivos da pasta
testque esta na raiz do projeto; -
A funcao
getOpeningHoursja esta implementada, sendo necessario apenas criar os testes; -
Use o comando
npm test getOpeningHourspara verificar se seus testes estao passando; -
Use o comando
npm run test:coveragepara testar a cobertura; -
O nome do dia da semana passado como argumento tem que ser em ingles;
-
O horario precisa ter a seguinte formatacao
'XX:XX-XM'; -
As horas serao validadas na nomenclatura
'AM'e'PM'; -
A funcao nao faz diferenciacao entre maiusculas e minusculas;
A cobertura ira checar apenas as funcoes destacadas e nao toda a aplicacao!
describe.
Dicas do que voce pode testar:
- Teste nao passando argumentos. Devera retornar o objeto:
Tuesday: { open: 8, close: 6 },
Wednesday: { open: 8, close: 6 },
Thursday: { open: 10, close: 8 },
Friday: { open: 10, close: 8 },
Saturday: { open: 8, close: 10 },
Sunday: { open: 8, close: 8 },
Monday: { open: 0, close: 0 },
}
-
Para os argumentos
Mondaye09:00-AMdeve retornar a string'The zoo is closed'(Ja que o Zoo esta sempre fechado na segunda); -
Para os argumentos
Tuesdaye09:00-AMdeve retornar a string'The zoo is open'; -
Para os argumentos
Wednesdaye09:00-PMdeve retornar a string'The zoo is closed';
13. Obtenha ao menos 95% de cobertura de testes na funcao getOpeningHours
Implemente os testes da funcao getOpeningHours para obter 95% de cobertura
Esta funcao recebe como argumentos um dia da semana e um horario, e retorna uma mensagem informando se o zoologico esta aberto ou nao naquela data e hora.
-
Use o comando
npm test getOpeningHourspara verificar se seus testes estao passando; -
Use o comando
npm run test:coveragepara testar a cobertura; -
O nome do dia da semana passado como argumento tem que ser em ingles;
-
O horario precisa ter a seguinte formatacao
'XX:XX-XM'; -
As horas serao validadas na nomenclatura
'AM'e'PM'; -
A funcao nao faz diferenciacao entre maiusculas e minusculas.
describe.
Dicas do que voce pode testar:
- Teste nao passando argumentos. Devera retornar o objeto:
Tuesday: { open: 8, close: 6 },
Wednesday: { open: 8, close: 6 },
Thursday: { open: 10, close: 8 },
Friday: { open: 10, close: 8 },
Saturday: { open: 8, close: 10 },
Sunday: { open: 8, close: 8 },
Monday: { open: 0, close: 0 },
}
-
Para os argumentos
Mondaye09:00-AMdeve retornar a string'The zoo is closed'(Ja que o Zoo esta sempre fechado na segunda); -
Para os argumentos
Tuesdaye09:00-AMdeve retornar a string'The zoo is open'; -
Para os argumentos
Wednesdaye09:00-PMdeve retornar a string'The zoo is closed'; -
Para os argumentos
Thue09:00-AMdeve lancar uma excecao com a mensagem:'The day must be valid. Example: Monday' -
Para os argumentos
Fridaye09:00-ZMdeve lancar uma excecao com a mensagem:'The abbreviation must be \'AM\' or \'PM\''; -
Para os argumentos
SaturdayeC9:00-AMdeve lancar uma excecao com a mensagem:'The hour should represent a number'; -
Para os argumentos
Sundaye09:c0-AMdeve lancar uma excecao com a mensagem:'The minutes should represent a number';
14. Implemente a funcao getAnimalMap
Faca o mapeamento geografico dos animais de cada especie e realize filtros de localizacao, nome em ordem alfabetica e sexo.
A funcao getAnimalMap e responsavel por categorizar os animais por localizacao, alem de filtra-los por regiao, nome e sexo a partir de um parametro. A estrutura do retorno da funcao e baseada na localizacao das especies:
NE: [ /* dados aqui */],
NW: [/* dados aqui */],
SE: [/* dados aqui */],
SW: [/* dados aqui */],
}
Os parametros da funcao podem ser:
includeNames: true, que retorna o nome dos animais no seguinte formato:
{ lions: ['Zena', 'Maxwell', 'Faustino', 'Dee'] },
{ giraffes: ['Gracia', 'Antone', 'Vicky', 'Clay', 'Arron', 'Bernard'] },
],
// [...]
sorted: true que retorna o nome dos animais por ordem alfabetica no seguinte formato:
{ lions: ['Dee', 'Faustino', 'Maxwell', 'Zena'] },
{ giraffes: ['Antone', 'Arron', 'Bernard', 'Clay', 'Gracia', 'Vicky'] },
],
// [...]
sex: male ou sex: female retorna o nome dos animais que sao machos ou femeas no seguinte formato:
{ lions: ['Zena', 'Dee'] },
{ giraffes: ['Gracia', 'Vicky'] },
],
// [...]
{ sex: male }, retorne apenas o nome dos animais machos e se o parametro for { sex: female } retorne apenas o nome dos animais femeas.
Caso a funcao nao receba parametro, as especies dos animais devem ser categorizadas por localizacao e deve retornar um objeto no seguinte formato:
NE: ['lions', 'giraffes'],
NW: ['tigers', 'bears', 'elephants'],
SE: ['penguins', 'otters'],
SW: ['frogs', 'snakes'],
}
Para isso:
-
Retorne a especie de todos os animais categorizados por localizacao caso a funcao:
-
nao receba parametro;
-
nao receba o parametro
{includesName: true}e receba apenas o parametro{sex: female}; -
nao receba o parametro
{includesName: true}e receba apenas o parametro{sex: female, sorted: true}.
-
-
Retorne a especie e o nome dos animais caso a funcao receba apenas o parametro
{includesName: true}; -
Retorne a especie e o nome dos animais em ordem alfabetica caso a funcao receba o parametro
{includesName: true, sorted: true}; -
Retorne a especie e o nome dos animais filtrado por sexo:
-
Retorne a especie e o nome dos animais femeas, caso o parametro da funcao seja
{includesName: true, sex: female}; -
Retorne a especie e o nome dos animais machos, caso o parametro da funcao seja
{includesName: true, sex: male};
-
-
Retorne a especie e o nome dos animais filtrado por sexo e por ordem alfabetica:
-
Retorne a especie e o nome dos animais femeas em ordem alfabetica, caso o parametro da funcao seja
{includesName: true, sex: female, sorted: true}; -
Retorne a especie e o nome dos animais machos em ordem alfabetica, caso o parametro da funcao seja
{includesName: true, sex: male, sorted: true};
-
De olho na dica : Voce nao precisa diferenciar os filtros de sexo entre
femaleoumale, apenas porsex.
O que sera testado:
-
Sem parametros, retorna animais categorizados por localizacao;
-
Sem a opcao
includeNamesespecificada, retorna animais categorizados por localizacao; -
Com a opcao
includeNames: trueespecificada, retorna nomes de animais; -
Com a opcao
sorted: trueespecificada, retorna nomes de animais ordenados; -
Com a opcao
sex: 'female'ousex: 'male'especificada, retorna somente nomes de animais macho/femea; -
Com a opcao
sex: 'female'ousex: 'male'especificada e a opcaosorted: trueespecificada, retorna somente nomes de animais macho/femea com os nomes dos animais ordenados;
Requisitos Bonus
15. Obtenha 100% de cobertura de testes na funcao handlerElephants
Implemente os testes da funcao handlerElephants para obter 100% de cobertura
Essa funcao retorna informacoes referentes aos elefantes conforme o argumento passado:
| Argumento | Informacao |
|---|---|
count |
retorna a quantidade de elefantes |
names |
retorna um array com a relacao dos nomes de todos os elefantes |
averageAge |
retorna a media de idade dos elefantes |
location |
retorna a localizacao dos elefantes dentro do Zoologico |
popularity |
retorna a popularidade dos elefantes |
availability |
retorna um array com a relacao de dias em que e possivel visitar os elefantes |
-
A funcao e case sensitive;
-
Use o comando
npm test handlerElephantspara verificar se seus testes estao passando; -
Use o comando
npm run test:coveragepara testar a cobertura.
describe.
Dicas do que voce pode testar:
-
Para o argumento
countdeve retornar o numero inteiro4; -
Para o argumento
namesdeve retornar um array de nomes que possui o nomeJefferson; -
Para o argumento
averageAgedeve retornar um numero proximo a10.5; -
Para o argumento
locationdeve retornar a stringNW; -
Para o argumento
popularitydeve retornar um numero igual ou maior a 5; -
Para o argumento
availabilitydeve retornar um array de dias da semana que nao contemMonday; -
Nao passando argumentos a funcao deve retornar
undefined; -
Passando por argumento um objeto vazio (
{}) deve retornar a string'Parametro invalido, e necessario uma string'; -
Passada uma string que nao contempla uma funcionalidade deve retornar
null.
16. Obtenha ao menos 100% de cobertura de testes na funcao getOpeningHours
Implemente os testes da funcao getOpeningHours para obter 100% de cobertura
Esta funcao recebe como argumentos um dia da semana e um horario, e retorna uma mensagem informando se o zoologico esta aberto ou nao naquela data e hora.
-
Use o comando
npm test getOpeningHourspara verificar se seus testes estao passando; -
Use o comando
npm run test:coveragepara testar a cobertura; -
O nome do dia da semana passado como argumento tem que ser em ingles;
-
O horario precisa ter a seguinte formatacao
'XX:XX-XM'; -
As horas serao validadas na nomenclatura
'AM'e'PM'; -
A funcao nao faz diferenciacao entre maiusculas e minusculas.
describe.
Dicas do que voce pode testar:
- Teste nao passando argumentos. Devera retornar o objeto:
Tuesday: { open: 8, close: 6 },
Wednesday: { open: 8, close: 6 },
Thursday: { open: 10, close: 8 },
Friday: { open: 10, close: 8 },
Saturday: { open: 8, close: 10 },
Sunday: { open: 8, close: 8 },
Monday: { open: 0, close: 0 },
}
-
Para os argumentos
Mondaye09:00-AMdeve retornar a string'The zoo is closed'(Ja que o Zoo esta sempre fechado na segunda); -
Para os argumentos
Tuesdaye09:00-AMdeve retornar a string'The zoo is open'; -
Para os argumentos
Wednesdaye09:00-PMdeve retornar a string'The zoo is closed'; -
Para os argumentos
Thue09:00-AMdeve lancar uma excecao com a mensagem:'The day must be valid. Example: Monday' -
Para os argumentos
Fridaye09:00-ZMdeve lancar uma excecao com a mensagem:'The abbreviation must be \'AM\' or \'PM\''; -
Para os argumentos
SaturdayeC9:00-AMdeve lancar uma excecao com a mensagem:'The hour should represent a number'; -
Para os argumentos
Sundaye09:c0-AMdeve lancar uma excecao com a mensagem:'The minutes should represent a number'; -
Para os argumentos
Mondaye13:00-AMdeve lancar uma excecao com a mensagem:'The hour must be between 0 and 12'; -
Para os argumentos
Tuesdaye09:60-AMdeve lancar uma excecao com a mensagem:'The minutes must be between 0 and 59'.