flnxi-Wu/lib/__tests__/local-file-stream.test.ts
2026-05-25 15:36:51 +08:00

70 lines
2.3 KiB
TypeScript

import { mkdtemp, rm, writeFile } from 'fs/promises'
import { tmpdir } from 'os'
import path from 'path'
import { createLocalFileStreamResponse } from '../local-file-stream'
describe('createLocalFileStreamResponse', () => {
let tempDir: string
let filePath: string
beforeEach(async () => {
tempDir = await mkdtemp(path.join(tmpdir(), 'flnxi-local-stream-'))
filePath = path.join(tempDir, 'sample.txt')
await writeFile(filePath, '0123456789')
})
afterEach(async () => {
await rm(tempDir, { recursive: true, force: true })
})
test('无 Range 时应流式返回完整文件', async () => {
const response = await createLocalFileStreamResponse(filePath, {
contentType: 'text/plain',
headers: {
'Cache-Control': 'private, max-age=300',
},
})
await expect(response.text()).resolves.toBe('0123456789')
expect(response.status).toBe(200)
expect(response.headers.get('content-type')).toBe('text/plain')
expect(response.headers.get('content-length')).toBe('10')
expect(response.headers.get('accept-ranges')).toBe('bytes')
expect(response.headers.get('cache-control')).toBe('private, max-age=300')
})
test('Range 请求应只返回指定字节范围', async () => {
const response = await createLocalFileStreamResponse(filePath, {
contentType: 'text/plain',
range: 'bytes=2-5',
})
await expect(response.text()).resolves.toBe('2345')
expect(response.status).toBe(206)
expect(response.headers.get('content-range')).toBe('bytes 2-5/10')
expect(response.headers.get('content-length')).toBe('4')
})
test('后缀 Range 请求应返回文件尾部', async () => {
const response = await createLocalFileStreamResponse(filePath, {
contentType: 'text/plain',
range: 'bytes=-3',
})
await expect(response.text()).resolves.toBe('789')
expect(response.status).toBe(206)
expect(response.headers.get('content-range')).toBe('bytes 7-9/10')
expect(response.headers.get('content-length')).toBe('3')
})
test('非法 Range 应返回 416', async () => {
const response = await createLocalFileStreamResponse(filePath, {
contentType: 'text/plain',
range: 'bytes=20-30',
})
expect(response.status).toBe(416)
expect(response.headers.get('content-range')).toBe('bytes */10')
})
})