test_bulk_push_rule_evaluator.py 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. from unittest.mock import patch
  2. from synapse.api.room_versions import RoomVersions
  3. from synapse.push.bulk_push_rule_evaluator import BulkPushRuleEvaluator
  4. from synapse.rest import admin
  5. from synapse.rest.client import login, register, room
  6. from synapse.types import create_requester
  7. from tests.test_utils import simple_async_mock
  8. from tests.unittest import HomeserverTestCase, override_config
  9. class TestBulkPushRuleEvaluator(HomeserverTestCase):
  10. servlets = [
  11. admin.register_servlets_for_client_rest_resource,
  12. room.register_servlets,
  13. login.register_servlets,
  14. register.register_servlets,
  15. ]
  16. def test_action_for_event_by_user_handles_noninteger_power_levels(self) -> None:
  17. """We should convert floats and strings to integers before passing to Rust.
  18. Reproduces #14060.
  19. A lack of validation: the gift that keeps on giving.
  20. """
  21. # Create a new user and room.
  22. alice = self.register_user("alice", "pass")
  23. token = self.login(alice, "pass")
  24. room_id = self.helper.create_room_as(
  25. alice, room_version=RoomVersions.V9.identifier, tok=token
  26. )
  27. # Alter the power levels in that room to include stringy and floaty levels.
  28. # We need to suppress the validation logic or else it will reject these dodgy
  29. # values. (Presumably this validation was not always present.)
  30. event_creation_handler = self.hs.get_event_creation_handler()
  31. requester = create_requester(alice)
  32. with patch("synapse.events.validator.validate_canonicaljson"), patch(
  33. "synapse.events.validator.jsonschema.validate"
  34. ):
  35. self.helper.send_state(
  36. room_id,
  37. "m.room.power_levels",
  38. {
  39. "users": {alice: "100"}, # stringy
  40. "notifications": {"room": 100.0}, # float
  41. },
  42. token,
  43. state_key="",
  44. )
  45. # Create a new message event, and try to evaluate it under the dodgy
  46. # power level event.
  47. event, context = self.get_success(
  48. event_creation_handler.create_event(
  49. requester,
  50. {
  51. "type": "m.room.message",
  52. "room_id": room_id,
  53. "content": {
  54. "msgtype": "m.text",
  55. "body": "helo",
  56. },
  57. "sender": alice,
  58. },
  59. )
  60. )
  61. bulk_evaluator = BulkPushRuleEvaluator(self.hs)
  62. # should not raise
  63. self.get_success(bulk_evaluator.action_for_events_by_user([(event, context)]))
  64. @override_config({"push": {"enabled": False}})
  65. def test_action_for_event_by_user_disabled_by_config(self) -> None:
  66. """Ensure that push rules are not calculated when disabled in the config"""
  67. # Create a new user and room.
  68. alice = self.register_user("alice", "pass")
  69. token = self.login(alice, "pass")
  70. room_id = self.helper.create_room_as(
  71. alice, room_version=RoomVersions.V9.identifier, tok=token
  72. )
  73. # Alter the power levels in that room to include stringy and floaty levels.
  74. # We need to suppress the validation logic or else it will reject these dodgy
  75. # values. (Presumably this validation was not always present.)
  76. event_creation_handler = self.hs.get_event_creation_handler()
  77. requester = create_requester(alice)
  78. # Create a new message event, and try to evaluate it under the dodgy
  79. # power level event.
  80. event, context = self.get_success(
  81. event_creation_handler.create_event(
  82. requester,
  83. {
  84. "type": "m.room.message",
  85. "room_id": room_id,
  86. "content": {
  87. "msgtype": "m.text",
  88. "body": "helo",
  89. },
  90. "sender": alice,
  91. },
  92. )
  93. )
  94. bulk_evaluator = BulkPushRuleEvaluator(self.hs)
  95. bulk_evaluator._action_for_event_by_user = simple_async_mock() # type: ignore[assignment]
  96. # should not raise
  97. self.get_success(bulk_evaluator.action_for_events_by_user([(event, context)]))
  98. bulk_evaluator._action_for_event_by_user.assert_not_called()