happypack
Version:
webpack speed booster, makes you happy!
183 lines (142 loc) • 4.24 kB
JavaScript
var path = require('path');
var fs = require('fs-extra');
var sinon = require('sinon');
var chai = require('chai');
var HappyPlugin = require('./HappyPlugin');
var HappyRPCHandler = require('./HappyRPCHandler');
var TEMP_DIR = path.resolve(__dirname, '../.happypack__test');
var TestUtils = exports;
var sandbox;
var cleanups = [];
sinon.assert.expose(chai.assert, { prefix: "" });
beforeEach(function() {
sandbox = sinon.sandbox.create();
fs.ensureDirSync(TEMP_DIR);
fs.emptyDirSync(TEMP_DIR);
});
afterEach(function() {
cleanups.forEach(function(callback) {
callback();
});
cleanups = [];
fs.removeSync(TEMP_DIR);
sandbox.restore();
});
exports.HAPPY_LOADER_PATH = path.resolve(__dirname, 'HappyLoader.js');
exports.assert = chai.assert;
exports.fixturePath = function(fileName) {
return path.resolve(__dirname, '__tests__', 'fixtures', fileName);
};
exports.tempPath = function(fileName) {
return path.resolve(TEMP_DIR, interpolateGUID(fileName));
};
exports.tempDir = function(dirName) {
if (dirName.length === 0) {
return TEMP_DIR;
}
var dirPath = exports.tempPath(dirName);
fs.ensureDirSync(dirPath);
return dirPath;
};
exports.fixture = function(fileName) {
return fs.readFileSync(exports.fixturePath(fileName), 'utf-8');
};
exports.createLoader = function(impl, query) {
return exports.createLoaderFromString('module.exports = ' + impl.toString(), query);
};
exports.createLoaderFromString = function(string, query) {
var loaderName = interpolateGUID('temp_loader__[guid]');
var filePath = exports.tempPath(loaderName + '-loader.js');
fs.writeFileSync(filePath, string, 'utf-8');
return { _name: loaderName, path: filePath, query: query };
};
exports.createFile = function(fileName, contents) {
var filePath = exports.tempPath(fileName);
fs.ensureDirSync(path.dirname(filePath));
fs.writeFileSync(filePath, contents, 'utf-8');
return {
getPath: function() {
return filePath;
},
getContents: function() {
return contents;
}
}
};
exports.clearCache = function() {
fs.removeSync('.happypack');
};
exports.IntegrationSuite = function(mochaSuite) {
mochaSuite.timeout(process.env.HAPPY_TEST_TIMEOUT ?
parseInt(process.env.HAPPY_TEST_TIMEOUT, 10) :
2000
);
mochaSuite.beforeEach(function() {
HappyPlugin.resetUID();
});
mochaSuite.afterEach(function() {
HappyPlugin.resetUID();
TestUtils.clearCache();
});
};
exports.getWebpackOutputBundlePath = function(rawStats, name) {
return path.join(rawStats.compilation.outputOptions.path, name || 'bundle.js');
};
// Listen for HappyLoader instances registering themselves to HappyRPCHandler,
// grab that instance, and yield it so that you can install your spies and such.
//
// @return {Function}
// Returns the latest active loader instance, if any.
exports.spyOnActiveLoader = function(fn) {
var registerActiveLoader = HappyRPCHandler.registerActiveLoader;
var happyLoader;
sandbox.stub(HappyRPCHandler, 'registerActiveLoader', function(id, loader) {
happyLoader = loader;
if (fn) {
fn(happyLoader);
}
return registerActiveLoader.apply(HappyRPCHandler, arguments);
});
Object.defineProperty(TestUtils, 'activeLoader', {
configurable: true,
enumerable: false,
get: function() {
return happyLoader;
}
});
cleanups.push(function() {
happyLoader = null;
});
return function() { return happyLoader; };
};
exports.assertNoWebpackErrors = function(err, rawStats, done) {
if (err) {
done(err);
return true;
}
var stats = rawStats.toJson();
if (stats.errors.length) {
done(stats.errors);
return true;
}
if (stats.warnings.length) {
done(stats.warnings);
return true;
}
};
exports.getSinonSandbox = function() {
return sandbox;
};
function interpolateGUID(string) {
return string.replace('[guid]', guid());
}
// courtesy of http://stackoverflow.com/questions/105034/create-guid-uuid-in-javascript
function guid() {
function s4() {
return Math.floor((1 + Math.random()) * 0x10000)
.toString(16)
.substring(1);
}
return s4() + s4() + '-' + s4() + '-' + s4() + '-' +
s4() + '-' + s4() + s4() + s4();
}