diff --git a/packages/dify-ui/src/avatar/__tests__/index.spec.tsx b/packages/dify-ui/src/avatar/__tests__/index.spec.tsx
index e427b09ed0d..2287358b32d 100644
--- a/packages/dify-ui/src/avatar/__tests__/index.spec.tsx
+++ b/packages/dify-ui/src/avatar/__tests__/index.spec.tsx
@@ -1,6 +1,30 @@
import { render } from 'vitest-browser-react'
import { Avatar, AvatarFallback, AvatarImage, AvatarRoot } from '..'
+function stubImageLoader() {
+ const originalImage = window.Image
+ const images: HTMLImageElement[] = []
+
+ function TestImage(_width?: number, _height?: number): HTMLImageElement {
+ const image = document.createElement('img')
+ images.push(image)
+ return image
+ }
+
+ Object.defineProperty(window, 'Image', {
+ configurable: true,
+ value: TestImage,
+ writable: true,
+ })
+
+ return {
+ images,
+ restore: () => {
+ window.Image = originalImage
+ },
+ }
+}
+
describe('Avatar', () => {
describe('Rendering', () => {
it('should keep the fallback visible when avatar URL is provided before image load', async () => {
@@ -69,7 +93,7 @@ describe('Avatar', () => {
})
it('should handle empty string avatar as falsy value', async () => {
- const screen = await render()
+ const screen = await render()
expect(screen.container.querySelector('img')).not.toBeInTheDocument()
await expect.element(screen.getByText('T')).toBeInTheDocument()
@@ -77,25 +101,32 @@ describe('Avatar', () => {
})
describe('onLoadingStatusChange', () => {
- it('should render the fallback when avatar and onLoadingStatusChange are provided', async () => {
- const screen = await render(
- ,
- )
-
- await expect.element(screen.getByText('J')).toBeInTheDocument()
- })
-
- it('should not render image when avatar is null even with onLoadingStatusChange', async () => {
+ it('should forward image loading status changes', async () => {
+ const { images, restore } = stubImageLoader()
const onStatusChange = vi.fn()
- const screen = await render(
- ,
- )
- expect(screen.container.querySelector('img')).not.toBeInTheDocument()
+ try {
+ await render(
+ ,
+ )
+
+ await vi.waitFor(() => {
+ expect(onStatusChange).toHaveBeenCalledWith('loading')
+ })
+
+ images[0]?.onload?.(new Event('load'))
+
+ await vi.waitFor(() => {
+ expect(onStatusChange).toHaveBeenCalledWith('loaded')
+ })
+ }
+ finally {
+ restore()
+ }
})
})
})
diff --git a/packages/dify-ui/src/progress/__tests__/index.spec.tsx b/packages/dify-ui/src/progress/__tests__/index.spec.tsx
index 987aef228d8..2e86633247b 100644
--- a/packages/dify-ui/src/progress/__tests__/index.spec.tsx
+++ b/packages/dify-ui/src/progress/__tests__/index.spec.tsx
@@ -24,34 +24,11 @@ describe('ProgressCircle', () => {
})
it('renders indeterminate state when value is null', async () => {
- const screen = await render()
+ const screen = await render()
+ const progress = screen.getByLabelText('Processing')
- await expect.element(screen.getByTestId('progress')).toHaveAttribute('data-indeterminate')
- await expect.element(screen.getByTestId('progress')).not.toHaveAttribute('aria-valuenow')
- expect(screen.getByTestId('progress').element().querySelector('path')).toBeNull()
- })
-
- it('does not render a progress sector for zero progress', async () => {
- const screen = await render()
-
- expect(screen.getByTestId('progress').element().querySelector('path')).toBeNull()
- })
-
- it('renders a deterministic progress sector', async () => {
- const screen = await render()
-
- const path = screen.getByTestId('progress').element().querySelector('path')!
-
- expect(path.getAttribute('d')).toContain('A 6,6 0 1 1')
- })
-
- it('renders a closed circle sector for complete progress', async () => {
- const screen = await render()
-
- const path = screen.getByTestId('progress').element().querySelector('path')!
- const pathData = path.getAttribute('d')!
-
- expect(pathData).toContain('A 6,6 0 1 1 6,12')
- expect(pathData).toContain('A 6,6 0 1 1 6,0')
+ await expect.element(progress).toHaveAttribute('role', 'progressbar')
+ await expect.element(progress).toHaveAttribute('data-indeterminate')
+ await expect.element(progress).not.toHaveAttribute('aria-valuenow')
})
})