fix(review-gates): green success badges, null-safe preview rows, optional section items
- Extract shared statusBadgeClass() helper (src/viewers/statusBadge.ts) so SqlViewer, CteResultViewer and PhaseSummaryViewer can't drift: ok/success/ passed/promoted render green (--success), warn renders amber (--warning), error/failed stay destructive red, everything else stays neutral outline. Previously CteResultViewer/PhaseSummaryViewer mapped "ok"/"promoted" to the default badge variant, which is bg-primary (GSD red) — success states rendered red. - enrich.js: buildCteResultV2 now falls back preview.rows to [] instead of null when last_test.preview_rows is missing (pre-upgrade ok records), and CteResultViewer reads result.preview?.rows?.length with a null-safe fallback so it degrades to the "No preview rows" empty state instead of crashing. - PhaseSummaryViewer: section.items is optional (model-authored sections can be prose-only); render (section.items ?? []) instead of crashing. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -132,6 +132,15 @@ test("buildCteResultV2 builds preview from last_test.columns/preview_rows", () =
|
||||
assert.deepEqual(out.warnings, []);
|
||||
});
|
||||
|
||||
test("buildCteResultV2: last_test.preview_rows null (pre-upgrade ok records) -> preview.rows is []", () => {
|
||||
const cteInfo = {
|
||||
name: "a", index: 1, total: 1, sql: "WITH a AS (SELECT 1)", doc: null,
|
||||
last_test: { status: "ok", execution_ms: 1, row_sample: 1, warnings: [], sql_hash: "h", columns: ["cod_paz"], preview_rows: null },
|
||||
};
|
||||
const out = buildCteResultV2({ schema_version: 2 }, cteInfo);
|
||||
assert.deepEqual(out.preview.rows, []);
|
||||
});
|
||||
|
||||
test("buildCteResultV2: columns[] carries name, with description left as an empty placeholder (filled separately by the gate)", () => {
|
||||
const cteInfo = {
|
||||
name: "a", index: 1, total: 1, sql: "WITH a AS (SELECT 1)", doc: null,
|
||||
|
||||
@@ -85,7 +85,7 @@ function buildCteResultV2(thinData, cteInfo) {
|
||||
warnings: lt.warnings || [],
|
||||
sql_hash: lt.sql_hash,
|
||||
columns: (lt.columns || []).map((name) => ({ name, description: "" })),
|
||||
preview: { columns: lt.columns || [], rows: lt.preview_rows || null },
|
||||
preview: { columns: lt.columns || [], rows: lt.preview_rows || [] },
|
||||
note: thin.note,
|
||||
};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user