feat(phase-30): add coverage snapshots, temporal comparison and auto re-testing (T-230 to T-232)
This commit is contained in:
@@ -52,6 +52,8 @@ from app.services.test_workflow_service import (
|
||||
validate_as_red_lead as wf_validate_red,
|
||||
validate_as_blue_lead as wf_validate_blue,
|
||||
reopen_test as wf_reopen,
|
||||
handle_remediation_completed as wf_handle_remediation,
|
||||
get_retest_chain as wf_get_retest_chain,
|
||||
)
|
||||
|
||||
router = APIRouter(prefix="/tests", tags=["tests"])
|
||||
@@ -546,9 +548,15 @@ def update_remediation(
|
||||
db: Session = Depends(get_db),
|
||||
current_user: User = Depends(get_current_user),
|
||||
):
|
||||
"""Update remediation fields on a test (any authenticated user)."""
|
||||
"""Update remediation fields on a test (any authenticated user).
|
||||
|
||||
When ``remediation_status`` transitions to ``'completed'``, an automatic
|
||||
re-test is created (subject to ``MAX_RETEST_COUNT``).
|
||||
"""
|
||||
test = _get_test_or_404(db, test_id)
|
||||
|
||||
old_remediation_status = test.remediation_status
|
||||
|
||||
update_data = payload.model_dump(exclude_unset=True)
|
||||
for field, value in update_data.items():
|
||||
setattr(test, field, value)
|
||||
@@ -565,6 +573,13 @@ def update_remediation(
|
||||
details={"updated_fields": list(update_data.keys())},
|
||||
)
|
||||
|
||||
# Auto-create retest when remediation is marked completed
|
||||
new_status = update_data.get("remediation_status")
|
||||
if new_status == "completed" and old_remediation_status != "completed":
|
||||
retest = wf_handle_remediation(db, test, current_user)
|
||||
if retest:
|
||||
db.refresh(test)
|
||||
|
||||
return test
|
||||
|
||||
|
||||
@@ -603,3 +618,35 @@ def get_test_timeline(
|
||||
}
|
||||
for log in logs
|
||||
]
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# GET /tests/{id}/retest-chain — full retest chain
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
|
||||
@router.get("/{test_id}/retest-chain")
|
||||
def get_retest_chain(
|
||||
test_id: uuid.UUID,
|
||||
db: Session = Depends(get_db),
|
||||
current_user: User = Depends(get_current_user),
|
||||
):
|
||||
"""Return the full chain of retests (original + all retests) for a test."""
|
||||
chain = wf_get_retest_chain(db, test_id)
|
||||
if not chain:
|
||||
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Test not found")
|
||||
|
||||
return [
|
||||
{
|
||||
"id": str(t.id),
|
||||
"name": t.name,
|
||||
"state": t.state.value if t.state else None,
|
||||
"retest_of": str(t.retest_of) if t.retest_of else None,
|
||||
"retest_count": t.retest_count,
|
||||
"result": t.result.value if t.result else None,
|
||||
"detection_result": t.detection_result.value if t.detection_result else None,
|
||||
"remediation_status": t.remediation_status,
|
||||
"created_at": t.created_at.isoformat() if t.created_at else None,
|
||||
}
|
||||
for t in chain
|
||||
]
|
||||
|
||||
Reference in New Issue
Block a user