Files
downlink/app/api/info/route.test.ts

90 lines
2.7 KiB
TypeScript

import { describe, it, expect, vi, beforeEach } from 'vitest'
import { POST } from './route'
import { NextRequest } from 'next/server'
vi.mock('@/lib/youtube', () => ({
getVideoInfo: vi.fn(),
}))
import { getVideoInfo } from '@/lib/youtube'
const mockGetVideoInfo = vi.mocked(getVideoInfo)
function createRequest(body: object): NextRequest {
return new NextRequest('http://localhost:3000/api/info', {
method: 'POST',
body: JSON.stringify(body),
headers: { 'Content-Type': 'application/json' },
})
}
describe('POST /api/info', () => {
beforeEach(() => {
vi.clearAllMocks()
})
it('returns 400 when URL is missing', async () => {
const request = createRequest({})
const response = await POST(request)
const data = await response.json()
expect(response.status).toBe(400)
expect(data.success).toBe(false)
expect(data.error).toBe('URL is required')
})
it('returns 400 for invalid YouTube URL', async () => {
const request = createRequest({ url: 'https://vimeo.com/123' })
const response = await POST(request)
const data = await response.json()
expect(response.status).toBe(400)
expect(data.success).toBe(false)
expect(data.error).toBe('Invalid YouTube URL')
})
it('returns 500 when getVideoInfo fails', async () => {
mockGetVideoInfo.mockResolvedValue(null)
const request = createRequest({ url: 'https://youtube.com/watch?v=dQw4w9WgXcQ' })
const response = await POST(request)
const data = await response.json()
expect(response.status).toBe(500)
expect(data.success).toBe(false)
expect(data.error).toBe('Failed to get video info')
})
it('returns video info on success', async () => {
const mockVideoInfo = {
title: 'Test Video',
duration: 180,
thumbnail: 'https://example.com/thumb.jpg',
formats: [],
}
mockGetVideoInfo.mockResolvedValue(mockVideoInfo)
const request = createRequest({ url: 'https://youtube.com/watch?v=dQw4w9WgXcQ' })
const response = await POST(request)
const data = await response.json()
expect(response.status).toBe(200)
expect(data.success).toBe(true)
expect(data.videoInfo).toEqual(mockVideoInfo)
})
it('handles exceptions gracefully', async () => {
const consoleSpy = vi.spyOn(console, 'error').mockImplementation(() => {})
mockGetVideoInfo.mockRejectedValue(new Error('Network error'))
const request = createRequest({ url: 'https://youtube.com/watch?v=dQw4w9WgXcQ' })
const response = await POST(request)
const data = await response.json()
expect(response.status).toBe(500)
expect(data.success).toBe(false)
expect(data.error).toBe('Network error')
consoleSpy.mockRestore()
})
})