var hashish = require('hashish'); var fs = require('fs'); var findit = require('findit'); var path = require('path'); var http = require('http'); var net = require('net'); var assert = require('assert'); var common = require('../common'); var formidable = common.formidable; var server = http.createServer(); server.listen(common.port, findFixtures); function findFixtures() { var fixtures = []; findit .sync(common.dir.fixture + '/js') .forEach(function(jsPath) { if (!/\.js$/.test(jsPath)) return; var group = path.basename(jsPath, '.js'); hashish.forEach(require(jsPath), function(fixture, name) { fixtures.push({ name : group + '/' + name, fixture : fixture, }); }); }); testNext(fixtures); } function testNext(fixtures) { var fixture = fixtures.shift(); if (!fixture) return server.close(); var name = fixture.name; var fixture = fixture.fixture; uploadFixture(name, function(err, parts) { if (err) throw err; fixture.forEach(function(expectedPart, i) { var parsedPart = parts[i]; assert.equal(parsedPart.type, expectedPart.type); assert.equal(parsedPart.name, expectedPart.name); if (parsedPart.type === 'file') { var file = parsedPart.value; assert.equal(file.name, expectedPart.filename); if(expectedPart.sha1) assert.equal(file.hash, expectedPart.sha1); } }); testNext(fixtures); }); }; function uploadFixture(name, cb) { server.once('request', function(req, res) { var form = new formidable.IncomingForm(); form.uploadDir = common.dir.tmp; form.hash = "sha1"; form.parse(req); function callback() { var realCallback = cb; cb = function() {}; realCallback.apply(null, arguments); } var parts = []; form .on('error', callback) .on('fileBegin', function(name, value) { parts.push({type: 'file', name: name, value: value}); }) .on('field', function(name, value) { parts.push({type: 'field', name: name, value: value}); }) .on('end', function() { res.end('OK'); callback(null, parts); }); }); var socket = net.createConnection(common.port); var file = fs.createReadStream(common.dir.fixture + '/http/' + name); file.pipe(socket, {end: false}); socket.on('data', function () { socket.end(); }); }