"""Estúdio de criação: receitas validadas, prompt com exemplos/base, IA local (servidor falso) e tocar."""
import json
import sys
import tempfile
import threading
import time
import unittest
from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
import criacao as mod # noqa: E402
from criacao import ATIVIDADES_BASE, EXPRESSOES_BASE, Criacao, montar_prompt, validar_atividade, validar_expressao # noqa: E402
RESPOSTAS = {} # o servidor falso devolve o que o teste colocar aqui
PEDIDOS = []
class IaFalsa(BaseHTTPRequestHandler):
def do_POST(self):
corpo = json.loads(self.rfile.read(int(self.headers['Content-Length'])))
PEDIDOS.append(dict(corpo=corpo, auth=self.headers.get('Authorization')))
tipo = 'expressao' if 'passos' in corpo['response_format']['json_schema']['schema']['properties'] else 'atividade'
texto = 'pensando...\n```json\n' + json.dumps(RESPOSTAS[tipo]) + '\n```'
dados = json.dumps(dict(choices=[dict(message=dict(content=texto))])).encode()
self.send_response(200); self.send_header('Content-Type', 'application/json'); self.send_header('Content-Length', str(len(dados)))
self.end_headers(); self.wfile.write(dados)
def do_GET(self):
dados = json.dumps(dict(data=[dict(id='qwen-teste')])).encode()
self.send_response(200); self.send_header('Content-Length', str(len(dados))); self.end_headers(); self.wfile.write(dados)
def log_message(self, *a):
pass
class CriacaoTest(unittest.TestCase):
def setUp(self):
self.tmp = tempfile.TemporaryDirectory()
self.c = Criacao(Path(self.tmp.name) / 'c.db', Path(self.tmp.name) / 'c.json')
self.ordens = []
self.c.enfileirar = self.ordens.append
def tearDown(self):
self.tmp.cleanup()
def esperar(self):
for _ in range(100):
if not self.c.ocupado:
return
time.sleep(0.05)
self.fail('criação não terminou')
def test_valida_e_limita_expressao(self):
r = validar_expressao(dict(nome='x' * 80, emoji='