Files
kefu/wechat_rpa/test_wxwork_message_browser.py
T
2026-09-21 10:34:06 +08:00

98 lines
3.9 KiB
Python

# -*- coding: utf-8 -*-
import sqlite3
import tempfile
import unittest
from unittest import mock
from pathlib import Path
from wxwork_message_browser import load_browser_snapshot
class WeChatMessageBrowserTests(unittest.TestCase):
def _database(self, root: Path, account: str) -> Path:
account_root = root / account
account_root.mkdir(parents=True)
message = sqlite3.connect(account_root / "message.db")
message.execute(
"""CREATE TABLE message_table(
sender_id TEXT,conversation_id TEXT,content_type INTEGER,
send_time INTEGER,content BLOB,server_id TEXT,client_id TEXT
)"""
)
message.executemany(
"INSERT INTO message_table VALUES(?,?,?,?,?,?,?)",
[
("200", "M:200", 2, 100, "你好", "s1", "c1"),
(account, "M:200", 2, 101, "您好,请问有什么可以帮您?", "s2", "c2"),
("300", f"S:{account}_300", 3, 102, b"", "s3", "c3"),
],
)
message.commit()
message.close()
user = sqlite3.connect(account_root / "user.db")
user.execute("CREATE TABLE user_table(id TEXT,name TEXT,real_name TEXT,account TEXT)")
user.executemany(
"INSERT INTO user_table VALUES(?,?,?,?)",
[(account, "客服一号", "", ""), ("200", "张女士", "", ""), ("300", "李先生", "", "")],
)
user.commit()
user.close()
session = sqlite3.connect(account_root / "session.db")
session.execute(
"CREATE TABLE conversation_table(id TEXT,name TEXT,roomname_remark TEXT,session_id TEXT)"
)
session.executemany(
"INSERT INTO conversation_table VALUES(?,?,?,?)",
[("M:200", "张女士", "", ""), (f"S:{account}_300", "李先生", "", "")],
)
session.commit()
session.close()
return account_root
def test_lists_databases_conversations_and_messages(self):
with tempfile.TemporaryDirectory() as folder:
root = Path(folder)
self._database(root, "100")
state = load_browser_snapshot(cache_roots=[root])
self.assertEqual(state["error"], "")
self.assertEqual(state["accountCount"], 1)
self.assertEqual(state["databaseCount"], 3)
self.assertEqual(state["messageCount"], 3)
self.assertEqual(state["conversationCount"], 2)
self.assertEqual(state["accounts"][0]["name"], "客服一号")
self.assertEqual(state["conversations"][0]["name"], "李先生")
self.assertEqual(state["messages"][0]["type"], "图片")
self.assertEqual(state["messages"][0]["content"], "[图片]")
def test_selects_conversation_and_filters(self):
with tempfile.TemporaryDirectory() as folder:
root = Path(folder)
self._database(root, "100")
state = load_browser_snapshot(
cache_roots=[root],
selected_account="100",
selected_conversation="M:200",
query="张女士",
)
self.assertEqual(len(state["conversations"]), 1)
self.assertEqual(state["selectedConversation"], "M:200")
self.assertEqual([item["direction"] for item in state["messages"]], ["inbound", "outbound"])
self.assertEqual(state["messages"][0]["sender"], "张女士")
def test_empty_cache_returns_actionable_error(self):
with tempfile.TemporaryDirectory() as folder:
with mock.patch("wxwork_message_browser._refresh_cache", return_value=("", "尚未找到数据库")):
state = load_browser_snapshot(cache_roots=[Path(folder)])
self.assertIn("尚未找到", state["error"])
self.assertEqual(state["accounts"], [])
if __name__ == "__main__":
unittest.main()