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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "prostgles-server",
3
- "version": "4.2.36",
3
+ "version": "4.2.38",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -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
- const jsdom = require("jsdom");
6
- const { JSDOM } = jsdom;
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("Client hooks", async (t) => {
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
- // Initial state
41
- assert.deepStrictEqual(result.current, { data: undefined, isLoading: true, error: undefined });
42
-
43
- // First fetch
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
- // Rerender with different filter
54
- rerender({ named: "error" });
55
-
56
- // TODO fix first re-render result (useFetch setResult in async block might be affecting this)
57
- // assert.deepStrictEqual(result.current, { data: undefined, isLoading: true, error: undefined });
58
-
59
- await waitFor(() => {
60
- assert.deepStrictEqual(
61
- result.current,
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 { result, rerender } = renderHook((filter = defaultFilter) => db.items4[hookName](filter));
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(result.current, { data: undefined, isLoading: true, error: undefined });
97
-
98
- // First fetch
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
- rerender({ id: -1 });
82
+ const { results: noResults } = await rerender({
83
+ props: [{ id: -1 }],
84
+ expectedRerenders: 2,
85
+ });
108
86
 
109
- // New count
110
- await expectValues(
111
- result,
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
  }
@@ -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)