silverbullet/packages/plugs/query/engine.test.ts

157 lines
4.1 KiB
TypeScript
Raw Normal View History

2022-10-06 16:54:15 +08:00
import { assertEquals } from "../../../test_dep.ts";
import { applyQuery } from "./engine.ts";
import { parseQuery } from "./parser.ts";
2022-04-12 02:34:09 +08:00
2022-10-06 16:54:15 +08:00
Deno.test("Test parser", () => {
2022-04-12 02:34:09 +08:00
let parsedBasicQuery = parseQuery(`page`);
2022-10-06 16:54:15 +08:00
assertEquals(parsedBasicQuery.table, "page");
2022-04-12 02:34:09 +08:00
let parsedQuery1 = parseQuery(
2022-10-06 16:54:15 +08:00
`task where completed = false and dueDate <= "{{today}}" order by dueDate desc limit 5`,
2022-04-12 02:34:09 +08:00
);
2022-10-06 16:54:15 +08:00
assertEquals(parsedQuery1.table, "task");
assertEquals(parsedQuery1.orderBy, "dueDate");
assertEquals(parsedQuery1.orderDesc, true);
assertEquals(parsedQuery1.limit, 5);
assertEquals(parsedQuery1.filter.length, 2);
assertEquals(parsedQuery1.filter[0], {
2022-04-12 02:34:09 +08:00
op: "=",
prop: "completed",
value: false,
});
2022-10-06 16:54:15 +08:00
assertEquals(parsedQuery1.filter[1], {
2022-04-12 02:34:09 +08:00
op: "<=",
prop: "dueDate",
value: "{{today}}",
});
let parsedQuery2 = parseQuery(`page where name =~ /interview\\/.*/"`);
2022-10-06 16:54:15 +08:00
assertEquals(parsedQuery2.table, "page");
assertEquals(parsedQuery2.filter.length, 1);
assertEquals(parsedQuery2.filter[0], {
op: "=~",
2022-04-12 02:34:09 +08:00
prop: "name",
value: "interview\\/.*",
2022-04-12 02:34:09 +08:00
});
let parsedQuery3 = parseQuery(`page where something != null`);
2022-10-06 16:54:15 +08:00
assertEquals(parsedQuery3.table, "page");
assertEquals(parsedQuery3.filter.length, 1);
assertEquals(parsedQuery3.filter[0], {
op: "!=",
prop: "something",
value: null,
});
2022-10-06 16:54:15 +08:00
assertEquals(parseQuery(`page select name`).select, ["name"]);
assertEquals(parseQuery(`page select name, age`).select, [
"name",
"age",
]);
2022-10-06 16:54:15 +08:00
assertEquals(
parseQuery(`gh-events where type in ["PushEvent", "somethingElse"]`),
{
table: "gh-events",
filter: [
{
op: "in",
prop: "type",
value: ["PushEvent", "somethingElse"],
},
],
},
);
2022-10-06 16:54:15 +08:00
assertEquals(parseQuery(`something render [[template/table]]`), {
2022-08-09 21:37:47 +08:00
table: "something",
filter: [],
render: "template/table",
});
2022-10-06 16:54:15 +08:00
assertEquals(parseQuery(`something render "template/table"`), {
table: "something",
filter: [],
render: "template/table",
});
2022-04-12 02:34:09 +08:00
});
2022-10-06 16:54:15 +08:00
Deno.test("Test applyQuery", () => {
2022-04-12 02:34:09 +08:00
let data: any[] = [
{ name: "interview/My Interview", lastModified: 1 },
{ name: "interview/My Interview 2", lastModified: 2 },
{ name: "Pete", age: 38 },
{ name: "Angie", age: 28 },
];
2022-10-06 16:54:15 +08:00
assertEquals(
applyQuery(parseQuery(`page where name =~ /interview\\/.*/`), data),
[
{ name: "interview/My Interview", lastModified: 1 },
{ name: "interview/My Interview 2", lastModified: 2 },
],
);
assertEquals(
applyQuery(
parseQuery(`page where name =~ /interview\\/.*/ order by lastModified`),
2022-10-06 16:54:15 +08:00
data,
),
[
{ name: "interview/My Interview", lastModified: 1 },
{ name: "interview/My Interview 2", lastModified: 2 },
],
);
assertEquals(
2022-04-12 02:34:09 +08:00
applyQuery(
parseQuery(
2022-10-06 16:54:15 +08:00
`page where name =~ /interview\\/.*/ order by lastModified desc`,
),
2022-10-06 16:54:15 +08:00
data,
),
[
{ name: "interview/My Interview 2", lastModified: 2 },
{ name: "interview/My Interview", lastModified: 1 },
],
);
assertEquals(applyQuery(parseQuery(`page where age > 30`), data), [
2022-04-12 02:34:09 +08:00
{ name: "Pete", age: 38 },
]);
2022-10-06 16:54:15 +08:00
assertEquals(
applyQuery(parseQuery(`page where age > 28 and age < 38`), data),
[],
);
assertEquals(
applyQuery(parseQuery(`page where age > 30 select name`), data),
[{ name: "Pete" }],
);
2022-10-06 16:54:15 +08:00
assertEquals(
applyQuery(parseQuery(`page where name in ["Pete"] select name`), data),
[{ name: "Pete" }],
);
2022-04-12 02:34:09 +08:00
});
2022-07-04 17:31:39 +08:00
2022-10-06 16:54:15 +08:00
Deno.test("Test applyQuery with multi value", () => {
2022-07-04 17:31:39 +08:00
let data: any[] = [
{ name: "Pete", children: ["John", "Angie"] },
{ name: "Angie", children: ["Angie"] },
{ name: "Steve" },
];
2022-10-06 16:54:15 +08:00
assertEquals(
applyQuery(parseQuery(`page where children = "Angie"`), data),
[
{ name: "Pete", children: ["John", "Angie"] },
{ name: "Angie", children: ["Angie"] },
],
);
2022-07-04 17:31:39 +08:00
2022-10-06 16:54:15 +08:00
assertEquals(
applyQuery(parseQuery(`page where children = ["Angie", "John"]`), data),
[
{ name: "Pete", children: ["John", "Angie"] },
{ name: "Angie", children: ["Angie"] },
],
);
2022-07-04 17:31:39 +08:00
});