orbitdb/test/access-controllers/access-controller-handlers.test.js

143 lines
4.8 KiB
JavaScript

'use strict'
const assert = require('assert')
const rmrf = require('rimraf')
const Web3 = require('web3')
const OrbitDB = require('../../src/OrbitDB.js')
const IdentityProvider = require('orbit-db-identity-provider')
const Keystore = require('orbit-db-keystore')
const AccessControllers = require('orbit-db-access-controllers')
const ContractAccessController = require('orbit-db-access-controllers/src/contract-access-controller.js')
const ganache = require('ganache-cli')
const { abi, bytecode } = require('./Access')
// Include test utilities
const {
config,
startIpfs,
stopIpfs,
testAPIs
} = require('orbit-db-test-utils')
const dbPath1 = './orbitdb/tests/orbitdb-access-controller/1'
const dbPath2 = './orbitdb/tests/orbitdb-access-controller/2'
Object.keys(testAPIs).forEach(API => {
describe(`orbit-db - Access Controller Handlers (${API})`, function () {
this.timeout(config.timeout)
let web3, contract, ipfsd1, ipfsd2, ipfs1, ipfs2, id1, id2
let orbitdb1, orbitdb2
before(async () => {
rmrf.sync(dbPath1)
rmrf.sync(dbPath2)
ipfsd1 = await startIpfs(API, config.daemon1)
ipfsd2 = await startIpfs(API, config.daemon2)
ipfs1 = ipfsd1.api
ipfs2 = ipfsd2.api
const keystore1 = new Keystore(dbPath1 + '/keys')
const keystore2 = new Keystore(dbPath2 + '/keys')
id1 = await IdentityProvider.createIdentity({ id: 'A', keystore: keystore1 })
id2 = await IdentityProvider.createIdentity({ id: 'B', keystore: keystore2 })
orbitdb1 = await OrbitDB.createInstance(ipfs1, {
AccessControllers: AccessControllers,
directory: dbPath1,
identity: id1
})
orbitdb2 = await OrbitDB.createInstance(ipfs2, {
AccessControllers: AccessControllers,
directory: dbPath2,
identity: id2
})
})
after(async () => {
if (orbitdb1) { await orbitdb1.stop() }
if (orbitdb2) { await orbitdb2.stop() }
if (ipfsd1) { await stopIpfs(ipfsd1) }
if (ipfsd2) { await stopIpfs(ipfsd2) }
})
describe('isSupported', function () {
it('supports default access controllers', () => {
assert.strictEqual(AccessControllers.isSupported('ipfs'), true)
assert.strictEqual(AccessControllers.isSupported('orbitdb'), true)
})
it('doesn\'t support smart contract access controller by default', () => {
assert.strictEqual(AccessControllers.isSupported(ContractAccessController.type), false)
})
})
describe('addAccessController', function () {
it('supports added access controller', () => {
const options = {
AccessController: ContractAccessController,
web3: web3,
abi: abi
}
AccessControllers.addAccessController(options)
assert.strictEqual(AccessControllers.isSupported(ContractAccessController.type), true)
})
})
describe('create access controllers', function () {
let options = {
AccessController: ContractAccessController
}
before(async () => {
web3 = new Web3(ganache.provider())
const accounts = await web3.eth.getAccounts()
contract = await new web3.eth.Contract(abi)
.deploy({ data: bytecode })
.send({ from: accounts[0], gas: '1000000' })
options = Object.assign({}, options, { web3, abi, contractAddress: contract._address, defaultAccount: accounts[0] })
AccessControllers.addAccessController(options)
})
it('throws an error if AccessController is not defined', async () => {
let err
try {
AccessControllers.addAccessController({})
} catch (e) {
err = e.toString()
}
assert.strictEqual(err, 'Error: AccessController class needs to be given as an option')
})
it('throws an error if AccessController doesn\'t define type', async () => {
let err
try {
AccessControllers.addAccessController({ AccessController: {} })
} catch (e) {
err = e.toString()
}
assert.strictEqual(err, 'Error: Given AccessController class needs to implement: static get type() { /* return a string */}.')
})
it('creates a custom access controller', async () => {
const type = ContractAccessController.type
const acManifestHash = await AccessControllers.create(orbitdb1, type, options)
assert.notStrictEqual(acManifestHash, null)
const ac = await AccessControllers.resolve(orbitdb1, acManifestHash, options)
assert.strictEqual(ac.type, type)
})
it('removes the custom access controller', async () => {
AccessControllers.removeAccessController(ContractAccessController.type)
assert.strictEqual(AccessControllers.isSupported(ContractAccessController.type), false)
})
})
})
})