def test_restart(self) -> None: hamlet = self.example_user("hamlet") realm = hamlet.realm clear_client_event_queues_for_testing() queue_data = dict( all_public_streams=False, apply_markdown=True, client_gravatar=True, client_type_name="website", event_types=None, last_connection_time=time.time(), queue_timeout=0, realm_id=realm.id, user_profile_id=hamlet.id, ) client = allocate_client_descriptor(queue_data) send_restart_events(immediate=True) # For now we only verify that a virtual event # gets added to the client's event_queue. We # may decide to write a deeper test in the future # that exercises the finish_handler. virtual_events = client.event_queue.virtual_events self.assert_length(virtual_events, 1) restart_event = virtual_events["restart"] check_restart_event("restart_event", restart_event) self.assertEqual( restart_event, dict( type="restart", zulip_version=ZULIP_VERSION, zulip_merge_base=ZULIP_MERGE_BASE, zulip_feature_level=API_FEATURE_LEVEL, server_generation=settings.SERVER_GENERATION, immediate=True, id=0, ), )
def test_restart(self) -> None: hamlet = self.example_user("hamlet") realm = hamlet.realm clear_client_event_queues_for_testing() queue_data = dict( all_public_streams=False, apply_markdown=True, client_gravatar=True, client_type_name="website", event_types=None, last_connection_time=time.time(), queue_timeout=0, realm_id=realm.id, user_profile_id=hamlet.id, ) client = allocate_client_descriptor(queue_data) send_restart_events(immediate=True) # For now we only verify that a virtual event # gets added to the client's event_queue. We # may decide to write a deeper test in the future # that exercises the finish_handler. virtual_events = client.event_queue.virtual_events self.assertEqual(len(virtual_events), 1) restart_event = virtual_events["restart"] # TODO: add a schema checker for this to event_schema.py # and exercise it here (as well as the more concrete # check) self.assertEqual( restart_event, dict( type="restart", server_generation=settings.SERVER_GENERATION, immediate=True, id=0, ), )
def test_restart_event_recursive_call_logic(self) -> None: # This is a test for a subtle corner case; see the comments # around RestartEventError for details. hamlet = self.example_user("hamlet") realm = hamlet.realm # Setup an empty event queue clear_client_event_queues_for_testing() queue_data = dict( all_public_streams=False, apply_markdown=True, client_gravatar=True, client_type_name="website", event_types=None, last_connection_time=time.time(), queue_timeout=0, realm_id=realm.id, user_profile_id=hamlet.id, ) client = allocate_client_descriptor(queue_data) # Add a restart event to it. send_restart_events(immediate=True) # Make a second queue after the restart events were sent. second_client = allocate_client_descriptor(queue_data) # Fetch the restart event just sent above, without removing it # from the queue. We will use this as a mock return value in # get_user_events. restart_event = orjson.loads( self.tornado_call( get_events_backend, hamlet, post_data={ "queue_id": client.event_queue.id, "last_event_id": -1, "dont_block": "true", "user_profile_id": hamlet.id, "secret": settings.SHARED_SECRET, "client": "internal", }, client_name="internal", ).content)["events"] # Now the tricky part: We call events_register_backend, # arranging it so that the first `get_user_events` call # returns our restart event (triggering the recursive # behavior), but the second (with a new queue) returns no # events. # # Because get_user_events always returns [] in tests, we need # to mock its return value as well; in an ideal world, we # would only need to mock client / second_client. with mock.patch( "zerver.lib.events.request_event_queue", side_effect=[ client.event_queue.id, second_client.event_queue.id ], ), mock.patch("zerver.lib.events.get_user_events", side_effect=[restart_event, []]): self.tornado_call( events_register_backend, hamlet, { "queue_id": client.event_queue.id, "user_client": "website", "last_event_id": -1, "dont_block": orjson.dumps(True).decode(), }, client_name="website", )