Files
bower/test/cache-clean.js
2013-02-24 12:17:29 +00:00

185 lines
4.9 KiB
JavaScript

/*jshint plusplus:false*/
var glob = require('glob');
var assert = require('assert');
var rimraf = require('rimraf');
var path = require('path');
var fs = require('fs');
var mkdirp = require('mkdirp');
var config = require('../lib/core/config');
var cacheClean = require('../lib/commands/cache-clean');
describe('cache-clean', function () {
function clean(done) {
var del = 0;
rimraf(config.cache, function (err) {
if (err) return done(new Error('Unable to remove cache directory'));
if (++del >= 3) createDirs(done);
});
rimraf(config.links, function (err) {
if (err) return done(new Error('Unable to remove links directory'));
if (++del >= 3) createDirs(done);
});
rimraf(__dirname + '/temp', function (err) {
if (err) return done(new Error('Unable to remove temp directory'));
if (++del >= 3) createDirs(done);
});
}
beforeEach(function (done) {
clean(function (err) {
if (err) return done(err);
fs.mkdirSync(__dirname + '/temp');
done();
});
});
after(clean);
function createDirs(done) {
mkdirp(config.cache, function (err) {
if (err) return done(new Error('Unable to create cache directory'));
mkdirp(config.links, function (err) {
if (err) return done(new Error('Unable to create links directory'));
done();
});
});
}
function simulatePackage(name) {
// Create some stuff in the cache to simulate
var dir = path.join(config.cache, name);
var someDir = path.join(dir, 'some-dir');
fs.mkdirSync(dir);
fs.mkdirSync(someDir);
fs.writeFileSync(path.join(dir, 'some-file'), 'bower is awesome');
fs.writeFileSync(path.join(someDir, 'some-other-file'), 'bower is fantastic');
}
function simulateLink(name, linkedPath) {
var dir = path.join(config.links, name);
fs.mkdirSync(linkedPath);
fs.symlinkSync(linkedPath, dir);
}
it('Should emit end event', function (next) {
simulatePackage('some-package');
var cleaner = cacheClean();
cleaner
.on('error', function (err) {
throw err;
})
.on('end', function () {
next();
});
});
it('Should clean the entire cache', function (next) {
simulatePackage('some-package');
simulatePackage('other-package');
simulateLink('linked-package', __dirname + '/temp/linked-package');
fs.rmdirSync(__dirname + '/temp/linked-package'); // simulate invalid symlinks
simulateLink('linked-package2', __dirname + '/temp/linked-package2');
var cleaner = cacheClean();
cleaner.on('error', function (err) {
throw err;
});
cleaner.on('end', function () {
glob(config.cache + '/*', function (err, dirs) {
if (err) throw err;
assert(dirs.length === 0);
glob(config.links + '/*', function (err, dirs) {
if (err) throw err;
dirs = dirs.map(function (dir) {
return path.basename(dir);
});
assert(dirs.length === 1);
assert.deepEqual(dirs, ['linked-package2']);
next();
});
});
});
});
it('Should clean only the selected packages', function (next) {
simulatePackage('foo-package');
simulatePackage('bar-package');
simulatePackage('baz-package');
var cleaner = cacheClean(['foo-package', 'bar-package']);
cleaner.on('error', function (err) {
throw err;
});
cleaner.on('end', function () {
glob(config.cache + '/*', function (err, dirs) {
if (err) throw err;
dirs = dirs.map(function (dir) {
return path.basename(dir);
});
assert.deepEqual(dirs, ['baz-package']);
next();
});
});
});
it('Should clean only the selected links', function (next) {
simulateLink('linked-package', __dirname + '/temp/linked-package');
fs.rmdirSync(__dirname + '/temp/linked-package'); // simulate invalid symlinks
simulateLink('linked-package2', __dirname + '/temp/linked-package2');
fs.rmdirSync(__dirname + '/temp/linked-package2'); // simulate invalid symlinks
var cleaner = cacheClean(['linked-package']);
cleaner.on('error', function (err) {
throw err;
});
cleaner.on('end', function () {
glob(config.links + '/*', function (err, dirs) {
if (err) throw err;
dirs = dirs.map(function (dir) {
return path.basename(dir);
});
assert.deepEqual(dirs, ['linked-package2']);
next();
});
});
});
it('Should handle passing duplicate package names', function (next) {
simulatePackage('foo-package');
simulatePackage('bar-package');
var cleaner = cacheClean(['foo-package', 'foo-package', 'bar-package']);
cleaner.on('error', function (err) {
throw err;
});
cleaner.on('end', function () {
glob(config.cache + '/*', function (err, dirs) {
if (err) throw err;
assert(dirs.length === 0);
next();
});
});
});
});