pokertk/src/app/services/pokeApi.test.ts

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);
});
});
});