-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbasic.test.ts
More file actions
75 lines (60 loc) · 2.66 KB
/
Copy pathbasic.test.ts
File metadata and controls
75 lines (60 loc) · 2.66 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
import { beforeAll, describe, test, expect } from "bun:test";
import { query } from "../../test/db.ts";
import { parseRoutines } from "../routine.ts";
import { catalogMetadataQuery, parseCatalogRows, type CatalogRow } from "../catalog.ts";
import { expectAttributesMatch } from "./attribute-helper.ts";
const SQL = `
CREATE FUNCTION test_schema.greet(_name text) RETURNS text
LANGUAGE sql AS $$ SELECT 'hello ' || _name; $$;
CREATE PROCEDURE test_schema.cleanup()
LANGUAGE sql AS $$ SELECT 1; $$;
`;
beforeAll(async () => {
await query(SQL);
});
describe("basic function and procedure", () => {
test("names and types match catalog", async () => {
const parsed = parseRoutines(SQL);
const rows = await query<CatalogRow>(catalogMetadataQuery(["test_schema"]));
const catalog = parseCatalogRows(rows);
for (const r of parsed) {
const match = catalog.find((c) => c.name === r.name && c.schema === r.schema);
expect(match).toBeDefined();
expect(match!.type).toBe(r.type);
}
});
test("greet has 1 parameter named _name", async () => {
const [parsed] = parseRoutines(SQL);
const rows = await query<CatalogRow>(catalogMetadataQuery(["test_schema"]));
const catalog = parseCatalogRows(rows);
const match = catalog.find((c) => c.name === "greet")!;
expect(match.parameters).toHaveLength(parsed.parameters.length);
expect(match.parameters[0].name).toBe(parsed.parameters[0].name);
});
test("cleanup has 0 parameters", async () => {
const rows = await query<CatalogRow>(catalogMetadataQuery(["test_schema"]));
const catalog = parseCatalogRows(rows);
const match = catalog.find((c) => c.name === "cleanup")!;
expect(match.parameters).toHaveLength(0);
});
test("greet returns text", async () => {
const rows = await query<CatalogRow>(catalogMetadataQuery(["test_schema"]));
const catalog = parseCatalogRows(rows);
const match = catalog.find((c) => c.name === "greet")!;
expect(match.returns).toEqual({ setof: false, type: "text" });
});
test("procedure has null returns", async () => {
const rows = await query<CatalogRow>(catalogMetadataQuery(["test_schema"]));
const catalog = parseCatalogRows(rows);
const match = catalog.find((c) => c.name === "cleanup")!;
expect(match.returns).toBeNull();
});
test("function has default attributes", async () => {
const parsed = parseRoutines(SQL);
const greet = parsed.find((r) => r.name === "greet")!;
const rows = await query<CatalogRow>(catalogMetadataQuery(["test_schema"]));
const catalog = parseCatalogRows(rows);
const match = catalog.find((c) => c.name === "greet")!;
expectAttributesMatch(match, greet);
});
});