refactor(schema): distinguish published event durability
This commit is contained in:
parent
77f2d2227a
commit
95f264e04e
9 changed files with 373 additions and 453 deletions
|
|
@ -34,4 +34,99 @@ describe("public event schemas", () => {
|
|||
|
||||
expect(Event.durable([definition]).get("test.durable.1")).toBe(definition)
|
||||
})
|
||||
|
||||
test("durable definitions require published commit metadata", () => {
|
||||
const definition = Event.define({
|
||||
type: "test.durable",
|
||||
durable: { aggregate: "id", version: 1 },
|
||||
schema: { id: Schema.String },
|
||||
})
|
||||
const payload: typeof definition.Type = {
|
||||
id: Event.ID.create(),
|
||||
type: definition.type,
|
||||
durable: { aggregateID: "aggregate", seq: 0, version: 1 },
|
||||
data: { id: "aggregate" },
|
||||
}
|
||||
|
||||
expect(Schema.is(definition)(payload)).toBe(true)
|
||||
expect(
|
||||
Schema.is(definition)({
|
||||
id: Event.ID.create(),
|
||||
type: definition.type,
|
||||
data: { id: "aggregate" },
|
||||
}),
|
||||
).toBe(false)
|
||||
expect(Schema.is(definition)({ ...payload, durable: { ...payload.durable, seq: -1 } })).toBe(false)
|
||||
expect(Schema.is(definition)({ ...payload, durable: { ...payload.durable, version: 2 } })).toBe(false)
|
||||
|
||||
// @ts-expect-error Published durable payloads require commit metadata.
|
||||
const missing: typeof definition.Type = { id: Event.ID.create(), type: definition.type, data: { id: "aggregate" } }
|
||||
void missing
|
||||
})
|
||||
|
||||
test("live definitions reject durable commit metadata", () => {
|
||||
const definition = Event.define({
|
||||
type: "test.live",
|
||||
schema: { value: Schema.String },
|
||||
})
|
||||
const payload: typeof definition.Type = {
|
||||
id: Event.ID.create(),
|
||||
type: definition.type,
|
||||
data: { value: "value" },
|
||||
}
|
||||
|
||||
expect(Schema.is(definition)(payload)).toBe(true)
|
||||
expect(
|
||||
Schema.is(definition)({
|
||||
...payload,
|
||||
durable: { aggregateID: "aggregate", seq: 0, version: 1 },
|
||||
}),
|
||||
).toBe(false)
|
||||
|
||||
const invalid: typeof definition.Type = {
|
||||
...payload,
|
||||
// @ts-expect-error Live payloads cannot carry durable commit metadata.
|
||||
durable: { aggregateID: "aggregate", seq: 0, version: 1 },
|
||||
}
|
||||
void invalid
|
||||
})
|
||||
|
||||
test("mixed definition payloads preserve durability correlation", () => {
|
||||
const durable = Event.define({
|
||||
type: "test.mixed.durable",
|
||||
durable: { aggregate: "id", version: 2 },
|
||||
schema: { id: Schema.String },
|
||||
})
|
||||
const live = Event.define({
|
||||
type: "test.mixed.live",
|
||||
schema: { value: Schema.String },
|
||||
})
|
||||
type Mixed = Event.Payload<typeof durable | typeof live>
|
||||
|
||||
const committed: Mixed = {
|
||||
id: Event.ID.create(),
|
||||
type: durable.type,
|
||||
durable: { aggregateID: "aggregate", seq: 0, version: 2 },
|
||||
data: { id: "aggregate" },
|
||||
}
|
||||
const ephemeral: Mixed = {
|
||||
id: Event.ID.create(),
|
||||
type: live.type,
|
||||
data: { value: "value" },
|
||||
}
|
||||
void committed
|
||||
void ephemeral
|
||||
|
||||
// @ts-expect-error Durable union members require commit metadata.
|
||||
const uncommitted: Mixed = { id: Event.ID.create(), type: durable.type, data: { id: "aggregate" } }
|
||||
const falselyCommitted: Mixed = {
|
||||
id: Event.ID.create(),
|
||||
type: live.type,
|
||||
// @ts-expect-error Live union members cannot carry durable commit metadata.
|
||||
durable: { aggregateID: "aggregate", seq: 0, version: 2 },
|
||||
data: { value: "value" },
|
||||
}
|
||||
void uncommitted
|
||||
void falselyCommitted
|
||||
})
|
||||
})
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue