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.
|