topics: Follow topics that are merged into even after merge.

Previously, when there were two topics -- A and B, and a user
follows topic A, then when messages of topic B are merged into
topic A then topic A loses its follow status.

This is fixed by updating the algorithm for getting the visibility
policy after merge to be followed in the above case.

Fixes #35226
This commit is contained in:
Rohan Gudimetla
2025-07-26 19:13:32 +05:30
committed by Tim Abbott
parent 8330e7c283
commit cb01bdf0c4
2 changed files with 107 additions and 3 deletions

View File

@@ -488,6 +488,9 @@ def get_visibility_policy_after_merge(
# rather than hiding them. # rather than hiding them.
visibility_policies = {orig_topic_visibility_policy, target_topic_visibility_policy} visibility_policies = {orig_topic_visibility_policy, target_topic_visibility_policy}
if UserTopic.VisibilityPolicy.FOLLOWED in visibility_policies:
return UserTopic.VisibilityPolicy.FOLLOWED
if UserTopic.VisibilityPolicy.UNMUTED in visibility_policies: if UserTopic.VisibilityPolicy.UNMUTED in visibility_policies:
return UserTopic.VisibilityPolicy.UNMUTED return UserTopic.VisibilityPolicy.UNMUTED

View File

@@ -764,6 +764,7 @@ class MessageMoveTopicTest(ZulipTestCase):
hamlet = self.example_user("hamlet") hamlet = self.example_user("hamlet")
cordelia = self.example_user("cordelia") cordelia = self.example_user("cordelia")
aaron = self.example_user("aaron") aaron = self.example_user("aaron")
shiva = self.example_user("shiva")
self.subscribe(hamlet, stream_name) self.subscribe(hamlet, stream_name)
self.login_user(hamlet) self.login_user(hamlet)
@@ -778,6 +779,7 @@ class MessageMoveTopicTest(ZulipTestCase):
# INHERIT INHERIT INHERIT # INHERIT INHERIT INHERIT
# INHERIT MUTED INHERIT # INHERIT MUTED INHERIT
# INHERIT UNMUTED UNMUTED # INHERIT UNMUTED UNMUTED
# INHERIT FOLLOWED FOLLOWED
orig_topic = "Topic1" orig_topic = "Topic1"
target_topic = "Topic1 edited" target_topic = "Topic1 edited"
orig_message_id = self.send_stream_message( orig_message_id = self.send_stream_message(
@@ -799,6 +801,9 @@ class MessageMoveTopicTest(ZulipTestCase):
do_set_user_topic_visibility_policy( do_set_user_topic_visibility_policy(
aaron, stream, target_topic, visibility_policy=UserTopic.VisibilityPolicy.UNMUTED aaron, stream, target_topic, visibility_policy=UserTopic.VisibilityPolicy.UNMUTED
) )
do_set_user_topic_visibility_policy(
shiva, stream, target_topic, visibility_policy=UserTopic.VisibilityPolicy.FOLLOWED
)
check_update_message( check_update_message(
user_profile=hamlet, user_profile=hamlet,
@@ -820,6 +825,9 @@ class MessageMoveTopicTest(ZulipTestCase):
self.assert_has_visibility_policy( self.assert_has_visibility_policy(
aaron, orig_topic, stream, UserTopic.VisibilityPolicy.INHERIT aaron, orig_topic, stream, UserTopic.VisibilityPolicy.INHERIT
) )
self.assert_has_visibility_policy(
shiva, orig_topic, stream, UserTopic.VisibilityPolicy.INHERIT
)
self.assert_has_visibility_policy( self.assert_has_visibility_policy(
hamlet, target_topic, stream, UserTopic.VisibilityPolicy.INHERIT hamlet, target_topic, stream, UserTopic.VisibilityPolicy.INHERIT
) )
@@ -829,6 +837,9 @@ class MessageMoveTopicTest(ZulipTestCase):
self.assert_has_visibility_policy( self.assert_has_visibility_policy(
aaron, target_topic, stream, UserTopic.VisibilityPolicy.UNMUTED aaron, target_topic, stream, UserTopic.VisibilityPolicy.UNMUTED
) )
self.assert_has_visibility_policy(
shiva, target_topic, stream, UserTopic.VisibilityPolicy.FOLLOWED
)
# Test the following cases: # Test the following cases:
# #
@@ -836,6 +847,7 @@ class MessageMoveTopicTest(ZulipTestCase):
# MUTED INHERIT INHERIT # MUTED INHERIT INHERIT
# MUTED MUTED MUTED # MUTED MUTED MUTED
# MUTED UNMUTED UNMUTED # MUTED UNMUTED UNMUTED
# MUTED FOLLOWED FOLLOWED
orig_topic = "Topic2" orig_topic = "Topic2"
target_topic = "Topic2 edited" target_topic = "Topic2 edited"
orig_message_id = self.send_stream_message( orig_message_id = self.send_stream_message(
@@ -854,12 +866,18 @@ class MessageMoveTopicTest(ZulipTestCase):
do_set_user_topic_visibility_policy( do_set_user_topic_visibility_policy(
aaron, stream, orig_topic, visibility_policy=UserTopic.VisibilityPolicy.MUTED aaron, stream, orig_topic, visibility_policy=UserTopic.VisibilityPolicy.MUTED
) )
do_set_user_topic_visibility_policy(
shiva, stream, orig_topic, visibility_policy=UserTopic.VisibilityPolicy.MUTED
)
do_set_user_topic_visibility_policy( do_set_user_topic_visibility_policy(
cordelia, stream, target_topic, visibility_policy=UserTopic.VisibilityPolicy.MUTED cordelia, stream, target_topic, visibility_policy=UserTopic.VisibilityPolicy.MUTED
) )
do_set_user_topic_visibility_policy( do_set_user_topic_visibility_policy(
aaron, stream, target_topic, visibility_policy=UserTopic.VisibilityPolicy.UNMUTED aaron, stream, target_topic, visibility_policy=UserTopic.VisibilityPolicy.UNMUTED
) )
do_set_user_topic_visibility_policy(
shiva, stream, target_topic, visibility_policy=UserTopic.VisibilityPolicy.FOLLOWED
)
check_update_message( check_update_message(
user_profile=hamlet, user_profile=hamlet,
@@ -881,6 +899,9 @@ class MessageMoveTopicTest(ZulipTestCase):
self.assert_has_visibility_policy( self.assert_has_visibility_policy(
aaron, orig_topic, stream, UserTopic.VisibilityPolicy.INHERIT aaron, orig_topic, stream, UserTopic.VisibilityPolicy.INHERIT
) )
self.assert_has_visibility_policy(
shiva, orig_topic, stream, UserTopic.VisibilityPolicy.INHERIT
)
self.assert_has_visibility_policy( self.assert_has_visibility_policy(
hamlet, target_topic, stream, UserTopic.VisibilityPolicy.INHERIT hamlet, target_topic, stream, UserTopic.VisibilityPolicy.INHERIT
) )
@@ -890,6 +911,9 @@ class MessageMoveTopicTest(ZulipTestCase):
self.assert_has_visibility_policy( self.assert_has_visibility_policy(
aaron, target_topic, stream, UserTopic.VisibilityPolicy.UNMUTED aaron, target_topic, stream, UserTopic.VisibilityPolicy.UNMUTED
) )
self.assert_has_visibility_policy(
shiva, target_topic, stream, UserTopic.VisibilityPolicy.FOLLOWED
)
# Test the following cases: # Test the following cases:
# #
@@ -897,6 +921,7 @@ class MessageMoveTopicTest(ZulipTestCase):
# UNMUTED INHERIT UNMUTED # UNMUTED INHERIT UNMUTED
# UNMUTED MUTED UNMUTED # UNMUTED MUTED UNMUTED
# UNMUTED UNMUTED UNMUTED # UNMUTED UNMUTED UNMUTED
# UNMUTED FOLLOWED FOLLOWED
orig_topic = "Topic3" orig_topic = "Topic3"
target_topic = "Topic3 edited" target_topic = "Topic3 edited"
orig_message_id = self.send_stream_message( orig_message_id = self.send_stream_message(
@@ -915,12 +940,88 @@ class MessageMoveTopicTest(ZulipTestCase):
do_set_user_topic_visibility_policy( do_set_user_topic_visibility_policy(
aaron, stream, orig_topic, visibility_policy=UserTopic.VisibilityPolicy.UNMUTED aaron, stream, orig_topic, visibility_policy=UserTopic.VisibilityPolicy.UNMUTED
) )
do_set_user_topic_visibility_policy(
shiva, stream, orig_topic, visibility_policy=UserTopic.VisibilityPolicy.UNMUTED
)
do_set_user_topic_visibility_policy( do_set_user_topic_visibility_policy(
cordelia, stream, target_topic, visibility_policy=UserTopic.VisibilityPolicy.MUTED cordelia, stream, target_topic, visibility_policy=UserTopic.VisibilityPolicy.MUTED
) )
do_set_user_topic_visibility_policy( do_set_user_topic_visibility_policy(
aaron, stream, target_topic, visibility_policy=UserTopic.VisibilityPolicy.UNMUTED aaron, stream, target_topic, visibility_policy=UserTopic.VisibilityPolicy.UNMUTED
) )
do_set_user_topic_visibility_policy(
shiva, stream, target_topic, visibility_policy=UserTopic.VisibilityPolicy.FOLLOWED
)
check_update_message(
user_profile=hamlet,
message_id=orig_message_id,
stream_id=None,
topic_name=target_topic,
propagate_mode="change_all",
send_notification_to_old_thread=False,
send_notification_to_new_thread=False,
content=None,
)
self.assert_has_visibility_policy(
hamlet, orig_topic, stream, UserTopic.VisibilityPolicy.INHERIT
)
self.assert_has_visibility_policy(
cordelia, orig_topic, stream, UserTopic.VisibilityPolicy.INHERIT
)
self.assert_has_visibility_policy(
aaron, orig_topic, stream, UserTopic.VisibilityPolicy.INHERIT
)
self.assert_has_visibility_policy(
shiva, orig_topic, stream, UserTopic.VisibilityPolicy.INHERIT
)
self.assert_has_visibility_policy(
hamlet, target_topic, stream, UserTopic.VisibilityPolicy.UNMUTED
)
self.assert_has_visibility_policy(
cordelia, target_topic, stream, UserTopic.VisibilityPolicy.UNMUTED
)
self.assert_has_visibility_policy(
aaron, target_topic, stream, UserTopic.VisibilityPolicy.UNMUTED
)
self.assert_has_visibility_policy(
shiva, target_topic, stream, UserTopic.VisibilityPolicy.FOLLOWED
)
# Test the following cases:
#
# orig_topic | target_topic | final behaviour
# FOLLOWED INHERIT FOLLOWED
# FOLLOWED MUTED FOLLOWED
# FOLLOWED UNMUTED FOLLOWED
orig_topic = "Topic4"
target_topic = "Topic4 edited"
orig_message_id = self.send_stream_message(
hamlet, stream_name, topic_name=orig_topic, content="Hello World"
)
self.send_stream_message(
hamlet, stream_name, topic_name=target_topic, content="Hello World 2"
)
do_set_user_topic_visibility_policy(
cordelia, stream, target_topic, visibility_policy=UserTopic.VisibilityPolicy.FOLLOWED
)
do_set_user_topic_visibility_policy(
hamlet, stream, orig_topic, visibility_policy=UserTopic.VisibilityPolicy.FOLLOWED
)
do_set_user_topic_visibility_policy(
cordelia, stream, orig_topic, visibility_policy=UserTopic.VisibilityPolicy.FOLLOWED
)
do_set_user_topic_visibility_policy(
cordelia, stream, target_topic, visibility_policy=UserTopic.VisibilityPolicy.MUTED
)
do_set_user_topic_visibility_policy(
aaron, stream, orig_topic, visibility_policy=UserTopic.VisibilityPolicy.FOLLOWED
)
do_set_user_topic_visibility_policy(
aaron, stream, target_topic, visibility_policy=UserTopic.VisibilityPolicy.UNMUTED
)
check_update_message( check_update_message(
user_profile=hamlet, user_profile=hamlet,
@@ -943,13 +1044,13 @@ class MessageMoveTopicTest(ZulipTestCase):
aaron, orig_topic, stream, UserTopic.VisibilityPolicy.INHERIT aaron, orig_topic, stream, UserTopic.VisibilityPolicy.INHERIT
) )
self.assert_has_visibility_policy( self.assert_has_visibility_policy(
hamlet, target_topic, stream, UserTopic.VisibilityPolicy.UNMUTED hamlet, target_topic, stream, UserTopic.VisibilityPolicy.FOLLOWED
) )
self.assert_has_visibility_policy( self.assert_has_visibility_policy(
cordelia, target_topic, stream, UserTopic.VisibilityPolicy.UNMUTED cordelia, target_topic, stream, UserTopic.VisibilityPolicy.FOLLOWED
) )
self.assert_has_visibility_policy( self.assert_has_visibility_policy(
aaron, target_topic, stream, UserTopic.VisibilityPolicy.UNMUTED aaron, target_topic, stream, UserTopic.VisibilityPolicy.FOLLOWED
) )
def test_user_topic_states_on_moving_to_topic_with_no_messages(self) -> None: def test_user_topic_states_on_moving_to_topic_with_no_messages(self) -> None: