mirror of
https://github.com/Comfy-Org/ComfyUI_frontend.git
synced 2026-04-20 14:30:41 +00:00
Backport of #9299 to `core/1.42` Automatically created by backport workflow. ┆Issue is synchronized with this [Notion page](https://www.notion.so/PR-10524-backport-core-1-42-fix-handle-clipboard-errors-in-Copy-Image-and-useCopyToClipboard-32e6d73d3650813eb88ac841d236c192) by [Unito](https://www.unito.io) Co-authored-by: Christian Byrne <cbyrne@comfy.org>
95 lines
2.6 KiB
TypeScript
95 lines
2.6 KiB
TypeScript
import { computed, ref } from 'vue'
|
|
import { beforeEach, describe, expect, it, vi } from 'vitest'
|
|
|
|
const mockCopy = vi.fn()
|
|
const mockToastAdd = vi.fn()
|
|
|
|
vi.mock('@vueuse/core', () => ({
|
|
useClipboard: vi.fn(() => ({
|
|
copy: mockCopy,
|
|
copied: ref(false),
|
|
isSupported: computed(() => true)
|
|
}))
|
|
}))
|
|
|
|
vi.mock('primevue/usetoast', () => ({
|
|
useToast: vi.fn(() => ({
|
|
add: mockToastAdd
|
|
}))
|
|
}))
|
|
|
|
vi.mock('@/i18n', () => ({
|
|
t: (key: string) => key
|
|
}))
|
|
|
|
import { useClipboard } from '@vueuse/core'
|
|
import { useCopyToClipboard } from '@/composables/useCopyToClipboard'
|
|
|
|
describe('useCopyToClipboard', () => {
|
|
beforeEach(() => {
|
|
vi.resetAllMocks()
|
|
vi.mocked(useClipboard).mockReturnValue({
|
|
copy: mockCopy,
|
|
copied: ref(false),
|
|
isSupported: computed(() => true),
|
|
text: ref('')
|
|
})
|
|
})
|
|
|
|
it('shows success toast when modern clipboard succeeds', async () => {
|
|
mockCopy.mockResolvedValue(undefined)
|
|
|
|
const { copyToClipboard } = useCopyToClipboard()
|
|
await copyToClipboard('hello')
|
|
|
|
expect(mockCopy).toHaveBeenCalledWith('hello')
|
|
expect(mockToastAdd).toHaveBeenCalledWith(
|
|
expect.objectContaining({ severity: 'success' })
|
|
)
|
|
})
|
|
|
|
it('falls back to legacy when modern clipboard fails', async () => {
|
|
mockCopy.mockRejectedValue(new Error('Not allowed'))
|
|
document.execCommand = vi.fn(() => true)
|
|
|
|
const { copyToClipboard } = useCopyToClipboard()
|
|
await copyToClipboard('hello')
|
|
|
|
expect(document.execCommand).toHaveBeenCalledWith('copy')
|
|
expect(mockToastAdd).toHaveBeenCalledWith(
|
|
expect.objectContaining({ severity: 'success' })
|
|
)
|
|
})
|
|
|
|
it('shows error toast when both modern and legacy fail', async () => {
|
|
mockCopy.mockRejectedValue(new Error('Not allowed'))
|
|
document.execCommand = vi.fn(() => false)
|
|
|
|
const { copyToClipboard } = useCopyToClipboard()
|
|
await copyToClipboard('hello')
|
|
|
|
expect(mockToastAdd).toHaveBeenCalledWith(
|
|
expect.objectContaining({ severity: 'error' })
|
|
)
|
|
})
|
|
|
|
it('falls through to legacy when isSupported is false', async () => {
|
|
vi.mocked(useClipboard).mockReturnValue({
|
|
copy: mockCopy,
|
|
copied: ref(false),
|
|
isSupported: computed(() => false),
|
|
text: ref('')
|
|
})
|
|
document.execCommand = vi.fn(() => true)
|
|
|
|
const { copyToClipboard } = useCopyToClipboard()
|
|
await copyToClipboard('hello')
|
|
|
|
expect(mockCopy).not.toHaveBeenCalled()
|
|
expect(document.execCommand).toHaveBeenCalledWith('copy')
|
|
expect(mockToastAdd).toHaveBeenCalledWith(
|
|
expect.objectContaining({ severity: 'success' })
|
|
)
|
|
})
|
|
})
|