# -*- 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()