diff --git a/tests/push/test_http.py b/tests/push/test_http.py
index dce00d8b7f..bcca472617 100644
--- a/tests/push/test_http.py
+++ b/tests/push/test_http.py
@@ -26,7 +26,8 @@ from twisted.test.proto_helpers import MemoryReactor
import synapse.rest.admin
from synapse.logging.context import make_deferred_yieldable
from synapse.push import PusherConfig, PusherConfigException
-from synapse.rest.client import login, push_rule, pusher, receipts, room
+from synapse.rest.admin.experimental_features import ExperimentalFeature
+from synapse.rest.client import login, push_rule, pusher, receipts, room, versions
from synapse.server import HomeServer
from synapse.types import JsonDict
from synapse.util import Clock
@@ -42,6 +43,7 @@ class HTTPPusherTests(HomeserverTestCase):
receipts.register_servlets,
push_rule.register_servlets,
pusher.register_servlets,
+ versions.register_servlets,
]
user_id = True
hijack_auth = False
@@ -969,6 +971,84 @@ class HTTPPusherTests(HomeserverTestCase):
lookup_result.device_id,
)
+ def test_device_id_feature_flag(self) -> None:
+ """Tests that a pusher created with a given device ID shows that device ID in
+ GET /pushers requests when feature is enabled for the user
+ """
+ user_id = self.register_user("user", "pass")
+ access_token = self.login("user", "pass")
+
+ # We create the pusher with an HTTP request rather than with
+ # _make_user_with_pusher so that we can test the device ID is correctly set when
+ # creating a pusher via an API call.
+ self.make_request(
+ method="POST",
+ path="/pushers/set",
+ content={
+ "kind": "http",
+ "app_id": "m.http",
+ "app_display_name": "HTTP Push Notifications",
+ "device_display_name": "pushy push",
+ "pushkey": "a@example.com",
+ "lang": "en",
+ "data": {"url": "http://example.com/_matrix/push/v1/notify"},
+ },
+ access_token=access_token,
+ )
+
+ # Look up the user info for the access token so we can compare the device ID.
+ store = self.hs.get_datastores().main
+ lookup_result = self.get_success(store.get_user_by_access_token(access_token))
+ assert lookup_result is not None
+
+ # Check field is not there before we enable the feature flag
+ channel = self.make_request("GET", "/pushers", access_token=access_token)
+ self.assertEqual(channel.code, 200)
+ self.assertEqual(len(channel.json_body["pushers"]), 1)
+ self.assertNotIn(
+ "org.matrix.msc3881.device_id", channel.json_body["pushers"][0]
+ )
+
+ self.get_success(
+ store.set_features_for_user(user_id, {ExperimentalFeature.MSC3881: True})
+ )
+
+ # Get the user's devices and check it has the correct device ID.
+ channel = self.make_request("GET", "/pushers", access_token=access_token)
+ self.assertEqual(channel.code, 200)
+ self.assertEqual(len(channel.json_body["pushers"]), 1)
+ self.assertEqual(
+ channel.json_body["pushers"][0]["org.matrix.msc3881.device_id"],
+ lookup_result.device_id,
+ )
+
+ def test_msc3881_client_versions_flag(self) -> None:
+ """Tests that MSC3881 only appears in /versions if user has it enabled."""
+
+ user_id = self.register_user("user", "pass")
+ access_token = self.login("user", "pass")
+
+ # Check feature is disabled in /versions
+ channel = self.make_request(
+ "GET", "/_matrix/client/versions", access_token=access_token
+ )
+ self.assertEqual(channel.code, 200)
+ self.assertFalse(channel.json_body["unstable_features"]["org.matrix.msc3881"])
+
+ # Enable feature for user
+ self.get_success(
+ self.hs.get_datastores().main.set_features_for_user(
+ user_id, {ExperimentalFeature.MSC3881: True}
+ )
+ )
+
+ # Check feature is now enabled in /versions for user
+ channel = self.make_request(
+ "GET", "/_matrix/client/versions", access_token=access_token
+ )
+ self.assertEqual(channel.code, 200)
+ self.assertTrue(channel.json_body["unstable_features"]["org.matrix.msc3881"])
+
@override_config({"push": {"jitter_delay": "10s"}})
def test_jitter(self) -> None:
"""Tests that enabling jitter actually delays sending push."""
|