-
Notifications
You must be signed in to change notification settings - Fork 80
/
helpers.test.ts
222 lines (204 loc) · 5.18 KB
/
helpers.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
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
import {
defineConfig,
FileData,
parseRequestData,
prepare,
} from '../src/helpers'
import { QueryStringArrayFormat, RequestConfig } from '../src/types'
describe('defineConfig', () => {
test('直接返回传入的配置', () => {
const config = {} as any
expect(defineConfig(config)).toBe(config)
})
})
describe('FileData', () => {
test('正确返回原始值', () => {
;[1, '2', false, () => 1, /ddd/, {}, null].forEach(item => {
const fileData = new FileData(item)
expect(fileData.getOriginalFileData()).toBe(item)
})
})
})
describe('parseRequestData', () => {
test('正确解析出数据和文件数据', () => {
expect(
parseRequestData({
x: 1,
y: 2,
f: new FileData(__filename),
}),
).toEqual({
data: {
x: 1,
y: 2,
},
fileData: {
f: __filename,
},
})
})
test('传入非对象值时应将传入的值设为数据,且将文件数据设为空', () => {
;['', 2, false, []].forEach(item => {
expect(parseRequestData(item as any)).toEqual({
data: item,
fileData: {},
})
})
})
})
describe('prepare', () => {
test('支持解析对象请求体', () => {
expect(
prepare({ path: '/test' } as Partial<RequestConfig> as any, {
a: 1,
b: '2',
}),
).toMatchSnapshot('对象')
})
test('支持解析非对象请求体', () => {
expect(
prepare({ path: '/test' } as Partial<RequestConfig> as any, [
1,
2,
3,
{ x: false },
]),
).toMatchSnapshot('数组')
expect(
prepare({ path: '/test' } as Partial<RequestConfig> as any, true),
).toMatchSnapshot('布尔值')
})
test('支持解析带参路径', () => {
expect(
prepare(
{
path: '/test/:a/{id}',
paramNames: ['a', 'id'],
} as Partial<RequestConfig> as any,
{ a: 1, b: '2', id: 110 },
),
).toMatchSnapshot('路径参数 1')
expect(
prepare(
{
path: '/test/a_{a}/id_{id}',
paramNames: ['a', 'id'],
} as Partial<RequestConfig> as any,
{ a: 1, b: '2', id: 110 },
),
).toMatchSnapshot('路径参数 2')
expect(
prepare(
{
path: '/test/a_{a}/id_{id}/id_{id}',
paramNames: ['a', 'id'],
} as Partial<RequestConfig> as any,
{ a: 1, b: '2', id: 110 },
),
).toMatchSnapshot('路径参数 3 - 全部替换')
})
test('支持追加查询参数', () => {
expect(
prepare(
{
path: '/search',
queryNames: ['a', 'id'],
} as Partial<RequestConfig> as any,
{ a: 1, b: '2', id: 110 },
),
).toMatchSnapshot()
})
test('查询参数支持数组', () => {
expect(
prepare(
{
path: '/search',
queryNames: ['list'],
queryStringArrayFormat: QueryStringArrayFormat.brackets,
} as Partial<RequestConfig> as any,
{ list: [1, 2, 3] },
),
).toMatchSnapshot('brackets')
expect(
prepare(
{
path: '/search',
queryNames: ['list'],
queryStringArrayFormat: QueryStringArrayFormat.indices,
} as Partial<RequestConfig> as any,
{ list: [1, 2, 3] },
),
).toMatchSnapshot('indices')
expect(
prepare(
{
path: '/search',
queryNames: ['list'],
queryStringArrayFormat: QueryStringArrayFormat.repeat,
} as Partial<RequestConfig> as any,
{ list: [1, 2, 3] },
),
).toMatchSnapshot('repeat')
expect(
prepare(
{
path: '/search',
queryNames: ['list'],
queryStringArrayFormat: QueryStringArrayFormat.comma,
} as Partial<RequestConfig> as any,
{ list: [1, 2, 3] },
),
).toMatchSnapshot('comma')
expect(
prepare(
{
path: '/search',
queryNames: ['list'],
queryStringArrayFormat: QueryStringArrayFormat.json,
} as Partial<RequestConfig> as any,
{ list: [1, 2, 3] },
),
).toMatchSnapshot('json')
})
test('文件处理', async () => {
const payload = prepare(
{ path: '/test' } as Partial<RequestConfig> as any,
{
file: new FileData(
new Blob(['1'], {
type: 'text1',
}),
),
},
)
const files: any[] = []
payload.getFormData().forEach((v, k) => {
files.push([k, v])
})
for (const file of files) {
file[1] = file[1] instanceof File ? file[1].type : file[1]
}
expect(files).toMatchSnapshot('file-single')
const payload2 = prepare(
{ path: '/test' } as Partial<RequestConfig> as any,
{
file: new FileData([
new Blob(['1'], {
type: 'text1',
}),
new Blob(['2'], {
type: 'text2',
}),
]),
},
)
const files2: any[] = []
payload2.getFormData().forEach((v, k) => {
files2.push([k, v])
})
for (const file of files2) {
file[1] = file[1] instanceof File ? file[1].type : file[1]
}
expect(files2).toMatchSnapshot('file-multiple')
})
})