-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathfull_flow_test.js
More file actions
85 lines (69 loc) · 3.12 KB
/
Copy pathfull_flow_test.js
File metadata and controls
85 lines (69 loc) · 3.12 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
const { io } = require("socket.io-client");
const URL = "http://localhost:3000";
setTimeout(() => { console.error("HARD TIMEOUT - killing test"); process.exit(2); }, 35000);
(async () => {
const host = io(URL, { transports: ["websocket"] });
let roomId, hostId;
const players = [{ socket: host, name: "Host" }];
const ids = {};
await new Promise((resolve) => {
host.on("connect", () => host.emit("create_room", { playerName: "Host" }));
host.on("room_created", (d) => { roomId = d.roomId; hostId = d.playerId; ids.Host = d.playerId; resolve(); });
});
for (let i = 1; i < 4; i++) {
const s = io(URL, { transports: ["websocket"] });
const name = "P" + i;
await new Promise((resolve) => {
s.on("connect", () => s.emit("join_room", { playerName: name, roomId }));
s.on("room_joined", (d) => { ids[name] = d.playerId; resolve(); });
});
players.push({ socket: s, name });
}
players.forEach((p) => p.socket.on("error", (e) => console.log("ERR[" + p.name + "]:", e)));
let parasiteSocket, parasiteName;
players.forEach((p) => {
p.socket.on("role_assigned", (d) => {
console.log("role_assigned for", p.name, "->", d.role);
if (d.role === "parasite") { parasiteSocket = p.socket; parasiteName = p.name; }
});
});
await new Promise((resolve) => {
host.once("room_settings_updated", resolve);
host.emit("update_room_settings", { roomId, settings: { meetingDuration: 2000, votingDuration: 2000, killCooldown: 10000 } });
});
await new Promise((resolve) => {
const handler = (d) => { if (d.phase === "gameplay") { host.off("phase_changed", handler); resolve(); } };
host.on("phase_changed", handler);
host.emit("start_game", { roomId });
});
await new Promise((r) => setTimeout(r, 500));
console.log("Parasite is:", parasiteName);
console.log("ids map:", ids);
// Trigger a sabotage as parasite
console.log("Emitting trigger_sabotage...");
await new Promise((resolve) => {
host.once("sabotage_triggered", (d) => { console.log("Sabotage triggered:", d.type || d); resolve(); });
parasiteSocket.emit("trigger_sabotage", { roomId, playerId: ids[parasiteName], sabotageType: "lights" });
});
await new Promise((r) => setTimeout(r, 500));
// Call an emergency meeting as host
await new Promise((resolve) => {
host.once("meeting_started", (d) => { console.log("Meeting started:", d.reason); resolve(); });
host.emit("call_emergency", { roomId, playerId: hostId });
});
// Everyone skips vote
await new Promise((resolve) => {
host.once("voting_started", () => {
players.forEach((p) => p.socket.emit("submit_vote", { roomId, playerId: ids[p.name], votedPlayerId: "skip" }));
resolve();
});
});
const results = await new Promise((resolve) => {
host.once("voting_results", resolve);
});
console.log("Voting results:", results);
await new Promise((r) => setTimeout(r, 500));
console.log("--- Forcing game end via disconnect-all (fallback) ---");
players.forEach((p) => p.socket.disconnect());
setTimeout(() => process.exit(0), 500);
})().catch((e) => { console.error("TEST FAILED:", e); process.exit(1); });