From 21f7af9dfe53f32e18d5988b1d612453bad8f831 Mon Sep 17 00:00:00 2001 From: Edern Deneuville Date: Fri, 11 Sep 2026 12:00:17 +0200 Subject: [PATCH] Initial ai typewriter implementation --- tests/test_ai_client.py | 44 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 tests/test_ai_client.py diff --git a/tests/test_ai_client.py b/tests/test_ai_client.py new file mode 100644 index 0000000..dc8cbf7 --- /dev/null +++ b/tests/test_ai_client.py @@ -0,0 +1,44 @@ +from ai_typewriter.ai_client import ask_ai +from ai_typewriter.config import AppConfig + + +class FakeResponse: + def __init__(self, payload): + self.payload = payload + def raise_for_status(self): + return None + def json(self): + return self.payload + + +def test_ollama_payload_contains_strict_system_prompt(monkeypatch): + seen = {} + def fake_post(url, json, timeout, **kwargs): + seen["url"] = url + seen["json"] = json + return FakeResponse({"message": {"content": "ok"}}) + monkeypatch.setattr("ai_typewriter.ai_client.requests.post", fake_post) + + result = ask_ai("texte", AppConfig(provider="ollama", model="m")) + + assert result == "ok" + assert seen["url"].endswith("/api/chat") + assert seen["json"]["messages"][0]["role"] == "system" + assert "Uniquement la réponse brute" in seen["json"]["messages"][0]["content"] + + +def test_gemini_payload(monkeypatch): + seen = {} + def fake_post(url, params, json, timeout): + seen["url"] = url + seen["params"] = params + seen["json"] = json + return FakeResponse({"candidates": [{"content": {"parts": [{"text": "brut"}]}}]}) + monkeypatch.setattr("ai_typewriter.ai_client.requests.post", fake_post) + + result = ask_ai("texte", AppConfig(provider="gemini", model="gemini-1.5-flash", api_key="k")) + + assert result == "brut" + assert seen["params"] == {"key": "k"} + assert seen["url"].endswith("/v1beta/models/gemini-1.5-flash:generateContent") + assert "systemInstruction" in seen["json"]