hololake-platform/src/hooks/useDeepLinks.test.tsx

60 lines
1.6 KiB
TypeScript

import { renderHook, waitFor } from '@testing-library/react'
import { beforeEach, describe, expect, it, vi } from 'vitest'
import { isTauri } from '../mock-tauri'
import { useDeepLinks } from './useDeepLinks'
import type { VaultEntry } from '../types'
const { getCurrent, onOpenUrl } = vi.hoisted(() => ({
getCurrent: vi.fn(),
onOpenUrl: vi.fn(),
}))
vi.mock('../mock-tauri', () => ({
isTauri: vi.fn(),
}))
vi.mock('@tauri-apps/plugin-deep-link', () => ({
getCurrent,
onOpenUrl,
}))
function renderDeepLinks() {
return renderHook(() => useDeepLinks({
activeEntry: null,
currentVaultPath: '/vault',
enabled: true,
entries: [] as VaultEntry[],
isVaultContentLoading: false,
onSelectNote: vi.fn(),
onSwitchVault: vi.fn(),
reloadVault: vi.fn().mockResolvedValue([]),
setToastMessage: vi.fn(),
vaultListLoaded: true,
vaults: [{ label: 'Vault', path: '/vault' }],
}))
}
describe('useDeepLinks', () => {
beforeEach(() => {
vi.clearAllMocks()
vi.mocked(isTauri).mockReturnValue(false)
getCurrent.mockResolvedValue(null)
onOpenUrl.mockResolvedValue(vi.fn())
})
it('swallows stale native deep-link unlisten failures on unmount', async () => {
vi.mocked(isTauri).mockReturnValue(true)
const stopListening = vi.fn(() => {
throw new TypeError("undefined is not an object (evaluating 'listeners[eventId].handlerId')")
})
onOpenUrl.mockResolvedValue(stopListening)
const { unmount } = renderDeepLinks()
await waitFor(() => expect(onOpenUrl).toHaveBeenCalledOnce())
expect(() => unmount()).not.toThrow()
await waitFor(() => expect(stopListening).toHaveBeenCalledOnce())
})
})