tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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 }