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('File Upload Options Tests', function() {
|
10 | afterEach(function(done) {
|
11 | clearUploadsDir();
|
12 | done();
|
13 | });
|
14 |
|
15 | |
16 |
|
17 |
|
18 |
|
19 |
|
20 |
|
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 | });
|