mlpm
Version:
the client for mlpm, a MarkLogic package manager
236 lines (197 loc) • 7.24 kB
JavaScript
/* eslint-env mocha */
var expect = require('chai').expect
var sinon = require('sinon')
var mockery = require('mockery')
var sandbox = sinon.sandbox.create()
var fs = { writeFile: sandbox.stub().yieldsAsync(null) }
var api = { publish: sandbox.stub().yieldsAsync(null, null) }
var util = {
getAuth: sandbox.stub().yieldsAsync(null, { token: 'token' })
}
var zipGen = sandbox.stub()
var project = {
createZip: sandbox.stub().yieldsAsync(null, { generate: zipGen }),
getConfig: sandbox.stub().yieldsAsync(null, { name: 'foo', version: '1' }),
getFiles: sandbox.stub().yieldsAsync(null, [{ path: 'mlpm.json' }])
}
var hash = {
sha256: sandbox.stub().returnsThis(),
update: sandbox.stub().returnsThis(),
digest: sandbox.stub()
}
var log = {
error: sandbox.stub(),
info: sandbox.stub()
}
var publish
describe('commands/publish', function() {
before(function() {
mockery.enable({ useCleanCache: true })
})
beforeEach(function() {
mockery.registerMock('winston', log)
mockery.registerMock('fs', fs)
mockery.registerMock('hash.js', hash)
mockery.registerMock('../project.js', project)
mockery.registerMock('../api.js', api)
mockery.registerMock('../util.js', util)
mockery.registerAllowable('lodash')
mockery.registerAllowable('../../../lib/commands/publish.js', true)
publish = require('../../../lib/commands/publish.js').command
})
afterEach(function() {
sandbox.reset()
mockery.deregisterAll()
})
after(function() {
mockery.disable()
})
it('should exist', function() {
expect(publish).to.not.be.undefined
expect(publish.usage).to.not.be.undefined
expect(Object.keys(publish).length).to.be.ok
})
it('should handle getAuth error', function(done) {
util.getAuth.yieldsAsync(new Error('no auth'))
publish({})
setTimeout(function() {
expect(util.getAuth.calledOnce).to.be.true
sinon.assert.calledOnce(log.error)
expect(log.error.args[0][0]).to.match(/no auth/)
done()
}, 1)
})
it('should handle getConfig error', function(done) {
util.getAuth.yieldsAsync(null, { token: 'token' })
project.getConfig.yieldsAsync(new Error('no config'))
publish({})
setTimeout(function() {
expect(util.getAuth.calledOnce).to.be.true
expect(project.getConfig.calledOnce).to.be.true
sinon.assert.calledOnce(log.error)
expect(log.error.args[0][0]).to.match(/no config/)
done()
}, 1)
})
it('should not publish private package', function(done) {
util.getAuth.yieldsAsync(null, { token: 'token' })
project.getConfig.yieldsAsync(null, { name: 'foo', version: '1', private: true })
publish({})
setTimeout(function() {
expect(util.getAuth.calledOnce).to.be.true
expect(project.getConfig.calledOnce).to.be.true
sinon.assert.calledOnce(log.info)
expect(log.info.args[0][0]).to.equal('private; can\'t publish')
done()
}, 1)
})
it('should handle createZip error', function(done) {
util.getAuth.yieldsAsync(null, { token: 'token' })
project.getConfig.yieldsAsync(null, { name: 'foo', version: '1' })
project.createZip.yieldsAsync(new Error('bad zip'))
publish({})
setTimeout(function() {
expect(util.getAuth.calledOnce).to.be.true
expect(project.getConfig.calledOnce).to.be.true
expect(project.createZip.calledOnce).to.be.true
sinon.assert.calledOnce(log.error)
expect(log.error.args[0][0]).to.match(/bad zip/)
done()
}, 1)
})
it('should handle api.publish error', function(done) {
util.getAuth.yieldsAsync(null, { token: 'token' })
project.getConfig.yieldsAsync(null, { name: 'foo', version: '1' })
project.createZip.yieldsAsync(null, { generate: zipGen })
api.publish.yieldsAsync(new Error('bad request'))
publish({})
setTimeout(function() {
expect(util.getAuth.calledOnce).to.be.true
expect(project.getConfig.calledOnce).to.be.true
expect(project.createZip.calledOnce).to.be.true
expect(zipGen.calledOnce).to.be.true
expect(api.publish.calledOnce).to.be.true
sinon.assert.calledOnce(log.error)
expect(log.error.args[0][0]).to.match(/bad request/)
done()
}, 1)
})
it('should publish project', function(done) {
util.getAuth.yieldsAsync(null, { token: 'token' })
project.getConfig.yieldsAsync(null, { name: 'foo', version: '1' })
project.createZip.yieldsAsync(null, { generate: zipGen })
api.publish.yieldsAsync(null)
publish({})
setTimeout(function() {
expect(util.getAuth.calledOnce).to.be.true
expect(project.getConfig.calledOnce).to.be.true
expect(project.createZip.calledOnce).to.be.true
expect(zipGen.calledOnce).to.be.true
expect(api.publish.calledOnce).to.be.true
sinon.assert.calledOnce(log.info)
expect(log.info.args[0][0]).to.equal('published foo@1')
done()
}, 1)
})
it('should handle error saving local export', function(done) {
fs.writeFile.yieldsAsync(new Error('no disk'))
publish({ export: true })
setTimeout(function() {
expect(util.getAuth.calledOnce).to.be.true
expect(project.getConfig.calledOnce).to.be.true
expect(project.createZip.calledOnce).to.be.true
expect(zipGen.calledOnce).to.be.true
expect(fs.writeFile.calledOnce).to.be.true
sinon.assert.calledOnce(log.error)
expect(log.error.args[0][0]).to.match(/no disk/)
done()
}, 1)
})
it('should do a local export', function(done) {
fs.writeFile.yieldsAsync(null)
publish({ export: true })
setTimeout(function() {
expect(util.getAuth.calledOnce).to.be.true
expect(project.getConfig.calledOnce).to.be.true
expect(project.createZip.calledOnce).to.be.true
expect(zipGen.calledOnce).to.be.true
expect(fs.writeFile.calledOnce).to.be.true
done()
}, 1)
})
it('should handle getConfig err in a dry-run', function(done) {
project.getConfig.yieldsAsync(new Error('no config'))
publish({ dryrun: true })
setTimeout(function() {
expect(project.getConfig.calledOnce).to.be.true
sinon.assert.calledOnce(log.error)
expect(log.error.args[0][0]).to.match(/no config/)
done()
}, 1)
})
it('should handle getFiles err in a dry-run', function(done) {
project.getConfig.yieldsAsync(null, { name: 'foo', version: '1' })
project.getFiles.yieldsAsync(new Error('no files'))
publish({ dryrun: true })
setTimeout(function() {
expect(project.getConfig.calledOnce).to.be.true
expect(project.getFiles.calledOnce).to.be.true
sinon.assert.calledOnce(log.error)
expect(log.error.args[0][0]).to.match(/no files/)
done()
}, 1)
})
it('should do a publish dry-run', function(done) {
project.getFiles.yieldsAsync(null, [{ path: 'mlpm.json' }])
publish({ dryrun: true })
setTimeout(function() {
expect(project.getConfig.calledOnce).to.be.true
expect(project.getFiles.calledOnce).to.be.true
sinon.assert.calledTwice(log.info)
expect(log.info.args[0][0]).to.equal('foo@1')
expect(log.info.args[1][0]).to.equal('mlpm.json')
done()
}, 1)
})
})