var should = require('should'),
fs = require('fs'),
path = require('path'),
spawn = require('child_process').spawn,
exec = require('child_process').exec,
rimraf = require('rimraf'),
glob = require('glob'),
mkdirp = require('mkdirp'),
typogr = require('../typogr');
describe('./bin/typogr', function () {
// variables used throughout the tests
var testText = '
"Jayhawks" & KU fans act extremely obnoxiously
',
renderedText = '“Jayhawks” & KU fans act extremely obnoxiously
',
testDir = '/var/tmp/typogr/',
inputDir = testDir + 'input/',
inputFiles = [ 'file1.html',
'file2.html',
'file3.html',
'firstleveldir/file4.html',
'firstleveldir/secondleveldir/file5.html',
'firstleveldir/secondleveldir/file6.html'
],
outputDir = testDir + '/output';
// run before every test
beforeEach(function () {
// create input files
inputFiles.forEach(function (fileName) {
mkdirp.sync(path.dirname(inputDir + fileName));
fs.writeFileSync(inputDir + fileName, testText);
});
});
it('should create test files', function (done) {
glob(inputDir + '**', { cwd: testDir }, function (error, files) {
files.should.have.length(9);
done();
});
});
it('should have test files with expected contents', function (done) {
var stats, contents;
glob(inputDir + '**', { cwd: testDir }, function (error, files) {
if(error) throw error;
files.forEach(function (fileName) {
stats = fs.statSync(fileName);
if(stats.isFile()) {
contents = fs.readFileSync(fileName, 'utf8');
contents.should.equal(testText);
}
});
done();
});
});
it('# should take input from stdin and output to stdout', function (done) {
var stdout = "";
var typogr = spawn('./bin/typogr', [inputDir + inputFiles[0]]);
typogr.stdin.write(testText);
typogr.stdin.end();
typogr.stdout.on('data', function (data) {
stdout += data;
});
typogr.on('exit', function (code) {
if(code) throw code;
stdout.should.equal(renderedText + '\n');
done();
});
});
it('# should overwrite input file in place ( -if)' + inputDir + inputFiles[0],
function (done) {
exec('./bin/typogr -if ' + inputDir + inputFiles[0], function (error, stdout, stderr) {
if(error) throw error;
// make sure file now has rendered text
var contents = fs.readFileSync(inputDir + inputFiles[0], 'utf8');
contents.should.equal(renderedText);
done();
});
});
it('# should read from one file and write to another', function (done) {
exec('./bin/typogr ' + inputDir + inputFiles[0] + ' ' + outputDir + inputFiles[0],
function (error, stdout, stderr) {
if(error) throw error;
// make sure file now has rendered text
var contents = fs.readFileSync(outputDir + inputFiles[0], 'utf8');
contents.should.equal(renderedText);
done();
});
});
it('# should read from one directory and write to another', function (done) {
exec('./bin/typogr ' + inputDir + ' ' + outputDir, function (error, stdout, stderr) {
if(error) throw error;
// make sure file now has rendered text in each file
glob(outputDir + '**', { cwd: testDir }, function (error, files) {
if(error) throw error;
files.forEach(function (fileName) {
if(fs.statSync(fileName).isFile()) {
contents = fs.readFileSync(fileName, 'utf8');
contents.should.equal(renderedText);
}
});
done();
});
});
});
it('# should process glob: /**', function (done) {
exec('./bin/typogr ' + inputDir + '** ' + outputDir, function (error, stdout, stderr) {
if(error) throw error;
// make sure file now has rendered text in each file
glob(outputDir + '**', { cwd: testDir }, function (error, files) {
if(error) throw error;
files.forEach(function (fileName) {
stats = fs.statSync(fileName);
if(stats.isFile()) {
contents = fs.readFileSync(fileName, 'utf8');
contents.should.equal(renderedText);
}
});
done();
});
});
});
it('# should prompt for confirmation to overwrite single file: negative response', function (done) {
// in place modification of a single file
// test negative response
var buffer,
response = false,
typogr = spawn('./bin/typogr', ['-i', inputDir + inputFiles[0]]);
typogr.stdout.on('readable', function () {
buffer = typogr.stdout.read(null);
if (/Confirm: overwrite file \(.+\)\? /.test(buffer))
typogr.stdin.end('n\n');
else {
if (/Cancelling action, file wasn't modified\./.test(buffer)) {
response = true;
}
else
if (!response) {
throw 'unexpected text found!';
}
}
});
typogr.on('exit', function (error) {
if(error) throw error;
response.should.equal(true);
done();
});
});
it('# should prompt for confirmation to overwrite single file: positive response', function (done) {
// test positive response
var buffer,
response = false,
typogr = spawn('./bin/typogr', ['-i', inputDir + inputFiles[0]]);
typogr.stdout.on('readable', function () {
buffer = typogr.stdout.read(null);
if (/Confirm: overwrite file \(.+\)\? /.test(buffer)) {
response = true;
typogr.stdin.end('y\n');
}
else
if (!response) {
throw 'unexpected text found!';
}
});
typogr.on('exit', function (error) {
if(error) throw error;
response.should.equal(true);
done();
});
});
it('# should prompt for confirmation of each overwritten file when writing from an input directory to an output directory', function (done) {
// we should get prompted for each file overwrite
var buffer,
confirmCount = 0,
typogr = spawn('./bin/typogr', [inputDir, inputDir]);
typogr.stdout.on('readable', function () {
buffer = typogr.stdout.read(null);
if (/Confirm: overwrite file \(.+\)\? /.test(buffer)) {
typogr.stdin.write('y\n');
++confirmCount;
}
else
if (buffer)
throw 'unexpected text found!';
});
// wait for cli interactions to complete
setTimeout(function () {
typogr.stdin.end();
}, 1000);
typogr.on('exit', function (code) {
if(code) throw code;
confirmCount.should.equal(6);
done();
});
});
it('# should prompt for confirmation of each overwritten file when writing from an input glob to an output directory', function (done) {
// we should get prompted for each file overwrite
var buffer,
confirmCount = 0,
typogr = spawn('./bin/typogr', [inputDir, inputDir]);
typogr.stdout.on('readable', function () {
buffer = typogr.stdout.read(null);
if (/Confirm: overwrite file \(.+\)\? /.test(buffer)) {
typogr.stdin.write('y\n');
++confirmCount;
}
else
if (buffer)
throw 'unexpected text found!';
});
// wait for cli interactions to complete
setTimeout(function () {
typogr.stdin.end();
}, 1000);
typogr.on('exit', function (code) {
if(code) throw code;
confirmCount.should.equal(6);
done();
});
});
// run after every test
afterEach(function (done) {
// remove all test files in testDir (equivalent to `rm -rf`)
rimraf(testDir, function (error) {
if(error) throw error;
done();
});
});
});