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})