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

This commit is contained in:
2025-12-22 12:50:35 -06:00
parent f92b73c7db
commit c7e7d63be5
16 changed files with 3110 additions and 35 deletions

65
lib/youtube.test.ts Normal file
View 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)
})
})
})