diff --git a/tests/rest/admin/test_user.py b/tests/rest/admin/test_user.py
index feb81844ae..761871b933 100644
--- a/tests/rest/admin/test_user.py
+++ b/tests/rest/admin/test_user.py
@@ -18,7 +18,7 @@ import os
import urllib.parse
from binascii import unhexlify
from typing import List, Optional
-from unittest.mock import Mock, patch
+from unittest.mock import AsyncMock, Mock, patch
from parameterized import parameterized, parameterized_class
@@ -40,12 +40,13 @@ from synapse.rest.client import (
user_directory,
)
from synapse.server import HomeServer
+from synapse.storage.databases.main.client_ips import LAST_SEEN_GRANULARITY
from synapse.types import JsonDict, UserID, create_requester
from synapse.util import Clock
from tests import unittest
from tests.server import FakeSite, make_request
-from tests.test_utils import SMALL_PNG, make_awaitable
+from tests.test_utils import SMALL_PNG
from tests.unittest import override_config
@@ -71,8 +72,8 @@ class UserRegisterTestCase(unittest.HomeserverTestCase):
self.hs.config.registration.registration_shared_secret = "shared"
- self.hs.get_media_repository = Mock() # type: ignore[assignment]
- self.hs.get_deactivate_account_handler = Mock() # type: ignore[assignment]
+ self.hs.get_media_repository = Mock() # type: ignore[method-assign]
+ self.hs.get_deactivate_account_handler = Mock() # type: ignore[method-assign]
return self.hs
@@ -419,8 +420,8 @@ class UserRegisterTestCase(unittest.HomeserverTestCase):
store = self.hs.get_datastores().main
# Set monthly active users to the limit
- store.get_monthly_active_count = Mock(
- return_value=make_awaitable(self.hs.config.server.max_mau_value)
+ store.get_monthly_active_count = AsyncMock(
+ return_value=self.hs.config.server.max_mau_value
)
# Check that the blocking of monthly active users is working as expected
# The registration of a new user fails due to the limit
@@ -456,6 +457,7 @@ class UsersListTestCase(unittest.HomeserverTestCase):
servlets = [
synapse.rest.admin.register_servlets,
login.register_servlets,
+ room.register_servlets,
]
url = "/_synapse/admin/v2/users"
@@ -506,6 +508,62 @@ class UsersListTestCase(unittest.HomeserverTestCase):
# Check that all fields are available
self._check_fields(channel.json_body["users"])
+ def test_last_seen(self) -> None:
+ """
+ Test that last_seen_ts field is properly working.
+ """
+ user1 = self.register_user("u1", "pass")
+ user1_token = self.login("u1", "pass")
+ user2 = self.register_user("u2", "pass")
+ user2_token = self.login("u2", "pass")
+ user3 = self.register_user("u3", "pass")
+ user3_token = self.login("u3", "pass")
+
+ self.helper.create_room_as(self.admin_user, tok=self.admin_user_tok)
+ self.reactor.advance(10)
+ self.helper.create_room_as(user2, tok=user2_token)
+ self.reactor.advance(10)
+ self.helper.create_room_as(user1, tok=user1_token)
+ self.reactor.advance(10)
+ self.helper.create_room_as(user3, tok=user3_token)
+ self.reactor.advance(10)
+
+ channel = self.make_request(
+ "GET",
+ self.url,
+ access_token=self.admin_user_tok,
+ )
+
+ self.assertEqual(200, channel.code, msg=channel.json_body)
+ self.assertEqual(4, len(channel.json_body["users"]))
+ self.assertEqual(4, channel.json_body["total"])
+
+ admin_last_seen = channel.json_body["users"][0]["last_seen_ts"]
+ user1_last_seen = channel.json_body["users"][1]["last_seen_ts"]
+ user2_last_seen = channel.json_body["users"][2]["last_seen_ts"]
+ user3_last_seen = channel.json_body["users"][3]["last_seen_ts"]
+ self.assertTrue(admin_last_seen > 0 and admin_last_seen < 10000)
+ self.assertTrue(user2_last_seen > 10000 and user2_last_seen < 20000)
+ self.assertTrue(user1_last_seen > 20000 and user1_last_seen < 30000)
+ self.assertTrue(user3_last_seen > 30000 and user3_last_seen < 40000)
+
+ self._order_test([self.admin_user, user2, user1, user3], "last_seen_ts")
+
+ self.reactor.advance(LAST_SEEN_GRANULARITY / 1000)
+ self.helper.create_room_as(user1, tok=user1_token)
+ self.reactor.advance(10)
+
+ channel = self.make_request(
+ "GET",
+ self.url + "/" + user1,
+ access_token=self.admin_user_tok,
+ )
+ self.assertTrue(
+ channel.json_body["last_seen_ts"] > 40000 + LAST_SEEN_GRANULARITY
+ )
+
+ self._order_test([self.admin_user, user2, user3, user1], "last_seen_ts")
+
def test_search_term(self) -> None:
"""Test that searching for a users works correctly"""
@@ -1135,6 +1193,7 @@ class UsersListTestCase(unittest.HomeserverTestCase):
self.assertIn("displayname", u)
self.assertIn("avatar_url", u)
self.assertIn("creation_ts", u)
+ self.assertIn("last_seen_ts", u)
def _create_users(self, number_users: int) -> None:
"""
@@ -1834,8 +1893,8 @@ class UserRestTestCase(unittest.HomeserverTestCase):
)
# Set monthly active users to the limit
- self.store.get_monthly_active_count = Mock(
- return_value=make_awaitable(self.hs.config.server.max_mau_value)
+ self.store.get_monthly_active_count = AsyncMock(
+ return_value=self.hs.config.server.max_mau_value
)
# Check that the blocking of monthly active users is working as expected
# The registration of a new user fails due to the limit
@@ -1871,8 +1930,8 @@ class UserRestTestCase(unittest.HomeserverTestCase):
handler = self.hs.get_registration_handler()
# Set monthly active users to the limit
- self.store.get_monthly_active_count = Mock(
- return_value=make_awaitable(self.hs.config.server.max_mau_value)
+ self.store.get_monthly_active_count = AsyncMock(
+ return_value=self.hs.config.server.max_mau_value
)
# Check that the blocking of monthly active users is working as expected
# The registration of a new user fails due to the limit
@@ -3035,6 +3094,7 @@ class UserRestTestCase(unittest.HomeserverTestCase):
self.assertIn("consent_version", content)
self.assertIn("consent_ts", content)
self.assertIn("external_ids", content)
+ self.assertIn("last_seen_ts", content)
# This key was removed intentionally. Ensure it is not accidentally re-included.
self.assertNotIn("password_hash", content)
|