70 lines
2.3 KiB
TypeScript
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')
|
|
})
|
|
})
|