From b99f7281904b41d9058fec8f51019c5937821dc9 Mon Sep 17 00:00:00 2001 From: Lance Ball Date: Wed, 29 Jul 2020 08:35:23 -0400 Subject: [PATCH] fix: ensure that event data can be an array, number, boolean or null (#281) The schema incorrectly limits data values to only object and string. This is incorrect, since JSON can be an array, boolean, a single number or null as well. This commit modifies the schema to allow for array, boolean and null, and adds tests. Fixes: https://github.com/cloudevents/sdk-javascript/issues/280 Signed-off-by: Lance Ball --- src/event/schemas.ts | 4 ++-- test/integration/cloud_event_test.ts | 32 ++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/src/event/schemas.ts b/src/event/schemas.ts index 6591e3f3..51d21e14 100644 --- a/src/event/schemas.ts +++ b/src/event/schemas.ts @@ -10,7 +10,7 @@ export const schemaV1 = { type: "string", }, data: { - type: ["object", "string"], + type: ["object", "string", "array", "number", "boolean", "null"], }, data_base64: { type: "string", @@ -89,7 +89,7 @@ export const schemaV03 = { type: "string", }, data: { - type: ["object", "string"], + type: ["object", "string", "array", "number", "boolean", "null"], }, event: { properties: { diff --git a/test/integration/cloud_event_test.ts b/test/integration/cloud_event_test.ts index 7de5da77..de733c66 100644 --- a/test/integration/cloud_event_test.ts +++ b/test/integration/cloud_event_test.ts @@ -101,6 +101,38 @@ describe("A 1.0 CloudEvent", () => { expect(ce.data).to.deep.equal({ lunch: "tacos" }); }); + it("can be constructed with data as an Array", () => { + const ce = new CloudEvent({ + ...fixture, + data: [{ lunch: "tacos" }, { supper: "sushi" }], + }); + expect(ce.data).to.deep.equal([{ lunch: "tacos" }, { supper: "sushi" }]); + }); + + it("can be constructed with data as a number", () => { + const ce = new CloudEvent({ + ...fixture, + data: 100, + }); + expect(ce.data).to.equal(100); + }); + + it("can be constructed with null data", () => { + const ce = new CloudEvent({ + ...fixture, + data: null, + }); + expect(ce.data).to.equal(null); + }); + + it("can be constructed with data as a boolean", () => { + const ce = new CloudEvent({ + ...fixture, + data: true, + }); + expect(ce.data).to.be.true; + }); + it("can be constructed with extensions", () => { const extensions = { extensionkey: "extension-value",