149 lines
5.4 KiB
TypeScript
149 lines
5.4 KiB
TypeScript
import { pokedexSlice } from 'features/Pokedex/pokedexSlice';
|
|
import { pokeApi } from 'app/services/pokeApi';
|
|
import { filterSlice } from 'features/Filters/filterSlice';
|
|
import { getIdFromUrl } from 'app/services/pokeApi';
|
|
|
|
import { configureStore } from '@reduxjs/toolkit';
|
|
|
|
import { AppStore } from 'app/store';
|
|
import {
|
|
EvolutionChainResponseData,
|
|
PokemonResponseData,
|
|
PokemonSpeciesResponseData,
|
|
TypeListResponseData,
|
|
} from 'types/api';
|
|
|
|
let store: AppStore;
|
|
|
|
describe('pokeApi', () => {
|
|
beforeEach(() => {
|
|
store = configureStore({
|
|
reducer: {
|
|
pokedex: pokedexSlice.reducer,
|
|
filter: filterSlice.reducer,
|
|
[pokeApi.reducerPath]: pokeApi.reducer,
|
|
},
|
|
middleware: getDefaultMiddleware =>
|
|
getDefaultMiddleware().concat(pokeApi.middleware),
|
|
});
|
|
});
|
|
|
|
describe('JEST test against mock API', () => {
|
|
describe('test getPokemon query', () => {
|
|
test('visit https://pokeapi.co/api/v2/pokemon/85 returns Dodrio', async () => {
|
|
await store.dispatch(pokeApi.endpoints.getPokemon.initiate(85));
|
|
|
|
const pokemon = pokeApi.endpoints.getPokemon.select(85)(
|
|
store.getState(),
|
|
).data as PokemonResponseData;
|
|
expect(pokemon?.name).toBe('dodrio');
|
|
expect(pokemon?.types).toHaveLength(2);
|
|
expect(pokemon?.types[0].type.name).toBe('normal');
|
|
expect(pokemon?.types[1].type.name).toBe('flying');
|
|
expect(pokemon?.sprites.other.dream_world.front_default).toBe(
|
|
'https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/other/dream-world/85.svg',
|
|
);
|
|
});
|
|
});
|
|
|
|
describe('test getPokemonSpecies query', () => {
|
|
test('visit https://pokeapi.co/api/v2/pokemon-species/6/', async () => {
|
|
await store.dispatch(pokeApi.endpoints.getPokemonSpecies.initiate(6));
|
|
|
|
const pokemonSpecies = pokeApi.endpoints.getPokemonSpecies.select(6)(
|
|
store.getState(),
|
|
).data as PokemonSpeciesResponseData;
|
|
expect(pokemonSpecies?.evolution_chain.url).toBe(
|
|
'https://pokeapi.co/api/v2/evolution-chain/2/',
|
|
);
|
|
});
|
|
});
|
|
|
|
describe('test getPokemonSpecies query', () => {
|
|
test('visit https://pokeapi.co/api/v2/pokemon-species/6/', async () => {
|
|
await store.dispatch(
|
|
pokeApi.endpoints.getPokemonSpeciesFromUrl.initiate(
|
|
'https://pokeapi.co/api/v2/pokemon-species/6/',
|
|
),
|
|
);
|
|
|
|
const pokemonSpecies =
|
|
pokeApi.endpoints.getPokemonSpeciesFromUrl.select(
|
|
'https://pokeapi.co/api/v2/pokemon-species/6/',
|
|
)(store.getState()).data as PokemonSpeciesResponseData;
|
|
expect(pokemonSpecies?.evolution_chain.url).toBe(
|
|
'https://pokeapi.co/api/v2/evolution-chain/2/',
|
|
);
|
|
});
|
|
});
|
|
|
|
describe('test getTypeList query', () => {
|
|
test('visit https://pokeapi.co/api/v2/type should return correct data in list', async () => {
|
|
await store.dispatch(pokeApi.endpoints.getTypeList.initiate());
|
|
|
|
const typeListData = pokeApi.endpoints.getTypeList.select()(
|
|
store.getState(),
|
|
).data as TypeListResponseData;
|
|
expect(typeListData?.results).toHaveLength(typeListData.count + 1);
|
|
});
|
|
});
|
|
|
|
describe('test getEvolutionChain query', () => {
|
|
test('visit https://pokeapi.co/api/v2/evolution-chain/2/', async () => {
|
|
await store.dispatch(pokeApi.endpoints.getEvolutionChain.initiate(2));
|
|
|
|
const evolutionChainData = pokeApi.endpoints.getEvolutionChain.select(
|
|
2,
|
|
)(store.getState()).data as EvolutionChainResponseData;
|
|
expect(evolutionChainData?.chain.species.url).toBe(
|
|
'https://pokeapi.co/api/v2/pokemon-species/4/',
|
|
);
|
|
expect(evolutionChainData?.chain.evolves_to[0].species.url).toBe(
|
|
'https://pokeapi.co/api/v2/pokemon-species/5/',
|
|
);
|
|
expect(
|
|
evolutionChainData?.chain.evolves_to[0].evolves_to[0].species.url,
|
|
).toBe('https://pokeapi.co/api/v2/pokemon-species/6/');
|
|
});
|
|
});
|
|
|
|
describe('test getEvolutionChainFromUrl query', () => {
|
|
test('visit https://pokeapi.co/api/v2/evolution-chain/2/', async () => {
|
|
await store.dispatch(
|
|
pokeApi.endpoints.getEvolutionChainFromUrl.initiate(
|
|
'https://pokeapi.co/api/v2/evolution-chain/2/',
|
|
),
|
|
);
|
|
|
|
const evolutionChainData =
|
|
pokeApi.endpoints.getEvolutionChainFromUrl.select(
|
|
'https://pokeapi.co/api/v2/evolution-chain/2/',
|
|
)(store.getState()).data as EvolutionChainResponseData;
|
|
expect(evolutionChainData?.chain.species.url).toBe(
|
|
'https://pokeapi.co/api/v2/pokemon-species/4/',
|
|
);
|
|
expect(evolutionChainData?.chain.evolves_to[0].species.url).toBe(
|
|
'https://pokeapi.co/api/v2/pokemon-species/5/',
|
|
);
|
|
expect(
|
|
evolutionChainData?.chain.evolves_to[0].evolves_to[0].species.url,
|
|
).toBe('https://pokeapi.co/api/v2/pokemon-species/6/');
|
|
});
|
|
});
|
|
});
|
|
|
|
describe('test helper functions', () => {
|
|
test('getIdFromUrl works correctly for PokemonSpecies', () => {
|
|
const url = 'https://pokeapi.co/api/v2/pokemon-species/6/';
|
|
const id = getIdFromUrl(url);
|
|
expect(id).toBe(6);
|
|
});
|
|
|
|
test('getIdFromUrl works correctly for evolution-chain', () => {
|
|
const url = 'https://pokeapi.co/api/v2/evolution-chain/2/';
|
|
const id = getIdFromUrl(url);
|
|
expect(id).toBe(2);
|
|
});
|
|
});
|
|
});
|