Para realizar o projeto, preste atenção em cada passo descrito a seguir, e se tiver qualquer dúvida, nos envie por Slack! #vqv 🚀
Aqui você vai encontrar os detalhes de como estruturar o desenvolvimento do seu projeto a partir desse repositório, utilizando uma branch específica e um Pull Request para colocar seus códigos.
Ao iniciar este projeto, você concorda com as diretrizes do Código de Conduta da Pessoa Estudante da Trybe.
🤷🏽♀️ Como entregar
Para entregar o seu projeto você deverá criar um Pull Request neste repositório.
Lembre-se de que você pode consultar o nosso conteúdo sobre Git & GitHub e nosso Blog - Git & GitHub sempre que precisar!
👨💻 O que deverá ser desenvolvido
Você implementará várias funções na resolução dos requisitos propostos e/ou testes unitários para garantir que as implementações das funções estão corretas, de acordo com o que está sendo solicitado em cada enunciado.
Nesse projeto, você será capaz de:
- Escrever testes unitários utilizando o módulo Jest do NodeJS para verificar o correto funcionamento das funções;
- Escrever funções de forma que elas atendam a testes já implementados;
- Escrever testes e funções utilizando uma abordagem de desenvolvimento orientado a testes.
- Nos testes unitários que não estão implementados, você verá o comando
fail('Teste vazio!')
, que existe propositalmente para fazer o teste falhar.
Esse trecho de código deve ser removido a partir do momento que você começar a escrever o teste unitário
Sem o fail('Teste vazio!')
nos blocos que ainda não contém código de teste, o resultado seria um falso positivo, ou seja, a função testada passaria com sucesso mesmo sem de fato ter implementado o teste.
🗓 Data de Entrega
- Este projeto é individual;
-
Serão
2
dias de projeto; -
Data de entrega do projeto:
10/04/2023 14:00
📝 Instruções para entregar seu projeto: ES6 e Testes Unitários
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 através do npm install
, 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 Requisitos do projeto.
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 segue uma ordem definida. Basicamente, os arquivos de teste possuem o nome do arquivo alvo (arquivo da funcionalidade) acrescido do nome .spec.js
.
Há um arquivo como src/exemplo.js
que contém a implementação de uma função e um arquivo como 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, caso contrário a sua avaliação poderá ser comprometida.
Para entregar o seu projeto você deve criar um Pull Request neste repositório. Este Pull Request deve conter a implementação dos arquivos solicitados na seção Requisitos do projeto.
‼️ Antes de começar a desenvolver
- Clone o repositório
git clone git@github.com:tryber/sd-031-a-project-js-unit-tests.git
- Entre na pasta do repositório que você acabou de clonar:
cd sd-031-a-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 você não estiver na branch
master
, mude para a branchmaster
- 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 qualquer uma das funções que pedem implementação. Por exemplo, a
average.js
emsrc/
:
```javascript
const average = () => {
// adicione seu código aqui
}
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/nomeDoArquivo.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/nomeDoArquivo.js em verde)
- Exemplo:
- Faça o
commit
inicial- Exemplo:
git commit -m 'Inicia 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.
⌨️ Durante o desenvolvimento
*
-
Faça
commits
das alterações que você fizer no código regularmente -
Lembre-se de sempre atualizar o repositório remoto após um (ou alguns)
commits
-
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 - em stage)git add
(para adicionar arquivos ao stage do Git)git commit -m "Ação do commit
(para criar um commit com os arquivos que estão no stage do Git)git push -u origin 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)
🤝 Depois de terminar o desenvolvimento (opcional)
Para sinalizar que o seu projeto está pronto para o "Code Review" de colegas, faça o seguinte:
-
Vá até a página DO SEU Pull Request, adicione a label de "code-review" e marque colegas para revisão:
-
No menu à direita, clique no link "Labels" e escolha a label code-review;
-
No menu à direita, clique no link "Assignees" e escolha o seu nome de pessoa usuária;
-
No menu à direita, clique no link "Reviewers" e digite
students
, selecione o timetryber/students-sd-031-a
.
-
Caso tenha alguma dúvida, aqui tem um video explicativo.
🕵🏿 Revisando um Pull Request
Use o conteúdo sobre Code Review para te ajudar a revisar os Pull Requests.
🎛 Linter
Usaremos o ESLint para fazer a análise estática do seu código.
Este projeto já vem com as dependências relacionadas ao linter configuradas nos arquivos package.json
.
Para poder rodar o ESLint
em um projeto basta executar o comando npm install
dentro do projeto e depois npm run lint
. Se a análise do ESLint
encontrar problemas no seu código, tais problemas serão mostrados no seu terminal. Se não houver problema no seu código, nada será impresso no seu terminal.
Você pode também instalar o plugin do ESLint
no VSCode
. Para isso, basta fazer o download do plugin ESLint
e instalá-lo.
🛠 Testes
Todos os requisitos do projeto serão testados automaticamente por meio do Jest
.
-
Os comandos que você utilizará com mais frequência são:
npm test
(executa todos os testes presentes na aplicação)npm test caminho/para/arquivo
(executa apenas os testes presentes no arquivo especificado)- Exemplo:
npm test tests/average.spec.js
🗣 Nos dê feedbacks sobre o projeto!
Ao finalizar e submeter o projeto, não se esqueça de avaliar a sua experiência preenchendo o formulário. Leva menos de 3 minutos!
VERIFIQUE COM CUIDADO SE O LINK SE REFERE AO PROJETO CORRETO!!!
Link: FORMULÁRIO DE AVALIAÇÃO DE PROJETO
🗂 Compartilhe seu Portfólio!
Você sabia que o LinkedIn é a principal rede social profissional? E que compartilhar o seu aprendizado por lá é 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 evolução.
npm run lint
no seu terminal para verificar os checks do Linter 😉
A função `average` recebe um array de tamanho variável e retorna a média dos valores recebidos. Caso a função receba algum valor não numérico 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á testado:
- A função
average
deve retornar a média de seus valores ao receber um array de números; - A função
average
deve retornarundefined
ao receber um array que contém valores não numéricos; - A função
average
deve retornarundefined
ao receber um array vazio.
A função `numbers` recebe um array de 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á testado:
- A função
numbers
deve retornartrue
quando o array passado por parâmetro contém somente números.
Use template literals para escrever a função `vqv` que recebe o seu nome e a 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 vqv
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á testado
vqv
deve ser uma função;- A função
vqv
deve retornar dados do tipo string; - A função
vqv
deve retornar a frase esperada quando passados parâmetros de nome e idade; - A função
vqv
deve retornarundefined
quando chamada sem parâmetro.
A função `circle` recebe o raio de um círculo e retorna um objeto contendo as 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á testado
- O teste da função
circle
, ao receber um raio, deve retornar 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á testado
- A função
createStudent
deve retornar 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á testado
- O teste da função
productDetails
, ao receber duas strings, deve retornar 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: 0, sub: -1 }
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á testado
- A função
calculator
deve retornar os valores esperados; - A função
arrayGenerator
deve retornar 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á testado
- A função
myCounter
deve retornar os dados esperados de acordo com o que está implementado no teste.
A função `getCharacter` já está implementada e recebe como parâmetro de entrada uma string que representa o nome de uma personagem de ficção. Ela retorna um objeto contendo o nome da personagem, a sua classe e as suas frases.
Exemplo:
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á testado
- O teste da função
getCharacter
ao não receber nenhum parâmetro, deve retornarundefined
. - O teste da função
getCharacter
ao receber uma string, deve retornar os dados esperados, de acordo com a tabela apresentada no arquivo de testes. - O teste da função
getCharacter
deve verificar se o parâmetro é case insensitive, ou seja, não faz diferença entre letras maiúsculas e minúsculas.
Esse último requisito vai guiar você por um rico processo de Desenvolvimento Orientado a Testes ou TDD - Test Driven Development
Leia com atenção os pontos abaixo.
Imagine a seguinte situação: você é responsável por escrever o código do sistema de pedidos de um restaurante. Nesse sistema será possível cadastrar o menu do restaurante. Dado que um menu foi cadastrado, o sistema deve disponibilizar um objeto que permite:
- Ler o menu que foi cadastrado;
- Fazer pedidos;
- Verificar o que foi pedido;
- Somar o valor da conta.
O menu é cadastrado separando as comidas (food
) das bebidas (drinks
). Este menu é passado em um objeto, seguindo o exemplo abaixo:
{
food: {coxinha: 3.90, sanduiche: 9.90},
drinks: {agua: 3.90, cerveja: 6.90},
}
O objeto tem duas propriedades: food
e drinks
. Cada uma dessas propriedades tem um value
que também é um objeto, onde as propriedades (keys
) desse objeto são os itens do restaurante, como por exemplo coxinha
e a value
é o valor/preço daquele item, exemplo, 3.90
.
Você deverá se orientar através dos tópicos abaixo para garantir o bom desenvolvimento do sistema.
IMPORTANTE - BOAS PRÁTICAS TDD: COMECE PELO TESTE 1 DO ARQUIVO tests/restaurant.spec.js
Se surgirem dúvidas, não deixe de consultar o nosso conteúdo sobre TDD.
Observação: Todos os testes devem ser escritos no arquivo
tests/restaurant.spec.js
e todas as implementações devem ser escritas no arquivosrc/restaurant.js
.
- Escreva dois testes, um que verifica se a função
createMenu()
retorna um objeto que possui a chavefetchMenu
e outro verificando se o valor da chave fetchMenu do objeto retornado pela funçãocreateMenu()
é uma função.
De olho na dica 👀: Lembre-se: uma propriedade de um objeto pode receber qualquer valor, além de números, strings, objetos e arrays. Podemos passar como
value
de uma propriedade (key
) de um objeto uma função.
-
Escreva um teste que verifica se o objeto retornado pela função
createMenu({ food: {}, drinks: {} }).fetchMenu()
retorna um objeto cujas chaves são somentefood
edrinks
. -
Escreva um teste que verifica se o menu passado pra função
createMenu()
é idêntico ao menu recuperado pela funçãocreateMenu({ food: {}, drinks: {} }).fetchMenu()
. -
Agora vamos começar a desenvolver a nossa função
createMenu()
! Vá até o arquivorestaurant.js
.
- A função
createMenu
deve receber um objeto como parâmetro e retornar um outro objeto, contendo outras propriedade que iremos desenvolver nos tópicos abaixo. - Passe um parâmetro para função
createMenu
, esse parâmetro será um objeto. Depois disso, a funçãocreateMenu
deve retornar um objeto onde uma das chaves éfetchMenu
, o valor dessa chave é uma função e essa função retorna o objeto passado como parâmetro paracreateMenu
.
De olho na dica 👀: Da uma olhadinha no teste e na dica do tópico 1.
-
Escreva um teste que verifica se a propriedade
consumption
do objeto retornado pela funçãocreateMenu({ food: {}, drinks: {} })
, após a criação do menu, retorna um array vazio. -
Volte ao arquivo
restaurant.js
e adicione ao objeto retornado porcreateMenu()
uma chaveconsumption
que, como valor inicial, tem um array vazio. -
A função
createMenu
retorna um objeto. Certo? Esse objeto até aqui já possui algumas chaves(keys
). Nosso objeto retornado pela funçãocreateMenu
tem essa aparência:
{
fetchMenu: () => [Function: fetchMenu],
consumption: [],
}
Agora precisamos que você escreva um teste levando em consideração que nosso objeto vai receber mais uma chave, que é order
e essa chave tem como valor uma função.
Escreva um teste para a seguinte situação: caso o valor (que nesse caso é uma string) passada por parâmetro para order
não conste no objeto passado como parâmetro para createMenu
(nem em food
ou drinks
), o retorno da chave order
deve ser:
- exibir a mensagem
"Item indisponível"
; - e não alterar a chave
consumption
. - Caso o valor exista no objeto passado como parâmetro para
createMenu
o item deve ser adicionado ao arrayconsumption
.
Veja o exemplo abaixo:
const objetoRetornadoCreateMenu = createMenu(
{food: {coxinha: 3.90, sanduiche: 9.90},
drinks: {agua: 3.90, cerveja: 6.90}});
objetoRetornadoCreateMenu.order('coxinha')
objetoRetornadoCreateMenu.consumption // deve retornar ['coxinha']
objetoRetornadoCreateMenu.order('picanha') // deve retornar Item indisponível
- Vá até o arquivo
restaurant.js
e na nossa funcãocreateMenu
que retorna um objeto, iremos criar a chaveorder
.
A chave order
que tem como valor uma função que ao receber uma string como parâmetro, adiciona essa string ao array da chave consumption
.
- Caso o valor passado por parâmetro não conste no menu (nem em
food
oudrinks
), o retorno da chaveorder
deve:
- exibir a mensagem
"Item indisponível"
; - não alterar a chave
consumption
.
-
Escreva um teste que verifica se, ao adicionar três pedidos em sequência, dentre bebidas e comidas, o array
consumption
contém os itens pedidos. -
Escreva um teste que verifica se a função
order
aceita que pedidos repetidos sejam acrescidos aconsumption
. -
Escreva um teste que verifica que, ao chamar a função
pay()
que será uma propriedade do objeto retornado pela funçãocreateMenu
, deve retornar a soma dos preços de tudo que foi pedido, conforme registrado emconsumption
. A propriedadepay
tem como valor uma função. -
Adicione ao objeto retornado por
createMenu()
uma chavepay
com uma função que percorre por todos os itens deconsumption
, soma o preço deles e retorna o valor somado acrescido de 10%.
De olho na dica 👀: Para isso, você precisará percorrer tanto o objeto da chave
food
quanto o objeto da chavedrinks
, para pegar o preço de cada item do menu.
O que será testado
- A função
createMenu()
deve retornar os dados esperados. - O teste da função
createMenu()
deve verificar cada um dos retornos da função e se estes retornos têm o comportamento esperado.