fix: multiple test-workflow bugs — draft wipe, dark date pickers, Jira status strings, Tempo gate, hold timer
Aegis CI / lint-and-test (push) Has been cancelled
Snyk Security Scan / Python vulnerabilities (backend) (push) Has been cancelled
Snyk Security Scan / npm vulnerabilities (frontend) (push) Has been cancelled
Snyk Security Scan / Docker image vulnerabilities (backend) (push) Has been cancelled
Aegis CI / lint-and-test (push) Has been cancelled
Snyk Security Scan / Python vulnerabilities (backend) (push) Has been cancelled
Snyk Security Scan / npm vulnerabilities (frontend) (push) Has been cancelled
Snyk Security Scan / Docker image vulnerabilities (backend) (push) Has been cancelled
- Fix the red/blue draft form losing unsaved fields (e.g. execution_start_time) whenever an evidence upload refetches the test — the hydration effect now runs once per test, not on every refetch. - Add color-scheme: dark so native date/time picker popups match the app theme instead of rendering white. - Fix _STATE_TO_JIRA_STATUS: real Jira statuses are 'To Do' and 'Red Team test review', not 'To-Do' and 'RT Test Review' — confirmed live against the actual workflow transitions, which is why Submit to Blue Team never moved the ticket past 'In Progress'. - Tempo worklog sync was silently blocked by TEMPO_ENABLED defaulting to False with no admin-facing toggle, even after configuring a Tempo token via Settings. Now bypassed once an admin or personal token is actually configured, mirroring Jira's DB-backed enabled flag. - Hold now actually pauses the running phase timer (paused_at), and Resume accumulates the held duration into red/blue_paused_seconds — previously the timer kept counting through a hold.
This commit is contained in:
@@ -1354,6 +1354,10 @@ def hold_test(
|
||||
test.hold_reason = payload.reason
|
||||
test.held_at = _dt.utcnow()
|
||||
|
||||
# A running phase timer must stop counting while on hold.
|
||||
if test.state in (TestState.red_executing, TestState.blue_evaluating) and test.paused_at is None:
|
||||
test.paused_at = test.held_at
|
||||
|
||||
log_action(db, current_user.id, "hold_test", str(test_id), {"reason": payload.reason})
|
||||
db.commit()
|
||||
db.refresh(test)
|
||||
@@ -1375,6 +1379,7 @@ def resume_test(
|
||||
current_user: User = Depends(require_any_role_strict("red_tech", "blue_tech")),
|
||||
):
|
||||
"""Resume a test that was placed on hold."""
|
||||
from datetime import datetime as _dt
|
||||
from app.services.jira_service import push_hold_event
|
||||
|
||||
test = crud_get_test_or_raise(db, test_id)
|
||||
@@ -1386,6 +1391,16 @@ def resume_test(
|
||||
test.hold_reason = None
|
||||
test.held_at = None
|
||||
|
||||
# Resume the phase timer that hold_test paused, accumulating the held
|
||||
# duration the same way pause/resume-timer does.
|
||||
if test.paused_at is not None:
|
||||
held_seconds = max(int((_dt.utcnow() - test.paused_at).total_seconds()), 0)
|
||||
if test.state == TestState.red_executing:
|
||||
test.red_paused_seconds = (test.red_paused_seconds or 0) + held_seconds
|
||||
elif test.state == TestState.blue_evaluating:
|
||||
test.blue_paused_seconds = (test.blue_paused_seconds or 0) + held_seconds
|
||||
test.paused_at = None
|
||||
|
||||
log_action(db, current_user.id, "resume_test", str(test_id), {})
|
||||
db.commit()
|
||||
db.refresh(test)
|
||||
|
||||
Reference in New Issue
Block a user