summaryrefslogtreecommitdiff
path: root/test/parallel/test-whatwg-url-custom-searchparams-constructor.js
blob: fd7cc51127903329508956f92ba5d0891666cec0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
'use strict';

// Tests below are not from WPT.

const common = require('../common');
const assert = require('assert');
const URLSearchParams = require('url').URLSearchParams;

function makeIterableFunc(array) {
  return Object.assign(() => {}, {
    [Symbol.iterator]() {
      return array[Symbol.iterator]();
    }
  });
}

{
  const iterableError = common.expectsError({
    code: 'ERR_ARG_NOT_ITERABLE',
    type: TypeError,
    message: 'Query pairs must be iterable'
  });
  const tupleError = common.expectsError({
    code: 'ERR_INVALID_TUPLE',
    type: TypeError,
    message: 'Each query pair must be an iterable [name, value] tuple'
  }, 6);

  let params;
  params = new URLSearchParams(undefined);
  assert.strictEqual(params.toString(), '');
  params = new URLSearchParams(null);
  assert.strictEqual(params.toString(), '');
  params = new URLSearchParams(
    makeIterableFunc([['key', 'val'], ['key2', 'val2']])
  );
  assert.strictEqual(params.toString(), 'key=val&key2=val2');
  params = new URLSearchParams(
    makeIterableFunc([['key', 'val'], ['key2', 'val2']].map(makeIterableFunc))
  );
  assert.strictEqual(params.toString(), 'key=val&key2=val2');
  assert.throws(() => new URLSearchParams([[1]]), tupleError);
  assert.throws(() => new URLSearchParams([[1, 2, 3]]), tupleError);
  assert.throws(() => new URLSearchParams({ [Symbol.iterator]: 42 }),
                iterableError);
  assert.throws(() => new URLSearchParams([{}]), tupleError);
  assert.throws(() => new URLSearchParams(['a']), tupleError);
  assert.throws(() => new URLSearchParams([null]), tupleError);
  assert.throws(() => new URLSearchParams([{ [Symbol.iterator]: 42 }]),
                tupleError);
}

{
  const obj = {
    toString() { throw new Error('toString'); },
    valueOf() { throw new Error('valueOf'); }
  };
  const sym = Symbol();
  const toStringError = /^Error: toString$/;
  const symbolError = /^TypeError: Cannot convert a Symbol value to a string$/;

  assert.throws(() => new URLSearchParams({ a: obj }), toStringError);
  assert.throws(() => new URLSearchParams([['a', obj]]), toStringError);
  assert.throws(() => new URLSearchParams(sym), symbolError);
  assert.throws(() => new URLSearchParams({ [sym]: 'a' }), symbolError);
  assert.throws(() => new URLSearchParams({ a: sym }), symbolError);
  assert.throws(() => new URLSearchParams([[sym, 'a']]), symbolError);
  assert.throws(() => new URLSearchParams([['a', sym]]), symbolError);
}