Nesse projeto você irá:
- Utilizar a Context API do React para gerenciar estado.
- Utilizar o React Hook useState;
- Utilizar o React Hook useContext;
- Utilizar o React Hook useEffect;
- Criar React Hooks customizados.
- Escrever testes para garantir que sua aplicação possua uma boa cobertura de testes.
1 - Faça uma requisição para o endpoint /planets
da API de Star Wars e preencha uma tabela com os dados retornados, com exceção dos dados da coluna residents
👀 Observação: Para evitar erros no avaliador, na preparação do seu ambiente de trabalho para o uso do Context API, é necessário que o
<Provider>
seja usado dentro do componenteApp.js
e não no arquivoindex.js
. Esta orientação tem finalidade exclusiva para os testes deste projeto.
A tabela deve ser renderizada por um componente chamado Table
:
- Os dados recebidos da API devem ser salvos em campo chamado
data
do contexto e é deste campo que a tabela deve ler os dados. - Você deve apagar a coluna
residents
de cada planeta antes de salvar os dados recebidos da API no contexto. - A requisição deve ser feita em um componente separado do componente da tabela.
- A API a ser consultada está nesse link. Você deverá fazer um fetch para a URL
https://swapi-trybe.herokuapp.com/api/planets/
. - A primeira linha da tabela deve conter os headers de cada coluna. As demais linhas serão as informações de cada planeta.
O que será verificado
- Realiza uma requisição para a API;
- Preenche a tabela com os dados retornados;
- Verifica se a tabela tem 13 colunas;
- Verifica se a tabela tem uma linha para cada planeta retornado.
A tabela deve ser atualizada com os planetas que se encaixam no filtro à medida que o nome é digitado, sem ter que apertar em um botão para efetuar a filtragem. Por exemplo, se for digitado "Tatoo" no campo de texto, o planeta "Tatooine" deve ser exibido, como demonstrado na
Observações técnicas
-
Você deve usar Context API e Hooks para fazer o gerenciamento do estado da aplicação;
-
O campo de texto deve possuir a propriedade data-testid='name-filter'
para que a avaliação automatizada funcione;
-
O texto digitado deve ser salvo num campo { filterByName: { name } }
. Por exemplo:
{
filterByName: {
name: 'Tatoo'
}
}
Observações técnicas
-
Você deve usar Context API e Hooks para fazer o gerenciamento do estado da aplicação;
-
O campo de texto deve possuir a propriedade
data-testid='name-filter'
para que a avaliação automatizada funcione; -
O texto digitado deve ser salvo num campo
{ filterByName: { name } }
. Por exemplo:{ filterByName: { name: 'Tatoo' } }
O que será verificado
- Renderiza o campo de texto para o filtro de nomes;
- Filtra os planetas que possuem a letra "o" no nome;
- Filtra planetas que possuem a letra "oo" no nome;
- Realiza os dois filtros acima em sequência e após, testa a remoção do filtro por texto.
O filtro funcionará com três seletores:
- O primeiro deve abrir um dropdown que permita a quem usa selecionar uma das seguintes colunas:
population
,orbital_period
,diameter
,rotation_period
esurface_water
. Deve ser uma tagselect
com a propriedadedata-testid='column-filter'
; - O segundo deve determinar se a faixa de valor será
maior que
,menor que
ouigual a
o numero que virá a seguir. Uma tagselect
com a propriedadedata-testid='comparison-filter'
; - O terceiro deve ser uma caixa de texto que só aceita números. Essa caixa deve ser uma tag
input
com a propriedadedata-testid='value-filter'
; - Deve haver um botão para acionar o filtro, com a propriedade
data-testid='button-filter'
A combinação desses três seletores, ao clicar no botão, deve filtrar os dados da tabela de acordo com a coluna correspondente e com os valores escolhidos. Por exemplo:
- A seleção
population | maior que | 100000
- Seleciona somente planetas com mais de 100000 habitantes. - A seleção
diameter | menor que | 8000
- Seleciona somente planetas com diâmetro menor que 8000.
Observações técnicas
-
Você deve usar Context API e Hooks para fazer o gerenciamento do estado da aplicação;
-
No contexto, esses valores devem ser salvos em um outro campo
{ filterByNumericValues: [{ column, comparison, value }] }
. Por exemplo:{ filterByNumericValues: [ { column: 'population', comparison: 'maior que', value: '100000', } ] }
O que será verificado
- Renderiza o select de coluna e suas opções;
- Renderiza o select de comparação e suas opções;
- Renderiza o input para o valor do filtro;
- Renderiza o botão para executar a filtragem;
- Verifica se os valores iniciais de cada campo são (
population
|maior que
|0
); - Utiliza o botão de filtrar sem alterar os valores iniciais dos inputs de filtro;
- Filtra utilizando a comparação "menor que";
- Filtra utilizando a comparação "maior que";
- Filtra utilizando a comparação "igual a".
Por exemplo, você pode filtrar pelos planetas que possuam Orbital period maior que 400 e Diameter menor que 10000.
O que será verificado
- Adiciona dois filtros e verifica se a tabela foi atualizada com as informações filtradas;
- Adiciona três filtros e verifica se a tabela foi atualizada com as informações filtradas.
👀 Observação: Neste requisito vamos cobrir a aplicação com testes unitários utilizando a biblioteca React Testing Library, aproveite essa oportunidade para colocar em prática o Desenvolvimento Orientado por Testes.
Observações técnicas
- Os testes criados por você não irão influenciar os outros requisitos no avaliador. Você deverá desenvolver seus testes unitários/integração usando a biblioteca React Testing Library, enquanto o avaliador usará a biblioteca Cypress para avaliar os requisitos, inclusive os de cobertura.
O que será verificado
- Será validado se, ao executar
npm run test-coverage
, é obtido os seguintes resultados:% Stmts
da linhaAll files
é maior ou igual a 50.% Branch
da linhaAll files
é maior ou igual a 50.% Funcs
da linhaAll files
é maior ou igual a 50.% Lines
da linhaAll files
é maior ou igual a 50.
Caso um filtro seja totalmente preenchido, um novo filtro de valores numéricos deve ser carregado.
- Este novo filtro não deve incluir quaisquer colunas que já tenham sido selecionadas em filtros de valores numéricos anteriores;
- Caso todas as colunas já tenham sido inclusas em filtros anteriores, não deve ser carregado um novo filtro;
- Você deve usar Context API e Hooks para fazer o gerenciamento do estado da aplicação.
Exemplo:
-
O primeiro filtro tem as seguintes seleções:
population | maior que | 100000
; -
Um segundo filtro deve aparecer após essas seleções serem todas feitas;
-
No primeiro dropdown deste segundo filtro, a opção
population
deve estar ausente; -
Se no segundo filtro fosse selecionado `diameter | menor que | 8000`, o estado ficaria assim:
{ filterByNumericValues: [ { column: 'population', comparison: 'maior que', value: '100000', }, { column: 'diameter', comparison: 'menor que', value: '8000', } ] }
O que será verificado
- Filtra por população e remove a opção
population
das opções do dropdown de filtro por coluna.
7 - Apague um filtro de valor numérico ao clicar no ícone X
de um dos filtros e apague todas filtragens numéricas simultaneamente ao clicar em outro botão de Remover todas filtragens
-
O
button
que permite exclusão de um filtro deve existir em todos os filtros de valores numéricos:-
Cada linha que demonstra o filtro já utilizado deve possuir a propriedade
data-testid='filter'
, com umbutton
que deve ser filho direto da tag onde foi utilizado odata-testid='filter'
; -
Após a exclusão, a coluna que este filtro selecionava deve passar a ficar disponível nos dropdowns dos demais filtros já presentes na tela;
-
Você deve usar Context API e Hooks para fazer o gerenciamento do estado da aplicação.
-
Exemplo:
data-testid='filter' ⬑ column ⬑ comparison ⬑ value ⬑ button
-
- O
button
deRemover todas filtragens
deverá possuir odata-testid='button-remove-filters'
. Estebutton
será responsável pela remoção de todos os filtros numéricos simultaneamente.
O que será verificado
- Adiciona um filtro e verifica se a tabela foi atualizada com as informações filtradas, depois remove o filtro e verifica se os valores da tabela voltaram ao original.
- Adiciona dois filtros e verifica se a tabela foi atualizada com as informações filtradas, depois remove os filtros e verifica se os valores da tabela voltaram ao original.
- Adiciona três filtros e verifica se a tabela foi atualizada com as informações filtradas, depois remove os filtros utilizando o botão
button-remove-filters
e verifica se os valores da tabela voltaram ao original.
Observações técnicas
- Os testes criados por você não irão influenciar os outros requisitos no avaliador. Você deverá desenvolver seus testes unitários/integração usando a biblioteca React Testing Library, enquanto o avaliador usará a biblioteca Cypress para avaliar os requisitos, inclusive os de cobertura.
O que será verificado
- Será validado se, ao executar
npm run test-coverage
, é obtido os seguintes resultados:% Stmts
da linhaAll files
é maior ou igual a 90.% Branch
da linhaAll files
é maior ou igual a 90.% Funcs
da linhaAll files
é maior ou igual a 90.% Lines
da linhaAll files
é maior ou igual a 90.
-
A ordenação deve ser feita via filtro: um dropdown selecionará a coluna a basear a ordenação e um par de radio buttons determinará se é ascendente ou descendente.
-
A informação acerca da ordenação das colunas deve ser armazenada em um novo campo
{ order: { column: 'population', sort: 'ASC'} }
:-
O campo
column
representa o nome da coluna a ordenar; -
O campo
sort
representa a ordenação, sendo 'ASC' ascendente e 'DESC' descendente; -
Por padrão, a tabela começa ordenada por ordem alfabética. Por exemplo:
{ order: { column: 'population', sort: 'ASC', } }
-
-
O dropdown deve ser um elemento
select
:-
O
dropdown
precisa ter a propriedadedata-testid='column-sort'
; -
As colunas selecionáveis através deste
dropdown
são:- 'population';
- 'orbital_period';
- 'diameter';
- 'rotation_period';
- 'surface_water'.
-
-
É necessário ter dois
inputs
de tiporadio
:- O primeiro deve possuir o atributo
data-testid='column-sort-input-asc'
evalue
sendoASC
; - O segundo deve possuir o atributo
data-testid='column-sort-input-desc'
evalue
sendoDESC
;
- O primeiro deve possuir o atributo
-
👀 Caso a coluna ordenada possua planetas com valores
unknown
, você deverá ordená-los de forma que valoresunknown
ficarão em último lugar na ordenação. -
Por fim, crie um botão para submeter a ordenação, com uma tag
button
e a propriedadedata-testid='column-sort-button'
. -
Adicione o atributo
data-testid
com o valorplanet-name
em todos os elementos da tabela que possuem o nome de um planeta.
O que será verificado
- Verifica ordenação inicial;
- Ordena os planetas do maior período orbital para o menor período orbital;
- Ordena os planetas do menor diametro para o maior diametro;
- Ordena os planetas do mais populoso para o menos populoso;
- Verifica se os oito primeiros planetas estão ordenados corretamente;
- Verifica se os dois últimos planetas possuem os valores unknown na coluna population.