Add comprehensive jest unit tests
This commit is contained in:
+122
@@ -0,0 +1,122 @@
|
||||
// Jest unit tests for the AudioManager class focusing on functionality and performance
|
||||
|
||||
import AudioManager from './src/audioManager'
|
||||
import { performance } from 'node:perf_hooks'
|
||||
|
||||
// Mocking @discordjs/voice
|
||||
jest.mock('@discordjs/voice', () => {
|
||||
return {
|
||||
joinVoiceChannel: jest.fn(() => ({
|
||||
subscribe: jest.fn(),
|
||||
destroy: jest.fn(),
|
||||
setMaxListeners: jest.fn()
|
||||
})),
|
||||
createAudioPlayer: jest.fn(() => ({
|
||||
play: jest.fn(),
|
||||
pause: jest.fn(),
|
||||
unpause: jest.fn()
|
||||
})),
|
||||
createAudioResource: jest.fn(() => ({
|
||||
volume: { setVolume: jest.fn() }
|
||||
}))
|
||||
}
|
||||
})
|
||||
|
||||
type VoiceConnectionDataModel = {
|
||||
VoiceChannelId: string
|
||||
GuildId: string
|
||||
VoiceAdapter: any
|
||||
}
|
||||
|
||||
type VoiceAudioDataModel = {
|
||||
ResourceType: 'Link' | 'File'
|
||||
Resource: string | any
|
||||
}
|
||||
|
||||
const connectionData: VoiceConnectionDataModel = {
|
||||
VoiceChannelId: '1',
|
||||
GuildId: '1',
|
||||
VoiceAdapter: jest.fn()
|
||||
}
|
||||
|
||||
const audioDataFile: VoiceAudioDataModel = {
|
||||
ResourceType: 'File',
|
||||
Resource: 'sound.mp3'
|
||||
}
|
||||
|
||||
const audioDataLink: VoiceAudioDataModel = {
|
||||
ResourceType: 'Link',
|
||||
Resource: 'https://example.com/sound.mp3'
|
||||
}
|
||||
|
||||
describe('AudioManager', () => {
|
||||
beforeEach(() => jest.clearAllMocks())
|
||||
|
||||
test('CreateConnection initializes voice connection', () => {
|
||||
const manager = new AudioManager(connectionData, audioDataFile)
|
||||
const start = performance.now()
|
||||
manager.CreateConnection()
|
||||
const duration = performance.now() - start
|
||||
expect(require('@discordjs/voice').joinVoiceChannel).toHaveBeenCalled()
|
||||
expect(duration).toBeLessThan(50)
|
||||
})
|
||||
|
||||
test('PlayAudioOnConnection loads file resource', () => {
|
||||
const manager = new AudioManager(connectionData, audioDataFile)
|
||||
manager.CreateConnection()
|
||||
manager.PlayAudioOnConnection()
|
||||
const voice = require('@discordjs/voice')
|
||||
expect(voice.createAudioResource).toHaveBeenCalled()
|
||||
expect(voice.createAudioPlayer).toHaveBeenCalled()
|
||||
expect(manager['IsAudioPlaying']).toBe(true)
|
||||
})
|
||||
|
||||
test('PlayAudioOnConnection loads link resource', () => {
|
||||
const manager = new AudioManager(connectionData, audioDataLink)
|
||||
manager.CreateConnection()
|
||||
manager.PlayAudioOnConnection()
|
||||
const voice = require('@discordjs/voice')
|
||||
expect(voice.createAudioResource).toHaveBeenCalled()
|
||||
})
|
||||
|
||||
test('StopAudioOnConnection resets connection', () => {
|
||||
const manager = new AudioManager(connectionData, audioDataFile)
|
||||
manager.CreateConnection()
|
||||
manager.PlayAudioOnConnection()
|
||||
manager.StopAudioOnConnection()
|
||||
const voice = require('@discordjs/voice')
|
||||
expect(voice.joinVoiceChannel).toHaveBeenCalledTimes(2)
|
||||
})
|
||||
|
||||
test('Pause and Resume audio', () => {
|
||||
const manager = new AudioManager(connectionData, audioDataFile)
|
||||
manager.CreateConnection()
|
||||
manager.PlayAudioOnConnection()
|
||||
manager.PauseAudio()
|
||||
manager.ResumeAudio()
|
||||
const voice = require('@discordjs/voice')
|
||||
const player = voice.createAudioPlayer.mock.results[0].value
|
||||
expect(player.pause).toHaveBeenCalled()
|
||||
expect(player.unpause).toHaveBeenCalled()
|
||||
})
|
||||
|
||||
test('SetVolume validates range', () => {
|
||||
const manager = new AudioManager(connectionData, audioDataFile)
|
||||
manager.CreateConnection()
|
||||
manager.PlayAudioOnConnection()
|
||||
manager.SetVolume(50)
|
||||
const res = require('@discordjs/voice').createAudioResource.mock.results[0].value
|
||||
expect(res.volume.setVolume).toHaveBeenCalledWith(0.5)
|
||||
expect(() => manager.SetVolume(101)).toThrow()
|
||||
})
|
||||
|
||||
test('DestroyConnection clears flags', () => {
|
||||
const manager = new AudioManager(connectionData, audioDataFile)
|
||||
manager.CreateConnection()
|
||||
manager.DestroyConnection()
|
||||
const voice = require('@discordjs/voice')
|
||||
const connection = voice.joinVoiceChannel.mock.results[0].value
|
||||
expect(connection.destroy).toHaveBeenCalled()
|
||||
expect(manager['IsActive']).toBe(false)
|
||||
})
|
||||
})
|
||||
@@ -0,0 +1,8 @@
|
||||
module.exports = {
|
||||
preset: 'ts-jest',
|
||||
testEnvironment: 'node',
|
||||
testMatch: ['**/Unittests.ts'],
|
||||
transform: {
|
||||
'^.+\\.tsx?$': 'ts-jest'
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user