Este projeto foi desenvolvido durante o período de Curso da Trybe 🚀
O projeto tem por objetivo a avaliação e prática dos conhecimentos adquiridos na Trybe, visando o cumprimento do requisitos solicitados pela mesma.
- Habilidades
- Instruções para entregar seu projeto:
- Como desenvolver
- Requisitos do projeto
- 1. Implemente a função
average
- 2. Implemente os casos de teste para a função
numbers
- 3. Implemente a função
vqv
- 4. Implemente os casos de teste para a função
circle
- 5. Implemente a função
createStudent
- 6. Implemente os casos de teste para a função
productDetails
- 7. Implemente as funções
calculator
earrayGenerator
- 8. Implemente a função
myCounter
- 9. Implemente os casos de teste para a função
getCharacter
- 10. Implemente a função
createMenu
, bem como seus casos de teste
- 1. Implemente a função
- Escrever testes unitários para funções utilizando o Jest, um poderoso Framework de Testes em JavaScript, para verificar o correto funcionamento dessas funções;
- A partir de testes já implementados, escrever funções de forma que elas atendam aos testes propostos;
- Escrever testes e funções utilizando uma abordagem de desenvolvimento orientado a testes.
Você implementará várias funções para atender aos requisitos propostos e/ou testes unitários para garantir que as implementações das funções estão corretas.
-
Nos testes unitários que não estão implementados, vocês verão o comando
fail('Teste vazio!');
. Esse código deve ser removido a partir do momento que vocês começarem a escrever o teste unitário. Ele só existe para fazer o teste falhar. Se ofail('Teste vazio!');
não estivesse nos blocos em que não há testes unitários implementados ainda, o teste iria passar com sucesso, pois não haveria nada para ser testado dentro. -
Os comandos que você utilizará com mais frequência são:
npm test
(executa todos os testes presentes na aplicação)npm test path/to/file
(executa apenas os testes presentes no arquivo path/to/file)- Exemplo:
npm test tests/average.spec.js
- Exemplo:
- Clone o repositório
git clone [email protected]:tryber/sd-017-project-js-unit-tests.git
.- Entre na pasta do repositório que você acabou de clonar:
cd sd-017-project-js-unit-tests
- Instale as dependências
npm install
- Crie uma branch a partir da branch
master
- Verifique que você está na branch
master
- Exemplo:
git branch
- Exemplo:
- Se não estiver, mude para a branch
master
- Exemplo:
git checkout master
- Exemplo:
- Agora crie uma branch para qual você vai submeter os
commits
do seu projeto- Você deve criar uma branch no seguinte formato:
nome-de-usuario-nome-do-projeto
- Exemplo:
git checkout -b joaozinho-js-unit-tests
- Você deve criar uma branch no seguinte formato:
- Faça as alterações em, por exemplo, alguma das funções que precisam de implementação. Por exemplo, a
average.js
emsrc/
:
const average = () => {
// add your implementation here
}
module.exports = average
- Adicione as mudanças ao stage do Git e faça um
commit
- Verifique que as mudanças ainda não estão no stage
- Exemplo:
git status
(deve aparecer listado o arquivo src/last.js em vermelho)
- Exemplo:
- Adicione o arquivo alterado ao stage do Git
- Exemplo:
git add .
(adicionando todas as mudanças - que estavam em vermelho - ao stage do Git)git status
(deve aparecer listado o arquivo src/last.js em verde)
- Exemplo:
- Faça 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 )
- Exemplo:
- Adicione a sua branch com o novo
commit
ao repositório remoto
- Usando o exemplo anterior:
git push -u origin joaozinho-js-unit-tests
- Crie um novo
Pull Request
(PR)
- Vá até a página de Pull Requests do repositório no GitHub.
- Clique no botão verde "New pull request"
- Clique na caixa de seleção "Compare" e escolha a sua branch com atenção
- Clique no botão verde "Create pull request"
- Adicione uma descrição para o Pull Request e clique no botão verde "Create pull request"
- Não se preocupe em preencher mais nada por enquanto!
- Volte até a página de Pull Requests do repositório e confira que o seu Pull Request está criado.
-
Faça
commits
das alterações que você fizer no código regularmente -
Lembre-se de sempre após um (ou alguns)
commits
atualizar o repositório remoto -
Os comandos que você utilizará com mais frequência são:
git status
(para verificar o que está em vermelho - fora do stage - e o que está em verde - no stage)git add
(para adicionar arquivos ao stage do Git)git commit
(para criar um commit com os arquivos que estão no stage do Git)git push -u nome-da-branch
(para enviar o commit para o repositório remoto na primeira vez que fizer opush
de uma nova branch)git push
(para enviar o commit para o repositório remoto após o passo anterior)
Este repositório contém um template de uma aplicação NodeJS (observe a existência do arquivo package.json). Após clonar o projeto e instalar as dependências, você não precisará realizar nenhuma configuração adicional. Todos os arquivos estritamente necessários para finalizar o projeto já estão criados, não sendo necessária a criação de outros arquivos. Você deverá completar as funções e testes unitários de forma a satisfazer os requisitos listados na seção Lista de requisitos.
As funções a serem implementadas estão dentro da pasta src
e seus respectivos testes estão na pasta tests
. O nome dos arquivos também seguem uma ordem definida. Basicamente, os arquivos de teste possuem o nome do arquivo alvo (arquivo da funcionalidade) acrescido do nome .spec.js
.
Existirá um arquivo src/exemplo.js
que conterá a implementação de uma função e um arquivo tests/exemplo.spec.js
com os testes unitários referentes à função presente no arquivo src/exemplo.js
.
Cada função possui um bloco de comentários em suas primeiras linhas explicando qual é o trabalho que a função deve realizar.
Você só deve alterar os arquivos indicados nos requisitos. Os arquivos que não estão indicados nos requisitos não devem ser alterados, ou sua avaliação poderá ser comprometida.
Para entregar o seu projeto você deverá criar um Pull Request neste repositório. Este Pull Request deverá conter a implementação dos arquivos solicitados abaixo.
Lembre-se que você pode consultar nosso conteúdo sobre Git & GitHub sempre que precisar!
Usaremos o ESLint para fazer a análise estática do seu código.
Para garantir a qualidade do seu código de forma a tê-lo mais legível, de mais fácil manutenção e seguindo as boas práticas de desenvolvimento nós utilizamos neste projeto o linter ESLint
. Para rodar o linter localmente no seu projeto, execute o comando abaixo:
npm run lint
Você pode também instalar o plugin do ESLint
no VSCode
, basta ir em extensions e baixar o plugin ESLint
. Caso tenha alguma dúvida sobre o linter você pode consultar nosso conteúdo sobre ESLint
A função average recebe um array (tamanho variável) e retorna a média dos valores recebidos. Caso a função receba algum valor não númerico ou um array vazio, o valor undefined
deve ser retornado. Todos os resultados devem ser arredondados para valores inteiros. Ex: 4,6 vira 5; 1,3 vira 1. O arquivo average.spec.js
contém os testes para average
já implementados. Implemente a função no arquivo src/average.js
de forma que ela atenda aos testes propostos.
O que será avaliado
- Será validado se, ao receber um array de números, a função
average
retorna a média de seus valores; - Será validado se, ao receber um array que contém valores não numéricos, a função
average
retornaundefined
; - Será validado se, ao receber um array vazio, a função
average
retornaundefined
.
A função numbers
recebe um array (tamanho variável) e retorna true
se todos os parâmetros forem do tipo 'number' e false
caso contrário. Essa função já está implementada no arquivo src/numbers.js
. Escreva pelo menos quatro testes para essa função para garantir que a implementação de numbers
está correta.
O que será avaliado
- Será validado se no teste da função
numbers
, o retorno da função étrue
quando o array passado por parâmetro contém somente números.
Use template literals para escrever uma função que recebe seu nome e sua idade e retorna o parágrafo descrito abaixo:
`Oi, meu nome é Tunico!
Tenho 30 anos,
trabalho na Trybe e mando muito em programação!
#VQV!`
Caso a função seja chamada sem nenhum parâmetro, o valor undefined
deve ser retornado. O arquivo vqv.spec.js
contém os testes para vqv
já implementados. Implemente a função no arquivo src/vqv.js
de forma que ela atenda aos testes propostos.
O que será avaliado
- Será validado se
vqv
é uma função; - Será validado se a função
vqv
retorna dados do tipo string; - Será validado se a função
vqv
retorna a frase esperada quando passados parâmetros de nome e idade; - Será validado se a função
vqv
, quando chamada sem parâmetros, retornaundefined
.
A função circle
recebe o raio de um círculo e retorna um objeto contendo suas informações (Raio, Área e Circunferência). Se não for especificado um raio, a função retorna undefined
. Essa função já está implementada no arquivo src/circle.js
. Escreva pelo menos seis testes para essa função para garantir que a implementação de circle
está correta.
O que será avaliado
- Será validado se no teste da função
circle
, ao receber um raio, o retorno da função é um objeto com as informações corretas (Raio, Área e Circunferência).
A função createStudent
recebe como parâmetro um nome, e retorna um objeto contendo duas chaves:
- name, contendo o nome passado como parâmetro;
- feedback, contendo uma função que retorna a frase 'Eita pessoa boa!' ao ser chamada.
O arquivo createStudent.spec.js
contém os testes para createStudent
já implementados. Implemente a função no arquivo src/createStudent.js
de forma que ela atenda aos testes propostos.
O que será avaliado
- Será validado se a função
createStudent
retorna um objeto que contenha duas chaves:name
, contendo o nome passado como parâmetro; efeedback
, contendo uma função que retorna a frase 'Eita pessoa boa!' ao ser chamada.
A função productDetails
recebe duas strings que representam nomes de produtos, e retorna um array contendo dois objetos com os detalhes dos respectivos produtos:
productDetails('Alcool gel', 'Máscara');
Retorna:
[
{
name: 'Alcool gel'
details: {
productId: 'Alcool gel123'
}
},
{
name: 'Máscara'
details: {
productId: 'Máscara123'
}
}
]
Essa função já está implementada no arquivo src/productDetails.js
. Escreva pelo menos cinco testes para essa função no arquivo tests/productDetails.js
para garantir que a implementação de productDetails
está correta.
O que será avaliado
- Será validado se no teste da função
productDetails
, ao receber duas strings, o retorno da função é um array de objetos e se cada objeto contém os dados necessários.
A função calculator
recebe dois números inteiros como parâmetro e retorna um objeto com as seguintes chaves:
- sum;
- mult;
- div;
- sub.
Para cada chave atribua como valor a operação correspondente à sua chave:
sum:
retorna o resultado da soma dos dois números;mult:
retorna o resultado da multiplicação dos dois números;div:
retorna o resultado da divisão dos dois números;sub:
retorna o resultado da subtração dos dois números.
Os resultados das divisões devem sempre ser arredondados para baixo.
Parâmetros:
- Dois números inteiros.
Comportamento:
calculator(1, 2); // { sum: 3, mult: 2, div: 1, sub: 0 }
Já a função arrayGenerator
converte objetos em arrays, de chaves, valores ou ambos. Ela deve receber dois parâmetros:
- o primeiro parâmetro deve ser uma string que indica o tipo de conversão;
- o segundo parâmetro deve ser um objeto semelhante ao que é retornado pela função calculator que você acabou de desenvolver.
Parâmetros:
- Uma string que indica o tipo de conversão;
- Um objeto no formato { sum: 3, mult: 2, div: 0, sub: -1 };
Comportamento:
arrayGenerator('keys', { sum: 3, mult: 2, div: 1, sub: 0 }) // [ 'sum', 'mult', 'div', 'sub' ]
arrayGenerator('values', { sum: 3, mult: 2, div: 1, sub: 0 }) // [ 3, 2, 1, 0 ]
arrayGenerator('entries', { sum: 3, mult: 2, div: 1, sub: 0 }) // [ [ 'sum', 3 ], [ 'mult', 2 ], [ 'div', 1 ], [ 'sub', 0 ] ]
O arquivo objPlayground.spec.js
contém os testes para calculator
e arrayGenerator
já implementados. Implemente as funções no arquivo src/objPlayground.js
de forma que ela atenda aos testes propostos.
O que será avaliado
- Será avaliado se a função
calculator
retorna os valores esperados; - Será avaliado se a função
arrayGenerator
retorna os valores esperados.
A função myCounter possui dois loops aninhados que inserem valores dentro de um array. Como podemos perceber, eles vão adicionando valores ao array até sua condição de parada. Corrija a função myCounter
, sem eliminar nenhum dos loops de repetição, para que a função retorne o array correto. O arquivo myCounter.spec.js
contém os testes para myCounter
já implementados. Implemente a função no arquivo src/myCounter.js
de forma que ela atenda aos testes propostos.
O que será avaliado
- Será validado se a função
myCounter
retorna os dados esperados de acordo com o que está implementado no teste.
A função getCharacter
recebe uma string que representa o nome de um personagem e retorna um objeto contendo seu nome, sua classe e suas frases.
getCharacter('Arya');
Retorna:
{
name: 'Arya Stark',
class: 'Rogue',
phrases: ['Not today', 'A girl has no name.']
}
Essa função já está implementada no arquivo src/getCharacter.js
. Escreva pelo menos seis testes para essa função no arquivo tests/getCharacter.spec.js
para garantir que a implementação de getCharacter
está correta.
O que será avaliado
- Será validado se no teste da função
getCharacter
ao receber uma string, o retorno da função é o esperado - de acordo com a tabela apresentada no arquivo de testes. - Será validado se no teste da função
getCharacter
ao não receber nenhum parâmetro, o retorno da função éundefined
. - Será validado se o teste da função
getCharacter
verifica se o parâmetro é case sensitive.
Agora prepare-se! Esse último requisito vai te guiar através de um longo e rico processo de desenvolvimento orientado a testes (Test Driven Development, ou TDD). Dará trabalho, mas vale a pena!
Você é responsável por elaborar o sistema de pedidos de um restaurante. Deve ser possível, através desse sistema, cadastrar um menu. Dado que um menu foi cadastrado, o sistema deve disponibilizar um objeto através do qual se consegue:
- Ler o menu cadastrado;
- Fazer pedidos;
- Verificar o que foi pedido;
- Somar o valor da conta.
A estrutura deste código e deste objeto já foi definida e você irá implementá-lo. Você encontrará mais detalhes sobre a estrutura a ser seguida e exemplos do retorno da função no arquivo src/restaurant.js
. Você deverá seguir o passo-a-passo a seguir para garantir o bom desenvolvimento do sistema.
-
No arquivo
tests/restaurant.spec.js
, escreva um teste que verifica se a funçãocreateMenu()
retorna um objeto que possui a chavefetchMenu
, a qual tem como valor uma função. -
No arquivo
tests/restaurant.spec.js
, escreva um teste que verifica se'objetoRetornado.fetchMenu()'
retorna um objeto cujas chaves são somentefood
edrink
, considerando que a funçãocreateMenu
foi chamada com o objeto:{ food: {}, drink: {} }
. -
No arquivo
tests/restaurant.spec.js
, escreva um teste que verifica se o menu passado pra funçãocreateMenu
é identico ao menu recuperado pela função'objetoRetornado.fetchMenu()'
. -
No arquivo
src/restaurant.js
, crie uma funçãocreateMenu()
que, dado um objeto passado por parâmetro, retorna um objeto com o seguinte formato: { fetchMenu: () => objetoPassadoPorParametro }. -
No arquivo
tests/restaurant.spec.js
, escreva um teste que verifica se'objetoRetornado.consumption'
, após a criação do menu, retorna um array vazio. -
No arquivo
src/restaurant.js
, adicione ao objeto retornado porcreateMenu
uma chaveconsumption
que, como valor inicial, tem um array vazio. -
No arquivo
tests/restaurant.spec.js
, escreva um teste que verifica se ao chamar uma função associada à chaveorder
no objeto retornado, passando uma string como parâmetro (comoobjetoRetornado.order('coxinha')
), tal string é adicionada ao array retornado emobjetoRetornado.consumption
. -
No arquivo
src/restaurant.js
, crie uma função, separada da funçãocreateMenu()
, que, dada uma string recebida por parâmetro, adiciona essa string ao array deobjetoRetornado.consumption
. Adicione essa função à chaveorder
. -
No arquivo
tests/restaurant.spec.js
, escreva um teste que verifica se ao adicionar três pedidos, dentre bebidas e comidas, o arrayobjetoRetornado.consumption
contém os itens pedidos. -
No arquivo
tests/restaurant.spec.js
, escreva um teste que verifica se a funçãoorder
aceita que pedidos repetidos sejam acrescidos aconsumption
. -
No arquivo
tests/restaurant.spec.js
, escreva um teste que verifica que, ao chamarobjetoRetornado.pay()
, retorna-se a soma dos preços de tudo que foi pedido, conforme registrado emobjetoRetornado.consumption
. -
No arquivo
src/restaurant.js
, adicione ao objeto retornado porcreateMenu()
uma chavepay
com uma função que percorre por todos os itens deobjetoRetornado.consumption
, soma o preço deles e retorna o valor somado acrescido de 10%. DICA: para isso, você precisará percorrer tanto o objeto da chavefood
quanto o objeto da chavedrink
.
O que será avaliado
- Será validado se a função
createMenu
retorna os dados esperados. - Será validado se o teste da função
createMenu
verifica cada um dos retornos da função e se estes retornos têm o comportamento esperado.