Fork of github.com/did-method-plc/did-method-plc
1import { cidForCbor, DAY } from '@atproto/common'
2import { Secp256k1Keypair } from '@atproto/crypto'
3import * as plc from '@did-plc/lib'
4import { Kysely } from 'kysely'
5import { Database } from '../../src'
6
7describe('refactor migration', () => {
8 let db: Database
9 let rawDb: Kysely<any>
10
11 beforeAll(async () => {
12 const dbUrl = process.env.DATABASE_URL
13 if (!dbUrl) {
14 throw new Error('No postgres url provided')
15 }
16 db = Database.postgres({
17 url: dbUrl,
18 schema: 'migration_refactor',
19 })
20
21 await db.migrateToOrThrow('_20221020T204908820Z')
22 rawDb = db.db
23 })
24
25 afterAll(async () => {
26 await db.close()
27 })
28
29 const ops: any[] = []
30 let before: any[]
31
32 it('fills the database with some operations', async () => {
33 for (let i = 0; i < 100; i++) {
34 const signingKey = await Secp256k1Keypair.create()
35 const recoveryKey = await Secp256k1Keypair.create()
36 const op = await plc.deprecatedSignCreate(
37 {
38 type: 'create',
39 signingKey: signingKey.did(),
40 recoveryKey: recoveryKey.did(),
41 handle: `user${i}.test`,
42 service: 'https://example.com',
43 prev: null,
44 },
45 signingKey,
46 )
47 const did = await plc.didForCreateOp(op)
48 const cid = await cidForCbor(op)
49 const randomOffset = Math.floor(Math.random() * DAY * 60)
50 const time = new Date(Date.now() - randomOffset).toISOString()
51 ops.push({
52 did,
53 operation: JSON.stringify(op),
54 cid: cid.toString(),
55 nullified: 0,
56 createdAt: time,
57 })
58 }
59 await rawDb.insertInto('operations').values(ops).execute()
60
61 before = await rawDb
62 .selectFrom('operations')
63 .selectAll()
64 .orderBy('did', 'asc')
65 .execute()
66 })
67
68 it('migrates', async () => {
69 await db.migrateToOrThrow('_20230223T215019669Z')
70 })
71
72 it('correctly migrated all data', async () => {
73 const migrated = await rawDb
74 .selectFrom('operations')
75 .selectAll()
76 .orderBy('did', 'asc')
77 .execute()
78 const ordered = ops.sort((a, b) => a.did.localeCompare(b.did))
79 expect(migrated.length).toBe(ordered.length)
80 for (let i = 0; i < migrated.length; i++) {
81 expect(migrated[i].did).toBe(ordered[i].did)
82 expect(migrated[i].operation).toEqual(JSON.parse(ordered[i].operation))
83 expect(migrated[i].cid).toBe(ordered[i].cid)
84 expect(migrated[i].nullified).toBe(
85 ordered[i].nullified === 1 ? true : false,
86 )
87 expect(migrated[i].createdAt).toEqual(new Date(ordered[i].createdAt))
88 }
89 })
90
91 it('migrates down', async () => {
92 await db.migrateToOrThrow('_20221020T204908820Z')
93 const migratedBack = await rawDb
94 .selectFrom('operations')
95 .selectAll()
96 .orderBy('did', 'asc')
97 .execute()
98 expect(migratedBack.length).toBe(before.length)
99 // normalize json
100 const beforeNormalized = before.map((row) => ({
101 ...row,
102 operation: JSON.parse(row.operation),
103 }))
104 const migratedNormalized = migratedBack.map((row) => ({
105 ...row,
106 operation: JSON.parse(row.operation),
107 }))
108
109 expect(migratedNormalized).toEqual(beforeNormalized)
110 })
111})