feat: added integration tests

This commit is contained in:
Xiaohan-Tian
2025-12-08 17:56:58 -08:00
parent c5ada0db63
commit 02a7a61b1d
8 changed files with 1036 additions and 10 deletions
+40
View File
@@ -0,0 +1,40 @@
/**
* Mock implementation of KGAudioInterface for integration tests
* Provides interface compatibility while avoiding actual audio operations
*/
import { vi } from 'vitest'
export const mockAudioInterface = {
// Audio context management
startAudioContext: vi.fn().mockResolvedValue(true),
isAudioContextStarted: vi.fn().mockReturnValue(true),
// Track management
createTrackBus: vi.fn().mockResolvedValue(undefined),
setTrackInstrument: vi.fn().mockResolvedValue(undefined),
setTrackVolume: vi.fn().mockReturnValue(undefined),
setTrackMuted: vi.fn().mockReturnValue(undefined),
setTrackSoloed: vi.fn().mockReturnValue(undefined),
removeTrackBus: vi.fn().mockReturnValue(undefined),
// Playback control
startPlayback: vi.fn().mockReturnValue(undefined),
stopPlayback: vi.fn().mockReturnValue(undefined),
pausePlayback: vi.fn().mockReturnValue(undefined),
setPlaybackPosition: vi.fn().mockReturnValue(undefined),
// Note scheduling
scheduleNote: vi.fn().mockReturnValue(undefined),
scheduleNotes: vi.fn().mockReturnValue(undefined),
clearScheduledNotes: vi.fn().mockReturnValue(undefined),
// Transport
getCurrentBeat: vi.fn().mockReturnValue(0),
setBpm: vi.fn().mockReturnValue(undefined),
// Singleton pattern
getInstance: vi.fn().mockReturnThis(),
}
// Mock the class constructor
export const mockKGAudioInterfaceClass = vi.fn(() => mockAudioInterface)
+55
View File
@@ -0,0 +1,55 @@
/**
* Mock implementation of IndexedDB for integration tests
* Provides in-memory storage that mimics IndexedDB interface
*/
import { vi } from 'vitest'
// In-memory storage for tests
const mockStorage = new Map<string, any>()
export const mockIndexedDB = {
openDB: vi.fn().mockImplementation(() => {
return Promise.resolve({
put: vi.fn().mockImplementation((storeName: string, data: any, key?: string) => {
const actualKey = key || data.id || 'default'
mockStorage.set(`${storeName}:${actualKey}`, data)
return Promise.resolve(actualKey)
}),
get: vi.fn().mockImplementation((storeName: string, key: string) => {
return Promise.resolve(mockStorage.get(`${storeName}:${key}`))
}),
getAll: vi.fn().mockImplementation((storeName: string) => {
const results: any[] = []
for (const [key, value] of mockStorage.entries()) {
if (key.startsWith(`${storeName}:`)) {
results.push(value)
}
}
return Promise.resolve(results)
}),
delete: vi.fn().mockImplementation((storeName: string, key: string) => {
mockStorage.delete(`${storeName}:${key}`)
return Promise.resolve()
}),
clear: vi.fn().mockImplementation((storeName: string) => {
for (const key of mockStorage.keys()) {
if (key.startsWith(`${storeName}:`)) {
mockStorage.delete(key)
}
}
return Promise.resolve()
}),
close: vi.fn().mockResolvedValue(undefined),
})
}),
}
// Helper function to clear mock storage between tests
export const clearMockStorage = () => {
mockStorage.clear()
}
+58
View File
@@ -0,0 +1,58 @@
/**
* Mock implementation of Tone.js for integration tests
* Provides interface compatibility while avoiding actual audio operations
*/
import { vi } from 'vitest'
// Mock Sampler class
export const mockSampler = {
triggerAttackRelease: vi.fn(),
triggerAttack: vi.fn(),
triggerRelease: vi.fn(),
dispose: vi.fn(),
loaded: true,
toDestination: vi.fn().mockReturnThis(),
connect: vi.fn().mockReturnThis(),
disconnect: vi.fn().mockReturnThis(),
set: vi.fn().mockReturnThis(),
get: vi.fn().mockReturnValue({}),
}
// Mock Transport
export const mockTransport = {
start: vi.fn(),
stop: vi.fn(),
pause: vi.fn(),
position: '0:0:0',
bpm: { value: 120 },
timeSignature: [4, 4],
state: 'stopped',
schedule: vi.fn(),
clear: vi.fn(),
cancel: vi.fn(),
}
// Mock Tone namespace
export const mockTone = {
Sampler: vi.fn().mockImplementation(() => mockSampler),
Transport: mockTransport,
Buffer: vi.fn().mockImplementation(() => ({
loaded: true,
duration: 1,
get: vi.fn(),
set: vi.fn(),
})),
ToneAudioBuffer: vi.fn().mockImplementation(() => ({
loaded: true,
duration: 1,
})),
start: vi.fn(),
getContext: vi.fn().mockReturnValue({
state: 'running',
resume: vi.fn().mockResolvedValue(undefined),
}),
context: {
state: 'running',
resume: vi.fn().mockResolvedValue(undefined),
},
}