9d22cb61c7
Cache plaintext list metadata on entry save so the journal list avoids full decrypt per row, and batch sync pull writes with main-thread yields. Co-authored-by: Cursor <cursoragent@cursor.com>
62 lines
1.6 KiB
TypeScript
62 lines
1.6 KiB
TypeScript
import { describe, expect, it } from 'vitest'
|
|
import { buildEntryListCache, entryListItemFromLocal } from './entryListCache.js'
|
|
import type { LocalEntry } from '../services/db.js'
|
|
|
|
describe('entryListCache', () => {
|
|
it('builds cache fields from decrypted entry', async () => {
|
|
const cache = await buildEntryListCache({
|
|
date: '2026-06-02',
|
|
dayOfTravel: '3',
|
|
departure: 'Kiel',
|
|
destination: 'Laboe',
|
|
signSkipper: 'Max'
|
|
})
|
|
expect(cache).toEqual({
|
|
date: '2026-06-02',
|
|
dayOfTravel: '3',
|
|
departure: 'Kiel',
|
|
destination: 'Laboe',
|
|
skipperSignStatus: 'valid'
|
|
})
|
|
})
|
|
|
|
it('maps cached local entry to list item', () => {
|
|
const entry: LocalEntry = {
|
|
payloadId: 'e1',
|
|
logbookId: 'lb1',
|
|
encryptedData: 'x',
|
|
iv: 'i',
|
|
tag: 't',
|
|
updatedAt: '2026-06-02T12:00:00.000Z',
|
|
listCache: {
|
|
date: '2026-06-02',
|
|
dayOfTravel: '1',
|
|
departure: 'A',
|
|
destination: 'B',
|
|
skipperSignStatus: 'none'
|
|
}
|
|
}
|
|
expect(entryListItemFromLocal(entry)).toEqual({
|
|
id: 'e1',
|
|
date: '2026-06-02',
|
|
dayOfTravel: '1',
|
|
departure: 'A',
|
|
destination: 'B',
|
|
updatedAt: '2026-06-02T12:00:00.000Z',
|
|
skipperSignStatus: 'none'
|
|
})
|
|
})
|
|
|
|
it('returns null when cache is missing', () => {
|
|
const entry: LocalEntry = {
|
|
payloadId: 'e1',
|
|
logbookId: 'lb1',
|
|
encryptedData: 'x',
|
|
iv: 'i',
|
|
tag: 't',
|
|
updatedAt: '2026-06-02T12:00:00.000Z'
|
|
}
|
|
expect(entryListItemFromLocal(entry)).toBeNull()
|
|
})
|
|
})
|