98 lines
3.9 KiB
Python
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()
|