Files
webmail/lib/__tests__/recurrence-rule.test.ts
T
Stefan Hildebrandt ced81835ef fix(calendar): drop default SKIP=OMIT from recurrence rules (DAVx5 sync)
Recurring events defaulted skip:"omit"+rscale:"gregorian" on every rule,
which Stalwart serialises into the CalDAV RRULE as RSCALE=GREGORIAN;SKIP=OMIT.
DAVx5 rejects that ("Invalid recurrence rule"), breaking Android sync. Those
RFC 7529 fields only matter for non-Gregorian scales / invalid-date handling,
so stop emitting them for plain Gregorian rules.

- lib/recurrence-rule.ts: createRecurrenceRule() helper with no skip/rscale.
- CalendarRecurrenceRule.rscale/skip are now optional.
- event-modal + recurrence-editor build rules via the helper.
- demo fixture cleaned; unit test asserts no skip/rscale.

Closes #805.
2026-08-25 21:13:34 +02:00

41 lines
1.2 KiB
TypeScript

import { describe, it, expect } from 'vitest';
import { createRecurrenceRule } from '@/lib/recurrence-rule';
describe('createRecurrenceRule (#805 — no default SKIP=OMIT)', () => {
it('does not emit rscale or skip (which serialise to RSCALE=GREGORIAN;SKIP=OMIT)', () => {
const rule = createRecurrenceRule('yearly');
expect('skip' in rule).toBe(false);
expect('rscale' in rule).toBe(false);
expect(rule.skip).toBeUndefined();
expect(rule.rscale).toBeUndefined();
});
it('builds a clean Gregorian default rule', () => {
expect(createRecurrenceRule('daily')).toEqual({
'@type': 'RecurrenceRule',
frequency: 'daily',
interval: 1,
firstDayOfWeek: 'mo',
byDay: null,
byMonthDay: null,
byMonth: null,
byYearDay: null,
byWeekNo: null,
byHour: null,
byMinute: null,
bySecond: null,
bySetPosition: null,
count: null,
until: null,
});
});
it('applies overrides (interval / count / until) without reintroducing skip', () => {
const rule = createRecurrenceRule('yearly', { interval: 2, count: 100 });
expect(rule.interval).toBe(2);
expect(rule.count).toBe(100);
expect(rule.until).toBeNull();
expect('skip' in rule).toBe(false);
});
});