n8n-nodes-pocketbase 2.0.0 → 2.3.0
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/README.md +19 -1
- package/dist/credentials/PocketbaseHttpApi.credentials.d.ts +1 -1
- package/dist/credentials/PocketbaseHttpApi.credentials.js +13 -9
- package/dist/credentials/PocketbaseHttpApi.credentials.js.map +1 -1
- package/dist/nodes/{PocketbaseHttp → Common}/GenericFunctions.d.ts +3 -2
- package/dist/nodes/Common/GenericFunctions.js +85 -0
- package/dist/nodes/Common/GenericFunctions.js.map +1 -0
- package/dist/nodes/{PocketbaseHttp → Common}/LoadOptions.d.ts +1 -1
- package/dist/nodes/{PocketbaseHttp → Common}/LoadOptions.js +47 -20
- package/dist/nodes/Common/LoadOptions.js.map +1 -0
- package/dist/nodes/Common/RequestBodyFunctions.js +131 -0
- package/dist/nodes/Common/RequestBodyFunctions.js.map +1 -0
- package/dist/nodes/PocketbaseHttp/PocketbaseHttp.node.js +4 -3
- package/dist/nodes/PocketbaseHttp/PocketbaseHttp.node.js.map +1 -1
- package/dist/nodes/PocketbaseHttp/PocketbaseHttp.node.json +2 -2
- package/dist/nodes/PocketbaseTrigger/PocketbaseTrigger.node.d.ts +13 -0
- package/dist/nodes/PocketbaseTrigger/PocketbaseTrigger.node.js +239 -0
- package/dist/nodes/PocketbaseTrigger/PocketbaseTrigger.node.js.map +1 -0
- package/dist/nodes/PocketbaseTrigger/PocketbaseTrigger.node.json +18 -0
- package/dist/nodes/PocketbaseTrigger/pocketbaseTrigger.dark.svg +10 -0
- package/dist/nodes/PocketbaseTrigger/pocketbaseTrigger.svg +10 -0
- package/dist/package.json +17 -7
- package/dist/tests/GenericFunctions.spec.js +177 -0
- package/dist/tests/GenericFunctions.spec.js.map +1 -0
- package/dist/tests/PocketbaseCredentials.spec.d.ts +1 -0
- package/dist/tests/PocketbaseCredentials.spec.js +47 -0
- package/dist/tests/PocketbaseCredentials.spec.js.map +1 -0
- package/dist/tests/PocketbaseTrigger.spec.d.ts +1 -0
- package/dist/tests/PocketbaseTrigger.spec.js +243 -0
- package/dist/tests/PocketbaseTrigger.spec.js.map +1 -0
- package/dist/tests/PocketbaseTriggerIntegration.spec.d.ts +1 -0
- package/dist/tests/PocketbaseTriggerIntegration.spec.js +125 -0
- package/dist/tests/PocketbaseTriggerIntegration.spec.js.map +1 -0
- package/dist/tests/RequestBodyFunctions.spec.d.ts +1 -0
- package/dist/tests/RequestBodyFunctions.spec.js +232 -0
- package/dist/tests/RequestBodyFunctions.spec.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +17 -7
- package/dist/nodes/PocketbaseHttp/GenericFunctions.js +0 -42
- package/dist/nodes/PocketbaseHttp/GenericFunctions.js.map +0 -1
- package/dist/nodes/PocketbaseHttp/LoadOptions.js.map +0 -1
- package/dist/nodes/PocketbaseHttp/PocketbaseAuth.d.ts +0 -7
- package/dist/nodes/PocketbaseHttp/PocketbaseAuth.js +0 -50
- package/dist/nodes/PocketbaseHttp/PocketbaseAuth.js.map +0 -1
- package/dist/nodes/PocketbaseHttp/RequestBodyFunctions.js +0 -62
- package/dist/nodes/PocketbaseHttp/RequestBodyFunctions.js.map +0 -1
- package/dist/tests/PocketbaseAuth.spec.js +0 -75
- package/dist/tests/PocketbaseAuth.spec.js.map +0 -1
- /package/dist/nodes/{PocketbaseHttp → Common}/RequestBodyFunctions.d.ts +0 -0
- /package/dist/tests/{PocketbaseAuth.spec.d.ts → GenericFunctions.spec.d.ts} +0 -0
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const vitest_1 = require("vitest");
|
|
4
|
+
const PocketbaseTrigger_node_1 = require("../nodes/PocketbaseTrigger/PocketbaseTrigger.node");
|
|
5
|
+
const eventsource_1 = require("eventsource");
|
|
6
|
+
vitest_1.vi.mock("eventsource", () => {
|
|
7
|
+
return {
|
|
8
|
+
EventSource: vitest_1.vi.fn(),
|
|
9
|
+
};
|
|
10
|
+
});
|
|
11
|
+
(0, vitest_1.describe)("PocketbaseTrigger", () => {
|
|
12
|
+
let triggerFunctions;
|
|
13
|
+
let node;
|
|
14
|
+
let esInstance;
|
|
15
|
+
(0, vitest_1.beforeEach)(() => {
|
|
16
|
+
vitest_1.vi.clearAllMocks();
|
|
17
|
+
node = new PocketbaseTrigger_node_1.PocketbaseTrigger();
|
|
18
|
+
triggerFunctions = {
|
|
19
|
+
getCredentials: vitest_1.vi.fn().mockResolvedValue({ url: "http://localhost:8090" }),
|
|
20
|
+
getNodeParameter: vitest_1.vi.fn(),
|
|
21
|
+
helpers: {
|
|
22
|
+
httpRequestWithAuthentication: vitest_1.vi.fn(),
|
|
23
|
+
returnJsonArray: vitest_1.vi.fn((data) => [{ json: data }]),
|
|
24
|
+
},
|
|
25
|
+
emit: vitest_1.vi.fn(),
|
|
26
|
+
emitError: vitest_1.vi.fn(),
|
|
27
|
+
logger: {
|
|
28
|
+
error: vitest_1.vi.fn(),
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
esInstance = {
|
|
32
|
+
addEventListener: vitest_1.vi.fn(),
|
|
33
|
+
removeEventListener: vitest_1.vi.fn(),
|
|
34
|
+
close: vitest_1.vi.fn(),
|
|
35
|
+
};
|
|
36
|
+
vitest_1.vi.mocked(eventsource_1.EventSource).mockImplementation(function () {
|
|
37
|
+
return esInstance;
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
(0, vitest_1.it)("should perform handshake on PB_CONNECT", async () => {
|
|
41
|
+
triggerFunctions.getNodeParameter.mockImplementation((name) => {
|
|
42
|
+
if (name === "collection")
|
|
43
|
+
return "posts";
|
|
44
|
+
if (name === "events")
|
|
45
|
+
return ["create", "update", "delete"];
|
|
46
|
+
return undefined;
|
|
47
|
+
});
|
|
48
|
+
await node.trigger.call(triggerFunctions);
|
|
49
|
+
(0, vitest_1.expect)(eventsource_1.EventSource).toHaveBeenCalledWith("http://localhost:8090/api/realtime");
|
|
50
|
+
(0, vitest_1.expect)(esInstance.addEventListener).toHaveBeenCalledWith("PB_CONNECT", vitest_1.expect.any(Function));
|
|
51
|
+
const pbConnectCallback = esInstance.addEventListener.mock.calls.find((call) => call[0] === "PB_CONNECT")[1];
|
|
52
|
+
await pbConnectCallback({ data: JSON.stringify({ clientId: "mock-client-id" }) });
|
|
53
|
+
(0, vitest_1.expect)(triggerFunctions.helpers.httpRequestWithAuthentication).toHaveBeenCalledWith("pocketbaseHttpApi", {
|
|
54
|
+
method: "POST",
|
|
55
|
+
url: "http://localhost:8090/api/realtime",
|
|
56
|
+
body: {
|
|
57
|
+
clientId: "mock-client-id",
|
|
58
|
+
subscriptions: ["posts"],
|
|
59
|
+
},
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
(0, vitest_1.it)("should emit data on matching event", async () => {
|
|
63
|
+
triggerFunctions.getNodeParameter.mockImplementation((name) => {
|
|
64
|
+
if (name === "collection")
|
|
65
|
+
return "posts";
|
|
66
|
+
if (name === "events")
|
|
67
|
+
return ["create"];
|
|
68
|
+
return undefined;
|
|
69
|
+
});
|
|
70
|
+
await node.trigger.call(triggerFunctions);
|
|
71
|
+
const collectionCallback = esInstance.addEventListener.mock.calls.find((call) => call[0] === "posts")[1];
|
|
72
|
+
await collectionCallback({
|
|
73
|
+
data: JSON.stringify({
|
|
74
|
+
action: "create",
|
|
75
|
+
record: { id: "1", title: "Hello" },
|
|
76
|
+
}),
|
|
77
|
+
});
|
|
78
|
+
(0, vitest_1.expect)(triggerFunctions.emit).toHaveBeenCalledWith([
|
|
79
|
+
[{ json: { __action: "create", id: "1", title: "Hello" } }],
|
|
80
|
+
]);
|
|
81
|
+
});
|
|
82
|
+
(0, vitest_1.it)("should handle record action collisions in onMessage", async () => {
|
|
83
|
+
triggerFunctions.getNodeParameter.mockImplementation((name) => {
|
|
84
|
+
if (name === "collection")
|
|
85
|
+
return "posts";
|
|
86
|
+
if (name === "events")
|
|
87
|
+
return ["create"];
|
|
88
|
+
return undefined;
|
|
89
|
+
});
|
|
90
|
+
await node.trigger.call(triggerFunctions);
|
|
91
|
+
const collectionCallback = esInstance.addEventListener.mock.calls.find((call) => call[0] === "posts")[1];
|
|
92
|
+
await collectionCallback({
|
|
93
|
+
data: JSON.stringify({
|
|
94
|
+
action: "create",
|
|
95
|
+
record: { id: "1", action: "original-action-value" },
|
|
96
|
+
}),
|
|
97
|
+
});
|
|
98
|
+
(0, vitest_1.expect)(triggerFunctions.emit).toHaveBeenCalledWith([
|
|
99
|
+
[
|
|
100
|
+
{
|
|
101
|
+
json: {
|
|
102
|
+
id: "1",
|
|
103
|
+
action: "original-action-value",
|
|
104
|
+
__original_action: "original-action-value",
|
|
105
|
+
__action: "create",
|
|
106
|
+
},
|
|
107
|
+
},
|
|
108
|
+
],
|
|
109
|
+
]);
|
|
110
|
+
});
|
|
111
|
+
(0, vitest_1.it)("should emit sample data on manualTriggerFunction", async () => {
|
|
112
|
+
triggerFunctions.getNodeParameter.mockImplementation((name) => {
|
|
113
|
+
if (name === "collection")
|
|
114
|
+
return "posts";
|
|
115
|
+
if (name === "events")
|
|
116
|
+
return ["create", "update", "delete"];
|
|
117
|
+
return undefined;
|
|
118
|
+
});
|
|
119
|
+
const response = await node.trigger.call(triggerFunctions);
|
|
120
|
+
if (response.manualTriggerFunction) {
|
|
121
|
+
await response.manualTriggerFunction();
|
|
122
|
+
(0, vitest_1.expect)(triggerFunctions.emit).toHaveBeenCalledWith([
|
|
123
|
+
[
|
|
124
|
+
{
|
|
125
|
+
json: vitest_1.expect.objectContaining({
|
|
126
|
+
__action: "create",
|
|
127
|
+
collectionName: "posts",
|
|
128
|
+
}),
|
|
129
|
+
},
|
|
130
|
+
],
|
|
131
|
+
]);
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
throw new Error("manualTriggerFunction should be defined");
|
|
135
|
+
}
|
|
136
|
+
});
|
|
137
|
+
(0, vitest_1.it)("should not emit data on non-matching event", async () => {
|
|
138
|
+
triggerFunctions.getNodeParameter.mockImplementation((name) => {
|
|
139
|
+
if (name === "collection")
|
|
140
|
+
return "posts";
|
|
141
|
+
if (name === "events")
|
|
142
|
+
return ["create"];
|
|
143
|
+
return undefined;
|
|
144
|
+
});
|
|
145
|
+
await node.trigger.call(triggerFunctions);
|
|
146
|
+
const collectionCallback = esInstance.addEventListener.mock.calls.find((call) => call[0] === "posts")[1];
|
|
147
|
+
await collectionCallback({
|
|
148
|
+
data: JSON.stringify({
|
|
149
|
+
action: "update",
|
|
150
|
+
record: { id: "1", title: "Hello" },
|
|
151
|
+
}),
|
|
152
|
+
});
|
|
153
|
+
(0, vitest_1.expect)(triggerFunctions.emit).not.toHaveBeenCalled();
|
|
154
|
+
});
|
|
155
|
+
(0, vitest_1.it)("should close EventSource on closeFunction", async () => {
|
|
156
|
+
triggerFunctions.getNodeParameter.mockImplementation((name) => {
|
|
157
|
+
if (name === "collection")
|
|
158
|
+
return "posts";
|
|
159
|
+
if (name === "events")
|
|
160
|
+
return ["create"];
|
|
161
|
+
return undefined;
|
|
162
|
+
});
|
|
163
|
+
const response = await node.trigger.call(triggerFunctions);
|
|
164
|
+
await response.closeFunction();
|
|
165
|
+
(0, vitest_1.expect)(esInstance.close).toHaveBeenCalled();
|
|
166
|
+
});
|
|
167
|
+
(0, vitest_1.it)("should handle EventSource connection failure", async () => {
|
|
168
|
+
vitest_1.vi.useFakeTimers();
|
|
169
|
+
try {
|
|
170
|
+
triggerFunctions.getNodeParameter.mockImplementation((name) => {
|
|
171
|
+
if (name === "collection")
|
|
172
|
+
return "posts";
|
|
173
|
+
if (name === "events")
|
|
174
|
+
return ["create"];
|
|
175
|
+
return undefined;
|
|
176
|
+
});
|
|
177
|
+
const response = await node.trigger.call(triggerFunctions);
|
|
178
|
+
const errorCallback = esInstance.addEventListener.mock.calls.find((call) => call[0] === "error")[1];
|
|
179
|
+
const mockError = new Error("Connection failed");
|
|
180
|
+
errorCallback(mockError);
|
|
181
|
+
(0, vitest_1.expect)(triggerFunctions.logger.error).toHaveBeenCalledWith("PocketBase SSE connection failure", vitest_1.expect.objectContaining({ error: mockError, baseUrl: "http://localhost:8090" }));
|
|
182
|
+
(0, vitest_1.expect)(triggerFunctions.emitError).toHaveBeenCalledWith(vitest_1.expect.objectContaining({
|
|
183
|
+
message: "Connection failed",
|
|
184
|
+
originalErrorEvent: mockError,
|
|
185
|
+
}));
|
|
186
|
+
(0, vitest_1.expect)(esInstance.close).toHaveBeenCalled();
|
|
187
|
+
await response.closeFunction();
|
|
188
|
+
}
|
|
189
|
+
finally {
|
|
190
|
+
vitest_1.vi.useRealTimers();
|
|
191
|
+
}
|
|
192
|
+
});
|
|
193
|
+
(0, vitest_1.it)("should handle EventSource delivering a non-Error error event", async () => {
|
|
194
|
+
vitest_1.vi.useFakeTimers();
|
|
195
|
+
try {
|
|
196
|
+
triggerFunctions.getNodeParameter.mockImplementation((name) => {
|
|
197
|
+
if (name === "collection")
|
|
198
|
+
return "posts";
|
|
199
|
+
if (name === "events")
|
|
200
|
+
return ["create"];
|
|
201
|
+
return undefined;
|
|
202
|
+
});
|
|
203
|
+
const response = await node.trigger.call(triggerFunctions);
|
|
204
|
+
const errorCallback = esInstance.addEventListener.mock.calls.find((call) => call[0] === "error")[1];
|
|
205
|
+
const mockError = { message: "Conn failed", code: 500 };
|
|
206
|
+
errorCallback(mockError);
|
|
207
|
+
(0, vitest_1.expect)(triggerFunctions.logger.error).toHaveBeenCalledWith("PocketBase SSE connection failure", vitest_1.expect.objectContaining({ error: mockError, baseUrl: "http://localhost:8090" }));
|
|
208
|
+
(0, vitest_1.expect)(triggerFunctions.emitError).toHaveBeenCalledWith(vitest_1.expect.objectContaining({
|
|
209
|
+
message: "Conn failed",
|
|
210
|
+
code: 500,
|
|
211
|
+
originalErrorEvent: mockError,
|
|
212
|
+
}));
|
|
213
|
+
(0, vitest_1.expect)(esInstance.close).toHaveBeenCalled();
|
|
214
|
+
await response.closeFunction();
|
|
215
|
+
}
|
|
216
|
+
finally {
|
|
217
|
+
vitest_1.vi.useRealTimers();
|
|
218
|
+
}
|
|
219
|
+
});
|
|
220
|
+
(0, vitest_1.it)("should redact sensitive data on parse failure", async () => {
|
|
221
|
+
triggerFunctions.getNodeParameter.mockImplementation((name) => {
|
|
222
|
+
if (name === "collection")
|
|
223
|
+
return "posts";
|
|
224
|
+
if (name === "events")
|
|
225
|
+
return ["create"];
|
|
226
|
+
return undefined;
|
|
227
|
+
});
|
|
228
|
+
await node.trigger.call(triggerFunctions);
|
|
229
|
+
const collectionCallback = esInstance.addEventListener.mock.calls.find((call) => call[0] === "posts")[1];
|
|
230
|
+
const invalidData = '{ "action": "create", "password": "secret", "token": "xyz", "email": "test@example.com", "msg": "Send it to someone@else.com", "invalid": ';
|
|
231
|
+
collectionCallback({ data: invalidData });
|
|
232
|
+
(0, vitest_1.expect)(triggerFunctions.logger.error).toHaveBeenCalledWith("Failed to parse PocketBase SSE message", vitest_1.expect.objectContaining({
|
|
233
|
+
collection: "posts",
|
|
234
|
+
}));
|
|
235
|
+
const loggedMeta = triggerFunctions.logger.error.mock.calls[0][1];
|
|
236
|
+
(0, vitest_1.expect)(loggedMeta.redactedPreview).toContain('"password": "[REDACTED]"');
|
|
237
|
+
(0, vitest_1.expect)(loggedMeta.redactedPreview).toContain('"token": "[REDACTED]"');
|
|
238
|
+
(0, vitest_1.expect)(loggedMeta.redactedPreview).toContain('"email": "[REDACTED]"');
|
|
239
|
+
(0, vitest_1.expect)(loggedMeta.redactedPreview).toContain("Send it to [REDACTED]");
|
|
240
|
+
(0, vitest_1.expect)(loggedMeta.redactedPreview.length).toBeLessThanOrEqual(200);
|
|
241
|
+
});
|
|
242
|
+
});
|
|
243
|
+
//# sourceMappingURL=PocketbaseTrigger.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PocketbaseTrigger.spec.js","sourceRoot":"","sources":["../../tests/PocketbaseTrigger.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const vitest_1 = require("vitest");
|
|
4
|
+
const PocketbaseTrigger_node_1 = require("../nodes/PocketbaseTrigger/PocketbaseTrigger.node");
|
|
5
|
+
const runIntegration = process.env.RUN_POCKETBASE_INTEGRATION === "true";
|
|
6
|
+
vitest_1.describe.skipIf(!runIntegration)("PocketbaseTrigger Integration", () => {
|
|
7
|
+
const baseUrl = process.env.POCKETBASE_TEST_URL || "http://localhost:8090";
|
|
8
|
+
const email = process.env.POCKETBASE_TEST_USER || "test@example.com";
|
|
9
|
+
const password = process.env.POCKETBASE_TEST_PASS || "password123";
|
|
10
|
+
(0, vitest_1.it)("should trigger when a record is created in PocketBase", async () => {
|
|
11
|
+
const authRes = await fetch(`${baseUrl}/api/collections/_superusers/auth-with-password`, {
|
|
12
|
+
method: "POST",
|
|
13
|
+
headers: { "Content-Type": "application/json" },
|
|
14
|
+
body: JSON.stringify({ identity: email, password }),
|
|
15
|
+
});
|
|
16
|
+
if (!authRes.ok) {
|
|
17
|
+
throw new Error(`Auth failed: ${authRes.status} ${await authRes.text()}`);
|
|
18
|
+
}
|
|
19
|
+
const authData = (await authRes.json());
|
|
20
|
+
const token = authData.token;
|
|
21
|
+
if (!token) {
|
|
22
|
+
throw new Error(`No token returned for user ${email}`);
|
|
23
|
+
}
|
|
24
|
+
const node = new PocketbaseTrigger_node_1.PocketbaseTrigger();
|
|
25
|
+
let triggeredData = null;
|
|
26
|
+
const triggerFunctions = {
|
|
27
|
+
getCredentials: async () => ({ url: baseUrl, token }),
|
|
28
|
+
getNodeParameter: (name) => {
|
|
29
|
+
if (name === "collection")
|
|
30
|
+
return "users";
|
|
31
|
+
if (name === "events")
|
|
32
|
+
return ["create"];
|
|
33
|
+
return undefined;
|
|
34
|
+
},
|
|
35
|
+
helpers: {
|
|
36
|
+
httpRequestWithAuthentication: async (cred, options) => {
|
|
37
|
+
const res = await fetch(options.url, {
|
|
38
|
+
method: options.method,
|
|
39
|
+
headers: {
|
|
40
|
+
...options.headers,
|
|
41
|
+
"Content-Type": "application/json",
|
|
42
|
+
Authorization: token,
|
|
43
|
+
},
|
|
44
|
+
body: JSON.stringify(options.body),
|
|
45
|
+
});
|
|
46
|
+
if (res.status === 204)
|
|
47
|
+
return {};
|
|
48
|
+
if (!res.ok) {
|
|
49
|
+
const text = await res.text();
|
|
50
|
+
throw new Error(`Request failed: ${res.status} ${text}`);
|
|
51
|
+
}
|
|
52
|
+
const contentType = res.headers.get("content-type");
|
|
53
|
+
if (contentType && contentType.includes("application/json")) {
|
|
54
|
+
return res.json();
|
|
55
|
+
}
|
|
56
|
+
return { body: await res.text() };
|
|
57
|
+
},
|
|
58
|
+
returnJsonArray: (data) => [{ json: data }],
|
|
59
|
+
},
|
|
60
|
+
emit: (data) => {
|
|
61
|
+
triggeredData = data;
|
|
62
|
+
},
|
|
63
|
+
logger: {
|
|
64
|
+
error: console.error,
|
|
65
|
+
info: console.log,
|
|
66
|
+
debug: console.debug,
|
|
67
|
+
warn: console.warn,
|
|
68
|
+
},
|
|
69
|
+
emitError: (err) => {
|
|
70
|
+
console.error("Trigger emitted error:", err);
|
|
71
|
+
},
|
|
72
|
+
};
|
|
73
|
+
const { closeFunction } = await node.trigger.call(triggerFunctions);
|
|
74
|
+
let createdRecordId;
|
|
75
|
+
try {
|
|
76
|
+
await new Promise((resolve) => setTimeout(resolve, 2000));
|
|
77
|
+
const uniqueEmail = `test-trigger-${Date.now()}@example.com`;
|
|
78
|
+
const createRes = await fetch(`${baseUrl}/api/collections/users/records`, {
|
|
79
|
+
method: "POST",
|
|
80
|
+
headers: {
|
|
81
|
+
"Content-Type": "application/json",
|
|
82
|
+
Authorization: token,
|
|
83
|
+
},
|
|
84
|
+
body: JSON.stringify({
|
|
85
|
+
username: `user${Date.now()}`,
|
|
86
|
+
email: uniqueEmail,
|
|
87
|
+
password: "password123",
|
|
88
|
+
passwordConfirm: "password123",
|
|
89
|
+
name: "Trigger Test User",
|
|
90
|
+
}),
|
|
91
|
+
});
|
|
92
|
+
if (!createRes.ok) {
|
|
93
|
+
const error = await createRes.text();
|
|
94
|
+
throw new Error(`Failed to create record: ${error}`);
|
|
95
|
+
}
|
|
96
|
+
const createData = (await createRes.json());
|
|
97
|
+
createdRecordId = createData.id;
|
|
98
|
+
for (let i = 0; i < 40; i++) {
|
|
99
|
+
if (triggeredData)
|
|
100
|
+
break;
|
|
101
|
+
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
102
|
+
}
|
|
103
|
+
(0, vitest_1.expect)(triggeredData, "Timeout waiting for Pocketbase trigger: triggeredData not set after 20s").toBeDefined();
|
|
104
|
+
(0, vitest_1.expect)(triggeredData).toHaveLength(1);
|
|
105
|
+
(0, vitest_1.expect)(triggeredData[0]).toHaveLength(1);
|
|
106
|
+
(0, vitest_1.expect)(triggeredData[0][0].json.email).toBe(uniqueEmail);
|
|
107
|
+
}
|
|
108
|
+
finally {
|
|
109
|
+
if (createdRecordId) {
|
|
110
|
+
const deleteRes = await fetch(`${baseUrl}/api/collections/users/records/${createdRecordId}`, {
|
|
111
|
+
method: "DELETE",
|
|
112
|
+
headers: {
|
|
113
|
+
Authorization: token,
|
|
114
|
+
},
|
|
115
|
+
});
|
|
116
|
+
if (!deleteRes.ok) {
|
|
117
|
+
console.warn(`Failed to cleanup test record ${createdRecordId}: ${deleteRes.status}`);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
if (closeFunction)
|
|
121
|
+
await closeFunction();
|
|
122
|
+
}
|
|
123
|
+
}, 30000);
|
|
124
|
+
});
|
|
125
|
+
//# sourceMappingURL=PocketbaseTriggerIntegration.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PocketbaseTriggerIntegration.spec.js","sourceRoot":"","sources":["../../tests/PocketbaseTriggerIntegration.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const vitest_1 = require("vitest");
|
|
7
|
+
const RequestBodyFunctions_1 = require("../nodes/Common/RequestBodyFunctions");
|
|
8
|
+
const form_data_1 = __importDefault(require("form-data"));
|
|
9
|
+
(0, vitest_1.describe)("RequestBodyFunctions", () => {
|
|
10
|
+
(0, vitest_1.describe)("prepareRequestBody", () => {
|
|
11
|
+
(0, vitest_1.afterEach)(() => {
|
|
12
|
+
vitest_1.vi.restoreAllMocks();
|
|
13
|
+
});
|
|
14
|
+
(0, vitest_1.it)("should parse and assign bodyJson correctly in JSON mode", async () => {
|
|
15
|
+
const mockThis = {
|
|
16
|
+
getNodeParameter: vitest_1.vi.fn().mockImplementation((name, defaultValue) => {
|
|
17
|
+
if (name === "bodyType")
|
|
18
|
+
return ["bodyJson"];
|
|
19
|
+
if (name === "bodyJson")
|
|
20
|
+
return '{"a": 1}';
|
|
21
|
+
return defaultValue;
|
|
22
|
+
}),
|
|
23
|
+
logger: {
|
|
24
|
+
info: vitest_1.vi.fn(),
|
|
25
|
+
debug: vitest_1.vi.fn(),
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
const requestOptions = { url: "http://test.com", method: "POST" };
|
|
29
|
+
const result = await RequestBodyFunctions_1.prepareRequestBody.call(mockThis, requestOptions);
|
|
30
|
+
(0, vitest_1.expect)(result.body).toEqual({ a: 1 });
|
|
31
|
+
});
|
|
32
|
+
(0, vitest_1.it)("should preserve nested objects and include null values in bodyJson in JSON mode", async () => {
|
|
33
|
+
const mockThis = {
|
|
34
|
+
getNodeParameter: vitest_1.vi.fn().mockImplementation((name, defaultValue) => {
|
|
35
|
+
if (name === "bodyType")
|
|
36
|
+
return ["bodyJson"];
|
|
37
|
+
if (name === "bodyJson")
|
|
38
|
+
return '{"a": 1, "b": {"c": 2}, "": "empty", " ": "whitespace", "nullVal": null}';
|
|
39
|
+
return defaultValue;
|
|
40
|
+
}),
|
|
41
|
+
logger: {
|
|
42
|
+
info: vitest_1.vi.fn(),
|
|
43
|
+
debug: vitest_1.vi.fn(),
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
const requestOptions = { url: "http://test.com", method: "POST" };
|
|
47
|
+
const result = await RequestBodyFunctions_1.prepareRequestBody.call(mockThis, requestOptions);
|
|
48
|
+
(0, vitest_1.expect)(result.body).toEqual({
|
|
49
|
+
a: 1,
|
|
50
|
+
b: { c: 2 },
|
|
51
|
+
nullVal: null,
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
(0, vitest_1.it)("should throw error for invalid JSON in bodyJson", async () => {
|
|
55
|
+
const mockThis = {
|
|
56
|
+
getNodeParameter: vitest_1.vi.fn().mockImplementation((name) => {
|
|
57
|
+
if (name === "bodyType")
|
|
58
|
+
return ["bodyJson"];
|
|
59
|
+
if (name === "bodyJson")
|
|
60
|
+
return "{invalid}";
|
|
61
|
+
return undefined;
|
|
62
|
+
}),
|
|
63
|
+
};
|
|
64
|
+
const requestOptions = { url: "http://test.com", method: "POST" };
|
|
65
|
+
await (0, vitest_1.expect)(RequestBodyFunctions_1.prepareRequestBody.call(mockThis, requestOptions)).rejects.toThrow("Invalid JSON in Body");
|
|
66
|
+
});
|
|
67
|
+
(0, vitest_1.it)("should throw error if bodyJson is not an object", async () => {
|
|
68
|
+
const mockThis = {
|
|
69
|
+
getNodeParameter: vitest_1.vi.fn().mockImplementation((name) => {
|
|
70
|
+
if (name === "bodyType")
|
|
71
|
+
return ["bodyJson"];
|
|
72
|
+
if (name === "bodyJson")
|
|
73
|
+
return '"string"';
|
|
74
|
+
return undefined;
|
|
75
|
+
}),
|
|
76
|
+
};
|
|
77
|
+
const requestOptions = { url: "http://test.com", method: "POST" };
|
|
78
|
+
await (0, vitest_1.expect)(RequestBodyFunctions_1.prepareRequestBody.call(mockThis, requestOptions)).rejects.toThrow("JSON Body must be a JSON object");
|
|
79
|
+
});
|
|
80
|
+
(0, vitest_1.it)("should parse and append bodyJson correctly in Multipart mode, converting null to 'null' string and removing stale Content-Type", async () => {
|
|
81
|
+
const appendSpy = vitest_1.vi.spyOn(form_data_1.default.prototype, "append");
|
|
82
|
+
const mockThis = {
|
|
83
|
+
getNodeParameter: vitest_1.vi.fn().mockImplementation((name, defaultValue) => {
|
|
84
|
+
if (name === "bodyType")
|
|
85
|
+
return ["bodyJson", "binaryData"];
|
|
86
|
+
if (name === "bodyJson")
|
|
87
|
+
return '{"a": 1, "b": {"c": 2}, "nullVal": null}';
|
|
88
|
+
if (name === "binaryPropertyName")
|
|
89
|
+
return "data";
|
|
90
|
+
if (name === "binaryFieldName")
|
|
91
|
+
return "file";
|
|
92
|
+
return defaultValue;
|
|
93
|
+
}),
|
|
94
|
+
logger: {
|
|
95
|
+
info: vitest_1.vi.fn(),
|
|
96
|
+
debug: vitest_1.vi.fn(),
|
|
97
|
+
},
|
|
98
|
+
helpers: {
|
|
99
|
+
assertBinaryData: vitest_1.vi
|
|
100
|
+
.fn()
|
|
101
|
+
.mockReturnValue({ mimeType: "text/plain", fileName: "test.txt" }),
|
|
102
|
+
getBinaryDataBuffer: vitest_1.vi.fn().mockResolvedValue(Buffer.from("hello")),
|
|
103
|
+
},
|
|
104
|
+
};
|
|
105
|
+
const requestOptions = {
|
|
106
|
+
url: "http://test.com",
|
|
107
|
+
method: "POST",
|
|
108
|
+
headers: { "Content-Type": "application/json" },
|
|
109
|
+
};
|
|
110
|
+
const result = await RequestBodyFunctions_1.prepareRequestBody.call(mockThis, requestOptions);
|
|
111
|
+
(0, vitest_1.expect)(appendSpy).toHaveBeenCalledWith("a", "1");
|
|
112
|
+
(0, vitest_1.expect)(appendSpy).toHaveBeenCalledWith("b", '{"c":2}');
|
|
113
|
+
(0, vitest_1.expect)(appendSpy).toHaveBeenCalledWith("nullVal", "null");
|
|
114
|
+
(0, vitest_1.expect)(appendSpy).toHaveBeenCalledWith("file", vitest_1.expect.any(Buffer), vitest_1.expect.objectContaining({
|
|
115
|
+
contentType: "text/plain",
|
|
116
|
+
filename: "test.txt",
|
|
117
|
+
}));
|
|
118
|
+
(0, vitest_1.expect)(result.headers).toBeDefined();
|
|
119
|
+
(0, vitest_1.expect)(result.headers["content-type"]).toContain("multipart/form-data");
|
|
120
|
+
(0, vitest_1.expect)(Object.keys(result.headers)).not.toContain("Content-Type");
|
|
121
|
+
});
|
|
122
|
+
(0, vitest_1.describe)("fields bodyType", () => {
|
|
123
|
+
const fields = {
|
|
124
|
+
assignments: [
|
|
125
|
+
{ name: "", value: "empty name" },
|
|
126
|
+
{ name: " ", value: "whitespace name" },
|
|
127
|
+
{ name: 123, value: "non-string name" },
|
|
128
|
+
{ name: "nullValue", value: null },
|
|
129
|
+
{ name: "undefinedValue", value: undefined },
|
|
130
|
+
{ name: "validString", value: "hello" },
|
|
131
|
+
{ name: "validObject", value: { foo: "bar" } },
|
|
132
|
+
],
|
|
133
|
+
};
|
|
134
|
+
(0, vitest_1.it)("should trim field names in JSON mode", async () => {
|
|
135
|
+
const mockThis = {
|
|
136
|
+
getNodeParameter: vitest_1.vi.fn().mockImplementation((name, defaultValue) => {
|
|
137
|
+
if (name === "bodyType")
|
|
138
|
+
return ["fields"];
|
|
139
|
+
if (name === "fields")
|
|
140
|
+
return { assignments: [{ name: " trimmedKey ", value: "value" }] };
|
|
141
|
+
return defaultValue;
|
|
142
|
+
}),
|
|
143
|
+
logger: {
|
|
144
|
+
info: vitest_1.vi.fn(),
|
|
145
|
+
debug: vitest_1.vi.fn(),
|
|
146
|
+
},
|
|
147
|
+
};
|
|
148
|
+
const requestOptions = { url: "http://test.com", method: "POST" };
|
|
149
|
+
const result = await RequestBodyFunctions_1.prepareRequestBody.call(mockThis, requestOptions);
|
|
150
|
+
(0, vitest_1.expect)(result.body).toEqual({ trimmedKey: "value" });
|
|
151
|
+
});
|
|
152
|
+
(0, vitest_1.it)("should trim JSON keys in JSON mode", async () => {
|
|
153
|
+
const mockThis = {
|
|
154
|
+
getNodeParameter: vitest_1.vi.fn().mockImplementation((name, defaultValue) => {
|
|
155
|
+
if (name === "bodyType")
|
|
156
|
+
return ["bodyJson"];
|
|
157
|
+
if (name === "bodyJson")
|
|
158
|
+
return '{" jsonKey ": "value"}';
|
|
159
|
+
return defaultValue;
|
|
160
|
+
}),
|
|
161
|
+
logger: {
|
|
162
|
+
info: vitest_1.vi.fn(),
|
|
163
|
+
debug: vitest_1.vi.fn(),
|
|
164
|
+
},
|
|
165
|
+
};
|
|
166
|
+
const requestOptions = { url: "http://test.com", method: "POST" };
|
|
167
|
+
const result = await RequestBodyFunctions_1.prepareRequestBody.call(mockThis, requestOptions);
|
|
168
|
+
(0, vitest_1.expect)(result.body).toEqual({ jsonKey: "value" });
|
|
169
|
+
});
|
|
170
|
+
(0, vitest_1.it)("should filter invalid entries and include null as null in JSON mode", async () => {
|
|
171
|
+
const mockThis = {
|
|
172
|
+
getNodeParameter: vitest_1.vi.fn().mockImplementation((name, defaultValue) => {
|
|
173
|
+
if (name === "bodyType")
|
|
174
|
+
return ["fields"];
|
|
175
|
+
if (name === "fields")
|
|
176
|
+
return fields;
|
|
177
|
+
return defaultValue;
|
|
178
|
+
}),
|
|
179
|
+
logger: {
|
|
180
|
+
info: vitest_1.vi.fn(),
|
|
181
|
+
debug: vitest_1.vi.fn(),
|
|
182
|
+
},
|
|
183
|
+
};
|
|
184
|
+
const requestOptions = { url: "http://test.com", method: "POST" };
|
|
185
|
+
const result = await RequestBodyFunctions_1.prepareRequestBody.call(mockThis, requestOptions);
|
|
186
|
+
(0, vitest_1.expect)(result.body).toEqual({
|
|
187
|
+
nullValue: null,
|
|
188
|
+
validString: "hello",
|
|
189
|
+
validObject: { foo: "bar" },
|
|
190
|
+
});
|
|
191
|
+
});
|
|
192
|
+
(0, vitest_1.it)("should filter invalid entries and convert null to 'null' string in Multipart mode", async () => {
|
|
193
|
+
const appendSpy = vitest_1.vi.spyOn(form_data_1.default.prototype, "append");
|
|
194
|
+
const mockThis = {
|
|
195
|
+
getNodeParameter: vitest_1.vi.fn().mockImplementation((name, defaultValue) => {
|
|
196
|
+
if (name === "bodyType")
|
|
197
|
+
return ["fields", "binaryData"];
|
|
198
|
+
if (name === "fields")
|
|
199
|
+
return fields;
|
|
200
|
+
if (name === "binaryPropertyName")
|
|
201
|
+
return "data";
|
|
202
|
+
if (name === "binaryFieldName")
|
|
203
|
+
return "file";
|
|
204
|
+
return defaultValue;
|
|
205
|
+
}),
|
|
206
|
+
logger: {
|
|
207
|
+
info: vitest_1.vi.fn(),
|
|
208
|
+
debug: vitest_1.vi.fn(),
|
|
209
|
+
},
|
|
210
|
+
helpers: {
|
|
211
|
+
assertBinaryData: vitest_1.vi
|
|
212
|
+
.fn()
|
|
213
|
+
.mockReturnValue({ mimeType: "text/plain", fileName: "test.txt" }),
|
|
214
|
+
getBinaryDataBuffer: vitest_1.vi.fn().mockResolvedValue(Buffer.from("hello")),
|
|
215
|
+
},
|
|
216
|
+
};
|
|
217
|
+
const requestOptions = { url: "http://test.com", method: "POST" };
|
|
218
|
+
const result = await RequestBodyFunctions_1.prepareRequestBody.call(mockThis, requestOptions);
|
|
219
|
+
(0, vitest_1.expect)(appendSpy).toHaveBeenCalledWith("validString", "hello");
|
|
220
|
+
(0, vitest_1.expect)(appendSpy).toHaveBeenCalledWith("validObject", '{"foo":"bar"}');
|
|
221
|
+
(0, vitest_1.expect)(appendSpy).toHaveBeenCalledWith("nullValue", "null");
|
|
222
|
+
const appendedKeys = appendSpy.mock.calls.map((call) => call[0]);
|
|
223
|
+
(0, vitest_1.expect)(appendedKeys).not.toContain("");
|
|
224
|
+
(0, vitest_1.expect)(appendedKeys).not.toContain(" ");
|
|
225
|
+
(0, vitest_1.expect)(appendedKeys).not.toContain(123);
|
|
226
|
+
(0, vitest_1.expect)(appendedKeys).not.toContain("undefinedValue");
|
|
227
|
+
(0, vitest_1.expect)(result.headers["content-type"]).toContain("multipart/form-data");
|
|
228
|
+
});
|
|
229
|
+
});
|
|
230
|
+
});
|
|
231
|
+
});
|
|
232
|
+
//# sourceMappingURL=RequestBodyFunctions.spec.js.map
|