Skip to content

Commit e3649d7

Browse files
Merge pull request #102 from basics/beta
Beta
2 parents 39aa30c + 71292a2 commit e3649d7

File tree

10 files changed

+171
-78
lines changed

10 files changed

+171
-78
lines changed

packages/operators/CHANGELOG.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,17 @@
11
# Project Changelog
22

3+
# [@rxjs-collection/operators-v1.0.13-beta.1](https://github.com/basics/rxjs-collection/compare/@rxjs-collection/operators-v1.0.12...@rxjs-collection/operators-v1.0.13-beta.1) (2024-11-27)
4+
5+
6+
### Bug Fixes
7+
8+
* **operators:** added error test case ([8495596](https://github.com/basics/rxjs-collection/commit/84955962d3f6bc50a6fe7e47bafaf0bcc686c231))
9+
* **operators:** cleanup ([236fb2e](https://github.com/basics/rxjs-collection/commit/236fb2e6119c4e6911cf4ec7deed9afffe6cbb04))
10+
* **operators:** log test ([14bcad4](https://github.com/basics/rxjs-collection/commit/14bcad4549391af15ec8486ecd4c6303d2ac372c))
11+
* **operators:** more readable test data ([5edeb7c](https://github.com/basics/rxjs-collection/commit/5edeb7c73d542401c92f9f30f16ac3ebe3de7088))
12+
* **operators:** refactored log ([345487e](https://github.com/basics/rxjs-collection/commit/345487e7f8aa0072c728d726a7a8517fae154330))
13+
* **operators:** strip datetimeisostring from log output ([d26ab18](https://github.com/basics/rxjs-collection/commit/d26ab186cfbc91c3e1afc7237198475192049822))
14+
315
# [@rxjs-collection/operators-v1.0.12](https://github.com/basics/rxjs-collection/compare/@rxjs-collection/operators-v1.0.11...@rxjs-collection/operators-v1.0.12) (2024-11-26)
416

517

packages/operators/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@rxjs-collection/operators",
3-
"version": "1.0.12",
3+
"version": "1.0.13-beta.1",
44
"description": "rxjs operators",
55
"license": "MIT",
66
"contributors": [

packages/operators/src/cache.test.js

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,30 @@
1+
import { mockResponse } from '#mocks/response.js';
12
import { map } from 'rxjs';
23
import { TestScheduler } from 'rxjs/testing';
3-
import { beforeEach, describe, expect, test } from 'vitest';
4+
import { afterAll, beforeAll, beforeEach, describe, expect, test, vi } from 'vitest';
45

56
import { cache } from './cache';
67
import { log } from './log';
78

89
describe('cache', () => {
910
let testScheduler;
1011

12+
beforeAll(async () => {
13+
global.Response = mockResponse();
14+
});
15+
1116
beforeEach(() => {
1217
testScheduler = new TestScheduler((actual, expected) => expect(actual).deep.equal(expected));
1318
});
1419

20+
afterAll(() => {
21+
vi.restoreAllMocks();
22+
});
23+
1524
test('default', () => {
1625
const expectedVal = {
17-
a: new Response('initial', { status: 200 }),
18-
b: new Response('updated', { status: 200 })
26+
a: new Response('initial'),
27+
b: new Response('updated')
1928
};
2029

2130
const triggerVal = [expectedVal.a, expectedVal.b];
@@ -24,8 +33,8 @@ describe('cache', () => {
2433
const stream = cold('a', { a: () => triggerVal.shift() }).pipe(
2534
map(fn => fn()),
2635
log('operators:cache:default:input'),
27-
cache({ ttl: 2 })
28-
// log('operators:cache:default:output')
36+
cache({ ttl: 2 }),
37+
log('operators:cache:default:output')
2938
);
3039

3140
const unsubA = '-^!';

packages/operators/src/log.js

Lines changed: 24 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,36 @@
11
import { bgGreen } from 'ansi-colors';
22
import debug from 'debug';
3-
import { connectable, finalize, Subject, tap } from 'rxjs';
3+
import { connectable, finalize, Observable, Subject } from 'rxjs';
44

5-
import { pipeWhen } from './when';
6-
7-
export const enableLog = tag => {
8-
debug.enable(tag);
9-
};
5+
export const enableLog = tag => debug.enable(tag);
106

117
export const log = tag => {
128
const logger = debug(tag);
139
logger.log = global.console.log.bind(console);
1410
const error = debug(`${tag}:error`);
1511

16-
return source =>
17-
source.pipe(
18-
pipeWhen(
19-
() => debug.enabled(tag),
20-
tap({
21-
subscribe: () => logger('subscribed'),
22-
unsubscribe: () => logger('unsubscribed'),
23-
finalize: () => logger('finalize'),
24-
next: val => logger(val),
25-
error: err => error(err),
26-
complete: () => logger(bgGreen.bold('complete!'))
27-
})
28-
)
29-
);
12+
if (debug.enabled(tag)) {
13+
return source => {
14+
return new Observable(observer => {
15+
return source.subscribe({
16+
next: val => {
17+
logger(val);
18+
observer.next(val);
19+
},
20+
error: err => {
21+
error(err);
22+
observer.error(err);
23+
},
24+
complete: () => {
25+
logger(bgGreen.bold('complete!'));
26+
observer.complete();
27+
}
28+
});
29+
});
30+
};
31+
}
32+
33+
return source => source;
3034
};
3135

3236
export const logResult = (tag, observable) => {
@@ -40,33 +44,3 @@ export const logResult = (tag, observable) => {
4044
).connect();
4145
});
4246
};
43-
44-
// export const log = tag => {
45-
// var logger = debug(tag);
46-
// logger.log = global.console.log.bind(console);
47-
// var error = debug(`${tag}:error`);
48-
49-
// if (debug.enabled(tag)) {
50-
// return source =>
51-
// new Observable(observer => {
52-
// source.subscribe({
53-
// subscribe: () => logger('subscribed'),
54-
// unsubscribe: () => logger('unsubscribed'),
55-
// finalize: () => logger('finalize'),
56-
// next: val => {
57-
// logger(val);
58-
// observer.next(val);
59-
// },
60-
// error: err => {
61-
// error(err);
62-
// observer.error(err);
63-
// },
64-
// complete: () => {
65-
// logger(bgGreen.bold('complete!'));
66-
// observer.complete();
67-
// }
68-
// });
69-
// });
70-
// }
71-
// return source => source;
72-
// };

packages/operators/src/log.test.js

Lines changed: 86 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,93 @@
1-
import { describe, test } from 'vitest';
1+
import { from, map } from 'rxjs';
2+
import { TestScheduler } from 'rxjs/testing';
3+
import { afterAll, beforeEach, describe, expect, test, vi } from 'vitest';
4+
5+
import { enableLog, log, logResult } from './log';
26

37
describe('log', () => {
8+
let testScheduler;
9+
10+
beforeEach(() => {
11+
testScheduler = new TestScheduler((actual, expected) => expect(actual).deep.equal(expected));
12+
});
13+
14+
afterAll(() => {
15+
vi.restoreAllMocks();
16+
});
17+
418
test('default', () => {
5-
//TODO: add test
19+
const expectedVal = {
20+
a: 'content a',
21+
b: 'content b',
22+
c: 'content c'
23+
};
24+
25+
const triggerVal = {
26+
a: () => expectedVal.a,
27+
b: () => expectedVal.b,
28+
c: () => expectedVal.c,
29+
d: () => {
30+
throw new Error('custom error');
31+
}
32+
};
33+
34+
const expected = [
35+
' operators:log:default content a',
36+
' operators:log:default content b',
37+
' operators:log:default content c'
38+
];
39+
40+
const actual = [];
41+
vi.spyOn(console, 'log').mockImplementation(v => {
42+
actual.push(replaceDateTimeISOString(stripAnsiCodes(v)));
43+
return v;
44+
});
45+
46+
enableLog('operators:log:default');
47+
testScheduler.run(({ cold, expectObservable, flush }) => {
48+
const stream = cold('a-b-c-d|', triggerVal).pipe(
49+
map(v => v()),
50+
log('operators:log:default')
51+
);
52+
expectObservable(stream).toBe('a-b-c-#', expectedVal, new Error('custom error'));
53+
flush();
54+
expect(actual).deep.equal(expected);
55+
});
656
});
757

8-
test('logResult', () => {
9-
//TODO: add test
58+
test('logResult', async () => {
59+
const actual = [];
60+
vi.spyOn(console, 'log').mockImplementation(v => {
61+
actual.push(replaceDateTimeISOString(stripAnsiCodes(v)));
62+
return v;
63+
});
64+
65+
const expectedVal = [
66+
' operators:log:result content a',
67+
' operators:log:result content b',
68+
' operators:log:result content c',
69+
' operators:log:result complete!'
70+
];
71+
72+
const triggerVal = ['content a', 'content b', 'content c'];
73+
74+
enableLog('operators:log:result');
75+
await logResult('operators:log:result', from(triggerVal));
76+
expect(actual).deep.equal(expectedVal);
1077
});
1178
});
79+
80+
const stripAnsiCodes = str => {
81+
return str.replace(
82+
// eslint-disable-next-line security/detect-unsafe-regex, no-control-regex
83+
/[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g,
84+
''
85+
);
86+
};
87+
88+
const replaceDateTimeISOString = str => {
89+
return str.replace(
90+
/^[0-9]{4}-((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01])|(0[469]|11)-(0[1-9]|[12][0-9]|30)|(02)-(0[1-9]|[12][0-9]))T(0[0-9]|1[0-9]|2[0-3]):(0[0-9]|[1-5][0-9]):(0[0-9]|[1-5][0-9])\.[0-9]{3}Z/,
91+
' '
92+
);
93+
};

packages/operators/src/request/autoPagination.test.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,11 @@ describe('auto pagination', () => {
2828
const { autoPagination } = await import('./autoPagination');
2929

3030
const expectedVal = {
31-
a: { value: 'a', next: 'b' },
32-
b: { value: 'b', next: 'c' },
33-
c: { value: 'c', next: 'd' },
34-
d: { value: 'd', next: 'e' },
35-
e: { value: 'e', next: null }
31+
a: { value: 'content a', next: 'b' },
32+
b: { value: 'content b', next: 'c' },
33+
c: { value: 'content c', next: 'd' },
34+
d: { value: 'content d', next: 'e' },
35+
e: { value: 'content e', next: null }
3636
};
3737

3838
const triggerVal = {

packages/operators/src/request/concurrentRequest.test.js

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,20 @@ describe('concurrent request', () => {
2727
test('default', async () => {
2828
const { concurrentRequest } = await import('./concurrentRequest');
2929

30+
const expectedVal = {
31+
a: 'content a',
32+
b: 'content b',
33+
c: 'content c',
34+
d: 'content d',
35+
e: 'content e'
36+
};
37+
3038
const triggerVal = {
31-
a: { t: 2, v: new Response('a') },
32-
b: { t: 5, v: new Response('b') },
33-
c: { t: 1, v: new Response('c') },
34-
d: { t: 3, v: new Response('d') },
35-
e: { t: 4, v: new Response('e') }
39+
a: { t: 2, v: new Response(expectedVal.a) },
40+
b: { t: 5, v: new Response(expectedVal.b) },
41+
c: { t: 1, v: new Response(expectedVal.c) },
42+
d: { t: 3, v: new Response(expectedVal.d) },
43+
e: { t: 4, v: new Response(expectedVal.e) }
3644
};
3745

3846
testScheduler.run(({ cold, expectObservable }) => {
@@ -43,7 +51,7 @@ describe('concurrent request', () => {
4351
resolveText(),
4452
log('operators:request:concurrent:output')
4553
)
46-
).toBe('---a--c-(bd)--(e|)');
54+
).toBe('---a--c-(bd)--(e|)', expectedVal);
4755
});
4856
});
4957
});

packages/operators/src/request/lazyPagination.test.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,11 @@ describe('lazy pagination', () => {
3838
};
3939

4040
const expectedVal = {
41-
a: { value: '1' },
42-
b: { value: '2' },
43-
c: { value: '3' },
44-
d: { value: '4' },
45-
e: { value: '5' }
41+
a: { value: 'content a' },
42+
b: { value: 'content b' },
43+
c: { value: 'content c' },
44+
d: { value: 'content d' },
45+
e: { value: 'content e' }
4646
};
4747

4848
const responseVal = {

packages/operators/src/retry.test.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { map } from 'rxjs';
22
import { TestScheduler } from 'rxjs/testing';
3-
import { beforeEach, describe, expect, test } from 'vitest';
3+
import { afterAll, beforeEach, describe, expect, test, vi } from 'vitest';
44

55
import { log } from './log';
66
import { retryWhenRequestError } from './retry';
@@ -12,6 +12,10 @@ describe('request retry', () => {
1212
testScheduler = new TestScheduler((actual, expected) => expect(actual).deep.equal(expected));
1313
});
1414

15+
afterAll(() => {
16+
vi.restoreAllMocks();
17+
});
18+
1519
test('2x error -> 1x success', () => {
1620
const expectedVal = {
1721
a: new Response('', { status: 500 }),

packages/operators/src/when.test.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { map } from 'rxjs';
22
import { TestScheduler } from 'rxjs/testing';
3-
import { beforeEach, describe, expect, test } from 'vitest';
3+
import { afterAll, beforeEach, describe, expect, test, vi } from 'vitest';
44

55
import { log } from './log';
66
import { pipeWhen } from './when';
@@ -12,6 +12,10 @@ describe('when', () => {
1212
testScheduler = new TestScheduler((actual, expected) => expect(actual).deep.equal(expected));
1313
});
1414

15+
afterAll(() => {
16+
vi.restoreAllMocks();
17+
});
18+
1519
test('default', () => {
1620
const triggerVal = {
1721
a: 1,

0 commit comments

Comments
 (0)