Skip to content
Snippets Groups Projects
Unverified Commit b8b905c4 authored by Sean Quah's avatar Sean Quah Committed by GitHub
Browse files

Fix inconsistent behavior of `get_last_client_by_ip` (#10970)

Make `get_last_client_by_ip` return the same dictionary structure
regardless of whether the data has been persisted to the database.

This change will allow slightly cleaner type hints to be applied later
on.
parent 6b18eb44
No related branches found
No related tags found
No related merge requests found
Fix inconsistent behavior of `get_last_client_by_ip` when reporting data that has not been stored in the database yet.
...@@ -538,15 +538,20 @@ class ClientIpStore(ClientIpWorkerStore): ...@@ -538,15 +538,20 @@ class ClientIpStore(ClientIpWorkerStore):
""" """
ret = await super().get_last_client_ip_by_device(user_id, device_id) ret = await super().get_last_client_ip_by_device(user_id, device_id)
# Update what is retrieved from the database with data which is pending insertion. # Update what is retrieved from the database with data which is pending
# insertion, as if it has already been stored in the database.
for key in self._batch_row_update: for key in self._batch_row_update:
uid, access_token, ip = key uid, _access_token, ip = key
if uid == user_id: if uid == user_id:
user_agent, did, last_seen = self._batch_row_update[key] user_agent, did, last_seen = self._batch_row_update[key]
if did is None:
# These updates don't make it to the `devices` table
continue
if not device_id or did == device_id: if not device_id or did == device_id:
ret[(user_id, device_id)] = { ret[(user_id, did)] = {
"user_id": user_id, "user_id": user_id,
"access_token": access_token,
"ip": ip, "ip": ip,
"user_agent": user_agent, "user_agent": user_agent,
"device_id": did, "device_id": did,
......
...@@ -146,6 +146,49 @@ class ClientIpStoreTestCase(unittest.HomeserverTestCase): ...@@ -146,6 +146,49 @@ class ClientIpStoreTestCase(unittest.HomeserverTestCase):
], ],
) )
@parameterized.expand([(False,), (True,)])
def test_get_last_client_ip_by_device(self, after_persisting: bool):
"""Test `get_last_client_ip_by_device` for persisted and unpersisted data"""
self.reactor.advance(12345678)
user_id = "@user:id"
device_id = "MY_DEVICE"
# Insert a user IP
self.get_success(
self.store.store_device(
user_id,
device_id,
"display name",
)
)
self.get_success(
self.store.insert_client_ip(
user_id, "access_token", "ip", "user_agent", device_id
)
)
if after_persisting:
# Trigger the storage loop
self.reactor.advance(10)
result = self.get_success(
self.store.get_last_client_ip_by_device(user_id, device_id)
)
self.assertEqual(
result,
{
(user_id, device_id): {
"user_id": user_id,
"device_id": device_id,
"ip": "ip",
"user_agent": "user_agent",
"last_seen": 12345678000,
},
},
)
@parameterized.expand([(False,), (True,)]) @parameterized.expand([(False,), (True,)])
def test_get_user_ip_and_agents(self, after_persisting: bool): def test_get_user_ip_and_agents(self, after_persisting: bool):
"""Test `get_user_ip_and_agents` for persisted and unpersisted data""" """Test `get_user_ip_and_agents` for persisted and unpersisted data"""
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment