56 lines
1.8 KiB
TypeScript
56 lines
1.8 KiB
TypeScript
|
|
import { describe, test, expect, beforeAll, afterAll } from 'bun:test';
|
||
|
|
import { setupFileRig, type FileTestRig } from '../integration/helpers/rig.js';
|
||
|
|
import { FsRateLimitError, QuotaExceededError, type FileEntry } from '../../src/index.js';
|
||
|
|
|
||
|
|
describe('Op rate limit', () => {
|
||
|
|
let rig: FileTestRig;
|
||
|
|
let listCount = 0;
|
||
|
|
beforeAll(async () => {
|
||
|
|
listCount = 0;
|
||
|
|
rig = await setupFileRig({
|
||
|
|
rateLimits: { maxOpsPerMinutePerSender: 5 },
|
||
|
|
list: async () => {
|
||
|
|
listCount++;
|
||
|
|
return { entries: [], hasMore: false };
|
||
|
|
},
|
||
|
|
});
|
||
|
|
});
|
||
|
|
afterAll(async () => { await rig.teardown(); });
|
||
|
|
|
||
|
|
test('op rate-limit kicks in after capacity', async () => {
|
||
|
|
listCount = 0;
|
||
|
|
for (let i = 0; i < 5; i++) await rig.fs.list('/');
|
||
|
|
expect(listCount).toBe(5);
|
||
|
|
await expect(rig.fs.list('/')).rejects.toBeInstanceOf(FsRateLimitError);
|
||
|
|
});
|
||
|
|
});
|
||
|
|
|
||
|
|
describe('Byte quota', () => {
|
||
|
|
let rig: FileTestRig;
|
||
|
|
beforeAll(async () => {
|
||
|
|
rig = await setupFileRig({
|
||
|
|
rateLimits: {
|
||
|
|
// Plenty of ops, but tight byte cap for the quota test.
|
||
|
|
maxOpsPerMinutePerSender: 100,
|
||
|
|
maxBytesPerHourPerSender: 1024,
|
||
|
|
},
|
||
|
|
write: async (ctx) => {
|
||
|
|
const e: FileEntry = {
|
||
|
|
name: ctx.args.path.split('/').filter(Boolean).pop() ?? '',
|
||
|
|
kind: 'file',
|
||
|
|
size: ctx.args.content.kind === 'inline' ? ctx.args.content.bytes.byteLength : ctx.args.content.size,
|
||
|
|
mtime: 0,
|
||
|
|
metadata: {},
|
||
|
|
};
|
||
|
|
return { entry: e };
|
||
|
|
},
|
||
|
|
});
|
||
|
|
});
|
||
|
|
afterAll(async () => { await rig.teardown(); });
|
||
|
|
|
||
|
|
test('write 2 KiB inline → exceeds 1 KiB/hour cap', async () => {
|
||
|
|
const big = new Uint8Array(2048);
|
||
|
|
await expect(rig.fs.write('/big.bin', big)).rejects.toBeInstanceOf(QuotaExceededError);
|
||
|
|
});
|
||
|
|
});
|