prostgles-server 4.2.36 → 4.2.38
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/tests/client/hooks.spec.ts +151 -71
- package/tests/client/index.ts +5 -0
- package/tests/client/package-lock.json +5 -1064
- package/tests/client/package.json +2 -2
- package/tests/client/renderReactHook.ts +110 -0
- package/tests/clientOnlyQueries.spec.ts +27 -3
- package/tests/server/package-lock.json +1 -1
- package/tests/test.sh +1 -0
package/package.json
CHANGED
|
@@ -1,28 +1,13 @@
|
|
|
1
|
-
import { renderHook, waitFor } from "@testing-library/react";
|
|
2
1
|
import { strict as assert } from "assert";
|
|
3
2
|
import { describe, test } from "node:test";
|
|
4
3
|
import type { DBHandlerClient } from "./index";
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
const { window } = new JSDOM(`<!DOCTYPE html>`);
|
|
8
|
-
global.window = window;
|
|
9
|
-
global.document = window.document;
|
|
10
|
-
|
|
11
|
-
const expectValues = (result: { current: any; }, expectedValues: any[]) => {
|
|
12
|
-
let step = 0;
|
|
13
|
-
return waitFor(() => {
|
|
14
|
-
assert.deepStrictEqual(expectedValues[step], result.current);
|
|
15
|
-
const finished = step === expectedValues.length - 1;
|
|
16
|
-
step++;
|
|
17
|
-
if(!finished) throw new Error("Not finished");
|
|
18
|
-
});
|
|
19
|
-
}
|
|
4
|
+
import { renderReactHook } from "./renderReactHook";
|
|
5
|
+
import { pickKeys } from "prostgles-types";
|
|
20
6
|
|
|
21
7
|
export const clientHooks = async (db: DBHandlerClient) => {
|
|
22
|
-
|
|
23
|
-
await describe("
|
|
8
|
+
const resultLoading = { data: undefined, isLoading: true, error: undefined };
|
|
9
|
+
await describe("React hooks", async (t) => {
|
|
24
10
|
const defaultFilter = { name: "abc" };
|
|
25
|
-
|
|
26
11
|
await Promise.all([
|
|
27
12
|
"useFind",
|
|
28
13
|
"useSubscribe",
|
|
@@ -35,40 +20,34 @@ export const clientHooks = async (db: DBHandlerClient) => {
|
|
|
35
20
|
select: { added: "$Mon" },
|
|
36
21
|
limit: expectsOne? undefined : 1
|
|
37
22
|
};
|
|
38
|
-
const { result, rerender } = renderHook((filter = defaultFilter) => db.items4[hookName]!(filter, options));
|
|
39
23
|
const expectedData = expectsOne? { added: "Dec" } : [{ added: "Dec" }];
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
await waitFor(() => {
|
|
45
|
-
assert.deepStrictEqual(
|
|
46
|
-
result.current,
|
|
47
|
-
{
|
|
48
|
-
data: expectedData, error: undefined, isLoading: false
|
|
49
|
-
}
|
|
50
|
-
);
|
|
24
|
+
const { rerender, results } = await renderReactHook({
|
|
25
|
+
hook: db.items4[hookName]!,
|
|
26
|
+
props: [{ name: "abc" }, options],
|
|
27
|
+
expectedRerenders: 2
|
|
51
28
|
});
|
|
52
29
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
data: undefined,
|
|
64
|
-
error: {
|
|
65
|
-
message: 'Table: items4 -> disallowed/inexistent columns in filter: named \n' +
|
|
66
|
-
' Expecting one of: added, "id", "public", "name"',
|
|
67
|
-
},
|
|
68
|
-
isLoading: false
|
|
69
|
-
}
|
|
70
|
-
);
|
|
30
|
+
assert.deepStrictEqual(
|
|
31
|
+
results, [
|
|
32
|
+
resultLoading,
|
|
33
|
+
{ data: expectedData, isLoading:false, error: undefined}
|
|
34
|
+
]
|
|
35
|
+
);
|
|
36
|
+
|
|
37
|
+
const { results: errorResults } = await rerender({
|
|
38
|
+
props: [{ named: "error" }, options],
|
|
39
|
+
expectedRerenders: 2,
|
|
71
40
|
});
|
|
41
|
+
|
|
42
|
+
assert.deepStrictEqual(
|
|
43
|
+
errorResults, [
|
|
44
|
+
resultLoading,
|
|
45
|
+
{ data: undefined, isLoading: false, error: {
|
|
46
|
+
message: 'Table: items4 -> disallowed/inexistent columns in filter: named \n' +
|
|
47
|
+
' Expecting one of: added, "id", "public", "name"',
|
|
48
|
+
} }
|
|
49
|
+
]
|
|
50
|
+
);
|
|
72
51
|
});
|
|
73
52
|
}));
|
|
74
53
|
|
|
@@ -76,44 +55,145 @@ export const clientHooks = async (db: DBHandlerClient) => {
|
|
|
76
55
|
{
|
|
77
56
|
hookName: "useCount",
|
|
78
57
|
result1: { data: 2, error: undefined, isLoading: false },
|
|
79
|
-
result2:
|
|
80
|
-
{ data: 2, error: undefined, isLoading: false },
|
|
81
|
-
{ data: 0, error: undefined, isLoading: false },
|
|
82
|
-
]
|
|
58
|
+
result2: { data: 0, error: undefined, isLoading: false },
|
|
83
59
|
},
|
|
84
60
|
{
|
|
85
61
|
hookName: "useSize",
|
|
86
62
|
result1: { data: "93", error: undefined, isLoading: false },
|
|
87
|
-
result2:
|
|
88
|
-
{ data: "93", error: undefined, isLoading: false },
|
|
89
|
-
{ data: "0", error: undefined, isLoading: false },
|
|
90
|
-
]
|
|
63
|
+
result2: { data: "0", error: undefined, isLoading: false }
|
|
91
64
|
},
|
|
92
65
|
].map(async ({ hookName, result1, result2 }) => {
|
|
93
66
|
await test(hookName, async (t) => {
|
|
94
|
-
const {
|
|
67
|
+
const { results, rerender } = await renderReactHook({
|
|
68
|
+
hook: db.items4[hookName]!,
|
|
69
|
+
props: [defaultFilter],
|
|
70
|
+
expectedRerenders: 2
|
|
71
|
+
});
|
|
72
|
+
|
|
95
73
|
// Initial state
|
|
96
|
-
assert.deepStrictEqual(
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
await waitFor(() => {
|
|
100
|
-
assert.deepStrictEqual(
|
|
101
|
-
result.current,
|
|
74
|
+
assert.deepStrictEqual(
|
|
75
|
+
results, [
|
|
76
|
+
resultLoading,
|
|
102
77
|
result1
|
|
103
|
-
|
|
104
|
-
|
|
78
|
+
]
|
|
79
|
+
);
|
|
105
80
|
|
|
106
81
|
// Rerender with different filter
|
|
107
|
-
|
|
82
|
+
const { results: noResults } = await rerender({
|
|
83
|
+
props: [{ id: -1 }],
|
|
84
|
+
expectedRerenders: 2,
|
|
85
|
+
});
|
|
108
86
|
|
|
109
|
-
// New
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
result2
|
|
87
|
+
// New results
|
|
88
|
+
assert.deepStrictEqual(
|
|
89
|
+
noResults,
|
|
90
|
+
[resultLoading, result2]
|
|
113
91
|
);
|
|
114
92
|
});
|
|
115
93
|
|
|
116
94
|
}));
|
|
117
95
|
|
|
96
|
+
await test("useCount planes", async (t) => {
|
|
97
|
+
const { results } = await renderReactHook({
|
|
98
|
+
hook: db.planes.useCount!,
|
|
99
|
+
props: [{}],
|
|
100
|
+
expectedRerenders: 2
|
|
101
|
+
});
|
|
102
|
+
assert.deepStrictEqual(
|
|
103
|
+
results,
|
|
104
|
+
[
|
|
105
|
+
{ data: undefined, isLoading: true, error: undefined },
|
|
106
|
+
{ data: 100, error: undefined, isLoading: false }
|
|
107
|
+
]
|
|
108
|
+
);
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
// // TODO fix useSync test
|
|
112
|
+
await test("useSync", async (t) => {
|
|
113
|
+
const funcHandles = {
|
|
114
|
+
'$cloneMultiSync': 1,
|
|
115
|
+
'$cloneSync': 1,
|
|
116
|
+
'$delete': 1,
|
|
117
|
+
'$find': 1,
|
|
118
|
+
'$get': 1,
|
|
119
|
+
'$unsync': 1,
|
|
120
|
+
'$update': 1,
|
|
121
|
+
};
|
|
122
|
+
const plane0 = {
|
|
123
|
+
flight_number: '{"from":0,"to":0,"text":"","md5":"fb91aad2efe3387d09399beb97262d8d"}',
|
|
124
|
+
id: 0,
|
|
125
|
+
last_updated: '1711882317229',
|
|
126
|
+
x: 20,
|
|
127
|
+
y: 0
|
|
128
|
+
}
|
|
129
|
+
// await db.planes.insert({ name: "abc" });
|
|
130
|
+
|
|
131
|
+
// const { results: firstPlaneResults } = await renderReactHook({
|
|
132
|
+
// hook: db.planes.useFindOne!,
|
|
133
|
+
// props: [{ }],
|
|
134
|
+
// expectedRerenders: 2
|
|
135
|
+
// });
|
|
136
|
+
// assert.deepStrictEqual(firstPlaneResults, [
|
|
137
|
+
// { data: undefined, isLoading: true, error: undefined },
|
|
138
|
+
// { data: undefined, error: undefined, isLoading: false },
|
|
139
|
+
// ]);
|
|
140
|
+
|
|
141
|
+
const props = [{ id: 0 }, { handlesOnData: true }]; // , select: { id: 1, x: 1 }
|
|
142
|
+
const { results, rerender } = await renderReactHook({
|
|
143
|
+
hook: db.planes.useSync!,
|
|
144
|
+
props,
|
|
145
|
+
expectedRerenders: 3
|
|
146
|
+
});
|
|
147
|
+
assert.equal(results.length, 3);
|
|
148
|
+
assert.deepStrictEqual(results.slice(0, 2), [
|
|
149
|
+
{ data: undefined, isLoading: true, error: undefined },
|
|
150
|
+
{ data: [], error: undefined, isLoading: false },
|
|
151
|
+
]);
|
|
152
|
+
const lastData = results.at(-1)?.data;
|
|
153
|
+
assert.equal(lastData.length, 1);
|
|
154
|
+
const lastDataItem = lastData[0];
|
|
155
|
+
const staticPropNames = ["id", "x", "y"];
|
|
156
|
+
assert.deepStrictEqual(
|
|
157
|
+
pickKeys(lastDataItem, staticPropNames),
|
|
158
|
+
pickKeys(plane0, staticPropNames as any)
|
|
159
|
+
);
|
|
160
|
+
|
|
161
|
+
// Update item
|
|
162
|
+
db.planes.update({ id: 0 }, { x: 230 });
|
|
163
|
+
const { results: deletedResults } = await rerender({
|
|
164
|
+
props,
|
|
165
|
+
expectedRerenders: 3,
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
assert.deepStrictEqual(
|
|
169
|
+
deletedResults.map(({ data }) => data?.[0]?.x),
|
|
170
|
+
[
|
|
171
|
+
undefined, // TODO - should be defined and 20
|
|
172
|
+
20,
|
|
173
|
+
230,
|
|
174
|
+
],
|
|
175
|
+
);
|
|
176
|
+
|
|
177
|
+
// // Rerender with different filter
|
|
178
|
+
// rerender({ id: -1 });
|
|
179
|
+
|
|
180
|
+
// await expectValues(
|
|
181
|
+
// result,
|
|
182
|
+
// [
|
|
183
|
+
// { data: undefined, error: undefined, isLoading: true },
|
|
184
|
+
// { data: [], error: undefined, isLoading: false },
|
|
185
|
+
// ]
|
|
186
|
+
// );
|
|
187
|
+
|
|
188
|
+
// await expectValues(
|
|
189
|
+
// result,
|
|
190
|
+
// [
|
|
191
|
+
// { data: undefined, error: undefined, isLoading: true },
|
|
192
|
+
// { data: [], error: undefined, isLoading: false }
|
|
193
|
+
// ]
|
|
194
|
+
// );
|
|
195
|
+
|
|
196
|
+
});
|
|
197
|
+
|
|
118
198
|
});
|
|
119
199
|
}
|
package/tests/client/index.ts
CHANGED
|
@@ -30,6 +30,11 @@ const tests: Record<string, ClientTestSpec> = {
|
|
|
30
30
|
await clientHooks(db);
|
|
31
31
|
},
|
|
32
32
|
},
|
|
33
|
+
// hooks: {
|
|
34
|
+
// onRun: async (db) => {
|
|
35
|
+
// await clientHooks(db);
|
|
36
|
+
// },
|
|
37
|
+
// },
|
|
33
38
|
files: {
|
|
34
39
|
onRun: async (db, methods, tableSchema, auth) => {
|
|
35
40
|
await clientFileTests(db, auth, log, methods, tableSchema)
|