Skip to content

Commit b696f89

Browse files
committed
basic tests for __query.sql
1 parent a74a881 commit b696f89

File tree

1 file changed

+116
-0
lines changed

1 file changed

+116
-0
lines changed

test/query-test.js

+116
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
import assert from "assert";
2+
import {__query} from "../src/table.js";
3+
4+
function invalidator() {
5+
let invalidate;
6+
const invalidation = new Promise((resolve) => (invalidate = resolve));
7+
return [invalidation, invalidate];
8+
}
9+
10+
describe("__query.sql", () => {
11+
it("evaluates using db.sql with the expected parameters", async () => {
12+
const [invalidation] = invalidator();
13+
const data = [{x: 1}, {x: 2}];
14+
let args;
15+
const db = {
16+
async sql() {
17+
args = Array.from(arguments);
18+
return data;
19+
}
20+
};
21+
assert.strictEqual(await __query.sql(db, invalidation)`SELECT * FROM data WHERE ${1}`, data);
22+
assert.deepStrictEqual(args, [[`SELECT * FROM data WHERE `, ``], 1]);
23+
});
24+
25+
it("evaluates using db.query and db.queryTag with the expected parameters", async () => {
26+
const [invalidation] = invalidator();
27+
const data = [{x: 1}, {x: 2}];
28+
let queryTagArgs;
29+
let querySource;
30+
let queryParameters;
31+
const db = {
32+
queryTag(strings, ...args) {
33+
queryTagArgs = Array.from(arguments);
34+
return [strings.join("?"), args];
35+
},
36+
async query(source, parameters) {
37+
querySource = source;
38+
queryParameters = parameters;
39+
return data;
40+
}
41+
};
42+
assert.strictEqual(await __query.sql(db, invalidation)`SELECT * FROM data WHERE ${1}`, data);
43+
assert.deepStrictEqual(queryTagArgs, [[`SELECT * FROM data WHERE `, ""], 1]);
44+
assert.strictEqual(querySource, `SELECT * FROM data WHERE ?`);
45+
assert.deepStrictEqual(queryParameters, [1]);
46+
});
47+
48+
it("evaluates using db.queryStream and db.queryTag with the expected parameters", async () => {
49+
const [invalidation] = invalidator();
50+
const data1 = [{x: 1}, {x: 2}];
51+
const data2 = [{x: 3}, {x: 4}];
52+
const schema = [{name: "x", type: "number", nullable: false}];
53+
let queryTagArgs;
54+
let querySource;
55+
let queryParameters;
56+
const db = {
57+
queryTag(strings, ...args) {
58+
queryTagArgs = Array.from(arguments);
59+
return [strings.join("?"), args];
60+
},
61+
async queryStream(source, parameters) {
62+
querySource = source;
63+
queryParameters = parameters;
64+
await new Promise((resolve) => setTimeout(resolve, 100));
65+
return {
66+
schema,
67+
async *readRows() {
68+
await new Promise((resolve) => setTimeout(resolve, 100));
69+
yield data1;
70+
await new Promise((resolve) => setTimeout(resolve, 100));
71+
yield data2;
72+
}
73+
};
74+
}
75+
};
76+
let i = 0;
77+
let previousResult;
78+
for await (const result of await __query.sql(db, invalidation)`SELECT * FROM data WHERE ${1}`) {
79+
switch (++i) {
80+
case 1:
81+
previousResult = result;
82+
assert.deepStrictEqual(result, Object.assign([...data1], {done: false, error: null, schema}));
83+
break;
84+
case 2:
85+
assert.strictEqual(result, previousResult);
86+
assert.deepStrictEqual(result, Object.assign([...data1, ...data2], {done: true, error: null, schema}));
87+
break;
88+
default:
89+
assert.fail("unexpected batch");
90+
}
91+
}
92+
assert.strictEqual(i, 2);
93+
assert.deepStrictEqual(queryTagArgs, [[`SELECT * FROM data WHERE `, ""], 1]);
94+
assert.strictEqual(querySource, `SELECT * FROM data WHERE ?`);
95+
assert.deepStrictEqual(queryParameters, [1]);
96+
});
97+
98+
it("sends an abort signal to db.query when the invalidation promise resolves", async () => {
99+
const [invalidation, invalidate] = invalidator();
100+
const data = [{x: 1}, {x: 2}];
101+
let queryOptions;
102+
const db = {
103+
queryTag(strings, ...args) {
104+
return [strings.join("?"), args];
105+
},
106+
async query(source, parameters, options) {
107+
queryOptions = options;
108+
return data;
109+
}
110+
};
111+
assert.strictEqual(await __query.sql(db, invalidation)`SELECT * FROM data WHERE ${1}`, data);
112+
assert.strictEqual(queryOptions.signal.aborted, false);
113+
await invalidate();
114+
assert.strictEqual(queryOptions.signal.aborted, true);
115+
});
116+
});

0 commit comments

Comments
 (0)