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

Commit 5b55c32

Browse files
authored
Add tests for using _flatten_dict with an event. (#15002)
1 parent d0fed7a commit 5b55c32

File tree

3 files changed

+68
-9
lines changed

3 files changed

+68
-9
lines changed

Diff for: changelog.d/15002.misc

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Add tests for `_flatten_dict`.

Diff for: synapse/push/bulk_push_rule_evaluator.py

+5-8
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@
3636
Membership,
3737
RelationTypes,
3838
)
39-
from synapse.api.room_versions import PushRuleRoomFlag, RoomVersion
39+
from synapse.api.room_versions import PushRuleRoomFlag
4040
from synapse.event_auth import auth_types_for_event, get_user_power_level
4141
from synapse.events import EventBase, relation_from_event
4242
from synapse.events.snapshot import EventContext
@@ -405,7 +405,7 @@ async def _action_for_event_by_user(
405405
room_mention = mentions.get("room") is True
406406

407407
evaluator = PushRuleEvaluator(
408-
_flatten_dict(event, room_version=event.room_version),
408+
_flatten_dict(event),
409409
has_mentions,
410410
user_mentions,
411411
room_mention,
@@ -491,7 +491,6 @@ async def _action_for_event_by_user(
491491

492492
def _flatten_dict(
493493
d: Union[EventBase, Mapping[str, Any]],
494-
room_version: Optional[RoomVersion] = None,
495494
prefix: Optional[List[str]] = None,
496495
result: Optional[Dict[str, str]] = None,
497496
) -> Dict[str, str]:
@@ -511,7 +510,6 @@ def _flatten_dict(
511510
512511
Args:
513512
d: The event or content to continue flattening.
514-
room_version: The room version object.
515513
prefix: The key prefix (from outer dictionaries).
516514
result: The result to mutate.
517515
@@ -531,14 +529,13 @@ def _flatten_dict(
531529

532530
# `room_version` should only ever be set when looking at the top level of an event
533531
if (
534-
room_version is not None
535-
and PushRuleRoomFlag.EXTENSIBLE_EVENTS in room_version.msc3931_push_features
536-
and isinstance(d, EventBase)
532+
isinstance(d, EventBase)
533+
and PushRuleRoomFlag.EXTENSIBLE_EVENTS in d.room_version.msc3931_push_features
537534
):
538535
# Room supports extensible events: replace `content.body` with the plain text
539536
# representation from `m.markup`, as per MSC1767.
540537
markup = d.get("content").get("m.markup")
541-
if room_version.identifier.startswith("org.matrix.msc1767."):
538+
if d.room_version.identifier.startswith("org.matrix.msc1767."):
542539
markup = d.get("content").get("org.matrix.msc1767.markup")
543540
if markup is not None and isinstance(markup, list):
544541
text = ""

Diff for: tests/push/test_push_rule_evaluator.py

+62-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
from synapse.api.constants import EventTypes, HistoryVisibility, Membership
2323
from synapse.api.room_versions import RoomVersions
2424
from synapse.appservice import ApplicationService
25-
from synapse.events import FrozenEvent
25+
from synapse.events import FrozenEvent, make_event_from_dict
2626
from synapse.push.bulk_push_rule_evaluator import _flatten_dict
2727
from synapse.push.httppusher import tweaks_for_actions
2828
from synapse.rest import admin
@@ -60,6 +60,67 @@ def test_non_string(self) -> None:
6060
}
6161
self.assertEqual({"woo": "woo"}, _flatten_dict(input))
6262

63+
def test_event(self) -> None:
64+
"""Events can also be flattened."""
65+
event = make_event_from_dict(
66+
{
67+
"room_id": "!test:test",
68+
"type": "m.room.message",
69+
"sender": "@alice:test",
70+
"content": {
71+
"msgtype": "m.text",
72+
"body": "Hello world!",
73+
"format": "org.matrix.custom.html",
74+
"formatted_body": "<h1>Hello world!</h1>",
75+
},
76+
},
77+
room_version=RoomVersions.V8,
78+
)
79+
expected = {
80+
"content.msgtype": "m.text",
81+
"content.body": "hello world!",
82+
"content.format": "org.matrix.custom.html",
83+
"content.formatted_body": "<h1>hello world!</h1>",
84+
"room_id": "!test:test",
85+
"sender": "@alice:test",
86+
"type": "m.room.message",
87+
}
88+
self.assertEqual(expected, _flatten_dict(event))
89+
90+
def test_extensible_events(self) -> None:
91+
"""Extensible events has compatibility behaviour."""
92+
event_dict = {
93+
"room_id": "!test:test",
94+
"type": "m.room.message",
95+
"sender": "@alice:test",
96+
"content": {
97+
"org.matrix.msc1767.markup": [
98+
{"mimetype": "text/plain", "body": "Hello world!"},
99+
{"mimetype": "text/html", "body": "<h1>Hello world!</h1>"},
100+
]
101+
},
102+
}
103+
104+
# For a current room version, there's no special behavior.
105+
event = make_event_from_dict(event_dict, room_version=RoomVersions.V8)
106+
expected = {
107+
"room_id": "!test:test",
108+
"sender": "@alice:test",
109+
"type": "m.room.message",
110+
}
111+
self.assertEqual(expected, _flatten_dict(event))
112+
113+
# For a room version with extensible events, they parse out the text/plain
114+
# to a content.body property.
115+
event = make_event_from_dict(event_dict, room_version=RoomVersions.MSC1767v10)
116+
expected = {
117+
"content.body": "hello world!",
118+
"room_id": "!test:test",
119+
"sender": "@alice:test",
120+
"type": "m.room.message",
121+
}
122+
self.assertEqual(expected, _flatten_dict(event))
123+
63124

64125
class PushRuleEvaluatorTestCase(unittest.TestCase):
65126
def _get_evaluator(

0 commit comments

Comments
 (0)