Skip to content
This repository has been archived by the owner on May 6, 2019. It is now read-only.

Commit

Permalink
Merge pull request #7 from helpscout/add-testing
Browse files Browse the repository at this point in the history
Add testing
  • Loading branch information
ItsJonQ committed Jul 6, 2016
2 parents f888889 + 9589ec0 commit 0768ba1
Show file tree
Hide file tree
Showing 11 changed files with 209 additions and 42 deletions.
5 changes: 3 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,13 +19,14 @@ Usage:
seed <command>
Commands:
n, new Creates a new Seed package
g, generate Creates a new .scss module (component/object/utility)
n, new Creates a new Seed pack
g, generate Creates a new .scss module (component/object/scope/test/utility)
Options:
-c, --config Custom sass-lint config (.yml)
-i, --ignore Ignore files for linting/testing
-l, --lint Initialize .scss lint (powered by sass-lint)
-t, --test Initialize tests (powered by mocha + sass-true)
```

## Thanks
Expand Down
9 changes: 5 additions & 4 deletions bin/cli.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,23 +8,24 @@ var cli = meow(`
seed <command>
Commands:
n, new Creates a new Seed package
g, generate Creates a new .scss module (component/object/utility)
n, new Creates a new Seed pack
g, generate Creates a new .scss module (component/object/scope/test/utility)
Options:
-c, --config Custom sass-lint config (.yml)
-i, --ignore Ignore files for linting/testing
-l, --lint Initialize .scss lint (powered by sass-lint)
-t, --test Initialize tests (powered by mocha + sass-true)
${pkg.name} v${pkg.version}
License: ${pkg.license}
Website: ${pkg.homepage}
`, {
alias: {
c: 'config',
i: 'ignore',
n: 'new',
l: 'lint'
l: 'lint',
t: 'test'
}
});

Expand Down
4 changes: 4 additions & 0 deletions commands/generate/config.js
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,10 @@ config.prototype.setPrefixType = function() {
prefix = 's';
type = 'scope';
}
if (_type === 'test' || _type === 't') {
prefix = 't';
type = 'test';
}
if (_type === 'utility' || _type === 'u') {
prefix = 'u';
type = 'utility';
Expand Down
81 changes: 61 additions & 20 deletions commands/generate/generate.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,50 +2,91 @@
'use strict';

var _ = require('lodash');
var chalk = require('chalk');
var config = require('./config');
var cli = global.cli;
var fs = require('fs');
var isEmpty = require('is-empty');
var mkdirp = require('mkdirp');
var path = require('path');

var cli = global.cli;
var config = require('./config');
var currentDir = path.basename(process.cwd()).toLowerCase();
var templateDir = global.templateDir + 'module/';

var prompt = require('./prompt');

var generate = function(options) {
var parseOptions = function(options) {
if (!options) {
process.exit(1)
return false;
}

options = new config(options).options;

var dest = options.name;
console.log(currentDir);
if (options.type === 'test') {
return parseTest(options);
}
else {
return parseModule(options);
}
};

var parseModule = function(options) {
if (!options) {
return false;
}
var currentDir = path.basename(process.cwd()).toLowerCase();

options.dest = options.name;
options.templateDir = global.templateDir + 'module/';

if (options.type !== 'scope' && currentDir.indexOf(options.type) < 0) {
var type = options.type;
if (type === 'utility') {
type = 'utilities';
}
if (type === 'test') {
type = 'test';
}
else {
type = `${ type }s`;
}
dest = `${ type }/${ dest }`;
options.dest = `${ type }/${ options.dest }`;
}

mkdirp.sync(dest);
options.templateFiles = fs.readdirSync(options.templateDir);

return options;
};

var parseTest = function(options) {
if (!options) {
return false;
}

options.name = options.name.replace('seed-', '');
options.dest = 'test';
options.templateDir = global.templateDir + 'test/';
options.templateFiles = [ 'test.scss' ];

return options;
};


var generate = function(options) {
if (!options) {
process.exit(1)
return false;
}

options = parseOptions(options);

mkdirp.sync(options.dest);

console.log(`Generating your new ${ options.type }…\n`);

var templateFiles = fs.readdirSync(templateDir);
_.forEach(templateFiles, function(file) {
var template = fs.readFileSync(templateDir + file, 'utf8');
fs.writeFileSync(dest + '/' + file, _.template(template)(options));
console.log(` created ${ dest + '/' + file }`);
_.forEach(options.templateFiles, function(file) {
var template = fs.readFileSync(options.templateDir + file, 'utf8');
var outputFile = file;

if (options.type === 'test') {
outputFile = '_' + options.name + '.scss';
}

fs.writeFileSync(options.dest + '/' + outputFile, _.template(template)(options));
console.log(` created ${ options.dest + '/' + outputFile }`);
});

console.log(`\nCongrats! Your new .scss ${ options.type } has been created.`);
Expand Down
1 change: 1 addition & 0 deletions commands/generate/help.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ var help = `
c, component
o, object
s, scope
t, test
u, utility
Name:
Expand Down
7 changes: 1 addition & 6 deletions commands/generate/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,7 @@ if (command === 'generate' || command === 'g') {
if (type && name) {
var options = {
name: name,
type: type,
components: false,
objects: false,
modifers: false,
states: false,
variables: false
type: type
};

return generate(options);
Expand Down
25 changes: 15 additions & 10 deletions commands/generate/prompt.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,6 @@ var cli = global.cli;
var templateDir = global.templateDir;

var questions = [
{
name: 'name',
type: 'input',
message: 'name:',
default: 'button',
filter: function(val) {
return val.replace('seed-', '').toLowerCase();
}
},
{
name: 'type',
type: 'list',
Expand All @@ -38,13 +29,27 @@ var questions = [
name: 'Scope',
value: 'scope'
},
{
key: 't',
name: 'Test',
value: 'test'
},
{
key: 'u',
name: 'Utility',
value: 'utility'
}
]
}
},
{
name: 'name',
type: 'input',
message: 'name:',
default: 'button',
filter: function(val) {
return val.replace('seed-', '').toLowerCase();
}
},
];

var prompt = function() {
Expand Down
80 changes: 80 additions & 0 deletions commands/test/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
// Commands :: Test
'use strict';

if (!global.cli.flags.test) {
return false;
}

var _ = require('lodash');
var del = require('del');
var findRoot = require('find-root');
var fs = require('fs');
var glob = require('glob');
var mkdirp = require('mkdirp');
var path = require('path');
var uuid = require('node-uuid');

var Mocha = require('mocha');
var mocha = new Mocha();
var root = findRoot(process.cwd());
var templateFile = global.templateDir + 'test/index.js';
var template = fs.readFileSync(templateFile, 'utf8');
var testCache = root + '/.seed-test-cache';
var testDir = 'test';

var options = {
ignore: [
'bower_components/**/*',
'node_modules/**/*'
]
};

var clean = function() {
return del(testCache, { force: true });
};

var getTestFileName = function(file) {
return path.basename(file).replace(/_/g, '').replace('.scss', '') + '-' + uuid.v1() + '.js';
};

// Delete the test cache directory (just in case it was left over)
clean();

glob('**/*.scss', options, function(err, matches) {
var files = matches;
var currentDir = process.cwd().split('/').pop();

if (currentDir !== testDir) {
files = files.filter(function(file) {
var dir = testDir + '/';
return file.indexOf(dir) >= 0;
});
}
// Create the test cache directory
mkdirp.sync(testCache);

if (!files.length) {
console.log(`\nCouldn't find any tests in your project!`);
console.log(`You can create a new test by executinexecuting "seed g"\n`);
process.exit(0)
}

_.forEach(files, function(file) {
var dest = testCache + '/' + getTestFileName(file);
var options = {
file: file
};
// Add mocha compatible .js file to test cache
fs.writeFileSync(dest, _.template(template)(options));
// Add path of test cache file to Mocha
mocha.addFile(dest);
});

mocha.run(function(failures){
// Delete test cache redirectory
clean();
process.on('exit', function() {
process.exit(failures);
});
});
});
6 changes: 6 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -25,14 +25,20 @@
"authors-to-markdown": "^0.1.0",
"chalk": "^1.1.3",
"copy-files": "^0.1.0",
"del": "^2.2.1",
"file-exists": "^1.0.0",
"find-root": "^1.0.0",
"glob": "^7.0.5",
"inquirer": "^1.1.0",
"is-blank": "^1.1.0",
"lodash": "^4.13.1",
"meow": "^3.7.0",
"mkdirp": "^0.5.1",
"mocha": "^2.5.3",
"node-uuid": "^1.4.7",
"require-dir": "^0.3.0",
"sass-lint": "^1.8.2",
"sass-true": "^2.1.0",
"shelljs": "^0.7.0"
}
}
4 changes: 4 additions & 0 deletions templates/test/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
var path = require('path');
var sassTrue = require('sass-true');

sassTrue.runSass({file: '<%= file %>'}, describe, it);
29 changes: 29 additions & 0 deletions templates/test/test.scss
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
// <%= docName %> :: <%= docType %>

@import "true";

@include test-module("<%= name %>") {

@include test("Example .scss test (Generated by seed-cli)") {
@include assert('pink') {

$pink-hot: pink;
@include output {
background: $pink-hot;
}

@include expect {
background: pink;
}

}
}

@include test("Another .scss test (Generated by seed-cli)") {

$test: 0;
$expect: 0;

@include assert-equal($test, $expect, '0');
}
}

0 comments on commit 0768ba1

Please sign in to comment.