You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
183 lines
5.2 KiB
183 lines
5.2 KiB
var Busboy = require('..');
|
|
|
|
var path = require('path'),
|
|
inspect = require('util').inspect,
|
|
assert = require('assert');
|
|
|
|
var EMPTY_FN = function() {};
|
|
|
|
var t = 0,
|
|
group = path.basename(__filename, '.js') + '/';
|
|
|
|
var tests = [
|
|
{ source: ['foo'],
|
|
expected: [['foo', '', false, false]],
|
|
what: 'Unassigned value'
|
|
},
|
|
{ source: ['foo=bar'],
|
|
expected: [['foo', 'bar', false, false]],
|
|
what: 'Assigned value'
|
|
},
|
|
{ source: ['foo&bar=baz'],
|
|
expected: [['foo', '', false, false],
|
|
['bar', 'baz', false, false]],
|
|
what: 'Unassigned and assigned value'
|
|
},
|
|
{ source: ['foo=bar&baz'],
|
|
expected: [['foo', 'bar', false, false],
|
|
['baz', '', false, false]],
|
|
what: 'Assigned and unassigned value'
|
|
},
|
|
{ source: ['foo=bar&baz=bla'],
|
|
expected: [['foo', 'bar', false, false],
|
|
['baz', 'bla', false, false]],
|
|
what: 'Two assigned values'
|
|
},
|
|
{ source: ['foo&bar'],
|
|
expected: [['foo', '', false, false],
|
|
['bar', '', false, false]],
|
|
what: 'Two unassigned values'
|
|
},
|
|
{ source: ['foo&bar&'],
|
|
expected: [['foo', '', false, false],
|
|
['bar', '', false, false]],
|
|
what: 'Two unassigned values and ampersand'
|
|
},
|
|
{ source: ['foo=bar+baz%2Bquux'],
|
|
expected: [['foo', 'bar baz+quux', false, false]],
|
|
what: 'Assigned value with (plus) space'
|
|
},
|
|
{ source: ['foo=bar%20baz%21'],
|
|
expected: [['foo', 'bar baz!', false, false]],
|
|
what: 'Assigned value with encoded bytes'
|
|
},
|
|
{ source: ['foo%20bar=baz%20bla%21'],
|
|
expected: [['foo bar', 'baz bla!', false, false]],
|
|
what: 'Assigned value with encoded bytes #2'
|
|
},
|
|
{ source: ['foo=bar%20baz%21&num=1000'],
|
|
expected: [['foo', 'bar baz!', false, false],
|
|
['num', '1000', false, false]],
|
|
what: 'Two assigned values, one with encoded bytes'
|
|
},
|
|
{ source: ['foo=bar&baz=bla'],
|
|
expected: [],
|
|
what: 'Limits: zero fields',
|
|
limits: { fields: 0 }
|
|
},
|
|
{ source: ['foo=bar&baz=bla'],
|
|
expected: [['foo', 'bar', false, false]],
|
|
what: 'Limits: one field',
|
|
limits: { fields: 1 }
|
|
},
|
|
{ source: ['foo=bar&baz=bla'],
|
|
expected: [['foo', 'bar', false, false],
|
|
['baz', 'bla', false, false]],
|
|
what: 'Limits: field part lengths match limits',
|
|
limits: { fieldNameSize: 3, fieldSize: 3 }
|
|
},
|
|
{ source: ['foo=bar&baz=bla'],
|
|
expected: [['fo', 'bar', true, false],
|
|
['ba', 'bla', true, false]],
|
|
what: 'Limits: truncated field name',
|
|
limits: { fieldNameSize: 2 }
|
|
},
|
|
{ source: ['foo=bar&baz=bla'],
|
|
expected: [['foo', 'ba', false, true],
|
|
['baz', 'bl', false, true]],
|
|
what: 'Limits: truncated field value',
|
|
limits: { fieldSize: 2 }
|
|
},
|
|
{ source: ['foo=bar&baz=bla'],
|
|
expected: [['fo', 'ba', true, true],
|
|
['ba', 'bl', true, true]],
|
|
what: 'Limits: truncated field name and value',
|
|
limits: { fieldNameSize: 2, fieldSize: 2 }
|
|
},
|
|
{ source: ['foo=bar&baz=bla'],
|
|
expected: [['fo', '', true, true],
|
|
['ba', '', true, true]],
|
|
what: 'Limits: truncated field name and zero value limit',
|
|
limits: { fieldNameSize: 2, fieldSize: 0 }
|
|
},
|
|
{ source: ['foo=bar&baz=bla'],
|
|
expected: [['', '', true, true],
|
|
['', '', true, true]],
|
|
what: 'Limits: truncated zero field name and zero value limit',
|
|
limits: { fieldNameSize: 0, fieldSize: 0 }
|
|
},
|
|
{ source: ['&'],
|
|
expected: [],
|
|
what: 'Ampersand'
|
|
},
|
|
{ source: ['&&&&&'],
|
|
expected: [],
|
|
what: 'Many ampersands'
|
|
},
|
|
{ source: ['='],
|
|
expected: [['', '', false, false]],
|
|
what: 'Assigned value, empty name and value'
|
|
},
|
|
{ source: [''],
|
|
expected: [],
|
|
what: 'Nothing'
|
|
},
|
|
];
|
|
|
|
function next() {
|
|
if (t === tests.length)
|
|
return;
|
|
|
|
var v = tests[t];
|
|
|
|
var busboy = new Busboy({
|
|
limits: v.limits,
|
|
headers: {
|
|
'content-type': 'application/x-www-form-urlencoded; charset=utf-8'
|
|
}
|
|
}),
|
|
finishes = 0,
|
|
results = [];
|
|
|
|
busboy.on('field', function(key, val, keyTrunc, valTrunc) {
|
|
results.push([key, val, keyTrunc, valTrunc]);
|
|
});
|
|
busboy.on('file', function() {
|
|
throw new Error(makeMsg(v.what, 'Unexpected file'));
|
|
});
|
|
busboy.on('finish', function() {
|
|
assert(finishes++ === 0, makeMsg(v.what, 'finish emitted multiple times'));
|
|
assert.deepEqual(results.length,
|
|
v.expected.length,
|
|
makeMsg(v.what, 'Parsed result count mismatch. Saw '
|
|
+ results.length
|
|
+ '. Expected: ' + v.expected.length));
|
|
|
|
var i = 0;
|
|
results.forEach(function(result) {
|
|
assert.deepEqual(result,
|
|
v.expected[i],
|
|
makeMsg(v.what,
|
|
'Result mismatch:\nParsed: ' + inspect(result)
|
|
+ '\nExpected: ' + inspect(v.expected[i]))
|
|
);
|
|
++i;
|
|
});
|
|
++t;
|
|
next();
|
|
});
|
|
|
|
v.source.forEach(function(s) {
|
|
busboy.write(Buffer.from(s, 'utf8'), EMPTY_FN);
|
|
});
|
|
busboy.end();
|
|
}
|
|
next();
|
|
|
|
function makeMsg(what, msg) {
|
|
return '[' + group + what + ']: ' + msg;
|
|
}
|
|
|
|
process.on('exit', function() {
|
|
assert(t === tests.length, makeMsg('_exit', 'Only finished ' + t + '/' + tests.length + ' tests'));
|
|
});
|