diff --git a/database/factories/kit_factory.ts b/database/factories/kit_factory.ts index 673950c..4292b36 100644 --- a/database/factories/kit_factory.ts +++ b/database/factories/kit_factory.ts @@ -1,12 +1,13 @@ import Factory from '@adonisjs/lucid/factories' import { DateTime } from 'luxon' +import { AtUri } from '@atproto/syntax' import Kit from '#kits/models/kit' export const KitFactory = Factory.define(Kit, ({ faker }) => { const did = `did:plc:${faker.string.alphanumeric(24)}` const rkey = faker.string.alphanumeric(13) return { - uri: `at://${did}/gunpla.kit/${rkey}`, + uri: AtUri.make(did, 'build.gunpla.kit', rkey).toString(), cid: null, did, name: faker.commerce.productName(), diff --git a/tests/functional/kits.spec.ts b/tests/functional/kits.spec.ts index ad95d9a..beee390 100644 --- a/tests/functional/kits.spec.ts +++ b/tests/functional/kits.spec.ts @@ -1,4 +1,5 @@ import { test } from '@japa/runner' +import { AtUri } from '@atproto/syntax' import testUtils from '@adonisjs/core/services/test_utils' import type { HttpContext } from '@adonisjs/core/http' import type { NextFn } from '@adonisjs/core/types/http' @@ -368,7 +369,7 @@ test.group('Kits Management', (group) => { swap(KitsService, new FakeKitsService()) const kit = await Kit.create({ - uri: 'at://did:plc:test/build.gunpla.kit/aerial-delete', + uri: AtUri.make('did:plc:test', 'build.gunpla.kit', 'aerial-delete').toString(), did: 'did:plc:test', name: 'Kit to delete', status: 'backlog', diff --git a/tests/functional/kits/like_kit.spec.ts b/tests/functional/kits/like_kit.spec.ts index b629733..4e4a6ea 100644 --- a/tests/functional/kits/like_kit.spec.ts +++ b/tests/functional/kits/like_kit.spec.ts @@ -1,5 +1,6 @@ import { test } from '@japa/runner' import testUtils from '@adonisjs/core/services/test_utils' +import { AtUri } from '@atproto/syntax' import { ProfileFactory } from '#database/factories/profile_factory' import { KitFactory } from '#database/factories/kit_factory' import AuthMiddleware from '#middleware/auth_middleware' @@ -10,6 +11,8 @@ import { FakeKitLikesService } from '../../helpers/fake_kit_likes_service.js' test.group('LikeKitController.store', (group) => { group.each.setup(() => testUtils.db().truncate()) + const kitUri = AtUri.make('did:plc:amuro', 'build.gunpla.kit', 'abc123').toString() + test('unauthenticated POST to kits.like redirects to login', async ({ client }) => { const response = await client .visit('kits.like', { handle: 'any.bsky.social', rkey: 'anyrkey' }) @@ -49,7 +52,7 @@ test.group('LikeKitController.store', (group) => { await ProfileFactory.merge({ did: 'did:plc:amuro', handle: 'amuro.bsky.social' }).create() await KitFactory.merge({ did: 'did:plc:amuro', - uri: 'at://did:plc:amuro/gunpla.kit/abc123', + uri: kitUri, }).create() swap(AuthMiddleware, new FakeAuthMiddlewareWithUser('did:plc:liker')) swap(KitLikesService, new FakeKitLikesService({ likeCount: 1 })) @@ -66,6 +69,8 @@ test.group('LikeKitController.store', (group) => { test.group('LikeKitController.destroy', (group) => { group.each.setup(() => testUtils.db().truncate()) + const kitUri = AtUri.make('did:plc:amuro', 'build.gunpla.kit', 'abc123').toString() + test('unauthenticated DELETE to kits.unlike redirects to login', async ({ client }) => { const response = await client .visit('kits.unlike', { handle: 'any.bsky.social', rkey: 'anyrkey' }) @@ -78,7 +83,7 @@ test.group('LikeKitController.destroy', (group) => { await ProfileFactory.merge({ did: 'did:plc:amuro', handle: 'amuro.bsky.social' }).create() await KitFactory.merge({ did: 'did:plc:amuro', - uri: 'at://did:plc:amuro/gunpla.kit/abc123', + uri: kitUri, }).create() swap(AuthMiddleware, new FakeAuthMiddlewareWithUser('did:plc:liker')) @@ -96,7 +101,7 @@ test.group('LikeKitController.destroy', (group) => { await ProfileFactory.merge({ did: 'did:plc:amuro', handle: 'amuro.bsky.social' }).create() await KitFactory.merge({ did: 'did:plc:amuro', - uri: 'at://did:plc:amuro/gunpla.kit/abc123', + uri: kitUri, }).create() swap(AuthMiddleware, new FakeAuthMiddlewareWithUser('did:plc:liker')) swap(KitLikesService, new FakeKitLikesService({ likeCount: 0 })) diff --git a/tests/functional/profile.spec.ts b/tests/functional/profile.spec.ts index 7a0bc01..e960b4e 100644 --- a/tests/functional/profile.spec.ts +++ b/tests/functional/profile.spec.ts @@ -1,4 +1,5 @@ import { test } from '@japa/runner' +import { AtUri } from '@atproto/syntax' import testUtils from '@adonisjs/core/services/test_utils' import Kit from '#kits/models/kit' import { DateTime } from 'luxon' @@ -90,7 +91,7 @@ test.group('Profile', (group) => { for (const [index, grade] of grades.entries()) { await Kit.create({ - uri: `at://${did}/build.gunpla.kit/${index}`, + uri: AtUri.make(did, 'build.gunpla.kit', String(index)).toString(), did, name: `Kit ${grade}`, grade, diff --git a/tests/functional/profile/show_kit.spec.ts b/tests/functional/profile/show_kit.spec.ts index c7f176f..592db05 100644 --- a/tests/functional/profile/show_kit.spec.ts +++ b/tests/functional/profile/show_kit.spec.ts @@ -1,4 +1,5 @@ import { test } from '@japa/runner' +import { AtUri } from '@atproto/syntax' import testUtils from '@adonisjs/core/services/test_utils' import { KitFactory } from '#database/factories/kit_factory' import { KitLikeFactory } from '#database/factories/kit_like_factory' @@ -67,7 +68,7 @@ test.group('ShowKitController.render', (group) => { await ProfileFactory.merge({ did: 'did:plc:amuro', handle: 'amuro.bsky.social' }).create() await KitFactory.merge({ did: 'did:plc:amuro', - uri: 'at://did:plc:amuro/gunpla.kit/abc123rkey01', + uri: AtUri.make('did:plc:amuro', 'build.gunpla.kit', 'abc123rkey01').toString(), status: 'done', }).create() swap( @@ -109,7 +110,7 @@ test.group('ShowKitController.render', (group) => { await ProfileFactory.merge({ did: 'did:plc:amuro', handle: 'amuro.bsky.social' }).create() await KitFactory.merge({ did: 'did:plc:amuro', - uri: 'at://did:plc:amuro/gunpla.kit/abc123', + uri: AtUri.make('did:plc:amuro', 'build.gunpla.kit', 'abc123').toString(), }).create() swap( IdentityService, @@ -135,7 +136,7 @@ test.group('ShowKitController.render', (group) => { await ProfileFactory.merge({ did: 'did:plc:amuro', handle: 'amuro.bsky.social' }).create() const kit = await KitFactory.merge({ did: 'did:plc:amuro', - uri: 'at://did:plc:amuro/gunpla.kit/abc123', + uri: AtUri.make('did:plc:amuro', 'build.gunpla.kit', 'abc123').toString(), }).create() await KitLikeFactory.merge({ kitId: kit.id, did: 'did:plc:liker' }).create() swap( diff --git a/tests/helpers/fake_atproto_user.ts b/tests/helpers/fake_atproto_user.ts index 1c397b1..62d5cba 100644 --- a/tests/helpers/fake_atproto_user.ts +++ b/tests/helpers/fake_atproto_user.ts @@ -1,4 +1,5 @@ import { AtprotoUser } from '@thisismissem/adonisjs-atproto-oauth' +import { AtUri } from '@atproto/syntax' import { Client, type CreateOptions, @@ -60,7 +61,7 @@ export class FakeClient extends Client { return this.#createHandler() } return { - uri: asAtUriString(`at://${this.assertDid}/build.gunpla.kit/fake`), + uri: asAtUriString(AtUri.make(this.assertDid, 'build.gunpla.kit', 'fake').toString()), cid: 'bafkreiadsbmmn4waznesyuz3bjgrj33xzqhxrk6mz3ksq7meugrachh3qe', } } diff --git a/tests/helpers/fake_kits_service.ts b/tests/helpers/fake_kits_service.ts index bc24c87..7973cdd 100644 --- a/tests/helpers/fake_kits_service.ts +++ b/tests/helpers/fake_kits_service.ts @@ -2,7 +2,7 @@ import { KitsService } from '#kits/services/kits_service' import { FakeAtprotoUser } from './fake_atproto_user.js' import KitRecordTransformer from '#kits/transformers/kit_record_transformer' import Kit from '#kits/models/kit' -import { asAtUriString } from '@atproto/syntax' +import { asAtUriString, AtUri } from '@atproto/syntax' import { l } from '@atproto/lex' import { DateTime } from 'luxon' import type { Infer } from '@vinejs/vine/types' @@ -22,7 +22,7 @@ export class FakeKitsService extends KitsService { throw new Error('Not found') } return { - uri: asAtUriString(`at://did:plc:test/build.gunpla.kit/${rkey}`), + uri: asAtUriString(AtUri.make('did:plc:test', 'build.gunpla.kit', rkey).toString()), cid: 'bafytestcid', value: { $type: 'build.gunpla.kit' as const, @@ -43,8 +43,9 @@ export class FakeKitsService extends KitsService { } const photoCid = photoCids[0] ?? null + const uri = AtUri.make('did:plc:test', 'build.gunpla.kit', 'new-aerial').toString() await Kit.create({ - uri: 'at://did:plc:test/build.gunpla.kit/new-aerial', + uri, did: 'did:plc:test', name: data.name, grade: data.grade ?? null, @@ -57,14 +58,14 @@ export class FakeKitsService extends KitsService { }) return { - uri: asAtUriString('at://did:plc:test/build.gunpla.kit/new-aerial'), + uri: asAtUriString(uri), cid: 'bafytestcid', } } override async update(rkey: string, data: Infer) { return { - uri: asAtUriString(`at://did:plc:test/build.gunpla.kit/${rkey}`), + uri: asAtUriString(AtUri.make('did:plc:test', 'build.gunpla.kit', rkey).toString()), value: { $type: 'build.gunpla.kit' as const, name: data.name, @@ -77,6 +78,7 @@ export class FakeKitsService extends KitsService { } override async delete(rkey: string) { - await Kit.query().where('uri', `at://did:plc:test/build.gunpla.kit/${rkey}`).delete() + const uri = AtUri.make('did:plc:test', 'build.gunpla.kit', rkey).toString() + await Kit.query().where('uri', uri).delete() } } diff --git a/tests/unit/achievements_service.spec.ts b/tests/unit/achievements_service.spec.ts index 73b188c..b65cc12 100644 --- a/tests/unit/achievements_service.spec.ts +++ b/tests/unit/achievements_service.spec.ts @@ -1,4 +1,5 @@ import { test } from '@japa/runner' +import { AtUri } from '@atproto/syntax' import type { ModelAttributes } from '@adonisjs/lucid/types/model' import { AchievementsService } from '#profile/services/achievements_service' import Kit from '#kits/models/kit' @@ -7,7 +8,7 @@ function createKit(overrides: Partial> = {}): Kit { const kit = new Kit() kit.merge({ id: 1, - uri: 'at://did:plc:test/build.gunpla.kit/1', + uri: AtUri.make('did:plc:test', 'build.gunpla.kit', '1').toString(), did: 'did:plc:test', name: 'Test Kit', status: 'backlog', diff --git a/tests/unit/jetstream_service.spec.ts b/tests/unit/jetstream_service.spec.ts index 3a6c93f..8431cbf 100644 --- a/tests/unit/jetstream_service.spec.ts +++ b/tests/unit/jetstream_service.spec.ts @@ -1,22 +1,27 @@ import { test } from '@japa/runner' import testUtils from '@adonisjs/core/services/test_utils' +import { AtUri } from '@atproto/syntax' import { JetstreamService } from '../../services/jetstream_service.js' import { KitFactory } from '../../database/factories/kit_factory.js' test.group('JetstreamService.processEvent', (group) => { group.each.setup(() => testUtils.db().truncate()) + const did = 'did:plc:testfakeuser12345' + const rkey = 'testkey123' + const expectedUri = AtUri.make(did, 'build.gunpla.kit', rkey).toString() + test('valid kit record creates a Kit row in the database', async ({ db }) => { const service = new JetstreamService() await service.processEvent({ kind: 'commit', time_us: Date.now(), - did: 'did:plc:testfakeuser12345', + did, commit: { operation: 'create', collection: 'build.gunpla.kit', - rkey: 'testkey123', + rkey, cid: 'bafytest', record: { $type: 'build.gunpla.kit', @@ -28,7 +33,7 @@ test.group('JetstreamService.processEvent', (group) => { }) await db.assertHas('kits', { - uri: 'at://did:plc:testfakeuser12345/build.gunpla.kit/testkey123', + uri: expectedUri, }) }) @@ -38,25 +43,25 @@ test.group('JetstreamService.processEvent', (group) => { await service.processEvent({ kind: 'commit', time_us: Date.now(), - did: 'did:plc:testfakeuser12345', + did, commit: { operation: 'create', collection: 'build.gunpla.kit', - rkey: 'testkey123', + rkey, cid: 'bafytest', record: { $type: 'build.gunpla.kit' }, }, }) await db.assertMissing('kits', { - uri: 'at://did:plc:testfakeuser12345/build.gunpla.kit/testkey123', + uri: expectedUri, }) }) test('kit delete event removes the Kit row from the database', async ({ db }) => { await KitFactory.merge({ - uri: 'at://did:plc:testfakeuser12345/build.gunpla.kit/testkey123', - did: 'did:plc:testfakeuser12345', + uri: expectedUri, + did, }).create() const service = new JetstreamService() @@ -64,16 +69,16 @@ test.group('JetstreamService.processEvent', (group) => { await service.processEvent({ kind: 'commit', time_us: Date.now(), - did: 'did:plc:testfakeuser12345', + did, commit: { operation: 'delete', collection: 'build.gunpla.kit', - rkey: 'testkey123', + rkey, }, }) await db.assertMissing('kits', { - uri: 'at://did:plc:testfakeuser12345/build.gunpla.kit/testkey123', + uri: expectedUri, }) }) }) diff --git a/tests/unit/kits_service.spec.ts b/tests/unit/kits_service.spec.ts index 0f78ec2..9f4c294 100644 --- a/tests/unit/kits_service.spec.ts +++ b/tests/unit/kits_service.spec.ts @@ -1,6 +1,6 @@ import { test } from '@japa/runner' import testUtils from '@adonisjs/core/services/test_utils' -import { asAtUriString, InvalidRecordKeyError } from '@atproto/syntax' +import { asAtUriString, AtUri, InvalidRecordKeyError } from '@atproto/syntax' import { l } from '@atproto/lex' import { KitsService } from '#kits/services/kits_service' import { KitFactory } from '#database/factories/kit_factory' @@ -15,7 +15,7 @@ test.group('KitsService', (group) => { const fakeUser = new FakeAtprotoUser({ did, createHandler: async () => ({ - uri: asAtUriString(`at://${did}/build.gunpla.kit/new-kit`), + uri: asAtUriString(AtUri.make(did, 'build.gunpla.kit', 'new-kit').toString()), cid: 'bafytestcid', }), }) @@ -36,7 +36,7 @@ test.group('KitsService', (group) => { }) => { const did = 'did:plc:builder123' const rkey = '3k2y4z3u2b222' - const kitUri = `at://${did}/build.gunpla.kit/${rkey}` + const kitUri = AtUri.make(did, 'build.gunpla.kit', rkey).toString() await KitFactory.merge({ uri: kitUri, @@ -96,7 +96,7 @@ test.group('KitsService', (group) => { test('delete kit formats canonical AT-URI via AtUri.make and removes record', async ({ db }) => { const did = 'did:plc:builder123' const rkey = '3k2y4z3u2b222' - const kitUri = `at://${did}/build.gunpla.kit/${rkey}` + const kitUri = AtUri.make(did, 'build.gunpla.kit', rkey).toString() await KitFactory.merge({ uri: kitUri,