Subtheme of barrio
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

464 lines
12 KiB

var pluginPath = '../src/index';
var scssLintPlugin = require(pluginPath);
var chai = require('chai');
var Vinyl = require('vinyl');
var PluginError = require('plugin-error');
var fs = require('fs');
var expect = chai.expect;
var proxyquire = require('proxyquire');
var sinon = require('sinon');
var getFixtureFile = function (path) {
return new Vinyl({
path: './test/fixtures/' + path,
cwd: './test/',
base: './test/fixtures/',
contents: fs.readFileSync('./test/fixtures/' + path)
});
}
describe('gulp-scss-lint', function() {
it('invalid scss file', function(done) {
var fakeFile = getFixtureFile('invalid.scss');
var stream = scssLintPlugin();
stream
.on('data', function (file) {
expect(file.scsslint.success).to.be.false;
expect(file.scsslint.issues).to.have.length(4);
expect(file.scsslint.warnings).to.equal(4);
expect(file.scsslint.errors).to.equal(0);
expect(file.scsslint.issues[0].line).to.exist;
expect(file.scsslint.issues[0].column).to.exist;
expect(file.scsslint.issues[0].length).to.exist;
expect(file.scsslint.issues[0].severity).to.exist;
expect(file.scsslint.issues[0].reason).to.exist;
})
.once('end', function() {
done();
});
stream.write(fakeFile);
stream.end();
});
it('if scss-lint is not available throw an error', function(done) {
var execStub = sinon.stub();
execStub.callsArgWith(2, {error: true, code: 127});
var scssLintPluginWithProxy = proxyquire(pluginPath, {
'child_process': {
exec: execStub,
'@global': true
}
});
var fakeFile = getFixtureFile('invalid.scss');
var fileCount = 0;
var stream = scssLintPluginWithProxy();
var error = false;
stream
.on('data', function (file) {
fileCount++;
})
.on('error', function (issue) {
expect(issue.message).to.equal('You need to have Ruby and scss-lint gem installed');
error = true;
})
.once('end', function() {
expect(fileCount).to.equal(0);
expect(error).to.be.true;
done();
});
stream.write(fakeFile);
stream.end();
});
it('if scss_lint_reporter_checkstyle is not available throw an error', function(done) {
var execStub = sinon.stub();
execStub.callsArgWith(2, {error: true, code: 69});
var childProcessStub = {exec: execStub, '@global': true};
var scssLintPluginWithProxy = proxyquire(pluginPath, {'child_process': childProcessStub});
var fakeFile = getFixtureFile('invalid.scss');
var fileCount = 0;
var stream = scssLintPluginWithProxy();
var error = false;
stream
.on('data', function (file) {
fileCount++;
})
.on('error', function (issue) {
expect(issue.message).to.equal('You need to have the scss_lint_reporter_checkstyle gem installed');
error = true;
})
.once('end', function() {
expect(fileCount).to.equal(0);
expect(error).to.be.true;
done();
});
stream.write(fakeFile);
stream.end();
});
it('validate multi scss files', function(done) {
var fakeFile = getFixtureFile('invalid.scss');
var fakeFile2 = getFixtureFile('invalid-error.scss');
var stream = scssLintPlugin();
var results = [
{'issues': 4, 'warnings': 4, 'errors': 0},
{'issues': 1, 'warnings': 0, 'errors': 1},
];
stream
.on('data', function (file) {
var result = results.shift();
expect(file.scsslint.success).to.be.false;
expect(file.scsslint.issues).to.have.length(result.issues);
expect(file.scsslint.warnings).to.equal(result.warnings);
expect(file.scsslint.errors).to.equal(result.errors);
})
.once('end', function() {
done();
});
stream.write(fakeFile);
stream.write(fakeFile2);
stream.end();
});
it('valid scss file', function(done) {
var fakeFile = getFixtureFile('valid.scss');
var stream = scssLintPlugin();
stream
.on('data', function (file) {
expect(file.scsslint.success).to.be.true;
expect(file.scsslint.issues).to.have.length(0);
expect(file.scsslint.warnings).to.equal(0);
expect(file.scsslint.errors).to.equal(0);
})
.once('end', function() {
done();
});
stream.write(fakeFile);
stream.end();
});
it('default report call', function(done) {
var fakeFile = getFixtureFile('invalid.scss');
var defaultReportSpy = sinon.spy();
var defaultReport = function (file) {
expect(file.scsslint.success).to.be.false;
expect(file.relative).to.be.equal('invalid.scss');
defaultReportSpy();
};
var scssLintPluginWithProxy = proxyquire(pluginPath, {
'./reporters': {
"defaultReporter": defaultReport,
'@global': true
}
});
var stream = scssLintPluginWithProxy();
stream
.once('end', function() {
expect(defaultReportSpy.calledOnce).to.be.true;
done();
});
stream.write(fakeFile);
stream.end();
});
it('custom report call', function(done) {
var fakeFile = getFixtureFile('invalid.scss');
var customReportSpy = sinon.spy();
var customReport = function (file, stream) {
expect(stream.end).to.exist;
expect(file.scsslint.success).to.be.false;
expect(file.relative).to.be.equal('invalid.scss');
customReportSpy();
};
var stream = scssLintPlugin({"customReport": customReport});
stream
.once('end', function() {
expect(customReportSpy.calledOnce).to.be.true;
done();
});
stream.write(fakeFile);
stream.end();
});
it('custom report throw an exception', function(done) {
var fakeFile = getFixtureFile('invalid.scss');
var error = false;
var customReport = function (file, stream) {
stream.emit('error', new PluginError("scss-lint", "some error"));
};
var stream = scssLintPlugin({"customReport": customReport});
stream
.on('error', function (issue) {
expect(issue.message).to.be.equal("some error");
error = true;
})
.once('end', function() {
expect(error).to.be.true;
done();
});
stream.write(fakeFile);
stream.end();
});
it('file pipe output', function(done) {
var fakeFile = getFixtureFile('invalid.scss');
var stream = scssLintPlugin({"filePipeOutput": "test.json"});
stream
.on('data', function (data) {
expect(data.contents.toString('utf-8')).to.have.length.above(20);
expect(data.path).to.be.equal('test/fixtures/test.json');
})
.once('end', function() {
done();
});
stream.write(fakeFile);
stream.end();
});
it('xml pipe output', function(done) {
var fakeFile = getFixtureFile('invalid.scss');
var stream = scssLintPlugin({"filePipeOutput": "test.xml", 'reporterOutputFormat': 'Checkstyle'});
stream
.on('data', function (data) {
expect(data.contents.toString('utf-8')).to.have.string('<?xml');
expect(data.contents.toString('utf-8')).to.have.string('</checkstyle>');
expect(data.path).to.be.equal('test/fixtures/test.xml');
})
.once('end', function() {
done();
});
stream.write(fakeFile);
stream.end();
});
it('scss-lint src success', function(done) {
var stream = scssLintPlugin({src: 'test/fixtures/valid.scss'});
stream
.on('data', function (file) {
expect(file.scsslint.success).to.be.true;
})
.once('end', function() {
done();
});
});
it('valid xml pipe output', function(done) {
var fakeFile = getFixtureFile('valid.scss');
var stream = scssLintPlugin({"filePipeOutput": "test.xml", 'reporterOutputFormat': 'Checkstyle'});
stream
.on('data', function (data) {
expect(data.contents.toString('utf-8')).to.have.string('<?xml');
expect(data.contents.toString('utf-8')).to.have.string('</checkstyle>');
expect(data.path).to.be.equal('test/fixtures/test.xml');
})
.once('end', function() {
done();
});
stream.write(fakeFile);
stream.end();
});
it('should not fail without files', function(done) {
var stream = scssLintPlugin();
var fileCount = 0;
stream
.on('data', function (file) {
fileCount++;
})
.on('error', function(error){
expect(error).to.equal(null);
})
.once('end', function() {
expect(fileCount).to.equal(0);
done();
});
stream.end();
});
it('should not fail with files with spaces', function(done) {
var fakeFile = getFixtureFile('file with spaces.scss');
var stream = scssLintPlugin();
stream
.on('data', function (file) {
expect(file.scsslint.success).to.be.true;
expect(file.scsslint.issues).to.have.length(0);
expect(file.scsslint.warnings).to.equal(0);
expect(file.scsslint.errors).to.equal(0);
})
.on('error', function(error){
expect(error).to.equal(null);
})
.once('end', function() {
done();
});
stream.write(fakeFile);
stream.end();
});
it('config file param', function (done) {
var fakeFile = getFixtureFile('valid.scss');
var stream = scssLintPlugin({'config': './test/fixtures/default.yml'});
stream
.on('data', function (file) {
expect(file.scsslint.success).to.be.false;
})
.once('end', function() {
done();
});
stream.write(fakeFile);
stream.end();
});
it('invalid config file', function (done) {
var fakeFile = getFixtureFile('valid.scss');
var stream = scssLintPlugin({'config': './test/fixtures/invalid-default.yml'});
var error = false;
stream
.on('error', function (issue) {
expect(issue.message).to.have.length.above(1);
error = true;
})
.once('end', function() {
expect(error).to.be.true;
done();
});
stream.write(fakeFile);
stream.end();
});
it('confil file does not exist', function (done) {
var fakeFile = getFixtureFile('valid.scss');
var stream = scssLintPlugin({'config': './test/fixtures/no-exist.yml'});
var error = false;
stream
.on('error', function (issue) {
expect(issue.message).to.be.equal('Config file did not exist or was not readable');
error = true;
})
.once('end', function() {
expect(error).to.be.true;
done();
});
stream.write(fakeFile);
stream.end();
});
it('write the json output', function(done) {
var fakeFile = getFixtureFile('invalid.scss');
var stream = scssLintPlugin({reporterOutput: 'test.json'});
stream
.once('end', function() {
var fileContent = fs.readFileSync('test.json', 'utf8');
expect(fileContent).to.have.length.above(1);
fs.unlinkSync('test.json');
done();
});
stream.write(fakeFile);
stream.end();
});
it('write the xml output', function(done) {
var fakeFile = getFixtureFile('invalid.scss');
var stream = scssLintPlugin({reporterOutput: 'test.xml', reporterOutputFormat: 'Checkstyle'});
stream
.once('end', function() {
var fileContent = fs.readFileSync('test.xml', 'utf8');
expect(fileContent).to.have.length.above(1);
fs.unlinkSync('test.xml');
done();
});
stream.write(fakeFile);
stream.end();
});
it('scss-lint src', function(done) {
var fakeFile = getFixtureFile('invalid.scss');
var stream = scssLintPlugin({src: 'test/fixtures/invalid.scss'});
stream
.on('data', function (file) {
expect(file.scsslint.success).to.be.false;
})
.once('end', function() {
done();
});
});
it('should create correct bundle exec command', function (done) {
var fakeFile = getFixtureFile('valid.scss');
var stream = scssLintPlugin({'bundleExec': true});
stream
.on('data', function (file) {
expect(file.scsslint.success).to.be.true;
})
.once('end', function() {
done();
});
stream.write(fakeFile);
stream.end();
});
});