Some fixes

This commit is contained in:
hibna
2026-02-12 17:54:16 +03:00
parent f57ee77c56
commit 8a32c5c1b3
18 changed files with 997 additions and 135 deletions
+122
View File
@@ -0,0 +1,122 @@
import { beforeEach, describe, expect, it, vi } from 'vitest'
import { fireEvent, render, screen } from '@testing-library/react'
import type { AudioTrack, VideoQuality } from '../../types'
import { SettingsMenu } from './SettingsMenu'
const { contextState } = vi.hoisted(() => ({
contextState: {
value: null as any,
},
}))
vi.mock('../../contexts/PlayerContext', () => ({
usePlayerContext: () => contextState.value,
}))
const audioTracks: AudioTrack[] = [
{
name: 'English',
language: 'en',
url: '',
groupId: 'audio',
},
]
const qualities: VideoQuality[] = [
{ label: '1080p', height: 1080, levelIndex: 0 },
{ label: '720p', height: 720, levelIndex: 1 },
]
const subtitles = [{ src: '/sub.vtt', lang: 'en', label: 'English' }]
describe('SettingsMenu', () => {
beforeEach(() => {
contextState.value = {
uiState: {
controlsVisible: true,
settingsOpen: true,
volumeControlOpen: false,
qualityMenuOpen: false,
subtitleMenuOpen: false,
},
videoState: {
playing: false,
currentTime: 0,
duration: 0,
buffered: 0,
volume: 1,
muted: false,
playbackRate: 1,
fullscreen: false,
pictureInPicture: false,
loading: false,
error: null,
seeking: false,
isLiveBroadcast: false,
},
settings: {
quality: null,
subtitle: null,
audioTrack: null,
playbackRate: 1,
},
setPlaybackRate: vi.fn(),
setSubtitle: vi.fn(),
setAudioTrack: vi.fn(),
setQuality: vi.fn(),
toggleSettings: vi.fn(),
translations: {
noSubtitlesAvailable: 'No subtitles available',
subtitles: 'Subtitles',
off: 'Off',
auto: 'Auto',
quality: 'Quality',
speed: 'Speed',
normal: 'Normal',
default: 'Default',
audioTrack: 'Audio Track',
settings: 'Settings',
level: 'Level',
},
}
})
it('does not render when settings are closed', () => {
contextState.value.uiState.settingsOpen = false
render(<SettingsMenu subtitles={subtitles} audioTracks={audioTracks} qualities={qualities} />)
expect(screen.queryByText('Settings')).not.toBeInTheDocument()
})
it('changes playback speed from speed submenu', () => {
render(<SettingsMenu subtitles={subtitles} audioTracks={audioTracks} qualities={qualities} />)
fireEvent.click(screen.getByText('Speed'))
fireEvent.click(screen.getByText('1.5x'))
expect(contextState.value.setPlaybackRate).toHaveBeenCalledWith(1.5)
})
it('selects subtitle from submenu', () => {
render(<SettingsMenu subtitles={subtitles} audioTracks={audioTracks} qualities={qualities} />)
fireEvent.click(screen.getByText('Subtitles'))
fireEvent.click(screen.getByRole('button', { name: 'English' }))
expect(contextState.value.setSubtitle).toHaveBeenCalledWith(subtitles[0])
})
it('selects audio track from submenu', () => {
render(<SettingsMenu subtitles={subtitles} audioTracks={audioTracks} qualities={qualities} />)
fireEvent.click(screen.getByText('Audio Track'))
fireEvent.click(screen.getByRole('button', { name: 'English' }))
expect(contextState.value.setAudioTrack).toHaveBeenCalledWith(audioTracks[0])
})
it('selects quality from submenu', () => {
render(<SettingsMenu subtitles={subtitles} audioTracks={audioTracks} qualities={qualities} />)
fireEvent.click(screen.getByText('Quality'))
fireEvent.click(screen.getByText('720p'))
expect(contextState.value.setQuality).toHaveBeenCalledWith(qualities[1])
})
})