50 lines
1.9 KiB
TypeScript
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" });
|
|
});
|