2026-07-24 01:53:36 +00:00

140 lines
4.5 KiB
JavaScript

import { describe, it, expect, beforeEach } from 'vitest'
import {
getLocations,
addLocation,
updateLocation,
deleteLocation,
setCurrentLocation,
clearAllLocations,
loadSettings,
saveSettings,
DEFAULT_SETTINGS,
} from '../../../src/lib/storage/db.js'
describe('db - locations', () => {
beforeEach(async () => {
await clearAllLocations()
})
it('starts with empty locations', async () => {
const locs = await getLocations()
expect(locs).toEqual([])
})
it('adds and retrieves a location', async () => {
const id = await addLocation({
name: 'Berlin',
lat: 52.52,
lon: 13.41,
isCurrent: false,
})
expect(id).toBeTruthy()
const locs = await getLocations()
expect(locs).toHaveLength(1)
expect(locs[0].name).toBe('Berlin')
expect(locs[0].lat).toBe(52.52)
expect(locs[0].lon).toBe(13.41)
expect(locs[0].isCurrent).toBe(false)
expect(locs[0].order).toBe(1)
})
it('adds multiple locations with incrementing order', async () => {
await addLocation({ name: 'Berlin', lat: 52.52, lon: 13.41, isCurrent: false })
await addLocation({ name: 'Paris', lat: 48.85, lon: 2.35, isCurrent: false })
await addLocation({ name: 'Tokyo', lat: 35.68, lon: 139.76, isCurrent: false })
const locs = await getLocations()
expect(locs).toHaveLength(3)
expect(locs[0].order).toBe(1)
expect(locs[1].order).toBe(2)
expect(locs[2].order).toBe(3)
})
it('respects custom order', async () => {
await addLocation({ name: 'First', lat: 1, lon: 1, isCurrent: false, order: 10 })
await addLocation({ name: 'Second', lat: 2, lon: 2, isCurrent: false })
const locs = await getLocations()
expect(locs[0].name).toBe('First')
expect(locs[1].name).toBe('Second')
})
it('updates a location', async () => {
const id = await addLocation({ name: 'Berlin', lat: 52.52, lon: 13.41, isCurrent: false })
await updateLocation({ id, name: 'Berlin Updated', lat: 52.52, lon: 13.41, isCurrent: true, order: 5 })
const locs = await getLocations()
expect(locs[0].name).toBe('Berlin Updated')
expect(locs[0].isCurrent).toBe(true)
expect(locs[0].order).toBe(5)
})
it('throws when updating non-existent location', async () => {
await expect(
updateLocation({ id: 'nonexistent', name: 'Nope', lat: 0, lon: 0, isCurrent: false })
).rejects.toThrow('Location not found')
})
it('deletes a location', async () => {
const id = await addLocation({ name: 'Berlin', lat: 52.52, lon: 13.41, isCurrent: false })
await deleteLocation(id)
const locs = await getLocations()
expect(locs).toHaveLength(0)
})
it('setCurrentLocation updates the current flag', async () => {
const id1 = await addLocation({ name: 'Berlin', lat: 52.52, lon: 13.41, isCurrent: true })
const id2 = await addLocation({ name: 'Paris', lat: 48.85, lon: 2.35, isCurrent: false })
await setCurrentLocation(id2)
const locs = await getLocations()
const berlin = locs.find((l) => l.id === id1)
const paris = locs.find((l) => l.id === id2)
expect(berlin.isCurrent).toBe(false)
expect(paris.isCurrent).toBe(true)
})
it('clearAllLocations removes all', async () => {
await addLocation({ name: 'Berlin', lat: 52.52, lon: 13.41, isCurrent: false })
await addLocation({ name: 'Paris', lat: 48.85, lon: 2.35, isCurrent: false })
await clearAllLocations()
const locs = await getLocations()
expect(locs).toHaveLength(0)
})
})
describe('db - settings', () => {
it('loads default settings when none saved', async () => {
const settings = await loadSettings()
expect(settings.units).toBe('metric')
expect(settings.alertsEnabled).toBe(true)
expect(settings.alertThresholds.precip).toBe(70)
})
it('saves and loads settings', async () => {
await saveSettings({
units: 'imperial',
alertsEnabled: false,
alertThresholds: { precip: 80, windGust: 50, uvIndex: 8, tempHigh: 40, tempLow: -5, thunderstorm: false },
})
const settings = await loadSettings()
expect(settings.units).toBe('imperial')
expect(settings.alertsEnabled).toBe(false)
expect(settings.alertThresholds.precip).toBe(80)
expect(settings.alertThresholds.thunderstorm).toBe(false)
})
it('merges partial settings with defaults', async () => {
await saveSettings({ units: 'imperial' })
const settings = await loadSettings()
expect(settings.units).toBe('imperial')
expect(settings.alertsEnabled).toBe(true) // default preserved
})
})