forked from syntaxbullet/AuroraBot-discord
85 lines
3.0 KiB
TypeScript
85 lines
3.0 KiB
TypeScript
import { describe, test, expect, mock, beforeEach } from "bun:test";
|
|
import { health } from "./health";
|
|
import { ChatInputCommandInteraction, Colors } from "discord.js";
|
|
import { AuroraClient } from "@/lib/BotClient";
|
|
|
|
// Mock DrizzleClient
|
|
const executeMock = mock(() => Promise.resolve());
|
|
mock.module("@shared/db/DrizzleClient", () => ({
|
|
DrizzleClient: {
|
|
execute: executeMock
|
|
}
|
|
}));
|
|
|
|
// Mock BotClient (already has lastCommandTimestamp if imported, but we might want to control it)
|
|
AuroraClient.lastCommandTimestamp = 1641481200000; // Fixed timestamp for testing
|
|
|
|
describe("Health Command", () => {
|
|
beforeEach(() => {
|
|
executeMock.mockClear();
|
|
});
|
|
|
|
test("should execute successfully and return health embed", async () => {
|
|
const interaction = {
|
|
deferReply: mock(() => Promise.resolve()),
|
|
editReply: mock(() => Promise.resolve()),
|
|
client: {
|
|
ws: {
|
|
ping: 42
|
|
}
|
|
},
|
|
user: { id: "123", username: "testuser" },
|
|
commandName: "health"
|
|
} as unknown as ChatInputCommandInteraction;
|
|
|
|
await health.execute(interaction);
|
|
|
|
expect(interaction.deferReply).toHaveBeenCalled();
|
|
expect(executeMock).toHaveBeenCalled();
|
|
expect(interaction.editReply).toHaveBeenCalled();
|
|
|
|
const editReplyCall = (interaction.editReply as any).mock.calls[0][0];
|
|
const embed = editReplyCall.embeds[0];
|
|
|
|
expect(embed.data.title).toBe("System Health Status");
|
|
expect(embed.data.color).toBe(Colors.Aqua);
|
|
|
|
// Check fields
|
|
const fields = embed.data.fields;
|
|
expect(fields).toBeDefined();
|
|
|
|
// Connectivity field
|
|
const connectivityField = fields.find((f: any) => f.name === "📡 Connectivity");
|
|
expect(connectivityField.value).toContain("42ms");
|
|
expect(connectivityField.value).toContain("Connected");
|
|
|
|
// Activity field
|
|
const activityField = fields.find((f: any) => f.name === "⌨️ Activity");
|
|
expect(activityField.value).toContain("R>"); // Relative Discord timestamp
|
|
});
|
|
|
|
test("should handle database disconnection", async () => {
|
|
executeMock.mockImplementationOnce(() => Promise.reject(new Error("DB Down")));
|
|
|
|
const interaction = {
|
|
deferReply: mock(() => Promise.resolve()),
|
|
editReply: mock(() => Promise.resolve()),
|
|
client: {
|
|
ws: {
|
|
ping: 42
|
|
}
|
|
},
|
|
user: { id: "123", username: "testuser" },
|
|
commandName: "health"
|
|
} as unknown as ChatInputCommandInteraction;
|
|
|
|
await health.execute(interaction);
|
|
|
|
const editReplyCall = (interaction.editReply as any).mock.calls[0][0];
|
|
const embed = editReplyCall.embeds[0];
|
|
const connectivityField = embed.data.fields.find((f: any) => f.name === "📡 Connectivity");
|
|
|
|
expect(connectivityField.value).toContain("Disconnected");
|
|
});
|
|
});
|