ipfs-coord
Version:
A JS library for helping IPFS peers coordinate, find a common interest, and stay connected around that interest.
201 lines (170 loc) • 5.66 kB
JavaScript
/*
Unit tests for the Peer Use Case library.
*/
// npm libraries
const assert = require('chai').assert
const sinon = require('sinon')
// Local libraries
const PeerUseCases = require('../../../lib/use-cases/peer-use-cases')
// const RelayUseCases = require('../../../lib/use-cases/relay-use-cases')
const ThisNodeUseCases = require('../../../lib/use-cases/this-node-use-cases')
const AdapterMock = require('../../mocks/adapter-mock')
const adapters = new AdapterMock()
// const mockData = require('../../mocks/peers-mock')
describe('#Peer-Use-Cases', () => {
let uut
let sandbox
let thisNode
beforeEach(async () => {
// Restore the sandbox before each test.
sandbox = sinon.createSandbox()
const thisNodeUseCases = new ThisNodeUseCases({
adapters,
controllers: {},
statusLog: () => {
}
})
thisNode = await thisNodeUseCases.createSelf({ type: 'node.js' })
//
// uut = new RelayUseCases({
// adapters,
// controllers: {},
// statusLog: () => {}
// })
uut = new PeerUseCases({ adapters, controllers: {} })
})
afterEach(() => sandbox.restore())
describe('#constructor', () => {
it('should throw an error if adapters is not included', () => {
try {
uut = new PeerUseCases()
assert.fail('Unexpected code path')
} catch (err) {
assert.include(
err.message,
'Must inject instance of adapters when instantiating Peer Use Cases library.'
)
}
})
it('should throw an error if controllers are not included', () => {
try {
uut = new PeerUseCases({ adapters: {} })
assert.fail('Unexpected code path')
} catch (err) {
assert.include(
err.message,
'Must inject instance of controllers when instantiating Peer Use Cases library.'
)
}
})
})
describe('#sendPrivateMessage', () => {
it('should throw an error if peer data can not be found', async () => {
try {
const result = await uut.sendPrivateMessage(
'fakeId',
'messageStr',
thisNode
)
console.log('result: ', result)
} catch (err) {
assert.include(err.message, 'Data for peer')
}
})
it('should encrypt a message and add it to the peers OrbitDB', async () => {
thisNode.peerData.push({ from: 'fakeId' })
// thisNode.orbitData.push({
// ipfsId: 'fakeId',
// db: {
// add: () => {
// }
// }
// })
// Mock dependencies
// sandbox.stub(uut.adapters.encryption, 'encryptMsg')
sandbox.stub(uut, 'connectToPeer').resolves(true)
const result = await uut.sendPrivateMessage(
'fakeId',
'messageStr',
thisNode
)
// console.log('result: ', result)
assert.equal(result, true)
})
})
describe('#connectToPeer', () => {
it('should skip if peer is already connected', async () => {
// Test data
const peerId = 'QmbyYXKbnAmMbMGo8LRBZ58jYs58anqUzY1m4jxDmhDsjd'
thisNode.peerList = [peerId]
// Mock dependencies
sandbox.stub(uut.adapters.ipfs, 'getPeers').resolves([{ peer: peerId }])
// Connect to that peer
const result = await uut.connectToPeer(peerId, thisNode)
assert.equal(result, true)
})
it('should connect to peer through circuit relay', async () => {
// Test data
const peerId = 'QmbyYXKbnAmMbMGo8LRBZ58jYs58anqUzY1m4jxDmhDsjd'
thisNode.peerList = [peerId]
thisNode.relayData = [
{
multiaddr: '/ip4/139.162.76.54/tcp/5269/ws/p2p/QmaKzQTAtoJWYMiG5ATx41uWsMajr1kSxRdtg919s8fK77',
connected: true,
updatedAt: '2021-09-20T15:59:12.961Z',
ipfsId: 'QmaKzQTAtoJWYMiG5ATx41uWsMajr1kSxRdtg919s8fK77',
isBootstrap: false,
metrics: { aboutLatency: [] },
latencyScore: 10000
}
]
// Mock dependencies
sandbox.stub(uut.adapters.ipfs, 'getPeers').resolves([])
sandbox.stub(uut.adapters.ipfs, 'connectToPeer').resolves(true)
thisNode.useCases = {
relays: {
sortRelays: () => thisNode.relayData
}
}
// Connect to that peer
const result = await uut.connectToPeer(peerId, thisNode)
assert.equal(result, true)
})
it('should return false if not able to connect to peer', async () => {
// Test data
const peerId = 'QmbyYXKbnAmMbMGo8LRBZ58jYs58anqUzY1m4jxDmhDsjd'
thisNode.peerList = [peerId]
thisNode.relayData = [
{
multiaddr: '/ip4/139.162.76.54/tcp/5269/ws/p2p/QmaKzQTAtoJWYMiG5ATx41uWsMajr1kSxRdtg919s8fK77',
connected: true,
updatedAt: '2021-09-20T15:59:12.961Z',
ipfsId: 'QmaKzQTAtoJWYMiG5ATx41uWsMajr1kSxRdtg919s8fK77',
isBootstrap: false,
metrics: { aboutLatency: [] },
latencyScore: 10000
}
]
// Mock dependencies
sandbox.stub(uut.adapters.ipfs, 'getPeers').resolves([])
sandbox.stub(uut.adapters.ipfs, 'connectToPeer').resolves(false)
thisNode.useCases = {
relays: {
sortRelays: () => thisNode.relayData
}
}
// Connect to that peer
const result = await uut.connectToPeer(peerId, thisNode)
assert.equal(result, false)
})
it('should catch and throw errors', async () => {
try {
await uut.connectToPeer()
assert.fail('Unexpected code path')
} catch (err) {
// console.log(err)
assert.include(err.message, 'Cannot read')
}
})
})
})