test_member_identity.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. from types import SimpleNamespace
  2. def user(
  3. user_id: int,
  4. *,
  5. username: str | None,
  6. first_name: str,
  7. last_name: str | None = None,
  8. ):
  9. return SimpleNamespace(
  10. id=user_id,
  11. username=username,
  12. first_name=first_name,
  13. last_name=last_name,
  14. is_bot=False,
  15. )
  16. async def test_identity_monitor_records_only_changes_after_the_first_observation(
  17. app_modules,
  18. ):
  19. identity = app_modules.load("wbb.services.member_identity")
  20. admin_db = app_modules.load("wbb.utils.dbadmin")
  21. points_db = app_modules.load("wbb.utils.dbpoints")
  22. chat_id = -100123
  23. await points_db.adjust_points(
  24. chat_id=chat_id,
  25. user_id=42,
  26. delta=10,
  27. source=points_db.SOURCE_ADMIN,
  28. idempotency_key="identity-account",
  29. actor_id="admin",
  30. reason="建立测试账户",
  31. username="old_name",
  32. first_name="小明",
  33. display_name="小明 同学",
  34. )
  35. await admin_db.update_managed_chat_settings(
  36. chat_id,
  37. {"identity_monitor": {"enabled": True, "notify_in_chat": False}},
  38. )
  39. first = await identity.observe_member_identity(
  40. chat_id=chat_id,
  41. user=user(42, username="old_name", first_name="小明", last_name="同学"),
  42. )
  43. changed = await identity.observe_member_identity(
  44. chat_id=chat_id,
  45. user=user(42, username="new_name", first_name="大明", last_name="同学"),
  46. )
  47. assert first is None
  48. assert changed["changed_fields"] == ["username", "display_name"]
  49. assert changed["before"]["display_name"] == "小明 同学"
  50. assert changed["after"]["display_name"] == "大明 同学"
  51. history, total = await admin_db.list_member_identity_changes(chat_id)
  52. assert total == 1
  53. assert history[0]["change_id"] == changed["change_id"]
  54. account = await points_db.get_point_account(chat_id, 42)
  55. assert account["display_name"] == "大明 同学"
  56. assert account["username"] == "new_name"
  57. assert app_modules.app.sent_messages == []
  58. async def test_identity_monitor_can_notify_in_chat_and_ignores_disabled_periods(
  59. app_modules,
  60. ):
  61. identity = app_modules.load("wbb.services.member_identity")
  62. admin_db = app_modules.load("wbb.utils.dbadmin")
  63. chat_id = -100456
  64. await identity.observe_member_identity(
  65. chat_id=chat_id,
  66. user=user(7, username="before", first_name="旧昵称"),
  67. )
  68. await identity.observe_member_identity(
  69. chat_id=chat_id,
  70. user=user(7, username="while_off", first_name="关闭期间"),
  71. )
  72. await admin_db.update_managed_chat_settings(
  73. chat_id,
  74. {"identity_monitor": {"enabled": True, "notify_in_chat": True}},
  75. )
  76. event = await identity.observe_member_identity(
  77. chat_id=chat_id,
  78. user=user(7, username=None, first_name="新昵称"),
  79. )
  80. assert event["before"]["username"] == "while_off"
  81. assert event["after"]["username"] is None
  82. history, total = await admin_db.list_member_identity_changes(chat_id)
  83. assert total == 1
  84. assert history[0]["after"]["display_name"] == "新昵称"
  85. assert len(app_modules.app.sent_messages) == 1
  86. notified_chat_id, text = app_modules.app.sent_messages[0]
  87. assert notified_chat_id == chat_id
  88. assert "昵称:关闭期间 -> 新昵称" in text
  89. assert "用户名:@while_off -> 未设置" in text
  90. async def test_joined_members_are_observed_even_when_the_sender_is_the_same_user(
  91. app_modules,
  92. ):
  93. identity = app_modules.load("wbb.services.member_identity")
  94. admin_db = app_modules.load("wbb.utils.dbadmin")
  95. joined = user(9, username="joined", first_name="新成员")
  96. message = SimpleNamespace(from_user=joined, new_chat_members=[joined, user(10, username=None, first_name="第二位")])
  97. changes = await identity.observe_message_member_identities(
  98. chat_id=-100789,
  99. message=message,
  100. )
  101. assert changes == []
  102. members = await admin_db.list_recent_chat_members(-100789, limit=10)
  103. assert {item["user_id"] for item in members} == {9, 10}
  104. first = next(item for item in members if item["user_id"] == 9)
  105. assert first["message_count"] == 1