File size: 2,032 Bytes
3e05655
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
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()
})