diff --git a/packages/api/package.json b/packages/api/package.json index 20780bfb888..a8af7b6b3d7 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -40,7 +40,7 @@ }, "devDependencies": { "@atproto/lex-cli": "workspace:^", - "@atproto/pds": "workspace:^", + "@atproto/dev-env": "workspace:^", "common-tags": "^1.8.2" } } diff --git a/packages/api/tests/bsky-agent.test.ts b/packages/api/tests/bsky-agent.test.ts index 8066bd61f3a..5582f7ac021 100644 --- a/packages/api/tests/bsky-agent.test.ts +++ b/packages/api/tests/bsky-agent.test.ts @@ -1,23 +1,17 @@ -import { - CloseFn, - runTestServer, - TestServerInfo, -} from '@atproto/pds/tests/_util' +import { TestNetworkNoAppView } from '@atproto/dev-env' import { BskyAgent, ComAtprotoRepoPutRecord, AppBskyActorProfile } from '..' describe('agent', () => { - let server: TestServerInfo - let close: CloseFn + let network: TestNetworkNoAppView beforeAll(async () => { - server = await runTestServer({ + network = await TestNetworkNoAppView.create({ dbPostgresSchema: 'bsky_agent', }) - close = server.close }) afterAll(async () => { - await close() + await network.close() }) const getProfileDisplayName = async ( @@ -35,7 +29,7 @@ describe('agent', () => { } it('upsertProfile correctly creates and updates profiles.', async () => { - const agent = new BskyAgent({ service: server.url }) + const agent = new BskyAgent({ service: network.pds.url }) await agent.createAccount({ handle: 'user1.test', @@ -67,7 +61,7 @@ describe('agent', () => { }) it('upsertProfile correctly handles CAS failures.', async () => { - const agent = new BskyAgent({ service: server.url }) + const agent = new BskyAgent({ service: network.pds.url }) await agent.createAccount({ handle: 'user2.test', @@ -106,7 +100,7 @@ describe('agent', () => { }) it('upsertProfile wont endlessly retry CAS failures.', async () => { - const agent = new BskyAgent({ service: server.url }) + const agent = new BskyAgent({ service: network.pds.url }) await agent.createAccount({ handle: 'user3.test', @@ -135,7 +129,7 @@ describe('agent', () => { }) it('upsertProfile validates the record.', async () => { - const agent = new BskyAgent({ service: server.url }) + const agent = new BskyAgent({ service: network.pds.url }) await agent.createAccount({ handle: 'user4.test', @@ -153,70 +147,70 @@ describe('agent', () => { describe('app', () => { it('should retrieve the api app', () => { - const agent = new BskyAgent({ service: server.url }) + const agent = new BskyAgent({ service: network.pds.url }) expect(agent.app).toBe(agent.api.app) }) }) describe('post', () => { it('should throw if no session', async () => { - const agent = new BskyAgent({ service: server.url }) + const agent = new BskyAgent({ service: network.pds.url }) await expect(agent.post({ text: 'foo' })).rejects.toThrow('Not logged in') }) }) describe('deletePost', () => { it('should throw if no session', async () => { - const agent = new BskyAgent({ service: server.url }) + const agent = new BskyAgent({ service: network.pds.url }) await expect(agent.deletePost('foo')).rejects.toThrow('Not logged in') }) }) describe('like', () => { it('should throw if no session', async () => { - const agent = new BskyAgent({ service: server.url }) + const agent = new BskyAgent({ service: network.pds.url }) await expect(agent.like('foo', 'bar')).rejects.toThrow('Not logged in') }) }) describe('deleteLike', () => { it('should throw if no session', async () => { - const agent = new BskyAgent({ service: server.url }) + const agent = new BskyAgent({ service: network.pds.url }) await expect(agent.deleteLike('foo')).rejects.toThrow('Not logged in') }) }) describe('repost', () => { it('should throw if no session', async () => { - const agent = new BskyAgent({ service: server.url }) + const agent = new BskyAgent({ service: network.pds.url }) await expect(agent.repost('foo', 'bar')).rejects.toThrow('Not logged in') }) }) describe('deleteRepost', () => { it('should throw if no session', async () => { - const agent = new BskyAgent({ service: server.url }) + const agent = new BskyAgent({ service: network.pds.url }) await expect(agent.deleteRepost('foo')).rejects.toThrow('Not logged in') }) }) describe('follow', () => { it('should throw if no session', async () => { - const agent = new BskyAgent({ service: server.url }) + const agent = new BskyAgent({ service: network.pds.url }) await expect(agent.follow('foo')).rejects.toThrow('Not logged in') }) }) describe('deleteFollow', () => { it('should throw if no session', async () => { - const agent = new BskyAgent({ service: server.url }) + const agent = new BskyAgent({ service: network.pds.url }) await expect(agent.deleteFollow('foo')).rejects.toThrow('Not logged in') }) }) describe('preferences methods', () => { it('gets and sets preferences correctly', async () => { - const agent = new BskyAgent({ service: server.url }) + const agent = new BskyAgent({ service: network.pds.url }) await agent.createAccount({ handle: 'user5.test', @@ -714,7 +708,7 @@ describe('agent', () => { }) it('resolves duplicates correctly', async () => { - const agent = new BskyAgent({ service: server.url }) + const agent = new BskyAgent({ service: network.pds.url }) await agent.createAccount({ handle: 'user6.test', diff --git a/packages/dev-env/src/pds.ts b/packages/dev-env/src/pds.ts index 46a73e8813b..501ae390cdb 100644 --- a/packages/dev-env/src/pds.ts +++ b/packages/dev-env/src/pds.ts @@ -41,6 +41,8 @@ export class TestPds { jwtSecret: 'jwt-secret', serviceHandleDomains: ['.test'], sequencerLeaderLockId: uniqueLockId(), + bskyAppViewUrl: 'https://appview.invalid', + bskyAppViewDid: 'did:example:invalid', bskyAppViewCdnUrlPattern: 'http://cdn.appview.com/%s/%s/%s', repoSigningKeyK256PrivateKeyHex: repoSigningPriv, plcRotationKeyK256PrivateKeyHex: plcRotationPriv, diff --git a/packages/pds/src/db/migrations/20230922T033938477Z-remove-appview.ts b/packages/pds/src/db/migrations/20230922T033938477Z-remove-appview.ts deleted file mode 100644 index f66825fa722..00000000000 --- a/packages/pds/src/db/migrations/20230922T033938477Z-remove-appview.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { Kysely } from 'kysely' - -export async function up(db: Kysely): Promise { - await db.schema.dropView('algo_whats_hot_view').materialized().execute() - await db.schema.dropTable('actor_block').execute() - await db.schema.dropTable('duplicate_record').execute() - await db.schema.dropTable('feed_generator').execute() - await db.schema.dropTable('feed_item').execute() - await db.schema.dropTable('follow').execute() - await db.schema.dropTable('label').execute() - await db.schema.dropTable('like').execute() - await db.schema.dropTable('list_item').execute() - await db.schema.dropTable('list').execute() - await db.schema.dropTable('post_agg').execute() - await db.schema.dropTable('post_embed_image').execute() - await db.schema.dropTable('post_embed_external').execute() - await db.schema.dropTable('post_embed_record').execute() - await db.schema.dropTable('post').execute() - await db.schema.dropTable('profile_agg').execute() - await db.schema.dropTable('profile').execute() - await db.schema.dropTable('repost').execute() - await db.schema.dropTable('subscription').execute() - await db.schema.dropTable('suggested_follow').execute() - await db.schema.dropTable('view_param').execute() -} - -export async function down(_db: Kysely): Promise { - // Migration code -} diff --git a/packages/pds/src/db/migrations/20230926T195532354Z-email-tokens.ts b/packages/pds/src/db/migrations/20230926T195532354Z-email-tokens.ts index 2a02500ddd1..44cefc18899 100644 --- a/packages/pds/src/db/migrations/20230926T195532354Z-email-tokens.ts +++ b/packages/pds/src/db/migrations/20230926T195532354Z-email-tokens.ts @@ -21,6 +21,8 @@ export async function up(db: Kysely, dialect: Dialect): Promise { .addColumn('emailConfirmedAt', 'varchar') .execute() + await db.schema.dropIndex('user_account_password_reset_token_idx').execute() + await db.schema .alterTable('user_account') .dropColumn('passwordResetToken') @@ -41,6 +43,13 @@ export async function down(db: Kysely): Promise { .dropColumn('emailConfirmedAt') .execute() + await db.schema + .createIndex('user_account_password_reset_token_idx') + .unique() + .on('user_account') + .column('passwordResetToken') + .execute() + await db.schema .alterTable('user_account') .addColumn('passwordResetToken', 'varchar') diff --git a/packages/pds/tests/_util.ts b/packages/pds/tests/_util.ts index 69ea84d4826..79f9a1c8da8 100644 --- a/packages/pds/tests/_util.ts +++ b/packages/pds/tests/_util.ts @@ -76,6 +76,8 @@ export const runTestServer = async ( didPlcUrl: plcUrl, serviceHandleDomains: ['.test'], sequencerLeaderLockId: uniqueLockId(), + bskyAppViewUrl: 'https://appview.invalid', + bskyAppViewDid: 'did:example:invalid', repoSigningKeyK256PrivateKeyHex: repoSigningPriv, plcRotationKeyK256PrivateKeyHex: plcRotationPriv, adminPassword: ADMIN_PASSWORD, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bdcf79440c1..309e59c502a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -111,12 +111,12 @@ importers: specifier: ^2.1.0 version: 2.1.0 devDependencies: + '@atproto/dev-env': + specifier: workspace:^ + version: link:../dev-env '@atproto/lex-cli': specifier: workspace:^ version: link:../lex-cli - '@atproto/pds': - specifier: workspace:^ - version: link:../pds common-tags: specifier: ^1.8.2 version: 1.8.2