员工岗位可重新启用;调价认空运航线;会话存档跳号补拉;陆运报价按车型列回填
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -226,7 +226,8 @@ class WshotoPollTests(unittest.TestCase):
|
||||
self.assertTrue(out["ok"])
|
||||
call = api.calls[0]
|
||||
self.assertEqual(call.get("msg_time_end"), 1_800_000_000)
|
||||
self.assertEqual(call.get("msg_time_start"), 1_800_000_000 - 180)
|
||||
# 新群回看上限见 poll._NEW_ROOM_LOOKBACK_SEC(3600),须盖过存档延迟。
|
||||
self.assertEqual(call.get("msg_time_start"), 1_800_000_000 - 3600)
|
||||
|
||||
def test_poll_enqueues_member_skips_seat_and_advances_seq(self) -> None:
|
||||
store = MemoryMessageStore()
|
||||
@@ -317,6 +318,82 @@ class WshotoPollTests(unittest.TestCase):
|
||||
self.assertEqual(b, 0)
|
||||
self.assertEqual(skipped, 1)
|
||||
|
||||
def test_room_seq_gap_backfill_keeps_dissolve(self) -> None:
|
||||
"""
|
||||
现网事故:增量只先到「撤回」高 seq,游标一步跳到 9899,
|
||||
中间的「解散群」再也拉不回来。跳号时必须时间窗补洞再推进游标。
|
||||
"""
|
||||
store = MemoryMessageStore()
|
||||
redis = _redis()
|
||||
room = "wr_gap_dissolve"
|
||||
watch_collab_room(room, redis=redis)
|
||||
save_last_seq(f"room:{room}", 9892, redis=redis)
|
||||
|
||||
all_rows = [
|
||||
{
|
||||
"msgid": "m9897",
|
||||
"seq": 9897,
|
||||
"from": "ShiChangChang",
|
||||
"room_id": room,
|
||||
"msgtype": "text",
|
||||
"content": "随便说一句",
|
||||
"msgtime": 1_792_546_051_000,
|
||||
},
|
||||
{
|
||||
"msgid": "m9898",
|
||||
"seq": 9898,
|
||||
"from": "ShiChangChang",
|
||||
"room_id": room,
|
||||
"msgtype": "text",
|
||||
"content": "解散群",
|
||||
"msgtime": 1_792_546_055_000,
|
||||
},
|
||||
{
|
||||
"msgid": "m9899",
|
||||
"seq": 9899,
|
||||
"from": "ShiChangChang",
|
||||
"room_id": room,
|
||||
"msgtype": "revoke",
|
||||
"content": "[撤回消息]",
|
||||
"msgtime": 1_792_546_059_000,
|
||||
},
|
||||
]
|
||||
|
||||
class _GapApi:
|
||||
def __init__(self) -> None:
|
||||
self.calls: list[dict] = []
|
||||
|
||||
def list_group_messages(self, **kwargs):
|
||||
self.calls.append(dict(kwargs))
|
||||
last = int(kwargs.get("last_seq") or 0)
|
||||
time_start = int(kwargs.get("msg_time_start") or 0)
|
||||
# 模拟管家增量晚到:先只吐撤回;时间窗才能看到中间「解散群」。
|
||||
if time_start > 0:
|
||||
return [r for r in all_rows if int(r["seq"]) > last]
|
||||
if last > 0:
|
||||
return [r for r in all_rows if int(r["seq"]) == 9899 and int(r["seq"]) > last]
|
||||
return list(all_rows)
|
||||
|
||||
cfg = _Cfg()
|
||||
cfg.wshoto_room_gap_ms = 0
|
||||
out = poll_once(
|
||||
client=_GapApi(),
|
||||
settings=cfg,
|
||||
redis=redis,
|
||||
store=store,
|
||||
now=lambda: 1_792_546_100,
|
||||
)
|
||||
self.assertTrue(out["ok"])
|
||||
self.assertGreaterEqual(out["enqueued"], 1)
|
||||
self.assertEqual(load_last_seq(f"room:{room}", redis=redis), 9899)
|
||||
claimed = []
|
||||
while True:
|
||||
item = store.claim_inbound()
|
||||
if item is None:
|
||||
break
|
||||
claimed.append(item.message.content)
|
||||
self.assertIn("解散群", claimed)
|
||||
|
||||
def test_watched_rooms_preferred_without_seat_userid(self) -> None:
|
||||
store = MemoryMessageStore()
|
||||
redis = _redis()
|
||||
|
||||
Reference in New Issue
Block a user