snapshot of https://github.com/ueberdosis/hocuspocus.git @ cf3cfa355b4d3bb61c6b6c80071f71783e32470e (2026-09-15)
Some checks failed
build / lint (22) (push) Failing after 17s
build / test (22) (push) Failing after 8s
build / lint (23) (push) Failing after 2s
build / build (22) (push) Has been skipped
build / build (23) (push) Has been skipped
build / test (23) (push) Failing after 4s
docsearch / docsearch (push) Failing after 1s
Some checks failed
build / lint (22) (push) Failing after 17s
build / test (22) (push) Failing after 8s
build / lint (23) (push) Failing after 2s
build / build (22) (push) Has been skipped
build / build (23) (push) Has been skipped
build / test (23) (push) Failing after 4s
docsearch / docsearch (push) Failing after 1s
This commit is contained in:
103
tests/extension-throttle/banning.ts
Normal file
103
tests/extension-throttle/banning.ts
Normal file
@@ -0,0 +1,103 @@
|
||||
import test from 'ava'
|
||||
import type { onConnectPayload } from '@hocuspocus/server'
|
||||
import * as MockDate from 'mockdate'
|
||||
import { Throttle } from '@hocuspocus/extension-throttle'
|
||||
|
||||
const getOnConnectPayload = (ip: string) => {
|
||||
return {
|
||||
request: {
|
||||
headers: new Headers({
|
||||
'x-real-ip': ip,
|
||||
}),
|
||||
},
|
||||
} as unknown as onConnectPayload
|
||||
}
|
||||
const generateRequests = async (instance: Throttle, ip: string, numberOfRequests: number) => {
|
||||
for (let i = 0; i < numberOfRequests; i += 1) {
|
||||
// eslint-disable-next-line no-await-in-loop
|
||||
await instance.onConnect(getOnConnectPayload(ip))
|
||||
}
|
||||
}
|
||||
|
||||
test('throttle extension bans properly', async t => {
|
||||
const throttle = new Throttle({ banTime: 5, throttle: 15 })
|
||||
t.teardown(() => throttle.onDestroy())
|
||||
const ip = '127.0.0.1'
|
||||
|
||||
t.false(throttle.isBanned(ip))
|
||||
|
||||
await generateRequests(throttle, ip, 15)
|
||||
|
||||
try {
|
||||
await throttle.onConnect(getOnConnectPayload(ip))
|
||||
t.fail()
|
||||
} catch (e) {
|
||||
t.true(throttle.isBanned(ip))
|
||||
}
|
||||
|
||||
})
|
||||
|
||||
test('throttle extension unbans properly', async t => {
|
||||
const throttle = new Throttle({ banTime: 5, throttle: 15 })
|
||||
t.teardown(() => throttle.onDestroy())
|
||||
const ip = '127.0.0.1'
|
||||
|
||||
t.false(throttle.isBanned(ip))
|
||||
|
||||
await generateRequests(throttle, ip, 15)
|
||||
|
||||
try {
|
||||
await throttle.onConnect(getOnConnectPayload(ip))
|
||||
t.fail()
|
||||
} catch (e) {
|
||||
t.true(throttle.isBanned(ip))
|
||||
}
|
||||
|
||||
MockDate.set(Date.now() + 1000 * (throttle.configuration.banTime * 60))
|
||||
|
||||
await throttle.onConnect(getOnConnectPayload(ip))
|
||||
t.false(throttle.isBanned(ip))
|
||||
|
||||
MockDate.reset()
|
||||
})
|
||||
|
||||
test.serial('map cleanup works for connectionsByIp', async t => {
|
||||
const throttle = new Throttle({ consideredSeconds: 60 })
|
||||
t.teardown(() => throttle.onDestroy())
|
||||
const ip = '127.0.0.1'
|
||||
|
||||
await generateRequests(throttle, ip, 10)
|
||||
|
||||
t.is(throttle.connectionsByIp.get(ip)!.length, 10)
|
||||
|
||||
MockDate.set(Date.now() + 1000 * throttle.configuration.consideredSeconds)
|
||||
|
||||
await throttle.clearMaps()
|
||||
|
||||
t.false(throttle.connectionsByIp.has(ip))
|
||||
|
||||
MockDate.reset()
|
||||
})
|
||||
|
||||
test.serial('map cleanup works for bannedIps', async t => {
|
||||
const throttle = new Throttle({ consideredSeconds: 60, throttle: 15 })
|
||||
t.teardown(() => throttle.onDestroy())
|
||||
const ip = '127.0.0.1'
|
||||
|
||||
await generateRequests(throttle, ip, 15)
|
||||
|
||||
try {
|
||||
await throttle.onConnect(getOnConnectPayload(ip))
|
||||
// eslint-disable-next-line no-empty
|
||||
} catch (e) {}
|
||||
|
||||
t.true(throttle.bannedIps.has(ip))
|
||||
|
||||
MockDate.set(Date.now() + 1000 * throttle.configuration.banTime * 60)
|
||||
|
||||
await throttle.clearMaps()
|
||||
|
||||
t.false(throttle.bannedIps.has(ip))
|
||||
|
||||
MockDate.reset()
|
||||
})
|
||||
26
tests/extension-throttle/configuration.ts
Normal file
26
tests/extension-throttle/configuration.ts
Normal file
@@ -0,0 +1,26 @@
|
||||
import test from 'ava'
|
||||
import { Throttle } from '@hocuspocus/extension-throttle'
|
||||
|
||||
test('throttle has the default configuration', async t => {
|
||||
const throttle = new Throttle()
|
||||
t.teardown(() => throttle.onDestroy())
|
||||
t.is(throttle.configuration.throttle, 15)
|
||||
})
|
||||
|
||||
test('banTime has the default configuration', async t => {
|
||||
const throttle = new Throttle()
|
||||
t.teardown(() => throttle.onDestroy())
|
||||
t.is(throttle.configuration.banTime, 5)
|
||||
})
|
||||
|
||||
test('throttle has a custom value', async t => {
|
||||
const throttle = new Throttle({ throttle: 100 })
|
||||
t.teardown(() => throttle.onDestroy())
|
||||
t.is(throttle.configuration.throttle, 100)
|
||||
})
|
||||
|
||||
test('banTime has a custom value', async t => {
|
||||
const throttle = new Throttle({ banTime: 100 })
|
||||
t.teardown(() => throttle.onDestroy())
|
||||
t.is(throttle.configuration.banTime, 100)
|
||||
})
|
||||
Reference in New Issue
Block a user