@@ -218,4 +218,111 @@ describe('FilesController', () => {
218
218
expect ( gridFSAdapter . validateFilename ( fileName ) ) . not . toBe ( null ) ;
219
219
done ( ) ;
220
220
} ) ;
221
+
222
+ it ( 'should return valid filename or url from createFile response when provided' , async ( ) => {
223
+ const config = Config . get ( Parse . applicationId ) ;
224
+
225
+ // Test case 1: adapter returns new filename and url
226
+ const adapterWithReturn = {
227
+ createFile : ( ) => {
228
+ return Promise . resolve ( {
229
+ name : 'newfilename.txt' ,
230
+ url : 'http://new.url/newfilename.txt'
231
+ } ) ;
232
+ } ,
233
+ getFileLocation : ( ) => {
234
+ return Promise . resolve ( 'http://default.url/file.txt' ) ;
235
+ } ,
236
+ validateFilename : ( ) => null
237
+ } ;
238
+
239
+ const controllerWithReturn = new FilesController ( adapterWithReturn ) ;
240
+ const result1 = await controllerWithReturn . createFile (
241
+ config ,
242
+ 'originalfile.txt' ,
243
+ 'data' ,
244
+ 'text/plain'
245
+ ) ;
246
+
247
+ expect ( result1 . name ) . toBe ( 'newfilename.txt' ) ;
248
+ expect ( result1 . url ) . toBe ( 'http://new.url/newfilename.txt' ) ;
249
+
250
+ // Test case 2: adapter returns nothing, falling back to default behavior
251
+ const adapterWithoutReturn = {
252
+ createFile : ( ) => {
253
+ return Promise . resolve ( ) ;
254
+ } ,
255
+ getFileLocation : ( config , filename ) => {
256
+ return Promise . resolve ( `http://default.url/${ filename } ` ) ;
257
+ } ,
258
+ validateFilename : ( ) => null
259
+ } ;
260
+
261
+ const controllerWithoutReturn = new FilesController ( adapterWithoutReturn ) ;
262
+ const result2 = await controllerWithoutReturn . createFile (
263
+ config ,
264
+ 'originalfile.txt' ,
265
+ 'data' ,
266
+ 'text/plain' ,
267
+ { } ,
268
+ { preserveFileName : true } // To make filename predictable
269
+ ) ;
270
+
271
+ expect ( result2 . name ) . toBe ( 'originalfile.txt' ) ;
272
+ expect ( result2 . url ) . toBe ( 'http://default.url/originalfile.txt' ) ;
273
+
274
+ // Test case 3: adapter returns partial info (only url)
275
+ // This is a valid scenario, as the adapter may return a modified filename
276
+ // but may result in a mismatch between the filename and the resource URL
277
+ const adapterWithOnlyURL = {
278
+ createFile : ( ) => {
279
+ return Promise . resolve ( {
280
+ url : 'http://new.url/partialfile.txt'
281
+ } ) ;
282
+ } ,
283
+ getFileLocation : ( ) => {
284
+ return Promise . resolve ( 'http://default.url/file.txt' ) ;
285
+ } ,
286
+ validateFilename : ( ) => null
287
+ } ;
288
+
289
+ const controllerWithPartial = new FilesController ( adapterWithOnlyURL ) ;
290
+ const result3 = await controllerWithPartial . createFile (
291
+ config ,
292
+ 'originalfile.txt' ,
293
+ 'data' ,
294
+ 'text/plain' ,
295
+ { } ,
296
+ { preserveFileName : true } // To make filename predictable
297
+ ) ;
298
+
299
+ expect ( result3 . name ) . toBe ( 'originalfile.txt' ) ;
300
+ expect ( result3 . url ) . toBe ( 'http://new.url/partialfile.txt' ) ; // Technically, the resource does not need to match the filename
301
+
302
+ // Test case 4: adapter returns only filename
303
+ const adapterWithOnlyFilename = {
304
+ createFile : ( ) => {
305
+ return Promise . resolve ( {
306
+ name : 'newname.txt'
307
+ } ) ;
308
+ } ,
309
+ getFileLocation : ( config , filename ) => {
310
+ return Promise . resolve ( `http://default.url/${ filename } ` ) ;
311
+ } ,
312
+ validateFilename : ( ) => null
313
+ } ;
314
+
315
+ const controllerWithOnlyFilename = new FilesController ( adapterWithOnlyFilename ) ;
316
+ const result4 = await controllerWithOnlyFilename . createFile (
317
+ config ,
318
+ 'originalfile.txt' ,
319
+ 'data' ,
320
+ 'text/plain' ,
321
+ { } ,
322
+ { preserveFileName : true }
323
+ ) ;
324
+
325
+ expect ( result4 . name ) . toBe ( 'newname.txt' ) ;
326
+ expect ( result4 . url ) . toBe ( 'http://default.url/newname.txt' ) ;
327
+ } ) ;
221
328
} ) ;
0 commit comments