| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- import { beforeEach, describe, expect, test } from "bun:test"
- import { createSignal, type JSX } from "solid-js"
- import { showToastV2, toasterV2 } from "@opencode-ai/ui/v2/toast-v2"
- describe("showToastV2", () => {
- // The toast registry is module state, so each test starts from an empty stack.
- beforeEach(() => {
- toasterV2.dismiss()
- })
- test("coalesces exact active content", () => {
- const first = showToastV2({ title: "Repeated error", description: "Try again" })
- const second = showToastV2({ title: "Repeated error", description: "Try again" })
- const different = showToastV2({ title: "Repeated error", description: "A different error" })
- expect(second).toBe(first)
- expect(different).not.toBe(first)
- toasterV2.dismiss(first)
- toasterV2.dismiss(different)
- })
- test("allows dismissed content to appear again", () => {
- const first = showToastV2("Dismiss and retry")
- toasterV2.dismiss(first)
- const second = showToastV2("Dismiss and retry")
- expect(second).not.toBe(first)
- toasterV2.dismiss(second)
- })
- test("recreates matching content when it is not the topmost toast", () => {
- const first = showToastV2("First toast")
- const topmost = showToastV2("Topmost toast")
- const repeated = showToastV2("First toast")
- expect(repeated).not.toBe(first)
- toasterV2.dismiss(topmost)
- toasterV2.dismiss(repeated)
- })
- test("creates no reactive computations at call time", () => {
- const [tick, setTick] = createSignal(0)
- let reads = 0
- const icon = (() => {
- reads++
- tick()
- return undefined
- }) as unknown as JSX.Element
- const id = showToastV2({ description: "test", icon })
- // Resolving the icon at call time creates an ownerless computation that is
- // never disposed and tracks its dependencies forever; it must only resolve
- // once the toast component renders.
- expect(reads).toBe(0)
- setTick(1)
- expect(reads).toBe(0)
- toasterV2.dismiss(id)
- })
- })
|