#!/usr/bin/env python3 from __future__ import annotations import unittest from argparse import Namespace from pathlib import Path from tempfile import TemporaryDirectory from wechat_bot_bridge import WechatXibaoBridge class WechatBotBridgeSkipTests(unittest.TestCase): def _new_bridge(self, tmp_dir: str) -> WechatXibaoBridge: base = Path(tmp_dir) args = Namespace( wechat_base_url="http://127.0.0.1:18238", xibao_base_url="http://127.0.0.1:8787", wechat_auth_key="", wechat_session_file=str(base / "session.json"), sync_count=30, poll_interval=2.0, max_images=3, once=True, dry_run=True, allow_from="", state_file=str(base / "state.json"), meta_file=str(base / "meta.json"), daily_cleanup_time="00:10", ) return WechatXibaoBridge(args) def test_parse_skip_command(self) -> None: with TemporaryDirectory() as tmp_dir: bridge = self._new_bridge(tmp_dir) cmd = bridge.parse_command("跳过3") self.assertIsNotNone(cmd) self.assertEqual(cmd.get("action"), "set_skip") self.assertEqual(cmd.get("count"), "3") cmd2 = bridge.parse_command("跳过(12)") self.assertIsNotNone(cmd2) self.assertEqual(cmd2.get("action"), "set_skip") self.assertEqual(cmd2.get("count"), "12") def test_apply_daily_skip_to_numbered_lines(self) -> None: with TemporaryDirectory() as tmp_dir: bridge = self._new_bridge(tmp_dir) bridge.set_daily_skip("wxid_u1", 2) raw = "#接龙\n1、第一条\n2、第二条\n3、第三条\n说明文本" text, removed, requested = bridge.apply_daily_skip_to_raw_text("wxid_u1", raw) self.assertEqual(requested, 2) self.assertEqual(removed, 2) self.assertIn("3、第三条", text) self.assertNotIn("1、第一条", text) self.assertNotIn("2、第二条", text) def test_skip_zero_clears_setting(self) -> None: with TemporaryDirectory() as tmp_dir: bridge = self._new_bridge(tmp_dir) bridge.set_daily_skip("wxid_u2", 5) self.assertEqual(bridge.get_daily_skip("wxid_u2"), 5) bridge.set_daily_skip("wxid_u2", 0) self.assertEqual(bridge.get_daily_skip("wxid_u2"), 0) def test_stale_daily_skip_is_invalidated(self) -> None: with TemporaryDirectory() as tmp_dir: bridge = self._new_bridge(tmp_dir) bridge.meta["daily_skip"] = { "wxid_old": { "date": "2000-01-01", "count": 3, "updated_at": "2000-01-01T00:00:00", } } value = bridge.get_daily_skip("wxid_old") self.assertEqual(value, 0) self.assertNotIn("wxid_old", bridge.meta.get("daily_skip", {})) if __name__ == "__main__": unittest.main()