1
0
mirror of synced 2025-12-19 18:11:23 -05:00
Files
blitz/packages/core/test/router-hooks.test.ts
2021-03-31 18:17:35 -04:00

216 lines
6.5 KiB
TypeScript

import {extractRouterParams, useParam, useParams, useRouterQuery} from "../src/router/router-hooks"
import {renderHook} from "./test-utils"
describe("useRouterQuery", () => {
it("returns proper values", () => {
const {result} = renderHook(() => useRouterQuery(), {
router: {asPath: "/?foo=foo&num=0&bool=true&float=1.23&empty"},
})
expect(result.current).toEqual({
foo: "foo",
num: "0",
bool: "true",
float: "1.23",
empty: "",
})
})
it("decode correctly", () => {
const {result} = renderHook(() => useRouterQuery(), {
router: {asPath: "/?encoded=D%C3%A9j%C3%A0%20vu&spaces=Hello+World&both=Hola%2C+Mundo%21"},
})
expect(result.current).toEqual({
encoded: "Déjà vu",
spaces: "Hello World",
both: "Hola, Mundo!",
})
})
})
describe("extractRouterParams", () => {
it("returns proper params", () => {
const routerQuery = {
id: "1",
cat: "category",
slug: ["example", "multiple", "slugs"],
empty: "",
queryArray: ["1", "123", ""],
}
const query = {
cat: "somethingelse",
slug: ["query-slug"],
queryArray: ["1", "123", ""],
onlyInQuery: "onlyInQuery",
}
const params = extractRouterParams(routerQuery, query)
expect(params).toEqual({
id: "1",
cat: "category",
slug: ["example", "multiple", "slugs"],
empty: "",
})
})
})
describe("useParams", () => {
it("works without parameter", () => {
// This is the router query object which includes route params
const query = {
id: "1",
cat: "category",
slug: ["example", "multiple", "slugs"],
empty: "",
}
const {result} = renderHook(() => useParams(), {router: {query}})
expect(result.current).toEqual({
id: "1",
cat: "category",
slug: ["example", "multiple", "slugs"],
empty: "",
})
})
it("works with string", () => {
// This is the router query object which includes route params
const query = {
id: "1",
cat: "category",
slug: ["example", "multiple", "slugs"],
empty: "",
}
const {result} = renderHook(() => useParams("string"), {router: {query}})
expect(result.current).toEqual({
id: "1",
cat: "category",
empty: "",
})
})
it("works with number", () => {
// This is the router query object which includes route params
const query = {
id: "1",
cat: "category",
slug: ["example", "multiple", "slugs"],
empty: "",
}
const {result} = renderHook(() => useParams("number"), {router: {query}})
expect(result.current).toEqual({
id: 1,
cat: undefined,
slug: undefined,
})
})
it("works with array", () => {
// This is the router query object which includes route params
const query = {
id: "1",
cat: "category",
slug: ["example", "multiple", "slugs"],
empty: "",
}
const {result} = renderHook(() => useParams("array"), {router: {query}})
expect(result.current).toEqual({
id: ["1"],
cat: ["category"],
slug: ["example", "multiple", "slugs"],
empty: [""],
})
})
})
describe("useParam", () => {
it("works without parameter", () => {
// This is the router query object which includes route params
const query = {
id: "1",
cat: "category",
slug: ["example", "multiple", "slugs"],
empty: "",
}
let {result} = renderHook(() => useParam("id"), {router: {query}})
expect(result.current).toEqual("1")
;({result} = renderHook(() => useParam("cat"), {router: {query}}))
expect(result.current).toEqual("category")
;({result} = renderHook(() => useParam("slug"), {router: {query}}))
expect(result.current).toEqual(["example", "multiple", "slugs"])
;({result} = renderHook(() => useParam("empty"), {router: {query}}))
expect(result.current).toEqual("")
;({result} = renderHook(() => useParam("doesnt-exist"), {router: {query}}))
expect(result.current).toBeUndefined()
})
it("works with string", () => {
// This is the router query object which includes route params
const query = {
id: "1",
cat: "category",
slug: ["example", "multiple", "slugs"],
empty: "",
}
let {result} = renderHook(() => useParam("id", "string"), {router: {query}})
expect(result.current).toEqual("1")
;({result} = renderHook(() => useParam("cat", "string"), {router: {query}}))
expect(result.current).toEqual("category")
;({result} = renderHook(() => useParam("slug", "string"), {router: {query}}))
expect(result.current).toEqual(undefined)
;({result} = renderHook(() => useParam("empty", "string"), {router: {query}}))
expect(result.current).toEqual("")
;({result} = renderHook(() => useParam("doesnt-exist", "string"), {router: {query}}))
expect(result.current).toBeUndefined()
})
it("works with number", () => {
// This is the router query object which includes route params
const query = {
id: "1",
cat: "category",
slug: ["example", "multiple", "slugs"],
empty: "",
}
let {result} = renderHook(() => useParam("id", "number"), {router: {query}})
expect(result.current).toEqual(1)
;({result} = renderHook(() => useParam("cat", "number"), {router: {query}}))
expect(result.current).toBeUndefined()
;({result} = renderHook(() => useParam("slug", "number"), {router: {query}}))
expect(result.current).toBeUndefined()
;({result} = renderHook(() => useParam("empty", "number"), {router: {query}}))
expect(result.current).toBeUndefined()
;({result} = renderHook(() => useParam("doesnt-exist", "number"), {router: {query}}))
expect(result.current).toBeUndefined()
})
it("works with array", () => {
// This is the router query object which includes route params
const query = {
id: "1",
cat: "category",
slug: ["example", "multiple", "slugs"],
empty: "",
}
let {result} = renderHook(() => useParam("id", "array"), {router: {query}})
expect(result.current).toEqual(["1"])
;({result} = renderHook(() => useParam("cat", "array"), {router: {query}}))
expect(result.current).toEqual(["category"])
;({result} = renderHook(() => useParam("slug", "array"), {router: {query}}))
expect(result.current).toEqual(["example", "multiple", "slugs"])
;({result} = renderHook(() => useParam("empty", "array"), {router: {query}}))
expect(result.current).toEqual([""])
;({result} = renderHook(() => useParam("doesnt-exist", "array"), {router: {query}}))
expect(result.current).toBeUndefined()
})
})