-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtest_core.py
More file actions
44 lines (33 loc) · 1.76 KB
/
Copy pathtest_core.py
File metadata and controls
44 lines (33 loc) · 1.76 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
from __future__ import annotations
import unittest
import httpx
from chat_memory import ChatMemory
from deepseek_client import _format_http_error
from qt_gui import _clean_user_input
from rich_text import render_message_html
class CoreTests(unittest.TestCase):
def test_render_sanitizes_script_html(self) -> None:
rendered = render_message_html('<script>alert(1)</script><img src=x onerror=alert(1)>')
self.assertNotIn("<script", rendered.lower())
self.assertNotIn("<img", rendered.lower())
self.assertNotIn("onerror", rendered.lower())
self.assertIn("alert(1)", rendered)
def test_auto_link_uses_safe_attributes(self) -> None:
rendered = render_message_html("see https://example.com/a")
self.assertIn('href="https://example.com/a"', rendered)
self.assertIn('rel="noopener noreferrer"', rendered)
def test_error_redacts_api_key(self) -> None:
response = httpx.Response(401, text="bad key sk-123456abcdef", request=httpx.Request("GET", "https://x.test"))
message = _format_http_error(response)
self.assertIn("sk-***", message)
self.assertNotIn("sk-123456abcdef", message)
def test_clean_user_input_removes_control_chars(self) -> None:
self.assertEqual(_clean_user_input("a\x00b\nc\t"), "ab\nc\t")
def test_chat_memory_truncates_oversized_latest_message(self) -> None:
memory = ChatMemory(system_prompt="system", max_context_messages=4, max_context_chars=120)
memory.add_user_message("x" * 500)
messages = memory.get_messages()
self.assertLessEqual(sum(len(item["content"]) for item in messages), 120)
self.assertTrue(messages[-1]["content"].startswith("[Earlier part truncated"))
if __name__ == "__main__":
unittest.main()