#!/usr/bin/env python3 """Testa a API do Hotel das Lojas com a sua chave. Uso: HDL_CHAVE=hdl_live_... python3 testar_api.py [--escrita] --escrita cria uma categoria e um produto OCULTOS de teste, ajusta o estoque e desativa o produto no fim.""" import json, os, sys, time, urllib.request, urllib.error try: # cadeia de certificados atualizada (Python antigo no Windows pode nao conhecer a raiz nova da Let's Encrypt) import certifi, ssl CTX = ssl.create_default_context(cafile=certifi.where()) except ImportError: CTX = None BASE = os.environ.get('HDL_BASE', 'https://api.hoteldaslojas.com.br/v1') CHAVE = os.environ.get('HDL_CHAVE') if not CHAVE: sys.exit('Defina HDL_CHAVE (crie em Configurações › API e webhooks).') ESCRITA = '--escrita' in sys.argv cont = {'ok': 0, 'falha': 0, 'sem': 0} def chama(metodo, caminho, corpo=None): req = urllib.request.Request(BASE + caminho, method=metodo, data=json.dumps(corpo).encode() if corpo is not None else None, headers={'Authorization': 'Bearer ' + CHAVE, 'Content-Type': 'application/json', 'User-Agent': 'HotelDasLojas-Teste/1.0 (python)'}) t0 = time.time() try: with urllib.request.urlopen(req, timeout=30, context=CTX) as r: st, txt = r.status, r.read().decode() except urllib.error.HTTPError as e: st, txt = e.code, e.read().decode() except urllib.error.URLError as e: sys.exit('Sem conexao segura com a API (%s). Se for erro de certificado, rode: pip install --upgrade certifi' % e.reason) ms = int((time.time() - t0) * 1000) d = json.loads(txt) if txt else {} linha = '%-5s %-36s %s' % (metodo, caminho, st) if 200 <= st < 300: cont['ok'] += 1; print(' ✔ %s %5d ms' % (linha, ms)); return d.get('dados') if st == 403: cont['sem'] += 1; print(' – %s sem permissão' % linha) else: cont['falha'] += 1; print(' ✘ %s %s: %s' % (linha, d.get('erro', {}).get('codigo'), d.get('erro', {}).get('mensagem'))) return None primeiro = lambda d: d[0] if isinstance(d, list) and d else (d if isinstance(d, dict) else None) print('API do Hotel das Lojas · %s\n' % BASE) loja = chama('GET', '/loja') if loja: print(' Loja: %s (%s)' % (loja['nome'], loja['url'])) p = primeiro(chama('GET', '/produtos?por_pagina=5')) if p: chama('GET', '/produtos/%d' % p['id']); chama('GET', '/produtos/%d/estoque' % p['id']); chama('GET', '/produtos/%d/imagens' % p['id']) chama('GET', '/categorias') ped = primeiro(chama('GET', '/pedidos?por_pagina=5')) if ped: chama('GET', '/pedidos/%d' % ped['id']) chama('GET', '/clientes?por_pagina=5'); chama('GET', '/cupons'); chama('GET', '/webhooks') for r in ('/frete/faixas-cep', '/promocoes', '/avaliacoes?por_pagina=5', '/blog', '/cartoes-presente', '/relatorios/resumo'): chama('GET', r) if ESCRITA: print('\nEscrita (produto oculto de teste):') cat = chama('POST', '/categorias', {'nome': 'Teste da API', 'visivel': False}) if cat: np = chama('POST', '/produtos', {'nome': 'Produto de teste da API', 'preco': 10, 'categoria_id': cat['id'], 'visivel': False, 'estoque': {'controlado': True, 'quantidade': 5}}) if np: chama('PUT', '/produtos/%d/estoque' % np['id'], {'operacao': 'somar', 'quantidade': 3, 'motivo': 'teste da API'}) chama('PATCH', '/produtos/%d' % np['id'], {'ativo': False}) chama('PATCH', '/categorias/%d' % cat['id'], {'ativo': False}) print('\n%d ok · %d falhas · %d sem permissão' % (cont['ok'], cont['falha'], cont['sem'])) sys.exit(1 if cont['falha'] else 0)