UNPKG

6.69 kBJavaScriptView Raw
1// Filename: form-urlencoded.spec.js
2// Timestamp: 2017.07.05-02:33:29 (last modified)
3// Author(s): bumblehead <chris@bumblehead.com>
4
5var formurlencoded = require('../').default;
6
7// tests assume behaviour not given in ecmascript specification,
8// object properties accessed in 'order'
9
10describe("formurlencoded.encode", () => {
11
12 var obj = {
13 str: 'val',
14 num: 0,
15 arr: [3, { prop: false }, 1, null, 6],
16 obj: { prop1: null, prop2: ['elem'] }
17 };
18
19 console.log(`
20var formurlencoded = require('form-urlencoded');
21var obj = {
22 str : 'val',
23 num : 0,
24 arr : [3, {prop : false}, 1, null, 6],
25 obj : {prop1 : null, prop2 : ['elem']}
26};
27
28console.log(formurlencoded(obj));
29${formurlencoded(obj).match(/(.{1,53})/g).map(n => '// ' + n).join('\n')}
30
31console.log(formurlencoded(obj, {
32 ignorenull : true,
33 skipIndex : true,
34 sorted : true
35}));
36${formurlencoded(obj, {
37 ignorenull: true,
38 skipIndex: true,
39 sorted: true
40 }).match(/(.{1,53})/g).map(n => '// ' + n).join('\n')}`);
41
42 it("should return encoded data", () =>
43 expect(
44 formurlencoded({
45 propStr1: 'str1',
46 propStr2: 'str2'
47 }), { sorted: true }
48 ).toBe('propStr1=str1&propStr2=str2'));
49
50 it("should return encoded data, with array properties", () =>
51 expect(
52 formurlencoded({
53 propStr1: 'str1',
54 propStr2: 'str2',
55 propArr1: ['arrStr1', 'arrStr2']
56 })
57 ).toBe('propStr1=str1&propStr2=str2&propArr1%5B0%5D=arrStr1&propArr1%5B1%5D=arrStr2'));
58
59 it("should return encoded data, with object properties", () =>
60 expect(
61 formurlencoded({
62 propStr1: 'str1',
63 propStr2: 'str2',
64 propObj1: {
65 objPropStr1: 'objStr1',
66 objPropStr2: 'objStr2'
67 }
68 })
69 ).toBe('propStr1=str1&propStr2=str2&propObj1%5BobjPropStr1%5D=objStr1&propObj1%5BobjPropStr2%5D=objStr2'));
70
71 it("should return encoded data, with mixed object and array properties", () =>
72 expect(formurlencoded({
73 propStr1: 'str1',
74 propStr2: 'str2',
75 propObj1: {
76 objPropStr1: 'objStr1',
77 objPropStr2: 'objStr2',
78 objPropObj1: {
79 propObj1Str1: 'obj1Str1'
80 },
81 objPropArr1: [{
82 propArr1Obj1Str1: 'obj1Str1'
83 }, {
84 propArr1Obj2Str1: 'obj2Str1'
85 }]
86 }
87 })).toBe('propStr1=str1&propStr2=str2&propObj1%5BobjPropStr1%5D=objStr1&propObj1%5BobjPropStr2%5D=objStr2&propObj1%5BobjPropObj1%5D%5BpropObj1Str1%5D=obj1Str1&propObj1%5BobjPropArr1%5D%5B0%5D%5BpropArr1Obj1Str1%5D=obj1Str1&propObj1%5BobjPropArr1%5D%5B1%5D%5BpropArr1Obj2Str1%5D=obj2Str1'));
88
89 it("should return encoded data, with numbers", () =>
90 expect(
91 formurlencoded({ propArr1: [1, 2, 3] })
92 ).toBe('propArr1%5B0%5D=1&propArr1%5B1%5D=2&propArr1%5B2%5D=3'));
93
94 it("should return encoded data, with booleans", () =>
95 expect(
96 formurlencoded({ propArr1: [true, false, true] })
97 ).toBe('propArr1%5B0%5D=true&propArr1%5B1%5D=false&propArr1%5B2%5D=true'));
98
99 it("should return encoded data, with null", () =>
100 expect(
101 formurlencoded({
102 propNull1: null,
103 propStr1: 'str1'
104 })
105 ).toBe('propNull1=null&propStr1=str1'));
106
107 it("should return encoded data, with properties sorted", () =>
108 expect(
109 formurlencoded({ c: 4, b: { z: 3, y: 2 }, a: 1 }, { sorted: true })
110 ).toBe('a=1&b%5By%5D=2&b%5Bz%5D=3&c=4'));
111
112 it("should not break when null argument is given", () => {
113 expect(
114 formurlencoded(null, { sorted: true })
115 ).toBe(null);
116
117 expect(
118 formurlencoded(undefined, { sorted: true })
119 ).toBe(undefined);
120 });
121
122 it("should properly encode all ascii characters", () => {
123 var testCharEncodingString = "";
124 for (var i = 0; i < 256; i++) {
125 testCharEncodingString += String.fromCharCode(i);
126 }
127
128 expect(
129 formurlencoded({
130 test: testCharEncodingString
131 })
132 ).toBe(
133 'test=%00%01%02%03%04%05%06%07%08%09%0A%0B%0C%0D%0E%0F%10%11%12%13%14%15%16%17%18%19%1A%1B%1C%1D%1E%1F+%21%22%23%24%25%26%27%28%29%2A%2B%2C-.%2F0123456789%3A%3B%3C%3D%3E%3F%40ABCDEFGHIJKLMNOPQRSTUVWXYZ%5B%5C%5D%5E_%60abcdefghijklmnopqrstuvwxyz%7B%7C%7D%7E%7F%C2%80%C2%81%C2%82%C2%83%C2%84%C2%85%C2%86%C2%87%C2%88%C2%89%C2%8A%C2%8B%C2%8C%C2%8D%C2%8E%C2%8F%C2%90%C2%91%C2%92%C2%93%C2%94%C2%95%C2%96%C2%97%C2%98%C2%99%C2%9A%C2%9B%C2%9C%C2%9D%C2%9E%C2%9F%C2%A0%C2%A1%C2%A2%C2%A3%C2%A4%C2%A5%C2%A6%C2%A7%C2%A8%C2%A9%C2%AA%C2%AB%C2%AC%C2%AD%C2%AE%C2%AF%C2%B0%C2%B1%C2%B2%C2%B3%C2%B4%C2%B5%C2%B6%C2%B7%C2%B8%C2%B9%C2%BA%C2%BB%C2%BC%C2%BD%C2%BE%C2%BF%C3%80%C3%81%C3%82%C3%83%C3%84%C3%85%C3%86%C3%87%C3%88%C3%89%C3%8A%C3%8B%C3%8C%C3%8D%C3%8E%C3%8F%C3%90%C3%91%C3%92%C3%93%C3%94%C3%95%C3%96%C3%97%C3%98%C3%99%C3%9A%C3%9B%C3%9C%C3%9D%C3%9E%C3%9F%C3%A0%C3%A1%C3%A2%C3%A3%C3%A4%C3%A5%C3%A6%C3%A7%C3%A8%C3%A9%C3%AA%C3%AB%C3%AC%C3%AD%C3%AE%C3%AF%C3%B0%C3%B1%C3%B2%C3%B3%C3%B4%C3%B5%C3%B6%C3%B7%C3%B8%C3%B9%C3%BA%C3%BB%C3%BC%C3%BD%C3%BE%C3%BF'
134 );
135 });
136
137 it("should return encoded data, without null", () =>
138 expect(
139 formurlencoded({ propArr1: [null, null, 1] }, { ignorenull: true })
140 ).toBe('propArr1%5B2%5D=1'));
141
142 it("should return encoded empty array", () =>
143 expect(
144 formurlencoded({
145 emptyArr: []
146 })
147 ).toBe('emptyArr%5B%5D'));
148
149 it("should return encoded empty array inside an object", () =>
150 expect(
151 formurlencoded({
152 parent: {
153 foo: 'bar',
154 emptyArr: []
155 }
156 })
157 ).toBe('parent%5Bfoo%5D=bar&parent%5BemptyArr%5D%5B%5D'));
158
159 it("should return encoded array inside an object with index", () =>
160 expect(
161 formurlencoded({
162 parent: {
163 foo: 'bar',
164 emptyArr: ['first', 'second']
165 }
166 })
167 ).toBe('parent%5Bfoo%5D=bar&parent%5BemptyArr%5D%5B0%5D=first&parent%5BemptyArr%5D%5B1%5D=second'));
168
169 it("should return encoded array inside an object without index", () =>
170 expect(
171 formurlencoded({
172 parent: {
173 foo: 'bar',
174 emptyArr: ['first', 'second']
175 }
176 }, { skipIndex: true })
177 ).toBe('parent%5Bfoo%5D=bar&parent%5BemptyArr%5D%5B%5D=first&parent%5BemptyArr%5D%5B%5D=second'));
178
179 it("should return array with index", () =>
180 expect(
181 formurlencoded({
182 key: ['val1']
183 })
184 ).toBe('key%5B0%5D=val1'));
185
186 it("should return array without index", () =>
187 expect(
188 formurlencoded({
189 key: ['val1']
190 }, { skipIndex: true })
191 ).toBe('key%5B%5D=val1'));
192
193 it("should return encoded urls with unicode characters", () =>
194 expect(
195 formurlencoded({
196 parent: {
197 foo: '😀'
198 }
199 })
200 ).toBe('parent%5Bfoo%5D=%F0%9F%98%80'));
201});