Implement testing framework with Vitest, add unit tests for API routes and utility functions, and configure CI workflow for automated testing. Update package dependencies for testing libraries and add test scripts to package.json.
Some checks are pending
CI / test (push) Waiting to run
Some checks are pending
CI / test (push) Waiting to run
This commit is contained in:
65
lib/youtube.test.ts
Normal file
65
lib/youtube.test.ts
Normal file
@@ -0,0 +1,65 @@
|
||||
import { describe, it, expect } from 'vitest'
|
||||
import { sanitizeFilename } from './youtube'
|
||||
|
||||
describe('sanitizeFilename', () => {
|
||||
it('replaces special characters with underscores', () => {
|
||||
expect(sanitizeFilename('My Video!@#$%')).toBe('My_Video_')
|
||||
expect(sanitizeFilename('hello world')).toBe('hello_world')
|
||||
expect(sanitizeFilename('file/with\\slashes')).toBe('file_with_slashes')
|
||||
})
|
||||
|
||||
it('collapses multiple underscores', () => {
|
||||
expect(sanitizeFilename('a!!!b')).toBe('a_b')
|
||||
expect(sanitizeFilename('test file')).toBe('test_file')
|
||||
expect(sanitizeFilename('no___multiple___underscores')).toBe('no_multiple_underscores')
|
||||
})
|
||||
|
||||
it('preserves alphanumeric characters', () => {
|
||||
expect(sanitizeFilename('Video123')).toBe('Video123')
|
||||
expect(sanitizeFilename('ABC_xyz_123')).toBe('ABC_xyz_123')
|
||||
expect(sanitizeFilename('simple')).toBe('simple')
|
||||
})
|
||||
|
||||
it('truncates to 200 characters', () => {
|
||||
const longName = 'a'.repeat(250)
|
||||
expect(sanitizeFilename(longName).length).toBe(200)
|
||||
expect(sanitizeFilename(longName)).toBe('a'.repeat(200))
|
||||
})
|
||||
|
||||
it('handles edge cases', () => {
|
||||
expect(sanitizeFilename('')).toBe('')
|
||||
expect(sanitizeFilename(' ')).toBe('_')
|
||||
expect(sanitizeFilename('___')).toBe('_')
|
||||
})
|
||||
|
||||
it('handles unicode and emoji', () => {
|
||||
expect(sanitizeFilename('日本語タイトル')).toBe('_')
|
||||
expect(sanitizeFilename('Café')).toBe('Caf_')
|
||||
expect(sanitizeFilename('🎵 Music 🎵')).toBe('_Music_')
|
||||
})
|
||||
|
||||
it('handles typical YouTube video titles', () => {
|
||||
expect(sanitizeFilename('Never Gonna Give You Up (Official Video)')).toBe('Never_Gonna_Give_You_Up_Official_Video_')
|
||||
expect(sanitizeFilename("Lofi Hip Hop Radio 📚 - Beats to Relax/Study")).toBe('Lofi_Hip_Hop_Radio_Beats_to_Relax_Study')
|
||||
expect(sanitizeFilename('[4K] Amazing Nature Video')).toBe('_4K_Amazing_Nature_Video')
|
||||
expect(sanitizeFilename('Song Title | Artist Name (Lyrics)')).toBe('Song_Title_Artist_Name_Lyrics_')
|
||||
})
|
||||
})
|
||||
|
||||
describe('format selection logic', () => {
|
||||
it('maps audio formats correctly', () => {
|
||||
const audioFormats = ['mp3', 'wav', 'm4a', 'opus'] as const
|
||||
|
||||
audioFormats.forEach((format) => {
|
||||
expect(['mp3', 'wav', 'm4a', 'opus']).toContain(format)
|
||||
})
|
||||
})
|
||||
|
||||
it('maps video formats correctly', () => {
|
||||
const videoFormats = ['mp4', 'webm', 'mkv', 'avi'] as const
|
||||
|
||||
videoFormats.forEach((format) => {
|
||||
expect(['mp4', 'webm', 'mkv', 'avi']).toContain(format)
|
||||
})
|
||||
})
|
||||
})
|
||||
Reference in New Issue
Block a user