Skip to content

Commit 57d15c1

Browse files
author
Elias Mulhall
committed
Add logged decoder failures test example
1 parent 466e15a commit 57d15c1

File tree

1 file changed

+46
-0
lines changed

1 file changed

+46
-0
lines changed

test/logged-failures.test.ts

+46
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import {Decoder, DecoderError, Result, number, array, result} from '../src/index';
2+
3+
type Logger<E> = (err: E) => void;
4+
5+
const logError = <T>(logger: Logger<DecoderError>, decoder: Decoder<T>): Decoder<T> =>
6+
decoder.mapError(e => {
7+
logger(e);
8+
return e;
9+
});
10+
11+
const loggedArrayDecoder = <T>(decoder: Decoder<T>, logger: Logger<DecoderError>): Decoder<T[]> => {
12+
const logged = <U>(d: Decoder<U>) => logError(logger, d);
13+
return logged(array(result(logged(decoder)))).map(Result.successes);
14+
};
15+
16+
const makeLogger = () => {
17+
const log: string[] = [];
18+
const logger = ({message}: DecoderError) => log.push(message);
19+
return {log, logger};
20+
};
21+
22+
describe('decode valid array members and log invalid members', () => {
23+
it('succeeds on valid input', () => {
24+
const {log, logger} = makeLogger();
25+
const r = loggedArrayDecoder(number(), logger).run([1, 2, 3, 4]);
26+
expect(r).toEqual({ok: true, result: [1, 2, 3, 4]});
27+
expect(log).toEqual([]);
28+
});
29+
30+
it('succeeds on valid array members while logging and filtering invalid ones', () => {
31+
const {log, logger} = makeLogger();
32+
const r = loggedArrayDecoder(number(), logger).run([true, [], 999]);
33+
expect(r).toEqual({ok: true, result: [999]});
34+
expect(log).toEqual(['expected a number, got a boolean', 'expected a number, got an array']);
35+
});
36+
37+
it('failes on non-array json and logs the failure', () => {
38+
const {log, logger} = makeLogger();
39+
const r = loggedArrayDecoder(number(), logger).run(5);
40+
expect(r).toMatchObject({
41+
ok: false,
42+
error: {at: 'input', message: 'expected an array, got a number'}
43+
});
44+
expect(log).toEqual(['expected an array, got a number']);
45+
});
46+
});

0 commit comments

Comments
 (0)