85 lines
2.8 KiB
TypeScript
85 lines
2.8 KiB
TypeScript
|
|
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
|
||
|
|
import {
|
||
|
|
beginNoteOpenTrace,
|
||
|
|
failNoteOpenTrace,
|
||
|
|
finishNoteOpenTrace,
|
||
|
|
logKeyboardNavigationTrace,
|
||
|
|
markNoteOpenTrace,
|
||
|
|
} from './noteOpenPerformance'
|
||
|
|
|
||
|
|
const VITEST_WORKER_DESCRIPTOR = Object.getOwnPropertyDescriptor(globalThis, '__vitest_worker__')
|
||
|
|
|
||
|
|
describe('noteOpenPerformance', () => {
|
||
|
|
beforeEach(() => {
|
||
|
|
vi.clearAllMocks()
|
||
|
|
if (VITEST_WORKER_DESCRIPTOR) {
|
||
|
|
Reflect.deleteProperty(globalThis, '__vitest_worker__')
|
||
|
|
}
|
||
|
|
})
|
||
|
|
|
||
|
|
afterEach(() => {
|
||
|
|
if (VITEST_WORKER_DESCRIPTOR) {
|
||
|
|
Object.defineProperty(globalThis, '__vitest_worker__', VITEST_WORKER_DESCRIPTOR)
|
||
|
|
}
|
||
|
|
})
|
||
|
|
|
||
|
|
it('logs a completed note-open trace with detailed stage timing', () => {
|
||
|
|
const debugSpy = vi.spyOn(console, 'debug').mockImplementation(() => {})
|
||
|
|
const nowSpy = vi.spyOn(performance, 'now')
|
||
|
|
nowSpy
|
||
|
|
.mockReturnValueOnce(100)
|
||
|
|
.mockReturnValueOnce(120)
|
||
|
|
.mockReturnValueOnce(150)
|
||
|
|
.mockReturnValueOnce(170)
|
||
|
|
.mockReturnValueOnce(200)
|
||
|
|
.mockReturnValueOnce(245)
|
||
|
|
.mockReturnValueOnce(290)
|
||
|
|
|
||
|
|
beginNoteOpenTrace('/vault/note.md', 'sidebar')
|
||
|
|
markNoteOpenTrace('/vault/note.md', 'beforeNavigateStart')
|
||
|
|
markNoteOpenTrace('/vault/note.md', 'beforeNavigateEnd')
|
||
|
|
markNoteOpenTrace('/vault/note.md', 'cacheReady')
|
||
|
|
markNoteOpenTrace('/vault/note.md', 'contentLoadStart')
|
||
|
|
markNoteOpenTrace('/vault/note.md', 'contentLoadEnd')
|
||
|
|
finishNoteOpenTrace('/vault/note.md')
|
||
|
|
|
||
|
|
expect(debugSpy).toHaveBeenCalledWith(
|
||
|
|
'[perf] noteOpen path=/vault/note.md source=sidebar total=190.0ms beforeNavigate=30.0ms contentLoad=45.0ms editorSwap=45.0ms cache=hit',
|
||
|
|
)
|
||
|
|
})
|
||
|
|
|
||
|
|
it('logs when an in-flight note open is superseded by another one', () => {
|
||
|
|
const debugSpy = vi.spyOn(console, 'debug').mockImplementation(() => {})
|
||
|
|
const nowSpy = vi.spyOn(performance, 'now')
|
||
|
|
nowSpy
|
||
|
|
.mockReturnValueOnce(10)
|
||
|
|
.mockReturnValueOnce(35)
|
||
|
|
.mockReturnValueOnce(55)
|
||
|
|
|
||
|
|
beginNoteOpenTrace('/vault/alpha.md', 'sidebar')
|
||
|
|
beginNoteOpenTrace('/vault/beta.md', 'search')
|
||
|
|
failNoteOpenTrace('/vault/beta.md', 'cleanup')
|
||
|
|
|
||
|
|
expect(debugSpy).toHaveBeenNthCalledWith(
|
||
|
|
1,
|
||
|
|
'[perf] noteOpen cancel path=/vault/alpha.md source=sidebar total=25.0ms reason=superseded',
|
||
|
|
)
|
||
|
|
expect(debugSpy).toHaveBeenNthCalledWith(
|
||
|
|
2,
|
||
|
|
'[perf] noteOpen cancel path=/vault/beta.md source=search total=20.0ms reason=cleanup',
|
||
|
|
)
|
||
|
|
})
|
||
|
|
|
||
|
|
it('only logs keyboard traces when the list is large or slow enough', () => {
|
||
|
|
const debugSpy = vi.spyOn(console, 'debug').mockImplementation(() => {})
|
||
|
|
|
||
|
|
logKeyboardNavigationTrace('down', 100, 3)
|
||
|
|
logKeyboardNavigationTrace('up', 600, 5)
|
||
|
|
|
||
|
|
expect(debugSpy).toHaveBeenCalledTimes(1)
|
||
|
|
expect(debugSpy).toHaveBeenCalledWith(
|
||
|
|
'[perf] noteListKeyboard direction=up items=600 move=5.0ms',
|
||
|
|
)
|
||
|
|
})
|
||
|
|
})
|