UNPKG

@atproto/ozone

Version:

Backend service for moderating the Bluesky network.

106 lines (88 loc) 2.93 kB
import assert from 'node:assert' import { AtpAgent, ComAtprotoAdminDefs, ToolsOzoneModerationDefs, } from '@atproto/api' import { ModeratorClient, SeedClient, TestNetwork, basicSeed, } from '@atproto/dev-env' describe('moderation', () => { let network: TestNetwork let sc: SeedClient let modClient: ModeratorClient let pdsAgent: AtpAgent let bskyAgent: AtpAgent const repoSubject = (did: string) => ({ $type: 'com.atproto.admin.defs#repoRef', did, }) beforeAll(async () => { network = await TestNetwork.create({ dbPostgresSchema: 'ozone_takedown', }) sc = network.getSeedClient() modClient = network.ozone.getModClient() pdsAgent = network.pds.getClient() bskyAgent = network.bsky.getClient() await basicSeed(sc) await network.processAll() }) afterAll(async () => { await network.close() }) it('allows specifying policy for takedown actions.', async () => { await modClient.performTakedown({ subject: repoSubject(sc.dids.bob), policies: ['trolling'], }) // Verify that that the takedown even exposes the policy specified for it const { events: eventViews } = await modClient.queryEvents({ subject: sc.dids.bob, types: ['tools.ozone.moderation.defs#modEventTakedown'], }) const { event } = eventViews[0] assert(ToolsOzoneModerationDefs.isModEventTakedown(event)) expect(event.policies?.[0]).toEqual('trolling') // Verify that event stream can be filtered by policy const { events: filteredEvents } = await modClient.queryEvents({ subject: sc.dids.bob, policies: ['trolling'], }) const { subject } = filteredEvents[0] assert(ComAtprotoAdminDefs.isRepoRef(subject)) expect(subject.did).toEqual(sc.dids.bob) }) it('applies takedown only to specified service when targetServices is set', async () => { await modClient.emitEvent({ event: { $type: 'tools.ozone.moderation.defs#modEventTakedown', targetServices: ['appview'], }, subject: repoSubject(sc.dids.carol), }) await network.processAll() const [pdsStatus, appviewStatus, carolsEvents] = await Promise.all([ pdsAgent.com.atproto.admin.getSubjectStatus( { did: sc.dids.carol }, { headers: network.pds.adminAuthHeaders() }, ), bskyAgent.com.atproto.admin.getSubjectStatus( { did: sc.dids.carol }, { headers: network.bsky.adminAuthHeaders() }, ), modClient.queryEvents({ subject: sc.dids.carol, types: ['tools.ozone.moderation.defs#modEventTakedown'], }), ]) expect(pdsStatus.data.takedown?.applied).toBe(false) expect(appviewStatus.data.takedown?.applied).toBe(true) const event = carolsEvents.events[0].event assert(ToolsOzoneModerationDefs.isModEventTakedown(event)) expect(event.targetServices).toEqual(['appview']) }) })