fix(notes): serialize immediate note creation writes

This commit is contained in:
lucaronin
2026-05-02 03:56:48 +02:00
parent db16f2ff5e
commit c9698b853e
4 changed files with 154 additions and 20 deletions

View File

@@ -261,7 +261,11 @@ describe('useNoteCreation hook', () => {
await flushImmediateCreate()
})
await act(async () => {
vi.advanceTimersByTime(RAPID_CREATE_NOTE_SETTLE_MS * 2)
vi.advanceTimersByTime(RAPID_CREATE_NOTE_SETTLE_MS)
await flushImmediateCreate()
})
await act(async () => {
vi.advanceTimersByTime(RAPID_CREATE_NOTE_SETTLE_MS)
await flushImmediateCreate()
})
const filenames = addEntry.mock.calls.map(([e]: [VaultEntry]) => e.filename)
@@ -326,6 +330,49 @@ describe('useNoteCreation hook', () => {
vi.restoreAllMocks()
})
it('waits for slow immediate note persistence before starting the queued create', async () => {
vi.useFakeTimers()
vi.mocked(isTauri).mockReturnValue(true)
vi.spyOn(Date, 'now').mockReturnValue(1700000000000)
let resolveFirstWrite: () => void
const firstWrite = new Promise<void>((resolve) => {
resolveFirstWrite = resolve
})
vi.mocked(invoke)
.mockImplementationOnce(() => firstWrite)
.mockResolvedValue(undefined)
const createCalls = () => vi.mocked(invoke).mock.calls.filter(([command]) => command === 'create_note_content')
const { result } = renderHook(() => useNoteCreation(makeConfig(), tabDeps))
await act(async () => {
result.current.handleCreateNoteImmediate()
result.current.handleCreateNoteImmediate()
await flushImmediateCreate()
})
expect(createCalls()).toHaveLength(1)
await act(async () => {
vi.advanceTimersByTime(RAPID_CREATE_NOTE_SETTLE_MS * 3)
await flushImmediateCreate()
})
expect(createCalls()).toHaveLength(1)
await act(async () => {
resolveFirstWrite()
await flushImmediateCreate()
})
await act(async () => {
vi.advanceTimersByTime(RAPID_CREATE_NOTE_SETTLE_MS)
await flushImmediateCreate()
})
expect(createCalls()).toHaveLength(2)
expect(addEntry).toHaveBeenCalledTimes(2)
vi.restoreAllMocks()
})
it('handleCreateNoteImmediate accepts custom type', async () => {
const { result } = renderHook(() => useNoteCreation(makeConfig(), tabDeps))
await act(async () => {