From 0a6579640f5a47a8109232a6ced2c650aa509a30 Mon Sep 17 00:00:00 2001 From: Aman Agrawal Date: Fri, 3 Jan 2025 06:39:28 +0000 Subject: [PATCH] message_send: Fix stream still inactive after sending message. We updated the stream property but forgot to inform the client. --- zerver/actions/message_send.py | 19 ++++++++++++++++++- zerver/tests/test_message_send.py | 15 ++++++++++++++- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/zerver/actions/message_send.py b/zerver/actions/message_send.py index 5fc532b1ce..75e217e201 100644 --- a/zerver/actions/message_send.py +++ b/zerver/actions/message_send.py @@ -99,7 +99,12 @@ from zerver.models.groups import SystemGroups from zerver.models.recipients import get_direct_message_group_user_ids from zerver.models.scheduled_jobs import NotificationTriggers from zerver.models.streams import get_stream, get_stream_by_id_in_realm -from zerver.models.users import get_system_bot, get_user_by_delivery_email, is_cross_realm_bot_email +from zerver.models.users import ( + active_user_ids, + get_system_bot, + get_user_by_delivery_email, + is_cross_realm_bot_email, +) from zerver.tornado.django_api import send_event_on_commit @@ -1170,6 +1175,18 @@ def do_send_messages( if not send_request.stream.is_recently_active: send_request.stream.is_recently_active = True stream_update_fields.append("is_recently_active") + stream_update_event = dict( + type="stream", + op="update", + property="is_recently_active", + value=True, + stream_id=send_request.stream.id, + name=send_request.stream.name, + ) + send_event_on_commit( + send_request.realm, stream_update_event, active_user_ids(send_request.realm.id) + ) + if len(stream_update_fields) > 0: send_request.stream.save(update_fields=stream_update_fields) diff --git a/zerver/tests/test_message_send.py b/zerver/tests/test_message_send.py index 9730d1a418..b55ef2cf1c 100644 --- a/zerver/tests/test_message_send.py +++ b/zerver/tests/test_message_send.py @@ -2403,7 +2403,20 @@ class StreamMessagesTest(ZulipTestCase): # Send a message to the stream sender = self.example_user("hamlet") self.subscribe(sender, stream.name) - self.send_stream_message(sender, stream.name) + # One message send event and one stream property update event. + with self.capture_send_event_calls(expected_num_events=2) as events: + self.send_stream_message(sender, stream.name, skip_capture_on_commit_callbacks=True) + + has_stream_update_event = False + for event in events: + if event["event"]["type"] == "stream": + stream_update_event = event["event"] + has_stream_update_event = True + self.assertEqual(stream_update_event["op"], "update") + self.assertEqual(stream_update_event["property"], "is_recently_active") + self.assertEqual(stream_update_event["value"], True) + self.assertTrue(has_stream_update_event) + # The stream should now be active stream.refresh_from_db() self.assertEqual(stream.is_recently_active, True)