@atproto/ozone 0.2.8 → 0.2.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +33 -0
- package/package.json +25 -21
- package/bin/migration-create.ts +0 -38
- package/jest.config.cjs +0 -22
- package/src/api/chat/getActorMetadata.ts +0 -23
- package/src/api/chat/getConvo.ts +0 -23
- package/src/api/chat/getConvoMembers.ts +0 -23
- package/src/api/chat/getConvos.ts +0 -23
- package/src/api/chat/getMessageContext.ts +0 -42
- package/src/api/chat/index.ts +0 -16
- package/src/api/communication/createTemplate.ts +0 -51
- package/src/api/communication/deleteTemplate.ts +0 -23
- package/src/api/communication/listTemplates.ts +0 -31
- package/src/api/communication/updateTemplate.ts +0 -51
- package/src/api/health.ts +0 -27
- package/src/api/index.ts +0 -146
- package/src/api/label/fetchLabels.ts +0 -32
- package/src/api/label/queryLabels.ts +0 -57
- package/src/api/label/subscribeLabels.ts +0 -25
- package/src/api/moderation/cancelScheduledActions.ts +0 -72
- package/src/api/moderation/emitEvent.ts +0 -475
- package/src/api/moderation/getAccountTimeline.ts +0 -160
- package/src/api/moderation/getEvent.ts +0 -19
- package/src/api/moderation/getRecord.ts +0 -40
- package/src/api/moderation/getRecords.ts +0 -50
- package/src/api/moderation/getRepo.ts +0 -34
- package/src/api/moderation/getReporterStats.ts +0 -18
- package/src/api/moderation/getRepos.ts +0 -41
- package/src/api/moderation/getSubjects.ts +0 -101
- package/src/api/moderation/listScheduledActions.ts +0 -45
- package/src/api/moderation/queryEvents.ts +0 -72
- package/src/api/moderation/queryStatuses.ts +0 -23
- package/src/api/moderation/scheduleAction.ts +0 -129
- package/src/api/moderation/searchRepos.ts +0 -46
- package/src/api/moderation/util.ts +0 -96
- package/src/api/proxied.ts +0 -327
- package/src/api/queue/assignModerator.ts +0 -31
- package/src/api/queue/createQueue.ts +0 -62
- package/src/api/queue/deleteQueue.ts +0 -56
- package/src/api/queue/getAssignments.ts +0 -19
- package/src/api/queue/listQueues.ts +0 -39
- package/src/api/queue/routeReports.ts +0 -44
- package/src/api/queue/unassignModerator.ts +0 -26
- package/src/api/queue/updateQueue.ts +0 -54
- package/src/api/report/assignModerator.ts +0 -36
- package/src/api/report/createActivity.ts +0 -57
- package/src/api/report/createReport.ts +0 -93
- package/src/api/report/getAssignments.ts +0 -20
- package/src/api/report/getHistoricalStats.ts +0 -41
- package/src/api/report/getLatestReport.ts +0 -44
- package/src/api/report/getLiveStats.ts +0 -26
- package/src/api/report/getReport.ts +0 -55
- package/src/api/report/listActivities.ts +0 -37
- package/src/api/report/queryActivities.ts +0 -64
- package/src/api/report/queryReports.ts +0 -44
- package/src/api/report/reassignQueue.ts +0 -68
- package/src/api/report/refreshStats.ts +0 -27
- package/src/api/report/unassignModerator.ts +0 -21
- package/src/api/safelink/addRule.ts +0 -48
- package/src/api/safelink/queryEvents.ts +0 -32
- package/src/api/safelink/queryRules.ts +0 -58
- package/src/api/safelink/removeRule.ts +0 -42
- package/src/api/safelink/updateRule.ts +0 -48
- package/src/api/server/getConfig.ts +0 -35
- package/src/api/set/addValues.ts +0 -28
- package/src/api/set/deleteSet.ts +0 -34
- package/src/api/set/deleteValues.ts +0 -31
- package/src/api/set/getValues.ts +0 -42
- package/src/api/set/querySets.ts +0 -36
- package/src/api/set/upsertSet.ts +0 -38
- package/src/api/setting/listOptions.ts +0 -44
- package/src/api/setting/removeOptions.ts +0 -64
- package/src/api/setting/upsertOption.ts +0 -156
- package/src/api/team/addMember.ts +0 -51
- package/src/api/team/deleteMember.ts +0 -29
- package/src/api/team/listMembers.ts +0 -20
- package/src/api/team/updateMember.ts +0 -47
- package/src/api/util.ts +0 -265
- package/src/api/verification/grantVerifications.ts +0 -90
- package/src/api/verification/listVerifications.ts +0 -44
- package/src/api/verification/revokeVerifications.ts +0 -43
- package/src/api/well-known.ts +0 -46
- package/src/assignment/index.ts +0 -728
- package/src/auth-verifier.ts +0 -227
- package/src/background.ts +0 -183
- package/src/communication-service/template.ts +0 -110
- package/src/communication-service/util.ts +0 -8
- package/src/config/config.ts +0 -211
- package/src/config/env.ts +0 -95
- package/src/config/index.ts +0 -3
- package/src/config/secrets.ts +0 -17
- package/src/context.ts +0 -399
- package/src/daemon/blob-diverter.ts +0 -186
- package/src/daemon/context.ts +0 -247
- package/src/daemon/event-pusher.ts +0 -363
- package/src/daemon/event-reverser.ts +0 -128
- package/src/daemon/index.ts +0 -33
- package/src/daemon/job-cursor.ts +0 -33
- package/src/daemon/materialized-view-refresher.ts +0 -33
- package/src/daemon/queue-router.ts +0 -101
- package/src/daemon/scheduled-action-processor.ts +0 -304
- package/src/daemon/stats-computer.ts +0 -101
- package/src/daemon/strike-expiry-processor.ts +0 -95
- package/src/daemon/team-profile-synchronizer.ts +0 -15
- package/src/daemon/verification-listener.ts +0 -169
- package/src/db/index.ts +0 -203
- package/src/db/migrations/20231219T205730722Z-init.ts +0 -170
- package/src/db/migrations/20240116T085607200Z-communication-template.ts +0 -23
- package/src/db/migrations/20240201T051104136Z-mod-event-blobs.ts +0 -15
- package/src/db/migrations/20240208T213404429Z-add-tags-column-to-moderation-subject.ts +0 -31
- package/src/db/migrations/20240228T003647759Z-add-label-sigs.ts +0 -25
- package/src/db/migrations/20240408T192432676Z-mute-reporting.ts +0 -15
- package/src/db/migrations/20240506T225055595Z-message-subject.ts +0 -21
- package/src/db/migrations/20240521T211332580Z-member.ts +0 -17
- package/src/db/migrations/20240814T003647759Z-event-created-at-index.ts +0 -13
- package/src/db/migrations/20240903T205730722Z-add-template-lang.ts +0 -12
- package/src/db/migrations/20240904T205730722Z-add-subject-did-index.ts +0 -13
- package/src/db/migrations/20241001T205730722Z-subject-status-review-state-index.ts +0 -15
- package/src/db/migrations/20241008T205730722Z-sets.ts +0 -53
- package/src/db/migrations/20241018T205730722Z-setting.ts +0 -27
- package/src/db/migrations/20241026T205730722Z-add-hosting-status-to-subject-status.ts +0 -57
- package/src/db/migrations/20241220T144630860Z-stats-materialized-views.ts +0 -215
- package/src/db/migrations/20250204T003647759Z-add-subject-priority-score.ts +0 -22
- package/src/db/migrations/20250211T003647759Z-add-reporter-stats-index.ts +0 -38
- package/src/db/migrations/20250211T132135150Z-moderation-event-message-partial-idx.ts +0 -26
- package/src/db/migrations/20250221T132135150Z-member-details.ts +0 -14
- package/src/db/migrations/20250404T201720309Z-subject-status-sort-idxs.ts +0 -18
- package/src/db/migrations/20250415T201720309Z-verification.ts +0 -34
- package/src/db/migrations/20250417T201720309Z-firehose-cursor.ts +0 -16
- package/src/db/migrations/20250609T110704000Z-safelink.ts +0 -53
- package/src/db/migrations/20250618T180246000Z-add-mod-tool-to-moderation-event.ts +0 -18
- package/src/db/migrations/20250701T000000000Z-add-age-assurance-state.ts +0 -25
- package/src/db/migrations/20250715T000000000Z-add-mod-event-external-id.ts +0 -15
- package/src/db/migrations/20250718T150931000Z-update-appeal-reason-stats.ts +0 -310
- package/src/db/migrations/20250813T000000000Z-mod-tool-batch-id-index.ts +0 -14
- package/src/db/migrations/20250923T000000000Z-scheduled-actions.ts +0 -56
- package/src/db/migrations/20251008T120000000Z-add-strike-system.ts +0 -87
- package/src/db/migrations/20260210T154806448Z-mod-event-created-by-indexes.ts +0 -22
- package/src/db/migrations/20260219T164523000Z-create-report-table.ts +0 -155
- package/src/db/migrations/20260219T165302248Z-moderator-assignment.ts +0 -42
- package/src/db/migrations/20260225T000000000Z-add-report-queue-table.ts +0 -41
- package/src/db/migrations/20260313T000000000Z-add-report-activity-table.ts +0 -48
- package/src/db/migrations/20260318T152058935Z-add-report-stat.ts +0 -35
- package/src/db/migrations/20260428T000000000Z-add-expiring-tag-table.ts +0 -32
- package/src/db/migrations/20260513T202941104Z-add-subject-convo-id.ts +0 -114
- package/src/db/migrations/20260602T120000000Z-add-report-activity-created-index.ts +0 -17
- package/src/db/migrations/index.ts +0 -44
- package/src/db/migrations/provider.ts +0 -26
- package/src/db/pagination.ts +0 -335
- package/src/db/schema/account_events_stats.ts +0 -16
- package/src/db/schema/account_record_events_stats.ts +0 -15
- package/src/db/schema/account_record_status_stats.ts +0 -15
- package/src/db/schema/account_strike.ts +0 -13
- package/src/db/schema/blob_push_event.ts +0 -21
- package/src/db/schema/communication_template.ts +0 -19
- package/src/db/schema/expiring_tag.ts +0 -18
- package/src/db/schema/firehose_cursor.ts +0 -13
- package/src/db/schema/index.ts +0 -60
- package/src/db/schema/job_cursor.ts +0 -13
- package/src/db/schema/label.ts +0 -22
- package/src/db/schema/member.ts +0 -22
- package/src/db/schema/moderation_event.ts +0 -61
- package/src/db/schema/moderation_subject_status.ts +0 -52
- package/src/db/schema/moderator_assignment.ts +0 -16
- package/src/db/schema/ozone_set.ts +0 -24
- package/src/db/schema/record_events_stats.ts +0 -15
- package/src/db/schema/record_push_event.ts +0 -21
- package/src/db/schema/repo_push_event.ts +0 -19
- package/src/db/schema/report.ts +0 -28
- package/src/db/schema/report_activity.ts +0 -22
- package/src/db/schema/report_queue.ts +0 -21
- package/src/db/schema/report_stat.ts +0 -27
- package/src/db/schema/safelink.ts +0 -39
- package/src/db/schema/scheduled-action.ts +0 -25
- package/src/db/schema/setting.ts +0 -24
- package/src/db/schema/signing_key.ts +0 -10
- package/src/db/schema/verification.ts +0 -21
- package/src/db/types.ts +0 -24
- package/src/error.ts +0 -12
- package/src/image-invalidator.ts +0 -7
- package/src/index.ts +0 -154
- package/src/jetstream/service.ts +0 -107
- package/src/logger.ts +0 -29
- package/src/mod-service/expiring-tags.ts +0 -104
- package/src/mod-service/index.ts +0 -1842
- package/src/mod-service/profile.ts +0 -139
- package/src/mod-service/report.ts +0 -429
- package/src/mod-service/status.ts +0 -549
- package/src/mod-service/strike.ts +0 -96
- package/src/mod-service/subject.ts +0 -311
- package/src/mod-service/types.ts +0 -96
- package/src/mod-service/util.ts +0 -99
- package/src/mod-service/views.ts +0 -912
- package/src/queue/service.ts +0 -603
- package/src/report/activity.ts +0 -281
- package/src/report/handle-report-update.ts +0 -209
- package/src/report/reassign.ts +0 -109
- package/src/report/stats.ts +0 -852
- package/src/report/views.ts +0 -239
- package/src/safelink/service.ts +0 -304
- package/src/scheduled-action/service.ts +0 -281
- package/src/scheduled-action/types.ts +0 -17
- package/src/sequencer/index.ts +0 -2
- package/src/sequencer/outbox.ts +0 -123
- package/src/sequencer/sequencer.ts +0 -147
- package/src/set/service.ts +0 -230
- package/src/setting/constants.ts +0 -3
- package/src/setting/service.ts +0 -148
- package/src/setting/types.ts +0 -3
- package/src/setting/validators.ts +0 -333
- package/src/tag-service/content-tagger.ts +0 -30
- package/src/tag-service/embed-tagger.ts +0 -70
- package/src/tag-service/index.ts +0 -70
- package/src/tag-service/language-data.ts +0 -561
- package/src/tag-service/language-tagger.ts +0 -101
- package/src/tag-service/util.ts +0 -13
- package/src/team/index.ts +0 -296
- package/src/util.ts +0 -230
- package/src/verification/issuer.ts +0 -146
- package/src/verification/service.ts +0 -208
- package/src/verification/util.ts +0 -53
- package/test.env +0 -2
- package/tests/3p-labeler.test.ts +0 -288
- package/tests/__snapshots__/account-strikes.test.ts.snap +0 -159
- package/tests/__snapshots__/age-assurance.test.ts.snap +0 -66
- package/tests/__snapshots__/blob-divert.test.ts.snap +0 -219
- package/tests/__snapshots__/get-account-timeline.test.ts.snap +0 -36
- package/tests/__snapshots__/get-record.test.ts.snap +0 -271
- package/tests/__snapshots__/get-records.test.ts.snap +0 -175
- package/tests/__snapshots__/get-repo.test.ts.snap +0 -91
- package/tests/__snapshots__/get-repos.test.ts.snap +0 -127
- package/tests/__snapshots__/get-starter-pack.test.ts.snap +0 -535
- package/tests/__snapshots__/get-subjects.test.ts.snap +0 -529
- package/tests/__snapshots__/moderation-events.test.ts.snap +0 -347
- package/tests/__snapshots__/moderation-statuses.test.ts.snap +0 -276
- package/tests/__snapshots__/moderation.test.ts.snap +0 -85
- package/tests/__snapshots__/report-reason.test.ts.snap +0 -14
- package/tests/__snapshots__/safelink.test.ts.snap +0 -179
- package/tests/__snapshots__/scheduled-action.test.ts.snap +0 -61
- package/tests/__snapshots__/sets.test.ts.snap +0 -46
- package/tests/__snapshots__/settings.test.ts.snap +0 -52
- package/tests/__snapshots__/team.test.ts.snap +0 -374
- package/tests/__snapshots__/verification-listener.test.ts.snap +0 -152
- package/tests/__snapshots__/verification.test.ts.snap +0 -302
- package/tests/_util.ts +0 -242
- package/tests/account-strikes.test.ts +0 -184
- package/tests/ack-all-subjects-of-account.test.ts +0 -177
- package/tests/age-assurance.test.ts +0 -372
- package/tests/blob-divert.test.ts +0 -106
- package/tests/communication-templates.test.ts +0 -149
- package/tests/content-tagger.test.ts +0 -170
- package/tests/db.test.ts +0 -184
- package/tests/expiring-label.test.ts +0 -72
- package/tests/expiring-tags.test.ts +0 -232
- package/tests/get-account-timeline.test.ts +0 -85
- package/tests/get-config.test.ts +0 -55
- package/tests/get-lists.test.ts +0 -111
- package/tests/get-profiles.test.ts +0 -70
- package/tests/get-record.test.ts +0 -130
- package/tests/get-records.test.ts +0 -91
- package/tests/get-repo.test.ts +0 -171
- package/tests/get-report.test.ts +0 -136
- package/tests/get-reporter-stats.test.ts +0 -132
- package/tests/get-repos.test.ts +0 -91
- package/tests/get-starter-pack.test.ts +0 -115
- package/tests/get-subjects.test.ts +0 -81
- package/tests/mod-tool.test.ts +0 -268
- package/tests/moderation-appeals.test.ts +0 -260
- package/tests/moderation-events.test.ts +0 -756
- package/tests/moderation-status-tags.test.ts +0 -140
- package/tests/moderation-statuses.test.ts +0 -495
- package/tests/moderation.test.ts +0 -992
- package/tests/protected-tags.test.ts +0 -218
- package/tests/query-labels.test.ts +0 -238
- package/tests/query-reports.test.ts +0 -608
- package/tests/queue-assignment.test.ts +0 -428
- package/tests/queue-router.test.ts +0 -306
- package/tests/queues.test.ts +0 -690
- package/tests/record-and-account-events.test.ts +0 -197
- package/tests/repo-search.test.ts +0 -136
- package/tests/report-action.test.ts +0 -308
- package/tests/report-activity.test.ts +0 -711
- package/tests/report-assignment.test.ts +0 -517
- package/tests/report-muting.test.ts +0 -100
- package/tests/report-reason.test.ts +0 -154
- package/tests/report-reassign-queue.test.ts +0 -340
- package/tests/report-routing.test.ts +0 -245
- package/tests/report-stats.test.ts +0 -545
- package/tests/revoke-account-credentials.test.ts +0 -54
- package/tests/safelink.test.ts +0 -534
- package/tests/scheduled-action-processor.test.ts +0 -488
- package/tests/scheduled-action.test.ts +0 -334
- package/tests/sequencer.test.ts +0 -227
- package/tests/server.test.ts +0 -62
- package/tests/sets.test.ts +0 -246
- package/tests/settings.test.ts +0 -308
- package/tests/strike-expiry-processor.test.ts +0 -299
- package/tests/subject-priority-score.test.ts +0 -96
- package/tests/takedown.test.ts +0 -105
- package/tests/team.test.ts +0 -216
- package/tests/verification-listener.test.ts +0 -129
- package/tests/verification.test.ts +0 -186
- package/tsconfig.build.json +0 -9
- package/tsconfig.build.tsbuildinfo +0 -1
- package/tsconfig.json +0 -7
- package/tsconfig.tests.json +0 -8
|
@@ -1,372 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
ModeratorClient,
|
|
3
|
-
SeedClient,
|
|
4
|
-
TestNetwork,
|
|
5
|
-
basicSeed,
|
|
6
|
-
} from '@atproto/dev-env'
|
|
7
|
-
import { forSnapshot } from './_util.js'
|
|
8
|
-
|
|
9
|
-
describe('age assurance events', () => {
|
|
10
|
-
let network: TestNetwork
|
|
11
|
-
let sc: SeedClient
|
|
12
|
-
let modClient: ModeratorClient
|
|
13
|
-
|
|
14
|
-
beforeAll(async () => {
|
|
15
|
-
network = await TestNetwork.create({
|
|
16
|
-
dbPostgresSchema: 'ozone_age_assurance',
|
|
17
|
-
})
|
|
18
|
-
sc = network.getSeedClient()
|
|
19
|
-
modClient = network.ozone.getModClient()
|
|
20
|
-
await basicSeed(sc)
|
|
21
|
-
await network.processAll()
|
|
22
|
-
})
|
|
23
|
-
|
|
24
|
-
afterAll(async () => {
|
|
25
|
-
await network?.close()
|
|
26
|
-
})
|
|
27
|
-
|
|
28
|
-
it('handles age assurance events from user', async () => {
|
|
29
|
-
const aliceSubject = {
|
|
30
|
-
$type: 'com.atproto.admin.defs#repoRef',
|
|
31
|
-
did: sc.dids.alice,
|
|
32
|
-
}
|
|
33
|
-
const bobSubject = {
|
|
34
|
-
$type: 'com.atproto.admin.defs#repoRef',
|
|
35
|
-
did: sc.dids.bob,
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
const alicePendingEvent = await modClient.emitEvent({
|
|
39
|
-
subject: aliceSubject,
|
|
40
|
-
event: {
|
|
41
|
-
$type: 'tools.ozone.moderation.defs#ageAssuranceEvent',
|
|
42
|
-
status: 'pending',
|
|
43
|
-
createdAt: new Date().toISOString(),
|
|
44
|
-
attemptId: 'attempt-123',
|
|
45
|
-
initIp: '123.456.789.012',
|
|
46
|
-
initUa: 'Mozilla/5.0',
|
|
47
|
-
},
|
|
48
|
-
})
|
|
49
|
-
|
|
50
|
-
const bobPendingEvent = await modClient.emitEvent({
|
|
51
|
-
subject: bobSubject,
|
|
52
|
-
event: {
|
|
53
|
-
$type: 'tools.ozone.moderation.defs#ageAssuranceEvent',
|
|
54
|
-
status: 'pending',
|
|
55
|
-
createdAt: new Date().toISOString(),
|
|
56
|
-
attemptId: 'attempt-345',
|
|
57
|
-
initIp: '234.567.890.123',
|
|
58
|
-
initUa: 'Mozilla/5.0',
|
|
59
|
-
},
|
|
60
|
-
})
|
|
61
|
-
|
|
62
|
-
const bobAssuredEvent = await modClient.emitEvent({
|
|
63
|
-
subject: bobSubject,
|
|
64
|
-
event: {
|
|
65
|
-
$type: 'tools.ozone.moderation.defs#ageAssuranceEvent',
|
|
66
|
-
status: 'assured',
|
|
67
|
-
createdAt: new Date().toISOString(),
|
|
68
|
-
attemptId: 'attempt-345',
|
|
69
|
-
initIp: '234.567.890.123',
|
|
70
|
-
initUa: 'Mozilla/5.0',
|
|
71
|
-
completeIp: '345.678.901.234',
|
|
72
|
-
completeUa: 'Mozilla/5.0',
|
|
73
|
-
},
|
|
74
|
-
})
|
|
75
|
-
|
|
76
|
-
expect(forSnapshot(alicePendingEvent)).toMatchSnapshot()
|
|
77
|
-
expect(forSnapshot(bobPendingEvent)).toMatchSnapshot()
|
|
78
|
-
expect(forSnapshot(bobAssuredEvent)).toMatchSnapshot()
|
|
79
|
-
|
|
80
|
-
// Verify that age assurance state is correctly set for each subject
|
|
81
|
-
const [{ subjectStatuses: aliceStatus }, { subjectStatuses: bobStatus }] =
|
|
82
|
-
await Promise.all([
|
|
83
|
-
modClient.queryStatuses({
|
|
84
|
-
subject: sc.dids.alice,
|
|
85
|
-
}),
|
|
86
|
-
modClient.queryStatuses({
|
|
87
|
-
subject: sc.dids.bob,
|
|
88
|
-
}),
|
|
89
|
-
])
|
|
90
|
-
|
|
91
|
-
expect(aliceStatus[0].ageAssuranceState).toBe('pending')
|
|
92
|
-
expect(bobStatus[0].ageAssuranceState).toBe('assured')
|
|
93
|
-
|
|
94
|
-
// Verify that queryEvents allow filtering by ageAssuranceState
|
|
95
|
-
try {
|
|
96
|
-
const [{ events: pendingEvents }, { events: unknownEvents }] =
|
|
97
|
-
await Promise.all([
|
|
98
|
-
modClient.queryEvents({
|
|
99
|
-
ageAssuranceState: 'pending',
|
|
100
|
-
}),
|
|
101
|
-
modClient.queryEvents({
|
|
102
|
-
ageAssuranceState: 'assured',
|
|
103
|
-
}),
|
|
104
|
-
])
|
|
105
|
-
expect(pendingEvents.length).toEqual(2)
|
|
106
|
-
pendingEvents.forEach((event) => {
|
|
107
|
-
expect(event.event.$type).toBe(
|
|
108
|
-
'tools.ozone.moderation.defs#ageAssuranceEvent',
|
|
109
|
-
)
|
|
110
|
-
expect(event.event['status']).toBe('pending')
|
|
111
|
-
})
|
|
112
|
-
|
|
113
|
-
expect(unknownEvents.length).toBeGreaterThan(0)
|
|
114
|
-
unknownEvents.forEach((event) => {
|
|
115
|
-
expect(event.event.$type).toBe(
|
|
116
|
-
'tools.ozone.moderation.defs#ageAssuranceEvent',
|
|
117
|
-
)
|
|
118
|
-
expect(event.event['status']).toBe('assured')
|
|
119
|
-
})
|
|
120
|
-
} catch (error) {
|
|
121
|
-
console.error('Error querying events:', error)
|
|
122
|
-
throw error
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
// Verify that queryStatuses allows filtering by ageAssuranceState
|
|
126
|
-
const { subjectStatuses: pendingStatuses } = await modClient.queryStatuses({
|
|
127
|
-
ageAssuranceState: 'pending',
|
|
128
|
-
})
|
|
129
|
-
expect(pendingStatuses.length).toEqual(1)
|
|
130
|
-
pendingStatuses.forEach((status) => {
|
|
131
|
-
expect(status.ageAssuranceState).toBe('pending')
|
|
132
|
-
})
|
|
133
|
-
})
|
|
134
|
-
|
|
135
|
-
it('purge event removes ageAssuranceEvents but keeps overrides, and resets status', async () => {
|
|
136
|
-
const danSubject = {
|
|
137
|
-
$type: 'com.atproto.admin.defs#repoRef',
|
|
138
|
-
did: sc.dids.dan,
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
await modClient.emitEvent({
|
|
142
|
-
subject: danSubject,
|
|
143
|
-
event: {
|
|
144
|
-
$type: 'tools.ozone.moderation.defs#ageAssuranceEvent',
|
|
145
|
-
status: 'pending',
|
|
146
|
-
createdAt: new Date().toISOString(),
|
|
147
|
-
attemptId: 'attempt-dan-1',
|
|
148
|
-
},
|
|
149
|
-
})
|
|
150
|
-
await modClient.emitEvent({
|
|
151
|
-
subject: danSubject,
|
|
152
|
-
event: {
|
|
153
|
-
$type: 'tools.ozone.moderation.defs#ageAssuranceOverrideEvent',
|
|
154
|
-
status: 'assured',
|
|
155
|
-
comment: 'Admin verified dan',
|
|
156
|
-
},
|
|
157
|
-
})
|
|
158
|
-
|
|
159
|
-
const { subjectStatuses: beforePurge } = await modClient.queryStatuses({
|
|
160
|
-
subject: sc.dids.dan,
|
|
161
|
-
})
|
|
162
|
-
expect(beforePurge[0].ageAssuranceState).toBe('assured')
|
|
163
|
-
expect(beforePurge[0].ageAssuranceUpdatedBy).toBe('admin')
|
|
164
|
-
|
|
165
|
-
const { events: beforePurgeEvents } = await modClient.queryEvents({
|
|
166
|
-
subject: sc.dids.dan,
|
|
167
|
-
types: [
|
|
168
|
-
'tools.ozone.moderation.defs#ageAssuranceEvent',
|
|
169
|
-
'tools.ozone.moderation.defs#ageAssuranceOverrideEvent',
|
|
170
|
-
],
|
|
171
|
-
})
|
|
172
|
-
expect(beforePurgeEvents.length).toBe(2)
|
|
173
|
-
|
|
174
|
-
// Emit the purge event
|
|
175
|
-
const purgeEvent = await modClient.emitEvent({
|
|
176
|
-
subject: danSubject,
|
|
177
|
-
event: {
|
|
178
|
-
$type: 'tools.ozone.moderation.defs#ageAssurancePurgeEvent',
|
|
179
|
-
comment: 'Purging age assurance data per user request',
|
|
180
|
-
},
|
|
181
|
-
})
|
|
182
|
-
expect(purgeEvent.event.$type).toBe(
|
|
183
|
-
'tools.ozone.moderation.defs#ageAssurancePurgeEvent',
|
|
184
|
-
)
|
|
185
|
-
|
|
186
|
-
// ageAssuranceEvent rows should be deleted
|
|
187
|
-
const { events: aaEventsAfterPurge } = await modClient.queryEvents({
|
|
188
|
-
subject: sc.dids.dan,
|
|
189
|
-
types: ['tools.ozone.moderation.defs#ageAssuranceEvent'],
|
|
190
|
-
})
|
|
191
|
-
expect(aaEventsAfterPurge.length).toBe(0)
|
|
192
|
-
|
|
193
|
-
// ageAssuranceOverrideEvent rows should be preserved
|
|
194
|
-
const { events: overrideEventsAfterPurge } = await modClient.queryEvents({
|
|
195
|
-
subject: sc.dids.dan,
|
|
196
|
-
types: ['tools.ozone.moderation.defs#ageAssuranceOverrideEvent'],
|
|
197
|
-
})
|
|
198
|
-
expect(overrideEventsAfterPurge.length).toBe(1)
|
|
199
|
-
|
|
200
|
-
// Status should be reset to unknown and updatedBy set to the purging moderator's DID
|
|
201
|
-
const { subjectStatuses: afterPurge } = await modClient.queryStatuses({
|
|
202
|
-
subject: sc.dids.dan,
|
|
203
|
-
})
|
|
204
|
-
expect(afterPurge[0].ageAssuranceState).toBe('unknown')
|
|
205
|
-
expect(afterPurge[0].ageAssuranceUpdatedBy).toBeFalsy()
|
|
206
|
-
})
|
|
207
|
-
|
|
208
|
-
it('purge event fails for record subjects', async () => {
|
|
209
|
-
const postSubject = {
|
|
210
|
-
$type: 'com.atproto.repo.strongRef',
|
|
211
|
-
uri: sc.posts[sc.dids.alice][0].ref.uriStr,
|
|
212
|
-
cid: sc.posts[sc.dids.alice][0].ref.cidStr,
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
await expect(
|
|
216
|
-
modClient.emitEvent({
|
|
217
|
-
subject: postSubject,
|
|
218
|
-
event: {
|
|
219
|
-
$type: 'tools.ozone.moderation.defs#ageAssurancePurgeEvent',
|
|
220
|
-
comment: 'Should fail',
|
|
221
|
-
},
|
|
222
|
-
}),
|
|
223
|
-
).rejects.toThrow('Invalid subject type')
|
|
224
|
-
})
|
|
225
|
-
|
|
226
|
-
it('purge event only removes ageAssuranceEvents, not overrides or other events', async () => {
|
|
227
|
-
const carolSubject = {
|
|
228
|
-
$type: 'com.atproto.admin.defs#repoRef',
|
|
229
|
-
did: sc.dids.carol,
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
// Add a non-AA event that should survive the purge
|
|
233
|
-
const commentEvent = await modClient.emitEvent({
|
|
234
|
-
subject: carolSubject,
|
|
235
|
-
event: {
|
|
236
|
-
$type: 'tools.ozone.moderation.defs#modEventComment',
|
|
237
|
-
comment: 'A non-AA comment that should survive purge',
|
|
238
|
-
},
|
|
239
|
-
})
|
|
240
|
-
|
|
241
|
-
// Add an ageAssuranceEvent that should be removed
|
|
242
|
-
await modClient.emitEvent({
|
|
243
|
-
subject: carolSubject,
|
|
244
|
-
event: {
|
|
245
|
-
$type: 'tools.ozone.moderation.defs#ageAssuranceEvent',
|
|
246
|
-
status: 'pending',
|
|
247
|
-
createdAt: new Date().toISOString(),
|
|
248
|
-
attemptId: 'attempt-carol-purge-1',
|
|
249
|
-
},
|
|
250
|
-
})
|
|
251
|
-
|
|
252
|
-
// Add an ageAssuranceOverrideEvent that should survive the purge
|
|
253
|
-
const overrideEvent = await modClient.emitEvent({
|
|
254
|
-
subject: carolSubject,
|
|
255
|
-
event: {
|
|
256
|
-
$type: 'tools.ozone.moderation.defs#ageAssuranceOverrideEvent',
|
|
257
|
-
status: 'assured',
|
|
258
|
-
comment: 'Override that should survive purge',
|
|
259
|
-
},
|
|
260
|
-
})
|
|
261
|
-
|
|
262
|
-
await modClient.emitEvent({
|
|
263
|
-
subject: carolSubject,
|
|
264
|
-
event: {
|
|
265
|
-
$type: 'tools.ozone.moderation.defs#ageAssurancePurgeEvent',
|
|
266
|
-
comment: 'Purging carol age assurance data',
|
|
267
|
-
},
|
|
268
|
-
})
|
|
269
|
-
|
|
270
|
-
const { events: afterPurge } = await modClient.queryEvents({
|
|
271
|
-
subject: sc.dids.carol,
|
|
272
|
-
})
|
|
273
|
-
|
|
274
|
-
const aaEventsAfterPurge = afterPurge.filter(
|
|
275
|
-
(e) => e.event.$type === 'tools.ozone.moderation.defs#ageAssuranceEvent',
|
|
276
|
-
)
|
|
277
|
-
expect(aaEventsAfterPurge.length).toBe(0)
|
|
278
|
-
expect(afterPurge.some((e) => e.id === overrideEvent.id)).toBe(true)
|
|
279
|
-
expect(afterPurge.some((e) => e.id === commentEvent.id)).toBe(true)
|
|
280
|
-
})
|
|
281
|
-
|
|
282
|
-
it('admin override behavior for age assurance states', async () => {
|
|
283
|
-
const carolSubject = {
|
|
284
|
-
$type: 'com.atproto.admin.defs#repoRef',
|
|
285
|
-
did: sc.dids.carol,
|
|
286
|
-
}
|
|
287
|
-
|
|
288
|
-
// Verify that user emitted state is overridden by admin emitted state
|
|
289
|
-
await modClient.emitEvent({
|
|
290
|
-
subject: carolSubject,
|
|
291
|
-
event: {
|
|
292
|
-
$type: 'tools.ozone.moderation.defs#ageAssuranceEvent',
|
|
293
|
-
status: 'pending',
|
|
294
|
-
createdAt: new Date().toISOString(),
|
|
295
|
-
attemptId: 'attempt-carol-1',
|
|
296
|
-
},
|
|
297
|
-
})
|
|
298
|
-
|
|
299
|
-
const { subjectStatuses } = await modClient.queryStatuses({
|
|
300
|
-
subject: sc.dids.carol,
|
|
301
|
-
})
|
|
302
|
-
expect(subjectStatuses[0].ageAssuranceState).toBe('pending')
|
|
303
|
-
expect(subjectStatuses[0].ageAssuranceUpdatedBy).toBe('user')
|
|
304
|
-
|
|
305
|
-
await modClient.emitEvent({
|
|
306
|
-
subject: carolSubject,
|
|
307
|
-
event: {
|
|
308
|
-
$type: 'tools.ozone.moderation.defs#ageAssuranceOverrideEvent',
|
|
309
|
-
status: 'assured',
|
|
310
|
-
comment: 'Admin verification completed',
|
|
311
|
-
},
|
|
312
|
-
})
|
|
313
|
-
|
|
314
|
-
const { subjectStatuses: afterAdminAssurance } =
|
|
315
|
-
await modClient.queryStatuses({
|
|
316
|
-
subject: sc.dids.carol,
|
|
317
|
-
})
|
|
318
|
-
expect(afterAdminAssurance[0].ageAssuranceState).toBe('assured')
|
|
319
|
-
expect(afterAdminAssurance[0].ageAssuranceUpdatedBy).toBe('admin')
|
|
320
|
-
|
|
321
|
-
// Verify that user emitted state can not override admin emitted state
|
|
322
|
-
await modClient.emitEvent({
|
|
323
|
-
subject: carolSubject,
|
|
324
|
-
event: {
|
|
325
|
-
$type: 'tools.ozone.moderation.defs#ageAssuranceEvent',
|
|
326
|
-
status: 'pending',
|
|
327
|
-
createdAt: new Date().toISOString(),
|
|
328
|
-
attemptId: 'attempt-carol-2',
|
|
329
|
-
},
|
|
330
|
-
})
|
|
331
|
-
|
|
332
|
-
const { subjectStatuses: afterCarolsAttempt } =
|
|
333
|
-
await modClient.queryStatuses({
|
|
334
|
-
subject: sc.dids.carol,
|
|
335
|
-
})
|
|
336
|
-
expect(afterCarolsAttempt[0].ageAssuranceState).toBe('assured')
|
|
337
|
-
expect(afterCarolsAttempt[0].ageAssuranceUpdatedBy).toBe('admin')
|
|
338
|
-
|
|
339
|
-
// Verify that admin can reset state to allow the user to override
|
|
340
|
-
await modClient.emitEvent({
|
|
341
|
-
subject: carolSubject,
|
|
342
|
-
event: {
|
|
343
|
-
$type: 'tools.ozone.moderation.defs#ageAssuranceOverrideEvent',
|
|
344
|
-
status: 'reset',
|
|
345
|
-
comment: 'Reset to allow user to set state again',
|
|
346
|
-
},
|
|
347
|
-
})
|
|
348
|
-
|
|
349
|
-
const { subjectStatuses: afterReset } = await modClient.queryStatuses({
|
|
350
|
-
subject: sc.dids.carol,
|
|
351
|
-
})
|
|
352
|
-
expect(afterReset[0].ageAssuranceState).toBe('reset')
|
|
353
|
-
expect(afterReset[0].ageAssuranceUpdatedBy).toBe('admin')
|
|
354
|
-
|
|
355
|
-
await modClient.emitEvent({
|
|
356
|
-
subject: carolSubject,
|
|
357
|
-
event: {
|
|
358
|
-
$type: 'tools.ozone.moderation.defs#ageAssuranceEvent',
|
|
359
|
-
status: 'assured',
|
|
360
|
-
createdAt: new Date().toISOString(),
|
|
361
|
-
attemptId: 'attempt-carol-3',
|
|
362
|
-
},
|
|
363
|
-
})
|
|
364
|
-
|
|
365
|
-
const { subjectStatuses: afterCarolAssured } =
|
|
366
|
-
await modClient.queryStatuses({
|
|
367
|
-
subject: sc.dids.carol,
|
|
368
|
-
})
|
|
369
|
-
expect(afterCarolAssured[0].ageAssuranceState).toBe('assured')
|
|
370
|
-
expect(afterCarolAssured[0].ageAssuranceUpdatedBy).toBe('user')
|
|
371
|
-
})
|
|
372
|
-
})
|
|
@@ -1,106 +0,0 @@
|
|
|
1
|
-
import assert from 'node:assert'
|
|
2
|
-
import { jest } from '@jest/globals'
|
|
3
|
-
import { ToolsOzoneModerationDefs } from '@atproto/api'
|
|
4
|
-
import {
|
|
5
|
-
ModeratorClient,
|
|
6
|
-
SeedClient,
|
|
7
|
-
TestNetwork,
|
|
8
|
-
basicSeed,
|
|
9
|
-
} from '@atproto/dev-env'
|
|
10
|
-
import { ResponseType, XRPCError } from '@atproto/xrpc'
|
|
11
|
-
import { forSnapshot, identity } from './_util.js'
|
|
12
|
-
|
|
13
|
-
describe('blob divert', () => {
|
|
14
|
-
let network: TestNetwork
|
|
15
|
-
let sc: SeedClient
|
|
16
|
-
let modClient: ModeratorClient
|
|
17
|
-
|
|
18
|
-
beforeAll(async () => {
|
|
19
|
-
network = await TestNetwork.create({
|
|
20
|
-
dbPostgresSchema: 'ozone_blob_divert_test',
|
|
21
|
-
ozone: {
|
|
22
|
-
blobDivertUrl: `https://blob-report.com`,
|
|
23
|
-
blobDivertAdminPassword: 'test-auth-token',
|
|
24
|
-
},
|
|
25
|
-
})
|
|
26
|
-
sc = network.getSeedClient()
|
|
27
|
-
modClient = network.ozone.getModClient()
|
|
28
|
-
await basicSeed(sc)
|
|
29
|
-
await network.processAll()
|
|
30
|
-
})
|
|
31
|
-
|
|
32
|
-
afterAll(async () => {
|
|
33
|
-
await network?.close()
|
|
34
|
-
})
|
|
35
|
-
|
|
36
|
-
const mockReportServiceResponse = (succeeds: boolean) => {
|
|
37
|
-
const blobDiverter = network.ozone.ctx.blobDiverter
|
|
38
|
-
assert(blobDiverter)
|
|
39
|
-
return jest
|
|
40
|
-
.spyOn(blobDiverter, 'uploadBlob')
|
|
41
|
-
.mockImplementation(async () => {
|
|
42
|
-
if (!succeeds) {
|
|
43
|
-
// Using an XRPCError to trigger retries
|
|
44
|
-
throw new XRPCError(ResponseType.Unknown, undefined)
|
|
45
|
-
}
|
|
46
|
-
})
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
const getSubject = () => ({
|
|
50
|
-
$type: 'com.atproto.repo.strongRef',
|
|
51
|
-
uri: sc.posts[sc.dids.carol][0].ref.uriStr,
|
|
52
|
-
cid: sc.posts[sc.dids.carol][0].ref.cidStr,
|
|
53
|
-
})
|
|
54
|
-
|
|
55
|
-
const getImages = () => sc.posts[sc.dids.carol][0].images
|
|
56
|
-
|
|
57
|
-
const emitDivertEvent = async () =>
|
|
58
|
-
modClient.emitEvent(
|
|
59
|
-
{
|
|
60
|
-
subject: getSubject(),
|
|
61
|
-
// @ts-expect-error "tools.ozone.moderation.defs#modEventDivert" is not part of the event open union
|
|
62
|
-
event: identity<ToolsOzoneModerationDefs.ModEventDivert>({
|
|
63
|
-
$type: 'tools.ozone.moderation.defs#modEventDivert',
|
|
64
|
-
comment: 'Diverting for test',
|
|
65
|
-
}),
|
|
66
|
-
createdBy: sc.dids.alice,
|
|
67
|
-
subjectBlobCids: getImages().map((img) => img.image.ref.toString()),
|
|
68
|
-
},
|
|
69
|
-
'moderator',
|
|
70
|
-
)
|
|
71
|
-
|
|
72
|
-
it('fails and keeps attempt count when report service fails to accept upload.', async () => {
|
|
73
|
-
// Simulate failure to fail upload
|
|
74
|
-
const reportServiceRequest = mockReportServiceResponse(false)
|
|
75
|
-
try {
|
|
76
|
-
await expect(emitDivertEvent()).rejects.toThrow('Failed to process blobs')
|
|
77
|
-
|
|
78
|
-
// 1 initial attempt + 3 retries
|
|
79
|
-
expect(reportServiceRequest).toHaveBeenCalledTimes(getImages().length * 4)
|
|
80
|
-
} finally {
|
|
81
|
-
reportServiceRequest.mockRestore()
|
|
82
|
-
}
|
|
83
|
-
})
|
|
84
|
-
|
|
85
|
-
it('sends blobs to configured divert service and marks divert date', async () => {
|
|
86
|
-
// Simulate success to accept upload
|
|
87
|
-
const reportServiceRequest = mockReportServiceResponse(true)
|
|
88
|
-
try {
|
|
89
|
-
const divertEvent = await emitDivertEvent()
|
|
90
|
-
|
|
91
|
-
expect(reportServiceRequest).toHaveBeenCalledTimes(getImages().length)
|
|
92
|
-
expect(forSnapshot(divertEvent)).toMatchSnapshot()
|
|
93
|
-
|
|
94
|
-
const { subjectStatuses } = await modClient.queryStatuses({
|
|
95
|
-
subject: getSubject().uri,
|
|
96
|
-
})
|
|
97
|
-
|
|
98
|
-
expect(subjectStatuses[0].takendown).toBe(true)
|
|
99
|
-
|
|
100
|
-
const event = await modClient.getEvent(divertEvent.id)
|
|
101
|
-
expect(forSnapshot(event)).toMatchSnapshot()
|
|
102
|
-
} finally {
|
|
103
|
-
reportServiceRequest.mockRestore()
|
|
104
|
-
}
|
|
105
|
-
})
|
|
106
|
-
})
|
|
@@ -1,149 +0,0 @@
|
|
|
1
|
-
import { AtpAgent } from '@atproto/api'
|
|
2
|
-
import { SeedClient, TestNetwork, basicSeed } from '@atproto/dev-env'
|
|
3
|
-
import { ids } from '../src/lexicon/lexicons.js'
|
|
4
|
-
|
|
5
|
-
describe('communication-templates', () => {
|
|
6
|
-
let network: TestNetwork
|
|
7
|
-
let agent: AtpAgent
|
|
8
|
-
let sc: SeedClient
|
|
9
|
-
|
|
10
|
-
beforeAll(async () => {
|
|
11
|
-
network = await TestNetwork.create({
|
|
12
|
-
dbPostgresSchema: 'ozone_communication_templates',
|
|
13
|
-
})
|
|
14
|
-
agent = network.ozone.getAgent()
|
|
15
|
-
sc = network.getSeedClient()
|
|
16
|
-
await basicSeed(sc)
|
|
17
|
-
await network.processAll()
|
|
18
|
-
})
|
|
19
|
-
|
|
20
|
-
afterAll(async () => {
|
|
21
|
-
await network?.close()
|
|
22
|
-
})
|
|
23
|
-
|
|
24
|
-
const templateOne = {
|
|
25
|
-
name: 'Test name 1',
|
|
26
|
-
subject: 'Test subject 1',
|
|
27
|
-
contentMarkdown: 'Test content 1',
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
const listTemplates = async () => {
|
|
31
|
-
const { data } = await agent.tools.ozone.communication.listTemplates(
|
|
32
|
-
{},
|
|
33
|
-
{
|
|
34
|
-
headers: await network.ozone.modHeaders(
|
|
35
|
-
ids.ToolsOzoneCommunicationListTemplates,
|
|
36
|
-
'moderator',
|
|
37
|
-
),
|
|
38
|
-
},
|
|
39
|
-
)
|
|
40
|
-
return data.communicationTemplates
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
describe('create templates', () => {
|
|
44
|
-
it('only allows admins to create new templates', async () => {
|
|
45
|
-
const moderatorReq = agent.tools.ozone.communication.createTemplate(
|
|
46
|
-
{ ...templateOne, createdBy: sc.dids.bob },
|
|
47
|
-
{
|
|
48
|
-
encoding: 'application/json',
|
|
49
|
-
headers: await network.ozone.modHeaders(
|
|
50
|
-
ids.ToolsOzoneCommunicationCreateTemplate,
|
|
51
|
-
'triage',
|
|
52
|
-
),
|
|
53
|
-
},
|
|
54
|
-
)
|
|
55
|
-
await expect(moderatorReq).rejects.toThrow(
|
|
56
|
-
'Must be a moderator to create a communication template',
|
|
57
|
-
)
|
|
58
|
-
const modReq = await agent.tools.ozone.communication.createTemplate(
|
|
59
|
-
{ ...templateOne, createdBy: sc.dids.bob },
|
|
60
|
-
{
|
|
61
|
-
encoding: 'application/json',
|
|
62
|
-
headers: await network.ozone.modHeaders(
|
|
63
|
-
ids.ToolsOzoneCommunicationCreateTemplate,
|
|
64
|
-
'admin',
|
|
65
|
-
),
|
|
66
|
-
},
|
|
67
|
-
)
|
|
68
|
-
|
|
69
|
-
expect(modReq.data).toMatchObject({
|
|
70
|
-
...templateOne,
|
|
71
|
-
lastUpdatedBy: sc.dids.bob,
|
|
72
|
-
})
|
|
73
|
-
})
|
|
74
|
-
})
|
|
75
|
-
describe('list templates', () => {
|
|
76
|
-
it('returns all saved templates', async () => {
|
|
77
|
-
const listBefore = await listTemplates()
|
|
78
|
-
expect(listBefore.length).toEqual(1)
|
|
79
|
-
expect(listBefore[0]).toMatchObject(templateOne)
|
|
80
|
-
|
|
81
|
-
const templateTwo = {
|
|
82
|
-
...templateOne,
|
|
83
|
-
name: 'Test template 2',
|
|
84
|
-
}
|
|
85
|
-
await agent.tools.ozone.communication.createTemplate(
|
|
86
|
-
{ ...templateTwo, createdBy: sc.dids.bob },
|
|
87
|
-
{
|
|
88
|
-
encoding: 'application/json',
|
|
89
|
-
headers: await network.ozone.modHeaders(
|
|
90
|
-
ids.ToolsOzoneCommunicationCreateTemplate,
|
|
91
|
-
'admin',
|
|
92
|
-
),
|
|
93
|
-
},
|
|
94
|
-
)
|
|
95
|
-
|
|
96
|
-
const listAfter = await listTemplates()
|
|
97
|
-
expect(listAfter.length).toEqual(2)
|
|
98
|
-
expect(listAfter[1]).toMatchObject(templateTwo)
|
|
99
|
-
})
|
|
100
|
-
})
|
|
101
|
-
describe('update template', () => {
|
|
102
|
-
it('allows moderators to update a template by id', async () => {
|
|
103
|
-
const { data } = await agent.tools.ozone.communication.updateTemplate(
|
|
104
|
-
{ id: '1', updatedBy: sc.dids.bob, name: '1 Test template' },
|
|
105
|
-
{
|
|
106
|
-
encoding: 'application/json',
|
|
107
|
-
headers: await network.ozone.modHeaders(
|
|
108
|
-
ids.ToolsOzoneCommunicationUpdateTemplate,
|
|
109
|
-
'admin',
|
|
110
|
-
),
|
|
111
|
-
},
|
|
112
|
-
)
|
|
113
|
-
|
|
114
|
-
expect(data.name).not.toEqual(templateOne.name)
|
|
115
|
-
expect(data.name).toEqual('1 Test template')
|
|
116
|
-
})
|
|
117
|
-
})
|
|
118
|
-
describe('delete template', () => {
|
|
119
|
-
it('allows admins to remove a template by id', async () => {
|
|
120
|
-
const modReq = agent.tools.ozone.communication.deleteTemplate(
|
|
121
|
-
{ id: '1' },
|
|
122
|
-
{
|
|
123
|
-
encoding: 'application/json',
|
|
124
|
-
headers: await network.ozone.modHeaders(
|
|
125
|
-
ids.ToolsOzoneCommunicationDeleteTemplate,
|
|
126
|
-
'triage',
|
|
127
|
-
),
|
|
128
|
-
},
|
|
129
|
-
)
|
|
130
|
-
|
|
131
|
-
await expect(modReq).rejects.toThrow(
|
|
132
|
-
'Must be a moderator to delete a communication template',
|
|
133
|
-
)
|
|
134
|
-
|
|
135
|
-
await agent.tools.ozone.communication.deleteTemplate(
|
|
136
|
-
{ id: '1' },
|
|
137
|
-
{
|
|
138
|
-
encoding: 'application/json',
|
|
139
|
-
headers: await network.ozone.modHeaders(
|
|
140
|
-
ids.ToolsOzoneCommunicationDeleteTemplate,
|
|
141
|
-
'moderator',
|
|
142
|
-
),
|
|
143
|
-
},
|
|
144
|
-
)
|
|
145
|
-
const list = await listTemplates()
|
|
146
|
-
expect(list.length).toEqual(1)
|
|
147
|
-
})
|
|
148
|
-
})
|
|
149
|
-
})
|