smithy
Version:
Preprocessing of CSS/JS meta-languages made easy through a singular API.
285 lines (233 loc) • 10 kB
JavaScript
describe('Smithy', function () {
'use strict';
var common = require('./common')
, smithy = common.smithy
, fs = common.fs
, canihaz = common.canihaz
, expect = common.expect;
// preload the processors.
before(function (done) {
this.timeout(6E5);
var i = 0;
function iterate () { if (i++ === 3) done(); }
canihaz['coffee-script'](iterate);
canihaz.less(iterate);
canihaz['node-sass'](iterate);
canihaz.stylus(iterate);
});
it('exposes each of the available meta-languages', function () {
expect(smithy).to.have.property('styl');
expect(smithy).to.have.property('sass');
expect(smithy).to.have.property('less');
expect(smithy).to.have.property('coffee');
});
describe('#coffeescript', function () {
it('can compile to extensions: [ JS ]', function () {
expect(smithy.coffee).to.have.property('extensions');
expect(smithy.coffee.extensions).to.have.include('js');
});
it('by default exports to extension: JS', function () {
expect(smithy.coffee).to.have.property('export', 'js');
});
it('handles require statements in the content', function () {
expect(smithy.coffee).to.have.property('regexp');
expect(smithy.coffee.regexp.toString()).to.equal(/require.['"]\.([^'"]+)['"]/gm.toString());
expect(smithy.coffee.regexp.test('require "./random.coffee"')).to.equal(true);
expect(smithy.coffee.regexp.test('require "./path/random.js"')).to.equal(true);
});
it('exposes the coffeescript compiler',function (done) {
var content = fs.readFileSync(__dirname + '/fixtures/coffeescript.coffee', 'utf-8');
smithy.coffee(content, {}, function (error, processed) {
expect(error).to.equal(null);
expect(processed).to.include("square;\n\n number = 42;\n\n opposite = ");
done();
});
});
it('will return an error on false input', function (done) {
smithy.coffee(undefined, {}, function (error, content) {
expect(error).to.be.an.instanceof(Error);
expect(content).to.equal(undefined);
done();
});
});
});
describe('#stylus', function () {
it('can compile to extensions: [ CSS ]', function () {
expect(smithy.styl).to.have.property('extensions');
expect(smithy.styl.extensions).to.have.include('css');
});
it('by default exports to extension: CSS', function () {
expect(smithy.styl).to.have.property('export', 'css');
});
it('defers handling of import statements to general function', function () {
expect(smithy.styl).to.not.have.property('regexp');
});
it('exposes the stylus compiler',function (done) {
var content = fs.readFileSync(__dirname + '/fixtures/stylus.styl', 'utf-8');
this.timeout(2E4);
smithy.styl(content, {}, function (error, processed) {
expect(error).to.equal(null);
expect(processed).to.include("#header {\n color: #4d926f;\n");
done();
});
});
it('will return an error on false input', function (done) {
smithy.styl('false css #garbage\ncolor:lol', {}, function (error, content) {
expect(error).to.be.an.instanceof(Error);
expect(error.message).to.include('2| color:lol\n---------------^\n\nexpected "indent"');
expect(content).to.equal(undefined);
done();
});
});
});
describe('#rework', function () {
var content = fs.readFileSync(__dirname + '/fixtures/rework.css', 'utf-8');
it('can compile to extensions: [ CSS ]', function () {
expect(smithy.css).to.have.property('extensions');
expect(smithy.css.extensions).to.have.include('css');
});
it('by default exports to extension: CSS', function () {
expect(smithy.css).to.have.property('export', 'css');
});
it('defers handling of import statements to general function', function () {
expect(smithy.css).to.not.have.property('regexp');
});
it('exposes the rework compiler', function (done) {
this.timeout(2E4);
smithy.css(content, function (error, processed) {
expect(error).to.equal(null);
expect(processed).to.include("#header {\n color: #4d926f;\n");
done();
});
});
it('exposes default plugins via instance', function (done) {
this.timeout(2E4);
function plug() {
var rework = this;
expect(rework).to.have.property('prefix');
expect(rework).to.have.property('prefixSelectors');
expect(rework.prefix).to.be.a('function');
expect(rework.prefixSelectors).to.be.a('function');
}
smithy.css(content, { plugins: [ plug ] }, function (error, processed) {
expect(processed).to.include("#header {\n color: #4d926f;\n");
done();
});
});
it('can namespace all selectors', function (done) {
this.timeout(2E4);
expect(smithy.css.plugins).to.be.an('object');
expect(smithy.css.plugins).to.have.property('namespace');
expect(smithy.css.plugins.namespace).to.be.an('function');
var plug = smithy.css.plugins.namespace('mynamespace');
smithy.css(content, { plugins: [ plug ] }, function (error, processed) {
expect(error).to.equal(null);
expect(processed).to.include("mynamespace #header {\n color: #4d926f;\n");
done();
});
});
it('can namespace inside media queries',function (done) {
var content = fs.readFileSync(__dirname + '/fixtures/reworkmedia.css', 'utf-8')
, plug = smithy.css.plugins.namespace('mynamespace');
this.timeout(2E4);
smithy.css(content, { plugins: [ plug ] }, function (error, processed) {
expect(error).to.equal(null);
expect(processed).to.include("@media handheld, only screen and (max-width: 767px) {\n mynamespace .box {\n");
done();
});
});
it('can namespace but ignores @font-face',function (done) {
var content = fs.readFileSync(__dirname + '/fixtures/reworkfont.css', 'utf-8')
, plug = smithy.css.plugins.namespace('mynamespace');
this.timeout(2E4);
smithy.css(content, { plugins: [ plug ] }, function (error, processed) {
expect(error).to.equal(null);
expect(processed).to.equal("@font-face {\n font-family: \"SSSocial\";\n}");
done();
});
});
});
describe('#less', function () {
it('can compile to extensions: [ CSS ]', function () {
expect(smithy.less).to.have.property('extensions');
expect(smithy.less.extensions).to.have.include('css');
});
it('by default exports to extension: CSS', function () {
expect(smithy.less).to.have.property('export', 'css');
});
it('defers handling of import statements to general function', function () {
expect(smithy.less).to.not.have.property('regexp');
});
it('exposes the less compiler',function (done) {
var content = fs.readFileSync(__dirname + '/fixtures/less.less', 'utf-8');
this.timeout(2E4);
smithy.less(content, { paths: [ __dirname + '/fixtures' ] }, function (error, processed) {
expect(error).to.equal(null);
expect(processed).to.include("#header {\n color:");
expect(processed).to.include("#body {\n color:");
done();
});
});
it('will return an error on false input', function (done) {
smithy.less('false css #garbage\ncolor:lol', {}, function (error, content) {
expect(error).to.be.an.instanceof(Error);
expect(error.message).to.include(' > 2| color:lol\n\n Unrecognised input');
expect(content).to.equal(undefined);
done();
});
});
});
describe('#sass', function () {
it('can compile to extensions: [ CSS ]', function () {
expect(smithy.sass).to.have.property('extensions');
expect(smithy.sass.extensions).to.have.include('css');
});
it('by default exports to extension: CSS', function () {
expect(smithy.sass).to.have.property('export', 'css');
});
it('defers handling of import statements to general function', function () {
expect(smithy.sass).to.not.have.property('regexp');
});
it('exposes the sass compiler',function (done) {
var content = fs.readFileSync(__dirname + '/fixtures/sass.scss', 'utf-8');
this.timeout(2E4);
smithy.sass(content, { includePaths: [ __dirname + '/fixtures' ] }, function (error, processed) {
expect(error).to.equal(null);
expect(processed).to.equal("body {\n color: #4D926F; }\n\nbody {\n font: 100% Helvetica, sans-serif;\n color: #333; }\n");
done();
});
});
it('will return an error on false input', function (done) {
smithy.sass('false css #garbage\ncolor:lol', {}, function (error) {
expect(error).to.be.a('object');
expect(error.message).to.equal('invalid top-level expression');
done();
});
});
});
describe('#jsx', function () {
it('can compile to extensions: [ JS ]', function () {
expect(smithy.jsx).to.have.property('extensions');
expect(smithy.jsx.extensions).to.have.include('js');
});
it('by default exports to extension: JS', function () {
expect(smithy.jsx).to.have.property('export', 'js');
});
it('exposes the jsx compiler',function (done) {
var content = fs.readFileSync(__dirname + '/fixtures/react.jsx', 'utf-8');
this.timeout(2E4);
smithy.jsx(content, {}, function (error, processed) {
expect(processed).to.include('displayName: \'jsxClass\',\n render: function render() {\n return (\n React.createElement("div", null)\n );\n');
done();
});
});
it('will return an error on false input', function (done) {
smithy.jsx('', {}, function (error) {
expect(error).to.be.a('object');
expect(error).to.be.instanceof(Error);
expect(error.message).to.equal('expected null to be an object');
done();
});
});
});
});