solid-router-cleanup.test.ts 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. import { expect, test } from "bun:test"
  2. import { MetaProvider, Title } from "@solidjs/meta"
  3. import { MemoryRouter, Route, createMemoryHistory, useParams } from "@solidjs/router"
  4. import { createMemo } from "solid-js"
  5. import { createComponent, render } from "solid-js/web"
  6. test("route cleanup cannot invalidate an owner list being disposed", async () => {
  7. const host = document.createElement("div")
  8. document.body.append(host)
  9. const history = createMemoryHistory()
  10. const RepoPage = () => {
  11. const params = useParams<{ id?: string }>()
  12. const title = createMemo(() => params.id ?? "")
  13. const button = document.createElement("button")
  14. button.textContent = "Back"
  15. button.addEventListener("click", () => history.set({ value: "/", scroll: false, replace: false }))
  16. return [
  17. createComponent(Title, {
  18. get children() {
  19. return title()
  20. },
  21. }),
  22. button,
  23. ]
  24. }
  25. const HomePage = () => {
  26. const button = document.createElement("button")
  27. button.textContent = "Go"
  28. button.addEventListener("click", () => history.set({ value: "/project", scroll: false, replace: false }))
  29. return button
  30. }
  31. const App = () =>
  32. createComponent(MetaProvider, {
  33. get children() {
  34. return createComponent(MemoryRouter, {
  35. history,
  36. get children() {
  37. return [
  38. createComponent(Route, { path: "/", component: HomePage }),
  39. createComponent(Route, { path: "/:id", component: RepoPage }),
  40. ]
  41. },
  42. })
  43. },
  44. })
  45. const dispose = render(() => createComponent(App, {}), host)
  46. const go = host.querySelector("button")
  47. expect(go?.textContent).toBe("Go")
  48. go?.click()
  49. await new Promise((resolve) => setTimeout(resolve, 0))
  50. const back = host.querySelector("button")
  51. expect(back?.textContent).toBe("Back")
  52. back?.click()
  53. await new Promise((resolve) => setTimeout(resolve, 0))
  54. expect(host.querySelector("button")?.textContent).toBe("Go")
  55. dispose()
  56. host.remove()
  57. })