@justscale/testing 0.1.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/mock.js ADDED
@@ -0,0 +1,464 @@
1
+ /**
2
+ * Mocking utilities for JustScale testing
3
+ *
4
+ * Integrates with Node.js test runner's mock API while providing
5
+ * type-safe helpers for mocking services and controllers.
6
+ *
7
+ * Supports `using` keyword for automatic cleanup:
8
+ * ```typescript
9
+ * using spied = spyOn(service);
10
+ * // ... test code ...
11
+ * // automatically restored when block exits
12
+ * ```
13
+ */
14
+ import { mock } from 'node:test';
15
+ import { inspect } from 'node:util';
16
+ import * as inspector from 'node:inspector';
17
+ // Re-export node:test mock for convenience
18
+ export { mock };
19
+ // ============================================================================
20
+ // CDP Custom Formatters (for V8-based debuggers)
21
+ // ============================================================================
22
+ /** Symbol to mark JustScale mock functions */
23
+ const MOCK_MARKER = Symbol('justscale.mock');
24
+ /** Read the mock marker metadata from an object. */
25
+ function getMockMarker(obj) {
26
+ return obj?.[MOCK_MARKER];
27
+ }
28
+ /** Set the mock marker metadata on an object. */
29
+ function setMockMarker(obj, meta) {
30
+ obj[MOCK_MARKER] = meta;
31
+ }
32
+ /** Debug logging for formatter development */
33
+ const FORMATTER_DEBUG = process.env.JUSTSCALE_FORMATTER_DEBUG === '1';
34
+ function formatterLog(...args) {
35
+ if (FORMATTER_DEBUG) {
36
+ console.log('[JustScale Mock Formatter]', ...args);
37
+ }
38
+ }
39
+ /**
40
+ * Enable custom object formatters via CDP and register our formatter.
41
+ * This works when a debugger is attached that uses Chrome DevTools Protocol.
42
+ */
43
+ function enableCustomFormatters() {
44
+ // Only run once
45
+ if (globalThis.__justscaleMockFormattersEnabled)
46
+ return;
47
+ globalThis.__justscaleMockFormattersEnabled = true;
48
+ formatterLog('Initializing custom formatters...');
49
+ try {
50
+ // Try to enable via CDP when inspector is active
51
+ const url = inspector.url();
52
+ formatterLog('Inspector URL:', url);
53
+ if (url) {
54
+ const session = new inspector.Session();
55
+ session.connect();
56
+ formatterLog('CDP session connected');
57
+ // Must enable Runtime first before setting custom formatters
58
+ session.post('Runtime.enable', {}, (enableErr) => {
59
+ if (enableErr) {
60
+ formatterLog('Runtime.enable ERROR:', enableErr);
61
+ return;
62
+ }
63
+ formatterLog('Runtime.enable SUCCESS');
64
+ session.post('Runtime.setCustomObjectFormatterEnabled', { enabled: true }, (err) => {
65
+ if (err) {
66
+ formatterLog('setCustomObjectFormatterEnabled ERROR:', err);
67
+ }
68
+ else {
69
+ formatterLog('setCustomObjectFormatterEnabled SUCCESS');
70
+ }
71
+ });
72
+ });
73
+ // Don't disconnect - keep formatter enabled
74
+ }
75
+ else {
76
+ formatterLog('No inspector URL - debugger not attached yet');
77
+ }
78
+ }
79
+ catch (e) {
80
+ formatterLog('Inspector setup failed:', e);
81
+ }
82
+ // Register devtoolsFormatters
83
+ if (typeof globalThis !== 'undefined') {
84
+ const formatters = (globalThis.devtoolsFormatters ??= []);
85
+ // Check if already registered
86
+ if (formatters.some((f) => f.__justscaleMock)) {
87
+ formatterLog('Formatter already registered');
88
+ return;
89
+ }
90
+ formatterLog('Registering devtoolsFormatters...');
91
+ formatters.push({
92
+ __justscaleMock: true,
93
+ header(obj) {
94
+ formatterLog('header() called with:', typeof obj, obj?.constructor?.name);
95
+ const meta = getMockMarker(obj);
96
+ if (!meta) {
97
+ formatterLog('header() - no MOCK_MARKER, returning null');
98
+ return null;
99
+ }
100
+ const fn = obj;
101
+ const calls = fn.mock?.callCount?.() ?? 0;
102
+ const name = meta.name || 'MockFn';
103
+ formatterLog('header() - returning formatted header for:', name, 'calls:', calls);
104
+ return [
105
+ 'span',
106
+ { style: 'color: #9c27b0; font-weight: bold;' },
107
+ `[MockFn] ${name} calls=${calls}`,
108
+ ];
109
+ },
110
+ hasBody(obj) {
111
+ const has = !!getMockMarker(obj);
112
+ formatterLog('hasBody() called, result:', has);
113
+ return has;
114
+ },
115
+ body(obj) {
116
+ formatterLog('body() called');
117
+ const meta = getMockMarker(obj);
118
+ const fn = obj;
119
+ const calls = fn.mock?.calls ?? [];
120
+ const children = [
121
+ ['div', {}, `Name: ${meta?.name || '(anonymous)'}`],
122
+ ['div', {}, `Call count: ${fn.mock?.callCount?.() ?? 0}`],
123
+ ];
124
+ if (calls.length > 0) {
125
+ children.push(['div', { style: 'margin-top: 4px;' }, 'Recent calls:']);
126
+ for (let i = Math.max(0, calls.length - 5); i < calls.length; i++) {
127
+ const call = calls[i];
128
+ children.push([
129
+ 'div',
130
+ { style: 'margin-left: 8px; font-family: monospace;' },
131
+ `[${i}] `,
132
+ ['object', { object: call.arguments }],
133
+ ]);
134
+ }
135
+ }
136
+ return ['div', { style: 'padding: 4px;' }, ...children];
137
+ },
138
+ });
139
+ formatterLog('devtoolsFormatters registered, total formatters:', formatters.length);
140
+ }
141
+ }
142
+ /**
143
+ * Manually enable custom formatters after debugger connects.
144
+ * This is opt-in — it is not called automatically on import.
145
+ * Call it early in your test setup if you want CDP-based formatting in the debugger.
146
+ *
147
+ * @example
148
+ * ```typescript
149
+ * import { enableDebuggerFormatters } from '@justscale/testing';
150
+ * enableDebuggerFormatters(); // Call early in your test
151
+ * ```
152
+ */
153
+ export function enableDebuggerFormatters() {
154
+ enableCustomFormatters();
155
+ }
156
+ // ============================================================================
157
+ // Node.js util.inspect.custom Support (for console.log)
158
+ // ============================================================================
159
+ /**
160
+ * Add custom inspect symbols to a mock function for better debugging.
161
+ * When logged or inspected, shows: [MockFn name? calls=N lastArgs=... returned=...]
162
+ */
163
+ function addMockInspect(fn, name) {
164
+ // Mark as a JustScale mock for CDP formatters
165
+ setMockMarker(fn, { name });
166
+ // Store the name for later access (used by Symbol.toStringTag getter)
167
+ fn.__mockName = name;
168
+ // Add a $mock property with a getter that shows current state in debugger
169
+ // This appears when you expand the mock in JetBrains Variables panel
170
+ Object.defineProperty(fn, '$mock', {
171
+ get() {
172
+ const calls = this.mock.callCount();
173
+ const lastCall = this.mock.calls.at(-1);
174
+ return {
175
+ name: name || '(anonymous)',
176
+ calls,
177
+ lastArgs: lastCall?.arguments,
178
+ lastResult: lastCall?.result,
179
+ lastError: lastCall?.error?.message,
180
+ };
181
+ },
182
+ enumerable: true, // Make it visible in debugger
183
+ });
184
+ // Node.js util.inspect.custom for console.log
185
+ fn[inspect.custom] = function (depth, options, inspectFn) {
186
+ const calls = this.mock.callCount();
187
+ const lastCall = this.mock.calls.at(-1);
188
+ const parts = [options.stylize('MockFn', 'special')];
189
+ if (name) {
190
+ parts.push(options.stylize(name, 'string'));
191
+ }
192
+ parts.push('calls=' + options.stylize(String(calls), 'number'));
193
+ if (lastCall) {
194
+ const argStr = inspectFn(lastCall.arguments, { ...options, depth: 1, colors: false });
195
+ parts.push('lastArgs=' + argStr);
196
+ if (lastCall.result !== undefined) {
197
+ const resultStr = inspectFn(lastCall.result, { ...options, depth: 1, colors: false });
198
+ parts.push('returned=' + resultStr);
199
+ }
200
+ if (lastCall.error) {
201
+ parts.push(options.stylize('threw=' + lastCall.error.message, 'undefined'));
202
+ }
203
+ }
204
+ return '[' + parts.join(' ') + ']';
205
+ };
206
+ // Dynamic Symbol.toStringTag for JetBrains debugger display
207
+ // Shows: MockFn(name) calls=N
208
+ Object.defineProperty(fn, Symbol.toStringTag, {
209
+ get() {
210
+ const mockName = this.__mockName;
211
+ const calls = this.mock?.callCount?.() ?? 0;
212
+ return mockName ? `MockFn(${mockName}) calls=${calls}` : `MockFn calls=${calls}`;
213
+ },
214
+ });
215
+ return fn;
216
+ }
217
+ // ============================================================================
218
+ // Service Mocking
219
+ // ============================================================================
220
+ /**
221
+ * Create a mock implementation of a service.
222
+ * Uses node:test mock functions for tracking calls and assertions.
223
+ *
224
+ * @example
225
+ * ```typescript
226
+ * const mockRepo = mockService<typeof PlayerRepository>({
227
+ * get: mock.fn(() => Promise.resolve({ id: '1', name: 'Mock' })),
228
+ * find: mock.fn(() => Promise.resolve([])),
229
+ * });
230
+ * ```
231
+ */
232
+ export function mockService(impl, name) {
233
+ const serviceName = name || 'MockedService';
234
+ const proxy = new Proxy(impl, {
235
+ get(target, prop) {
236
+ // Handle inspect symbols
237
+ if (prop === inspect.custom) {
238
+ return function (depth, options) {
239
+ const methods = Object.entries(target)
240
+ .filter(([, v]) => typeof v === 'function' && v.mock)
241
+ .map(([k, v]) => `${k}(${v.mock.callCount()})`)
242
+ .join(', ');
243
+ return options.stylize('[MockedService', 'special') +
244
+ ` ${options.stylize(serviceName, 'string')}` +
245
+ ` { ${methods} }` +
246
+ options.stylize(']', 'special');
247
+ };
248
+ }
249
+ if (prop === Symbol.toStringTag) {
250
+ return 'MockedService';
251
+ }
252
+ if (prop in target) {
253
+ return target[prop];
254
+ }
255
+ throw new Error(`Method "${String(prop)}" was not mocked`);
256
+ },
257
+ });
258
+ return proxy;
259
+ }
260
+ /**
261
+ * Create a spy wrapper around an existing service instance.
262
+ * All method calls are tracked while still calling the real implementation.
263
+ *
264
+ * Supports `using` for automatic cleanup:
265
+ * ```typescript
266
+ * using spy = spyOn(playerRepo);
267
+ * await spy.spied.get(Player.ref('123'));
268
+ * assertCallCount(spy.spied.get, 1);
269
+ * // Original methods restored when block exits
270
+ * ```
271
+ *
272
+ * @example Manual cleanup
273
+ * ```typescript
274
+ * const spy = spyOn(playerRepo);
275
+ * try {
276
+ * await spy.spied.get(Player.ref('123'));
277
+ * assertCallCount(spy.spied.get, 1);
278
+ * } finally {
279
+ * spy.restore();
280
+ * }
281
+ * ```
282
+ */
283
+ export function spyOn(instance) {
284
+ const originalMethods = new Map();
285
+ const spied = {};
286
+ const instanceName = instance.constructor?.name || 'Object';
287
+ // Spy on own properties
288
+ for (const key of Object.keys(instance)) {
289
+ const value = instance[key];
290
+ if (typeof value === 'function') {
291
+ originalMethods.set(key, value);
292
+ const fn = addMockInspect(mock.fn(value.bind(instance)), `${instanceName}.${String(key)}`);
293
+ spied[key] = fn;
294
+ // Also replace on original for in-place spying
295
+ instance[key] = fn;
296
+ }
297
+ else {
298
+ spied[key] = value;
299
+ }
300
+ }
301
+ // Spy on prototype methods
302
+ const proto = Object.getPrototypeOf(instance);
303
+ if (proto && proto !== Object.prototype) {
304
+ for (const key of Object.getOwnPropertyNames(proto)) {
305
+ if (key === 'constructor')
306
+ continue;
307
+ const descriptor = Object.getOwnPropertyDescriptor(proto, key);
308
+ if (descriptor && typeof descriptor.value === 'function' && !(key in spied)) {
309
+ originalMethods.set(key, descriptor.value);
310
+ const fn = addMockInspect(mock.fn(descriptor.value.bind(instance)), `${instanceName}.${key}`);
311
+ spied[key] = fn;
312
+ instance[key] = fn;
313
+ }
314
+ }
315
+ }
316
+ const restore = () => {
317
+ for (const [key, original] of originalMethods) {
318
+ instance[key] = original;
319
+ }
320
+ };
321
+ const reset = () => {
322
+ for (const value of Object.values(spied)) {
323
+ if (typeof value === 'function' && value.mock) {
324
+ value.mock.resetCalls();
325
+ }
326
+ }
327
+ };
328
+ const wrapper = {
329
+ spied: spied,
330
+ original: instance,
331
+ reset,
332
+ restore,
333
+ [Symbol.dispose]: restore,
334
+ };
335
+ // Add custom inspect for the wrapper itself
336
+ wrapper[inspect.custom] = function (depth, options, _inspectFn) {
337
+ const methods = Object.entries(spied)
338
+ .filter(([, v]) => typeof v === 'function' && v.mock)
339
+ .map(([k, v]) => `${k}(${v.mock.callCount()})`)
340
+ .join(', ');
341
+ return options.stylize('[SpyWrapper', 'special') +
342
+ ` ${options.stylize(instanceName, 'string')}` +
343
+ ` { ${methods} }` +
344
+ options.stylize(']', 'special');
345
+ };
346
+ Object.defineProperty(wrapper, Symbol.toStringTag, { value: 'SpyWrapper' });
347
+ return wrapper;
348
+ }
349
+ /**
350
+ * Create a spy that wraps an existing service instance.
351
+ * Returns just the spied object (simpler API, no auto-cleanup).
352
+ *
353
+ * @example
354
+ * ```typescript
355
+ * const spiedRepo = spyService(playerRepo);
356
+ * await spiedRepo.get(Player.ref('123'));
357
+ * assertCallCount(spiedRepo.get, 1);
358
+ * ```
359
+ */
360
+ export function spyService(instance) {
361
+ const spied = {};
362
+ const instanceName = instance.constructor?.name || 'Object';
363
+ for (const key of Object.keys(instance)) {
364
+ const value = instance[key];
365
+ if (typeof value === 'function') {
366
+ spied[key] = addMockInspect(mock.fn(value.bind(instance)), `${instanceName}.${String(key)}`);
367
+ }
368
+ else {
369
+ spied[key] = value;
370
+ }
371
+ }
372
+ const proto = Object.getPrototypeOf(instance);
373
+ if (proto && proto !== Object.prototype) {
374
+ for (const key of Object.getOwnPropertyNames(proto)) {
375
+ if (key === 'constructor')
376
+ continue;
377
+ const descriptor = Object.getOwnPropertyDescriptor(proto, key);
378
+ if (descriptor && typeof descriptor.value === 'function' && !(key in spied)) {
379
+ spied[key] = addMockInspect(mock.fn(descriptor.value.bind(instance)), `${instanceName}.${key}`);
380
+ }
381
+ }
382
+ }
383
+ // Add custom inspect for the spied service object
384
+ spied[inspect.custom] = function (depth, options) {
385
+ const methods = Object.entries(this)
386
+ .filter(([, v]) => typeof v === 'function' && v.mock)
387
+ .map(([k, v]) => `${k}(${v.mock.callCount()})`)
388
+ .join(', ');
389
+ return options.stylize('[SpiedService', 'special') +
390
+ ` ${options.stylize(instanceName, 'string')}` +
391
+ ` { ${methods} }` +
392
+ options.stylize(']', 'special');
393
+ };
394
+ Object.defineProperty(spied, Symbol.toStringTag, { value: 'SpiedService' });
395
+ return spied;
396
+ }
397
+ // ============================================================================
398
+ // Mock Function Helpers
399
+ // ============================================================================
400
+ /**
401
+ * Create a mock function with a specific implementation.
402
+ * @param implementation Optional function to call when the mock is invoked
403
+ * @param name Optional name for debugging (shown in console.log)
404
+ */
405
+ export function mockFn(implementation, name) {
406
+ return addMockInspect(mock.fn(implementation), name);
407
+ }
408
+ /**
409
+ * Create a mock function that returns a resolved promise.
410
+ * @param value The value to resolve with
411
+ * @param name Optional name for debugging (shown in console.log)
412
+ */
413
+ export function mockResolves(value, name) {
414
+ return addMockInspect(mock.fn(() => Promise.resolve(value)), name ?? 'resolves');
415
+ }
416
+ /**
417
+ * Create a mock function that returns a rejected promise.
418
+ * @param error The error to reject with
419
+ * @param name Optional name for debugging (shown in console.log)
420
+ */
421
+ export function mockRejects(error, name) {
422
+ return addMockInspect(mock.fn(() => Promise.reject(error)), name ?? 'rejects');
423
+ }
424
+ /**
425
+ * Create a mock function that throws an error.
426
+ * @param error The error to throw
427
+ * @param name Optional name for debugging (shown in console.log)
428
+ */
429
+ export function mockThrows(error, name) {
430
+ return addMockInspect(mock.fn(() => {
431
+ throw error;
432
+ }), name ?? 'throws');
433
+ }
434
+ // ============================================================================
435
+ // Assertion Helpers
436
+ // ============================================================================
437
+ /**
438
+ * Assert that a mock was called with specific arguments.
439
+ */
440
+ export function assertCalledWith(mockFn, ...expectedArgs) {
441
+ const calls = mockFn.mock.calls;
442
+ const found = calls.some((call) => JSON.stringify(call.arguments) === JSON.stringify(expectedArgs));
443
+ if (!found) {
444
+ const actualCalls = calls.map((c) => JSON.stringify(c.arguments)).join('\n ');
445
+ throw new Error(`Expected mock to be called with ${JSON.stringify(expectedArgs)}\n` +
446
+ `Actual calls:\n ${actualCalls || '(none)'}`);
447
+ }
448
+ }
449
+ /**
450
+ * Assert that a mock was called exactly n times.
451
+ */
452
+ export function assertCallCount(mockFn, expected) {
453
+ const actual = mockFn.mock.callCount();
454
+ if (actual !== expected) {
455
+ throw new Error(`Expected mock to be called ${expected} times, but was called ${actual} times`);
456
+ }
457
+ }
458
+ /**
459
+ * Assert that a mock was never called.
460
+ */
461
+ export function assertNotCalled(mockFn) {
462
+ assertCallCount(mockFn, 0);
463
+ }
464
+ //# sourceMappingURL=mock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock.js","sourceRoot":"","sources":["../src/mock.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,48 @@
1
+ {
2
+ "name": "@justscale/testing",
3
+ "version": "0.1.0",
4
+ "sideEffects": false,
5
+ "description": "Test utilities, mocks, and test containers for JustScale",
6
+ "author": "JustScale",
7
+ "license": "MIT",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "git+https://github.com/justscale/justscale.git",
11
+ "directory": "packages/core/testing"
12
+ },
13
+ "homepage": "https://justscale.sh",
14
+ "bugs": {
15
+ "url": "https://github.com/justscale/justscale/issues"
16
+ },
17
+ "keywords": [
18
+ "justscale",
19
+ "testing",
20
+ "mocks",
21
+ "test-container",
22
+ "typescript"
23
+ ],
24
+ "type": "module",
25
+ "publishConfig": {
26
+ "access": "public"
27
+ },
28
+ "exports": {
29
+ ".": {
30
+ "source": "./src/index.ts",
31
+ "types": "./dist/index.d.ts",
32
+ "import": "./dist/index.js",
33
+ "default": "./dist/index.js"
34
+ }
35
+ },
36
+ "files": [
37
+ "dist"
38
+ ],
39
+ "peerDependencies": {
40
+ "@justscale/core": "0.1.0"
41
+ },
42
+ "scripts": {
43
+ "build": "ptsc -b tsconfig.build.json",
44
+ "clean": "rm -rf dist",
45
+ "typecheck": "ptsc --noEmit",
46
+ "test": "tsx --test --test-timeout=10000 --test-force-exit 'test/**/*.test.ts'"
47
+ }
48
+ }