import type { Request, Response } from "express"; import { describe, expect, it, vi } from "vitest"; import { createMediaRoutes } from "../../src/routes/mediaRoutes"; function getHandler( router: ReturnType, path: string, method: string, ) { const layer = router.stack.find((item) => item.route?.path === path); return layer?.route?.stack.find((item) => item.method === method)?.handle; } describe("createMediaRoutes", () => { it("returns media status", async () => { const controller = { getState: vi.fn(() => ({ playing: false, current: null, queue: [] })), queue: vi.fn(), skip: vi.fn(), stop: vi.fn(), }; const handler = getHandler( createMediaRoutes(controller), "/media/status", "get", ); const json = vi.fn(); await handler?.({} as Request, { json } as unknown as Response, vi.fn()); expect(json).toHaveBeenCalledWith({ playing: false, current: null, queue: [], }); }); it("queues a source", async () => { const state = { playing: true, current: null, queue: [] }; const controller = { getState: vi.fn(), queue: vi.fn(async () => state), skip: vi.fn(), stop: vi.fn(), }; const handler = getHandler( createMediaRoutes(controller), "/media/queue", "post", ); const json = vi.fn(); await handler?.( { body: { source: "https://example.com/song.mp3" } } as Request, { json } as unknown as Response, vi.fn(), ); expect(controller.queue).toHaveBeenCalledWith( "https://example.com/song.mp3", ); expect(json).toHaveBeenCalledWith(state); }); it("passes missing source errors to Express", async () => { const controller = { getState: vi.fn(), queue: vi.fn(), skip: vi.fn(), stop: vi.fn(), }; const handler = getHandler( createMediaRoutes(controller), "/media/queue", "post", ); const next = vi.fn(); await handler?.( { body: {} } as Request, { json: vi.fn() } as unknown as Response, next, ); expect(next.mock.calls[0][0]).toMatchObject({ code: "MISSING_MEDIA_SOURCE", statusCode: 400, }); }); });