feat(settings): reminder day-settings + append-only dated schedule endpoints (owner, audited)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>feat/client-detail-redesign
parent
4e2b71cf9f
commit
aa05060181
@ -0,0 +1,36 @@
|
||||
// apps/hq/test/settings-reminders.test.ts — Task 3: reminder settings + dated schedule inserts
|
||||
import { describe, expect, it } from 'vitest'
|
||||
import { openDb } from '../src/db'
|
||||
import { seedIfEmpty } from '../src/seed'
|
||||
import { insertSchedule, listSchedules, resolveSchedule } from '../src/repos-reminders'
|
||||
|
||||
const fresh = () => { const db = openDb(':memory:'); seedIfEmpty(db); return db }
|
||||
|
||||
describe('schedule settings', () => {
|
||||
it('lists the two seeded open-ended rows', () => {
|
||||
const rows = listSchedules(fresh())
|
||||
expect(rows.map((r) => r.ruleKind).sort()).toEqual(['invoice_overdue', 'quote_followup'])
|
||||
})
|
||||
it('insertSchedule appends a dated row that resolveSchedule picks from its date', () => {
|
||||
const db = fresh()
|
||||
const row = insertSchedule(db, 'u1', {
|
||||
ruleKind: 'quote_followup', effectiveFrom: '2026-08-01', dayOffsets: ' 2, 5,5, 9 ',
|
||||
})
|
||||
expect(row.dayOffsets).toBe('2,5,9') // normalized: trimmed, deduped, sorted
|
||||
expect(resolveSchedule(db, 'quote_followup', '2026-08-02').dayOffsets).toEqual([2, 5, 9])
|
||||
expect(resolveSchedule(db, 'quote_followup', '2026-07-20').dayOffsets).toEqual([3, 7, 14])
|
||||
expect(listSchedules(db)).toHaveLength(3) // append-only: old row still there
|
||||
})
|
||||
it('rejects bad input', () => {
|
||||
const db = fresh()
|
||||
expect(() => insertSchedule(db, 'u1', { ruleKind: 'nope', effectiveFrom: '2026-08-01', dayOffsets: '3' })).toThrow()
|
||||
expect(() => insertSchedule(db, 'u1', { ruleKind: 'quote_followup', effectiveFrom: '01-08-2026', dayOffsets: '3' })).toThrow()
|
||||
expect(() => insertSchedule(db, 'u1', { ruleKind: 'quote_followup', effectiveFrom: '2026-08-01', dayOffsets: 'x,-2' })).toThrow()
|
||||
})
|
||||
it('audits the insert', () => {
|
||||
const db = fresh()
|
||||
const row = insertSchedule(db, 'u1', { ruleKind: 'invoice_overdue', effectiveFrom: '2026-09-01', dayOffsets: '10,20' })
|
||||
const audit = db.prepare(`SELECT * FROM audit_log WHERE entity='reminder_schedule' AND entity_id=?`).get(row.id)
|
||||
expect(audit).toBeDefined()
|
||||
})
|
||||
})
|
||||
Loading…
Reference in New Issue