socketioMEANseed/server/node_modules/qs/test/stringify.js
server/node_modules/qs/test/stringify.jsRaw
1// Load modules
2
3var Lab = require('lab');
4var Qs = require('../');
5
6
7// Declare internals
8
9var internals = {};
10
11
12// Test shortcuts
13
14var lab = exports.lab = Lab.script();
15var expect = Lab.expect;
16var describe = lab.experiment;
17var it = lab.test;
18
19
20describe('stringify()', function () {
21
22 it('stringifies a querystring object', function (done) {
23
24 expect(Qs.stringify({ a: 'b' })).to.equal('a=b');
25 expect(Qs.stringify({ a: 1 })).to.equal('a=1');
26 expect(Qs.stringify({ a: 1, b: 2 })).to.equal('a=1&b=2');
27 done();
28 });
29
30 it('stringifies a nested object', function (done) {
31
32 expect(Qs.stringify({ a: { b: 'c' } })).to.equal('a%5Bb%5D=c');
33 expect(Qs.stringify({ a: { b: { c: { d: 'e' } } } })).to.equal('a%5Bb%5D%5Bc%5D%5Bd%5D=e');
34 done();
35 });
36
37 it('stringifies an array value', function (done) {
38
39 expect(Qs.stringify({ a: ['b', 'c', 'd'] })).to.equal('a%5B0%5D=b&a%5B1%5D=c&a%5B2%5D=d');
40 done();
41 });
42
43 it('omits array indices when asked', function (done) {
44
45 expect(Qs.stringify({ a: ['b', 'c', 'd'] }, { indices: false })).to.equal('a=b&a=c&a=d');
46 done();
47 });
48
49 it('stringifies a nested array value', function (done) {
50
51 expect(Qs.stringify({ a: { b: ['c', 'd'] } })).to.equal('a%5Bb%5D%5B0%5D=c&a%5Bb%5D%5B1%5D=d');
52 done();
53 });
54
55 it('stringifies an object inside an array', function (done) {
56
57 expect(Qs.stringify({ a: [{ b: 'c' }] })).to.equal('a%5B0%5D%5Bb%5D=c');
58 expect(Qs.stringify({ a: [{ b: { c: [1] } }] })).to.equal('a%5B0%5D%5Bb%5D%5Bc%5D%5B0%5D=1');
59 done();
60 });
61
62 it('does not omit object keys when indices = false', function (done) {
63
64 expect(Qs.stringify({ a: [{ b: 'c' }] }, { indices: false })).to.equal('a%5Bb%5D=c');
65 done();
66 });
67
68 it('stringifies a complicated object', function (done) {
69
70 expect(Qs.stringify({ a: { b: 'c', d: 'e' } })).to.equal('a%5Bb%5D=c&a%5Bd%5D=e');
71 done();
72 });
73
74 it('stringifies an empty value', function (done) {
75
76 expect(Qs.stringify({ a: '' })).to.equal('a=');
77 expect(Qs.stringify({ a: '', b: '' })).to.equal('a=&b=');
78 expect(Qs.stringify({ a: null })).to.equal('a=');
79 expect(Qs.stringify({ a: { b: null } })).to.equal('a%5Bb%5D=');
80 done();
81 });
82
83 it('stringifies an empty object', function (done) {
84
85 var obj = Object.create(null);
86 obj.a = 'b';
87 expect(Qs.stringify(obj)).to.equal('a=b');
88 done();
89 });
90
91 it('returns an empty string for invalid input', function (done) {
92
93 expect(Qs.stringify(undefined)).to.equal('');
94 expect(Qs.stringify(false)).to.equal('');
95 expect(Qs.stringify(null)).to.equal('');
96 expect(Qs.stringify('')).to.equal('');
97 done();
98 });
99
100 it('stringifies an object with an empty object as a child', function (done) {
101
102 var obj = {
103 a: Object.create(null)
104 };
105
106 obj.a.b = 'c';
107 expect(Qs.stringify(obj)).to.equal('a%5Bb%5D=c');
108 done();
109 });
110
111 it('drops keys with a value of undefined', function (done) {
112
113 expect(Qs.stringify({ a: undefined })).to.equal('');
114 expect(Qs.stringify({ a: { b: undefined, c: null } })).to.equal('a%5Bc%5D=');
115 done();
116 });
117
118 it('url encodes values', function (done) {
119
120 expect(Qs.stringify({ a: 'b c' })).to.equal('a=b%20c');
121 done();
122 });
123
124 it('stringifies a date', function (done) {
125
126 var now = new Date();
127 var str = 'a=' + encodeURIComponent(now.toISOString());
128 expect(Qs.stringify({ a: now })).to.equal(str);
129 done();
130 });
131
132 it('stringifies the weird object from qs', function (done) {
133
134 expect(Qs.stringify({ 'my weird field': 'q1!2"\'w$5&7/z8)?' })).to.equal('my%20weird%20field=q1!2%22\'w%245%267%2Fz8)%3F');
135 done();
136 });
137
138 it('skips properties that are part of the object prototype', function (done) {
139
140 Object.prototype.crash = 'test';
141 expect(Qs.stringify({ a: 'b'})).to.equal('a=b');
142 expect(Qs.stringify({ a: { b: 'c' } })).to.equal('a%5Bb%5D=c');
143 delete Object.prototype.crash;
144 done();
145 });
146
147 it('stringifies boolean values', function (done) {
148
149 expect(Qs.stringify({ a: true })).to.equal('a=true');
150 expect(Qs.stringify({ a: { b: true } })).to.equal('a%5Bb%5D=true');
151 expect(Qs.stringify({ b: false })).to.equal('b=false');
152 expect(Qs.stringify({ b: { c: false } })).to.equal('b%5Bc%5D=false');
153 done();
154 });
155
156 it('stringifies buffer values', function (done) {
157
158 expect(Qs.stringify({ a: new Buffer('test') })).to.equal('a=test');
159 expect(Qs.stringify({ a: { b: new Buffer('test') } })).to.equal('a%5Bb%5D=test');
160 done();
161 });
162
163 it('stringifies an object using an alternative delimiter', function (done) {
164
165 expect(Qs.stringify({ a: 'b', c: 'd' }, { delimiter: ';' })).to.equal('a=b;c=d');
166 done();
167 });
168
169 it('doesn\'t blow up when Buffer global is missing', function (done) {
170
171 var tempBuffer = global.Buffer;
172 delete global.Buffer;
173 expect(Qs.stringify({ a: 'b', c: 'd' })).to.equal('a=b&c=d');
174 global.Buffer = tempBuffer;
175 done();
176 });
177});