Files
O96u 6cc4f27f7d
GitHub Release / release (push) Canceled after 0s
Publish Docker image / build (linux/amd64, ubuntu-latest, amd64) (push) Canceled after 0s
Publish Docker image / build (linux/arm64, ubuntu-24.04-arm, arm64) (push) Canceled after 0s
Publish Docker image / merge (push) Canceled after 0s
ci / ci (22, ubuntu-latest) (push) Canceled after 0s
release: v1.4.1 — 上传策略设置、保留原图与上传 tagNames
管理员可在设置页配置上传大小、格式、限流与保留原图;上传 API 支持按标签名称打标。
2026-09-16 10:03:05 +08:00

47 lines
1.3 KiB
TypeScript

import { describe, expect, it, vi } from 'vitest'
import { checkUploadRateLimit } from './rate-limit'
import { getUploadRateLimitSettings } from './upload-policy'
vi.mock('./logger', () => ({
clientIp: (event: { __ip?: string }) => event.__ip ?? '127.0.0.1'
}))
function mockEvent(ip = '127.0.0.1', authToken = '') {
return {
__ip: ip,
node: {
req: {
headers: {
...(authToken ? { 'auth-token': authToken } : {})
}
}
}
} as unknown as Parameters<typeof checkUploadRateLimit>[0]
}
describe('checkUploadRateLimit', () => {
it('allows requests under the IP limit', () => {
const event = mockEvent('10.0.0.1')
expect(() => checkUploadRateLimit(event)).not.toThrow()
})
it('limits repeated uploads by IP', () => {
const event = mockEvent('10.0.0.3')
const { ipMax } = getUploadRateLimitSettings()
for (let i = 0; i < ipMax; i++) {
checkUploadRateLimit(event)
}
expect(() => checkUploadRateLimit(event)).toThrow()
})
it('limits repeated API token uploads', () => {
const token = 'token-a'
const { tokenMax } = getUploadRateLimitSettings()
for (let i = 0; i < tokenMax; i++) {
checkUploadRateLimit(mockEvent(`10.0.${i % 200}`), token)
}
expect(() => checkUploadRateLimit(mockEvent('10.0.250'), token)).toThrow()
})
})