diff --git a/server/utils/__tests__/createSearch-test.js b/server/utils/__tests__/createSearch-test.js new file mode 100644 index 0000000..113a89e --- /dev/null +++ b/server/utils/__tests__/createSearch-test.js @@ -0,0 +1,15 @@ +const createSearch = require("../createSearch"); + +describe("createSearch", () => { + it("omits the trailing = for empty string values", () => { + expect(createSearch({ a: "a", b: "" })).toEqual("?a=a&b"); + }); + + it("sorts keys", () => { + expect(createSearch({ b: "b", a: "a", c: "c" })).toEqual("?a=a&b=b&c=c"); + }); + + it("returns an empty string when there are no params", () => { + expect(createSearch({})).toEqual(""); + }); +}); diff --git a/server/utils/createSearch.js b/server/utils/createSearch.js index b6c8114..33f2ec2 100644 --- a/server/utils/createSearch.js +++ b/server/utils/createSearch.js @@ -1,17 +1,16 @@ function createSearch(query) { - const params = []; + const keys = Object.keys(query).sort(); + const params = keys.reduce( + (memo, key) => + memo.concat( + query[key] === "" + ? key // Omit the trailing "=" from key= + : `${key}=${encodeURIComponent(query[key])}` + ), + [] + ); - Object.keys(query).forEach(param => { - if (query[param] === "") { - params.push(param); // Omit the trailing "=" from param= - } else { - params.push(`${param}=${encodeURIComponent(query[param])}`); - } - }); - - const search = params.join("&"); - - return search ? `?${search}` : ""; + return params.length ? `?${params.join("&")}` : ""; } module.exports = createSearch;