Follow Stalwart 0.16.22 in the mock
0.16.22 changed four things a client sees from CalendarEvent/get and ContactCard/get. Read from its source and the tests that came with it: - baseEventId is the master's id on a synthetic id and null otherwise; an event read by its stored id used to report its own id. A one-off from an expanded query still has a synthetic id, so it still carries a base. - recurrenceRule and recurrenceOverrides named on a synthetic id come back null rather than absent. - useDefaultAlerts is the reader's own and reads false until set. - an empty properties list returns id alone, for both methods. pick already did that, so only a comment changes for contacts. With properties omitted the stored object comes back as before. The README said a one-off now carries a null base, which only holds for one read by its stored id; it now says that, and that the mock follows.
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
import { describe, it } from "node:test";
|
||||
import assert from "node:assert/strict";
|
||||
import { expandOccurrences, occurrenceAt, occurrenceView, parseSyntheticId, splitOccurrencePatch, syntheticId } from "./recurrence.js";
|
||||
import { eventGetView, expandOccurrences, occurrenceAt, occurrenceView, parseSyntheticId, splitOccurrencePatch, syntheticId } from "./recurrence.js";
|
||||
|
||||
/**
|
||||
* The mock expands recurrences so that per-occurrence editing can be developed
|
||||
@@ -98,6 +98,54 @@ describe("occurrenceView", () => {
|
||||
});
|
||||
});
|
||||
|
||||
describe("eventGetView", () => {
|
||||
/*
|
||||
* What 0.16.22 changed in `CalendarEvent/get`, read from its source and the
|
||||
* tests that came with it (`tests/src/jmap/calendar/event.rs` and
|
||||
* `instance.rs`).
|
||||
*/
|
||||
it("reports no base for an event read by its stored id", () => {
|
||||
// 0.16.21 answered with the event's own id here.
|
||||
assert.deepEqual(eventGetView(oneOff(), false, ["id", "baseEventId"]), { id: "ev2", baseEventId: null });
|
||||
assert.equal(eventGetView(series(), false, ["baseEventId"]).baseEventId, null);
|
||||
});
|
||||
|
||||
it("still gives a one-off read through its synthetic id a base", () => {
|
||||
// An expanded query hands a one-off a synthetic id, so this has not
|
||||
// changed: `baseEventId` is still no evidence of a series.
|
||||
const base = oneOff();
|
||||
const view = eventGetView(occurrenceView(base, occurrenceAt(base, "2026-09-08T12:00:00")!), true, ["baseEventId"]);
|
||||
assert.equal(view.baseEventId, "ev2");
|
||||
});
|
||||
|
||||
it("answers null for the rule and overrides named on an occurrence", () => {
|
||||
const base = { ...series(), recurrenceOverrides: { "2026-09-09T09:00:00": { title: "Standup (long)" } } };
|
||||
const view = eventGetView(occurrenceView(base, occurrenceAt(base, "2026-09-08T09:00:00")!), true,
|
||||
["recurrenceId", "recurrenceRule", "recurrenceOverrides"]);
|
||||
assert.deepEqual(view, { id: "ev1-r20260908T090000", recurrenceId: "2026-09-08T09:00:00", recurrenceRule: null, recurrenceOverrides: null });
|
||||
});
|
||||
|
||||
it("leaves the rule on the series itself alone", () => {
|
||||
assert.deepEqual(eventGetView(series(), false, ["recurrenceRule"]).recurrenceRule, WEEKDAYS);
|
||||
});
|
||||
|
||||
it("reads useDefaultAlerts as false until it is set", () => {
|
||||
// It used to read true until set.
|
||||
assert.equal(eventGetView(series(), false, ["useDefaultAlerts"]).useDefaultAlerts, false);
|
||||
assert.equal(eventGetView({ ...series(), useDefaultAlerts: true }, false, ["useDefaultAlerts"]).useDefaultAlerts, true);
|
||||
assert.equal(eventGetView({ ...series(), useDefaultAlerts: false }, false, ["useDefaultAlerts"]).useDefaultAlerts, false);
|
||||
});
|
||||
|
||||
it("returns only the id for an empty list", () => {
|
||||
// 0.16.21 treated an empty list as asking for everything.
|
||||
assert.deepEqual(eventGetView(series(), false, []), { id: "ev1" });
|
||||
});
|
||||
|
||||
it("returns the object unchanged when no list is given", () => {
|
||||
assert.deepEqual(eventGetView(series(), false, null), series());
|
||||
});
|
||||
});
|
||||
|
||||
describe("parseSyntheticId", () => {
|
||||
it("round-trips", () => {
|
||||
assert.deepEqual(parseSyntheticId(syntheticId("ev1", "2026-09-08T09:00:00")),
|
||||
|
||||
Reference in New Issue
Block a user