test_prompts.py 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. """Tests des textes envoyés à Claude et aux membres. Lancer depuis la racine du projet : python -m unittest"""
  2. import os
  3. import tempfile
  4. import unittest
  5. from pathlib import Path
  6. from types import SimpleNamespace
  7. from bot.claude_client import ClaudeClient
  8. from bot.prompts import DEFAULT_PERSONALITY, MEMBER_MEMORY_NOTE
  9. class PromptsTest(unittest.TestCase):
  10. def test_memory_note_formats(self):
  11. # Une accolade de trop ou un champ oublié ferait planter chaque message avec MEMORY=on.
  12. note = MEMBER_MEMORY_NOTE.format(member_limit=3000, server_limit=5000, max_nicknames=5, max_nickname_length=32)
  13. self.assertNotIn("{", note)
  14. self.assertIn("ne récite jamais la fiche", note)
  15. class PersonalityTest(unittest.TestCase):
  16. def setUp(self):
  17. self._tmp = tempfile.TemporaryDirectory()
  18. self.path = Path(self._tmp.name) / "personality_prompt.txt"
  19. # Sans __init__ : pas de client Anthropic à créer.
  20. self.client = ClaudeClient.__new__(ClaudeClient)
  21. self.client.settings = SimpleNamespace(personality_file=self.path)
  22. self.client._personality_cache = None
  23. def tearDown(self):
  24. self._tmp.cleanup()
  25. def write(self, data: bytes, mtime: int):
  26. self.path.write_bytes(data)
  27. os.utime(self.path, (mtime, mtime)) # deux écritures rapprochées auraient la même date
  28. def test_not_utf8_keeps_last_valid(self):
  29. self.write("Tu es Rika, très gentille.".encode("utf-8"), 1000)
  30. self.assertEqual(self.client.personality(), "Tu es Rika, très gentille.")
  31. self.write("Tu es Rika, très méchante.".encode("cp1252"), 2000)
  32. with self.assertLogs("chatbot.claude", "ERROR") as logs:
  33. self.assertEqual(self.client.personality(), "Tu es Rika, très gentille.")
  34. self.assertIn("UTF-8", logs.output[0])
  35. self.assertIn("dernière valide", logs.output[0])
  36. with self.assertNoLogs("chatbot.claude", "ERROR"): # une seule erreur par version du fichier
  37. self.client.personality()
  38. self.write("Tu es Rika, réparée.".encode("utf-8"), 3000)
  39. self.assertEqual(self.client.personality(), "Tu es Rika, réparée.")
  40. def test_not_utf8_at_start_uses_default(self):
  41. self.write("Tu es Rika, très méchante.".encode("cp1252"), 1000)
  42. with self.assertLogs("chatbot.claude", "ERROR") as logs:
  43. self.assertEqual(self.client.personality(), DEFAULT_PERSONALITY)
  44. self.assertIn("par défaut", logs.output[0])
  45. def test_directory(self):
  46. self.path.mkdir()
  47. with self.assertLogs("chatbot.claude", "ERROR") as logs:
  48. self.assertEqual(self.client.personality(), DEFAULT_PERSONALITY)
  49. self.assertIn("est un dossier", logs.output[0])
  50. if __name__ == "__main__":
  51. unittest.main()