fix(smoke): report sanitized operation failure diagnostics
CI / Rust Checks (push) Successful in 14m15s
CI / UI Checks (push) Successful in 5s
CI / Community Image Smoke (push) Successful in 1m15s
CI / Frontend E2E (push) Successful in 4m54s
CI / Deploy (push) Successful in 1m18s

This commit is contained in:
2026-09-05 14:00:39 +03:00
parent bbb9394911
commit 083974c27f
2 changed files with 247 additions and 5 deletions
+200 -3
View File
@@ -207,8 +207,9 @@ class AuthenticatedProductSmokeTests(unittest.TestCase):
publish = next(request for request in client.requests if request[1].endswith("/operations/op_safe/publish"))
self.assertEqual(publish[3]["headers"], {"If-Match": '"safe-etag"'})
def test_admin_test_run_uses_created_version_and_rejects_failed_outcome(self) -> None:
def test_admin_test_run_uses_created_version_and_reports_safe_typed_failure(self) -> None:
smoke = load_smoke_module()
trace_id = "0123456789abcdef0123456789abcdef"
class FakeClient:
def __init__(self, ok):
@@ -217,7 +218,22 @@ class AuthenticatedProductSmokeTests(unittest.TestCase):
def request_json(self, method, path, payload=None, **kwargs):
self.payload = payload
return smoke.JsonResponse(200, {}, {"ok": self.ok, "errors": [{"message": "secret-canary"}]})
return smoke.JsonResponse(
200,
{},
{
"ok": self.ok,
"trace_id": trace_id,
"errors": [
{
"code": "outbound_target_rejected",
"stage": "adapter",
"message": "secret-canary",
"context": {"url": "https://private.invalid/token-canary"},
}
],
},
)
passing = FakeClient(True)
smoke.run_operation_test(passing, "ws", "op", 9)
@@ -225,7 +241,188 @@ class AuthenticatedProductSmokeTests(unittest.TestCase):
with self.assertRaises(smoke.SmokeError) as raised:
smoke.run_operation_test(FakeClient(False), "ws", "op", 9)
self.assertNotIn("secret-canary", str(raised.exception))
self.assertEqual(
str(raised.exception),
"stage=adapter code=outbound_target_rejected trace_id=0123456789abcdef0123456789abcdef",
)
for forbidden in ("secret-canary", "private.invalid", "token-canary", "context"):
self.assertNotIn(forbidden, str(raised.exception))
def test_admin_test_run_fails_closed_for_malformed_diagnostics(self) -> None:
smoke = load_smoke_module()
valid_trace_id = "0123456789abcdef0123456789abcdef"
valid_failure = {"code": "upstream_timeout", "stage": "upstream"}
malformed_results = (
None,
[],
"secret-canary",
{"trace_id": valid_trace_id, "errors": [valid_failure]},
{"ok": None, "trace_id": valid_trace_id, "errors": [valid_failure]},
{"ok": 0, "trace_id": valid_trace_id, "errors": [valid_failure]},
{"ok": "false", "trace_id": valid_trace_id, "errors": [valid_failure]},
{"ok": False, "errors": []},
{"ok": False, "errors": {}},
{"ok": False, "trace_id": valid_trace_id, "errors": [None]},
{"ok": False, "errors": ["secret-canary"]},
{"ok": False, "errors": [valid_failure]},
{
"ok": False,
"trace_id": valid_trace_id[:-1],
"errors": [valid_failure],
},
{
"ok": False,
"trace_id": valid_trace_id + "0",
"errors": [valid_failure],
},
{
"ok": False,
"trace_id": "0" * 32,
"errors": [valid_failure],
},
{
"ok": False,
"trace_id": valid_trace_id.upper(),
"errors": [valid_failure],
},
{
"ok": False,
"trace_id": "a" * 31 + "١",
"errors": [valid_failure],
},
{
"ok": False,
"trace_id": "a" * 31 + "\n",
"errors": [valid_failure],
},
{
"ok": False,
"trace_id": 42,
"errors": [valid_failure],
},
{
"ok": False,
"trace_id": valid_trace_id,
"errors": [{"code": "", "stage": "upstream"}],
},
{
"ok": False,
"trace_id": valid_trace_id,
"errors": [{"code": "a" * 65, "stage": "upstream"}],
},
{
"ok": False,
"trace_id": valid_trace_id,
"errors": [{"code": "Upstream_timeout", "stage": "upstream"}],
},
{
"ok": False,
"trace_id": valid_trace_id,
"errors": [{"code": "upstream_таймаут", "stage": "upstream"}],
},
{
"ok": False,
"trace_id": valid_trace_id,
"errors": [{"code": 42, "stage": "upstream"}],
},
{
"ok": False,
"trace_id": valid_trace_id,
"errors": [{"code": "upstream_timeout", "stage": ""}],
},
{
"ok": False,
"trace_id": valid_trace_id,
"errors": [{"code": "upstream_timeout", "stage": "a" * 65}],
},
{
"ok": False,
"trace_id": valid_trace_id,
"errors": [{"code": "upstream_timeout", "stage": "Upstream"}],
},
{
"ok": False,
"trace_id": valid_trace_id,
"errors": [{"code": "upstream_timeout", "stage": "вверх"}],
},
{
"ok": False,
"trace_id": valid_trace_id,
"errors": [{"code": "upstream_timeout", "stage": 42}],
},
{
"ok": False,
"trace_id": valid_trace_id,
"errors": [{"code": "unsafe-value://secret-canary", "stage": "upstream"}],
},
{
"ok": False,
"trace_id": valid_trace_id,
"errors": [{"code": "upstream_timeout", "stage": "unsafe stage secret-canary"}],
},
{
"ok": False,
"trace_id": "not-a-trace-id-secret-canary",
"errors": [{"code": "upstream_timeout", "stage": "upstream"}],
},
)
class FakeClient:
def __init__(self, result):
self.result = result
def request_json(self, *args, **kwargs):
return smoke.JsonResponse(200, {}, self.result)
for result in malformed_results:
with self.subTest(result=result), self.assertRaises(smoke.SmokeError) as raised:
smoke.run_operation_test(FakeClient(result), "ws", "op", 9)
self.assertEqual(str(raised.exception), "stage=operation_test code=outcome_not_ok")
self.assertNotIn("secret-canary", str(raised.exception))
def test_admin_test_run_accepts_maximum_length_safe_diagnostics(self) -> None:
smoke = load_smoke_module()
identifier = "a" * 64
trace_id = "0123456789abcdef0123456789abcdef"
class FakeClient:
def request_json(self, *args, **kwargs):
return smoke.JsonResponse(
200,
{},
{
"ok": False,
"trace_id": trace_id,
"request_preview": {"credential": "secret-canary"},
"response_preview": {"token": "secret-canary"},
"errors": [{"code": identifier, "stage": identifier}],
},
)
with self.assertRaises(smoke.SmokeError) as raised:
smoke.run_operation_test(FakeClient(), "ws", "op", 9)
rendered = str(raised.exception)
self.assertEqual(rendered, f"stage={identifier} code={identifier} trace_id={trace_id}")
self.assertLessEqual(len(rendered.encode("ascii")), 256)
self.assertNotIn("secret-canary", rendered)
def test_admin_test_run_success_ignores_malformed_diagnostics(self) -> None:
smoke = load_smoke_module()
class FakeClient:
def request_json(self, *args, **kwargs):
return smoke.JsonResponse(
200,
{},
{
"ok": True,
"trace_id": "secret-canary",
"errors": "secret-canary",
"request_preview": {"token": "secret-canary"},
},
)
smoke.run_operation_test(FakeClient(), "ws", "op", 9)
def test_edit_and_archive_use_fresh_operation_preconditions(self) -> None:
smoke = load_smoke_module()