Security update for permissions_by_term
[yaffs-website] / node_modules / uncss / node_modules / qs / test / stringify.js
1 'use strict';
2
3 var test = require('tape');
4 var qs = require('../');
5
6 test('stringify()', function (t) {
7     t.test('stringifies a querystring object', function (st) {
8         st.equal(qs.stringify({ a: 'b' }), 'a=b');
9         st.equal(qs.stringify({ a: 1 }), 'a=1');
10         st.equal(qs.stringify({ a: 1, b: 2 }), 'a=1&b=2');
11         st.equal(qs.stringify({ a: 'A_Z' }), 'a=A_Z');
12         st.equal(qs.stringify({ a: '€' }), 'a=%E2%82%AC');
13         st.equal(qs.stringify({ a: '' }), 'a=%EE%80%80');
14         st.equal(qs.stringify({ a: 'א' }), 'a=%D7%90');
15         st.equal(qs.stringify({ a: '𐐷' }), 'a=%F0%90%90%B7');
16         st.end();
17     });
18
19     t.test('stringifies a nested object', function (st) {
20         st.equal(qs.stringify({ a: { b: 'c' } }), 'a%5Bb%5D=c');
21         st.equal(qs.stringify({ a: { b: { c: { d: 'e' } } } }), 'a%5Bb%5D%5Bc%5D%5Bd%5D=e');
22         st.end();
23     });
24
25     t.test('stringifies an array value', function (st) {
26         st.equal(qs.stringify({ a: ['b', 'c', 'd'] }), 'a%5B0%5D=b&a%5B1%5D=c&a%5B2%5D=d');
27         st.end();
28     });
29
30     t.test('omits nulls when asked', function (st) {
31         st.equal(qs.stringify({ a: 'b', c: null }, { skipNulls: true }), 'a=b');
32         st.end();
33     });
34
35
36     t.test('omits nested nulls when asked', function (st) {
37         st.equal(qs.stringify({ a: { b: 'c', d: null } }, { skipNulls: true }), 'a%5Bb%5D=c');
38         st.end();
39     });
40
41     t.test('omits array indices when asked', function (st) {
42         st.equal(qs.stringify({ a: ['b', 'c', 'd'] }, { indices: false }), 'a=b&a=c&a=d');
43         st.end();
44     });
45
46     t.test('stringifies a nested array value', function (st) {
47         st.equal(qs.stringify({ a: { b: ['c', 'd'] } }), 'a%5Bb%5D%5B0%5D=c&a%5Bb%5D%5B1%5D=d');
48         st.end();
49     });
50
51     t.test('stringifies an object inside an array', function (st) {
52         st.equal(qs.stringify({ a: [{ b: 'c' }] }), 'a%5B0%5D%5Bb%5D=c');
53         st.equal(qs.stringify({ a: [{ b: { c: [1] } }] }), 'a%5B0%5D%5Bb%5D%5Bc%5D%5B0%5D=1');
54         st.end();
55     });
56
57     t.test('does not omit object keys when indices = false', function (st) {
58         st.equal(qs.stringify({ a: [{ b: 'c' }] }, { indices: false }), 'a%5Bb%5D=c');
59         st.end();
60     });
61
62     t.test('uses indices notation for arrays when indices=true', function (st) {
63         st.equal(qs.stringify({ a: ['b', 'c'] }, { indices: true }), 'a%5B0%5D=b&a%5B1%5D=c');
64         st.end();
65     });
66
67     t.test('uses indices notation for arrays when no arrayFormat is specified', function (st) {
68         st.equal(qs.stringify({ a: ['b', 'c'] }), 'a%5B0%5D=b&a%5B1%5D=c');
69         st.end();
70     });
71
72     t.test('uses indices notation for arrays when no arrayFormat=indices', function (st) {
73         st.equal(qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'indices' }), 'a%5B0%5D=b&a%5B1%5D=c');
74         st.end();
75     });
76
77     t.test('uses repeat notation for arrays when no arrayFormat=repeat', function (st) {
78         st.equal(qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'repeat' }), 'a=b&a=c');
79         st.end();
80     });
81
82     t.test('uses brackets notation for arrays when no arrayFormat=brackets', function (st) {
83         st.equal(qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'brackets' }), 'a%5B%5D=b&a%5B%5D=c');
84         st.end();
85     });
86
87     t.test('stringifies a complicated object', function (st) {
88         st.equal(qs.stringify({ a: { b: 'c', d: 'e' } }), 'a%5Bb%5D=c&a%5Bd%5D=e');
89         st.end();
90     });
91
92     t.test('stringifies an empty value', function (st) {
93         st.equal(qs.stringify({ a: '' }), 'a=');
94         st.equal(qs.stringify({ a: null }, { strictNullHandling: true }), 'a');
95
96         st.equal(qs.stringify({ a: '', b: '' }), 'a=&b=');
97         st.equal(qs.stringify({ a: null, b: '' }, { strictNullHandling: true }), 'a&b=');
98
99         st.equal(qs.stringify({ a: { b: '' } }), 'a%5Bb%5D=');
100         st.equal(qs.stringify({ a: { b: null } }, { strictNullHandling: true }), 'a%5Bb%5D');
101         st.equal(qs.stringify({ a: { b: null } }, { strictNullHandling: false }), 'a%5Bb%5D=');
102
103         st.end();
104     });
105
106     t.test('stringifies an empty object', function (st) {
107         var obj = Object.create(null);
108         obj.a = 'b';
109         st.equal(qs.stringify(obj), 'a=b');
110         st.end();
111     });
112
113     t.test('returns an empty string for invalid input', function (st) {
114         st.equal(qs.stringify(undefined), '');
115         st.equal(qs.stringify(false), '');
116         st.equal(qs.stringify(null), '');
117         st.equal(qs.stringify(''), '');
118         st.end();
119     });
120
121     t.test('stringifies an object with an empty object as a child', function (st) {
122         var obj = {
123             a: Object.create(null)
124         };
125
126         obj.a.b = 'c';
127         st.equal(qs.stringify(obj), 'a%5Bb%5D=c');
128         st.end();
129     });
130
131     t.test('drops keys with a value of undefined', function (st) {
132         st.equal(qs.stringify({ a: undefined }), '');
133
134         st.equal(qs.stringify({ a: { b: undefined, c: null } }, { strictNullHandling: true }), 'a%5Bc%5D');
135         st.equal(qs.stringify({ a: { b: undefined, c: null } }, { strictNullHandling: false }), 'a%5Bc%5D=');
136         st.equal(qs.stringify({ a: { b: undefined, c: '' } }), 'a%5Bc%5D=');
137         st.end();
138     });
139
140     t.test('url encodes values', function (st) {
141         st.equal(qs.stringify({ a: 'b c' }), 'a=b%20c');
142         st.end();
143     });
144
145     t.test('stringifies a date', function (st) {
146         var now = new Date();
147         var str = 'a=' + encodeURIComponent(now.toISOString());
148         st.equal(qs.stringify({ a: now }), str);
149         st.end();
150     });
151
152     t.test('stringifies the weird object from qs', function (st) {
153         st.equal(qs.stringify({ 'my weird field': '~q1!2"\'w$5&7/z8)?' }), 'my%20weird%20field=~q1%212%22%27w%245%267%2Fz8%29%3F');
154         st.end();
155     });
156
157     t.test('skips properties that are part of the object prototype', function (st) {
158         Object.prototype.crash = 'test';
159         st.equal(qs.stringify({ a: 'b' }), 'a=b');
160         st.equal(qs.stringify({ a: { b: 'c' } }), 'a%5Bb%5D=c');
161         delete Object.prototype.crash;
162         st.end();
163     });
164
165     t.test('stringifies boolean values', function (st) {
166         st.equal(qs.stringify({ a: true }), 'a=true');
167         st.equal(qs.stringify({ a: { b: true } }), 'a%5Bb%5D=true');
168         st.equal(qs.stringify({ b: false }), 'b=false');
169         st.equal(qs.stringify({ b: { c: false } }), 'b%5Bc%5D=false');
170         st.end();
171     });
172
173     t.test('stringifies buffer values', function (st) {
174         st.equal(qs.stringify({ a: new Buffer('test') }), 'a=test');
175         st.equal(qs.stringify({ a: { b: new Buffer('test') } }), 'a%5Bb%5D=test');
176         st.end();
177     });
178
179     t.test('stringifies an object using an alternative delimiter', function (st) {
180         st.equal(qs.stringify({ a: 'b', c: 'd' }, { delimiter: ';' }), 'a=b;c=d');
181         st.end();
182     });
183
184     t.test('doesn\'t blow up when Buffer global is missing', function (st) {
185         var tempBuffer = global.Buffer;
186         delete global.Buffer;
187         var result = qs.stringify({ a: 'b', c: 'd' });
188         global.Buffer = tempBuffer;
189         st.equal(result, 'a=b&c=d');
190         st.end();
191     });
192
193     t.test('selects properties when filter=array', function (st) {
194         st.equal(qs.stringify({ a: 'b' }, { filter: ['a'] }), 'a=b');
195         st.equal(qs.stringify({ a: 1 }, { filter: [] }), '');
196         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');
197         st.end();
198     });
199
200     t.test('supports custom representations when filter=function', function (st) {
201         var calls = 0;
202         var obj = { a: 'b', c: 'd', e: { f: new Date(1257894000000) } };
203         var filterFunc = function (prefix, value) {
204             calls++;
205             if (calls === 1) {
206                 st.equal(prefix, '', 'prefix is empty');
207                 st.equal(value, obj);
208             } else if (prefix === 'c') {
209                 return;
210             } else if (value instanceof Date) {
211                 st.equal(prefix, 'e[f]');
212                 return value.getTime();
213             }
214             return value;
215         };
216
217         st.equal(qs.stringify(obj, { filter: filterFunc }), 'a=b&e%5Bf%5D=1257894000000');
218         st.equal(calls, 5);
219         st.end();
220     });
221
222     t.test('can disable uri encoding', function (st) {
223         st.equal(qs.stringify({ a: 'b' }, { encode: false }), 'a=b');
224         st.equal(qs.stringify({ a: { b: 'c' } }, { encode: false }), 'a[b]=c');
225         st.equal(qs.stringify({ a: 'b', c: null }, { strictNullHandling: true, encode: false }), 'a=b&c');
226         st.end();
227     });
228
229     t.test('can sort the keys', function (st) {
230         var sort = function (a, b) { return a.localeCompare(b); };
231         st.equal(qs.stringify({ a: 'c', z: 'y', b: 'f' }, { sort: sort }), 'a=c&b=f&z=y');
232         st.equal(qs.stringify({ a: 'c', z: { j: 'a', i: 'b' }, b: 'f' }, { sort: sort }), 'a=c&b=f&z%5Bi%5D=b&z%5Bj%5D=a');
233         st.end();
234     });
235 });