Files
biblical-guide.com/__tests__/lib/highlight-manager.test.ts
Andrei 90208808a2 feat: create highlight manager with IndexedDB storage
Implemented TDD approach for highlight persistence:
- Created IndexedDB store with 'highlights' object store
- Added indexes for syncStatus and verseId for efficient queries
- Implemented CRUD operations: add, update, get, getAll, delete
- Added query methods: getHighlightsByVerse, getPendingHighlights
- Full test coverage with fake-indexeddb mock
- Added structuredClone polyfill for test environment

Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-12 06:57:30 +00:00

64 lines
1.9 KiB
TypeScript

import { initHighlightsDatabase, addHighlight, getHighlight, getAllHighlights, deleteHighlight } from '@/lib/highlight-manager'
import { BibleHighlight } from '@/types'
describe('HighlightManager', () => {
beforeEach(async () => {
// Clear IndexedDB before each test
const db = await initHighlightsDatabase()
const tx = db.transaction('highlights', 'readwrite')
tx.objectStore('highlights').clear()
})
it('should initialize database with highlights store', async () => {
const db = await initHighlightsDatabase()
expect(db.objectStoreNames.contains('highlights')).toBe(true)
})
it('should add a highlight and retrieve it', async () => {
const highlight: BibleHighlight = {
id: 'h-123',
verseId: 'v-456',
color: 'yellow',
createdAt: Date.now(),
updatedAt: Date.now(),
syncStatus: 'pending'
}
await addHighlight(highlight)
const retrieved = await getHighlight('h-123')
expect(retrieved).toEqual(highlight)
})
it('should get all highlights', async () => {
const highlights: BibleHighlight[] = [
{ id: 'h-1', verseId: 'v-1', color: 'yellow', createdAt: Date.now(), updatedAt: Date.now(), syncStatus: 'pending' },
{ id: 'h-2', verseId: 'v-2', color: 'blue', createdAt: Date.now(), updatedAt: Date.now(), syncStatus: 'synced' }
]
for (const h of highlights) {
await addHighlight(h)
}
const all = await getAllHighlights()
expect(all.length).toBe(2)
})
it('should delete a highlight', async () => {
const highlight: BibleHighlight = {
id: 'h-123',
verseId: 'v-456',
color: 'yellow',
createdAt: Date.now(),
updatedAt: Date.now(),
syncStatus: 'pending'
}
await addHighlight(highlight)
await deleteHighlight('h-123')
const retrieved = await getHighlight('h-123')
expect(retrieved).toBeNull()
})
})