OverviewFilesCommitsIssuesDocsReleasesPeers

hyper-note / test / registry-apply.test.js

105 lines · javascript ref:
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')
})