"""Contrat JSON de `POST /v1/process` — voir `schemas.py`/`routes/process.py`. Le service s'entraîne désormais lui-même au démarrage sur le vrai corpus (`training_data.TECH_STEP_TRAINING_DATA`, voir `conftest.py`'s fixture `client` partagée) — ces tests vérifient donc le contrat HTTP contre des phrases réelles du corpus, plus besoin d'un `POST /v1/train` préalable avec des données jouets. """ from fastapi.testclient import TestClient from intent_service.config import settings _HEADERS = {"X-Intent-Service-Secret": settings.intent_service_secret} def test_process_against_an_unsupported_locale_returns_empty_result(client: TestClient): # "de" n'a aucun modèle spaCy connu (`SUPPORTED_LOCALES`) — se comporte # comme "jamais entraîné" côté `/v1/process`, jamais une erreur (voir # `PipelineRegistry.process`). response = client.post( "/v1/process", headers=_HEADERS, json={"locale": "de", "text": "faire mijoter à feu doux"} ) assert response.status_code == 200 assert response.json() == {"entities": [], "intent": None, "score": 0.0} def test_process_returns_entities_and_intent_for_a_real_corpus_sentence(client: TestClient): 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_matches_english_text_against_the_english_trained_vocabulary(client: TestClient): response = client.post( "/v1/process", headers=_HEADERS, json={"locale": "en", "text": "Chop the onions finely"} ) assert response.status_code == 200 body = response.json() assert [entity["uid"] for entity in body["entities"]] == ["chop"] def test_process_with_blank_text_returns_empty_result(client: TestClient): response = client.post("/v1/process", headers=_HEADERS, json={"locale": "fr", "text": " "}) assert response.status_code == 200 assert response.json() == {"entities": [], "intent": None, "score": 0.0}