twolfson-style
Version:
Lint and style configurations for @twolfson
147 lines (125 loc) • 4.71 kB
JavaScript
// Load in dependencies
var assert = require('assert');
var fs = require('fs');
var exec = require('child_process').exec;
var quote = require('shell-quote').quote;
var tmp = require('tmp');
// Define test utilities
var testUtils = {
moveToTmpDir: function () {
// Create a temporary directory
before(function createTmpFn (done) {
var that = this;
tmp.dir(function handleTmpDir (err, dirpath) {
that.dirpath = dirpath;
done(err);
});
});
// Navigate to our new directory
before(function moveFn () {
this.oldDir = process.cwd();
process.chdir(this.dirpath);
});
// Move back and cleanup
after(function cleanup () {
process.chdir(this.oldDir);
delete this.dirpath;
delete this.oldDir;
});
},
exec: function (cmd, options) {
// Run exec and save results
before(function execFn (done) {
var that = this;
exec(cmd, options, function handleExec (err, stdout, stderr) {
that.err = err;
that.stdout = stdout;
that.stderr = stderr;
done();
});
});
// Clean up results
after(function cleanup () {
delete this.err;
delete this.stdout;
delete this.stderr;
});
}
};
// Start our tests
describe('twolfson-style', function () {
describe('installing into a directory', function () {
testUtils.moveToTmpDir();
testUtils.exec(quote(['node', __dirname + '/../bin/twolfson-style', 'install']));
it('has no errors', function () {
assert.strictEqual(this.err, null);
});
it('adds our .jscsrc file', function () {
var actualFile = fs.readFileSync(this.dirpath + '/.jscsrc', 'utf8');
var expectedFile = fs.readFileSync(__dirname + '/expected-files/node/.jscsrc', 'utf8');
assert.deepEqual(JSON.parse(actualFile), JSON.parse(expectedFile));
});
it('adds our .jshintrc file', function () {
var actualFile = fs.readFileSync(this.dirpath + '/.jshintrc', 'utf8');
var expectedFile = fs.readFileSync(__dirname + '/expected-files/node/.jshintrc', 'utf8');
assert.deepEqual(JSON.parse(actualFile), JSON.parse(expectedFile));
});
});
});
describe('twolfson-style', function () {
describe('prechecking a file with a critical issue', function () {
var filepath = __dirname + '/test-files/node/invalid-unused.js';
testUtils.exec(quote([__dirname + '/../bin/twolfson-style', 'precheck', filepath]));
it('has an error errors', function () {
assert.notEqual(this.err, null);
});
it('complains about the issue', function () {
var expectedError = require(filepath).expected;
assert(this.stdout.match(expectedError));
});
});
describe('prechecking a file with a stylistic issue', function () {
var filepath = __dirname + '/test-files/node/invalid-curly-braces.js';
testUtils.exec(quote([__dirname + '/../bin/twolfson-style', 'precheck', filepath]));
it('has no errors', function () {
assert.strictEqual(this.err, null);
});
});
});
describe('twolfson-style', function () {
describe('linting a file with a JSHint issue', function () {
var filepath = __dirname + '/test-files/node/invalid-unused.js';
testUtils.exec(quote([__dirname + '/../bin/twolfson-style', 'lint', filepath]));
it('has an error errors', function () {
assert.notEqual(this.err, null);
});
it('complains about the issue', function () {
var expectedError = require(filepath).expected;
assert(this.stdout.match(expectedError));
});
});
describe('linting a file with a JSCS issue', function () {
var filepath = __dirname + '/test-files/node/invalid-line-length.js';
testUtils.exec(quote([__dirname + '/../bin/twolfson-style', 'lint', filepath]));
it('complains about the issue', function () {
var expectedError = require(filepath).expected;
assert(this.stdout.match(expectedError));
});
});
describe('linting a file with no issues', function () {
var filepath = __dirname + '/test-files/node/valid-line-length.js';
testUtils.exec(quote([__dirname + '/../bin/twolfson-style', 'lint', filepath]));
it('has no errors', function () {
assert.strictEqual(this.err, null);
});
});
});
// Edge cases
// DEV: For sanity, verify that our critical JSON and `jshint.critical` always line up
describe('Our critical jshint config', function () {
it('is in sync with our source jshint config', function () {
var actualJson = require(__dirname + '/../lib/rc/jshintrc-critical.json');
var expectedJson = require(__dirname + '/../lib/rc/jshintrc.js').critical;
assert.deepEqual(actualJson, expectedJson);
});
});