Files
dbx/apps/desktop/src/lib/__tests__/sql/queryResultSource.spec.ts
T

68 lines
4.0 KiB
TypeScript
Vendored

import { describe, expect, it } from "vitest";
import { queryResultNameFromPreamble, queryResultSourceLabel } from "@/lib/sql/queryResultSource";
describe("queryResultNameFromPreamble", () => {
it("uses only the immediately preceding line comment", () => {
expect(queryResultNameFromPreamble("-- Name: Latest name\r\n")).toBe("Latest name");
expect(queryResultNameFromPreamble("-- unrelated\n")).toBe("unrelated");
expect(queryResultNameFromPreamble("-- indented\n ")).toBe("indented");
expect(queryResultNameFromPreamble("-- Name: Old name\n-- unrelated\n")).toBe("unrelated");
expect(queryResultNameFromPreamble("-- Name: explicit\n-- \n")).toBeUndefined();
});
it("stops at a blank line and ignores non-line comments", () => {
expect(queryResultNameFromPreamble("-- older comment\n\n")).toBeUndefined();
expect(queryResultNameFromPreamble("/* Name: block */\n")).toBeUndefined();
expect(queryResultNameFromPreamble("-- earlier comment\n/* block */\n")).toBeUndefined();
});
it("accepts hash comments for MySQL without treating them as portable SQL comments", () => {
expect(queryResultNameFromPreamble("# MySQL report\n", { databaseType: "mysql" })).toBe("MySQL report");
expect(queryResultNameFromPreamble("# temporary table\n", { databaseType: "sqlserver" })).toBeUndefined();
expect(queryResultNameFromPreamble("# portable comment\n")).toBeUndefined();
expect(queryResultNameFromPreamble("# MySQL report\n\n", { databaseType: "mysql" })).toBeUndefined();
});
});
describe("queryResultSourceLabel", () => {
it("uses the current database for an unqualified table", () => {
expect(queryResultSourceLabel("SELECT * FROM users", { database: "app", databaseType: "mysql" })).toBe("app.users");
});
it("prefers the final explicit qualifier", () => {
expect(queryResultSourceLabel("SELECT * FROM analytics.events", { database: "app", databaseType: "mysql" })).toBe("analytics.events");
expect(queryResultSourceLabel("SELECT * FROM [ServerOne].[AppDb].[dbo].[Users]", { database: "fallback", databaseType: "sqlserver" })).toBe("dbo.Users");
});
it("preserves quoted identifier names", () => {
expect(queryResultSourceLabel('SELECT * FROM "Sales"."Orders"', { database: "app", databaseType: "postgres" })).toBe("Sales.Orders");
expect(queryResultSourceLabel("SELECT * FROM HR.EMPLOYEES", { database: "fallback", databaseType: "oracle" })).toBe("HR.EMPLOYEES");
});
it("labels aggregate joins with the first outer physical table", () => {
const sql = `SELECT
g.group_name AS GROUP_NAME,
COUNT(*) AS USER_COUNT,
SUM(CASE WHEN u.status = 1 THEN 1 ELSE 0 END) AS ACTIVE_USER_COUNT
FROM groups g
JOIN group_users gu ON gu.group_id = g.id
JOIN users u ON u.id = gu.user_id
GROUP BY g.id, g.group_name`;
expect(queryResultSourceLabel(sql, { database: "aaa", databaseType: "mysql" })).toBe("aaa.groups");
});
it("prefers mutation targets over other table sources", () => {
expect(queryResultSourceLabel("UPDATE users SET active = true FROM audit_events ae WHERE ae.user_id = users.id RETURNING users.id", { database: "app", databaseType: "postgres" })).toBe("app.users");
expect(queryResultSourceLabel("INSERT INTO audit.events (id) VALUES (1) RETURNING id", { database: "app", databaseType: "postgres" })).toBe("audit.events");
expect(queryResultSourceLabel("DELETE FROM users WHERE id = 1 RETURNING id", { database: "app", databaseType: "postgres" })).toBe("app.users");
});
it("ignores non-physical outer sources", () => {
expect(queryResultSourceLabel("WITH recent AS (SELECT * FROM orders) SELECT * FROM recent", { database: "app", databaseType: "postgres" })).toBeUndefined();
expect(queryResultSourceLabel("SELECT * FROM (SELECT * FROM users) nested", { database: "app", databaseType: "mysql" })).toBeUndefined();
expect(queryResultSourceLabel("SELECT * FROM read_csv('users.csv') csv", { database: "main", databaseType: "duckdb" })).toBeUndefined();
expect(queryResultSourceLabel("SELECT 1", { database: "app", databaseType: "mysql" })).toBeUndefined();
});
});