var test = require('tap').test, ecstatic = require('../lib/ecstatic'), union = require('union'), request = require('request'), mkdirp = require('mkdirp'), fs = require('fs'), path = require('path'); var root = __dirname + '/public', baseDir = 'base'; mkdirp.sync(root + '/emptyDir'); var files = { 'a.txt' : { code : 200, type : 'text/plain', body : 'A!!!\n', }, 'b.txt' : { code : 200, type : 'text/plain', body : 'B!!!\n', }, 'c.js' : { code : 200, type : 'application/javascript', body : 'console.log(\'C!!!\');\n', }, 'd.js' : { code : 200, type : 'application/javascript', body : 'console.log(\'C!!!\');\n', }, 'subdir/e.html' : { code : 200, type : 'text/html', body : 'e!!\n', }, 'subdir/index.html' : { code : 200, type : 'text/html', body : 'index!!!\n', }, 'subdir' : { code : 302 }, 'subdir/' : { code : 200, type : 'text/html', body : 'index!!!\n', }, '404' : { code : 404 }, 'compress/foo.js' : { code : 200, file: 'compress/foo.js.gz', headers: {'accept-encoding': 'compress, gzip'} }, // no accept-encoding of gzip, so serve regular file 'compress/foo_2.js' : { code : 200, file: 'compress/foo_2.js' }, 'emptyDir/': { code: 200 } }; test('union', function (t) { var filenames = Object.keys(files); var port = Math.floor(Math.random() * ((1<<16) - 1e4) + 1e4); var server = union.createServer({ before: [ ecstatic({ root: root, gzip: true, baseDir: baseDir, autoIndex: true, showDir: true }) ] }); server.listen(port, function () { var pending = filenames.length; filenames.forEach(function (file) { var uri = 'http://localhost:' + port + path.join('/', baseDir, file), headers = files[file].headers || {}; request.get({ uri: uri, followRedirect: false, headers: headers }, function (err, res, body) { if (err) t.fail(err); var r = files[file]; t.equal(res.statusCode, r.code, 'status code for `' + file + '`'); if (r.type !== undefined) { t.equal( res.headers['content-type'].split(';')[0], r.type, 'content-type for `' + file + '`' ); } if (r.body !== undefined) { t.equal(body, r.body, 'body for `' + file + '`'); } if (--pending === 0) { server.close(); t.end(); } }); }); }); });