// O mesmo roteiro contra os dois clientes configurados. A saída das duas // rodadas deve ser igual: quem chama não depende da biblioteca por baixo. import { ADMINISTRADOR, API_FORA_DO_AR, LEITORA, NOVO_LIVRO, type Livro, type Pagina } from './api.js'; import { criarClienteAxios } from './cliente-axios.js'; import { criarClienteFetch } from './cliente-fetch.js'; import { ErroDaApi, sessao, type ClienteDaApi } from './erro-da-api.js'; async function tentar(rotulo: string, operacao: () => Promise): Promise { try { console.log(` ${rotulo.padEnd(28)} → ${await operacao()}`); } catch (erro) { if (!(erro instanceof ErroDaApi)) throw erro; console.log(` ${rotulo.padEnd(28)} → ErroDaApi ${erro.status ?? 'sem status'} · ${erro.detalhes[0]}`); } } async function roteiro(api: ClienteDaApi): Promise { sessao.token = undefined; const acervo = await api.get>('/livros?tamanho=100'); const livro = { ...NOVO_LIVRO, autorId: acervo.dados[0].autor.id }; await tentar('GET /livros', async () => `${acervo.total} livros`); await tentar('GET /livros/999999', async () => (await api.get('/livros/999999')).titulo); await tentar('POST /livros sem token', async () => (await api.post('/livros', livro)).titulo); sessao.token = (await api.post<{ accessToken: string }>('/auth/login', LEITORA)).accessToken; await tentar('POST /livros como LEITOR', async () => (await api.post('/livros', livro)).titulo); sessao.token = (await api.post<{ accessToken: string }>('/auth/login', ADMINISTRADOR)).accessToken; let id = 0; await tentar('POST /livros como ADMIN', async () => { const criado = await api.post('/livros', livro); id = criado.id; return `${criado.titulo} (${criado.ano})`; }); await tentar('POST repetido (mesmo ISBN)', async () => (await api.post('/livros', livro)).titulo); await tentar('PATCH ano', async () => `ano ${(await api.patch(`/livros/${id}`, { ano: 1892 })).ano}`); await tentar('DELETE', async () => { await api.delete(`/livros/${id}`); return 'removido'; }); } for (const [nome, criar] of [ ['axios', criarClienteAxios], ['fetch', criarClienteFetch], ] as const) { console.log(`--- cliente sobre ${nome}`); await roteiro(criar()); } // Sem resposta: a API fora do ar produz o mesmo tipo de erro, sem status. console.log('--- API fora do ar'); await tentar('axios GET /livros', async () => String(await criarClienteAxios(API_FORA_DO_AR).get('/livros'))); await tentar('fetch GET /livros', async () => String(await criarClienteFetch(API_FORA_DO_AR).get('/livros')));