dbx/packages/app-tests/queryResultSort.test.ts

50 lines
1.9 KiB
TypeScript

import assert from "node:assert/strict";
import test from "node:test";
import { buildSortedQuerySql } from "../../src/lib/queryResultSort.ts";
test("wraps a single select query with outer order by", () => {
const result = buildSortedQuerySql("SELECT id, name FROM users;", "postgres", ["id", "name"], 1, "name", "asc");
assert.deepEqual(result, {
ok: true,
sql: 'SELECT * FROM (SELECT id, name FROM users) t("id", "name") ORDER BY "name" ASC;',
});
});
test("preserves complex select body when wrapping sort sql", () => {
const result = buildSortedQuerySql("SELECT id FROM users WHERE status = 'A'", "mysql", ["id"], 0, "id", "desc");
assert.deepEqual(result, {
ok: true,
sql: "SELECT * FROM (SELECT id FROM users WHERE status = 'A') t(`id`) ORDER BY `id` DESC;",
});
});
test("assigns unique aliases for duplicate result column names", () => {
const result = buildSortedQuerySql(
"SELECT c.id, m.id FROM t_campaign c LEFT JOIN t_campaign_mdf m ON m.campaign_id = c.id",
"mysql",
["id", "id"],
1,
"id",
"asc",
);
assert.deepEqual(result, {
ok: true,
sql: "SELECT * FROM (SELECT c.id, m.id FROM t_campaign c LEFT JOIN t_campaign_mdf m ON m.campaign_id = c.id) t(`id`, `id_2`) ORDER BY `id_2` ASC;",
});
});
test("rejects multiple statements for result sorting", () => {
const result = buildSortedQuerySql("SELECT 1; SELECT 2;", "postgres", ["id"], 0, "id", "asc");
assert.deepEqual(result, { ok: false, reason: "multi" });
});
test("rejects cte queries for result sorting", () => {
const result = buildSortedQuerySql("WITH cte AS (SELECT 1) SELECT * FROM cte", "postgres", ["id"], 0, "id", "asc");
assert.deepEqual(result, { ok: false, reason: "with" });
});
test("rejects non select statements for result sorting", () => {
const result = buildSortedQuerySql("UPDATE users SET name = 'A'", "postgres", ["name"], 0, "name", "asc");
assert.deepEqual(result, { ok: false, reason: "not_select" });
});