/* */ 
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();
  });
}
