|
@@ -1,8 +1,12 @@
|
|
|
"""Tests des textes envoyés à Claude et aux membres. Lancer depuis la racine du projet : python -m unittest"""
|
|
"""Tests des textes envoyés à Claude et aux membres. Lancer depuis la racine du projet : python -m unittest"""
|
|
|
|
|
|
|
|
|
|
+import os
|
|
|
|
|
+import tempfile
|
|
|
import unittest
|
|
import unittest
|
|
|
|
|
+from pathlib import Path
|
|
|
|
|
+from types import SimpleNamespace
|
|
|
|
|
|
|
|
-from bot.claude_client import MEMBER_MEMORY_NOTE
|
|
|
|
|
|
|
+from bot.claude_client import DEFAULT_PERSONALITY, MEMBER_MEMORY_NOTE, ClaudeClient
|
|
|
|
|
|
|
|
|
|
|
|
|
class PromptsTest(unittest.TestCase):
|
|
class PromptsTest(unittest.TestCase):
|
|
@@ -13,5 +17,47 @@ class PromptsTest(unittest.TestCase):
|
|
|
self.assertIn("ne récite jamais la fiche", note)
|
|
self.assertIn("ne récite jamais la fiche", note)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
+class PersonalityTest(unittest.TestCase):
|
|
|
|
|
+ def setUp(self):
|
|
|
|
|
+ self._tmp = tempfile.TemporaryDirectory()
|
|
|
|
|
+ self.path = Path(self._tmp.name) / "personality_prompt.txt"
|
|
|
|
|
+ # Sans __init__ : pas de client Anthropic à créer.
|
|
|
|
|
+ self.client = ClaudeClient.__new__(ClaudeClient)
|
|
|
|
|
+ self.client.settings = SimpleNamespace(personality_file=self.path)
|
|
|
|
|
+ self.client._personality_cache = None
|
|
|
|
|
+
|
|
|
|
|
+ def tearDown(self):
|
|
|
|
|
+ self._tmp.cleanup()
|
|
|
|
|
+
|
|
|
|
|
+ def write(self, data: bytes, mtime: int):
|
|
|
|
|
+ self.path.write_bytes(data)
|
|
|
|
|
+ os.utime(self.path, (mtime, mtime)) # deux écritures rapprochées auraient la même date
|
|
|
|
|
+
|
|
|
|
|
+ def test_not_utf8_keeps_last_valid(self):
|
|
|
|
|
+ self.write("Tu es Rika, très gentille.".encode("utf-8"), 1000)
|
|
|
|
|
+ self.assertEqual(self.client.personality(), "Tu es Rika, très gentille.")
|
|
|
|
|
+ self.write("Tu es Rika, très méchante.".encode("cp1252"), 2000)
|
|
|
|
|
+ with self.assertLogs("chatbot.claude", "ERROR") as logs:
|
|
|
|
|
+ self.assertEqual(self.client.personality(), "Tu es Rika, très gentille.")
|
|
|
|
|
+ self.assertIn("UTF-8", logs.output[0])
|
|
|
|
|
+ self.assertIn("dernière valide", logs.output[0])
|
|
|
|
|
+ with self.assertNoLogs("chatbot.claude", "ERROR"): # une seule erreur par version du fichier
|
|
|
|
|
+ self.client.personality()
|
|
|
|
|
+ self.write("Tu es Rika, réparée.".encode("utf-8"), 3000)
|
|
|
|
|
+ self.assertEqual(self.client.personality(), "Tu es Rika, réparée.")
|
|
|
|
|
+
|
|
|
|
|
+ def test_not_utf8_at_start_uses_default(self):
|
|
|
|
|
+ self.write("Tu es Rika, très méchante.".encode("cp1252"), 1000)
|
|
|
|
|
+ with self.assertLogs("chatbot.claude", "ERROR") as logs:
|
|
|
|
|
+ self.assertEqual(self.client.personality(), DEFAULT_PERSONALITY)
|
|
|
|
|
+ self.assertIn("par défaut", logs.output[0])
|
|
|
|
|
+
|
|
|
|
|
+ def test_directory(self):
|
|
|
|
|
+ self.path.mkdir()
|
|
|
|
|
+ with self.assertLogs("chatbot.claude", "ERROR") as logs:
|
|
|
|
|
+ self.assertEqual(self.client.personality(), DEFAULT_PERSONALITY)
|
|
|
|
|
+ self.assertIn("est un dossier", logs.output[0])
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
if __name__ == "__main__":
|
|
if __name__ == "__main__":
|
|
|
unittest.main()
|
|
unittest.main()
|