|
30 | 30 | PowerLevelsContent, |
31 | 31 | clone_event, |
32 | 32 | copy_and_fixup_power_levels_contents, |
| 33 | + format_event_for_client_v1, |
| 34 | + format_event_for_client_v2, |
| 35 | + format_event_for_client_v2_without_room_id, |
| 36 | + format_event_raw, |
33 | 37 | maybe_upsert_event_field, |
34 | 38 | prune_event, |
35 | 39 | ) |
@@ -997,3 +1001,99 @@ def test_invalid_types_raise_type_error(self) -> None: |
997 | 1001 | def test_invalid_nesting_raises_type_error(self) -> None: |
998 | 1002 | with self.assertRaises(TypeError): |
999 | 1003 | copy_and_fixup_power_levels_contents({"a": {"b": {"c": 1}}}) # type: ignore[dict-item] |
| 1004 | + |
| 1005 | + |
| 1006 | +class FormatEventForClientTestCase(stdlib_unittest.TestCase): |
| 1007 | + """Tests for the standalone `format_event_*` transforms. |
| 1008 | +
|
| 1009 | + These are Rust reimplementations kept purely as a backwards compatibility |
| 1010 | + hack for modules in the wild that import them from `synapse.events.utils` |
| 1011 | + (they were never part of the module API, and nothing in Synapse itself uses |
| 1012 | + them); like the original Python implementations they must mutate the dict |
| 1013 | + in place and return it. |
| 1014 | + """ |
| 1015 | + |
| 1016 | + def make_event(self) -> JsonDict: |
| 1017 | + return { |
| 1018 | + "event_id": "$event_id", |
| 1019 | + "room_id": "!room:test", |
| 1020 | + "sender": "@sender:test", |
| 1021 | + "type": "m.room.message", |
| 1022 | + "content": {"body": "hello"}, |
| 1023 | + "auth_events": [], |
| 1024 | + "prev_events": [], |
| 1025 | + "hashes": {}, |
| 1026 | + "signatures": {}, |
| 1027 | + "depth": 5, |
| 1028 | + "origin": "test", |
| 1029 | + "prev_state": [], |
| 1030 | + "unsigned": {"age": 100, "replaces_state": "$old", "other": 1}, |
| 1031 | + } |
| 1032 | + |
| 1033 | + def test_raw(self) -> None: |
| 1034 | + event_dict = self.make_event() |
| 1035 | + result = format_event_raw(event_dict) |
| 1036 | + self.assertIs(result, event_dict) |
| 1037 | + self.assertEqual(result, self.make_event()) |
| 1038 | + |
| 1039 | + def test_v2_drops_federation_keys(self) -> None: |
| 1040 | + event_dict = self.make_event() |
| 1041 | + result = format_event_for_client_v2(event_dict) |
| 1042 | + self.assertIs(result, event_dict) |
| 1043 | + self.assertEqual( |
| 1044 | + result, |
| 1045 | + { |
| 1046 | + "event_id": "$event_id", |
| 1047 | + "room_id": "!room:test", |
| 1048 | + "sender": "@sender:test", |
| 1049 | + "type": "m.room.message", |
| 1050 | + "content": {"body": "hello"}, |
| 1051 | + "unsigned": {"age": 100, "replaces_state": "$old", "other": 1}, |
| 1052 | + }, |
| 1053 | + ) |
| 1054 | + |
| 1055 | + def test_v2_without_room_id(self) -> None: |
| 1056 | + event_dict = self.make_event() |
| 1057 | + result = format_event_for_client_v2_without_room_id(event_dict) |
| 1058 | + self.assertIs(result, event_dict) |
| 1059 | + self.assertNotIn("room_id", result) |
| 1060 | + |
| 1061 | + def test_v1_copies_unsigned_keys(self) -> None: |
| 1062 | + event_dict = self.make_event() |
| 1063 | + result = format_event_for_client_v1(event_dict) |
| 1064 | + self.assertIs(result, event_dict) |
| 1065 | + self.assertEqual( |
| 1066 | + result, |
| 1067 | + { |
| 1068 | + "event_id": "$event_id", |
| 1069 | + "room_id": "!room:test", |
| 1070 | + "sender": "@sender:test", |
| 1071 | + "user_id": "@sender:test", |
| 1072 | + "type": "m.room.message", |
| 1073 | + "content": {"body": "hello"}, |
| 1074 | + "age": 100, |
| 1075 | + "replaces_state": "$old", |
| 1076 | + "unsigned": {"age": 100, "replaces_state": "$old", "other": 1}, |
| 1077 | + }, |
| 1078 | + ) |
| 1079 | + |
| 1080 | + def test_v1_no_sender(self) -> None: |
| 1081 | + event_dict = self.make_event() |
| 1082 | + del event_dict["sender"] |
| 1083 | + result = format_event_for_client_v1(event_dict) |
| 1084 | + self.assertNotIn("user_id", result) |
| 1085 | + |
| 1086 | + def test_non_json_values_pass_through(self) -> None: |
| 1087 | + # The transforms only move keys around; values that aren't |
| 1088 | + # JSON-serializable must survive untouched. |
| 1089 | + marker = object() |
| 1090 | + event_dict = { |
| 1091 | + "sender": "@sender:test", |
| 1092 | + "auth_events": marker, |
| 1093 | + "content": marker, |
| 1094 | + "unsigned": {"age": marker}, |
| 1095 | + } |
| 1096 | + result = format_event_for_client_v1(event_dict) |
| 1097 | + self.assertIs(result["content"], marker) |
| 1098 | + self.assertIs(result["age"], marker) |
| 1099 | + self.assertNotIn("auth_events", result) |
0 commit comments