@ -19,17 +19,18 @@ import frozendict
from twisted . test . proto_helpers import MemoryReactor
import synapse . rest . admin
from synapse . api . constants import EventTypes , Membership
from synapse . api . constants import EventTypes , HistoryVisibility , Membership
from synapse . api . room_versions import RoomVersions
from synapse . appservice import ApplicationService
from synapse . events import FrozenEvent
from synapse . push . bulk_push_rule_evaluator import _flatten_dict
from synapse . push . httppusher import tweaks_for_actions
from synapse . rest import admin
from synapse . rest . client import login , register , room
from synapse . server import HomeServer
from synapse . storage . databases . main . appservice import _make_exclusive_regex
from synapse . synapse_rust . push import PushRuleEvaluator
from synapse . types import JsonDict
from synapse . types import JsonDict , UserID
from synapse . util import Clock
from tests import unittest
@ -437,3 +438,80 @@ class TestBulkPushRuleEvaluator(unittest.HomeserverTestCase):
)
self . assertEqual ( len ( users_with_push_actions ) , 0 )
class BulkPushRuleEvaluatorTestCase ( unittest . HomeserverTestCase ) :
servlets = [
admin . register_servlets ,
login . register_servlets ,
room . register_servlets ,
]
def prepare (
self , reactor : MemoryReactor , clock : Clock , homeserver : HomeServer
) - > None :
self . main_store = homeserver . get_datastores ( ) . main
self . user_id1 = self . register_user ( " user1 " , " password " )
self . tok1 = self . login ( self . user_id1 , " password " )
self . user_id2 = self . register_user ( " user2 " , " password " )
self . tok2 = self . login ( self . user_id2 , " password " )
self . room_id = self . helper . create_room_as ( tok = self . tok1 )
# We want to test history visibility works correctly.
self . helper . send_state (
self . room_id ,
EventTypes . RoomHistoryVisibility ,
{ " history_visibility " : HistoryVisibility . JOINED } ,
tok = self . tok1 ,
)
def get_notif_count ( self , user_id : str ) - > int :
return self . get_success (
self . main_store . db_pool . simple_select_one_onecol (
table = " event_push_actions " ,
keyvalues = { " user_id " : user_id } ,
retcol = " COALESCE(SUM(notif), 0) " ,
desc = " get_staging_notif_count " ,
)
)
def test_plain_message ( self ) - > None :
""" Test that sending a normal message in a room will trigger a
notification
"""
# Have user2 join the room and cle
self . helper . join ( self . room_id , self . user_id2 , tok = self . tok2 )
# They start off with no notifications, but get them when messages are
# sent.
self . assertEqual ( self . get_notif_count ( self . user_id2 ) , 0 )
user1 = UserID . from_string ( self . user_id1 )
self . create_and_send_event ( self . room_id , user1 )
self . assertEqual ( self . get_notif_count ( self . user_id2 ) , 1 )
def test_delayed_message ( self ) - > None :
""" Test that a delayed message that was from before a user joined
doesn ' t cause a notification for the joined user.
"""
user1 = UserID . from_string ( self . user_id1 )
# Send a message before user2 joins
event_id1 = self . create_and_send_event ( self . room_id , user1 )
# Have user2 join the room
self . helper . join ( self . room_id , self . user_id2 , tok = self . tok2 )
# They start off with no notifications
self . assertEqual ( self . get_notif_count ( self . user_id2 ) , 0 )
# Send another message that references the event before the join to
# simulate a "delayed" event
self . create_and_send_event ( self . room_id , user1 , prev_event_ids = [ event_id1 ] )
# user2 should not be notified about it, because they can't see it.
self . assertEqual ( self . get_notif_count ( self . user_id2 ) , 0 )