Skip to content

Commit f660406

Browse files
feat(json): add sync-promise-js dependency and mock implementation for Promise
1 parent 94784d7 commit f660406

File tree

4 files changed

+68
-42
lines changed

4 files changed

+68
-42
lines changed

package-lock.json

Lines changed: 8 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/mocks/Promise.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
import SyncPromise from 'sync-promise-js';
2+
import { vi } from 'vitest';
3+
4+
export const mockPromise = () => vi.stubGlobal('Promise', SyncPromise);

packages/operators/package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@
2828
"debug": "^4.3.7",
2929
"fast-equals": "5.0.1",
3030
"minimatch": "^10.0.1",
31-
"rxjs": "7.8.1"
31+
"rxjs": "7.8.1",
32+
"sync-promise-js": "^1.0.0"
3233
},
3334
"devDependencies": {
3435
"node-fetch": "3.3.2"

packages/operators/src/json.test.js

Lines changed: 54 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,32 @@
1+
import { mockPromise } from '#mocks/Promise.js';
12
import { Buffer } from 'node:buffer';
23
import { readFile } from 'node:fs/promises';
34
import { lastValueFrom, map, of } from 'rxjs';
45
import { TestScheduler } from 'rxjs/testing';
5-
import { afterAll, beforeEach, describe, expect, test, vi } from 'vitest';
6+
import { afterAll, beforeAll, beforeEach, afterEach, describe, expect, test, vi } from 'vitest';
67

7-
import { deserialize, serialize } from './json';
8-
9-
describe('log', () => {
8+
describe('json', () => {
109
let testScheduler;
1110

11+
beforeAll(() => {
12+
mockPromise();
13+
});
14+
1215
beforeEach(() => {
1316
testScheduler = new TestScheduler((actual, expected) => expect(actual).deep.equal(expected));
1417
});
1518

19+
afterEach(() => {
20+
//
21+
});
22+
1623
afterAll(() => {
1724
vi.restoreAllMocks();
25+
vi.unstubAllGlobals();
1826
});
1927

2028
test('boolean - serialize', async () => {
2129
const { serialize } = await import('./json');
22-
2330
const triggerVal = { a: true, b: false };
2431
const expectedVal = { a: 'true', b: 'false' };
2532

@@ -163,11 +170,16 @@ describe('log', () => {
163170
test('symbol - deserialize', async () => {
164171
const { deserialize } = await import('./json');
165172

166-
const triggerVal = { a: '"gSymbol(bar)"' };
167-
const expectedVal = { a: Symbol.for('bar') };
173+
const triggerVal = { a: '"gSymbol(bar)"', b: '"Symbol(foo)"' };
174+
const expectedVal = { a: Symbol, b: Symbol };
168175

169176
testScheduler.run(({ cold, expectObservable }) => {
170-
expectObservable(cold('a|', triggerVal).pipe(deserialize())).toBe('a|', expectedVal);
177+
expectObservable(
178+
cold('ab|', triggerVal).pipe(
179+
deserialize(),
180+
map(value => value.constructor)
181+
)
182+
).toBe('ab|', expectedVal);
171183
});
172184
});
173185

@@ -273,6 +285,32 @@ describe('log', () => {
273285
});
274286
});
275287

288+
test('promise - serialize', async () => {
289+
const { serialize } = await import('./json');
290+
291+
const triggerVal = {
292+
a: Promise.resolve({
293+
boolean: Promise.resolve(true),
294+
string: Promise.resolve('hello world'),
295+
integer: Promise.resolve(42),
296+
float: Promise.resolve(4.2),
297+
bigInt: Promise.resolve(BigInt(42)),
298+
url: Promise.resolve(new URL('https://www.example.com/')),
299+
date: Promise.resolve(new Date(2025, 2, 8, 14, 42, 27, 357)),
300+
regexp: Promise.resolve(/[\w?\s]+/gm),
301+
symbol: Promise.resolve(Symbol.for('bar'))
302+
})
303+
};
304+
305+
const expectedVal = {
306+
a: '{"boolean":true,"string":"hello world","integer":42,"float":4.2,"bigInt":"42n","url":"https://www.example.com/","date":"2025-03-08T13:42:27.357Z","regexp":"/[\\\\w?\\\\s]+/gm","symbol":"gSymbol(bar)"}'
307+
};
308+
309+
testScheduler.run(({ cold, expectObservable }) => {
310+
expectObservable(cold('a|', triggerVal).pipe(serialize())).toBe('a|', expectedVal);
311+
});
312+
});
313+
276314
test('observable - serialize', async () => {
277315
const { serialize } = await import('./json');
278316

@@ -298,32 +336,6 @@ describe('log', () => {
298336
});
299337
});
300338

301-
test('observable - deserialize', async () => {
302-
const { deserialize } = await import('./json');
303-
304-
const triggerVal = {
305-
a: '{"boolean":true,"string":"hello world","integer":42,"float":4.2,"bigInt":"42n","url":"https://www.example.com/","date":"2025-03-08T13:42:27.357Z","regexp":"/[\\\\w?\\\\s]+/gm","symbol":"gSymbol(bar)"}'
306-
};
307-
308-
const expectedVal = {
309-
a: {
310-
boolean: true,
311-
string: 'hello world',
312-
integer: 42,
313-
float: 4.2,
314-
bigInt: BigInt(42),
315-
url: new URL('https://www.example.com/'),
316-
date: new Date(2025, 2, 8, 14, 42, 27, 357),
317-
regexp: /[\w?\s]+/gm,
318-
symbol: Symbol.for('bar')
319-
}
320-
};
321-
322-
testScheduler.run(({ cold, expectObservable }) => {
323-
expectObservable(cold('a|', triggerVal).pipe(deserialize())).toBe('a|', expectedVal);
324-
});
325-
});
326-
327339
test('mixed - serialize', async () => {
328340
const { serialize } = await import('./json');
329341

@@ -349,11 +361,12 @@ describe('log', () => {
349361
/[\w?\s]+/gm,
350362
Symbol.for('bar')
351363
]),
352-
observable: of('foo bar')
364+
observable: of('foo bar'),
365+
promise: Promise.resolve('test')
353366
}
354367
};
355368
const expectedVal = {
356-
a: '{"boolean":true,"string":"hello world","integer":42,"float":4.2,"bigInt":"42n","url":"https://www.example.com/","date":"2025-03-08T13:42:27.357Z","regexp":"/[\\\\w?\\\\s]+/gm","symbol":"gSymbol(bar)","array":[true,"hello world",42,4.2,"42n","https://www.example.com/","2025-03-08T13:42:27.357Z","/[\\\\w?\\\\s]+/gm","gSymbol(bar)"],"observable":"foo bar"}'
369+
a: '{"boolean":true,"string":"hello world","integer":42,"float":4.2,"bigInt":"42n","url":"https://www.example.com/","date":"2025-03-08T13:42:27.357Z","regexp":"/[\\\\w?\\\\s]+/gm","symbol":"gSymbol(bar)","array":[true,"hello world",42,4.2,"42n","https://www.example.com/","2025-03-08T13:42:27.357Z","/[\\\\w?\\\\s]+/gm","gSymbol(bar)"],"observable":"foo bar","promise":"test"}'
357370
};
358371

359372
testScheduler.run(({ cold, expectObservable }) => {
@@ -365,7 +378,7 @@ describe('log', () => {
365378
const { deserialize } = await import('./json');
366379

367380
const triggerVal = {
368-
a: '{"boolean":true,"string":"hello world","integer":42,"float":4.2,"bigInt":"42n","url":"https://www.example.com/","date":"2025-03-08T13:42:27.357Z","regexp":"/[\\\\w?\\\\s]+/gm","symbol":"gSymbol(bar)","array":[true,"hello world",42,4.2,"42n","https://www.example.com/","2025-03-08T13:42:27.357Z","/[\\\\w?\\\\s]+/gm","gSymbol(bar)"],"observable":"foo bar"}'
381+
a: '{"boolean":true,"string":"hello world","integer":42,"float":4.2,"bigInt":"42n","url":"https://www.example.com/","date":"2025-03-08T13:42:27.357Z","regexp":"/[\\\\w?\\\\s]+/gm","symbol":"gSymbol(bar)","array":[true,"hello world",42,4.2,"42n","https://www.example.com/","2025-03-08T13:42:27.357Z","/[\\\\w?\\\\s]+/gm","gSymbol(bar)"],"observable":"foo bar","promise":"test"}'
369382
};
370383

371384
const expectedVal = {
@@ -390,7 +403,8 @@ describe('log', () => {
390403
/[\w?\s]+/gm,
391404
Symbol.for('bar')
392405
],
393-
observable: 'foo bar'
406+
observable: 'foo bar',
407+
promise: 'test'
394408
}
395409
};
396410

@@ -401,6 +415,8 @@ describe('log', () => {
401415

402416
/* v8 ignore start */
403417
test.skip('default', async () => {
418+
const { serialize, deserialize } = await import('./json');
419+
404420
const replacer = [
405421
{
406422
validator: value => value?.constructor === Buffer,

0 commit comments

Comments
 (0)