From dbae0422798ad5925ce3ea9fa01a3dc99005d704 Mon Sep 17 00:00:00 2001 From: MythEclipse Date: Fri, 15 May 2026 17:30:08 +0700 Subject: [PATCH] test: cover media controller conflicts and skip --- tests/media/mediaController.test.ts | 40 ++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/tests/media/mediaController.test.ts b/tests/media/mediaController.test.ts index 0bb56e7..4bac3c2 100644 --- a/tests/media/mediaController.test.ts +++ b/tests/media/mediaController.test.ts @@ -32,6 +32,20 @@ describe("MediaController", () => { } satisfies Partial); }); + it("rejects queue playback while browser streaming is active", async () => { + const controller = new MediaController({ + isVoiceConnected: () => true, + isBrowserStreaming: () => true, + resolveMediaSource: async () => source("https://example.com/song.mp3"), + musicPlayer: { play: vi.fn() }, + }); + + await expect(controller.queue("https://example.com/song.mp3")).rejects.toMatchObject({ + code: "BROWSER_STREAM_ACTIVE", + statusCode: 409, + } satisfies Partial); + }); + it("queues and starts the first item", async () => { const done = deferred(); const playback: MusicPlayback = { done: done.promise, stop: vi.fn() }; @@ -74,13 +88,37 @@ describe("MediaController", () => { expect(controller.getState().current?.title).toBe("second.mp3"); }); + it("skips current playback and starts the next item", async () => { + const currentStop = vi.fn(); + const nextPlayback = deferred(); + const musicPlayer: MusicPlayer = { + play: vi + .fn() + .mockReturnValueOnce({ done: new Promise(() => {}), stop: currentStop }) + .mockReturnValueOnce({ done: nextPlayback.promise, stop: vi.fn() }), + }; + const controller = new MediaController({ + isVoiceConnected: () => true, + isBrowserStreaming: () => false, + resolveMediaSource: async (input) => source(input), + musicPlayer, + }); + await controller.queue("https://example.com/first.mp3"); + await controller.queue("https://example.com/second.mp3"); + + const state = await controller.skip(); + + expect(currentStop).toHaveBeenCalled(); + expect(state.current?.title).toBe("second.mp3"); + }); + it("stops current playback and clears the queue", async () => { const stop = vi.fn(); const controller = new MediaController({ isVoiceConnected: () => true, isBrowserStreaming: () => false, resolveMediaSource: async (input) => source(input), - musicPlayer: { play: vi.fn(() => ({ done: new Promise(() => {}), stop })) }, + musicPlayer: { play: vi.fn(() => ({ done: new Promise(() => {}), stop })) }, }); await controller.queue("https://example.com/song.mp3");