mirror of https://codeberg.org/pzp/pzp-promise.git
144 lines
4.4 KiB
JavaScript
144 lines
4.4 KiB
JavaScript
const test = require('node:test')
|
|
const assert = require('node:assert')
|
|
const Path = require('node:path')
|
|
const os = require('node:os')
|
|
const fs = require('node:fs')
|
|
const p = require('node:util').promisify
|
|
const rimraf = require('rimraf')
|
|
const Keypair = require('ppppp-keypair')
|
|
const caps = require('ppppp-caps')
|
|
|
|
function setup() {
|
|
setup.counter ??= 0
|
|
setup.counter += 1
|
|
const path = Path.join(os.tmpdir(), 'ppppp-promise-' + setup.counter)
|
|
rimraf.sync(path)
|
|
const keypair = Keypair.generate('ed25519', 'alice')
|
|
|
|
const local = require('secret-stack/bare')({ caps })
|
|
.use(require('secret-stack/plugins/net'))
|
|
.use(require('secret-handshake-ext/secret-stack'))
|
|
.use(require('ppppp-db'))
|
|
.use(require('../lib'))
|
|
.call(null, {
|
|
path,
|
|
keypair,
|
|
})
|
|
|
|
return { local, path, keypair }
|
|
}
|
|
|
|
test('create()', async (t) => {
|
|
const { local, path } = setup()
|
|
|
|
const promise = { type: 'follow' }
|
|
const token = await p(local.promise.create)(promise)
|
|
assert.strictEqual(typeof token, 'string')
|
|
assert.ok(token.length > 42)
|
|
|
|
const file = Path.join(path, 'promises.json')
|
|
assert.ok(fs.existsSync(file), 'file exists')
|
|
const contents = fs.readFileSync(file, 'utf-8')
|
|
assert.strictEqual(contents, JSON.stringify([[token, promise]]))
|
|
|
|
await p(local.close)()
|
|
})
|
|
|
|
test('follow()', async (t) => {
|
|
const { local, path } = setup()
|
|
|
|
assert.rejects(() => p(local.promise.follow)('randomnottoken', 'MY_ID'))
|
|
|
|
const promise = { type: 'follow' }
|
|
const token = await p(local.promise.create)(promise)
|
|
|
|
const file = Path.join(path, 'promises.json')
|
|
const contentsBefore = fs.readFileSync(file, 'utf-8')
|
|
assert.strictEqual(contentsBefore, JSON.stringify([[token, promise]]))
|
|
|
|
const result1 = await p(local.promise.follow)(token, 'MY_ID')
|
|
assert.strictEqual(result1, true)
|
|
|
|
const contentsAfter = fs.readFileSync(file, 'utf-8')
|
|
assert.strictEqual(contentsAfter, '[]')
|
|
|
|
assert.rejects(() => p(local.promise.follow)(token, 'MY_ID'))
|
|
|
|
await p(local.close)()
|
|
})
|
|
|
|
test('identityAdd()', async (t) => {
|
|
const { local, path, keypair } = setup()
|
|
|
|
assert.rejects(() => p(local.promise.identityAdd)('randomnottoken', {}))
|
|
|
|
const identity = await p(local.db.identity.findOrCreate)({
|
|
domain: 'account',
|
|
})
|
|
|
|
const promise = { type: 'identity-add', identity }
|
|
const token = await p(local.promise.create)(promise)
|
|
|
|
const file = Path.join(path, 'promises.json')
|
|
const contentsBefore = fs.readFileSync(file, 'utf-8')
|
|
assert.strictEqual(contentsBefore, JSON.stringify([[token, promise]]))
|
|
|
|
const dbBefore = [...local.db.msgs()].map(({data}) => data)
|
|
assert.equal(dbBefore.length, 1)
|
|
assert.equal(dbBefore[0].action, 'add')
|
|
assert.equal(dbBefore[0].add.key.algorithm, 'ed25519')
|
|
assert.equal(dbBefore[0].add.key.bytes, keypair.public)
|
|
assert.equal(dbBefore[0].add.key.purpose, 'sig')
|
|
assert(dbBefore[0].add.nonce)
|
|
|
|
const keypair2 = Keypair.generate('ed25519', 'bob')
|
|
const consent = local.db.identity.consent({ identity, keypair: keypair2 })
|
|
const result1 = await p(local.promise.identityAdd)(token, {
|
|
key: {
|
|
purpose: 'sig',
|
|
algorithm: 'ed25519',
|
|
bytes: keypair2.public,
|
|
},
|
|
consent,
|
|
})
|
|
assert.strictEqual(result1, true)
|
|
|
|
const dbAfter = [...local.db.msgs()].map(({data}) => data)
|
|
assert.equal(dbAfter.length, 2)
|
|
assert.equal(dbAfter[0].action, 'add')
|
|
assert.equal(dbAfter[0].add.key.algorithm, 'ed25519')
|
|
assert.equal(dbAfter[0].add.key.bytes, keypair.public)
|
|
assert.equal(dbAfter[0].add.key.purpose, 'sig')
|
|
assert(dbAfter[0].add.nonce)
|
|
assert.equal(dbAfter[1].action, 'add')
|
|
assert.equal(dbAfter[1].add.key.algorithm, 'ed25519')
|
|
assert.equal(dbAfter[1].add.key.bytes, keypair2.public)
|
|
assert.equal(dbAfter[1].add.key.purpose, 'sig')
|
|
assert(dbAfter[1].add.consent)
|
|
|
|
const contentsAfter = fs.readFileSync(file, 'utf-8')
|
|
assert.strictEqual(contentsAfter, '[]')
|
|
|
|
assert.rejects(() => p(local.promise.identityAdd)(token, {}))
|
|
|
|
await p(local.close)()
|
|
})
|
|
|
|
test('revoke()', async (t) => {
|
|
const { local, path } = setup()
|
|
|
|
const promise = { type: 'follow' }
|
|
const token = await p(local.promise.create)(promise)
|
|
|
|
const file = Path.join(path, 'promises.json')
|
|
const contentsBefore = fs.readFileSync(file, 'utf-8')
|
|
assert.strictEqual(contentsBefore, JSON.stringify([[token, promise]]))
|
|
|
|
await p(local.promise.revoke)(token)
|
|
|
|
const contentsAfter = fs.readFileSync(file, 'utf-8')
|
|
assert.strictEqual(contentsAfter, '[]')
|
|
|
|
await p(local.close)()
|
|
})
|