|
1 | 1 | import glob from 'glob-to-regexp';
|
2 | 2 | import pathToRegexp from 'path-to-regexp';
|
3 |
| -import querystring from 'querystring'; |
4 | 3 | import isSubset from 'is-subset';
|
5 | 4 | import isEqual from 'lodash.isequal';
|
6 | 5 | import {
|
@@ -78,22 +77,54 @@ const getQueryStringMatcher = ({ query: passedQuery }) => {
|
78 | 77 | debug(' No query parameters expectations defined - skipping');
|
79 | 78 | return;
|
80 | 79 | }
|
81 |
| - const expectedQuery = querystring.parse(querystring.stringify(passedQuery)); |
82 |
| - debug(' Expected query parameters:', passedQuery); |
83 |
| - const keys = Object.keys(expectedQuery); |
| 80 | + |
| 81 | + const expectedQuery = new URLSearchParams(); |
| 82 | + for (const [key, value] of Object.entries(passedQuery)) { |
| 83 | + if (Array.isArray(value)) { |
| 84 | + for (const item of value) { |
| 85 | + expectedQuery.append( |
| 86 | + key, |
| 87 | + typeof item === 'object' || typeof item === 'undefined' |
| 88 | + ? '' |
| 89 | + : item.toString(), |
| 90 | + ); |
| 91 | + } |
| 92 | + } else { |
| 93 | + expectedQuery.append( |
| 94 | + key, |
| 95 | + typeof value === 'object' || typeof value === 'undefined' |
| 96 | + ? '' |
| 97 | + : value.toString(), |
| 98 | + ); |
| 99 | + } |
| 100 | + } |
| 101 | + |
| 102 | + const keys = Array.from(expectedQuery.keys()); |
84 | 103 | return (url) => {
|
85 | 104 | debug('Attempting to match query parameters');
|
86 |
| - const query = querystring.parse(getQuery(url)); |
87 |
| - debug(' Expected query parameters:', expectedQuery); |
88 |
| - debug(' Actual query parameters:', query); |
| 105 | + const queryString = getQuery(url); |
| 106 | + const query = new URLSearchParams(queryString); |
| 107 | + debug( |
| 108 | + ' Expected query parameters:', |
| 109 | + Object.fromEntries(expectedQuery.entries()), |
| 110 | + ); |
| 111 | + debug(' Actual query parameters:', Object.fromEntries(query.entries())); |
| 112 | + |
89 | 113 | return keys.every((key) => {
|
90 |
| - if (Array.isArray(query[key])) { |
91 |
| - if (!Array.isArray(expectedQuery[key])) { |
92 |
| - return false; |
93 |
| - } |
94 |
| - return isEqual(query[key].sort(), expectedQuery[key].sort()); |
| 114 | + const expectedValues = expectedQuery.getAll(key).sort(); |
| 115 | + const actualValues = query.getAll(key).sort(); |
| 116 | + |
| 117 | + if (expectedValues.length !== actualValues.length) { |
| 118 | + return false; |
95 | 119 | }
|
96 |
| - return query[key] === expectedQuery[key]; |
| 120 | + |
| 121 | + if (Array.isArray(passedQuery[key])) { |
| 122 | + return expectedValues.every( |
| 123 | + (expected, index) => expected === actualValues[index], |
| 124 | + ); |
| 125 | + } |
| 126 | + |
| 127 | + return isEqual(actualValues, expectedValues); |
97 | 128 | });
|
98 | 129 | };
|
99 | 130 | };
|
|
0 commit comments