/* eslint-env mocha */
'use strict'

const chai = require('chai')
chai.use(require('dirty-chai'))
const expect = chai.expect
const series = require('async/series')
const createNode = require('./utils/create-node')
const sinon = require('sinon')

describe('libp2p creation', () => {
  it('should be able to start and stop successfully', (done) => {
    createNode([], {
      config: {
        EXPERIMENTAL: {
          dht: true,
          pubsub: true
        }
      }
    }, (err, node) => {
      expect(err).to.not.exist()

      let sw = node._switch
      let cm = node.connectionManager
      let dht = node._dht
      let pub = node._floodSub

      sinon.spy(sw, 'start')
      sinon.spy(cm, 'start')
      sinon.spy(dht, 'start')
      sinon.spy(pub, 'start')
      sinon.spy(sw, 'stop')
      sinon.spy(cm, 'stop')
      sinon.spy(dht, 'stop')
      sinon.spy(pub, 'stop')
      sinon.spy(node, 'emit')

      series([
        (cb) => node.start(cb),
        (cb) => {
          expect(sw.start.calledOnce).to.equal(true)
          expect(cm.start.calledOnce).to.equal(true)
          expect(dht.start.calledOnce).to.equal(true)
          expect(pub.start.calledOnce).to.equal(true)
          expect(node.emit.calledWith('start')).to.equal(true)

          cb()
        },
        (cb) => node.stop(cb)
      ], (err) => {
        expect(err).to.not.exist()

        expect(sw.stop.calledOnce).to.equal(true)
        expect(cm.stop.calledOnce).to.equal(true)
        expect(dht.stop.calledOnce).to.equal(true)
        expect(pub.stop.calledOnce).to.equal(true)
        expect(node.emit.calledWith('stop')).to.equal(true)

        done()
      })
    })
  })

  it('should not create disabled modules', (done) => {
    createNode([], {
      config: {
        EXPERIMENTAL: {
          dht: false,
          pubsub: false
        }
      }
    }, (err, node) => {
      expect(err).to.not.exist()
      expect(node._dht).to.not.exist()
      expect(node._floodSub).to.not.exist()
      done()
    })
  })
})
