"""Contrat JSON de `POST /v1/process` — voir `schemas.py`/`routes/process.py`.""" import pytest from fastapi.testclient import TestClient from intent_service.config import settings from intent_service.main import app _HEADERS = {"X-Intent-Service-Secret": settings.intent_service_secret} @pytest.fixture def client(): with TestClient(app) as test_client: yield test_client def test_process_against_an_untrained_locale_returns_empty_result(client: TestClient): response = client.post( "/v1/process", headers=_HEADERS, json={"locale": "fr", "text": "faire mijoter à feu doux"} ) assert response.status_code == 200 assert response.json() == {"entities": [], "intent": None, "score": 0.0} def test_process_after_train_returns_entities_and_intent(client: TestClient): client.post( "/v1/train", headers=_HEADERS, json={ "locale": "fr", "entries": [ # `textcat` (exclusive_classes) exige >= 2 labels (voir # LocalePipeline.train) — un second label est nécessaire # même si ce test ne vérifie que celui de "simmer". { "uid": "simmer", "synonyms": ["mijoter"], "utterances": ["faire mijoter à feu doux", "laisser mijoter à couvert"], }, { "uid": "boil", "synonyms": ["bouillir"], "utterances": ["faire bouillir l'eau", "porter à ébullition"], }, ], }, ) response = client.post( "/v1/process", headers=_HEADERS, json={"locale": "fr", "text": "Faire mijoter à feu doux"} ) assert response.status_code == 200 body = response.json() assert body["intent"] == "simmer" assert body["score"] > 0 assert [entity["uid"] for entity in body["entities"]] == ["simmer"] def test_process_with_blank_text_returns_empty_result(client: TestClient): client.post( "/v1/train", headers=_HEADERS, json={ "locale": "en", "entries": [{"uid": "boil", "synonyms": ["boil"], "utterances": ["bring to the boil"]}], }, ) response = client.post("/v1/process", headers=_HEADERS, json={"locale": "en", "text": " "}) assert response.status_code == 200 assert response.json() == {"entities": [], "intent": None, "score": 0.0}