1212# See the License for the specific language governing permissions and
1313# limitations under the License.
1414
15- from typing import Any
15+ from typing import Any , Optional
1616from unittest .mock import patch
1717
1818from parameterized import parameterized
2525from synapse .rest import admin
2626from synapse .rest .client import login , register , room
2727from synapse .server import HomeServer
28- from synapse .types import create_requester
28+ from synapse .types import JsonDict , create_requester
2929from synapse .util import Clock
3030
3131from tests .test_utils import simple_async_mock
@@ -196,77 +196,144 @@ def test_action_for_event_by_user_disabled_by_config(self) -> None:
196196 self .get_success (bulk_evaluator .action_for_events_by_user ([(event , context )]))
197197 bulk_evaluator ._action_for_event_by_user .assert_not_called ()
198198
199- @override_config ({"experimental_features" : {"msc3952_intentional_mentions" : True }})
200- def test_mentions (self ) -> None :
201- """Test the behavior of an event which includes invalid mentions."""
202- bulk_evaluator = BulkPushRuleEvaluator (self .hs )
203-
204- sentinel = object ()
205-
206- def create_and_process (mentions : Any = sentinel ) -> bool :
207- """Returns true iff the `mentions` trigger an event push action."""
208- content = {}
209- if mentions is not sentinel :
210- content [EventContentFields .MSC3952_MENTIONS ] = mentions
211-
212- # Create a new message event which should cause a notification.
213- event , context = self .get_success (
214- self .event_creation_handler .create_event (
215- self .requester ,
216- {
217- "type" : "test" ,
218- "room_id" : self .room_id ,
219- "content" : content ,
220- "sender" : f"@bob:{ self .hs .hostname } " ,
221- },
222- )
199+ def _create_and_process (
200+ self , bulk_evaluator : BulkPushRuleEvaluator , content : Optional [JsonDict ] = None
201+ ) -> bool :
202+ """Returns true iff the `mentions` trigger an event push action."""
203+ # Create a new message event which should cause a notification.
204+ event , context = self .get_success (
205+ self .event_creation_handler .create_event (
206+ self .requester ,
207+ {
208+ "type" : "test" ,
209+ "room_id" : self .room_id ,
210+ "content" : content or {},
211+ "sender" : f"@bob:{ self .hs .hostname } " ,
212+ },
223213 )
214+ )
224215
225- # Ensure no actions are generated!
226- self .get_success (
227- bulk_evaluator .action_for_events_by_user ([(event , context )])
228- )
216+ # Execute the push rule machinery.
217+ self .get_success (bulk_evaluator .action_for_events_by_user ([(event , context )]))
229218
230- # If any actions are generated for this event, return true.
231- result = self .get_success (
232- self .hs .get_datastores ().main .db_pool .simple_select_list (
233- table = "event_push_actions_staging" ,
234- keyvalues = {"event_id" : event .event_id },
235- retcols = ("*" ,),
236- desc = "get_event_push_actions_staging" ,
237- )
219+ # If any actions are generated for this event, return true.
220+ result = self .get_success (
221+ self .hs .get_datastores ().main .db_pool .simple_select_list (
222+ table = "event_push_actions_staging" ,
223+ keyvalues = {"event_id" : event .event_id },
224+ retcols = ("*" ,),
225+ desc = "get_event_push_actions_staging" ,
238226 )
239- return len (result ) > 0
227+ )
228+ return len (result ) > 0
229+
230+ @override_config ({"experimental_features" : {"msc3952_intentional_mentions" : True }})
231+ def test_user_mentions (self ) -> None :
232+ """Test the behavior of an event which includes invalid user mentions."""
233+ bulk_evaluator = BulkPushRuleEvaluator (self .hs )
240234
241235 # Not including the mentions field should not notify.
242- self .assertFalse (create_and_process ( ))
236+ self .assertFalse (self . _create_and_process ( bulk_evaluator ))
243237 # An empty mentions field should not notify.
244- self .assertFalse (create_and_process ({}))
238+ self .assertFalse (
239+ self ._create_and_process (
240+ bulk_evaluator , {EventContentFields .MSC3952_MENTIONS : {}}
241+ )
242+ )
245243
246244 # Non-dict mentions should be ignored.
247245 mentions : Any
248246 for mentions in (None , True , False , 1 , "foo" , []):
249- self .assertFalse (create_and_process (mentions ))
247+ self .assertFalse (
248+ self ._create_and_process (
249+ bulk_evaluator , {EventContentFields .MSC3952_MENTIONS : mentions }
250+ )
251+ )
250252
251253 # A non-list should be ignored.
252254 for mentions in (None , True , False , 1 , "foo" , {}):
253- self .assertFalse (create_and_process ({"user_ids" : mentions }))
255+ self .assertFalse (
256+ self ._create_and_process (
257+ bulk_evaluator ,
258+ {EventContentFields .MSC3952_MENTIONS : {"user_ids" : mentions }},
259+ )
260+ )
254261
255262 # The Matrix ID appearing anywhere in the list should notify.
256- self .assertTrue (create_and_process ({"user_ids" : [self .alice ]}))
257- self .assertTrue (create_and_process ({"user_ids" : ["@another:test" , self .alice ]}))
263+ self .assertTrue (
264+ self ._create_and_process (
265+ bulk_evaluator ,
266+ {EventContentFields .MSC3952_MENTIONS : {"user_ids" : [self .alice ]}},
267+ )
268+ )
269+ self .assertTrue (
270+ self ._create_and_process (
271+ bulk_evaluator ,
272+ {
273+ EventContentFields .MSC3952_MENTIONS : {
274+ "user_ids" : ["@another:test" , self .alice ]
275+ }
276+ },
277+ )
278+ )
258279
259280 # Duplicate user IDs should notify.
260- self .assertTrue (create_and_process ({"user_ids" : [self .alice , self .alice ]}))
281+ self .assertTrue (
282+ self ._create_and_process (
283+ bulk_evaluator ,
284+ {
285+ EventContentFields .MSC3952_MENTIONS : {
286+ "user_ids" : [self .alice , self .alice ]
287+ }
288+ },
289+ )
290+ )
261291
262292 # Invalid entries in the list are ignored.
263- self .assertFalse (create_and_process ({"user_ids" : [None , True , False , {}, []]}))
293+ self .assertFalse (
294+ self ._create_and_process (
295+ bulk_evaluator ,
296+ {
297+ EventContentFields .MSC3952_MENTIONS : {
298+ "user_ids" : [None , True , False , {}, []]
299+ }
300+ },
301+ )
302+ )
264303 self .assertTrue (
265- create_and_process ({"user_ids" : [None , True , False , {}, [], self .alice ]})
304+ self ._create_and_process (
305+ bulk_evaluator ,
306+ {
307+ EventContentFields .MSC3952_MENTIONS : {
308+ "user_ids" : [None , True , False , {}, [], self .alice ]
309+ }
310+ },
311+ )
266312 )
267313
314+ # The legacy push rule should not mention if the mentions field exists.
315+ self .assertFalse (
316+ self ._create_and_process (
317+ bulk_evaluator ,
318+ {
319+ "body" : self .alice ,
320+ "msgtype" : "m.text" ,
321+ EventContentFields .MSC3952_MENTIONS : {},
322+ },
323+ )
324+ )
325+
326+ @override_config ({"experimental_features" : {"msc3952_intentional_mentions" : True }})
327+ def test_room_mentions (self ) -> None :
328+ """Test the behavior of an event which includes invalid room mentions."""
329+ bulk_evaluator = BulkPushRuleEvaluator (self .hs )
330+
268331 # Room mentions from those without power should not notify.
269- self .assertFalse (create_and_process ({"room" : True }))
332+ self .assertFalse (
333+ self ._create_and_process (
334+ bulk_evaluator , {EventContentFields .MSC3952_MENTIONS : {"room" : True }}
335+ )
336+ )
270337
271338 # Room mentions from those with power should notify.
272339 self .helper .send_state (
@@ -276,8 +343,30 @@ def create_and_process(mentions: Any = sentinel) -> bool:
276343 self .token ,
277344 state_key = "" ,
278345 )
279- self .assertTrue (create_and_process ({"room" : True }))
346+ self .assertTrue (
347+ self ._create_and_process (
348+ bulk_evaluator , {EventContentFields .MSC3952_MENTIONS : {"room" : True }}
349+ )
350+ )
280351
281352 # Invalid data should not notify.
353+ mentions : Any
282354 for mentions in (None , False , 1 , "foo" , [], {}):
283- self .assertFalse (create_and_process ({"room" : mentions }))
355+ self .assertFalse (
356+ self ._create_and_process (
357+ bulk_evaluator ,
358+ {EventContentFields .MSC3952_MENTIONS : {"room" : mentions }},
359+ )
360+ )
361+
362+ # The legacy push rule should not mention if the mentions field exists.
363+ self .assertFalse (
364+ self ._create_and_process (
365+ bulk_evaluator ,
366+ {
367+ "body" : "@room" ,
368+ "msgtype" : "m.text" ,
369+ EventContentFields .MSC3952_MENTIONS : {},
370+ },
371+ )
372+ )
0 commit comments