feat: stacked result-set panels with DML/error notices in the query workspace (Task 9)

This commit is contained in:
2026-09-09 18:31:12 +08:00
parent c85d16d0db
commit 5e8107982b
7 changed files with 205 additions and 93 deletions
@@ -0,0 +1,38 @@
import { describe, it, expect, vi } from "vitest";
import { render, screen } from "@testing-library/react";
import { ResultSetPanels } from "./ResultSetPanels";
import type { MultiQueryResult } from "../../lib/types";
const multi: MultiQueryResult = {
result_sets: [
{ columns: [{ name: "a", data_type: "int", is_nullable: true, is_pk: false, is_fk: false, fk_ref: null, default_value: null, editable: true, is_generated: false }], rows: [[1], [2]], total_rows: 2, page: 1, page_size: 50 },
{ columns: [{ name: "b", data_type: "text", is_nullable: true, is_pk: false, is_fk: false, fk_ref: null, default_value: null, editable: true, is_generated: false }], rows: [], total_rows: 0, page: 1, page_size: 50 },
],
notices: [
{ statement_index: 1, kind: "dml", text: "UPDATE 3", affected: 3 },
{ statement_index: 3, kind: "error", text: "relation \"nope\" does not exist", affected: null },
],
execution_time_ms: 12,
};
describe("ResultSetPanels", () => {
it("renders one panel header per result set with row counts", () => {
render(<ResultSetPanels multi={multi} renderGrid={vi.fn()} />);
expect(screen.getByText(/Result 1/)).toBeTruthy();
expect(screen.getByText(/Result 2/)).toBeTruthy();
expect(screen.getByText(/2 rows/)).toBeTruthy();
});
it("renders notice cards for DML and errors", () => {
render(<ResultSetPanels multi={multi} renderGrid={vi.fn()} />);
expect(screen.getByText(/UPDATE 3/)).toBeTruthy();
expect(screen.getByText(/3 rows affected/)).toBeTruthy();
expect(screen.getByText(/relation "nope" does not exist/)).toBeTruthy();
});
it("delegates each set to the grid renderer with its index", () => {
const renderGrid = vi.fn(() => <div />);
render(<ResultSetPanels multi={multi} renderGrid={renderGrid} />);
expect(renderGrid).toHaveBeenCalledTimes(2);
});
});