Dark Mode

Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

eliasef/zoo-functions

Repository files navigation

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 4 dias de projeto

  • Data para entrega final do projeto: 03/06/2022 14:00


Orientacoes

!! Antes de comecar a desenvolver
  1. Clone o repositorio

    • Use o comando: git clone git@github.com:tryber/sd-022-b-project-zoo-functions.git
  • Entre na pasta do repositorio que voce acabou de clonar:

    • cd sd-022-b-project-zoo-functions
  1. Instale as dependencias

    • Para isso, use o seguinte comando: npm install
  2. Crie uma branch a partir da branch main

    • Verifique se voce esta na branch main
      • Exemplo: git branch
    • Se nao estiver, mude para a branch main
      • Exemplo: git checkout main
    • Agora, crie uma branch para qual voce vai submeter os commits do seu projeto:
      • Voce deve criar uma branch no seguinte formato: nome-de-usuario-nome-do-projeto
      • Exemplo: git checkout -b luiza-zoo-functions-project
  3. 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 diretorio src devem aparecer em vermelho)
    • 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 diretorio src em verde)
    • Faca o commit inicial

      • Exemplo: git commit -m 'iniciando o projeto. VAMOS COM TUDO :rocket:' (fazendo o primeiro commit)
    • git status (deve aparecer uma mensagem tipo nothing to commit )

  4. Adicione a sua branch com o novo commit ao repositorio remoto

    • Usando o exemplo anterior: git push -u origin luiza-zoo-functions-project
  5. 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 commits das alteracoes que voce fizer no codigo regularmente;

  • Lembre-se de sempre apos um (ou alguns) commits atualizar o repositorio remoto;

  • Os comandos que voce utilizara com mais frequencia sao:

  1. git status (para verificar o que esta em vermelho - fora do stage - e o que esta em verde - no stage);

  2. git add (para adicionar arquivos ao stage do Git);

  3. git commit (para criar um commit com os arquivos que estao no stage do Git);

  4. git push -u origin nome-da-branch (para enviar o commit para o repositorio remoto na primeira vez que fizer o push de uma nova branch);

  5. 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 time tryber/students-sd-022-b.

Caso tenha alguma duvida, aqui tem um video explicativo.

Lembre-se que garantir que todas as issues comentadas pelo Linter estao resolvidas!

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:

npm run lint

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.

PULL REQUESTS COM ISSUES NO LINTER NAO SERAO AVALIADAS. ATENTE-SE PARA RESOLVE-LAS ANTES DE FINALIZAR O DESENVOLVIMENTO!

Testes

Para que os testes sejam executados localmente, verifique se a versao do node na sua maquina e a 16:

node -v

Caso a versao seja diferente, voce pode utilizar o nvm para trocar de versao com o seguinte comando:

nvm use 16

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:

npm test

Caso queira testar apenas uma funcao rode o comando abaixo:

npm test nome-do-arquivo

Por exemplo:

npm test getSpeciesByIds

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.

Serao testadas apenas as duas funcoes pedidas e nao toda a aplicacao!

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:

npm run test:coverage

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.

Atencao: cuidado com eventuais falso-positivos!

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.

O avaliador automatico nao necessariamente avalia seu projeto na ordem em que os requisitos aparecem no readme. Isso acontece para deixar o processo de avaliacao mais rapido. Entao, nao se assuste se isso acontecer, ok?

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
Tuesday
Wednesday
Thursday
Friday
Saturday
Sunday
Monday
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

Apenas os arquivos indicados nos requisitos devem ser alterados, caso contrario, sua avaliacao podera ser comprometida.

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!

Atente-se para o retorno de cada parte 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!

Formulario de avaliacao do projeto

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

PULL REQUESTS COM ISSUES NO LINTER NAO SERAO AVALIADAS. ATENTE-SE PARA RESOLVE-LAS ANTES DE FINALIZAR O DESENVOLVIMENTO!

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 getSpeciesByIds possa 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 este id;

    • Se a funcao receber varios ids, retorne todas as especies referente a esses ids.

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 esse id;

  • Ao receber mais de um id, retorna um array com as especies referentes aos ids.


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:

  1. isManager que sera responsavel por verificar se uma pessoa colaboradora e gerente:

    • Retorne true se o id passado for de uma pessoa gerente;
    • Retorne false se o id passado nao for de uma pessoa gerente.
  2. getRelatedEmployees que retorna as pessoas lideradas pela gerencia:

    • Utilize a funcao isManager para 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 true se o id passado for de uma pessoa gerente;

  • Retorna false se o id passado nao for de uma pessoa gerente;

  • Se o id passado for da pessoa gerente, retorna um array contendo nome e sobrenome das pessoas colaboradoras que ela e responsavel;

  • Se o id passado 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 specie e sex, 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 handlerElephants e procure entende-la linha a linha

  • Implemente os testes nos arquivos da pasta test que esta na raiz do projeto;

  • A funcao handlerElephants ja esta implementada, sendo necessario apenas criar os testes;

  • A funcao e case sensitive;

  • Use o comando npm test handlerElephants para verificar se seus testes estao passando;

  • Use o comando npm run test:coverage para testar a cobertura.

A cobertura ira checar apenas as funcoes destacadas e nao toda a aplicacao!

Atencao: nao altere a estrutura ja implementada nos arquivos de testes, apenas adicione os testes dentro do bloco describe.

Dicas do que voce pode testar:

Atencao: Os topicos abaixo sao apenas sugestoes, sinta-se livre para testar o que achar necessario desde que a cobertura da funcao atinja ao menos 80%

  • Para o argumento count deve retornar o numero inteiro 4;

  • Para o argumento names deve retornar um array de nomes que possui o nome Jefferson;

  • Para o argumento averageAge deve retornar um numero proximo a 10.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 handlerElephants para verificar se seus testes estao passando;

  • Use o comando npm run test:coverage para testar a cobertura.

Atencao: nao altere a estrutura ja implementada nos arquivos de testes, apenas adicione os testes dentro do bloco describe.

Dicas do que voce pode testar:

Atencao: Os topicos abaixo sao apenas sugestoes, sinta-se livre para testar o que achar necessario desde que a cobertura da funcao atinja ao menos 90%.

  • Para o argumento count deve retornar o numero inteiro 4;

  • Para o argumento names deve retornar um array de nomes que possui o nome Jefferson;

  • Para o argumento averageAge deve retornar um numero proximo a 10.5;

  • Para o argumento location deve retornar a string NW;

  • Para o argumento popularity deve retornar um numero igual ou maior a 5;

  • Para o argumento availability deve retornar um array de dias da semana que nao contem Monday;

  • 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:

const entrants = [
{ 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 },
];
  1. countEntrants sera 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 }.

  1. calculateEntry sera 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 0 se nenhum parametro for passado ou seja um array vazio;

  • Utilize a funcao countEntrants para 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:

calculateEntry(entrants);

Saida:

187.94

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 officeHour e exhibition:

      • officeHour deve possuir o texto com o horario que o zoologico abre e fecha naquele dia da semana;

      • exhibition deve 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 id passado 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 name pode possuir como valor o primeiro ou ultimo nome da pessoa colaboradora, portanto garanta que seu codigo funciona das duas maneiras.
  • 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 id seja 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: 'Sharonda' }); // name recebe o primeiro nome como parametro ou
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:

getEmployeesCoverage();

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:

throw new Error('Informacoes invalidas');

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 getSpecies encarregada 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 name ou id especificados devera ser lancado um error.


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 getOpeningHours e procure entende-la linha a linha.

  • Implemente os testes nos arquivos da pasta test que esta na raiz do projeto;

  • A funcao getOpeningHours ja esta implementada, sendo necessario apenas criar os testes;

  • Use o comando npm test getOpeningHours para verificar se seus testes estao passando;

  • Use o comando npm run test:coverage para 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!

Atencao: nao altere a estrutura ja implementada nos arquivos de testes, apenas adicione os testes dentro do bloco describe.

Dicas do que voce pode testar:

Atencao: Os topicos abaixo sao apenas sugestoes, sinta-se livre para testar o que achar necessario desde que a cobertura da funcao atinja ao menos 85%.

  • 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 Monday e 09:00-AM deve retornar a string 'The zoo is closed' (Ja que o Zoo esta sempre fechado na segunda);

  • Para os argumentos Tuesday e 09:00-AM deve retornar a string 'The zoo is open';

  • Para os argumentos Wednesday e 09:00-PM deve 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 getOpeningHours para verificar se seus testes estao passando;

  • Use o comando npm run test:coverage para 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.

Atencao: nao altere a estrutura ja implementada nos arquivos de testes, apenas adicione os testes dentro do bloco describe.

Dicas do que voce pode testar:

Atencao: Os topicos abaixo sao apenas sugestoes, sinta-se livre para testar o que achar necessario desde que a cobertura da funcao atinja ao menos 95%.

  • 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 Monday e 09:00-AM deve retornar a string 'The zoo is closed' (Ja que o Zoo esta sempre fechado na segunda);

  • Para os argumentos Tuesday e 09:00-AM deve retornar a string 'The zoo is open';

  • Para os argumentos Wednesday e 09:00-PM deve retornar a string 'The zoo is closed';

  • Para os argumentos Thu e 09:00-AM deve lancar uma excecao com a mensagem: 'The day must be valid. Example: Monday'

  • Para os argumentos Friday e 09:00-ZM deve lancar uma excecao com a mensagem: 'The abbreviation must be \'AM\' or \'PM\'';

  • Para os argumentos Saturday e C9:00-AM deve lancar uma excecao com a mensagem: 'The hour should represent a number';

  • Para os argumentos Sunday e 09:c0-AM deve 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:
NE: [
{ 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:
NE: [
{ 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:
NE: [
{ lions: ['Zena', 'Dee'] },
{ giraffes: ['Gracia', 'Vicky'] },
],
// [...]

Atencao: Se o parametro for { 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 female ou male, apenas por sex.

O que sera testado:

  • Sem parametros, retorna animais categorizados por localizacao;

  • Sem a opcao includeNames especificada, retorna animais categorizados por localizacao;

  • Com a opcao includeNames: true especificada, retorna nomes de animais;

  • Com a opcao sorted: true especificada, retorna nomes de animais ordenados;

  • Com a opcao sex: 'female' ou sex: 'male' especificada, retorna somente nomes de animais macho/femea;

  • Com a opcao sex: 'female' ou sex: 'male' especificada e a opcao sorted: true especificada, 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 handlerElephants para verificar se seus testes estao passando;

  • Use o comando npm run test:coverage para testar a cobertura.

Atencao: nao altere a estrutura ja implementada nos arquivos de testes, apenas adicione os testes dentro do bloco describe.

Dicas do que voce pode testar:

Atencao: Os topicos abaixo sao apenas sugestoes, sinta-se livre para testar o que achar necessario desde que a cobertura da funcao atinja 100%.

  • Para o argumento count deve retornar o numero inteiro 4;

  • Para o argumento names deve retornar um array de nomes que possui o nome Jefferson;

  • Para o argumento averageAge deve retornar um numero proximo a 10.5;

  • Para o argumento location deve retornar a string NW;

  • Para o argumento popularity deve retornar um numero igual ou maior a 5;

  • Para o argumento availability deve retornar um array de dias da semana que nao contem Monday;

  • 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 getOpeningHours para verificar se seus testes estao passando;

  • Use o comando npm run test:coverage para 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.

Atencao: nao altere a estrutura ja implementada nos arquivos de testes, apenas adicione os testes dentro do bloco describe.

Dicas do que voce pode testar:

Atencao: Os topicos abaixo sao apenas sugestoes, sinta-se livre para testar o que achar necessario desde que a cobertura da funcao atinja ao menos 100%.

  • 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 Monday e 09:00-AM deve retornar a string 'The zoo is closed' (Ja que o Zoo esta sempre fechado na segunda);

  • Para os argumentos Tuesday e 09:00-AM deve retornar a string 'The zoo is open';

  • Para os argumentos Wednesday e 09:00-PM deve retornar a string 'The zoo is closed';

  • Para os argumentos Thu e 09:00-AM deve lancar uma excecao com a mensagem: 'The day must be valid. Example: Monday'

  • Para os argumentos Friday e 09:00-ZM deve lancar uma excecao com a mensagem: 'The abbreviation must be \'AM\' or \'PM\'';

  • Para os argumentos Saturday e C9:00-AM deve lancar uma excecao com a mensagem: 'The hour should represent a number';

  • Para os argumentos Sunday e 09:c0-AM deve lancar uma excecao com a mensagem: 'The minutes should represent a number';

  • Para os argumentos Monday e 13:00-AM deve lancar uma excecao com a mensagem: 'The hour must be between 0 and 12';

  • Para os argumentos Tuesday e 09:60-AM deve lancar uma excecao com a mensagem: 'The minutes must be between 0 and 59'.

About

Project of Trybe school called Zoo Functions, made by EliasEF

Topics

Resources

Readme

Stars

Watchers

Forks

Releases

No releases published

Packages

Contributors