Skip to content

Commit 5bbf645

Browse files
committed
Add tests for fileupload options
Refactor server.js to allow for different options to be provided during testing Bumped the version number to 0.1.3
1 parent 26e009b commit 5bbf645

File tree

8 files changed

+266
-112
lines changed

8 files changed

+266
-112
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ Pass in non-Busboy options directly to the middleware. These are express-fileupl
121121
Option | Acceptable Values | Details
122122
--- | --- | ---
123123
safeFileNames | <ul><li><code>false</code>&nbsp;**(default)**</li><li><code>true</code></li><li>regex</li></ul> | Strips characters from the upload's filename. You can use custom regex to determine what to strip. If set to `true`, non-alphanumeric characters _except_ dashes and underscores will be stripped. This option is off by default.<br /><br />**Example #1 (strip slashes from file names):** `app.use(fileUpload({ safeFileNames: /\\/g }))`<br />**Example #2:** `app.use(fileUpload({ safeFileNames: true }))`
124-
preserveExtension | <ul><li><code>false</code>&nbsp;**(default)**</li><li><code>true</code></li><li><code>*Number*</code></li></ul> | Preserves filename extension when using <code>safeFileNames</code> option. If set to <code>true</code>, will default to an extension length of 3. If set to <code>*Number*</code>, this will be the max allowable extension length. If an extension is smaller than the extension length, it remains untouched. If the extension is longer, it is shifted.<br /><br />**Example #1 (true):**<br /><code>app.use(fileUpload({ safeFileNames: true, preserveExtension: true }));</code><br />*myFileName.ext* --> *myFileName.ext*<br /><br />**Example #2 (max extension length 2, extension truncated):**<br /><code>app.use(fileUpload({ safeFileNames: true, preserveExtension: 2 }));</code><br />*myFileName.ext* --> *myFileNamee.xt*
124+
preserveExtension | <ul><li><code>false</code>&nbsp;**(default)**</li><li><code>true</code></li><li><code>*Number*</code></li></ul> | Preserves filename extension when using <code>safeFileNames</code> option. If set to <code>true</code>, will default to an extension length of 3. If set to <code>*Number*</code>, this will be the max allowable extension length. If an extension is smaller than the extension length, it remains untouched. If the extension is longer, it is shifted.<br /><br />**Example #1 (true):**<br /><code>app.use(fileUpload({ safeFileNames: true, preserveExtension: true }));</code><br />*myFileName.ext* --> *myFileName.ext*<br /><br />**Example #2 (max extension length 2, extension shifted):**<br /><code>app.use(fileUpload({ safeFileNames: true, preserveExtension: 2 }));</code><br />*myFileName.ext* --> *myFileNamee.xt*
125125

126126
# Help Wanted
127127
Pull Requests are welcomed!

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "express-fileupload",
3-
"version": "0.1.2",
3+
"version": "0.1.3",
44
"author": "Richard Girges <[email protected]>",
55
"description": "Simple express file upload middleware that wraps around Busboy",
66
"main": "./lib/index",

test/files/basket.ball.bp

151 KB
Binary file not shown.

test/files/my$Invalid#fileName.png123

263 KB
Binary file not shown.

test/multipartFields.spec.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
const request = require('supertest');
44
const server = require('./server');
5-
const app = server.app;
5+
const app = server.setup();
66

77
let mockUser = {
88
firstName: 'Joe',

test/multipartUploads.spec.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ const fs = require('fs');
44
const path = require('path');
55
const request = require('supertest');
66
const server = require('./server');
7-
const app = server.app;
7+
const app = server.setup();
88
const clearUploadsDir = server.clearUploadsDir;
99
const fileDir = server.fileDir;
1010
const uploadDir = server.uploadDir;
@@ -212,4 +212,4 @@ describe('Test Upload With Fields', function() {
212212
});
213213
});
214214
}
215-
});
215+
});

test/options.spec.js

Lines changed: 151 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,151 @@
1+
const fs = require('fs');
2+
const path = require('path');
3+
const request = require('supertest');
4+
const server = require('./server');
5+
// const clearUploadsDir = server.clearUploadsDir;
6+
const fileDir = server.fileDir;
7+
const uploadDir = server.uploadDir;
8+
9+
describe('SafeFileNames', function() {
10+
it(`Does nothing to your filename when disabled.`, function(done) {
11+
const app = server.setup({safeFileNames: false});
12+
13+
request(app)
14+
.post('/upload/single')
15+
.attach('testFile', path.join(fileDir, 'my$Invalid#fileName.png123'))
16+
.expect(200)
17+
.end(function(err, res) {
18+
if (err)
19+
return done(err);
20+
21+
let uploadedFilePath = path.join(uploadDir, 'my$Invalid#fileName.png123');
22+
23+
fs.stat(uploadedFilePath, done);
24+
});
25+
});
26+
27+
it(`Strips away all illegal characters (including spaces) when enabled.`, function(done) {
28+
const app = server.setup({safeFileNames: true});
29+
30+
request(app)
31+
.post('/upload/single')
32+
.attach('testFile', path.join(fileDir, 'my$Invalid#fileName.png123'))
33+
.expect(200)
34+
.end(function(err, res) {
35+
if (err)
36+
return done(err);
37+
38+
let uploadedFilePath = path.join(uploadDir, 'myInvalidfileNamepng123');
39+
40+
fs.stat(uploadedFilePath, done);
41+
});
42+
});
43+
44+
it(`Respects a regex for stripping 'invalid' characters from filename.`, function(done) {
45+
const app = server.setup({safeFileNames: /[\$#]/g});
46+
47+
request(app)
48+
.post('/upload/single')
49+
.attach('testFile', path.join(fileDir, 'my$Invalid#fileName.png123'))
50+
.expect(200)
51+
.end(function(err, res) {
52+
if (err)
53+
return done(err);
54+
55+
let uploadedFilePath = path.join(uploadDir, 'myInvalidfileName.png123');
56+
57+
fs.stat(uploadedFilePath, done);
58+
});
59+
});
60+
});
61+
62+
describe(`preserveExtension`, function() {
63+
it(`Does nothing to your filename when disabled.`, function(done) {
64+
const app = server.setup({safeFileNames: true, preserveExtension: false});
65+
66+
request(app)
67+
.post('/upload/single')
68+
.attach('testFile', path.join(fileDir, 'my$Invalid#fileName.png123'))
69+
.expect(200)
70+
.end(function(err, res) {
71+
if (err)
72+
return done(err);
73+
74+
let uploadedFilePath = path.join(uploadDir, 'myInvalidfileNamepng123');
75+
76+
fs.stat(uploadedFilePath, done);
77+
});
78+
});
79+
80+
it(`Shortens your extension to the default(3) when enabled, if the extension found is larger`,
81+
function(done) {
82+
const app = server.setup({safeFileNames: true, preserveExtension: true});
83+
84+
request(app)
85+
.post('/upload/single')
86+
.attach('testFile', path.join(fileDir, 'my$Invalid#fileName.png123'))
87+
.expect(200)
88+
.end(function(err, res) {
89+
if (err)
90+
return done(err);
91+
92+
let uploadedFilePath = path.join(uploadDir, 'myInvalidfileNamepng.123');
93+
94+
fs.stat(uploadedFilePath, done);
95+
});
96+
});
97+
98+
it(`Leaves your extension alone when enabled, if the extension found is <= default(3) length`,
99+
function(done) {
100+
const app = server.setup({safeFileNames: true, preserveExtension: true});
101+
102+
request(app)
103+
.post('/upload/single')
104+
.attach('testFile', path.join(fileDir, 'car.png'))
105+
.expect(200)
106+
.end(function(err, res) {
107+
if (err)
108+
return done(err);
109+
110+
let uploadedFilePath = path.join(uploadDir, 'car.png');
111+
112+
fs.stat(uploadedFilePath, done);
113+
});
114+
});
115+
116+
it(`Leaves your extension alone when set to a number >= the extension length.`,
117+
function(done) {
118+
const app = server.setup({safeFileNames: true, preserveExtension: 7});
119+
120+
request(app)
121+
.post('/upload/single')
122+
.attach('testFile', path.join(fileDir, 'my$Invalid#fileName.png123'))
123+
.expect(200)
124+
.end(function(err, res) {
125+
if (err)
126+
return done(err);
127+
128+
let uploadedFilePath = path.join(uploadDir, 'myInvalidfileName.png123');
129+
130+
fs.stat(uploadedFilePath, done);
131+
});
132+
});
133+
134+
it(`Only considers the last dotted part the extension.`,
135+
function(done) {
136+
const app = server.setup({safeFileNames: true, preserveExtension: true});
137+
138+
request(app)
139+
.post('/upload/single')
140+
.attach('testFile', path.join(fileDir, 'basket.ball.bp'))
141+
.expect(200)
142+
.end(function(err, res) {
143+
if (err)
144+
return done(err);
145+
146+
let uploadedFilePath = path.join(uploadDir, 'basketball.bp');
147+
148+
fs.stat(uploadedFilePath, done);
149+
});
150+
});
151+
});

0 commit comments

Comments
 (0)