Skip to content

Commit ded2c78

Browse files
committed
[Tests] flesh out arrayLimit/arrayFormat tests.
Will help with #107.
1 parent 028525a commit ded2c78

File tree

2 files changed

+185
-18
lines changed

2 files changed

+185
-18
lines changed

test/parse.js

+18-9
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,15 @@ test('parse()', function (t) {
6464
st.deepEqual(qs.parse('a[]=b&a=c'), { a: ['b', 'c'] });
6565
st.deepEqual(qs.parse('a[0]=b&a=c'), { a: ['b', 'c'] });
6666
st.deepEqual(qs.parse('a=b&a[0]=c'), { a: ['b', 'c'] });
67-
st.deepEqual(qs.parse('a[1]=b&a=c'), { a: ['b', 'c'] });
68-
st.deepEqual(qs.parse('a=b&a[1]=c'), { a: ['b', 'c'] });
67+
68+
st.deepEqual(qs.parse('a[1]=b&a=c', { arrayLimit: 20 }), { a: ['b', 'c'] });
69+
st.deepEqual(qs.parse('a[]=b&a=c', { arrayLimit: 0 }), { a: ['b', 'c'] });
70+
st.deepEqual(qs.parse('a[]=b&a=c'), { a: ['b', 'c'] });
71+
72+
st.deepEqual(qs.parse('a=b&a[1]=c', { arrayLimit: 20 }), { a: ['b', 'c'] });
73+
st.deepEqual(qs.parse('a=b&a[]=c', { arrayLimit: 0 }), { a: ['b', 'c'] });
74+
st.deepEqual(qs.parse('a=b&a[]=c'), { a: ['b', 'c'] });
75+
6976
st.end();
7077
});
7178

@@ -78,13 +85,15 @@ test('parse()', function (t) {
7885
t.test('allows to specify array indices', function (st) {
7986
st.deepEqual(qs.parse('a[1]=c&a[0]=b&a[2]=d'), { a: ['b', 'c', 'd'] });
8087
st.deepEqual(qs.parse('a[1]=c&a[0]=b'), { a: ['b', 'c'] });
88+
st.deepEqual(qs.parse('a[1]=c', { arrayLimit: 20 }), { a: ['c'] });
89+
st.deepEqual(qs.parse('a[1]=c', { arrayLimit: 0 }), { a: { 1: 'c' } });
8190
st.deepEqual(qs.parse('a[1]=c'), { a: ['c'] });
8291
st.end();
8392
});
8493

85-
t.test('limits specific array indices to 20', function (st) {
86-
st.deepEqual(qs.parse('a[20]=a'), { a: ['a'] });
87-
st.deepEqual(qs.parse('a[21]=a'), { a: { '21': 'a' } });
94+
t.test('limits specific array indices to arrayLimit', function (st) {
95+
st.deepEqual(qs.parse('a[20]=a', { arrayLimit: 20 }), { a: ['a'] });
96+
st.deepEqual(qs.parse('a[21]=a', { arrayLimit: 20 }), { a: { '21': 'a' } });
8897
st.end();
8998
});
9099

@@ -209,10 +218,10 @@ test('parse()', function (t) {
209218
});
210219

211220
t.test('compacts sparse arrays', function (st) {
212-
st.deepEqual(qs.parse('a[10]=1&a[2]=2'), { a: ['2', '1'] });
213-
st.deepEqual(qs.parse('a[1][b][2][c]=1'), { a: [{ b: [{ c: '1' }] }] });
214-
st.deepEqual(qs.parse('a[1][2][3][c]=1'), { a: [[[{ c: '1' }]]] });
215-
st.deepEqual(qs.parse('a[1][2][3][c][1]=1'), { a: [[[{ c: ['1'] }]]] });
221+
st.deepEqual(qs.parse('a[10]=1&a[2]=2', { arrayLimit: 20 }), { a: ['2', '1'] });
222+
st.deepEqual(qs.parse('a[1][b][2][c]=1', { arrayLimit: 20 }), { a: [{ b: [{ c: '1' }] }] });
223+
st.deepEqual(qs.parse('a[1][2][3][c]=1', { arrayLimit: 20 }), { a: [[[{ c: '1' }]]] });
224+
st.deepEqual(qs.parse('a[1][2][3][c][1]=1', { arrayLimit: 20 }), { a: [[[{ c: ['1'] }]]] });
216225
st.end();
217226
});
218227

test/stringify.js

+167-9
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,21 @@ test('stringify()', function (t) {
3030
});
3131

3232
t.test('stringifies an array value', function (st) {
33-
st.equal(qs.stringify({ a: ['b', 'c', 'd'] }), 'a%5B0%5D=b&a%5B1%5D=c&a%5B2%5D=d');
33+
st.equal(
34+
qs.stringify({ a: ['b', 'c', 'd'] }, { arrayFormat: 'indices' }),
35+
'a%5B0%5D=b&a%5B1%5D=c&a%5B2%5D=d',
36+
'indices => indices'
37+
);
38+
st.equal(
39+
qs.stringify({ a: ['b', 'c', 'd'] }, { arrayFormat: 'brackets' }),
40+
'a%5B%5D=b&a%5B%5D=c&a%5B%5D=d',
41+
'brackets => brackets'
42+
);
43+
st.equal(
44+
qs.stringify({ a: ['b', 'c', 'd'] }),
45+
'a%5B0%5D=b&a%5B1%5D=c&a%5B2%5D=d',
46+
'default => indices'
47+
);
3448
st.end();
3549
});
3650

@@ -39,7 +53,6 @@ test('stringify()', function (t) {
3953
st.end();
4054
});
4155

42-
4356
t.test('omits nested nulls when asked', function (st) {
4457
st.equal(qs.stringify({ a: { b: 'c', d: null } }, { skipNulls: true }), 'a%5Bb%5D=c');
4558
st.end();
@@ -51,29 +64,149 @@ test('stringify()', function (t) {
5164
});
5265

5366
t.test('stringifies a nested array value', function (st) {
67+
st.equal(qs.stringify({ a: { b: ['c', 'd'] } }, { arrayFormat: 'indices' }), 'a%5Bb%5D%5B0%5D=c&a%5Bb%5D%5B1%5D=d');
68+
st.equal(qs.stringify({ a: { b: ['c', 'd'] } }, { arrayFormat: 'brackets' }), 'a%5Bb%5D%5B%5D=c&a%5Bb%5D%5B%5D=d');
5469
st.equal(qs.stringify({ a: { b: ['c', 'd'] } }), 'a%5Bb%5D%5B0%5D=c&a%5Bb%5D%5B1%5D=d');
5570
st.end();
5671
});
5772

5873
t.test('stringifies a nested array value with dots notation', function (st) {
59-
st.equal(qs.stringify({ a: { b: ['c', 'd'] } }, { allowDots: true, encode: false }), 'a.b[0]=c&a.b[1]=d');
74+
st.equal(
75+
qs.stringify(
76+
{ a: { b: ['c', 'd'] } },
77+
{ allowDots: true, encode: false, arrayFormat: 'indices' }
78+
),
79+
'a.b[0]=c&a.b[1]=d',
80+
'indices: stringifies with dots + indices'
81+
);
82+
st.equal(
83+
qs.stringify(
84+
{ a: { b: ['c', 'd'] } },
85+
{ allowDots: true, encode: false, arrayFormat: 'brackets' }
86+
),
87+
'a.b[]=c&a.b[]=d',
88+
'brackets: stringifies with dots + brackets'
89+
);
90+
st.equal(
91+
qs.stringify(
92+
{ a: { b: ['c', 'd'] } },
93+
{ allowDots: true, encode: false }
94+
),
95+
'a.b[0]=c&a.b[1]=d',
96+
'default: stringifies with dots + indices'
97+
);
6098
st.end();
6199
});
62100

63101
t.test('stringifies an object inside an array', function (st) {
64-
st.equal(qs.stringify({ a: [{ b: 'c' }] }), 'a%5B0%5D%5Bb%5D=c');
65-
st.equal(qs.stringify({ a: [{ b: { c: [1] } }] }), 'a%5B0%5D%5Bb%5D%5Bc%5D%5B0%5D=1');
102+
st.equal(
103+
qs.stringify({ a: [{ b: 'c' }] }, { arrayFormat: 'indices' }),
104+
'a%5B0%5D%5Bb%5D=c',
105+
'indices => brackets'
106+
);
107+
st.equal(
108+
qs.stringify({ a: [{ b: 'c' }] }, { arrayFormat: 'brackets' }),
109+
'a%5B%5D%5Bb%5D=c',
110+
'brackets => brackets'
111+
);
112+
st.equal(
113+
qs.stringify({ a: [{ b: 'c' }] }),
114+
'a%5B0%5D%5Bb%5D=c',
115+
'default => indices'
116+
);
117+
118+
st.equal(
119+
qs.stringify({ a: [{ b: { c: [1] } }] }, { arrayFormat: 'indices' }),
120+
'a%5B0%5D%5Bb%5D%5Bc%5D%5B0%5D=1',
121+
'indices => indices'
122+
);
123+
124+
st.equal(
125+
qs.stringify({ a: [{ b: { c: [1] } }] }, { arrayFormat: 'brackets' }),
126+
'a%5B%5D%5Bb%5D%5Bc%5D%5B%5D=1',
127+
'brackets => brackets'
128+
);
129+
130+
st.equal(
131+
qs.stringify({ a: [{ b: { c: [1] } }] }),
132+
'a%5B0%5D%5Bb%5D%5Bc%5D%5B0%5D=1',
133+
'default => indices'
134+
);
135+
66136
st.end();
67137
});
68138

69139
t.test('stringifies an array with mixed objects and primitives', function (st) {
70-
st.equal(qs.stringify({ a: [{ b: 1 }, 2, 3] }, { encode: false }), 'a[0][b]=1&a[1]=2&a[2]=3');
140+
st.equal(
141+
qs.stringify({ a: [{ b: 1 }, 2, 3] }, { encode: false, arrayFormat: 'indices' }),
142+
'a[0][b]=1&a[1]=2&a[2]=3',
143+
'indices => indices'
144+
);
145+
st.equal(
146+
qs.stringify({ a: [{ b: 1 }, 2, 3] }, { encode: false, arrayFormat: 'brackets' }),
147+
'a[][b]=1&a[]=2&a[]=3',
148+
'brackets => brackets'
149+
);
150+
st.equal(
151+
qs.stringify({ a: [{ b: 1 }, 2, 3] }, { encode: false }),
152+
'a[0][b]=1&a[1]=2&a[2]=3',
153+
'default => indices'
154+
);
155+
71156
st.end();
72157
});
73158

74159
t.test('stringifies an object inside an array with dots notation', function (st) {
75-
st.equal(qs.stringify({ a: [{ b: 'c' }] }, { allowDots: true, encode: false }), 'a[0].b=c');
76-
st.equal(qs.stringify({ a: [{ b: { c: [1] } }] }, { allowDots: true, encode: false }), 'a[0].b.c[0]=1');
160+
st.equal(
161+
qs.stringify(
162+
{ a: [{ b: 'c' }] },
163+
{ allowDots: true, encode: false, arrayFormat: 'indices' }
164+
),
165+
'a[0].b=c',
166+
'indices => indices'
167+
);
168+
st.equal(
169+
qs.stringify(
170+
{ a: [{ b: 'c' }] },
171+
{ allowDots: true, encode: false, arrayFormat: 'brackets' }
172+
),
173+
'a[].b=c',
174+
'brackets => brackets'
175+
);
176+
st.equal(
177+
qs.stringify(
178+
{ a: [{ b: 'c' }] },
179+
{ allowDots: true, encode: false }
180+
),
181+
'a[0].b=c',
182+
'default => indices'
183+
);
184+
185+
st.equal(
186+
qs.stringify(
187+
{ a: [{ b: { c: [1] } }] },
188+
{ allowDots: true, encode: false, arrayFormat: 'indices' }
189+
),
190+
'a[0].b.c[0]=1',
191+
'indices => indices'
192+
);
193+
st.equal(
194+
qs.stringify(
195+
{ a: [{ b: { c: [1] } }] },
196+
{ allowDots: true, encode: false, arrayFormat: 'brackets' }
197+
),
198+
'a[].b.c[]=1',
199+
'brackets => brackets'
200+
);
201+
st.equal(
202+
qs.stringify(
203+
{ a: [{ b: { c: [1] } }] },
204+
{ allowDots: true, encode: false }
205+
),
206+
'a[0].b.c[0]=1',
207+
'default => indices'
208+
);
209+
77210
st.end();
78211
});
79212

@@ -214,7 +347,32 @@ test('stringify()', function (t) {
214347
t.test('selects properties when filter=array', function (st) {
215348
st.equal(qs.stringify({ a: 'b' }, { filter: ['a'] }), 'a=b');
216349
st.equal(qs.stringify({ a: 1 }, { filter: [] }), '');
217-
st.equal(qs.stringify({ a: { b: [1, 2, 3, 4], c: 'd' }, c: 'f' }, { filter: ['a', 'b', 0, 2] }), 'a%5Bb%5D%5B0%5D=1&a%5Bb%5D%5B2%5D=3');
350+
351+
st.equal(
352+
qs.stringify(
353+
{ a: { b: [1, 2, 3, 4], c: 'd' }, c: 'f' },
354+
{ filter: ['a', 'b', 0, 2], arrayFormat: 'indices' }
355+
),
356+
'a%5Bb%5D%5B0%5D=1&a%5Bb%5D%5B2%5D=3',
357+
'indices => indices'
358+
);
359+
st.equal(
360+
qs.stringify(
361+
{ a: { b: [1, 2, 3, 4], c: 'd' }, c: 'f' },
362+
{ filter: ['a', 'b', 0, 2], arrayFormat: 'brackets' }
363+
),
364+
'a%5Bb%5D%5B%5D=1&a%5Bb%5D%5B%5D=3',
365+
'brackets => brackets'
366+
);
367+
st.equal(
368+
qs.stringify(
369+
{ a: { b: [1, 2, 3, 4], c: 'd' }, c: 'f' },
370+
{ filter: ['a', 'b', 0, 2] }
371+
),
372+
'a%5Bb%5D%5B0%5D=1&a%5Bb%5D%5B2%5D=3',
373+
'default => indices'
374+
);
375+
218376
st.end();
219377
});
220378

0 commit comments

Comments
 (0)