Files
deepseek-harness/packages/client/ui-primitives/tests/toast.client.spec.tsx
Chinesezjc b462d5fd69 Merge remote-tracking branch 'origin/master' into feat/web-message-feedback-ui
Adapt to two contract changes master introduced:

- The generated Remote face now wraps every business result in
  RemoteResult, folding carrier failures into an ok:false branch instead
  of rejecting. The controller reads that envelope at its three call
  sites and maps a carrier failure onto the same settled shape the
  controls already render; three specs cover the new branch.
- Client packages split their tsconfig into host and client halves, and
  the host aggregate now compiles any test not named *.client.spec.*.
  Rename this package's specs to the client convention and drop the
  ../connection project reference, which pointed at a solution file that
  no longer carries the client sources.

Keep master's mount loop with its rollback-on-failure in api-remotes and
add messageFeedbackRemote to it.
2026-08-12 10:43:23 +08:00

58 lines
2.0 KiB
TypeScript

// @vitest-environment jsdom
import { afterEach, describe, expect, it, vi } from 'vitest'
import { cleanup, fireEvent, render } from '@testing-library/react'
import { Toast } from '../src/Toast.tsx'
afterEach(cleanup)
describe('Toast', () => {
it('announces its text and reports done after the hold-and-fade lifetime', () => {
vi.useFakeTimers()
try {
const onDone = vi.fn()
const view = render(<Toast text="最多添加 50 张图片" icon={<svg data-testid="icon" />} onDone={onDone} />)
const banner = view.getByRole('alert')
expect(banner.textContent).toContain('最多添加 50 张图片')
expect(view.getByTestId('icon')).toBeTruthy()
vi.advanceTimersByTime(3999)
expect(onDone).not.toHaveBeenCalled()
vi.advanceTimersByTime(1)
expect(onDone).toHaveBeenCalledTimes(1)
} finally {
vi.useRealTimers()
}
})
it('centers over its anchor and re-measures on window resize', () => {
vi.useFakeTimers()
try {
const anchor = document.createElement('div')
document.body.appendChild(anchor)
anchor.getBoundingClientRect = () => ({ left: 100, width: 400 }) as DOMRect
const view = render(<Toast text="anchored" anchor={anchor} onDone={vi.fn()} />)
expect(view.getByRole('alert').style.left).toBe('300px')
anchor.getBoundingClientRect = () => ({ left: 200, width: 400 }) as DOMRect
fireEvent(window, new Event('resize'))
expect(view.getByRole('alert').style.left).toBe('400px')
anchor.remove()
} finally {
vi.useRealTimers()
}
})
it('renders without an icon and cancels its timer on unmount', () => {
vi.useFakeTimers()
try {
const onDone = vi.fn()
const view = render(<Toast text="plain" onDone={onDone} />)
expect(view.getByRole('alert').querySelector('[aria-hidden]')).toBeNull()
view.unmount()
vi.advanceTimersByTime(10_000)
expect(onDone).not.toHaveBeenCalled()
} finally {
vi.useRealTimers()
}
})
})