Support for data_base64 when event data is Binary

Signed-off-by: Fabio José <fabiojose@gmail.com>
This commit is contained in:
Fabio José 2019-11-04 13:41:13 -03:00
parent 16d9bfb7e3
commit 1f8940c8a7
3 changed files with 95 additions and 3 deletions

View File

@ -9,7 +9,8 @@ const {
isInteger, isInteger,
isString, isString,
isDate, isDate,
isBinary isBinary,
clone
} = require("../utils/fun.js"); } = require("../utils/fun.js");
const isValidType = (v) => const isValidType = (v) =>
@ -77,6 +78,32 @@ function Spec1(_caller) {
this.caller.prototype.getSubject = function(){ this.caller.prototype.getSubject = function(){
return this.spec.getSubject(); return this.spec.getSubject();
}; };
// format() method override
this.caller.prototype.format = function(){
// Check the constraints
this.spec.check();
// Check before getData() call
let isbin = isBinary(this.spec.payload[RESERVED_ATTRIBUTES.data]);
// May be used, if isbin==true
let payload = clone(this.spec.payload);
// To run asData()
this.getData();
// Handle when is binary, creating the data_base64
if(isbin) {
payload[RESERVED_ATTRIBUTES.data_base64] = this.spec.payload[RESERVED_ATTRIBUTES.data];
delete payload[RESERVED_ATTRIBUTES.data];
return this.formatter.format(payload);
}
// Then, format
return this.formatter.format(this.spec.payload);
};
} }
/* /*

View File

@ -2,6 +2,7 @@ const expect = require("chai").expect;
const nock = require("nock"); const nock = require("nock");
const http = require("http"); const http = require("http");
const request = require("request"); const request = require("request");
const {asBase64} = require("../lib/utils/fun.js");
const BinaryHTTPEmitter = const BinaryHTTPEmitter =
require("../lib/bindings/http/emitter_binary_1.js"); require("../lib/bindings/http/emitter_binary_1.js");
@ -38,6 +39,8 @@ const cloudevent =
.addExtension(ext1Name, ext1Value) .addExtension(ext1Name, ext1Value)
.addExtension(ext2Name, ext2Value); .addExtension(ext2Name, ext2Value);
const dataString = ")(*~^my data for ce#@#$%"
const webhook = "https://cloudevents.io/webhook/v1"; const webhook = "https://cloudevents.io/webhook/v1";
const httpcfg = { const httpcfg = {
method : "POST", method : "POST",
@ -45,6 +48,7 @@ const httpcfg = {
}; };
const binary = new BinaryHTTPEmitter(httpcfg); const binary = new BinaryHTTPEmitter(httpcfg);
const structured = new v1.StructuredHTTPEmitter(httpcfg);
describe("HTTP Transport Binding - Version 1.0", () => { describe("HTTP Transport Binding - Version 1.0", () => {
beforeEach(() => { beforeEach(() => {
@ -54,6 +58,65 @@ describe("HTTP Transport Binding - Version 1.0", () => {
.reply(201, {status: "accepted"}); .reply(201, {status: "accepted"});
}); });
describe("Structured", () => {
describe("JSON Format", () => {
it("requires '" + contentType + "' Content-Type in the header", () => {
return structured.emit(cloudevent)
.then((response) => {
expect(response.config.headers["Content-Type"])
.to.equal(contentType);
});
});
it("the request payload should be correct", () => {
return structured.emit(cloudevent)
.then((response) => {
expect(JSON.parse(response.config.data))
.to.deep.equal(cloudevent.format());
});
});
describe("Binary event data", () => {
it("the request payload should be correct when data is binary", () => {
let bindata = Uint32Array.from(dataString, (c) => c.codePointAt(0));
let expected = asBase64(bindata);
let binevent =
new Cloudevent(v1.Spec)
.type(type)
.source(source)
.dataContentType("text/plain")
.data(bindata)
.addExtension(ext1Name, ext1Value)
.addExtension(ext2Name, ext2Value);
return structured.emit(binevent)
.then((response) => {
expect(JSON.parse(response.config.data).data_base64)
.to.equal(expected);
});
});
it("the payload must have 'data_base64' when data is binary", () => {
let binevent =
new Cloudevent(v1.Spec)
.type(type)
.source(source)
.dataContentType("text/plain")
.data(Uint32Array.from(dataString, (c) => c.codePointAt(0)))
.addExtension(ext1Name, ext1Value)
.addExtension(ext2Name, ext2Value);
return structured.emit(binevent)
.then((response) => {
console.log(response.config.data);
expect(JSON.parse(response.config.data))
.to.have.property("data_base64");
});
});
});
});
});
describe("Binary", () => { describe("Binary", () => {
describe("JSON Format", () => { describe("JSON Format", () => {
it("requires '" + cloudevent.getDataContentType() + "' Content-Type in the header", () => { it("requires '" + cloudevent.getDataContentType() + "' Content-Type in the header", () => {

View File

@ -2,6 +2,7 @@ const expect = require("chai").expect;
const Spec1 = require("../lib/specs/spec_1.js"); const Spec1 = require("../lib/specs/spec_1.js");
const Cloudevent = require("../index.js"); const Cloudevent = require("../index.js");
const uuid = require("uuid/v4"); const uuid = require("uuid/v4");
const {asBase64} = require("../lib/utils/fun.js");
const id = uuid(); const id = uuid();
const type = "com.github.pull.create"; const type = "com.github.pull.create";
@ -227,12 +228,13 @@ describe("CloudEvents Spec v1.0", () => {
it("should be ok when type is 'Uint32Array' for 'Binary'", () => { it("should be ok when type is 'Uint32Array' for 'Binary'", () => {
let dataString = ")(*~^my data for ce#@#$%" let dataString = ")(*~^my data for ce#@#$%"
let expected = Uint32Array.from(dataString, (c) => c.codePointAt(0));; let dataBinary = Uint32Array.from(dataString, (c) => c.codePointAt(0));
let expected = asBase64(dataBinary);
let olddct = cloudevent.getDataContentType(); let olddct = cloudevent.getDataContentType();
cloudevent cloudevent
.dataContentType("text/plain") .dataContentType("text/plain")
.data(expected); .data(dataBinary);
expect(cloudevent.getData()).to.deep.equal(expected); expect(cloudevent.getData()).to.deep.equal(expected);
cloudevent.dataContentType(olddct); cloudevent.dataContentType(olddct);