60 lines
1.6 KiB
TypeScript
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())
|
|
})
|
|
})
|