moleculer
Version:
Fast & powerful microservices framework for Node.JS
338 lines (284 loc) • 10.5 kB
JavaScript
const Context = require("../../src/context");
const { ValidationError } = require("../../src/errors");
const P = require("../../src/packets");
describe("Test base Packet", () => {
const transit = {
nodeID: "node-1",
serialize: jest.fn(),
deserialize: jest.fn(msg => JSON.parse(msg))
};
it("create Packet without type", () => {
let packet = new P.Packet(transit);
expect(packet).toBeDefined();
expect(packet.transit).toBe(transit);
expect(packet.type).toBe(P.PACKET_UNKNOW);
expect(packet.target).toBeUndefined();
expect(packet.payload).toBeDefined();
expect(packet.payload.sender).toBe("node-1");
});
it("create Packet with type & target", () => {
let packet = new P.Packet(transit, P.PACKET_EVENT, "node-2");
expect(packet).toBeDefined();
expect(packet.transit).toBe(transit);
expect(packet.type).toBe(P.PACKET_EVENT);
expect(packet.target).toBe("node-2");
expect(packet.payload).toBeDefined();
expect(packet.payload.sender).toBe("node-1");
});
it("should call transit.serialize", () => {
transit.serialize.mockClear();
let packet = new P.Packet(transit, P.PACKET_EVENT, "node-2");
packet.serialize();
expect(transit.serialize).toHaveBeenCalledTimes(1);
expect(transit.serialize).toHaveBeenCalledWith(packet.payload, P.PACKET_EVENT);
});
it("should set payload", () => {
let packet = new P.Packet(transit, P.PACKET_EVENT, "node-2");
let obj = { a: 5 };
packet.transformPayload(obj);
expect(packet.payload).toBe(obj);
});
it("should return a Packet instance", () => {
transit.deserialize.mockClear();
let packet = P.Packet.deserialize(transit, P.PACKET_HEARTBEAT, '{"a": 5}');
expect(packet).toBeInstanceOf(P.PacketHeartbeat);
expect(packet.payload).toEqual({ a: 5 });
expect(transit.deserialize).toHaveBeenCalledTimes(1);
expect(transit.deserialize).toHaveBeenCalledWith('{"a": 5}', P.PACKET_HEARTBEAT);
});
});
describe("Test PacketDisconnect", () => {
const transit = { nodeID: "node-1" };
it("should set properties", () => {
let packet = new P.PacketDisconnect(transit);
expect(packet).toBeDefined();
expect(packet.type).toBe(P.PACKET_DISCONNECT);
expect(packet.target).toBeUndefined();
expect(packet.payload).toBeDefined();
expect(packet.payload.sender).toBe("node-1");
});
});
describe("Test PacketHeartbeat", () => {
const transit = { nodeID: "node-1" };
it("should set properties", () => {
let packet = new P.PacketHeartbeat(transit);
expect(packet).toBeDefined();
expect(packet.type).toBe(P.PACKET_HEARTBEAT);
expect(packet.target).toBeUndefined();
expect(packet.payload).toBeDefined();
expect(packet.payload.sender).toBe("node-1");
});
});
describe("Test PacketDiscover", () => {
const transit = { nodeID: "node-1" };
it("should set properties", () => {
let packet = new P.PacketDiscover(transit);
expect(packet).toBeDefined();
expect(packet.type).toBe(P.PACKET_DISCOVER);
expect(packet.target).toBeUndefined();
expect(packet.payload).toEqual({ sender: "node-1" });
});
});
describe("Test PacketInfo", () => {
const transit = { nodeID: "node-1" };
it("should set properties", () => {
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
};
let packet = new P.PacketInfo(transit, "node-2", info);
expect(packet).toBeDefined();
expect(packet.type).toBe(P.PACKET_INFO);
expect(packet.target).toBe("node-2");
expect(packet.payload).toBeDefined();
expect(packet.payload.sender).toBe("node-1");
expect(packet.payload.services).toBe("[{\"name\":\"users\",\"version\":\"2\",\"settings\":{},\"actions\":{\"users.create\":{}}}]");
expect(packet.payload.ipList).toEqual(info.ipList);
expect(packet.payload.versions).toEqual(info.versions);
expect(packet.payload.uptime).toEqual(info.uptime);
});
it("should transform payload", () => {
let payload = {
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
};
let packet = new P.PacketInfo(transit, "server-2", {});
packet.transformPayload(payload);
expect(packet.payload.services).toEqual([
{ name: "users", version: "2", settings: {}, actions: {
"users.create": {}
}}
]);
expect(packet.payload.ipList).toEqual(payload.ipList);
expect(packet.payload.versions).toEqual(payload.versions);
expect(packet.payload.uptime).toEqual(payload.uptime);
});
});
describe("Test PacketEvent", () => {
const transit = { nodeID: "node-1" };
it("should set properties", () => {
let data = { id: 5 };
let packet = new P.PacketEvent(transit, "user.created", data);
expect(packet).toBeDefined();
expect(packet.type).toBe(P.PACKET_EVENT);
expect(packet.target).toBeUndefined();
expect(packet.payload).toBeDefined();
expect(packet.payload.sender).toBe("node-1");
expect(packet.payload.event).toBe("user.created");
expect(packet.payload.data).toBe("{\"id\":5}");
});
it("should transform payload", () => {
let payload = {
data: "{\"a\":5}"
};
let packet = new P.PacketEvent(transit, "user.created", {});
packet.transformPayload(payload);
expect(packet.payload.data).toEqual({ a: 5 });
});
it("should convert undefined", () => {
let packet = new P.PacketEvent(transit, "user.updated");
expect(packet).toBeDefined();
expect(packet.type).toBe(P.PACKET_EVENT);
expect(packet.target).toBeUndefined();
expect(packet.payload).toBeDefined();
expect(packet.payload.sender).toBe("node-1");
expect(packet.payload.event).toBe("user.updated");
expect(packet.payload.data).toBeNull();
});
it("should transform without payload", () => {
let payload = {
data: undefined
};
let packet = new P.PacketEvent(transit, "user.created", {});
packet.transformPayload(payload);
expect(packet.payload.data).toBeUndefined();
});
});
describe("Test PacketRequest", () => {
const transit = { nodeID: "node-1" };
it("should set properties", () => {
let 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.retryCount = 2;
ctx.metrics = true;
ctx.parentID = "999";
let packet = new P.PacketRequest(transit, "server-2", ctx);
expect(packet).toBeDefined();
expect(packet.type).toBe(P.PACKET_REQUEST);
expect(packet.target).toBe("server-2");
expect(packet.payload).toBeDefined();
expect(packet.payload.sender).toBe("node-1");
expect(packet.payload.id).toBe("100");
expect(packet.payload.action).toBe("posts.find");
expect(packet.payload.params).toBe("{\"id\":5}");
expect(packet.payload.meta).toBe("{\"user\":{\"id\":1,\"roles\":[\"admin\"]}}");
expect(packet.payload.timeout).toBe(1500);
expect(packet.payload.level).toBe(4);
expect(packet.payload.metrics).toBe(true);
expect(packet.payload.parentID).toBe("999");
});
it("should transform payload", () => {
let payload = {
params: "{\"a\":5}",
meta: "{\"b\":\"John\"}"
};
let packet = new P.PacketRequest(transit, "server-2");
packet.transformPayload(payload);
expect(packet.payload.params).toEqual({ a: 5 });
expect(packet.payload.meta).toEqual({ b: "John" });
});
});
describe("Test PacketResponse", () => {
const transit = { nodeID: "node-1" };
it("should set properties without error", () => {
let data = { id: 5 };
let packet = new P.PacketResponse(transit, "server-2", "12345", data);
expect(packet).toBeDefined();
expect(packet.type).toBe(P.PACKET_RESPONSE);
expect(packet.target).toBe("server-2");
expect(packet.payload).toBeDefined();
expect(packet.payload.sender).toBe("node-1");
expect(packet.payload.id).toBe("12345");
expect(packet.payload.success).toBe(true);
expect(packet.payload.data).toBe("{\"id\":5}");
expect(packet.payload.error).toBeUndefined();
});
it("should set properties with error", () => {
let err = new ValidationError("Validation error", "ERR_INVALID_A", { a: 5 });
let packet = new P.PacketResponse(transit, "server-2", "12345", null, err);
expect(packet).toBeDefined();
expect(packet.type).toBe(P.PACKET_RESPONSE);
expect(packet.target).toBe("server-2");
expect(packet.payload).toBeDefined();
expect(packet.payload.sender).toBe("node-1");
expect(packet.payload.id).toBe("12345");
expect(packet.payload.success).toBe(false);
expect(packet.payload.data).toBeNull();
expect(packet.payload.error).toBeDefined();
expect(packet.payload.error.name).toBe("ValidationError");
expect(packet.payload.error.message).toBe("Validation error");
expect(packet.payload.error.code).toBe(422);
expect(packet.payload.error.type).toBe("ERR_INVALID_A");
expect(packet.payload.error.nodeID).toBe("node-1");
expect(packet.payload.error.data).toBe("{\"a\":5}");
});
it("should transform payload without error", () => {
let payload = {
data: "{\"a\":5}"
};
let packet = new P.PacketResponse(transit, "server-2", "12345", {});
packet.transformPayload(payload);
expect(packet.payload.data).toEqual({ a: 5 });
expect(packet.payload.error).toBeUndefined();
});
it("should transform payload with error", () => {
let payload = {
data: null,
error: {
name: "MoleculerError",
message: "Something happened",
code: 500,
type: "ERR_SOMETHING",
nodeID: "far-far-node",
data: "{\"a\":5}"
}
};
let packet = new P.PacketResponse(transit, "server-2", "12345", {});
packet.transformPayload(payload);
expect(packet.payload.data).toBeNull();
expect(packet.payload.error).toBeDefined();
expect(packet.payload.error.name).toBe("MoleculerError");
expect(packet.payload.error.message).toBe("Something happened");
expect(packet.payload.error.code).toBe(500);
expect(packet.payload.error.type).toBe("ERR_SOMETHING");
expect(packet.payload.error.nodeID).toBe("far-far-node");
expect(packet.payload.error.data).toEqual({ a: 5 });
});
});