diff --git a/test/commands/version.js b/test/commands/version.js index 64b30acc5..1c4e8c299 100644 --- a/test/commands/version.js +++ b/test/commands/version.js @@ -3,87 +3,103 @@ var expect = require('expect.js'); var helpers = require('../helpers'); var version = helpers.require('lib/commands').version; -describe('bower list', function () { +describe('bower version', function () { var mainPackage = new helpers.TempDir({ - 'bower.json': { - name: 'foobar', - version: '0.0.0' - } - }); - - var gitPackage = new helpers.TempDir({ 'v0.0.0': { 'bower.json': { name: 'foobar', - version: '0.0.0' } } }); + var packageWithoutTags = new helpers.TempDir({}); + + it('bumps patch version', function() { - mainPackage.prepare(); + mainPackage.prepareGit(); return helpers.run(version, ['patch', {}, { cwd: mainPackage.path }]).then(function() { - expect(mainPackage.readJson('bower.json').version).to.be('0.0.1'); + expect(mainPackage.latestGitTag()).to.be('0.0.1'); }); }); it('bumps minor version', function() { - mainPackage.prepare(); + mainPackage.prepareGit(); return helpers.run(version, ['minor', {}, { cwd: mainPackage.path }]).then(function() { - expect(mainPackage.readJson('bower.json').version).to.be('0.1.0'); + expect(mainPackage.latestGitTag()).to.be('0.1.0'); }); }); it('bumps major version', function() { - mainPackage.prepare(); + mainPackage.prepareGit(); return helpers.run(version, ['major', {}, { cwd: mainPackage.path }]).then(function() { - expect(mainPackage.readJson('bower.json').version).to.be('1.0.0'); + expect(mainPackage.latestGitTag()).to.be('1.0.0'); }); }); it('changes version', function() { - mainPackage.prepare(); + mainPackage.prepareGit(); return helpers.run(version, ['1.2.3', {}, { cwd: mainPackage.path }]).then(function() { - expect(mainPackage.readJson('bower.json').version).to.be('1.2.3'); + expect(mainPackage.latestGitTag()).to.be('1.2.3'); }); }); it('returns the new version', function() { - mainPackage.prepare(); + mainPackage.prepareGit(); return helpers.run(version, ['major', {}, { cwd: mainPackage.path }]).then(function(results) { expect(results[0]).to.be('1.0.0'); }); }); - it('bumps patch version, create commit, and tag', function() { - gitPackage.prepareGit(); - - return helpers.run(version, ['patch', {}, { cwd: gitPackage.path }]).then(function() { - expect(gitPackage.readJson('bower.json').version).to.be('0.0.1'); + it('fails on a dirty git repository', function() { + mainPackage.prepareGit(); + mainPackage.create({ + 'dirty.txt': 'This file has not been committed' + }); - var tags = gitPackage.git('tag'); - expect(tags).to.be('v0.0.0\nv0.0.1\n'); - var message = gitPackage.git('log', '--pretty=format:%s', '-n1'); - expect(message).to.be('v0.0.1'); + helpers.run(version, ['patch', {}, { cwd: mainPackage.path }]).then(null, function(err) { + expect(err).to.be.an(Error); + expect(err.code).to.be('ENOTGITREPOSITORY'); }); }); it('bumps with custom commit message', function() { - gitPackage.prepareGit(); + mainPackage.prepareGit(); - return helpers.run(version, ['patch', { message: 'Bumping %s, because what'}, { cwd: gitPackage.path }]).then(function() { - expect(gitPackage.readJson('bower.json').version).to.be('0.0.1'); - - var tags = gitPackage.git('tag'); + return helpers.run(version, ['patch', { message: 'Bumping %s, because what'}, { cwd: mainPackage.path }]).then(function() { + var tags = mainPackage.git('tag'); expect(tags).to.be('v0.0.0\nv0.0.1\n'); - var message = gitPackage.git('log', '--pretty=format:%s', '-n1'); + var message = mainPackage.git('log', '--pretty=format:%s', '-n1'); expect(message).to.be('Bumping 0.0.1, because what'); }); }); + + it('creates commit and tags', function() { + mainPackage.prepareGit(); + + return helpers.run(version, ['patch', {}, { cwd: mainPackage.path }]).then(function() { + var tags = mainPackage.git('tag'); + expect(tags).to.be('v0.0.0\nv0.0.1\n'); + var message = mainPackage.git('log', '--pretty=format:%s', '-n1'); + expect(message).to.be('v0.0.1'); + }); + }); + + it('assumes v0.0.0 when no tags exist', function() { + packageWithoutTags.prepareGit(); + packageWithoutTags.create({ + 'index.js': 'console.log("hello, world");' + }); + packageWithoutTags.git('add', '-A'); + packageWithoutTags.git('commit', '-m"commit"'); + + return helpers.run(version, ['major', {}, { cwd: packageWithoutTags.path }]).then(function() { + expect(packageWithoutTags.latestGitTag()).to.be('1.0.0'); + }); + }); }); diff --git a/test/helpers.js b/test/helpers.js index 70c3dd6b3..da18154d1 100644 --- a/test/helpers.js +++ b/test/helpers.js @@ -14,6 +14,7 @@ var proxyquire = require('proxyquire').noCallThru().noPreserveCache(); var spawnSync = require('spawn-sync'); var config = require('../lib/config'); var nock = require('nock'); +var semver = require('semver'); // For better promise errors Q.longStackSupport = true; @@ -155,6 +156,20 @@ exports.TempDir = (function() { } }; + TempDir.prototype.latestGitTag = function () { + var versions = this.git('tag') + .split(/\r?\n/) + .map(function(t) { return t.slice(1); }) + .filter(semver.valid) + .sort(semver.compare); + + if (versions.length >= 1) { + return versions[versions.length - 1]; + } else { + throw new Error('No valid git version tags found.'); + } + }; + TempDir.prototype.exists = function (name) { return fs.existsSync(path.join(this.path, name)); };