Skip to content

Commit a25a6fd

Browse files
committed
Add 'plane' field to event envelope and update version to 1.1.4
1 parent 869cd24 commit a25a6fd

9 files changed

+84
-57
lines changed

package-lock.json

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/events/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,5 +40,5 @@
4040
"test:unit": "jest",
4141
"prepare": "npm run build"
4242
},
43-
"version": "1.1.3"
43+
"version": "1.1.4"
4444
}

packages/events/src/events/__tests__/event-envelope.test.ts

Lines changed: 71 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ describe("EventEnvelope schema validation", () => {
2828
recordedtime: "2025-10-01T10:15:30.250Z",
2929
severitynumber: 2,
3030
severitytext: "INFO",
31+
plane: "data",
3132
};
3233

3334
describe("basic validation", () => {
@@ -44,6 +45,7 @@ describe("EventEnvelope schema validation", () => {
4445
...baseValidEnvelope,
4546
severitytext: "TRACE",
4647
severitynumber: 0,
48+
plane: "data",
4749
};
4850

4951
const result = $Envelope.safeParse(envelope);
@@ -55,6 +57,7 @@ describe("EventEnvelope schema validation", () => {
5557
...baseValidEnvelope,
5658
severitytext: "DEBUG",
5759
severitynumber: 1,
60+
plane: "data",
5861
};
5962

6063
const result = $Envelope.safeParse(envelope);
@@ -66,6 +69,7 @@ describe("EventEnvelope schema validation", () => {
6669
...baseValidEnvelope,
6770
severitytext: "INFO",
6871
severitynumber: 2,
72+
plane: "data",
6973
};
7074

7175
const result = $Envelope.safeParse(envelope);
@@ -77,6 +81,7 @@ describe("EventEnvelope schema validation", () => {
7781
...baseValidEnvelope,
7882
severitytext: "WARN",
7983
severitynumber: 3,
84+
plane: "data",
8085
};
8186

8287
const result = $Envelope.safeParse(envelope);
@@ -88,6 +93,7 @@ describe("EventEnvelope schema validation", () => {
8893
...baseValidEnvelope,
8994
severitytext: "ERROR",
9095
severitynumber: 4,
96+
plane: "data",
9197
};
9298

9399
const result = $Envelope.safeParse(envelope);
@@ -99,6 +105,7 @@ describe("EventEnvelope schema validation", () => {
99105
...baseValidEnvelope,
100106
severitytext: "FATAL",
101107
severitynumber: 5,
108+
plane: "data",
102109
};
103110

104111
const result = $Envelope.safeParse(envelope);
@@ -110,6 +117,7 @@ describe("EventEnvelope schema validation", () => {
110117
...baseValidEnvelope,
111118
severitytext: "TRACE",
112119
severitynumber: 1,
120+
plane: "data",
113121
};
114122

115123
const result = $Envelope.safeParse(envelope);
@@ -121,6 +129,7 @@ describe("EventEnvelope schema validation", () => {
121129
...baseValidEnvelope,
122130
severitytext: "DEBUG",
123131
severitynumber: 2,
132+
plane: "data",
124133
};
125134

126135
const result = $Envelope.safeParse(envelope);
@@ -132,6 +141,7 @@ describe("EventEnvelope schema validation", () => {
132141
...baseValidEnvelope,
133142
severitytext: "INFO",
134143
severitynumber: 1,
144+
plane: "data",
135145
};
136146

137147
const result = $Envelope.safeParse(envelope);
@@ -143,6 +153,7 @@ describe("EventEnvelope schema validation", () => {
143153
...baseValidEnvelope,
144154
severitytext: "WARN",
145155
severitynumber: 2,
156+
plane: "data",
146157
};
147158

148159
const result = $Envelope.safeParse(envelope);
@@ -154,6 +165,7 @@ describe("EventEnvelope schema validation", () => {
154165
...baseValidEnvelope,
155166
severitytext: "ERROR",
156167
severitynumber: 3,
168+
plane: "data",
157169
};
158170

159171
const result = $Envelope.safeParse(envelope);
@@ -165,6 +177,7 @@ describe("EventEnvelope schema validation", () => {
165177
...baseValidEnvelope,
166178
severitytext: "FATAL",
167179
severitynumber: 4,
180+
plane: "data",
168181
};
169182

170183
const result = $Envelope.safeParse(envelope);
@@ -176,6 +189,7 @@ describe("EventEnvelope schema validation", () => {
176189
...baseValidEnvelope,
177190
severitytext: undefined,
178191
severitynumber: 2,
192+
plane: "data",
179193
};
180194

181195
const result = $Envelope.safeParse(envelope);
@@ -187,6 +201,7 @@ describe("EventEnvelope schema validation", () => {
187201
...baseValidEnvelope,
188202
severitytext: "INFO",
189203
severitynumber: 2,
204+
plane: "data",
190205
};
191206

192207
const result = $Envelope.safeParse(envelope);
@@ -208,6 +223,7 @@ describe("EventEnvelope schema validation", () => {
208223
dataclassification: "restricted",
209224
dataregulation: "GDPR",
210225
datacategory: "sensitive",
226+
plane: "data",
211227
};
212228

213229
const result = $Envelope.safeParse(envelope);
@@ -216,65 +232,12 @@ describe("EventEnvelope schema validation", () => {
216232
});
217233
});
218234

219-
describe("source validation", () => {
220-
it("should accept source with letter-rendering plane", () => {
221-
const envelope = {
222-
...baseValidEnvelope,
223-
source: "/data-plane/letter-rendering/ordering",
224-
};
225-
226-
const result = $Envelope.safeParse(envelope);
227-
expect(result.error).toBeUndefined();
228-
expect(result.success).toBe(true);
229-
});
230-
231-
it("should accept source with digital-letters domain", () => {
232-
const envelope = {
233-
...baseValidEnvelope,
234-
source: "/data-plane/digital-letters/ordering",
235-
};
236-
237-
const result = $Envelope.safeParse(envelope);
238-
expect(result.error).toBeUndefined();
239-
expect(result.success).toBe(true);
240-
});
241-
242-
it("should accept source with digital-letters domain and additional path", () => {
243-
const envelope = {
244-
...baseValidEnvelope,
245-
source: "/data-plane/digital-letters/ordering/sub-path",
246-
};
247-
248-
const result = $Envelope.safeParse(envelope);
249-
expect(result.error).toBeUndefined();
250-
expect(result.success).toBe(true);
251-
});
252-
253-
it("should accept source with letter-rendering plane and additional path", () => {
254-
const envelope = {
255-
...baseValidEnvelope,
256-
source: "/data-plane/letter-rendering/ordering/sub-path/more",
257-
};
258-
259-
const result = $Envelope.safeParse(envelope);
260-
expect(result.error).toBeUndefined();
261-
expect(result.success).toBe(true);
262-
});
263-
235+
describe("edge cases", () => {
264236
it("should reject invalid source pattern", () => {
265237
const envelope = {
266238
...baseValidEnvelope,
267239
source: "/invalid-plane/test",
268-
};
269-
270-
const result = $Envelope.safeParse(envelope);
271-
expect(result.success).toBe(false);
272-
});
273-
274-
it("should reject source without data-plane prefix", () => {
275-
const envelope = {
276-
...baseValidEnvelope,
277-
source: "/digital-letters/ordering",
240+
plane: "data",
278241
};
279242

280243
const result = $Envelope.safeParse(envelope);
@@ -304,13 +267,15 @@ describe("EventEnvelope schema validation", () => {
304267
recordedtime: "2025-10-01T10:15:30.250Z",
305268
severitynumber: 2,
306269
severitytext: "INFO" as const,
270+
plane: "data",
307271
};
308272

309273
it("should accept subject with valid prefix when prefix is required", () => {
310274
const envelope = {
311275
...baseLetterEnvelope,
312276
subject:
313277
"letter-origin/letter-rendering/letter/f47ac10b-58cc-4372-a567-0e02b2c3d479",
278+
plane: "data",
314279
};
315280

316281
const result = $EnvelopeWithPrefix.safeParse(envelope);
@@ -322,6 +287,7 @@ describe("EventEnvelope schema validation", () => {
322287
const envelope = {
323288
...baseLetterEnvelope,
324289
subject: "letter/f47ac10b-58cc-4372-a567-0e02b2c3d479",
290+
plane: "data",
325291
};
326292

327293
const result = $EnvelopeWithPrefix.safeParse(envelope);
@@ -334,6 +300,7 @@ describe("EventEnvelope schema validation", () => {
334300
const envelope = {
335301
...baseLetterEnvelope,
336302
subject: "letter-origin/letter/f47ac10b-58cc-4372-a567-0e02b2c3d479",
303+
plane: "data",
337304
};
338305

339306
const result = $EnvelopeWithPrefix.safeParse(envelope);
@@ -359,6 +326,7 @@ describe("EventEnvelope schema validation", () => {
359326
recordedtime: "2025-10-01T10:15:30.250Z",
360327
severitynumber: 2,
361328
severitytext: "INFO" as const,
329+
plane: "data",
362330
};
363331

364332
const result = $EnvelopeNoPrefix.safeParse(envelope);
@@ -378,6 +346,7 @@ describe("EventEnvelope schema validation", () => {
378346
const envelope = {
379347
...baseLetterEnvelope,
380348
subject: "a/b/c/letter/test-id-123",
349+
plane: "data",
381350
};
382351

383352
const result = $EnvelopeMultiSegmentPrefix.safeParse(envelope);
@@ -404,10 +373,57 @@ describe("EventEnvelope schema validation", () => {
404373
recordedtime: "2025-10-01T10:15:30.250Z",
405374
severitynumber: 2,
406375
severitytext: "INFO" as const,
376+
plane: "data",
407377
};
408378

409379
const result = $EnvelopeNoPrefix.safeParse(envelope);
410380
expect(result.success).toBe(false);
411381
});
412382
});
383+
384+
// Additional tests for digital-letters source and optional request ID fields
385+
describe("source validation", () => {
386+
it("should accept source with digital-letters domain", () => {
387+
const envelope = {
388+
...baseValidEnvelope,
389+
source: "/data-plane/digital-letters/ordering",
390+
plane: "data",
391+
};
392+
const result = $Envelope.safeParse(envelope);
393+
expect(result.error).toBeUndefined();
394+
expect(result.success).toBe(true);
395+
});
396+
it("should accept source with digital-letters domain and additional path", () => {
397+
const envelope = {
398+
...baseValidEnvelope,
399+
source: "/data-plane/digital-letters/ordering/sub-path",
400+
plane: "data",
401+
};
402+
const result = $Envelope.safeParse(envelope);
403+
expect(result.error).toBeUndefined();
404+
expect(result.success).toBe(true);
405+
});
406+
it("should accept source with letter-rendering plane and additional path", () => {
407+
const envelope = {
408+
...baseValidEnvelope,
409+
source: "/data-plane/letter-rendering/ordering/sub-path/more",
410+
plane: "data",
411+
};
412+
const result = $Envelope.safeParse(envelope);
413+
expect(result.error).toBeUndefined();
414+
expect(result.success).toBe(true);
415+
});
416+
});
417+
describe("optional request ID fields", () => {
418+
it("should accept envelope with optional requestId fields", () => {
419+
const envelope = {
420+
...baseValidEnvelope,
421+
requestId: "req-12345",
422+
correlationId: "corr-67890",
423+
plane: "data",
424+
};
425+
const result = $Envelope.safeParse(envelope);
426+
expect(result.success).toBe(true);
427+
});
428+
});
413429
});

packages/events/src/events/__tests__/testData/letter-request-prepared-valid.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
"datacontenttype": "application/json",
1818
"dataschema": "https://notify.nhs.uk/cloudevents/schemas/letter-rendering/letter-request.prepared.1.0.0.schema.json",
1919
"id": "23f1f09c-a555-4d9b-8405-0b33490bc920",
20+
"plane": "data",
2021
"recordedtime": "2025-08-28T08:45:00.000Z",
2122
"severitynumber": 2,
2223
"severitytext": "INFO",

packages/events/src/events/__tests__/testData/letter-request-prepared-with-invalid-major-version.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
"datacontenttype": "application/json",
1818
"dataschema": "https://notify.nhs.uk/cloudevents/schemas/letter-rendering/letter-request.prepared.0.1.0.schema.json",
1919
"id": "23f1f09c-a555-4d9b-8405-0b33490bc920",
20+
"plane": "data",
2021
"recordedtime": "2025-08-28T08:45:00.000Z",
2122
"severitynumber": 2,
2223
"severitytext": "INFO",

packages/events/src/events/__tests__/testData/letter-request-prepared-with-missing-fields.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
"datacontenttype": "application/json",
1717
"dataschema": "https://notify.nhs.uk/cloudevents/schemas/letter-rendering/letter-request.prepared.1.0.0.schema.json",
1818
"id": "23f1f09c-a555-4d9b-8405-0b33490bc920",
19+
"plane": "data",
1920
"recordedtime": "2025-08-28T08:45:00.000Z",
2021
"severitynumber": 2,
2122
"severitytext": "INFO",

packages/events/src/events/__tests__/testData/letter-request-prepared-with-partial-optional-fields.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
"datacontenttype": "application/json",
1515
"dataschema": "https://notify.nhs.uk/cloudevents/schemas/letter-rendering/letter-request.prepared.1.0.0.schema.json",
1616
"id": "23f1f09c-a555-4d9b-8405-0b33490bc920",
17+
"plane": "data",
1718
"recordedtime": "2025-08-28T08:45:00.000Z",
1819
"severitynumber": 2,
1920
"severitytext": "INFO",

packages/events/src/events/__tests__/testData/letter-request-prepared-without-optional-fields.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
"datacontenttype": "application/json",
1313
"dataschema": "https://notify.nhs.uk/cloudevents/schemas/letter-rendering/letter-request.prepared.1.0.0.schema.json",
1414
"id": "23f1f09c-a555-4d9b-8405-0b33490bc920",
15+
"plane": "data",
1516
"recordedtime": "2025-08-28T08:45:00.000Z",
1617
"severitynumber": 2,
1718
"severitytext": "INFO",

packages/events/src/events/event-envelope.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,12 @@ export function EventEnvelope<TData extends z.ZodTypeAny>(
135135
}),
136136
),
137137

138+
plane: z.literal("data").meta({
139+
title: "Event Plane",
140+
description: "The event bus in which the event was generated.",
141+
examples: ["data"],
142+
}),
143+
138144
recordedtime: z.iso.datetime().meta({
139145
title: "Recorded Time",
140146
description:

0 commit comments

Comments
 (0)