Add tests for using _flatten_dict with an event. (#15002)
This commit is contained in:
parent
d0fed7a37b
commit
5b55c32d61
|
@ -0,0 +1 @@
|
||||||
|
Add tests for `_flatten_dict`.
|
|
@ -36,7 +36,7 @@ from synapse.api.constants import (
|
||||||
Membership,
|
Membership,
|
||||||
RelationTypes,
|
RelationTypes,
|
||||||
)
|
)
|
||||||
from synapse.api.room_versions import PushRuleRoomFlag, RoomVersion
|
from synapse.api.room_versions import PushRuleRoomFlag
|
||||||
from synapse.event_auth import auth_types_for_event, get_user_power_level
|
from synapse.event_auth import auth_types_for_event, get_user_power_level
|
||||||
from synapse.events import EventBase, relation_from_event
|
from synapse.events import EventBase, relation_from_event
|
||||||
from synapse.events.snapshot import EventContext
|
from synapse.events.snapshot import EventContext
|
||||||
|
@ -405,7 +405,7 @@ class BulkPushRuleEvaluator:
|
||||||
room_mention = mentions.get("room") is True
|
room_mention = mentions.get("room") is True
|
||||||
|
|
||||||
evaluator = PushRuleEvaluator(
|
evaluator = PushRuleEvaluator(
|
||||||
_flatten_dict(event, room_version=event.room_version),
|
_flatten_dict(event),
|
||||||
has_mentions,
|
has_mentions,
|
||||||
user_mentions,
|
user_mentions,
|
||||||
room_mention,
|
room_mention,
|
||||||
|
@ -491,7 +491,6 @@ StateGroup = Union[object, int]
|
||||||
|
|
||||||
def _flatten_dict(
|
def _flatten_dict(
|
||||||
d: Union[EventBase, Mapping[str, Any]],
|
d: Union[EventBase, Mapping[str, Any]],
|
||||||
room_version: Optional[RoomVersion] = None,
|
|
||||||
prefix: Optional[List[str]] = None,
|
prefix: Optional[List[str]] = None,
|
||||||
result: Optional[Dict[str, str]] = None,
|
result: Optional[Dict[str, str]] = None,
|
||||||
) -> Dict[str, str]:
|
) -> Dict[str, str]:
|
||||||
|
@ -511,7 +510,6 @@ def _flatten_dict(
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
d: The event or content to continue flattening.
|
d: The event or content to continue flattening.
|
||||||
room_version: The room version object.
|
|
||||||
prefix: The key prefix (from outer dictionaries).
|
prefix: The key prefix (from outer dictionaries).
|
||||||
result: The result to mutate.
|
result: The result to mutate.
|
||||||
|
|
||||||
|
@ -531,14 +529,13 @@ def _flatten_dict(
|
||||||
|
|
||||||
# `room_version` should only ever be set when looking at the top level of an event
|
# `room_version` should only ever be set when looking at the top level of an event
|
||||||
if (
|
if (
|
||||||
room_version is not None
|
isinstance(d, EventBase)
|
||||||
and PushRuleRoomFlag.EXTENSIBLE_EVENTS in room_version.msc3931_push_features
|
and PushRuleRoomFlag.EXTENSIBLE_EVENTS in d.room_version.msc3931_push_features
|
||||||
and isinstance(d, EventBase)
|
|
||||||
):
|
):
|
||||||
# Room supports extensible events: replace `content.body` with the plain text
|
# Room supports extensible events: replace `content.body` with the plain text
|
||||||
# representation from `m.markup`, as per MSC1767.
|
# representation from `m.markup`, as per MSC1767.
|
||||||
markup = d.get("content").get("m.markup")
|
markup = d.get("content").get("m.markup")
|
||||||
if room_version.identifier.startswith("org.matrix.msc1767."):
|
if d.room_version.identifier.startswith("org.matrix.msc1767."):
|
||||||
markup = d.get("content").get("org.matrix.msc1767.markup")
|
markup = d.get("content").get("org.matrix.msc1767.markup")
|
||||||
if markup is not None and isinstance(markup, list):
|
if markup is not None and isinstance(markup, list):
|
||||||
text = ""
|
text = ""
|
||||||
|
|
|
@ -22,7 +22,7 @@ import synapse.rest.admin
|
||||||
from synapse.api.constants import EventTypes, HistoryVisibility, Membership
|
from synapse.api.constants import EventTypes, HistoryVisibility, Membership
|
||||||
from synapse.api.room_versions import RoomVersions
|
from synapse.api.room_versions import RoomVersions
|
||||||
from synapse.appservice import ApplicationService
|
from synapse.appservice import ApplicationService
|
||||||
from synapse.events import FrozenEvent
|
from synapse.events import FrozenEvent, make_event_from_dict
|
||||||
from synapse.push.bulk_push_rule_evaluator import _flatten_dict
|
from synapse.push.bulk_push_rule_evaluator import _flatten_dict
|
||||||
from synapse.push.httppusher import tweaks_for_actions
|
from synapse.push.httppusher import tweaks_for_actions
|
||||||
from synapse.rest import admin
|
from synapse.rest import admin
|
||||||
|
@ -60,6 +60,67 @@ class FlattenDictTestCase(unittest.TestCase):
|
||||||
}
|
}
|
||||||
self.assertEqual({"woo": "woo"}, _flatten_dict(input))
|
self.assertEqual({"woo": "woo"}, _flatten_dict(input))
|
||||||
|
|
||||||
|
def test_event(self) -> None:
|
||||||
|
"""Events can also be flattened."""
|
||||||
|
event = make_event_from_dict(
|
||||||
|
{
|
||||||
|
"room_id": "!test:test",
|
||||||
|
"type": "m.room.message",
|
||||||
|
"sender": "@alice:test",
|
||||||
|
"content": {
|
||||||
|
"msgtype": "m.text",
|
||||||
|
"body": "Hello world!",
|
||||||
|
"format": "org.matrix.custom.html",
|
||||||
|
"formatted_body": "<h1>Hello world!</h1>",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
room_version=RoomVersions.V8,
|
||||||
|
)
|
||||||
|
expected = {
|
||||||
|
"content.msgtype": "m.text",
|
||||||
|
"content.body": "hello world!",
|
||||||
|
"content.format": "org.matrix.custom.html",
|
||||||
|
"content.formatted_body": "<h1>hello world!</h1>",
|
||||||
|
"room_id": "!test:test",
|
||||||
|
"sender": "@alice:test",
|
||||||
|
"type": "m.room.message",
|
||||||
|
}
|
||||||
|
self.assertEqual(expected, _flatten_dict(event))
|
||||||
|
|
||||||
|
def test_extensible_events(self) -> None:
|
||||||
|
"""Extensible events has compatibility behaviour."""
|
||||||
|
event_dict = {
|
||||||
|
"room_id": "!test:test",
|
||||||
|
"type": "m.room.message",
|
||||||
|
"sender": "@alice:test",
|
||||||
|
"content": {
|
||||||
|
"org.matrix.msc1767.markup": [
|
||||||
|
{"mimetype": "text/plain", "body": "Hello world!"},
|
||||||
|
{"mimetype": "text/html", "body": "<h1>Hello world!</h1>"},
|
||||||
|
]
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
# For a current room version, there's no special behavior.
|
||||||
|
event = make_event_from_dict(event_dict, room_version=RoomVersions.V8)
|
||||||
|
expected = {
|
||||||
|
"room_id": "!test:test",
|
||||||
|
"sender": "@alice:test",
|
||||||
|
"type": "m.room.message",
|
||||||
|
}
|
||||||
|
self.assertEqual(expected, _flatten_dict(event))
|
||||||
|
|
||||||
|
# For a room version with extensible events, they parse out the text/plain
|
||||||
|
# to a content.body property.
|
||||||
|
event = make_event_from_dict(event_dict, room_version=RoomVersions.MSC1767v10)
|
||||||
|
expected = {
|
||||||
|
"content.body": "hello world!",
|
||||||
|
"room_id": "!test:test",
|
||||||
|
"sender": "@alice:test",
|
||||||
|
"type": "m.room.message",
|
||||||
|
}
|
||||||
|
self.assertEqual(expected, _flatten_dict(event))
|
||||||
|
|
||||||
|
|
||||||
class PushRuleEvaluatorTestCase(unittest.TestCase):
|
class PushRuleEvaluatorTestCase(unittest.TestCase):
|
||||||
def _get_evaluator(
|
def _get_evaluator(
|
||||||
|
|
Loading…
Reference in New Issue