Skip to content

Commit 7f8a631

Browse files
committed
Add mcaddon packet tests
1 parent 42c49b9 commit 7f8a631

1 file changed

Lines changed: 119 additions & 3 deletions

File tree

Lines changed: 119 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,123 @@
1-
import { describe, expect, it } from "vitest";
1+
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
2+
import { system } from "@minecraft/server";
3+
import { DataUtils } from "@lpsmods/mc-common";
4+
import {
5+
Packet,
6+
PacketEvents,
7+
PacketReceiveEvent,
8+
PacketResponseEvent,
9+
} from "./packet";
10+
11+
function encodePacket(data: unknown): string {
12+
return JSON.stringify(DataUtils.dumpJson(data));
13+
}
14+
15+
function decodePacket(message: string): any {
16+
return DataUtils.loadJson(JSON.parse(message));
17+
}
218

319
describe("Packet", () => {
4-
it("Always pass", () => {
5-
expect(true).toBe(true);
20+
beforeEach(() => {
21+
PacketEvents.receive.listeners = [];
22+
PacketEvents.response.listeners = [];
23+
});
24+
25+
afterEach(() => {
26+
vi.restoreAllMocks();
27+
});
28+
29+
it("sends request packets through script events", () => {
30+
const sendScriptEvent = vi.fn();
31+
system.sendScriptEvent = sendScriptEvent;
32+
33+
Packet.send("bridge", { method: "get", property: "answer" });
34+
35+
expect(sendScriptEvent).toHaveBeenCalledOnce();
36+
const [eventId, message] = sendScriptEvent.mock.calls[0];
37+
expect(eventId).toMatch(/^packet:/);
38+
expect(decodePacket(message)).toEqual({
39+
headers: { type: "request", sender: Packet.sender, id: "bridge" },
40+
body: { method: "get", property: "answer" },
41+
});
42+
});
43+
44+
it("applies receive listeners and sends a response when one is set", () => {
45+
const sendScriptEvent = vi.fn();
46+
system.sendScriptEvent = sendScriptEvent;
47+
const receive = vi.fn((event: PacketReceiveEvent) => {
48+
event.response = { ok: true, value: event.packet.value };
49+
});
50+
PacketEvents.receive.subscribe(receive);
51+
52+
Packet.packetReceive({
53+
id: "packet:request",
54+
message: encodePacket({
55+
headers: { type: "request", sender: "other", id: "bridge" },
56+
body: { value: 7 },
57+
}),
58+
} as any);
59+
60+
expect(receive).toHaveBeenCalledWith(expect.objectContaining({ id: "bridge", packet: { value: 7 } }));
61+
expect(sendScriptEvent).toHaveBeenCalledOnce();
62+
const [eventId, message] = sendScriptEvent.mock.calls[0];
63+
expect(eventId).toBe("packet:request");
64+
expect(decodePacket(message)).toEqual({
65+
headers: { type: "response", sender: Packet.sender, id: "bridge" },
66+
body: { ok: true, value: 7 },
67+
});
68+
});
69+
70+
it("does not send a response when receive listeners leave response empty", () => {
71+
const sendScriptEvent = vi.fn();
72+
system.sendScriptEvent = sendScriptEvent;
73+
PacketEvents.receive.subscribe(() => {});
74+
75+
Packet.packetReceive({
76+
id: "packet:request",
77+
message: encodePacket({
78+
headers: { type: "request", sender: "other", id: "bridge" },
79+
body: { value: 7 },
80+
}),
81+
} as any);
82+
83+
expect(sendScriptEvent).not.toHaveBeenCalled();
84+
});
85+
86+
it("applies response listeners with the response body", () => {
87+
const response = vi.fn();
88+
PacketEvents.response.subscribe(response);
89+
90+
Packet.packetReceive({
91+
id: "packet:response",
92+
message: encodePacket({
93+
headers: { type: "response", sender: "other", id: "bridge" },
94+
body: { ok: true },
95+
}),
96+
} as any);
97+
98+
expect(response).toHaveBeenCalledWith(new PacketResponseEvent("bridge", { ok: true }));
99+
});
100+
101+
it("resolves sendSync with the matching response packet", async () => {
102+
system.sendScriptEvent = vi.fn();
103+
const promise = Packet.sendSync("bridge", { value: 7 });
104+
105+
PacketEvents.response.apply(new PacketResponseEvent("other", { ignored: true }));
106+
PacketEvents.response.apply(new PacketResponseEvent("bridge", { ok: true }));
107+
108+
await expect(promise).resolves.toEqual({ ok: true });
109+
expect(PacketEvents.response.size).toBe(0);
110+
});
111+
112+
it("throws for unknown packet header types", () => {
113+
expect(() =>
114+
Packet.packetReceive({
115+
id: "packet:invalid",
116+
message: encodePacket({
117+
headers: { type: "wat", sender: "other", id: "bridge" },
118+
body: {},
119+
}),
120+
} as any),
121+
).toThrow("'wat' is not a valid packet type!");
6122
});
7123
});

0 commit comments

Comments
 (0)