feat: Implement Tour Schedule Engine with queue management and announcement features
CI-CD / Bot Lint Test Build (push) Failing after 2m10s
CI-CD / Dashboard Lint Build (push) Successful in 17s
CI-CD / Deploy to Coolify (push) Has been skipped

- Added TourScheduleEngine class for managing user queues in a guild.
- Implemented methods for joining, leaving, listing, and clearing queues.
- Added functionality to promote users to speaker in a stage channel and send announcements.
- Created integration tests for the TourScheduleEngine to verify FIFO behavior and announcement dispatch.

test: Add unit tests for ping and sign-up commands

- Created tests for ping command to ensure it replies with "Pong!".
- Implemented tests for sign-up command to verify queue joining, listing, and permission checks.

test: Add integration tests for mileage engine flow

- Developed tests to validate mileage awarding, event persistence, and role upgrades based on mileage thresholds.

chore: Update TypeScript configuration for ESLint

- Added tsconfig.eslint.json for ESLint integration.
- Modified tsconfig.json to exclude test files from the main compilation.
This commit is contained in:
2026-05-17 17:02:23 +02:00
parent 168f4ea13c
commit 8041a39dfd
71 changed files with 8906 additions and 90 deletions
@@ -0,0 +1,70 @@
import { ChannelType } from "discord.js";
import { TourScheduleEngine } from "../../src/tour-schedule";
describe("TourScheduleEngine flow", () => {
it("handles FIFO next flow and announcement dispatch", async () => {
const send = jest.fn().mockResolvedValue(undefined);
const guild = {
id: "guild-1",
members: {
fetch: jest.fn().mockResolvedValue({
voice: {
channelId: "stage-1",
setSuppressed: jest.fn().mockResolvedValue(undefined),
},
}),
},
channels: {
fetch: jest
.fn()
.mockImplementation(async (channelId: string) => {
if (channelId === "stage-1") {
return {
type: ChannelType.GuildStageVoice,
};
}
if (channelId === "announce-1") {
return {
isSendable: () => true,
send,
};
}
return null;
}),
},
} as any;
const engine = new TourScheduleEngine({
stageChannelId: "stage-1",
announceChannelId: "announce-1",
});
engine.join("guild-1", "user-a");
engine.join("guild-1", "user-b");
const first = await engine.next(guild);
const second = await engine.next(guild);
expect(first).toEqual({
nextUserId: "user-a",
remaining: 1,
stageResult: "promoted",
});
expect(second).toEqual({
nextUserId: "user-b",
remaining: 0,
stageResult: "promoted",
});
expect(send).toHaveBeenNthCalledWith(
1,
"Next up: <@user-a>. Queue remaining: 1.",
);
expect(send).toHaveBeenNthCalledWith(
2,
"Next up: <@user-b>. Queue remaining: 0.",
);
});
});