formData_test.js (7847B)
1 /* eslint-disable mozilla/no-comparison-or-assignment-inside-ok */ 2 3 function testHas() { 4 var f = new FormData(); 5 f.append("foo", "bar"); 6 f.append("another", "value"); 7 ok(f.has("foo"), "has() on existing name should be true."); 8 ok(f.has("another"), "has() on existing name should be true."); 9 ok(!f.has("nonexistent"), "has() on non-existent name should be false."); 10 } 11 12 function testGet() { 13 var f = new FormData(); 14 f.append("foo", "bar"); 15 f.append("foo", "bar2"); 16 f.append("blob", new Blob(["hey"], { type: "text/plain" })); 17 f.append("file", new File(["hey"], "testname", { type: "text/plain" })); 18 19 is(f.get("foo"), "bar", "get() on existing name should return first value"); 20 ok( 21 f.get("blob") instanceof Blob, 22 "get() on existing name should return first value" 23 ); 24 is( 25 f.get("blob").type, 26 "text/plain", 27 "get() on existing name should return first value" 28 ); 29 ok( 30 f.get("file") instanceof File, 31 "get() on existing name should return first value" 32 ); 33 is( 34 f.get("file").name, 35 "testname", 36 "get() on existing name should return first value" 37 ); 38 39 is( 40 f.get("nonexistent"), 41 null, 42 "get() on non-existent name should return null." 43 ); 44 } 45 46 function testGetAll() { 47 var f = new FormData(); 48 f.append("other", "value"); 49 f.append("foo", "bar"); 50 f.append("foo", "bar2"); 51 f.append("foo", new Blob(["hey"], { type: "text/plain" })); 52 53 var arr = f.getAll("foo"); 54 is(arr.length, 3, "getAll() should retrieve all matching entries."); 55 is(arr[0], "bar", "values should match and be in order"); 56 is(arr[1], "bar2", "values should match and be in order"); 57 ok(arr[2] instanceof Blob, "values should match and be in order"); 58 59 is( 60 f.get("nonexistent"), 61 null, 62 "get() on non-existent name should return null." 63 ); 64 } 65 66 function testDelete() { 67 var f = new FormData(); 68 f.append("other", "value"); 69 f.append("foo", "bar"); 70 f.append("foo", "bar2"); 71 f.append("foo", new Blob(["hey"], { type: "text/plain" })); 72 73 ok(f.has("foo"), "has() on existing name should be true."); 74 f.delete("foo"); 75 ok(!f.has("foo"), "has() on deleted name should be false."); 76 is(f.getAll("foo").length, 0, "all entries should be deleted."); 77 78 is(f.getAll("other").length, 1, "other names should still be there."); 79 f.delete("other"); 80 is(f.getAll("other").length, 0, "all entries should be deleted."); 81 } 82 83 function testSet() { 84 var f = new FormData(); 85 86 f.set("other", "value"); 87 ok(f.has("other"), "set() on new name should be similar to append()"); 88 is( 89 f.getAll("other").length, 90 1, 91 "set() on new name should be similar to append()" 92 ); 93 94 f.append("other", "value2"); 95 is( 96 f.getAll("other").length, 97 2, 98 "append() should not replace existing entries." 99 ); 100 101 f.append("foo", "bar"); 102 f.append("other", "value3"); 103 f.append("other", "value3"); 104 f.append("other", "value3"); 105 is( 106 f.getAll("other").length, 107 5, 108 "append() should not replace existing entries." 109 ); 110 111 f.set("other", "value4"); 112 is(f.getAll("other").length, 1, "set() should replace existing entries."); 113 is(f.getAll("other")[0], "value4", "set() should replace existing entries."); 114 } 115 116 function testFilename() { 117 var f = new FormData(); 118 f.append("blob", new Blob(["hi"])); 119 ok(f.get("blob") instanceof Blob, "We should have a blob back."); 120 121 // If a filename is passed, that should replace the original. 122 f.append("blob2", new Blob(["hi"]), "blob2.txt"); 123 is( 124 f.get("blob2").name, 125 "blob2.txt", 126 'Explicit filename should override "blob".' 127 ); 128 129 var file = new File(["hi"], "file1.txt"); 130 f.append("file1", file); 131 // If a file is passed, the "create entry" algorithm should not create a new File, but reuse the existing one. 132 is( 133 f.get("file1"), 134 file, 135 "Retrieved File object should be original File object and not a copy." 136 ); 137 is( 138 f.get("file1").name, 139 "file1.txt", 140 "File's filename should be original's name if no filename is explicitly passed." 141 ); 142 143 file = new File(["hi"], "file2.txt"); 144 f.append("file2", file, "fakename.txt"); 145 ok( 146 f.get("file2") !== file, 147 "Retrieved File object should be new File object if explicit filename is passed." 148 ); 149 is( 150 f.get("file2").name, 151 "fakename.txt", 152 "File's filename should be explicitly passed name." 153 ); 154 f.append("file3", new File(["hi"], "")); 155 is(f.get("file3").name, "", "File's filename is returned even if empty."); 156 } 157 158 function testIterable() { 159 var fd = new FormData(); 160 fd.set("1", "2"); 161 fd.set("2", "4"); 162 fd.set("3", "6"); 163 fd.set("4", "8"); 164 fd.set("5", "10"); 165 166 var key_iter = fd.keys(); 167 var value_iter = fd.values(); 168 var entries_iter = fd.entries(); 169 for (var i = 0; i < 5; ++i) { 170 var v = i + 1; 171 var key = key_iter.next(); 172 var value = value_iter.next(); 173 var entry = entries_iter.next(); 174 is(key.value, v.toString(), "Correct Key iterator: " + v.toString()); 175 ok(!key.done, "key.done is false"); 176 is( 177 value.value, 178 (v * 2).toString(), 179 "Correct Value iterator: " + (v * 2).toString() 180 ); 181 ok(!value.done, "value.done is false"); 182 is( 183 entry.value[0], 184 v.toString(), 185 "Correct Entry 0 iterator: " + v.toString() 186 ); 187 is( 188 entry.value[1], 189 (v * 2).toString(), 190 "Correct Entry 1 iterator: " + (v * 2).toString() 191 ); 192 ok(!entry.done, "entry.done is false"); 193 } 194 195 var last = key_iter.next(); 196 ok(last.done, "Nothing more to read."); 197 is(last.value, undefined, "Undefined is the last key"); 198 199 last = value_iter.next(); 200 ok(last.done, "Nothing more to read."); 201 is(last.value, undefined, "Undefined is the last value"); 202 203 last = entries_iter.next(); 204 ok(last.done, "Nothing more to read."); 205 206 key_iter = fd.keys(); 207 key_iter.next(); 208 key_iter.next(); 209 fd.delete("1"); 210 fd.delete("2"); 211 fd.delete("3"); 212 fd.delete("4"); 213 fd.delete("5"); 214 215 last = key_iter.next(); 216 ok(last.done, "Nothing more to read."); 217 is(last.value, undefined, "Undefined is the last key"); 218 } 219 220 function testSend(doneCb) { 221 var xhr = new XMLHttpRequest(); 222 xhr.open("POST", "form_submit_server.sjs"); 223 xhr.onload = function () { 224 var response = xhr.response; 225 226 for (var entry of response) { 227 is(entry.body, "hey"); 228 is(entry.headers["Content-Type"], "text/plain"); 229 } 230 231 is( 232 response[0].headers["Content-Disposition"], 233 'form-data; name="empty"; filename="blob"' 234 ); 235 236 is( 237 response[1].headers["Content-Disposition"], 238 'form-data; name="explicit"; filename="explicit-file-name"' 239 ); 240 241 is( 242 response[2].headers["Content-Disposition"], 243 'form-data; name="explicit-empty"; filename=""' 244 ); 245 246 is( 247 response[3].headers["Content-Disposition"], 248 'form-data; name="file-name"; filename="testname"' 249 ); 250 251 is( 252 response[4].headers["Content-Disposition"], 253 'form-data; name="empty-file-name"; filename=""' 254 ); 255 256 is( 257 response[5].headers["Content-Disposition"], 258 'form-data; name="file-name-overwrite"; filename="overwrite"' 259 ); 260 261 doneCb(); 262 }; 263 264 var file, 265 blob = new Blob(["hey"], { type: "text/plain" }); 266 267 var fd = new FormData(); 268 fd.append("empty", blob); 269 fd.append("explicit", blob, "explicit-file-name"); 270 fd.append("explicit-empty", blob, ""); 271 file = new File([blob], "testname", { type: "text/plain" }); 272 fd.append("file-name", file); 273 file = new File([blob], "", { type: "text/plain" }); 274 fd.append("empty-file-name", file); 275 file = new File([blob], "testname", { type: "text/plain" }); 276 fd.append("file-name-overwrite", file, "overwrite"); 277 xhr.responseType = "json"; 278 xhr.send(fd); 279 } 280 281 function runTest(doneCb) { 282 testHas(); 283 testGet(); 284 testGetAll(); 285 testDelete(); 286 testSet(); 287 testFilename(); 288 testIterable(); 289 // Finally, send an XHR and verify the response matches. 290 testSend(doneCb); 291 }