diff --git a/tests/rest/admin/test_server_notice.py b/tests/rest/admin/test_server_notice.py
index dfd14f5751..2398bc503a 100644
--- a/tests/rest/admin/test_server_notice.py
+++ b/tests/rest/admin/test_server_notice.py
@@ -477,6 +477,33 @@ class ServerNoticeTestCase(unittest.HomeserverTestCase):
# second room has new ID
self.assertNotEqual(first_room_id, second_room_id)
+ @override_config(
+ {"server_notices": {"system_mxid_localpart": "notices", "auto_join": True}}
+ )
+ def test_auto_join(self) -> None:
+ """
+ Tests that the user get automatically joined to the notice room
+ when `auto_join` setting is used.
+ """
+ # user has no room memberships
+ self._check_invite_and_join_status(self.other_user, 0, 0)
+
+ # send server notice
+ server_notice_request_content = {
+ "user_id": self.other_user,
+ "content": {"msgtype": "m.text", "body": "test msg one"},
+ }
+
+ self.make_request(
+ "POST",
+ self.url,
+ access_token=self.admin_user_tok,
+ content=server_notice_request_content,
+ )
+
+ # user has joined the room
+ self._check_invite_and_join_status(self.other_user, 0, 1)
+
@override_config({"server_notices": {"system_mxid_localpart": "notices"}})
def test_update_notice_user_name_when_changed(self) -> None:
"""
diff --git a/tests/rest/client/test_profile.py b/tests/rest/client/test_profile.py
index 8f923fd40f..eb0fa00bb3 100644
--- a/tests/rest/client/test_profile.py
+++ b/tests/rest/client/test_profile.py
@@ -312,6 +312,166 @@ class ProfileTestCase(unittest.HomeserverTestCase):
)
self.assertEqual(channel.code, 200, channel.result)
+ @unittest.override_config(
+ {"experimental_features": {"msc4069_profile_inhibit_propagation": True}}
+ )
+ def test_msc4069_inhibit_propagation(self) -> None:
+ """Tests to ensure profile update propagation can be inhibited."""
+ for prop in ["avatar_url", "displayname"]:
+ room_id = self.helper.create_room_as(tok=self.owner_tok)
+
+ channel = self.make_request(
+ "PUT",
+ f"/rooms/{room_id}/state/m.room.member/{self.owner}",
+ content={"membership": "join", prop: "mxc://my.server/existing"},
+ access_token=self.owner_tok,
+ )
+ self.assertEqual(channel.code, 200, channel.result)
+
+ channel = self.make_request(
+ "PUT",
+ f"/profile/{self.owner}/{prop}?org.matrix.msc4069.propagate=false",
+ content={prop: "http://my.server/pic.gif"},
+ access_token=self.owner_tok,
+ )
+ self.assertEqual(channel.code, 200, channel.result)
+
+ res = (
+ self._get_avatar_url()
+ if prop == "avatar_url"
+ else self._get_displayname()
+ )
+ self.assertEqual(res, "http://my.server/pic.gif")
+
+ channel = self.make_request(
+ "GET",
+ f"/rooms/{room_id}/state/m.room.member/{self.owner}",
+ access_token=self.owner_tok,
+ )
+ self.assertEqual(channel.code, 200, channel.result)
+ self.assertEqual(channel.json_body.get(prop), "mxc://my.server/existing")
+
+ def test_msc4069_inhibit_propagation_disabled(self) -> None:
+ """Tests to ensure profile update propagation inhibit flags are ignored when the
+ experimental flag is not enabled.
+ """
+ for prop in ["avatar_url", "displayname"]:
+ room_id = self.helper.create_room_as(tok=self.owner_tok)
+
+ channel = self.make_request(
+ "PUT",
+ f"/rooms/{room_id}/state/m.room.member/{self.owner}",
+ content={"membership": "join", prop: "mxc://my.server/existing"},
+ access_token=self.owner_tok,
+ )
+ self.assertEqual(channel.code, 200, channel.result)
+
+ channel = self.make_request(
+ "PUT",
+ f"/profile/{self.owner}/{prop}?org.matrix.msc4069.propagate=false",
+ content={prop: "http://my.server/pic.gif"},
+ access_token=self.owner_tok,
+ )
+ self.assertEqual(channel.code, 200, channel.result)
+
+ res = (
+ self._get_avatar_url()
+ if prop == "avatar_url"
+ else self._get_displayname()
+ )
+ self.assertEqual(res, "http://my.server/pic.gif")
+
+ channel = self.make_request(
+ "GET",
+ f"/rooms/{room_id}/state/m.room.member/{self.owner}",
+ access_token=self.owner_tok,
+ )
+ self.assertEqual(channel.code, 200, channel.result)
+
+ # The ?propagate=false should be ignored by the server because the config flag
+ # isn't enabled.
+ self.assertEqual(channel.json_body.get(prop), "http://my.server/pic.gif")
+
+ def test_msc4069_inhibit_propagation_default(self) -> None:
+ """Tests to ensure profile update propagation happens by default."""
+ for prop in ["avatar_url", "displayname"]:
+ room_id = self.helper.create_room_as(tok=self.owner_tok)
+
+ channel = self.make_request(
+ "PUT",
+ f"/rooms/{room_id}/state/m.room.member/{self.owner}",
+ content={"membership": "join", prop: "mxc://my.server/existing"},
+ access_token=self.owner_tok,
+ )
+ self.assertEqual(channel.code, 200, channel.result)
+
+ channel = self.make_request(
+ "PUT",
+ f"/profile/{self.owner}/{prop}",
+ content={prop: "http://my.server/pic.gif"},
+ access_token=self.owner_tok,
+ )
+ self.assertEqual(channel.code, 200, channel.result)
+
+ res = (
+ self._get_avatar_url()
+ if prop == "avatar_url"
+ else self._get_displayname()
+ )
+ self.assertEqual(res, "http://my.server/pic.gif")
+
+ channel = self.make_request(
+ "GET",
+ f"/rooms/{room_id}/state/m.room.member/{self.owner}",
+ access_token=self.owner_tok,
+ )
+ self.assertEqual(channel.code, 200, channel.result)
+
+ # The ?propagate=false should be ignored by the server because the config flag
+ # isn't enabled.
+ self.assertEqual(channel.json_body.get(prop), "http://my.server/pic.gif")
+
+ @unittest.override_config(
+ {"experimental_features": {"msc4069_profile_inhibit_propagation": True}}
+ )
+ def test_msc4069_inhibit_propagation_like_default(self) -> None:
+ """Tests to ensure clients can request explicit profile propagation."""
+ for prop in ["avatar_url", "displayname"]:
+ room_id = self.helper.create_room_as(tok=self.owner_tok)
+
+ channel = self.make_request(
+ "PUT",
+ f"/rooms/{room_id}/state/m.room.member/{self.owner}",
+ content={"membership": "join", prop: "mxc://my.server/existing"},
+ access_token=self.owner_tok,
+ )
+ self.assertEqual(channel.code, 200, channel.result)
+
+ channel = self.make_request(
+ "PUT",
+ f"/profile/{self.owner}/{prop}?org.matrix.msc4069.propagate=true",
+ content={prop: "http://my.server/pic.gif"},
+ access_token=self.owner_tok,
+ )
+ self.assertEqual(channel.code, 200, channel.result)
+
+ res = (
+ self._get_avatar_url()
+ if prop == "avatar_url"
+ else self._get_displayname()
+ )
+ self.assertEqual(res, "http://my.server/pic.gif")
+
+ channel = self.make_request(
+ "GET",
+ f"/rooms/{room_id}/state/m.room.member/{self.owner}",
+ access_token=self.owner_tok,
+ )
+ self.assertEqual(channel.code, 200, channel.result)
+
+ # The client requested ?propagate=true, so it should have happened.
+ self.assertEqual(channel.json_body.get(prop), "http://my.server/pic.gif")
+
def _setup_local_files(self, names_and_props: Dict[str, Dict[str, Any]]) -> None:
"""Stores metadata about files in the database.
|