// Testa a API do Hotel das Lojas com a sua chave. Uso: HDL_CHAVE=hdl_live_... node testar-api.mjs [--escrita] // --escrita cria uma categoria e um produto OCULTOS de teste, ajusta o estoque e desativa o produto no fim. const BASE = process.env.HDL_BASE || 'https://api.hoteldaslojas.com.br/v1'; const CHAVE = process.env.HDL_CHAVE; if (!CHAVE) { console.error('Defina HDL_CHAVE (crie em Configurações › API e webhooks).'); process.exit(1); } const ESCRITA = process.argv.includes('--escrita'); let ok = 0, falha = 0, sem = 0; async function chama(metodo, caminho, corpo) { const t0 = Date.now(); const r = await fetch(BASE + caminho, { method: metodo, headers: { Authorization: `Bearer ${CHAVE}`, 'Content-Type': 'application/json', 'User-Agent': 'HotelDasLojas-Teste/1.0 (node)' }, body: corpo ? JSON.stringify(corpo) : undefined }); const ms = Date.now() - t0; const json = r.status === 204 ? null : await r.json().catch(() => null); const linha = `${metodo.padEnd(5)} ${caminho.padEnd(36)} ${r.status}`; if (r.ok) { ok++; console.log(` ✔ ${linha} ${String(ms).padStart(5)} ms`); } else if (r.status === 403) { sem++; console.log(` – ${linha} sem permissão`); } else { falha++; console.log(` ✘ ${linha} ${json?.erro?.codigo}: ${json?.erro?.mensagem}`); } return json?.dados; } const primeiro = (d) => (Array.isArray(d) ? d[0] : d); console.log(`API do Hotel das Lojas · ${BASE}\n`); const loja = await chama('GET', '/loja'); if (loja) console.log(` Loja: ${loja.nome} (${loja.url})`); const p = primeiro(await chama('GET', '/produtos?por_pagina=5')); if (p) { await chama('GET', `/produtos/${p.id}`); await chama('GET', `/produtos/${p.id}/estoque`); await chama('GET', `/produtos/${p.id}/imagens`); } await chama('GET', '/categorias'); const ped = primeiro(await chama('GET', '/pedidos?por_pagina=5')); if (ped) await chama('GET', `/pedidos/${ped.id}`); await chama('GET', '/clientes?por_pagina=5'); await chama('GET', '/cupons'); await chama('GET', '/webhooks'); for (const r of ['/frete/faixas-cep', '/promocoes', '/avaliacoes?por_pagina=5', '/blog', '/cartoes-presente', '/relatorios/resumo']) await chama('GET', r); if (ESCRITA) { console.log('\nEscrita (produto oculto de teste):'); const cat = await chama('POST', '/categorias', { nome: 'Teste da API', visivel: false }); if (cat) { const np = await chama('POST', '/produtos', { nome: 'Produto de teste da API', preco: 10, categoria_id: cat.id, visivel: false, estoque: { controlado: true, quantidade: 5 } }); if (np) { const est = await chama('PUT', `/produtos/${np.id}/estoque`, { operacao: 'somar', quantidade: 3, motivo: 'teste da API' }); if (est && est.quantidade !== 8) { falha++; console.log(` ✘ estoque esperado 8, veio ${est.quantidade}`); } await chama('PATCH', `/produtos/${np.id}`, { ativo: false }); } await chama('PATCH', `/categorias/${cat.id}`, { ativo: false }); } } console.log(`\n${ok} ok · ${falha} falhas · ${sem} sem permissão`); process.exit(falha ? 1 : 0);