Skip to content
This repository has been archived by the owner on Apr 26, 2024. It is now read-only.

Push rule tweaks tests #12188

Merged
merged 8 commits into from
Mar 11, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions changelog.d/12188.misc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Add combined test for HTTP pusher and push rule. Contributed by Nick @ Beeper.
38 changes: 19 additions & 19 deletions synapse/push/baserules.py
Original file line number Diff line number Diff line change
Expand Up @@ -169,7 +169,7 @@ def make_base_prepend_rules(
"kind": "event_match",
"key": "content.msgtype",
"pattern": "m.notice",
"_id": "_suppress_notices",
"_cache_key": "_suppress_notices",
}
],
"actions": ["dont_notify"],
Expand All @@ -183,13 +183,13 @@ def make_base_prepend_rules(
"kind": "event_match",
"key": "type",
"pattern": "m.room.member",
"_id": "_member",
"_cache_key": "_member",
},
{
"kind": "event_match",
"key": "content.membership",
"pattern": "invite",
"_id": "_invite_member",
"_cache_key": "_invite_member",
},
{"kind": "event_match", "key": "state_key", "pattern_type": "user_id"},
],
Expand All @@ -212,7 +212,7 @@ def make_base_prepend_rules(
"kind": "event_match",
"key": "type",
"pattern": "m.room.member",
"_id": "_member",
"_cache_key": "_member",
}
],
"actions": ["dont_notify"],
Expand All @@ -237,12 +237,12 @@ def make_base_prepend_rules(
"kind": "event_match",
"key": "content.body",
"pattern": "@room",
"_id": "_roomnotif_content",
"_cache_key": "_roomnotif_content",
},
{
"kind": "sender_notification_permission",
"key": "room",
"_id": "_roomnotif_pl",
"_cache_key": "_roomnotif_pl",
},
],
"actions": ["notify", {"set_tweak": "highlight", "value": True}],
Expand All @@ -254,13 +254,13 @@ def make_base_prepend_rules(
"kind": "event_match",
"key": "type",
"pattern": "m.room.tombstone",
"_id": "_tombstone",
"_cache_key": "_tombstone",
},
{
"kind": "event_match",
"key": "state_key",
"pattern": "",
"_id": "_tombstone_statekey",
"_cache_key": "_tombstone_statekey",
},
],
"actions": ["notify", {"set_tweak": "highlight", "value": True}],
Expand All @@ -272,7 +272,7 @@ def make_base_prepend_rules(
"kind": "event_match",
"key": "type",
"pattern": "m.reaction",
"_id": "_reaction",
"_cache_key": "_reaction",
}
],
"actions": ["dont_notify"],
Expand All @@ -288,7 +288,7 @@ def make_base_prepend_rules(
"kind": "event_match",
"key": "type",
"pattern": "m.call.invite",
"_id": "_call",
"_cache_key": "_call",
}
],
"actions": [
Expand All @@ -302,12 +302,12 @@ def make_base_prepend_rules(
{
"rule_id": "global/underride/.m.rule.room_one_to_one",
"conditions": [
{"kind": "room_member_count", "is": "2", "_id": "member_count"},
{"kind": "room_member_count", "is": "2", "_cache_key": "member_count"},
{
"kind": "event_match",
"key": "type",
"pattern": "m.room.message",
"_id": "_message",
"_cache_key": "_message",
},
],
"actions": [
Expand All @@ -321,12 +321,12 @@ def make_base_prepend_rules(
{
"rule_id": "global/underride/.m.rule.encrypted_room_one_to_one",
"conditions": [
{"kind": "room_member_count", "is": "2", "_id": "member_count"},
{"kind": "room_member_count", "is": "2", "_cache_key": "member_count"},
{
"kind": "event_match",
"key": "type",
"pattern": "m.room.encrypted",
"_id": "_encrypted",
"_cache_key": "_encrypted",
},
],
"actions": [
Expand All @@ -342,7 +342,7 @@ def make_base_prepend_rules(
"kind": "event_match",
"key": "type",
"pattern": "m.room.message",
"_id": "_message",
"_cache_key": "_message",
}
],
"actions": ["notify", {"set_tweak": "highlight", "value": False}],
Expand All @@ -356,7 +356,7 @@ def make_base_prepend_rules(
"kind": "event_match",
"key": "type",
"pattern": "m.room.encrypted",
"_id": "_encrypted",
"_cache_key": "_encrypted",
}
],
"actions": ["notify", {"set_tweak": "highlight", "value": False}],
Expand All @@ -368,19 +368,19 @@ def make_base_prepend_rules(
"kind": "event_match",
"key": "type",
"pattern": "im.vector.modular.widgets",
"_id": "_type_modular_widgets",
"_cache_key": "_type_modular_widgets",
},
{
"kind": "event_match",
"key": "content.type",
"pattern": "jitsi",
"_id": "_content_type_jitsi",
"_cache_key": "_content_type_jitsi",
},
{
"kind": "event_match",
"key": "state_key",
"pattern": "*",
"_id": "_is_state_event",
"_cache_key": "_is_state_event",
},
],
"actions": ["notify", {"set_tweak": "highlight", "value": False}],
Expand Down
10 changes: 5 additions & 5 deletions synapse/push/bulk_push_rule_evaluator.py
Original file line number Diff line number Diff line change
Expand Up @@ -274,17 +274,17 @@ def _condition_checker(
cache: Dict[str, bool],
) -> bool:
for cond in conditions:
_id = cond.get("_id", None)
if _id:
res = cache.get(_id, None)
_cache_key = cond.get("_cache_key", None)
if _cache_key:
res = cache.get(_cache_key, None)
if res is False:
return False
elif res is True:
continue

res = evaluator.matches(cond, uid, display_name)
if _id:
cache[_id] = bool(res)
if _cache_key:
cache[_cache_key] = bool(res)

if not res:
return False
Expand Down
2 changes: 1 addition & 1 deletion synapse/push/clientformat.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ def format_push_rules_for_user(

# Remove internal stuff.
for c in r["conditions"]:
c.pop("_id", None)
c.pop("_cache_key", None)

pattern_type = c.pop("pattern_type", None)
if pattern_type == "user_id":
Expand Down
72 changes: 69 additions & 3 deletions tests/push/test_http.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,15 @@
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from typing import List, Tuple
from unittest.mock import Mock

from twisted.internet.defer import Deferred

import synapse.rest.admin
from synapse.logging.context import make_deferred_yieldable
from synapse.push import PusherConfigException
from synapse.rest.client import login, receipts, room
from synapse.rest.client import login, push_rule, receipts, room

from tests.unittest import HomeserverTestCase, override_config

Expand All @@ -29,6 +30,7 @@ class HTTPPusherTests(HomeserverTestCase):
room.register_servlets,
login.register_servlets,
receipts.register_servlets,
push_rule.register_servlets,
]
user_id = True
hijack_auth = False
Expand All @@ -39,12 +41,12 @@ def default_config(self):
return config

def make_homeserver(self, reactor, clock):
self.push_attempts = []
self.push_attempts: List[tuple[Deferred, str, dict]] = []

m = Mock()

def post_json_get_json(url, body):
d = Deferred()
d: Deferred = Deferred()
self.push_attempts.append((d, url, body))
return make_deferred_yieldable(d)

Expand Down Expand Up @@ -719,3 +721,67 @@ def _send_read_request(self, access_token, message_event_id, room_id):
access_token=access_token,
)
self.assertEqual(channel.code, 200, channel.json_body)

def _make_user_with_pusher(self, username: str) -> Tuple[str, str]:
user_id = self.register_user(username, "pass")
access_token = self.login(username, "pass")

# Register the pusher
user_tuple = self.get_success(
self.hs.get_datastores().main.get_user_by_access_token(access_token)
)
token_id = user_tuple.token_id

self.get_success(
self.hs.get_pusherpool().add_pusher(
user_id=user_id,
access_token=token_id,
kind="http",
app_id="m.http",
app_display_name="HTTP Push Notifications",
device_display_name="pushy push",
pushkey="a@example.com",
lang=None,
data={"url": "http://example.com/_matrix/push/v1/notify"},
)
)

return user_id, access_token

def test_dont_notify_rule_overrides_message(self):
"""
The override push rule will suppress notification
"""

user_id, access_token = self._make_user_with_pusher("user")
other_user_id, other_access_token = self._make_user_with_pusher("otheruser")

# Create a room
room = self.helper.create_room_as(user_id, tok=access_token)

# Disable user notifications for this room -> user
body = {
"conditions": [{"kind": "event_match", "key": "room_id", "pattern": room}],
"actions": ["dont_notify"],
}
channel = self.make_request(
"PUT",
"/pushrules/global/override/best.friend",
body,
access_token=access_token,
)
self.assertEqual(channel.code, 200)

# Check we start with no pushes
self.assertEqual(len(self.push_attempts), 0)

# The other user joins
self.helper.join(room=room, user=other_user_id, tok=other_access_token)

# The other user sends a message (ignored by dont_notify push rule set above)
self.helper.send(room, body="Hi!", tok=other_access_token)
self.assertEqual(len(self.push_attempts), 0)

# The user sends a message back (sends a notification)
self.helper.send(room, body="Hello", tok=access_token)
self.assertEqual(len(self.push_attempts), 1)