UNPKG

8.62 kBJavaScriptView Raw
1const fs = require('fs');
2const path = require('path');
3const request = require('supertest');
4const server = require('./server');
5const clearUploadsDir = server.clearUploadsDir;
6const fileDir = server.fileDir;
7const uploadDir = server.uploadDir;
8
9describe('File Upload Options Tests', function() {
10 afterEach(function(done) {
11 clearUploadsDir();
12 done();
13 });
14
15 /**
16 * Upload the file for testing and verify the expected filename.
17 * @param {object} options The expressFileUpload options.
18 * @param {string} actualFileNameToUpload The name of the file to upload.
19 * @param {string} expectedFileNameOnFileSystem The name of the file after upload.
20 * @param {function} done The mocha continuation function.
21 */
22 function executeFileUploadTestWalk(options,
23 actualFileNameToUpload,
24 expectedFileNameOnFileSystem,
25 done) {
26 request(server.setup(options))
27 .post('/upload/single')
28 .attach('testFile', path.join(fileDir, actualFileNameToUpload))
29 .expect(200)
30 .end(function(err) {
31 if (err) {
32 return done(err);
33 }
34
35 const uploadedFilePath = path.join(uploadDir, expectedFileNameOnFileSystem);
36
37 fs.stat(uploadedFilePath, done);
38 });
39 }
40
41 describe('Testing [safeFileNames] option to ensure:', function() {
42 it('Does nothing to your filename when disabled.',
43 function(done) {
44 const fileUploadOptions = {safeFileNames: false};
45 const actualFileName = 'my$Invalid#fileName.png123';
46 const expectedFileName = 'my$Invalid#fileName.png123';
47
48 executeFileUploadTestWalk(fileUploadOptions, actualFileName, expectedFileName, done);
49 });
50
51 it('Is disabled by default.',
52 function(done) {
53 const fileUploadOptions = null;
54 const actualFileName = 'my$Invalid#fileName.png123';
55 const expectedFileName = 'my$Invalid#fileName.png123';
56
57 executeFileUploadTestWalk(fileUploadOptions, actualFileName, expectedFileName, done);
58 });
59
60 it('Strips away all non-alphanumeric characters (excluding hyphens/underscores) when enabled.',
61 function(done) {
62 const fileUploadOptions = {safeFileNames: true};
63 const actualFileName = 'my$Invalid#fileName.png123';
64 const expectedFileName = 'myInvalidfileNamepng123';
65
66 executeFileUploadTestWalk(fileUploadOptions, actualFileName, expectedFileName, done);
67 });
68
69 it('Accepts a regex for stripping (decidedly) "invalid" characters from filename.',
70 function(done) {
71 const fileUploadOptions = {safeFileNames: /[$#]/g};
72 const actualFileName = 'my$Invalid#fileName.png123';
73 const expectedFileName = 'myInvalidfileName.png123';
74
75 executeFileUploadTestWalk(fileUploadOptions, actualFileName, expectedFileName, done);
76 });
77 });
78
79 describe('Testing [preserveExtension] option to ensure:', function() {
80 it('Does not preserve the extension of your filename when disabled.',
81 function(done) {
82 const fileUploadOptions = {safeFileNames: true, preserveExtension: false};
83 const actualFileName = 'my$Invalid#fileName.png123';
84 const expectedFileName = 'myInvalidfileNamepng123';
85
86 executeFileUploadTestWalk(fileUploadOptions, actualFileName, expectedFileName, done);
87 });
88
89 it('Is disabled by default.',
90 function(done) {
91 const fileUploadOptions = {safeFileNames: true};
92 const actualFileName = 'my$Invalid#fileName.png123';
93 const expectedFileName = 'myInvalidfileNamepng123';
94
95 executeFileUploadTestWalk(fileUploadOptions, actualFileName, expectedFileName, done);
96 });
97
98 it('Shortens your extension to the default(3) when enabled, if the extension found is larger.',
99 function(done) {
100 const fileUploadOptions = {safeFileNames: true, preserveExtension: true};
101 const actualFileName = 'my$Invalid#fileName.png123';
102 const expectedFileName = 'myInvalidfileNamepng.123';
103
104 executeFileUploadTestWalk(fileUploadOptions, actualFileName, expectedFileName, done);
105 });
106
107 it('Leaves your extension alone when enabled, if the extension found is <= default(3) length',
108 function(done) {
109 const fileUploadOptions = {safeFileNames: true, preserveExtension: true};
110 const actualFileName = 'car.png';
111 const expectedFileName = 'car.png';
112
113 executeFileUploadTestWalk(fileUploadOptions, actualFileName, expectedFileName, done);
114 });
115
116 it('Can be configured for an extension length > default(3).',
117 function(done) {
118 const fileUploadOptions = {safeFileNames: true, preserveExtension: 7};
119 const actualFileName = 'my$Invalid#fileName.png123';
120 const expectedFileName = 'myInvalidfileName.png123';
121
122 executeFileUploadTestWalk(fileUploadOptions, actualFileName, expectedFileName, done);
123 });
124
125 it('Can be configured for an extension length < default(3).',
126 function(done) {
127 const fileUploadOptions = {safeFileNames: true, preserveExtension: 2};
128 const actualFileName = 'my$Invalid#fileName.png123';
129 const expectedFileName = 'myInvalidfileNamepng1.23';
130
131 executeFileUploadTestWalk(fileUploadOptions, actualFileName, expectedFileName, done);
132 });
133
134 it('Will use the absolute value of your extension length when negative.',
135 function(done) {
136 const fileUploadOptions = {safeFileNames: true, preserveExtension: -5};
137 const actualFileName = 'my$Invalid#fileName.png123';
138 const expectedFileName = 'myInvalidfileNamep.ng123';
139
140 executeFileUploadTestWalk(fileUploadOptions, actualFileName, expectedFileName, done);
141 });
142
143 it('Will leave no extension when the extension length == 0.',
144 function(done) {
145 const fileUploadOptions = {safeFileNames: true, preserveExtension: 0};
146 const actualFileName = 'car.png';
147 const expectedFileName = 'car';
148
149 executeFileUploadTestWalk(fileUploadOptions, actualFileName, expectedFileName, done);
150 });
151
152 it('Will accept numbers as strings, if they can be resolved with parseInt.',
153 function(done) {
154 const fileUploadOptions = {safeFileNames: true, preserveExtension: '3'};
155 const actualFileName = 'my$Invalid#fileName.png123';
156 const expectedFileName = 'myInvalidfileNamepng.123';
157
158 executeFileUploadTestWalk(fileUploadOptions, actualFileName, expectedFileName, done);
159 });
160
161 it('Will be evaluated for truthy-ness if it cannot be parsed as an int.',
162 function(done) {
163 const fileUploadOptions = {safeFileNames: true, preserveExtension: 'not-a-#-but-truthy'};
164 const actualFileName = 'my$Invalid#fileName.png123';
165 const expectedFileName = 'myInvalidfileNamepng.123';
166
167 executeFileUploadTestWalk(fileUploadOptions, actualFileName, expectedFileName, done);
168 });
169
170 it('Will ignore any decimal amount when evaluating for extension length.',
171 function(done) {
172 const fileUploadOptions = {safeFileNames: true, preserveExtension: 4.98};
173 const actualFileName = 'my$Invalid#fileName.png123';
174 const expectedFileName = 'myInvalidfileNamepn.g123';
175
176 executeFileUploadTestWalk(fileUploadOptions, actualFileName, expectedFileName, done);
177 });
178
179 it('Only considers the last dotted part as the extension.',
180 function(done) {
181 const fileUploadOptions = {safeFileNames: true, preserveExtension: true};
182 const actualFileName = 'basket.ball.bp';
183 const expectedFileName = 'basketball.bp';
184
185 executeFileUploadTestWalk(fileUploadOptions, actualFileName, expectedFileName, done);
186 });
187 });
188
189 describe('Testing [parseNested] option to ensure:', function() {
190 it('When [parseNested] is enabled result are nested', function(done){
191 const app = server.setup({parseNested: true});
192 request(app)
193 .post('/fields/nested')
194 .field('name', 'John')
195 .field('hobbies[0]', 'Cinema')
196 .field('hobbies[1]', 'Bike')
197 .expect('Content-Type', /json/)
198 .expect(200, {
199 name: 'John',
200 hobbies: ['Cinema', 'Bike']
201 }, done);
202 });
203
204 it('When [parseNested] is disabled are flattened', function(done){
205 const app = server.setup({parseNested: false});
206 request(app)
207 .post('/fields/flattened')
208 .field('name', 'John')
209 .field('hobbies[0]', 'Cinema')
210 .field('hobbies[1]', 'Bike')
211 .expect('Content-Type', /json/)
212 .expect(200, {
213 name: 'John',
214 'hobbies[0]': 'Cinema',
215 'hobbies[1]': 'Bike'
216 }, done);
217 });
218 });
219});