Revert "Refactor cleanup_stale_device_codes to use modern SQLAlchemy 2.0 select() API"

This reverts commit 53871f206b2c9b5ff489216ca18c149c492889b9.
This commit is contained in:
openhands 2025-12-18 20:47:59 +00:00
parent 53871f206b
commit 68a3464a28
2 changed files with 27 additions and 35 deletions

View File

@ -4,7 +4,7 @@ import secrets
import string import string
from datetime import datetime, timedelta, timezone from datetime import datetime, timedelta, timezone
from sqlalchemy import delete, select from sqlalchemy import delete
from sqlalchemy.exc import IntegrityError from sqlalchemy.exc import IntegrityError
from storage.device_code import DeviceCode from storage.device_code import DeviceCode
@ -182,14 +182,13 @@ class DeviceCodeStore:
""" """
with self.session_maker() as session: with self.session_maker() as session:
# Get expired device codes, ordered by oldest first (using ID as proxy for creation order) # Get expired device codes, ordered by oldest first (using ID as proxy for creation order)
query = ( expired_codes = (
select(DeviceCode) session.query(DeviceCode)
.where(DeviceCode.expires_at < datetime.now(timezone.utc)) .filter(DeviceCode.expires_at < datetime.now(timezone.utc))
.order_by(DeviceCode.id.asc()) .order_by(DeviceCode.id.asc())
.limit(limit) .limit(limit)
.all()
) )
result = session.execute(query)
expired_codes = result.scalars().all()
if not expired_codes: if not expired_codes:
logger.info('No expired device codes found') logger.info('No expired device codes found')

View File

@ -194,17 +194,13 @@ class TestDeviceCodeStore:
def test_cleanup_stale_device_codes_empty(self, device_code_store, mock_session): def test_cleanup_stale_device_codes_empty(self, device_code_store, mock_session):
"""Test cleanup when no expired device codes exist.""" """Test cleanup when no expired device codes exist."""
# Mock empty query result using select() pattern # Mock empty query result
mock_scalars = MagicMock() mock_session.query.return_value.filter.return_value.order_by.return_value.limit.return_value.all.return_value = []
mock_scalars.all.return_value = []
mock_result = MagicMock()
mock_result.scalars.return_value = mock_scalars
mock_session.execute.return_value = mock_result
result = device_code_store.cleanup_stale_device_codes(limit=50) result = device_code_store.cleanup_stale_device_codes(limit=50)
assert result == 0 assert result == 0
mock_session.execute.assert_called_once() mock_session.query.assert_called_once_with(DeviceCode)
def test_cleanup_stale_device_codes_with_data( def test_cleanup_stale_device_codes_with_data(
self, device_code_store, mock_session self, device_code_store, mock_session
@ -216,23 +212,21 @@ class TestDeviceCodeStore:
mock_device2 = MagicMock() mock_device2 = MagicMock()
mock_device2.id = 2 mock_device2.id = 2
# Mock query result with 2 expired codes using select() pattern # Mock query result with 2 expired codes
mock_scalars = MagicMock() mock_session.query.return_value.filter.return_value.order_by.return_value.limit.return_value.all.return_value = [
mock_scalars.all.return_value = [mock_device1, mock_device2] mock_device1,
mock_select_result = MagicMock() mock_device2,
mock_select_result.scalars.return_value = mock_scalars ]
# Mock the delete execution result # Mock the delete execution result
mock_delete_result = MagicMock() mock_result = MagicMock()
mock_delete_result.rowcount = 2 mock_result.rowcount = 2
mock_session.execute.return_value = mock_result
# First execute call returns select result, second returns delete result
mock_session.execute.side_effect = [mock_select_result, mock_delete_result]
result = device_code_store.cleanup_stale_device_codes(limit=50) result = device_code_store.cleanup_stale_device_codes(limit=50)
assert result == 2 assert result == 2
assert mock_session.execute.call_count == 2 mock_session.execute.assert_called_once()
mock_session.commit.assert_called_once() mock_session.commit.assert_called_once()
def test_cleanup_stale_device_codes_with_limit( def test_cleanup_stale_device_codes_with_limit(
@ -242,21 +236,20 @@ class TestDeviceCodeStore:
# Create mock device codes # Create mock device codes
mock_devices = [MagicMock(id=i) for i in range(1, 4)] # 3 codes mock_devices = [MagicMock(id=i) for i in range(1, 4)] # 3 codes
# Mock query result with 3 expired codes using select() pattern # Mock query result with 3 expired codes
mock_scalars = MagicMock() mock_session.query.return_value.filter.return_value.order_by.return_value.limit.return_value.all.return_value = mock_devices
mock_scalars.all.return_value = mock_devices
mock_select_result = MagicMock()
mock_select_result.scalars.return_value = mock_scalars
# Mock the delete execution result # Mock the delete execution result
mock_delete_result = MagicMock() mock_result = MagicMock()
mock_delete_result.rowcount = 3 mock_result.rowcount = 3
mock_session.execute.return_value = mock_result
# First execute call returns select result, second returns delete result
mock_session.execute.side_effect = [mock_select_result, mock_delete_result]
result = device_code_store.cleanup_stale_device_codes(limit=3) result = device_code_store.cleanup_stale_device_codes(limit=3)
assert result == 3 assert result == 3
assert mock_session.execute.call_count == 2 mock_session.execute.assert_called_once()
mock_session.commit.assert_called_once() mock_session.commit.assert_called_once()
# Verify the limit was applied in the query
mock_session.query.return_value.filter.return_value.order_by.return_value.limit.assert_called_with(
3
)