import test from 'brittle'
import Corestore from 'corestore'
import Autobase from 'autobase'
import Hyperbee from 'hyperbee'
import os from 'bare-os'
import path from 'bare-path'
import { randomBytes } from 'hypercore-crypto'
import { registryApply, encodeOp, decodeOp } from '../lib/multiwriter/registry-apply.js'
function createStore () {
const tmp = path.join(os.tmpdir(), 'hypernote-test-' + randomBytes(16).toString('hex'))
return new Corestore(tmp)
}
async function createRegistry (store) {
const base = new Autobase(store, {
open: (store) => {
const core = store.get('view', { valueEncoding: 'json' })
return new Hyperbee(core, { keyEncoding: 'utf-8', valueEncoding: 'json' })
},
apply: registryApply,
valueEncoding: 'binary'
})
await base.ready()
return base
}
test('registry-apply: create-user', async (t) => {
const store = createStore()
const base = await createRegistry(store)
await base.append(encodeOp({
type: 'create-user',
userId: 'user-1',
name: 'Alice',
role: 'admin',
identityKey: 'abc123',
timestamp: Date.now()
}))
await base.update()
const entry = await base.view.get('user:user-1')
t.ok(entry, 'user exists in view')
t.is(entry.value.name, 'Alice')
t.is(entry.value.role, 'admin')
await base.close()
await store.close()
})
test('registry-apply: create-notebook metadata', async (t) => {
const store = createStore()
const base = await createRegistry(store)
await base.append(encodeOp({
type: 'create-notebook',
notebookId: 'nb-1',
slug: 'work-notes',
title: 'Work Notes',
owner: 'user-1',
shared: false,
timestamp: Date.now()
}))
await base.update()
const entry = await base.view.get('notebook:nb-1')
t.ok(entry)
t.is(entry.value.title, 'Work Notes')
t.is(entry.value.shared, false)
await base.close()
await store.close()
})
test('registry-apply: set-permission', async (t) => {
const store = createStore()
const base = await createRegistry(store)
await base.append(encodeOp({
type: 'set-permission',
userId: 'user-1',
role: 'write',
scope: '*',
timestamp: Date.now()
}))
await base.update()
const entry = await base.view.get('permission:user-1')
t.ok(entry)
t.is(entry.value.role, 'write')
await base.close()
await store.close()
})
test('encodeOp / decodeOp roundtrip', async (t) => {
const op = { type: 'create-user', userId: 'u1', name: 'Bob', timestamp: 123 }
const encoded = encodeOp(op)
t.ok(Buffer.isBuffer(encoded))
const decoded = decodeOp(encoded)
t.is(decoded.type, 'create-user')
t.is(decoded.userId, 'u1')
t.is(decoded.name, 'Bob')
})