mlpm
Version:
the client for mlpm, a MarkLogic package manager
511 lines (418 loc) • 13.7 kB
JavaScript
/* eslint-env mocha */
var expect = require('chai').expect
var sinon = require('sinon')
var mockery = require('mockery')
var vinylFs = require('vinyl-fs')
var actualToposort = require('toposort')
var actualUtil = require('../../lib/util.js')
// var actualFs = require('fs')
var sandbox = sinon.sandbox.create()
var git = {
add: sandbox.stub(),
commit: sandbox.stub(),
exec: sandbox.stub(),
revParse: sandbox.stub(),
status: sandbox.stub(),
tag: sandbox.stub()
}
var fs = {
readFile: sandbox.stub(),
stat: sandbox.stub()
}
var util = {
readJson: sandbox.stub(),
writeJson: sandbox.stub(),
formatJson: sandbox.spy(actualUtil, 'formatJson')
}
var vfs = { src: sandbox.stub() }
var toposort = sandbox.stub() // sinon.spy(require('toposort'))
var project
describe('lib/project', function() {
before(function() {
mockery.enable()
})
beforeEach(function() {
mockery.registerMock('gulp-git', git)
mockery.registerMock('vinyl-fs', vfs)
mockery.registerMock('fs', fs)
mockery.registerMock('toposort', toposort)
mockery.registerMock('./util.js', util)
mockery.warnOnUnregistered(false)
// mockery.registerAllowables([
// 'lodash',
// 'jszip',
// 'concat-stream',
// 'async',
// 'lodash',
// 'path',
// 'slash'
// ])
mockery.registerAllowable('../../lib/project.js', true)
project = require('../../lib/project.js')
})
afterEach(function() {
sandbox.reset()
mockery.deregisterAll()
})
after(function() {
mockery.disable()
})
it('should exist', function() {
expect(project).to.not.be.undefined
expect(Object.keys(project).length).to.be.ok
})
it('should get config', function() {
project.getConfig(null)
expect(util.readJson.calledOnce).to.be.true
var args = util.readJson.args[0]
expect(args[0]).to.equal('mlpm.json')
})
it('should save config', function() {
var data = { prop: 'val' }
project.saveConfig(data, null)
expect(util.writeJson.calledOnce).to.be.true
var args = util.writeJson.args[0]
expect(args[0]).to.equal('mlpm.json')
expect(args[1]).to.equal(data)
})
it('should invoke getRepository callback on error', function(done) {
git.exec.yieldsAsync(new Error('bad repo'))
project.getRepository(function(err, repo) {
expect(err).to.match(/bad repo/)
done()
})
})
it('should get repository URL', function(done) {
git.exec.onCall(0).yieldsAsync(null, 'git@github.com:joemfb/mlpm.git')
git.exec.onCall(1).yieldsAsync(null, 'git@bitbucket.com:user/repo.git')
project.getRepository(function(err, repo) {
expect(repo).to.equal('https://github.com/joemfb/mlpm.git')
project.getRepository(function(err, repo) {
expect(repo).to.equal('git@bitbucket.com:user/repo.git')
done()
})
})
})
it('should get HEAD commit', function(done) {
git.revParse.yieldsAsync(null, 'ef21b08e714320edd49d1104b0b14c6771517b62')
project.getHeadCommit(function(err, commit) {
if (err) return done(err)
expect(commit).to.equal('ef21b08e714320edd49d1104b0b14c6771517b62')
done()
})
})
it('should invoke getRepoStatus callback on error', function(done) {
git.status.yieldsAsync(new Error('bad repo'))
project.getRepoStatus(function(err, repo) {
expect(err).to.match(/bad repo/)
done()
})
})
it('should get repo status', function(done) {
git.status.yieldsAsync(null, [' M package.json', '?? tmp.js'].join('\n'))
project.getRepoStatus(function(err, changes) {
if (err) return done(err)
expect(changes.length).to.be.ok
expect(changes[0]).to.equal('M package.json')
done()
})
})
// ick
// need to figure out how to pipe a tream through the gulp git mock
// it('should commit config', function(done) {
// var stream = new require('stream')
// var Readable = require('stream').Readable
// var rs1 = new Readable
// var rs2 = new Readable
// rs1.push(null)
// rs2.push(null)
// vfs.src.returns( vinylFs.src('./test/fixtures/mlpm.json') )
// git.add.returns(rs1)
// git.commit.returns(rs2)
// // vfs.src('./test/fixtures/mlpm.json')
// // .on('data', function(){
// // console.log(arguments)
// // done()
// // })
// project.commitConfig(function(err) {
// if (err) return done(err)
// expect(git.add.calledOnce).to.be.true
// var args = git.add.args
// console.log(args)
// expect(git.commit.calledOnce).to.be.true
// args = git.commit.args
// console.log(args)
// done()
// })
// })
it('should tag repo', function() {
project.tagRepo('v1.0.0')
expect(git.tag.calledOnce).to.be.true
var args = git.tag.args[0]
expect(args[0]).to.equal('v1.0.0')
expect(args[1]).to.equal('v1.0.0')
})
it('should tag repo with a correct version', function() {
project.tagRepo('1.0.0')
expect(git.tag.calledOnce).to.be.true
var args = git.tag.args[0]
expect(args[0]).to.equal('v1.0.0')
expect(args[1]).to.equal('v1.0.0')
})
it('should get default project config', function(done) {
project.getDefaultConfig(null, function(err, config) {
expect(config.name).to.equal('mlpm')
expect(config.repository).to.equal('https://github.com/joemfb/mlpm.git')
expect(config.version).to.equal('1.0.0')
done()
})
})
it('should return existing project config', function(done) {
var pkgConfig = {
name: 'blah',
repository: 'example.com',
version: '2.1.3',
description: 'my-awesome-project',
prop: 'val'
}
project.getDefaultConfig(pkgConfig, function(err, config) {
expect(config.name).to.equal('blah')
expect(config.repository).to.equal('example.com')
expect(config.version).to.equal('2.1.3')
expect(config.description).to.equal('my-awesome-project')
expect(config.prop).to.be.undefined
done()
})
})
it('should save dependency info', function() {
var pkgConfig = {
name: 'blah',
repository: 'example.com',
version: '2.1.3',
description: 'my-awesome-project'
}
project.saveDependency(pkgConfig, 'foo', '~1.1.0', null)
expect(util.writeJson.calledOnce).to.be.true
var args = util.writeJson.args[0]
expect(args[1].dependencies).to.not.be.undefined
expect(args[1].dependencies.foo).to.equal('~1.1.0')
util.writeJson.reset()
project.saveDependency(pkgConfig, 'foo', '1.1.3', null)
expect(util.writeJson.calledOnce).to.be.true
args = util.writeJson.args[0]
expect(args[1].dependencies).to.not.be.undefined
expect(args[1].dependencies.foo).to.equal('1.1.*')
})
it('should delete dependency info', function() {
var pkgConfig = {
name: 'blah',
repository: 'example.com',
version: '2.1.3',
description: 'my-awesome-project',
dependencies: { foo: '~1.1.0' }
}
project.deleteDependency(pkgConfig, 'foo', null)
expect(util.writeJson.calledOnce).to.be.true
var args = util.writeJson.args[0]
expect(args[1].dependencies).to.not.be.undefined
expect(args[1].dependencies.foo).to.be.undefined
})
it('should sort packages', function() {
var packages = [
{
name: 'bar',
repository: 'example.com',
version: '1.1.2',
description: 'my-awesome-project',
dependencies: { foo: '~3.2.0' }
},
{
name: 'blah',
repository: 'example.com',
version: '2.1.3',
description: 'my-awesome-project'
},
{
name: 'foo',
repository: 'example.com',
version: '3.2.4',
description: 'my-awesome-project',
dependencies: { blah: '~2.1.0' }
}
]
toposort.returns(['blah', 'bar', 'foo'])
var result = project.sortPackages(packages)
expect(toposort.calledOnce).to.be.true
expect(result[0].name).to.equal('blah')
expect(result[1].name).to.equal('bar')
expect(result[2].name).to.equal('foo')
})
it('should get packages config', function(done) {
vfs.src.returns( vinylFs.src('./test/fixtures/**/mlpm.json') )
// need to actually sort
toposort = sinon.spy(actualToposort)
project.getPackages(function(err, packages) {
if (err) return done(err)
expect(packages).not.to.be.undefined
expect(packages.length).to.equal(2)
expect(packages[0].name).to.equal('cts-extensions')
expect(packages[1].name).to.equal('group-by')
toposort = sandbox.stub()
done()
})
})
it('should get ignore globs', function(done) {
fs.readFile.onCall(0).yieldsAsync(null, 'foo')
fs.readFile.onCall(1).yieldsAsync(null, 'bar')
project.getIgnoreGlobs(function(err, globs) {
expect(globs[0]).to.equal('!mlpm.json')
expect(globs[globs.length - 1]).to.equal('!bar')
expect(globs[globs.length - 2]).to.equal('!foo')
expect(globs[globs.length - 3]).to.equal('!src/xray')
done()
})
})
it('should get ignore globs if files doen\'t exist', function(done) {
fs.readFile.onCall(0).yieldsAsync(new Error('error1'))
fs.readFile.onCall(1).yieldsAsync(new Error('error2'))
project.getIgnoreGlobs(function(err, globs) {
expect(globs[0]).to.equal('!mlpm.json')
expect(globs[globs.length - 1]).to.equal('!src/xray')
done()
})
})
it('should get globs', function(done) {
var pkgConfig = {
name: 'blah',
repository: 'example.com',
version: '2.1.3',
description: 'my-awesome-project'
}
project.getGlobs(pkgConfig, function(err, globs) {
expect(globs[0]).to.equal('*')
expect(globs[globs.length - 1]).to.equal('!src/xray')
done()
})
})
it('should get globs from pkgConfig files array', function(done) {
var pkgConfig = {
name: 'blah',
repository: 'example.com',
version: '2.1.3',
description: 'my-awesome-project',
files: [
'src/foo.sjs',
'src/lib'
]
}
var stub = sandbox.stub()
fs.stat.yieldsAsync(null, { isDirectory: stub })
stub.onCall(0).returns(false)
stub.onCall(1).returns(true)
project.getGlobs(pkgConfig, function(err, globs) {
expect(globs[4]).to.equal('src/foo.sjs')
expect(globs[5]).to.equal('src/lib/**/*')
done()
})
})
it('should invoke getGlobs callback on error', function(done) {
var pkgConfig = {
name: 'blah',
repository: 'example.com',
version: '2.1.3',
description: 'my-awesome-project',
files: [
'src/foo.sjs',
'zzz/q'
]
}
var stub = sandbox.stub().returns(false)
fs.stat.onCall(0).yieldsAsync(null, { isDirectory: stub })
fs.stat.onCall(1).yieldsAsync(new Error('bad'))
project.getGlobs(pkgConfig, function(err, globs) {
expect(err).to.match(/bad/)
done()
})
})
it('should get files', function(done) {
var pkgConfig = {
name: 'blah',
repository: 'example.com',
version: '2.1.3',
description: 'my-awesome-project'
}
vfs.src.returns( vinylFs.src('test/fixtures/files/*') )
project.getFiles(pkgConfig, function(err, files) {
expect(vfs.src.calledOnce).to.be.true
expect(files.length).to.equal(2)
expect(files[0].stat.isFile()).to.be.true
expect(files[1].stat.isFile()).to.be.true
done()
})
})
it('should invoke getFiles callback with error', function(done) {
var pkgConfig = {
name: 'blah',
repository: 'example.com',
version: '2.1.3',
description: 'my-awesome-project',
files: [
'src/foo.sjs',
'zzz/q'
]
}
vfs.src.returns( vinylFs.src('test/fixtures/files/*') )
fs.stat = sandbox.stub().yieldsAsync(new Error('bad'))
project.getFiles(pkgConfig, false, function(err, files) {
expect(err).to.match(/bad/)
done()
})
})
it('should create zip', function(done) {
var pkgConfig = {
name: 'blah',
repository: 'example.com',
version: '2.1.3',
description: 'my-awesome-project'
}
vfs.src.returns( vinylFs.src('test/fixtures/files/*') )
project.createZip(pkgConfig, function(err, zip) {
expect(vfs.src.calledOnce).to.be.true
expect( Object.keys(zip.files).length ).to.equal(3)
expect(zip.files['mlpm.json']).not.to.be.undefined
expect(JSON.parse(zip.file('mlpm.json').asText()).gitHead).not.to.be.undefined
expect(zip.files['test/fixtures/files/test.sjs']).not.to.be.undefined
expect(zip.files['test/fixtures/files/test.xqy']).not.to.be.undefined
done()
})
})
it('should invoke createZip callback with getFiles error', function(done) {
var pkgConfig = {
name: 'blah',
repository: 'example.com',
version: '2.1.3',
description: 'my-awesome-project',
files: [ 'mlpm.json' ]
}
fs.stat = sandbox.stub().yieldsAsync(new Error('bad files'))
project.createZip(pkgConfig, function(err, zip) {
expect(err).to.match(/bad files/)
done()
})
})
it('should skip gitHead in createZip on getHeadCommit error', function(done) {
var pkgConfig = {
name: 'blah',
repository: 'example.com',
version: '2.1.3',
description: 'my-awesome-project'
}
git.revParse.yieldsAsync(new Error('bad repo'))
project.createZip(pkgConfig, function(err, zip) {
expect(vfs.src.calledOnce).to.be.true
expect(JSON.parse(zip.file('mlpm.json').asText()).gitHead).to.be.undefined
done()
})
})
})