test.js 3.95 KB
Newer Older
Nicolas Widart's avatar
Nicolas Widart committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142
var assert = require('assert');
var gsass = require('../');
var gutil = require('gulp-util');
var fs = require('fs');
var path = require('path');
var test = require('tape');

function createVinyl(sassFileName, contents) {
  var base = path.join(__dirname, 'scss');
  var filePath = path.join(base, sassFileName);

  return new gutil.File({
    cwd: __dirname,
    base: base,
    path: filePath,
    contents: contents || fs.readFileSync(filePath)
  });
}

test('pass file when isNull()', function (t) {
  var stream = gsass();
  var emptyFile = {
    isNull: function () { return true; }
  };
  stream.on('data', function (data) {
    t.equal(data, emptyFile);
    t.end();
  });
  stream.write(emptyFile);
});

// test('emit error when file isStream()', function (t) {
//   var stream = gsass();
//   var streamFile = {
//     isNull: function () { return false; },
//     isStream: function () { return true; }
//   };
//   stream.on()
// });

test('compile a single sass file', function (t) {
  var sassFile = createVinyl('mixins.scss');

  var stream = gsass();
  stream.on('data', function (cssFile) {
    t.ok(cssFile, 'cssFile should exist');
    t.ok(cssFile.path, 'cssFile.path should exist');
    t.ok(cssFile.relative, 'cssFile.relative should exist');
    t.ok(cssFile.contents, 'cssFile.contents should exist');
    t.equal(cssFile.path, path.join(__dirname, 'scss', 'mixins.css'));
    t.equal(
      fs.readFileSync(path.join(__dirname, 'ref/mixins.css'), 'utf8'),
      cssFile.contents.toString(),
      'file compiles correctly to css'
    );
    t.end();
  })
  stream.write(sassFile);
});

test('compile a single sass file synchronously', function (t) {
  var sassFile = createVinyl('mixins.scss');

  var stream = gsass({sync: true});
  stream.on('data', function (cssFile) {
    t.ok(cssFile, 'cssFile should exist');
    t.ok(cssFile.path, 'cssFile.path should exist');
    t.ok(cssFile.relative, 'cssFile.relative should exist');
    t.ok(cssFile.contents, 'cssFile.contents should exist');
    t.equal(cssFile.path, path.join(__dirname, 'scss', 'mixins.css'));
    t.equal(
      fs.readFileSync(path.join(__dirname, 'ref/mixins.css'), 'utf8'),
      cssFile.contents.toString(),
      'file compiles correctly to css'
    );
    t.end();
  })
  stream.write(sassFile);
});

test('compile multiple sass files', function (t) {
  var files = [
    createVinyl('inheritance.scss'),
    createVinyl('mixins.scss'),
    createVinyl('nesting.scss'),
    createVinyl('variables.scss')
  ];

  t.plan(files.length * 4);
  var stream = gsass();

  stream.on('data', function (cssFile) {
    t.ok(cssFile, 'cssFile exists');
    t.ok(cssFile.path, 'cssFile.path exists');
    t.ok(cssFile.relative, 'cssFile.relative exists');
    t.ok(cssFile.contents, 'cssFile.contents exists');
  });

  files.forEach(function (file) {
    stream.write(file);
  });
});

test('emit error on sass errors', function (t) {
  var stream = gsass();
  var errorFile = createVinyl('somefile.sass',
    new Buffer('body { font \'Comic Sans\'; }'));
  stream.on('error', function (err) {
    t.equal(err.message,
            'source string:1: error: property "font" must be followed by a \':\'\n'
    );
    t.end();
  });
  stream.write(errorFile);
});

test('emit error on sass errors when using sync true', function (t) {
  var stream = gsass({sync: true});
  var errorFile = createVinyl('somefile.sass',
    new Buffer('body { font \'Comic Sans\'; }'));
  stream.on('error', function (err) {
    t.equal(err.message,
            'source string:1: error: property "font" must be followed by a \':\'\n'
    );
    t.end();
  });
  stream.write(errorFile);
});

test('call custom error callback when opts.onError is given', function (t) {
  var stream = gsass({ onError: function (err) {
    t.equal(err,
            'source string:1: error: property "font" must be followed by a \':\'\n'
    );
    t.end();
  }});

  var errorFile = createVinyl('somefile.sass',
    new Buffer('body { font \'Comic Sans\'; }'));

  stream.write(errorFile);
});