| import { expect, test } from "bun:test" |
| import { MetaProvider, Title } from "@solidjs/meta" |
| import { MemoryRouter, Route, createMemoryHistory, useParams } from "@solidjs/router" |
| import { createMemo } from "solid-js" |
| import { createComponent, render } from "solid-js/web" |
|
|
| test("route cleanup cannot invalidate an owner list being disposed", async () => { |
| const host = document.createElement("div") |
| document.body.append(host) |
| const history = createMemoryHistory() |
|
|
| const RepoPage = () => { |
| const params = useParams<{ id?: string }>() |
| const title = createMemo(() => params.id ?? "") |
| const button = document.createElement("button") |
| button.textContent = "Back" |
| button.addEventListener("click", () => history.set({ value: "/", scroll: false, replace: false })) |
| return [ |
| createComponent(Title, { |
| get children() { |
| return title() |
| }, |
| }), |
| button, |
| ] |
| } |
|
|
| const HomePage = () => { |
| const button = document.createElement("button") |
| button.textContent = "Go" |
| button.addEventListener("click", () => history.set({ value: "/project", scroll: false, replace: false })) |
| return button |
| } |
|
|
| const App = () => |
| createComponent(MetaProvider, { |
| get children() { |
| return createComponent(MemoryRouter, { |
| history, |
| get children() { |
| return [ |
| createComponent(Route, { path: "/", component: HomePage }), |
| createComponent(Route, { path: "/:id", component: RepoPage }), |
| ] |
| }, |
| }) |
| }, |
| }) |
|
|
| const dispose = render(() => createComponent(App, {}), host) |
| const go = host.querySelector("button") |
| expect(go?.textContent).toBe("Go") |
| go?.click() |
| await new Promise((resolve) => setTimeout(resolve, 0)) |
|
|
| const back = host.querySelector("button") |
| expect(back?.textContent).toBe("Back") |
| back?.click() |
| await new Promise((resolve) => setTimeout(resolve, 0)) |
|
|
| expect(host.querySelector("button")?.textContent).toBe("Go") |
| dispose() |
| host.remove() |
| }) |
|
|