"""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='