test(audio): cover URL protocols and reconnects
Build Validation / build (push) Successful in 47s

This commit is contained in:
fraujulian committed 2026-09-28 13:39:29 +02:00
1 parent ac20d12b13
commit f84a115e32
1 file changed
+34
+34
View File
@@ -235,6 +235,28 @@ describe('AudioManager', () => {
expect(manager.isConnected).toBe(false);
});
it('reconnects and restarts playback when configured', async () => {
const manager = new AudioManager({
connection: connectionOptions,
source: liveStreamSource,
renewIntervalMs: false,
reconnectAttempts: 1,
});
await manager.start();
jest.mocked(entersState)
.mockRejectedValueOnce(new Error('disconnect'))
.mockRejectedValueOnce(new Error('disconnect'));
jest.mocked(joinVoiceChannel).mockReturnValueOnce(mockSecondVoiceConnection);
mockConnection.state.status = VoiceConnectionStatus.Disconnected;
await listenerFor(connectionListeners, VoiceConnectionStatus.Disconnected)();
expect(joinVoiceChannel).toHaveBeenCalledTimes(2);
expect(startFfmpeg).toHaveBeenCalledTimes(2);
expect(manager.state).toBe('playing');
expect(manager.isConnected).toBe(true);
});
it('cleans up when connection startup fails', async () => {
jest.useFakeTimers();
@@ -599,6 +621,18 @@ describe('AudioManager', () => {
await expect(manager.play()).rejects.toThrow(AudioManagerConfigError);
});
it.each(['file:///etc/passwd', 'ftp://example.com/audio.mp3'])('rejects non-HTTP URL source %s', async (url) => {
const manager = new AudioManager({
connection: connectionOptions,
source: { type: 'url', url },
renewIntervalMs: false,
});
await manager.connect();
await expect(manager.play()).rejects.toThrow(AudioManagerConfigError);
expect(startFfmpeg).not.toHaveBeenCalled();
});
it('applies initial volume only when volume support is enabled', async () => {
const manager = new AudioManager({
connection: connectionOptions,