import { expect, test } from "vitest" import { isSearchIncludes, isSearchLooseEqual, isSearchLooseIncludes, isSearchStrictEqual, isSearchStrictIncludes, neatenQueryString, neatenSearch, queryObjectToQueryString, queryObjectToSearch, queryStringToQueryObject, queryStringToSearch, searchToQueryObject, searchToQueryString, toQueryObject, toQueryString, toSearch, } from "#Source/route/index.ts" test("neatenSearch ensures the search string starts with a question mark", () => { expect(neatenSearch("a=1&b=2&c=3")).toBe("?a=1&b=2&c=3") expect(neatenSearch("?a=1&b=2&c=3")).toBe("?a=1&b=2&c=3") }) test("neatenQueryString removes a leading question mark when present", () => { expect(neatenQueryString("?name=mobius")).toBe("name=mobius") expect(neatenQueryString("name=mobius")).toBe("name=mobius") }) test("queryStringToQueryObject decodes keys and values and preserves later equals signs", () => { expect(queryStringToQueryObject("?na%20me=mobius%20model&formula=a%3Db&empty=")).toEqual({ "na me": "mobius model", formula: "a=b", empty: "", }) expect(queryStringToQueryObject("a=1&b=2&c=3")).toEqual({ a: "1", b: "2", c: "3" }) expect(queryStringToQueryObject("?a=1&b=2&c=3")).toEqual({ a: "1", b: "2", c: "3" }) }) test("queryObjectToQueryString encodes keys and values into a query string", () => { expect(queryObjectToQueryString({ "na me": "mobius model", formula: "a=b" })).toBe( "na%20me=mobius%20model&formula=a%3Db", ) expect(queryObjectToQueryString({ a: "1", b: "2", c: "3" })).toBe("a=1&b=2&c=3") }) test("searchToQueryString aliases query-string normalization for search input", () => { expect(searchToQueryString("?a=1&b=2&c=3")).toBe("a=1&b=2&c=3") }) test("searchToQueryObject parses search input into a query object", () => { expect(searchToQueryObject("?name=mobius&mode=stable")).toEqual({ name: "mobius", mode: "stable", }) expect(searchToQueryObject("?a=1&b=2&c=3")).toEqual({ a: "1", b: "2", c: "3" }) }) test("queryStringToSearch aliases search normalization for query-string input", () => { expect(queryStringToSearch("a=1&b=2&c=3")).toBe("?a=1&b=2&c=3") }) test("queryObjectToSearch serializes a query object into search format", () => { expect(queryObjectToSearch({ name: "mobius model", mode: "a=b" })).toBe( "?name=mobius%20model&mode=a%3Db", ) expect(queryObjectToSearch({ a: "1", b: "2", c: "3" })).toBe("?a=1&b=2&c=3") }) test("toSearch returns search format for both strings and objects", () => { expect(toSearch("a=1&b=2&c=3")).toBe("?a=1&b=2&c=3") expect(toSearch("?a=1&b=2&c=3")).toBe("?a=1&b=2&c=3") expect(toSearch({ a: "1", b: "2", c: "3" })).toBe("?a=1&b=2&c=3") }) test("toQueryString returns query-string format for both strings and objects", () => { expect(toQueryString("a=1&b=2&c=3")).toBe("a=1&b=2&c=3") expect(toQueryString("?a=1&b=2&c=3")).toBe("a=1&b=2&c=3") expect(toQueryString({ a: "1", b: "2", c: "3" })).toBe("a=1&b=2&c=3") }) test("queryObject returns parsed query objects for both strings and objects", () => { const queryObject = { a: "1", b: "2", c: "3" } expect(toQueryObject("a=1&b=2&c=3")).toEqual({ a: "1", b: "2", c: "3" }) expect(toQueryObject("?a=1&b=2&c=3")).toEqual({ a: "1", b: "2", c: "3" }) expect(toQueryObject(queryObject)).toBe(queryObject) expect(toQueryObject("")).toEqual({}) }) test("isSearchLooseIncludes checks whether all requested query keys exist", () => { expect(isSearchLooseIncludes("?a=1&b=2", ["a"])).toBe(true) expect(isSearchLooseIncludes("?a=1&b=2", ["a", "c"])).toBe(false) }) test("isSearchStrictIncludes checks whether query key sets are identical", () => { expect(isSearchStrictIncludes("?a=1&b=2", ["b", "a"])).toBe(true) expect(isSearchStrictIncludes("?ab=1&c=2", ["a", "bc"])).toBe(false) }) test("isSearchIncludes supports required and optional query keys", () => { expect(isSearchIncludes("?a=1&b=2", { a: "required", b: "optional" })).toBe(true) expect(isSearchIncludes("?a=1&b=2", { a: "required" })).toBe(false) }) test("isSearchLooseEqual checks whether target query values are a matching subset", () => { expect(isSearchLooseEqual("?a=1&b=2", "?a=1")).toBe(true) expect(isSearchLooseEqual("?a=1&b=2", { a: "1", c: "3" })).toBe(false) }) test("isSearchStrictEqual checks whether query key sets and values are identical", () => { expect(isSearchStrictEqual("?a=1&b=2", "?b=2&a=1")).toBe(true) expect(isSearchStrictEqual("?a=1&b=2", "?a=1")).toBe(false) })