feat: extend operational investigation workflows
This commit is contained in:
@@ -0,0 +1,63 @@
|
||||
"""Queue lifecycle SQL contracts; real races are covered by the opt-in PG suite."""
|
||||
import asyncio
|
||||
from contextlib import asynccontextmanager
|
||||
|
||||
import pytest
|
||||
|
||||
from app.infra.db.postgresql.calculation_jobs import CalculationJobRepository
|
||||
from app.mcp.errors import CalculationCapacityExceeded
|
||||
|
||||
|
||||
class Connection:
|
||||
def __init__(self, rows=()):
|
||||
self.rows = iter(rows)
|
||||
self.statements = []
|
||||
self.in_transaction = False
|
||||
|
||||
@asynccontextmanager
|
||||
async def transaction(self):
|
||||
self.in_transaction = True
|
||||
try:
|
||||
yield
|
||||
finally:
|
||||
self.in_transaction = False
|
||||
|
||||
async def execute(self, sql, params):
|
||||
self.statements.append((sql, params, self.in_transaction))
|
||||
row = next(self.rows, None) if sql.lstrip().startswith(('SELECT job_id', 'SELECT count', 'INSERT')) else None
|
||||
class Cursor:
|
||||
async def fetchone(self):
|
||||
return row
|
||||
async def fetchall(self):
|
||||
return []
|
||||
return Cursor()
|
||||
|
||||
|
||||
def test_status_projection_excludes_result_and_expires_without_worker():
|
||||
connection = Connection()
|
||||
repo = CalculationJobRepository(connection, 'project')
|
||||
asyncio.run(repo.get('job'))
|
||||
assert 'QUEUE_TIMEOUT' in connection.statements[0][0]
|
||||
assert 'SET result=NULL' in connection.statements[1][0]
|
||||
assert ',result FROM' not in connection.statements[2][0]
|
||||
asyncio.run(repo.get('job', include_result=True))
|
||||
assert ',result FROM' in connection.statements[-1][0]
|
||||
|
||||
|
||||
def test_duplicate_submission_bypasses_full_queue_inside_transaction():
|
||||
existing = {'tool': 'tool', 'parameters': {'timeout_seconds': 3600}, 'binding': {}, 'job_id': 'existing'}
|
||||
connection = Connection([existing])
|
||||
row = asyncio.run(CalculationJobRepository(connection, 'project').enqueue(
|
||||
owner_user_id='owner', request_key='key', tool='tool', parameters={}, binding={}, timeout_seconds=30))
|
||||
assert row['job_id'] == 'existing'
|
||||
assert 'pg_advisory_xact_lock' in connection.statements[0][0]
|
||||
assert all(statement[2] for statement in connection.statements)
|
||||
assert not any('count(*)' in sql for sql, _, _ in connection.statements)
|
||||
|
||||
|
||||
def test_capacity_rejects_new_job_before_insert():
|
||||
connection = Connection([None, {'active': 100}])
|
||||
with pytest.raises(CalculationCapacityExceeded):
|
||||
asyncio.run(CalculationJobRepository(connection, 'project').enqueue(
|
||||
owner_user_id='owner', request_key='key', tool='tool', parameters={}, binding={}, timeout_seconds=30))
|
||||
assert not any('INSERT' in sql for sql, _, _ in connection.statements)
|
||||
Reference in New Issue
Block a user