-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathobjectDeserializer.test.ts
127 lines (115 loc) · 2.89 KB
/
objectDeserializer.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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
import { DeserializationError, DeserializationPath, deserialize, ObjectDeserializer } from '..';
enum Role {
USER,
ADMIN,
}
enum Status {
ACTIVE = 'active',
BLOCKED = 'blocked',
}
type User = {
login: string;
birthday?: Date;
role: Role;
status: Status;
};
function roleMapper(v: any, path: DeserializationPath): Role {
if (typeof v !== 'string') throw new DeserializationError(path, 'Role value not a string');
switch (v as string) {
case 'USER':
return Role.USER;
case 'ADMIN':
return Role.ADMIN;
default:
throw new DeserializationError(path, `Unknown role value: ${v}`);
}
}
function userMapper(d: ObjectDeserializer): User {
return {
login: d.required('login').asString,
role: d.required('role').as(roleMapper),
birthday: d.optional('birthday')?.asDate,
status: d.required('status').asEnumValue(Status),
};
}
describe('Deserialize objects', () => {
it('Object with user', () => {
const response = {
user: {
login: 'admin',
role: 'ADMIN',
status: 'active',
},
};
const user = deserialize<User>(response, (d) => d.required('user').asObject(userMapper));
expect(user).toEqual({
login: 'admin',
role: Role.ADMIN,
status: 'active',
});
});
it('Array of users', () => {
const response = {
result: {
users: [
{
login: 'admin',
role: 'ADMIN',
status: 'active',
},
{
login: 'user',
birthday: '1990-01-01',
role: 'USER',
status: 'blocked',
},
],
},
};
const users = deserialize(response, (d) => d.required('result.users').asArrayOfObjects(userMapper));
expect(users).toEqual([
{
birthday: undefined,
login: 'admin',
role: Role.ADMIN,
status: Status.ACTIVE,
},
{
login: 'user',
role: Role.USER,
birthday: new Date('1990-01-01'),
status: Status.BLOCKED,
},
]);
});
});
describe('Deserialize array', () => {
it('All items required', () => {
const response = {
items: ['a', 'b', 'c'],
};
const obj = deserialize(response, (d) => ({
items: d.required('items').asArrayOfVals((v) => v.asString),
}));
expect(obj).toEqual(response);
});
it('Throws if required value is undefined', () => {
const response = {
items: ['a', undefined, 'c'],
};
expect(() =>
deserialize(response, (d) => ({
items: d.required('items').asArrayOfVals((v) => v.asString),
}))
).toThrowError(/Value required/);
});
it('Items is optional', () => {
const response = {
items: ['a', undefined, 'c'],
};
const obj = deserialize(response, (d) => ({
items: d.required('items').asArrayOfOptionalVals((v) => v.asString),
}));
expect(obj).toEqual(response);
});
});