moleculer
Version:
Fast & powerful microservices framework for Node.JS
565 lines (480 loc) • 19.1 kB
JavaScript
const ServiceBroker = require("../../src/service-broker");
const FakeTransporter = require("../../src/transporters/fake");
const Serializers = require("../../src/serializers");
const Context = require("../../src/context");
const { ValidationError } = require("../../src/errors");
const P = require("../../src/packets");
const ctx = new Context();
ctx.id = "100";
ctx.action = {
name: "posts.find"
};
// requestID: "12345",
ctx.params = { id: 5 };
ctx.meta = {
user: {
id: 1,
roles: [ "admin" ]
}
};
ctx.level = 4;
ctx.timeout = 1500;
ctx.metrics = true;
ctx.parentID = "999";
describe("Test JSON serializer", () => {
const broker = new ServiceBroker({
nodeID: "test-1",
transporter: new FakeTransporter(),
serializer: new Serializers.JSON
});
it("should serialize the disconnect packet", () => {
const packet = new P.PacketDisconnect(broker.transit);
const s = packet.serialize();
expect(s).toBe("{\"sender\":\"test-1\"}");
const res = P.Packet.deserialize(broker.transit, P.PACKET_DISCONNECT, s);
expect(res).toBeInstanceOf(P.PacketDisconnect);
});
it("should serialize the heartbeat packet", () => {
const packet = new P.PacketHeartbeat(broker.transit, 120);
const s = packet.serialize();
expect(s).toBe("{\"sender\":\"test-1\",\"uptime\":120}");
const res = P.Packet.deserialize(broker.transit, P.PACKET_HEARTBEAT, s);
expect(res).toBeInstanceOf(P.PacketHeartbeat);
expect(res.payload.uptime).toBe(120);
});
it("should serialize the discover packet", () => {
const packet = new P.PacketDiscover(broker.transit);
const s = packet.serialize();
expect(s).toBe("{\"sender\":\"test-1\"}");
const res = P.Packet.deserialize(broker.transit, P.PACKET_DISCOVER, s);
expect(res).toBeInstanceOf(P.PacketDiscover);
expect(res.payload).toEqual({ sender: "test-1" });
});
it("should serialize the info packet", () => {
const info = {
services: [
{ name: "users", version: "2", settings: {}, actions: {
"users.create": {}
}}
],
ipList: [ "127.0.0.1" ],
versions: {
node: "6.10.2",
moleculer: "1.2.3"
},
uptime: 100
};
const packet = new P.PacketInfo(broker.transit, "test-2", info);
const s = packet.serialize();
expect(s).toBe("{\"sender\":\"test-1\",\"services\":\"[{\\\"name\\\":\\\"users\\\",\\\"version\\\":\\\"2\\\",\\\"settings\\\":{},\\\"actions\\\":{\\\"users.create\\\":{}}}]\",\"ipList\":[\"127.0.0.1\"],\"versions\":{\"node\":\"6.10.2\",\"moleculer\":\"1.2.3\"},\"uptime\":100}");
const res = P.Packet.deserialize(broker.transit, P.PACKET_INFO, s);
expect(res).toBeInstanceOf(P.PacketInfo);
expect(res.payload.services).toEqual(info.services);
expect(res.payload.ipList).toEqual(info.ipList);
expect(res.payload.versions).toEqual(info.versions);
expect(res.payload.uptime).toEqual(info.uptime);
});
it("should serialize the event packet", () => {
const data = {
a: 5,
b: "Test"
};
const packet = new P.PacketEvent(broker.transit, "user.created", data);
const s = packet.serialize();
expect(s).toBe("{\"sender\":\"test-1\",\"event\":\"user.created\",\"data\":\"{\\\"a\\\":5,\\\"b\\\":\\\"Test\\\"}\"}");
const res = P.Packet.deserialize(broker.transit, P.PACKET_EVENT, s);
expect(res).toBeInstanceOf(P.PacketEvent);
expect(res.payload.data).toEqual(data);
});
it("should serialize the request packet", () => {
const packet = new P.PacketRequest(broker.transit, "test-2", ctx);
const s = packet.serialize();
expect(s).toBe("{\"sender\":\"test-1\",\"id\":\"100\",\"action\":\"posts.find\",\"params\":\"{\\\"id\\\":5}\",\"meta\":\"{\\\"user\\\":{\\\"id\\\":1,\\\"roles\\\":[\\\"admin\\\"]}}\",\"timeout\":1500,\"level\":4,\"metrics\":true,\"parentID\":\"999\"}");
const res = P.Packet.deserialize(broker.transit, P.PACKET_REQUEST, s);
expect(res).toBeInstanceOf(P.PacketRequest);
expect(res.payload.id).toBe("100");
expect(res.payload.action).toBe("posts.find");
expect(res.payload.params).toEqual(ctx.params);
expect(res.payload.meta).toEqual(ctx.meta);
expect(res.payload.timeout).toBe(1500);
expect(res.payload.metrics).toBe(true);
expect(res.payload.parentID).toBe("999");
});
it("should serialize the response packet with data", () => {
const data = [
{ id: 1, name: "John" },
{ id: 2, name: "Jane" }
];
const packet = new P.PacketResponse(broker.transit, "test-2", "12345", data);
const s = packet.serialize();
expect(s).toBe("{\"sender\":\"test-1\",\"id\":\"12345\",\"success\":true,\"data\":\"[{\\\"id\\\":1,\\\"name\\\":\\\"John\\\"},{\\\"id\\\":2,\\\"name\\\":\\\"Jane\\\"}]\"}");
const res = P.Packet.deserialize(broker.transit, P.PACKET_RESPONSE, s);
expect(res).toBeInstanceOf(P.PacketResponse);
expect(res.payload.id).toBe("12345");
expect(res.payload.data).toEqual(data);
});
it("should serialize the response packet with error", () => {
const err = new ValidationError("Invalid email!", "ERR_INVALID_A", { a: 5 });
err.stack ="STACK_PLACEHOLDER";
const packet = new P.PacketResponse(broker.transit, "test-2", "12345", null, err);
const s = packet.serialize();
expect(s).toBe("{\"sender\":\"test-1\",\"id\":\"12345\",\"success\":false,\"data\":null,\"error\":{\"name\":\"ValidationError\",\"message\":\"Invalid email!\",\"nodeID\":\"test-1\",\"code\":422,\"type\":\"ERR_INVALID_A\",\"stack\":\"STACK_PLACEHOLDER\",\"data\":\"{\\\"a\\\":5}\"}}");
const res = P.Packet.deserialize(broker.transit, P.PACKET_RESPONSE, s);
expect(res).toBeInstanceOf(P.PacketResponse);
expect(res.payload.id).toBe("12345");
expect(res.payload.error).toEqual({
name: "ValidationError",
message: "Invalid email!",
code: 422,
nodeID: "test-1",
type: "ERR_INVALID_A",
stack: "STACK_PLACEHOLDER",
data: {
a: 5
}
});
});
});
describe("Test Avro serializer", () => {
const broker = new ServiceBroker({
nodeID: "test-1",
transporter: new FakeTransporter(),
serializer: new Serializers.Avro
});
it("should serialize the disconnect packet", () => {
const packet = new P.PacketDisconnect(broker.transit);
const s = packet.serialize();
expect(s.length).toBe(7);
const res = P.Packet.deserialize(broker.transit, P.PACKET_DISCONNECT, s);
expect(res).toBeInstanceOf(P.PacketDisconnect);
});
it("should serialize the heartbeat packet", () => {
const packet = new P.PacketHeartbeat(broker.transit, 120);
const s = packet.serialize();
expect(s.length).toBe(15);
const res = P.Packet.deserialize(broker.transit, P.PACKET_HEARTBEAT, s);
expect(res).toBeInstanceOf(P.PacketHeartbeat);
expect(res.payload.uptime).toBe(120);
});
it("should serialize the discover packet", () => {
const packet = new P.PacketDiscover(broker.transit);
const s = packet.serialize();
expect(s.length).toBe(7);
const res = P.Packet.deserialize(broker.transit, P.PACKET_DISCOVER, s);
expect(res).toBeInstanceOf(P.PacketDiscover);
expect(res.payload).toEqual({ sender: "test-1" });
});
it("should serialize the info packet", () => {
const info = {
services: [
{ name: "users", version: "2", settings: {}, actions: {
"users.create": {}
}}
],
ipList: [ "127.0.0.1" ],
versions: {
node: "6.10.2",
moleculer: "1.2.3"
},
uptime: 100
};
const packet = new P.PacketInfo(broker.transit, "test-2", info);
const s = packet.serialize();
expect(s.length).toBe(118);
const res = P.Packet.deserialize(broker.transit, P.PACKET_INFO, s);
expect(res).toBeInstanceOf(P.PacketInfo);
expect(res.payload.services).toEqual(info.services);
expect(res.payload.ipList).toEqual(info.ipList);
expect(res.payload.versions).toEqual(info.versions);
expect(res.payload.uptime).toEqual(info.uptime);
});
it("should serialize the event packet", () => {
const data = {
a: 5,
b: "Test"
};
const packet = new P.PacketEvent(broker.transit, "user.created", data);
const s = packet.serialize();
expect(s.length).toBe(39);
const res = P.Packet.deserialize(broker.transit, P.PACKET_EVENT, s);
expect(res).toBeInstanceOf(P.PacketEvent);
expect(res.payload.data).toEqual(data);
});
it("should serialize the request packet", () => {
const packet = new P.PacketRequest(broker.transit, "test-2", ctx);
const s = packet.serialize();
expect(s.length).toBe(76);
const res = P.Packet.deserialize(broker.transit, P.PACKET_REQUEST, s);
expect(res).toBeInstanceOf(P.PacketRequest);
expect(res.payload.id).toBe("100");
expect(res.payload.action).toBe("posts.find");
expect(res.payload.params).toEqual(ctx.params);
expect(res.payload.meta).toEqual(ctx.meta);
expect(res.payload.timeout).toBe(1500);
expect(res.payload.metrics).toBe(true);
expect(res.payload.parentID).toBe("999");
});
it("should serialize the response packet with data", () => {
const data = [
{ id: 1, name: "John" },
{ id: 2, name: "Jane" }
];
const packet = new P.PacketResponse(broker.transit, "test-2", "12345", data);
const s = packet.serialize();
expect(s.length).toBe(64);
const res = P.Packet.deserialize(broker.transit, P.PACKET_RESPONSE, s);
expect(res).toBeInstanceOf(P.PacketResponse);
expect(res.payload.id).toBe("12345");
expect(res.payload.data).toEqual(data);
});
it("should serialize the response packet with error", () => {
const err = new ValidationError("Invalid email!", "ERR_INVALID_A", { a: 5 });
err.stack = "STACK_PLACEHOLDER";
const packet = new P.PacketResponse(broker.transit, "test-2", "12345", null, err);
const s = packet.serialize(100);
expect(s.length).toBe(96);
const res = P.Packet.deserialize(broker.transit, P.PACKET_RESPONSE, s);
expect(res).toBeInstanceOf(P.PacketResponse);
expect(res.payload.id).toBe("12345");
expect(res.payload.error).toEqual({
name: "ValidationError",
message: "Invalid email!",
code: 422,
nodeID: "test-1",
type: "ERR_INVALID_A",
stack: "STACK_PLACEHOLDER",
data: {
a: 5
}
});
});
});
describe("Test MsgPack serializer", () => {
const broker = new ServiceBroker({
nodeID: "test-1",
transporter: new FakeTransporter(),
serializer: new Serializers.MsgPack
});
it("should serialize the disconnect packet", () => {
const packet = new P.PacketDisconnect(broker.transit);
const s = packet.serialize();
expect(s).toBeInstanceOf(Buffer);
expect(Buffer.byteLength(s, "binary")).toBe(15);
const res = P.Packet.deserialize(broker.transit, P.PACKET_DISCONNECT, s);
expect(res).toBeInstanceOf(P.PacketDisconnect);
});
it("should serialize the heartbeat packet", () => {
const packet = new P.PacketHeartbeat(broker.transit, 120);
const s = packet.serialize();
expect(Buffer.byteLength(s, "binary")).toBe(23);
const res = P.Packet.deserialize(broker.transit, P.PACKET_HEARTBEAT, s);
expect(res).toBeInstanceOf(P.PacketHeartbeat);
expect(res.payload.uptime).toBe(120);
});
it("should serialize the discover packet", () => {
const packet = new P.PacketDiscover(broker.transit);
const s = packet.serialize();
expect(Buffer.byteLength(s, "binary")).toBe(15);
const res = P.Packet.deserialize(broker.transit, P.PACKET_DISCOVER, s);
expect(res).toBeInstanceOf(P.PacketDiscover);
expect(res.payload).toEqual({ sender: "test-1" });
});
it("should serialize the info packet", () => {
const info = {
services: [
{ name: "users", version: "2", settings: {}, actions: {
"users.create": {}
}}
],
ipList: [ "127.0.0.1" ],
versions: {
node: "6.10.2",
moleculer: "1.2.3"
},
uptime: 100
};
const packet = new P.PacketInfo(broker.transit, "test-2", info);
const s = packet.serialize();
expect(Buffer.byteLength(s, "binary")).toBe(166);
const res = P.Packet.deserialize(broker.transit, P.PACKET_INFO, s);
expect(res).toBeInstanceOf(P.PacketInfo);
expect(res.payload.services).toEqual(info.services);
expect(res.payload.ipList).toEqual(info.ipList);
expect(res.payload.versions).toEqual(info.versions);
expect(res.payload.uptime).toEqual(info.uptime);
});
it("should serialize the event packet", () => {
const data = {
a: 5,
b: "Test"
};
const packet = new P.PacketEvent(broker.transit, "user.created", data);
const s = packet.serialize();
expect(Buffer.byteLength(s, "binary")).toBe(58);
const res = P.Packet.deserialize(broker.transit, P.PACKET_EVENT, s);
expect(res).toBeInstanceOf(P.PacketEvent);
expect(res.payload.data).toEqual(data);
});
it("should serialize the request packet", () => {
const packet = new P.PacketRequest(broker.transit, "test-2", ctx);
const s = packet.serialize();
expect(Buffer.byteLength(s, "binary")).toBe(138);
const res = P.Packet.deserialize(broker.transit, P.PACKET_REQUEST, s);
expect(res).toBeInstanceOf(P.PacketRequest);
expect(res.payload.id).toBe("100");
expect(res.payload.action).toBe("posts.find");
expect(res.payload.params).toEqual(ctx.params);
expect(res.payload.meta).toEqual(ctx.meta);
expect(res.payload.timeout).toBe(1500);
expect(res.payload.metrics).toBe(true);
expect(res.payload.parentID).toBe("999");
});
it("should serialize the response packet with data", () => {
const data = [
{ id: 1, name: "John" },
{ id: 2, name: "Jane" }
];
const packet = new P.PacketResponse(broker.transit, "test-2", "12345", data);
const s = packet.serialize();
expect(Buffer.byteLength(s, "binary")).toBe(87);
const res = P.Packet.deserialize(broker.transit, P.PACKET_RESPONSE, s);
expect(res).toBeInstanceOf(P.PacketResponse);
expect(res.payload.id).toBe("12345");
expect(res.payload.data).toEqual(data);
});
it("should serialize the response packet with error", () => {
const err = new ValidationError("Invalid email!", "ERR_INVALID_A", { a: 5 });
err.stack = "STACK_PLACEHOLDER";
const packet = new P.PacketResponse(broker.transit, "test-2", "12345", null, err);
const s = packet.serialize();
expect(Buffer.byteLength(s, "binary")).toBe(168);
const res = P.Packet.deserialize(broker.transit, P.PACKET_RESPONSE, s);
expect(res).toBeInstanceOf(P.PacketResponse);
expect(res.payload.id).toBe("12345");
expect(res.payload.error).toEqual({
name: "ValidationError",
message: "Invalid email!",
code: 422,
type: "ERR_INVALID_A",
nodeID: "test-1",
stack: "STACK_PLACEHOLDER",
data: {
a: 5
}
});
});
});
describe("Test ProtoBuf serializer", () => {
const broker = new ServiceBroker({
nodeID: "test-1",
transporter: new FakeTransporter(),
serializer: new Serializers.ProtoBuf
});
it("should serialize the disconnect packet", () => {
const packet = new P.PacketDisconnect(broker.transit);
const s = packet.serialize();
expect(s.length).toBe(8);
const res = P.Packet.deserialize(broker.transit, P.PACKET_DISCONNECT, s);
expect(res).toBeInstanceOf(P.PacketDisconnect);
});
it("should serialize the heartbeat packet", () => {
const packet = new P.PacketHeartbeat(broker.transit, 120);
const s = packet.serialize();
expect(s.length).toBe(17);
const res = P.Packet.deserialize(broker.transit, P.PACKET_HEARTBEAT, s);
expect(res).toBeInstanceOf(P.PacketHeartbeat);
expect(res.payload.uptime).toBe(120);
});
it("should serialize the discover packet", () => {
const packet = new P.PacketDiscover(broker.transit);
const s = packet.serialize();
expect(s.length).toBe(8);
const res = P.Packet.deserialize(broker.transit, P.PACKET_DISCOVER, s);
expect(res).toBeInstanceOf(P.PacketDiscover);
expect(res.payload).toEqual({ sender: "test-1" });
});
it("should serialize the info packet", () => {
const info = {
services: [
{ name: "users", version: "2", settings: {}, actions: {
"users.create": {}
}}
],
ipList: [ "127.0.0.1" ],
versions: {
node: "6.10.2",
moleculer: "1.2.3"
},
uptime: 100
};
const packet = new P.PacketInfo(broker.transit, "test-2", info);
const s = packet.serialize();
expect(s.length).toBe(123);
const res = P.Packet.deserialize(broker.transit, P.PACKET_INFO, s);
expect(res).toBeInstanceOf(P.PacketInfo);
expect(res.payload.services).toEqual(info.services);
expect(res.payload.ipList).toEqual(info.ipList);
expect(res.payload.versions).toEqual(info.versions);
expect(res.payload.uptime).toEqual(info.uptime);
});
it("should serialize the event packet", () => {
const data = {
a: 5,
b: "Test"
};
const packet = new P.PacketEvent(broker.transit, "user.created", data);
const s = packet.serialize();
expect(s.length).toBe(42);
const res = P.Packet.deserialize(broker.transit, P.PACKET_EVENT, s);
expect(res).toBeInstanceOf(P.PacketEvent);
expect(res.payload.data).toEqual(data);
});
it("should serialize the request packet", () => {
const packet = new P.PacketRequest(broker.transit, "test-2", ctx);
const s = packet.serialize();
expect(s.length).toBe(84);
const res = P.Packet.deserialize(broker.transit, P.PACKET_REQUEST, s);
expect(res).toBeInstanceOf(P.PacketRequest);
expect(res.payload.id).toBe("100");
expect(res.payload.action).toBe("posts.find");
expect(res.payload.params).toEqual(ctx.params);
expect(res.payload.meta).toEqual(ctx.meta);
expect(res.payload.timeout).toBe(1500);
expect(res.payload.metrics).toBe(true);
expect(res.payload.parentID).toBe("999");
});
it("should serialize the response packet with data", () => {
const data = [
{ id: 1, name: "John" },
{ id: 2, name: "Jane" }
];
const packet = new P.PacketResponse(broker.transit, "test-2", "12345", data);
const s = packet.serialize();
expect(s.length).toBe(66);
const res = P.Packet.deserialize(broker.transit, P.PACKET_RESPONSE, s);
expect(res).toBeInstanceOf(P.PacketResponse);
expect(res.payload.id).toBe("12345");
expect(res.payload.data).toEqual(data);
});
it("should serialize the response packet with error", () => {
const err = new ValidationError("Invalid email!", "ERR_INVALID_A", { a: 5 });
err.stack = "STACK_PLACEHOLDER";
const packet = new P.PacketResponse(broker.transit, "test-2", "12345", null, err);
const s = packet.serialize(100);
expect(s.length).toBe(106);
const res = P.Packet.deserialize(broker.transit, P.PACKET_RESPONSE, s);
expect(res).toBeInstanceOf(P.PacketResponse);
expect(res.payload.id).toBe("12345");
expect(res.payload.error).toEqual({
name: "ValidationError",
message: "Invalid email!",
code: 422,
type: "ERR_INVALID_A",
stack: "STACK_PLACEHOLDER",
nodeID: "test-1",
data: {
a: 5
}
});
});
});