@tinycloudlabs/sdk-services-test 1.0.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/dist/MockKVService.d.ts +145 -0
- package/dist/MockKVService.d.ts.map +1 -0
- package/dist/MockKVService.js +335 -0
- package/dist/MockKVService.js.map +1 -0
- package/dist/MockServiceContext.d.ts +160 -0
- package/dist/MockServiceContext.d.ts.map +1 -0
- package/dist/MockServiceContext.js +280 -0
- package/dist/MockServiceContext.js.map +1 -0
- package/dist/helpers.d.ts +219 -0
- package/dist/helpers.d.ts.map +1 -0
- package/dist/helpers.js +314 -0
- package/dist/helpers.js.map +1 -0
- package/dist/index.d.ts +34 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +36 -0
- package/dist/index.js.map +1 -0
- package/package.json +38 -0
package/dist/helpers.js
ADDED
|
@@ -0,0 +1,314 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test Utilities for SDK Services
|
|
3
|
+
*
|
|
4
|
+
* Factory functions and helpers for creating test fixtures.
|
|
5
|
+
*/
|
|
6
|
+
import { MockServiceContext, } from "./MockServiceContext";
|
|
7
|
+
import { MockKVService } from "./MockKVService";
|
|
8
|
+
/**
|
|
9
|
+
* Create a mock ServiceSession for testing.
|
|
10
|
+
*
|
|
11
|
+
* @param overrides - Optional overrides for session fields
|
|
12
|
+
* @returns A mock ServiceSession
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```typescript
|
|
16
|
+
* const session = createMockSession();
|
|
17
|
+
* const customSession = createMockSession({
|
|
18
|
+
* spaceId: 'space:custom-id',
|
|
19
|
+
* });
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
export function createMockSession(overrides) {
|
|
23
|
+
return {
|
|
24
|
+
delegationHeader: {
|
|
25
|
+
Authorization: "Bearer mock-delegation-token",
|
|
26
|
+
},
|
|
27
|
+
delegationCid: "bafy2bzaced5example",
|
|
28
|
+
spaceId: "space:mock-test-space-id",
|
|
29
|
+
verificationMethod: "did:key:z6MkexampleKey#z6MkexampleKey",
|
|
30
|
+
jwk: {
|
|
31
|
+
kty: "OKP",
|
|
32
|
+
crv: "Ed25519",
|
|
33
|
+
x: "mockPublicKeyX",
|
|
34
|
+
d: "mockPrivateKeyD",
|
|
35
|
+
},
|
|
36
|
+
...overrides,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Create a MockServiceContext with sensible defaults for testing.
|
|
41
|
+
*
|
|
42
|
+
* @param options - Configuration options
|
|
43
|
+
* @returns A configured MockServiceContext
|
|
44
|
+
*
|
|
45
|
+
* @example
|
|
46
|
+
* ```typescript
|
|
47
|
+
* // Create an authenticated context
|
|
48
|
+
* const context = createTestContext({ authenticated: true });
|
|
49
|
+
*
|
|
50
|
+
* // Create with custom fetch responses
|
|
51
|
+
* const context = createTestContext({
|
|
52
|
+
* authenticated: true,
|
|
53
|
+
* fetchResponses: new Map([
|
|
54
|
+
* ['/invoke', { ok: true, status: 200, body: { data: 'test' } }],
|
|
55
|
+
* ]),
|
|
56
|
+
* });
|
|
57
|
+
* ```
|
|
58
|
+
*/
|
|
59
|
+
export function createTestContext(options = {}) {
|
|
60
|
+
const { authenticated = false, sessionOverrides, ...config } = options;
|
|
61
|
+
let session = config.session ?? null;
|
|
62
|
+
if (authenticated && !session) {
|
|
63
|
+
session = createMockSession(sessionOverrides);
|
|
64
|
+
}
|
|
65
|
+
return new MockServiceContext({
|
|
66
|
+
...config,
|
|
67
|
+
session,
|
|
68
|
+
hosts: config.hosts ?? ["https://mock.tinycloud.test"],
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Create a MockKVService with initial data.
|
|
73
|
+
*
|
|
74
|
+
* @param initialData - Key-value pairs to seed the store
|
|
75
|
+
* @param config - Additional configuration
|
|
76
|
+
* @returns A configured MockKVService
|
|
77
|
+
*
|
|
78
|
+
* @example
|
|
79
|
+
* ```typescript
|
|
80
|
+
* const kv = createMockKV({
|
|
81
|
+
* 'user/settings': { theme: 'dark' },
|
|
82
|
+
* 'user/profile': { name: 'Alice' },
|
|
83
|
+
* });
|
|
84
|
+
*
|
|
85
|
+
* // With latency simulation
|
|
86
|
+
* const kv = createMockKV(
|
|
87
|
+
* { 'key': 'value' },
|
|
88
|
+
* { latencyMs: 50 }
|
|
89
|
+
* );
|
|
90
|
+
* ```
|
|
91
|
+
*/
|
|
92
|
+
export function createMockKV(initialData, config) {
|
|
93
|
+
return new MockKVService({
|
|
94
|
+
...config,
|
|
95
|
+
initialData,
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Wait for a specific event to be emitted from a context.
|
|
100
|
+
*
|
|
101
|
+
* @param context - The MockServiceContext to listen on
|
|
102
|
+
* @param eventName - The event name to wait for
|
|
103
|
+
* @param timeoutMs - Timeout in milliseconds (default: 5000)
|
|
104
|
+
* @returns Promise that resolves with the event data
|
|
105
|
+
*
|
|
106
|
+
* @example
|
|
107
|
+
* ```typescript
|
|
108
|
+
* // Wait for session change event
|
|
109
|
+
* const eventPromise = waitForEvent(context, 'session.changed');
|
|
110
|
+
* context.setSession(createMockSession());
|
|
111
|
+
* const eventData = await eventPromise;
|
|
112
|
+
* expect(eventData.authenticated).toBe(true);
|
|
113
|
+
* ```
|
|
114
|
+
*/
|
|
115
|
+
export function waitForEvent(context, eventName, timeoutMs = 5000) {
|
|
116
|
+
return new Promise((resolve, reject) => {
|
|
117
|
+
const timeout = setTimeout(() => {
|
|
118
|
+
unsubscribe();
|
|
119
|
+
reject(new Error(`Timeout waiting for event: ${eventName}`));
|
|
120
|
+
}, timeoutMs);
|
|
121
|
+
const unsubscribe = context.on(eventName, (data) => {
|
|
122
|
+
clearTimeout(timeout);
|
|
123
|
+
unsubscribe();
|
|
124
|
+
resolve(data);
|
|
125
|
+
});
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Wait for multiple events to be emitted.
|
|
130
|
+
*
|
|
131
|
+
* @param context - The MockServiceContext to listen on
|
|
132
|
+
* @param eventName - The event name to wait for
|
|
133
|
+
* @param count - Number of events to wait for
|
|
134
|
+
* @param timeoutMs - Timeout in milliseconds (default: 5000)
|
|
135
|
+
* @returns Promise that resolves with array of event data
|
|
136
|
+
*
|
|
137
|
+
* @example
|
|
138
|
+
* ```typescript
|
|
139
|
+
* // Wait for 3 service requests
|
|
140
|
+
* const eventsPromise = waitForEvents(context, 'service.request', 3);
|
|
141
|
+
* await kv.get('key1');
|
|
142
|
+
* await kv.get('key2');
|
|
143
|
+
* await kv.get('key3');
|
|
144
|
+
* const events = await eventsPromise;
|
|
145
|
+
* expect(events).toHaveLength(3);
|
|
146
|
+
* ```
|
|
147
|
+
*/
|
|
148
|
+
export function waitForEvents(context, eventName, count, timeoutMs = 5000) {
|
|
149
|
+
return new Promise((resolve, reject) => {
|
|
150
|
+
const events = [];
|
|
151
|
+
const timeout = setTimeout(() => {
|
|
152
|
+
unsubscribe();
|
|
153
|
+
reject(new Error(`Timeout waiting for ${count} events of type ${eventName}. Received ${events.length}.`));
|
|
154
|
+
}, timeoutMs);
|
|
155
|
+
const unsubscribe = context.on(eventName, (data) => {
|
|
156
|
+
events.push(data);
|
|
157
|
+
if (events.length >= count) {
|
|
158
|
+
clearTimeout(timeout);
|
|
159
|
+
unsubscribe();
|
|
160
|
+
resolve(events);
|
|
161
|
+
}
|
|
162
|
+
});
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Create a mock fetch response for success scenarios.
|
|
167
|
+
*
|
|
168
|
+
* @param body - Response body
|
|
169
|
+
* @param headers - Optional response headers
|
|
170
|
+
* @returns MockFetchResponse
|
|
171
|
+
*
|
|
172
|
+
* @example
|
|
173
|
+
* ```typescript
|
|
174
|
+
* const response = mockOkResponse({ keys: ['a', 'b'] });
|
|
175
|
+
* context.addFetchResponse('/invoke', response);
|
|
176
|
+
* ```
|
|
177
|
+
*/
|
|
178
|
+
export function mockOkResponse(body, headers) {
|
|
179
|
+
return {
|
|
180
|
+
ok: true,
|
|
181
|
+
status: 200,
|
|
182
|
+
statusText: "OK",
|
|
183
|
+
headers: {
|
|
184
|
+
"content-type": "application/json",
|
|
185
|
+
...headers,
|
|
186
|
+
},
|
|
187
|
+
body,
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Create a mock fetch response for error scenarios.
|
|
192
|
+
*
|
|
193
|
+
* @param status - HTTP status code
|
|
194
|
+
* @param body - Error body
|
|
195
|
+
* @param statusText - Optional status text
|
|
196
|
+
* @returns MockFetchResponse
|
|
197
|
+
*
|
|
198
|
+
* @example
|
|
199
|
+
* ```typescript
|
|
200
|
+
* const response = mockErrorResponse(404, { error: 'Not found' });
|
|
201
|
+
* context.addFetchResponse('/invoke', response);
|
|
202
|
+
* ```
|
|
203
|
+
*/
|
|
204
|
+
export function mockErrorResponse(status, body, statusText) {
|
|
205
|
+
return {
|
|
206
|
+
ok: false,
|
|
207
|
+
status,
|
|
208
|
+
statusText: statusText ?? `Error ${status}`,
|
|
209
|
+
headers: {
|
|
210
|
+
"content-type": "application/json",
|
|
211
|
+
},
|
|
212
|
+
body: body ?? { error: statusText ?? `Error ${status}` },
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Create a delayed mock fetch handler for testing latency.
|
|
217
|
+
*
|
|
218
|
+
* @param response - The response to return after delay
|
|
219
|
+
* @param delayMs - Delay in milliseconds
|
|
220
|
+
* @returns Mock fetch handler function
|
|
221
|
+
*
|
|
222
|
+
* @example
|
|
223
|
+
* ```typescript
|
|
224
|
+
* context.addFetchResponse(
|
|
225
|
+
* '/invoke',
|
|
226
|
+
* delayedResponse(mockOkResponse({ data: 'test' }), 100)
|
|
227
|
+
* );
|
|
228
|
+
* ```
|
|
229
|
+
*/
|
|
230
|
+
export function delayedResponse(response, delayMs) {
|
|
231
|
+
return async () => {
|
|
232
|
+
await new Promise((resolve) => setTimeout(resolve, delayMs));
|
|
233
|
+
return response;
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Create a sequence of mock responses that cycle through.
|
|
238
|
+
*
|
|
239
|
+
* @param responses - Array of responses to cycle through
|
|
240
|
+
* @returns Mock fetch handler function
|
|
241
|
+
*
|
|
242
|
+
* @example
|
|
243
|
+
* ```typescript
|
|
244
|
+
* // First call returns error, subsequent calls succeed
|
|
245
|
+
* context.addFetchResponse(
|
|
246
|
+
* '/invoke',
|
|
247
|
+
* sequenceResponses([
|
|
248
|
+
* mockErrorResponse(503, 'Temporarily unavailable'),
|
|
249
|
+
* mockOkResponse({ data: 'success' }),
|
|
250
|
+
* ])
|
|
251
|
+
* );
|
|
252
|
+
* ```
|
|
253
|
+
*/
|
|
254
|
+
export function sequenceResponses(responses) {
|
|
255
|
+
let index = 0;
|
|
256
|
+
return () => {
|
|
257
|
+
const response = responses[index];
|
|
258
|
+
if (index < responses.length - 1) {
|
|
259
|
+
index++;
|
|
260
|
+
}
|
|
261
|
+
return response;
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Assert that an operation was recorded with specific properties.
|
|
266
|
+
*
|
|
267
|
+
* @param kv - The MockKVService to check
|
|
268
|
+
* @param expected - Expected operation properties
|
|
269
|
+
* @returns Whether a matching operation was found
|
|
270
|
+
*
|
|
271
|
+
* @example
|
|
272
|
+
* ```typescript
|
|
273
|
+
* await kv.put('key', 'value');
|
|
274
|
+
* expect(wasOperationRecorded(kv, { type: 'put', key: 'key' })).toBe(true);
|
|
275
|
+
* ```
|
|
276
|
+
*/
|
|
277
|
+
export function wasOperationRecorded(kv, expected) {
|
|
278
|
+
return kv.getOperations().some((op) => {
|
|
279
|
+
if (expected.type !== undefined && op.type !== expected.type)
|
|
280
|
+
return false;
|
|
281
|
+
if (expected.key !== undefined && op.key !== expected.key)
|
|
282
|
+
return false;
|
|
283
|
+
if (expected.value !== undefined) {
|
|
284
|
+
return JSON.stringify(op.value) === JSON.stringify(expected.value);
|
|
285
|
+
}
|
|
286
|
+
return true;
|
|
287
|
+
});
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* Setup a MockKVService with a MockServiceContext.
|
|
291
|
+
*
|
|
292
|
+
* @param kvConfig - MockKVService configuration
|
|
293
|
+
* @param contextConfig - MockServiceContext configuration
|
|
294
|
+
* @returns Object with initialized kv and context
|
|
295
|
+
*
|
|
296
|
+
* @example
|
|
297
|
+
* ```typescript
|
|
298
|
+
* const { kv, context } = setupMockKV(
|
|
299
|
+
* { initialData: { 'key': 'value' } },
|
|
300
|
+
* { authenticated: true }
|
|
301
|
+
* );
|
|
302
|
+
*
|
|
303
|
+
* const result = await kv.get('key');
|
|
304
|
+
* expect(result.ok).toBe(true);
|
|
305
|
+
* ```
|
|
306
|
+
*/
|
|
307
|
+
export function setupMockKV(kvConfig, contextConfig) {
|
|
308
|
+
const context = createTestContext(contextConfig);
|
|
309
|
+
const kv = new MockKVService(kvConfig);
|
|
310
|
+
kv.initialize(context);
|
|
311
|
+
context.registerService("kv", kv);
|
|
312
|
+
return { kv, context };
|
|
313
|
+
}
|
|
314
|
+
//# sourceMappingURL=helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EACL,kBAAkB,GAGnB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,aAAa,EAAuB,MAAM,iBAAiB,CAAC;AAYrE;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,iBAAiB,CAC/B,SAAmC;IAEnC,OAAO;QACL,gBAAgB,EAAE;YAChB,aAAa,EAAE,8BAA8B;SAC9C;QACD,aAAa,EAAE,qBAAqB;QACpC,OAAO,EAAE,0BAA0B;QACnC,kBAAkB,EAAE,uCAAuC;QAC3D,GAAG,EAAE;YACH,GAAG,EAAE,KAAK;YACV,GAAG,EAAE,SAAS;YACd,CAAC,EAAE,gBAAgB;YACnB,CAAC,EAAE,iBAAiB;SACrB;QACD,GAAG,SAAS;KACb,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,iBAAiB,CAC/B,UAAoC,EAAE;IAEtC,MAAM,EAAE,aAAa,GAAG,KAAK,EAAE,gBAAgB,EAAE,GAAG,MAAM,EAAE,GAAG,OAAO,CAAC;IAEvE,IAAI,OAAO,GAA0B,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC;IAC5D,IAAI,aAAa,IAAI,CAAC,OAAO,EAAE,CAAC;QAC9B,OAAO,GAAG,iBAAiB,CAAC,gBAAgB,CAAC,CAAC;IAChD,CAAC;IAED,OAAO,IAAI,kBAAkB,CAAC;QAC5B,GAAG,MAAM;QACT,OAAO;QACP,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,CAAC,6BAA6B,CAAC;KACvD,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,YAAY,CAC1B,WAAqC,EACrC,MAAiD;IAEjD,OAAO,IAAI,aAAa,CAAC;QACvB,GAAG,MAAM;QACT,WAAW;KACZ,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,YAAY,CAC1B,OAA2B,EAC3B,SAAiB,EACjB,YAAoB,IAAI;IAExB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;YAC9B,WAAW,EAAE,CAAC;YACd,MAAM,CAAC,IAAI,KAAK,CAAC,8BAA8B,SAAS,EAAE,CAAC,CAAC,CAAC;QAC/D,CAAC,EAAE,SAAS,CAAC,CAAC;QAEd,MAAM,WAAW,GAAG,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE;YACjD,YAAY,CAAC,OAAO,CAAC,CAAC;YACtB,WAAW,EAAE,CAAC;YACd,OAAO,CAAC,IAAI,CAAC,CAAC;QAChB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,aAAa,CAC3B,OAA2B,EAC3B,SAAiB,EACjB,KAAa,EACb,YAAoB,IAAI;IAExB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,MAAM,GAAc,EAAE,CAAC;QAE7B,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;YAC9B,WAAW,EAAE,CAAC;YACd,MAAM,CACJ,IAAI,KAAK,CACP,uBAAuB,KAAK,mBAAmB,SAAS,cAAc,MAAM,CAAC,MAAM,GAAG,CACvF,CACF,CAAC;QACJ,CAAC,EAAE,SAAS,CAAC,CAAC;QAEd,MAAM,WAAW,GAAG,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE;YACjD,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClB,IAAI,MAAM,CAAC,MAAM,IAAI,KAAK,EAAE,CAAC;gBAC3B,YAAY,CAAC,OAAO,CAAC,CAAC;gBACtB,WAAW,EAAE,CAAC;gBACd,OAAO,CAAC,MAAM,CAAC,CAAC;YAClB,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,cAAc,CAC5B,IAAa,EACb,OAAgC;IAEhC,OAAO;QACL,EAAE,EAAE,IAAI;QACR,MAAM,EAAE,GAAG;QACX,UAAU,EAAE,IAAI;QAChB,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,GAAG,OAAO;SACX;QACD,IAAI;KACL,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,iBAAiB,CAC/B,MAAc,EACd,IAAc,EACd,UAAmB;IAEnB,OAAO;QACL,EAAE,EAAE,KAAK;QACT,MAAM;QACN,UAAU,EAAE,UAAU,IAAI,SAAS,MAAM,EAAE;QAC3C,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;SACnC;QACD,IAAI,EAAE,IAAI,IAAI,EAAE,KAAK,EAAE,UAAU,IAAI,SAAS,MAAM,EAAE,EAAE;KACzD,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,eAAe,CAC7B,QAA2B,EAC3B,OAAe;IAEf,OAAO,KAAK,IAAI,EAAE;QAChB,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;QAC7D,OAAO,QAAQ,CAAC;IAClB,CAAC,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,iBAAiB,CAC/B,SAA8B;IAE9B,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,OAAO,GAAG,EAAE;QACV,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;QAClC,IAAI,KAAK,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACjC,KAAK,EAAE,CAAC;QACV,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,oBAAoB,CAClC,EAAiB,EACjB,QAIE;IAEF,OAAO,EAAE,CAAC,aAAa,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE;QACpC,IAAI,QAAQ,CAAC,IAAI,KAAK,SAAS,IAAI,EAAE,CAAC,IAAI,KAAK,QAAQ,CAAC,IAAI;YAAE,OAAO,KAAK,CAAC;QAC3E,IAAI,QAAQ,CAAC,GAAG,KAAK,SAAS,IAAI,EAAE,CAAC,GAAG,KAAK,QAAQ,CAAC,GAAG;YAAE,OAAO,KAAK,CAAC;QACxE,IAAI,QAAQ,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YACjC,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACrE,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,WAAW,CACzB,QAA8B,EAC9B,aAAwC;IAExC,MAAM,OAAO,GAAG,iBAAiB,CAAC,aAAa,CAAC,CAAC;IACjD,MAAM,EAAE,GAAG,IAAI,aAAa,CAAC,QAAQ,CAAC,CAAC;IACvC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IACvB,OAAO,CAAC,eAAe,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAClC,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC;AACzB,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TinyCloud SDK Services - Test Utilities
|
|
3
|
+
*
|
|
4
|
+
* Mock implementations and test helpers for testing services
|
|
5
|
+
* without network dependencies.
|
|
6
|
+
*
|
|
7
|
+
* @packageDocumentation
|
|
8
|
+
* @module @tinycloudlabs/sdk-services-test
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```typescript
|
|
12
|
+
* import {
|
|
13
|
+
* createTestContext,
|
|
14
|
+
* createMockKV,
|
|
15
|
+
* createMockSession,
|
|
16
|
+
* waitForEvent,
|
|
17
|
+
* } from '@tinycloudlabs/sdk-services-test';
|
|
18
|
+
*
|
|
19
|
+
* // Create an authenticated test context
|
|
20
|
+
* const context = createTestContext({ authenticated: true });
|
|
21
|
+
*
|
|
22
|
+
* // Create a mock KV service with seed data
|
|
23
|
+
* const kv = createMockKV({ 'key': 'value' });
|
|
24
|
+
* kv.initialize(context);
|
|
25
|
+
*
|
|
26
|
+
* // Test service operations
|
|
27
|
+
* const result = await kv.get('key');
|
|
28
|
+
* expect(result.ok).toBe(true);
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
export { MockServiceContext, type MockServiceContextConfig, type RecordedEvent, type MockFetchResponse, type MockFetchHandler, } from "./MockServiceContext";
|
|
32
|
+
export { MockKVService, type MockKVServiceConfig, type RecordedOperation, type ErrorInjection, } from "./MockKVService";
|
|
33
|
+
export { createMockSession, createTestContext, createMockKV, waitForEvent, waitForEvents, mockOkResponse, mockErrorResponse, delayedResponse, sequenceResponses, wasOperationRecorded, setupMockKV, type CreateTestContextOptions, } from "./helpers";
|
|
34
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAGH,OAAO,EACL,kBAAkB,EAClB,KAAK,wBAAwB,EAC7B,KAAK,aAAa,EAClB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,GACtB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,aAAa,EACb,KAAK,mBAAmB,EACxB,KAAK,iBAAiB,EACtB,KAAK,cAAc,GACpB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,eAAe,EACf,iBAAiB,EACjB,oBAAoB,EACpB,WAAW,EACX,KAAK,wBAAwB,GAC9B,MAAM,WAAW,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TinyCloud SDK Services - Test Utilities
|
|
3
|
+
*
|
|
4
|
+
* Mock implementations and test helpers for testing services
|
|
5
|
+
* without network dependencies.
|
|
6
|
+
*
|
|
7
|
+
* @packageDocumentation
|
|
8
|
+
* @module @tinycloudlabs/sdk-services-test
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```typescript
|
|
12
|
+
* import {
|
|
13
|
+
* createTestContext,
|
|
14
|
+
* createMockKV,
|
|
15
|
+
* createMockSession,
|
|
16
|
+
* waitForEvent,
|
|
17
|
+
* } from '@tinycloudlabs/sdk-services-test';
|
|
18
|
+
*
|
|
19
|
+
* // Create an authenticated test context
|
|
20
|
+
* const context = createTestContext({ authenticated: true });
|
|
21
|
+
*
|
|
22
|
+
* // Create a mock KV service with seed data
|
|
23
|
+
* const kv = createMockKV({ 'key': 'value' });
|
|
24
|
+
* kv.initialize(context);
|
|
25
|
+
*
|
|
26
|
+
* // Test service operations
|
|
27
|
+
* const result = await kv.get('key');
|
|
28
|
+
* expect(result.ok).toBe(true);
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
// Mock implementations
|
|
32
|
+
export { MockServiceContext, } from "./MockServiceContext";
|
|
33
|
+
export { MockKVService, } from "./MockKVService";
|
|
34
|
+
// Test helpers
|
|
35
|
+
export { createMockSession, createTestContext, createMockKV, waitForEvent, waitForEvents, mockOkResponse, mockErrorResponse, delayedResponse, sequenceResponses, wasOperationRecorded, setupMockKV, } from "./helpers";
|
|
36
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,uBAAuB;AACvB,OAAO,EACL,kBAAkB,GAKnB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,aAAa,GAId,MAAM,iBAAiB,CAAC;AAEzB,eAAe;AACf,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,eAAe,EACf,iBAAiB,EACjB,oBAAoB,EACpB,WAAW,GAEZ,MAAM,WAAW,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@tinycloudlabs/sdk-services-test",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Testing utilities for TinyCloud SDK Services",
|
|
5
|
+
"author": "TinyCloud, Inc.",
|
|
6
|
+
"license": "EGPL",
|
|
7
|
+
"type": "module",
|
|
8
|
+
"main": "dist/index.js",
|
|
9
|
+
"module": "dist/index.js",
|
|
10
|
+
"types": "dist/index.d.ts",
|
|
11
|
+
"exports": {
|
|
12
|
+
".": {
|
|
13
|
+
"types": "./dist/index.d.ts",
|
|
14
|
+
"import": "./dist/index.js",
|
|
15
|
+
"default": "./dist/index.js"
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
"files": [
|
|
19
|
+
"dist"
|
|
20
|
+
],
|
|
21
|
+
"scripts": {
|
|
22
|
+
"build": "tsc",
|
|
23
|
+
"clean": "rm -rf dist",
|
|
24
|
+
"test": "bun test"
|
|
25
|
+
},
|
|
26
|
+
"peerDependencies": {
|
|
27
|
+
"@tinycloudlabs/sdk-services": "workspace:*"
|
|
28
|
+
},
|
|
29
|
+
"devDependencies": {
|
|
30
|
+
"@tinycloudlabs/sdk-services": "workspace:*",
|
|
31
|
+
"@types/node": "^20",
|
|
32
|
+
"typescript": "^5.0.0"
|
|
33
|
+
},
|
|
34
|
+
"repository": {
|
|
35
|
+
"type": "git",
|
|
36
|
+
"url": "https://github.com/tinycloudlabs/web-sdk"
|
|
37
|
+
}
|
|
38
|
+
}
|