-
Notifications
You must be signed in to change notification settings - Fork 1
/
extra-fields.test.ts
74 lines (66 loc) · 1.78 KB
/
extra-fields.test.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
import { expect, test } from "vitest";
import { Codec, fields, map, number, string } from "../index.js";
import { run } from "../tests/helpers.js";
test("adding extra fields to records", () => {
// Want to add an extra field to a record, that doesn’t look at the input at
// all?
type Product = {
name: string;
price: number;
version: number;
};
const data: unknown = { name: "Comfortable Bed", price: 10e3 };
// Use `map` to add it:
const productCodec: Codec<Product> = map(
fields({
name: string,
price: number,
}),
{
decoder: (props) => ({ ...props, version: 1 }),
encoder: ({ version: _version, ...props }) => props,
},
);
expect(productCodec.decoder(data)).toMatchInlineSnapshot(`
{
"tag": "Valid",
"value": {
"name": "Comfortable Bed",
"price": 10000,
"version": 1,
},
}
`);
expect(
productCodec.encoder({
name: "Comfortable Bed",
price: 10000,
version: 1,
}),
).toMatchInlineSnapshot(`
{
"name": "Comfortable Bed",
"price": 10000,
}
`);
// In previous versions of tiny-decoders, another way of doing this was to add
// a decoder that always succeeds (a function that ignores its input and
// always returns the same value).
const productCodecBroken: Codec<Product> = fields({
name: string,
price: number,
version: {
decoder: () => ({ tag: "Valid", value: 1 }),
encoder: () => undefined,
},
});
// It no longer works, because all the fields you mentioned are expected to exist.
expect(run(productCodecBroken, data)).toMatchInlineSnapshot(`
At root:
Expected an object with a field called: "version"
Got: {
"name": "Comfortable Bed",
"price": 10000
}
`);
});