atproto/packages/pds/tests/rate-limits.test.ts
Daniel Holmgren d664b51c64
Finalize PDS in-process AppView removal (#1198)
* rm tables

* rm event-stream & proxied

* Remove appview services, move label service to pds

* only proxy appview stuff

* delete more tables

* Start removing message dispatched from pds

* more syncing-up removal of message dispatcher in pds

* merged

* remove feedgens from pds, remove getPopular

* remove unused image helper from pds

* fixing compiler errors

* clean up sharp

* rm label service

* first pass on cleaning up tests

* fix up a bunch of tests

* moderation view tests

* last admin tests

* got a lil overzealous in deletes

* clean up unused cfg

* clean up label table

* simplify admin repo search query/logic

* tidy pds entrypoint

* in-progress pds config changes

* cfg fiddling

* finish cleaning up cfg/ctx

* comments

* building

* pds prefix on env

* test env

* collapse pds migrations down into a single migration

* fix up dev-env

* tidy

* cleanup

* fix pds admin tests

* fix handle test

* fix pds proxy tests

* fix subscribe repos test

* fix sqlite config in pds tests

* add sqlite clause in sequencer-leader

* fix actor search w/ sqlite on pds

* fixes

* fix dev env build

* update pds service entrypoint

* simple env example

* make takedown ids opaque identifiers in the pds

* use pds routes for api tests

* update pds dockerfile with volume and correct port env var

* add a couple env vars to example

* add comments to env example

* @atproto/pds 0.2.0-beta.0

* @atproto/aws 0.0.1-beta.0

* appview did

* @atproto/aws 0.0.1

* enable logs by default

* update env example

* bugfixing sandbox issues

* consistency in pds env var name for appview url

* log on pds start and stop, configure version at runtime

* @atproto/pds 0.2.0-beta.1

* fix semver matching for pds beta version

* v0.2.0-beta.2

* default invites to being not required

* fix flaky test

* limit db connections in tests

* publish 0.2.0-beta.d3

* fix invite required parsing

* @atproto/pds 0.2.0-beta.5

* Proxy getPopularFeedGenerators on simplified pds (#1222)

proxy getPopularFeedGenerators on pds

Co-authored-by: dholms <dtholmgren@gmail.com>

* tidy migrations

* fix service entry

* bump version

* change auth order

* bump version

* bump version

* add upgradeRepoVersion & fallback url for cdn

* bump version

* merging

* merge pds

* building dev-env

* merging tests

* merge service entry

* test fixing

* tidy

* fix admin search

* tidy

* tidy

* add snap for getListFeed

* add backup nameserver cfg

* tidy + pr feedback

* tidy

* tidy env

* bit more

* re-add dotenv to root package.json

* fix dep

* build branch

* fix tests

* Refactor tests to make better use of dev-env (#1690)

* refactor pds tests to use dev env

* refactor bsky tests

* fix pds test

* tidy bsky tests

* build pds correctly

* fix entry point

* default logging to false (for now)

* format service entry

* Switch takedown ids back to ints on pds distribution (#1694)

* switch takedown ids back to ints, consistent with live pds

* tidy/fix migration

* update migration for sqlite

* export moderation action reversal

* takedown tests

* dont build branch

---------

Co-authored-by: Devin Ivy <devinivy@gmail.com>
2023-10-02 13:27:45 -05:00

71 lines
1.8 KiB
TypeScript

import { AtpAgent } from '@atproto/api'
import { randomStr } from '@atproto/crypto'
import { TestNetworkNoAppView, SeedClient } from '@atproto/dev-env'
import userSeed from './seeds/basic'
describe('rate limits', () => {
let network: TestNetworkNoAppView
let agent: AtpAgent
let sc: SeedClient
let alice: string
let bob: string
beforeAll(async () => {
network = await TestNetworkNoAppView.create({
dbPostgresSchema: 'rate_limits',
pds: {
redisScratchAddress: process.env.REDIS_HOST,
redisScratchPassword: process.env.REDIS_PASSWORD,
rateLimitsEnabled: true,
},
})
agent = network.pds.getClient()
sc = network.getSeedClient()
await userSeed(sc)
alice = sc.dids.alice
bob = sc.dids.bob
})
afterAll(async () => {
await network.close()
})
it('rate limits by ip', async () => {
const attempt = () =>
agent.api.com.atproto.server.resetPassword({
token: randomStr(4, 'base32'),
password: 'asdf1234',
})
for (let i = 0; i < 50; i++) {
try {
await attempt()
} catch (err) {
// do nothing
}
}
await expect(attempt).rejects.toThrow('Rate Limit Exceeded')
})
it('rate limits by a custom key', async () => {
const attempt = () =>
agent.api.com.atproto.server.createSession({
identifier: sc.accounts[alice].handle,
password: 'asdf1234',
})
for (let i = 0; i < 30; i++) {
try {
await attempt()
} catch (err) {
// do nothing
}
}
await expect(attempt).rejects.toThrow('Rate Limit Exceeded')
// does not rate limit for another key
await agent.api.com.atproto.server.createSession({
identifier: sc.accounts[bob].handle,
password: sc.accounts[bob].password,
})
})
})