119 lines
3.4 KiB
TypeScript
119 lines
3.4 KiB
TypeScript
import { beforeEach, describe, expect, it, vi } from "vitest";
|
|
|
|
const updateAttachmentAsFailedUpload = vi.fn();
|
|
const updateAttachmentAsUploaded = vi.fn();
|
|
const updateAttachmentDiscordUrl = vi.fn();
|
|
const uploadToTele = vi.fn();
|
|
|
|
vi.mock("../../src/moderation/messageStore", () => ({
|
|
updateAttachmentAsFailedUpload,
|
|
updateAttachmentAsUploaded,
|
|
updateAttachmentDiscordUrl,
|
|
}));
|
|
|
|
vi.mock("../../src/uploader/teleUpload", async () => {
|
|
const actual = await vi.importActual<
|
|
typeof import("../../src/uploader/teleUpload")
|
|
>("../../src/uploader/teleUpload");
|
|
return {
|
|
...actual,
|
|
uploadToTele,
|
|
};
|
|
});
|
|
|
|
beforeEach(() => {
|
|
vi.clearAllMocks();
|
|
process.env = {
|
|
...process.env,
|
|
DISCORD_TOKEN: "test-token",
|
|
MONITOR_GUILD_ID: "test-guild",
|
|
NODE_ENV: "test",
|
|
};
|
|
});
|
|
|
|
describe("attachmentUploader", () => {
|
|
it("parses tele upload response correctly", async () => {
|
|
const { parseTeleUploadResponse } = await import(
|
|
"../../src/uploader/teleUpload"
|
|
);
|
|
|
|
const result = parseTeleUploadResponse({
|
|
download_url: "https://upload.asepharyana.tech/d/abc123.jpg",
|
|
public_id: "abc123",
|
|
file_name: "abc123.jpg",
|
|
size_bytes: 102400,
|
|
});
|
|
|
|
expect(result.url).toBe("https://upload.asepharyana.tech/d/abc123.jpg");
|
|
expect(result.publicId).toBe("abc123");
|
|
expect(result.filename).toBe("abc123.jpg");
|
|
expect(result.sizeBytes).toBe(102400);
|
|
});
|
|
|
|
it("handles upload response with missing download_url", async () => {
|
|
const { parseTeleUploadResponse } = await import(
|
|
"../../src/uploader/teleUpload"
|
|
);
|
|
|
|
expect(() => parseTeleUploadResponse({ download_url: "" })).toThrow(
|
|
/download_url/,
|
|
);
|
|
});
|
|
|
|
it("refreshes Discord URL after expired CDN response", async () => {
|
|
const { processAttachmentUpload } = await import(
|
|
"../../src/moderation/attachmentUploader"
|
|
);
|
|
const oldBytes = Buffer.from("old");
|
|
const freshBytes = Buffer.from("fresh");
|
|
|
|
global.fetch = vi.fn().mockImplementation((url: string) => {
|
|
if (url === "https://cdn.discordapp.com/old.png") {
|
|
return Promise.resolve({ ok: false, status: 404 });
|
|
}
|
|
if (url === "https://cdn.discordapp.com/fresh.png") {
|
|
return Promise.resolve({
|
|
ok: true,
|
|
arrayBuffer: async () =>
|
|
freshBytes.buffer.slice(
|
|
freshBytes.byteOffset,
|
|
freshBytes.byteOffset + freshBytes.byteLength,
|
|
),
|
|
});
|
|
}
|
|
return Promise.resolve({
|
|
ok: true,
|
|
arrayBuffer: async () =>
|
|
oldBytes.buffer.slice(
|
|
oldBytes.byteOffset,
|
|
oldBytes.byteOffset + oldBytes.byteLength,
|
|
),
|
|
});
|
|
});
|
|
uploadToTele.mockResolvedValue({ url: "https://upload.example/fresh.png" });
|
|
|
|
await processAttachmentUpload(
|
|
"att-1",
|
|
"https://cdn.discordapp.com/old.png",
|
|
"image.png",
|
|
{
|
|
refreshDiscordUrl: async () => "https://cdn.discordapp.com/fresh.png",
|
|
},
|
|
);
|
|
|
|
expect(updateAttachmentDiscordUrl).toHaveBeenCalledWith(
|
|
"att-1",
|
|
"https://cdn.discordapp.com/fresh.png",
|
|
);
|
|
expect(uploadToTele).toHaveBeenCalledWith(
|
|
expect.objectContaining({ buffer: freshBytes, filename: "image.png" }),
|
|
);
|
|
expect(updateAttachmentAsUploaded).toHaveBeenCalledWith(
|
|
"att-1",
|
|
"https://upload.example/fresh.png",
|
|
expect.any(Number),
|
|
);
|
|
expect(updateAttachmentAsFailedUpload).not.toHaveBeenCalled();
|
|
});
|
|
});
|