Skip to content

Commit aabf35e

Browse files
committed
removed leaks from other branch; added (agent written) tests.
1 parent 600d8fa commit aabf35e

4 files changed

Lines changed: 176 additions & 4 deletions

File tree

app/routers/panels.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import os
2-
from datetime import UTC, datetime
32

43
from fastapi import APIRouter, Depends, HTTPException, Query
54
from sqlalchemy.orm import attributes
@@ -64,7 +63,6 @@ async def create_panel(
6463
panel.status = Status.INITIAL
6564
panel.job_id = None
6665
panel.date_ingested = None
67-
panel.date_created = datetime.now(UTC)
6866
if not keep_logs:
6967
panel.logs = []
7068
attributes.flag_modified(panel, "logs")

app/routers/studies.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import os
2-
from datetime import UTC, datetime
32

43
from fastapi import APIRouter, Depends, HTTPException, Query
54
from sqlalchemy.orm import attributes
@@ -64,7 +63,6 @@ async def create_study(
6463
study.status = Status.INITIAL
6564
study.job_id = None
6665
study.date_ingested = None
67-
study.date_created = datetime.now(UTC)
6866
if not keep_logs:
6967
study.logs = []
7068
attributes.flag_modified(study, "logs")

app/tests/test_routers_panels.py

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -291,6 +291,94 @@ def test_create_panel_retry_failed_keep_logs(
291291
assert response.status_code == 201
292292
assert len(response.json()["logs"]) == 1
293293

294+
@patch("app.routers.panels.queue")
295+
def test_create_panel_force_completed(
296+
self,
297+
mock_queue: MagicMock,
298+
client: TestClient,
299+
auth_headers: dict[str, str],
300+
session: Session,
301+
):
302+
"""Test force re-ingesting a completed panel."""
303+
panel = Panel(name="completed-panel-force.txt", status=Status.COMPLETED)
304+
session.add(panel)
305+
session.commit()
306+
307+
mock_job = MagicMock()
308+
mock_job.id = "job-force"
309+
mock_queue.enqueue.return_value = mock_job
310+
311+
response = client.post(
312+
"/panels/?force=true",
313+
json={"name": "completed-panel-force.txt"},
314+
headers=auth_headers,
315+
)
316+
assert response.status_code == 201
317+
data = response.json()
318+
assert data["name"] == "completed-panel-force.txt"
319+
assert data["job_id"] == "job-force"
320+
assert mock_queue.enqueue.called
321+
322+
@patch("app.routers.panels.queue")
323+
def test_create_panel_force_completed_purges_logs_by_default(
324+
self,
325+
mock_queue: MagicMock,
326+
client: TestClient,
327+
auth_headers: dict[str, str],
328+
session: Session,
329+
):
330+
"""Test that force re-ingesting a completed panel purges logs by default."""
331+
panel = Panel(
332+
name="completed-panel-force-logs.txt",
333+
status=Status.COMPLETED,
334+
logs=[{"level": "INFO", "message": "previous success"}],
335+
)
336+
session.add(panel)
337+
session.commit()
338+
session.refresh(panel)
339+
340+
mock_job = MagicMock()
341+
mock_job.id = "job-force-logs"
342+
mock_queue.enqueue.return_value = mock_job
343+
344+
response = client.post(
345+
"/panels/?force=true",
346+
json={"name": "completed-panel-force-logs.txt"},
347+
headers=auth_headers,
348+
)
349+
assert response.status_code == 201
350+
assert response.json()["logs"] == []
351+
352+
@patch("app.routers.panels.queue")
353+
def test_create_panel_force_completed_keep_logs(
354+
self,
355+
mock_queue: MagicMock,
356+
client: TestClient,
357+
auth_headers: dict[str, str],
358+
session: Session,
359+
):
360+
"""Test that force re-ingesting a completed panel preserves logs when keep_logs=true."""
361+
panel = Panel(
362+
name="completed-panel-force-keeplogs.txt",
363+
status=Status.COMPLETED,
364+
logs=[{"level": "INFO", "message": "previous success"}],
365+
)
366+
session.add(panel)
367+
session.commit()
368+
session.refresh(panel)
369+
370+
mock_job = MagicMock()
371+
mock_job.id = "job-force-keeplogs"
372+
mock_queue.enqueue.return_value = mock_job
373+
374+
response = client.post(
375+
"/panels/?force=true&keep_logs=true",
376+
json={"name": "completed-panel-force-keeplogs.txt"},
377+
headers=auth_headers,
378+
)
379+
assert response.status_code == 201
380+
assert len(response.json()["logs"]) == 1
381+
294382
def test_create_panel_unauthorized(self, client: TestClient):
295383
"""Test creating a panel without authentication."""
296384
response = client.post("/panels/", json={"name": "panel.txt"})

app/tests/test_routers_studies.py

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -291,6 +291,94 @@ def test_create_study_retry_failed_keep_logs(
291291
assert response.status_code == 201
292292
assert len(response.json()["logs"]) == 1
293293

294+
@patch("app.routers.studies.queue")
295+
def test_create_study_force_completed(
296+
self,
297+
mock_queue: MagicMock,
298+
client: TestClient,
299+
auth_headers: dict[str, str],
300+
session: Session,
301+
):
302+
"""Test force re-ingesting a completed study."""
303+
study = Study(name="completed-study-force", status=Status.COMPLETED)
304+
session.add(study)
305+
session.commit()
306+
307+
mock_job = MagicMock()
308+
mock_job.id = "job-force"
309+
mock_queue.enqueue.return_value = mock_job
310+
311+
response = client.post(
312+
"/studies/?force=true",
313+
json={"name": "completed-study-force"},
314+
headers=auth_headers,
315+
)
316+
assert response.status_code == 201
317+
data = response.json()
318+
assert data["name"] == "completed-study-force"
319+
assert data["job_id"] == "job-force"
320+
assert mock_queue.enqueue.called
321+
322+
@patch("app.routers.studies.queue")
323+
def test_create_study_force_completed_purges_logs_by_default(
324+
self,
325+
mock_queue: MagicMock,
326+
client: TestClient,
327+
auth_headers: dict[str, str],
328+
session: Session,
329+
):
330+
"""Test that force re-ingesting a completed study purges logs by default."""
331+
study = Study(
332+
name="completed-study-force-logs",
333+
status=Status.COMPLETED,
334+
logs=[{"level": "INFO", "message": "previous success"}],
335+
)
336+
session.add(study)
337+
session.commit()
338+
session.refresh(study)
339+
340+
mock_job = MagicMock()
341+
mock_job.id = "job-force-logs"
342+
mock_queue.enqueue.return_value = mock_job
343+
344+
response = client.post(
345+
"/studies/?force=true",
346+
json={"name": "completed-study-force-logs"},
347+
headers=auth_headers,
348+
)
349+
assert response.status_code == 201
350+
assert response.json()["logs"] == []
351+
352+
@patch("app.routers.studies.queue")
353+
def test_create_study_force_completed_keep_logs(
354+
self,
355+
mock_queue: MagicMock,
356+
client: TestClient,
357+
auth_headers: dict[str, str],
358+
session: Session,
359+
):
360+
"""Test that force re-ingesting a completed study preserves logs when keep_logs=true."""
361+
study = Study(
362+
name="completed-study-force-keeplogs",
363+
status=Status.COMPLETED,
364+
logs=[{"level": "INFO", "message": "previous success"}],
365+
)
366+
session.add(study)
367+
session.commit()
368+
session.refresh(study)
369+
370+
mock_job = MagicMock()
371+
mock_job.id = "job-force-keeplogs"
372+
mock_queue.enqueue.return_value = mock_job
373+
374+
response = client.post(
375+
"/studies/?force=true&keep_logs=true",
376+
json={"name": "completed-study-force-keeplogs"},
377+
headers=auth_headers,
378+
)
379+
assert response.status_code == 201
380+
assert len(response.json()["logs"]) == 1
381+
294382
def test_create_study_unauthorized(self, client: TestClient):
295383
"""Test creating a study without authentication."""
296384
response = client.post("/studies/", json={"name": "study"})

0 commit comments

Comments
 (0)