Skip to content

Commit a3bffa6

Browse files
committed
fix: part of #415, start converting to Jest tests
Signed-off-by: Charlike Mike Reagent <opensource@tunnckocore.com>
1 parent 7970ab1 commit a3bffa6

10 files changed

+2229
-252
lines changed

package.json

+1
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
"eslint-config-prettier": "^6.10.0",
3131
"eslint-plugin-import": "^2.20.0",
3232
"eslint-plugin-prettier": "^3.1.2",
33+
"jest": "^25.1.0",
3334
"nyc": "^15.0.0",
3435
"prettier": "^1.19.1",
3536
"prettier-plugin-pkgjson": "^0.2.0",

test/run.js

+1
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,6 @@
22

33
require('urun')(__dirname, {
44
verbose: true,
5+
include: /test-.+/,
56
reporter: 'BashTapReporter',
67
});

test/unit/file.test.js

+31
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
'use strict';
2+
3+
// const assert = require('assert');
4+
// const test = require('utest');
5+
6+
const { File } = require('../../src/index');
7+
8+
const now = new Date();
9+
const file = new File({
10+
size: 1024,
11+
path: '/tmp/cat.png',
12+
name: 'cat.png',
13+
type: 'image/png',
14+
lastModifiedDate: now,
15+
filename: 'cat.png',
16+
mime: 'image/png',
17+
});
18+
19+
test('File#toJSON()', () => {
20+
const obj = file.toJSON();
21+
const len = Object.keys(obj).length;
22+
23+
expect(1024).toBe(obj.size);
24+
expect('/tmp/cat.png').toBe(obj.path);
25+
expect('cat.png').toBe(obj.name);
26+
expect('image/png').toBe(obj.type);
27+
expect('image/png').toBe(obj.mime);
28+
expect('cat.png').toBe(obj.filename);
29+
expect(now).toBe(obj.mtime);
30+
expect(len).toBe(8);
31+
});

test/unit/formidable.test.js

+96
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
/* eslint-disable no-underscore-dangle */
2+
3+
'use strict';
4+
5+
const path = require('path');
6+
// const assert = require('assert');
7+
const Request = require('http').ClientRequest;
8+
9+
// const test = require('utest');
10+
const mod = require('../../src/index');
11+
12+
function getForm(name, opts) {
13+
return name === 'formidable' ? mod.formidable(opts) : new mod[name](opts);
14+
}
15+
function makeHeader(filename) {
16+
return `Content-Disposition: form-data; name="upload"; filename="${filename}"`;
17+
}
18+
19+
['IncomingForm', 'Formidable', 'formidable'].forEach((name) => {
20+
test(`${name}#_fileName with regular characters`, () => {
21+
const filename = 'foo.txt';
22+
const form = getForm(name);
23+
24+
expect(form._fileName(makeHeader(filename))).toBe('foo.txt');
25+
});
26+
27+
test(`${name}#_fileName with unescaped quote`, () => {
28+
const filename = 'my".txt';
29+
const form = getForm(name);
30+
31+
expect(form._fileName(makeHeader(filename))).toBe('my".txt');
32+
});
33+
34+
test(`${name}#_fileName with escaped quote`, () => {
35+
const filename = 'my%22.txt';
36+
const form = getForm(name);
37+
38+
expect(form._fileName(makeHeader(filename))).toBe('my".txt');
39+
});
40+
41+
test(`${name}#_fileName with bad quote and additional sub-header`, () => {
42+
const filename = 'my".txt';
43+
const form = getForm(name);
44+
45+
const header = `${makeHeader(filename)}; foo="bar"`;
46+
expect(form._fileName(header)).toBe(filename);
47+
});
48+
49+
test(`${name}#_fileName with semicolon`, () => {
50+
const filename = 'my;.txt';
51+
const form = getForm(name);
52+
53+
expect(form._fileName(makeHeader(filename))).toBe('my;.txt');
54+
});
55+
56+
test(`${name}#_fileName with utf8 character`, () => {
57+
const filename = 'my&#9731;.txt';
58+
const form = getForm(name);
59+
60+
expect(form._fileName(makeHeader(filename))).toBe('my☃.txt');
61+
});
62+
63+
test(`${name}#_uploadPath strips harmful characters from extension when keepExtensions`, () => {
64+
const form = getForm(name, { keepExtensions: true });
65+
66+
let ext = path.extname(form._uploadPath('fine.jpg?foo=bar'));
67+
expect(ext).toBe('.jpg');
68+
69+
ext = path.extname(form._uploadPath('fine?foo=bar'));
70+
expect(ext).toBe('');
71+
72+
ext = path.extname(form._uploadPath('super.cr2+dsad'));
73+
expect(ext).toBe('.cr2');
74+
75+
ext = path.extname(form._uploadPath('super.bar'));
76+
expect(ext).toBe('.bar');
77+
78+
ext = path.extname(form._uploadPath('file.aAa'));
79+
expect(ext).toBe('.aAa');
80+
});
81+
82+
test(`${name}#_Array parameters support`, () => {
83+
const form = getForm(name, { multiples: true });
84+
85+
const req = new Request();
86+
req.headers = 'content-type: json; content-length:8';
87+
form.parse(req, (error, fields) => {
88+
expect(Array.isArray(fields.a)).toBe(true);
89+
expect(fields.a[0]).toBe(1);
90+
expect(fields.a[1]).toBe(2);
91+
});
92+
form.emit('field', 'a[]', 1);
93+
form.emit('field', 'a[]', 2);
94+
form.emit('end');
95+
});
96+
});

test/unit/multipart-parser.test.js

+73
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
'use strict';
2+
3+
const { MultipartParser } = require('../../src/index');
4+
5+
test('on constructor', () => {
6+
const parser = new MultipartParser();
7+
expect(parser.boundary).toBeNull();
8+
expect(parser.state).toBe(0);
9+
expect(parser.flags).toBe(0);
10+
expect(parser.boundaryChars).toBeNull();
11+
expect(parser.index).toBeNull();
12+
expect(parser.lookbehind).toBeNull();
13+
expect(parser.constructor.name).toBe('MultipartParser');
14+
});
15+
16+
test('initWithBoundary', () => {
17+
const boundary = 'abc';
18+
const parser = new MultipartParser();
19+
parser.initWithBoundary(boundary);
20+
21+
expect(Array.prototype.slice.call(parser.boundary)).toMatchObject([
22+
13,
23+
10,
24+
45,
25+
45,
26+
97,
27+
98,
28+
99,
29+
]);
30+
expect(parser.state).toBe(MultipartParser.STATES.START);
31+
32+
expect(parser.boundaryChars).toMatchObject({
33+
10: true,
34+
13: true,
35+
45: true,
36+
97: true,
37+
98: true,
38+
99: true,
39+
});
40+
});
41+
42+
test('initWithBoundary failing', () => {
43+
const parser = new MultipartParser();
44+
const boundary = 'abc';
45+
const buffer = Buffer.alloc(5);
46+
47+
parser.initWithBoundary(boundary);
48+
buffer.write('--ad', 0);
49+
expect(parser.bufferLength).toBe(0);
50+
51+
parser.write(buffer);
52+
expect(parser.bufferLength).toBe(5);
53+
});
54+
55+
test('on .end() throwing', () => {
56+
const parser = new MultipartParser();
57+
parser.once('error', () => {});
58+
59+
const res = parser.end();
60+
expect(res.state).toBe(0);
61+
62+
// expect(() => { parser.end() }).toThrow(/MultipartParser/);
63+
// expect(() => { parser.end() }).toThrow(/stream ended unexpectedly/);
64+
// expect(() => { parser.end() }).toThrow(parser.explain());
65+
});
66+
67+
test('on .end() successful', () => {
68+
const parser = new MultipartParser();
69+
parser.state = MultipartParser.STATES.END;
70+
71+
const res = parser.end();
72+
expect(res.state).toBe(12);
73+
});

test/unit/test-querystring-parser.js test/unit/querystring-parser.test.js

+10-16
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,27 @@
11
'use strict';
22

3-
const assert = require('assert');
43
const { QuerystringParser } = require('../../src/index');
54

6-
let parser;
7-
8-
function test(testFn) {
9-
parser = new QuerystringParser();
10-
testFn();
11-
}
12-
13-
test(function ctor() {
14-
assert.equal(parser.buffer, '');
15-
assert.equal(parser.constructor.name, 'QuerystringParser');
5+
test('on constructor', () => {
6+
const parser = new QuerystringParser();
7+
expect(parser.buffer).toBe('');
8+
expect(parser.constructor.name).toBe('QuerystringParser');
169
});
1710

18-
test(function write() {
11+
test('on .write', () => {
12+
const parser = new QuerystringParser();
1913
const a = Buffer.from('a=1');
2014
parser.write(a);
21-
assert.equal(parser.bufferLength, a.length);
15+
expect(parser.bufferLength).toBe(a.length);
2216

2317
const b = Buffer.from('&b=2');
2418
parser.write(b);
25-
assert.equal(parser.buffer, a + b);
26-
assert.equal(parser.bufferLength, a.length + b.length);
19+
expect(parser.buffer).toBe(a + b);
20+
expect(parser.bufferLength).toBe(a.length + b.length);
2721
});
2822

2923
// ! skip
30-
// test(function end() {
24+
// test(function end =>
3125
// const FIELDS = { a: ['b', { c: 'd' }], e: 'f' };
3226

3327
// gently.expect(GENTLY.hijacked.querystring, 'parse', (str) => {

test/unit/test-file.js

-36
This file was deleted.

test/unit/test-incoming-form.js

-96
This file was deleted.

0 commit comments

Comments
 (0)