ac627a022f
Serialize Live-log day creation, prune empty duplicates, and use local dates for "today". Co-authored-by: Cursor <cursoragent@cursor.com>
75 lines
2.2 KiB
TypeScript
75 lines
2.2 KiB
TypeScript
import { describe, expect, it } from 'vitest'
|
|
import {
|
|
buildLogEntryPayload,
|
|
hasUnsavedEventDraft,
|
|
isLogEventDraftEmpty,
|
|
localDateString,
|
|
normalizeLogEvent,
|
|
type LogEventPayload
|
|
} from './logEntryPayload.js'
|
|
|
|
const emptyDraft = (): LogEventPayload =>
|
|
normalizeLogEvent({ time: '12:34' })
|
|
|
|
const filledDraft = (): LogEventPayload =>
|
|
normalizeLogEvent({ time: '12:34', remarks: 'Wind dreht' })
|
|
|
|
describe('localDateString', () => {
|
|
it('uses local calendar date, not UTC', () => {
|
|
const date = new Date(2026, 5, 4, 1, 30, 0)
|
|
expect(localDateString(date)).toBe('2026-06-04')
|
|
expect(date.toISOString().substring(0, 10)).toBe('2026-06-03')
|
|
})
|
|
})
|
|
|
|
describe('logEntryPayload event drafts', () => {
|
|
it('treats time-only draft as empty', () => {
|
|
expect(isLogEventDraftEmpty(emptyDraft())).toBe(true)
|
|
})
|
|
|
|
it('detects draft with content', () => {
|
|
expect(isLogEventDraftEmpty(filledDraft())).toBe(false)
|
|
})
|
|
|
|
it('does not flag empty open form as unsaved', () => {
|
|
expect(hasUnsavedEventDraft(emptyDraft(), null, [])).toBe(false)
|
|
})
|
|
|
|
it('flags new event draft with content as unsaved', () => {
|
|
expect(hasUnsavedEventDraft(filledDraft(), null, [])).toBe(true)
|
|
})
|
|
|
|
it('flags edited event when values differ', () => {
|
|
const events = [emptyDraft()]
|
|
const edited = filledDraft()
|
|
expect(hasUnsavedEventDraft(edited, 0, events)).toBe(true)
|
|
})
|
|
|
|
it('ignores edit mode when values match', () => {
|
|
const events = [filledDraft()]
|
|
expect(hasUnsavedEventDraft(filledDraft(), 0, events)).toBe(false)
|
|
})
|
|
})
|
|
|
|
describe('buildLogEntryPayload greywater', () => {
|
|
const base = {
|
|
date: '2026-05-31',
|
|
dayOfTravel: '1',
|
|
departure: 'Kiel',
|
|
destination: 'Laboe',
|
|
freshwater: { morning: 0, refilled: 0, evening: 0, consumption: 0 },
|
|
fuel: { morning: 0, refilled: 0, evening: 0, consumption: 0 },
|
|
events: [] as LogEventPayload[]
|
|
}
|
|
|
|
it('includes greywater when level > 0', () => {
|
|
const payload = buildLogEntryPayload({ ...base, greywater: { level: 45 } })
|
|
expect(payload.greywater).toEqual({ level: 45 })
|
|
})
|
|
|
|
it('omits greywater when level is 0', () => {
|
|
const payload = buildLogEntryPayload({ ...base, greywater: { level: 0 } })
|
|
expect(payload.greywater).toBeUndefined()
|
|
})
|
|
})
|