* chore: managing and maintaining models and threads in the cache * test: add tests for hooks
106 lines
2.5 KiB
TypeScript
106 lines
2.5 KiB
TypeScript
import { renderHook, act } from '@testing-library/react'
|
|
import { useClipboard } from './useClipboard'
|
|
|
|
describe('useClipboard', () => {
|
|
let originalClipboard: any
|
|
|
|
beforeAll(() => {
|
|
originalClipboard = { ...global.navigator.clipboard }
|
|
const mockClipboard = {
|
|
writeText: jest.fn(() => Promise.resolve()),
|
|
}
|
|
// @ts-ignore
|
|
global.navigator.clipboard = mockClipboard
|
|
})
|
|
|
|
afterAll(() => {
|
|
// @ts-ignore
|
|
global.navigator.clipboard = originalClipboard
|
|
})
|
|
|
|
beforeEach(() => {
|
|
jest.useFakeTimers()
|
|
})
|
|
|
|
afterEach(() => {
|
|
jest.clearAllTimers()
|
|
jest.useRealTimers()
|
|
})
|
|
|
|
it('should copy text to clipboard', async () => {
|
|
const { result } = renderHook(() => useClipboard())
|
|
|
|
await act(async () => {
|
|
result.current.copy('Test text')
|
|
})
|
|
|
|
expect(navigator.clipboard.writeText).toHaveBeenCalledWith('Test text')
|
|
expect(result.current.copied).toBe(true)
|
|
expect(result.current.error).toBe(null)
|
|
})
|
|
|
|
it('should set copied to false after timeout', async () => {
|
|
const { result } = renderHook(() => useClipboard({ timeout: 1000 }))
|
|
|
|
await act(async () => {
|
|
result.current.copy('Test text')
|
|
})
|
|
|
|
expect(result.current.copied).toBe(true)
|
|
|
|
act(() => {
|
|
jest.advanceTimersByTime(1000)
|
|
})
|
|
|
|
expect(result.current.copied).toBe(false)
|
|
})
|
|
|
|
it('should handle clipboard errors', async () => {
|
|
const mockError = new Error('Clipboard error')
|
|
// @ts-ignore
|
|
navigator.clipboard.writeText.mockRejectedValueOnce(mockError)
|
|
|
|
const { result } = renderHook(() => useClipboard())
|
|
|
|
await act(async () => {
|
|
result.current.copy('Test text')
|
|
})
|
|
|
|
expect(result.current.error).toEqual(mockError)
|
|
expect(result.current.copied).toBe(false)
|
|
})
|
|
|
|
it('should reset state', async () => {
|
|
const { result } = renderHook(() => useClipboard())
|
|
|
|
await act(async () => {
|
|
result.current.copy('Test text')
|
|
})
|
|
|
|
expect(result.current.copied).toBe(true)
|
|
|
|
act(() => {
|
|
result.current.reset()
|
|
})
|
|
|
|
expect(result.current.copied).toBe(false)
|
|
expect(result.current.error).toBe(null)
|
|
})
|
|
|
|
it('should handle missing clipboard API', () => {
|
|
// @ts-ignore
|
|
delete global.navigator.clipboard
|
|
|
|
const { result } = renderHook(() => useClipboard())
|
|
|
|
act(() => {
|
|
result.current.copy('Test text')
|
|
})
|
|
|
|
expect(result.current.error).toEqual(
|
|
new Error('useClipboard: navigator.clipboard is not supported')
|
|
)
|
|
expect(result.current.copied).toBe(false)
|
|
})
|
|
})
|