2 * examples.js: Macros for testing code in examples/
4 * (C) 2010 Nodejitsu Inc.
9 var assert = require('assert'),
11 path = require('path'),
12 spawn = require('child_process').spawn,
13 async = require('async');
15 var rootDir = path.join(__dirname, '..', '..'),
16 examplesDir = path.join(rootDir, 'examples');
19 // ### function shouldHaveDeps ()
21 // Ensures that all `npm` dependencies are installed in `/examples`.
23 exports.shouldHaveDeps = function () {
25 "Before testing examples": {
29 // 1. Read files in examples dir
31 async.apply(fs.readdir, examplesDir),
33 // 2. If node_modules exists, continue. Otherwise
34 // exec `npm` to install them
36 function checkNodeModules(files, next) {
37 if (files.indexOf('node_modules') !== -1) {
41 var child = spawn('npm', ['install', '-f'], {
45 child.on('exit', function (code) {
47 ? next(new Error('npm install exited with non-zero exit code'))
52 // 3. Read files in examples dir again to ensure the install
53 // worked as expected.
55 async.apply(fs.readdir, examplesDir),
58 "examples/node_modules should exist": function (err, files) {
59 assert.notEqual(files.indexOf('node_modules'), -1);
66 // ### function shouldRequire (file)
67 // #### @file {string} File to attempt to require
69 // Returns a test which attempts to require `file`.
71 exports.shouldRequire = function (file) {
73 "should have no errors": function () {
74 try { assert.isObject(require(file)) }
75 catch (ex) { assert.isNull(ex) }
81 // ### function shouldHaveNoErrors ()
83 // Returns a vows context that attempts to require
84 // every relevant example file in `examples`.
86 exports.shouldHaveNoErrors = function () {
89 ['balancer', 'http', 'middleware', 'websocket'].forEach(function (dir) {
90 var name = 'examples/' + dir,
91 files = fs.readdirSync(path.join(rootDir, 'examples', dir));
93 files.forEach(function (file) {
94 context[name + '/' + file] = exports.shouldRequire(path.join(
95 examplesDir, dir, file