| 
									
										
										
										
											2022-03-22 18:19:46 +01:00
										 |  |  | 'use strict'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-26 11:23:07 +02:00
										 |  |  | const fs = require('fs'); | 
					
						
							|  |  |  | const path = require('path'); | 
					
						
							| 
									
										
										
										
											2022-03-22 18:19:46 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-05 15:35:52 +02:00
										 |  |  | const { pick, map } = require('lodash/fp'); | 
					
						
							| 
									
										
										
										
											2022-03-22 18:19:46 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | const { createTestBuilder } = require('../../../../../test/helpers/builder'); | 
					
						
							|  |  |  | const { createStrapiInstance } = require('../../../../../test/helpers/strapi'); | 
					
						
							|  |  |  | const { createAuthRequest } = require('../../../../../test/helpers/request'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | let strapi; | 
					
						
							|  |  |  | let rq; | 
					
						
							| 
									
										
										
										
											2022-08-08 15:50:34 +02:00
										 |  |  | const data = { | 
					
						
							| 
									
										
										
										
											2022-03-22 18:19:46 +01:00
										 |  |  |   folders: [], | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-03 16:21:52 +02:00
										 |  |  | const rootPathRegex = /^\/[0-9]*$/i; | 
					
						
							| 
									
										
										
										
											2022-08-08 23:33:39 +02:00
										 |  |  | const getFolderPathRegex = (pathId) => new RegExp(`^/${pathId}/[0-9]*$`, 'i'); | 
					
						
							| 
									
										
										
										
											2022-04-05 17:36:09 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-26 11:23:07 +02:00
										 |  |  | const createFolder = async (name, parent = null) => { | 
					
						
							|  |  |  |   const res = await rq({ | 
					
						
							|  |  |  |     method: 'POST', | 
					
						
							|  |  |  |     url: '/upload/folders', | 
					
						
							|  |  |  |     body: { name, parent }, | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  |   return res.body.data; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const createAFile = async (parent = null) => { | 
					
						
							|  |  |  |   const res = await rq({ | 
					
						
							|  |  |  |     method: 'POST', | 
					
						
							|  |  |  |     url: '/upload', | 
					
						
							|  |  |  |     formData: { | 
					
						
							|  |  |  |       files: fs.createReadStream(path.join(__dirname, '../utils/rec.jpg')), | 
					
						
							|  |  |  |       fileInfo: JSON.stringify({ folder: parent }), | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  |   return res.body[0]; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-22 18:19:46 +01:00
										 |  |  | describe('Folder', () => { | 
					
						
							|  |  |  |   const builder = createTestBuilder(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   beforeAll(async () => { | 
					
						
							|  |  |  |     strapi = await createStrapiInstance(); | 
					
						
							|  |  |  |     rq = await createAuthRequest({ strapi }); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   afterAll(async () => { | 
					
						
							| 
									
										
										
										
											2022-04-07 18:00:21 +02:00
										 |  |  |     await rq({ | 
					
						
							|  |  |  |       method: 'POST', | 
					
						
							| 
									
										
										
										
											2022-04-26 11:23:07 +02:00
										 |  |  |       url: '/upload/actions/bulk-delete', | 
					
						
							| 
									
										
										
										
											2022-04-07 18:00:21 +02:00
										 |  |  |       body: { | 
					
						
							| 
									
										
										
										
											2022-08-08 23:33:39 +02:00
										 |  |  |         folderIds: data.folders.map((f) => f.id), | 
					
						
							| 
									
										
										
										
											2022-04-07 18:00:21 +02:00
										 |  |  |       }, | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-22 18:19:46 +01:00
										 |  |  |     await strapi.destroy(); | 
					
						
							|  |  |  |     await builder.cleanup(); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   describe('create', () => { | 
					
						
							|  |  |  |     test('Can create a folder at root level', async () => { | 
					
						
							|  |  |  |       const res = await rq({ | 
					
						
							|  |  |  |         method: 'POST', | 
					
						
							| 
									
										
										
										
											2022-05-05 15:35:52 +02:00
										 |  |  |         url: '/upload/folders', | 
					
						
							| 
									
										
										
										
											2022-03-22 18:19:46 +01:00
										 |  |  |         body: { | 
					
						
							| 
									
										
										
										
											2022-03-28 16:51:11 +02:00
										 |  |  |           name: 'folder 1', | 
					
						
							| 
									
										
										
										
											2022-03-22 18:19:46 +01:00
										 |  |  |           parent: null, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-04 14:32:08 +02:00
										 |  |  |       expect(res.status).toBe(200); | 
					
						
							| 
									
										
										
										
											2022-03-22 18:19:46 +01:00
										 |  |  |       expect(res.body.data).toMatchObject({ | 
					
						
							|  |  |  |         id: expect.anything(), | 
					
						
							| 
									
										
										
										
											2022-03-28 16:51:11 +02:00
										 |  |  |         name: 'folder 1', | 
					
						
							| 
									
										
										
										
											2022-06-03 16:21:52 +02:00
										 |  |  |         pathId: expect.any(Number), | 
					
						
							| 
									
										
										
										
											2022-04-12 16:32:05 +02:00
										 |  |  |         path: expect.stringMatching(rootPathRegex), | 
					
						
							| 
									
										
										
										
											2022-03-22 18:19:46 +01:00
										 |  |  |         createdAt: expect.anything(), | 
					
						
							|  |  |  |         updatedAt: expect.anything(), | 
					
						
							|  |  |  |       }); | 
					
						
							| 
									
										
										
										
											2022-06-03 16:21:52 +02:00
										 |  |  |       expect(res.body.data.pathId.toString()).toBe(res.body.data.path.split('/').pop()); | 
					
						
							| 
									
										
										
										
											2022-03-22 18:19:46 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-05 15:35:52 +02:00
										 |  |  |       data.folders.push(res.body.data); | 
					
						
							| 
									
										
										
										
											2022-03-22 18:19:46 +01:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-04 14:32:08 +02:00
										 |  |  |     test('Can create a folder inside another folder', async () => { | 
					
						
							|  |  |  |       const res = await rq({ | 
					
						
							|  |  |  |         method: 'POST', | 
					
						
							| 
									
										
										
										
											2022-05-05 15:35:52 +02:00
										 |  |  |         url: '/upload/folders', | 
					
						
							| 
									
										
										
										
											2022-04-04 14:32:08 +02:00
										 |  |  |         body: { | 
					
						
							|  |  |  |           name: 'folder-2', | 
					
						
							|  |  |  |           parent: data.folders[0].id, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       expect(res.body.data).toMatchObject({ | 
					
						
							|  |  |  |         id: expect.anything(), | 
					
						
							|  |  |  |         name: 'folder-2', | 
					
						
							| 
									
										
										
										
											2022-06-03 16:21:52 +02:00
										 |  |  |         pathId: expect.any(Number), | 
					
						
							|  |  |  |         path: expect.stringMatching(getFolderPathRegex(data.folders[0].pathId)), | 
					
						
							| 
									
										
										
										
											2022-04-04 14:32:08 +02:00
										 |  |  |         createdAt: expect.anything(), | 
					
						
							|  |  |  |         updatedAt: expect.anything(), | 
					
						
							|  |  |  |       }); | 
					
						
							| 
									
										
										
										
											2022-06-03 16:21:52 +02:00
										 |  |  |       expect(res.body.data.pathId.toString()).toBe(res.body.data.path.split('/').pop()); | 
					
						
							| 
									
										
										
										
											2022-04-04 14:32:08 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-05 15:35:52 +02:00
										 |  |  |       data.folders.push(res.body.data); | 
					
						
							| 
									
										
										
										
											2022-04-04 14:32:08 +02:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-22 18:19:46 +01:00
										 |  |  |     test('Cannot create a folder with duplicated name at root level', async () => { | 
					
						
							|  |  |  |       const res = await rq({ | 
					
						
							|  |  |  |         method: 'POST', | 
					
						
							| 
									
										
										
										
											2022-05-05 15:35:52 +02:00
										 |  |  |         url: '/upload/folders', | 
					
						
							| 
									
										
										
										
											2022-03-22 18:19:46 +01:00
										 |  |  |         body: { | 
					
						
							| 
									
										
										
										
											2022-03-28 16:51:11 +02:00
										 |  |  |           name: 'folder 1', | 
					
						
							| 
									
										
										
										
											2022-03-22 18:19:46 +01:00
										 |  |  |           parent: null, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       expect(res.status).toBe(400); | 
					
						
							| 
									
										
										
										
											2022-05-13 16:10:18 +02:00
										 |  |  |       expect(res.body.error.message).toBe('A folder with this name already exists'); | 
					
						
							| 
									
										
										
										
											2022-03-22 18:19:46 +01:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-04 14:32:08 +02:00
										 |  |  |     test('Cannot create a folder with duplicated name inside a folder', async () => { | 
					
						
							|  |  |  |       const res = await rq({ | 
					
						
							|  |  |  |         method: 'POST', | 
					
						
							| 
									
										
										
										
											2022-05-05 15:35:52 +02:00
										 |  |  |         url: '/upload/folders', | 
					
						
							| 
									
										
										
										
											2022-04-04 14:32:08 +02:00
										 |  |  |         body: { | 
					
						
							|  |  |  |           name: 'folder-2', | 
					
						
							| 
									
										
										
										
											2022-04-26 11:23:07 +02:00
										 |  |  |           parent: data.folders[0].id, | 
					
						
							| 
									
										
										
										
											2022-04-04 14:32:08 +02:00
										 |  |  |         }, | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       expect(res.status).toBe(400); | 
					
						
							| 
									
										
										
										
											2022-05-13 16:10:18 +02:00
										 |  |  |       expect(res.body.error.message).toBe('A folder with this name already exists'); | 
					
						
							| 
									
										
										
										
											2022-04-04 14:32:08 +02:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-26 11:23:07 +02:00
										 |  |  |     test('Cannot create a folder inside a folder that does not exist', async () => { | 
					
						
							|  |  |  |       const res = await rq({ | 
					
						
							|  |  |  |         method: 'POST', | 
					
						
							| 
									
										
										
										
											2022-05-05 15:35:52 +02:00
										 |  |  |         url: '/upload/folders', | 
					
						
							| 
									
										
										
										
											2022-04-26 11:23:07 +02:00
										 |  |  |         body: { | 
					
						
							|  |  |  |           name: 'folder-3', | 
					
						
							|  |  |  |           parent: 99999, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       expect(res.status).toBe(400); | 
					
						
							|  |  |  |       expect(res.body.error.message).toBe('parent folder does not exist'); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-28 16:51:11 +02:00
										 |  |  |     test('Cannot create a folder with name containing a slash', async () => { | 
					
						
							| 
									
										
										
										
											2022-03-22 18:19:46 +01:00
										 |  |  |       const res = await rq({ | 
					
						
							|  |  |  |         method: 'POST', | 
					
						
							| 
									
										
										
										
											2022-05-05 15:35:52 +02:00
										 |  |  |         url: '/upload/folders', | 
					
						
							| 
									
										
										
										
											2022-03-22 18:19:46 +01:00
										 |  |  |         body: { | 
					
						
							| 
									
										
										
										
											2022-03-28 16:51:11 +02:00
										 |  |  |           name: 'folder 1/2', | 
					
						
							| 
									
										
										
										
											2022-03-22 18:19:46 +01:00
										 |  |  |           parent: null, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       expect(res.status).toBe(400); | 
					
						
							|  |  |  |       expect(res.body.error.message).toBe('name cannot contain slashes'); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-28 16:51:11 +02:00
										 |  |  |     test.each([[' abc'], [' abc '], ['abc '], ['   abc    '], ['   abc    ']])( | 
					
						
							| 
									
										
										
										
											2022-04-04 14:32:08 +02:00
										 |  |  |       'Cannot create a folder with name starting or ending with a whitespace (%p)', | 
					
						
							| 
									
										
										
										
											2022-08-08 23:33:39 +02:00
										 |  |  |       async (name) => { | 
					
						
							| 
									
										
										
										
											2022-03-28 16:51:11 +02:00
										 |  |  |         const res = await rq({ | 
					
						
							|  |  |  |           method: 'POST', | 
					
						
							| 
									
										
										
										
											2022-05-05 15:35:52 +02:00
										 |  |  |           url: '/upload/folders', | 
					
						
							| 
									
										
										
										
											2022-03-28 16:51:11 +02:00
										 |  |  |           body: { | 
					
						
							|  |  |  |             name, | 
					
						
							|  |  |  |             parent: null, | 
					
						
							|  |  |  |           }, | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         expect(res.status).toBe(400); | 
					
						
							|  |  |  |         expect(res.body.error.message).toBe('name cannot start or end with a whitespace'); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     ); | 
					
						
							| 
									
										
										
										
											2022-03-22 18:19:46 +01:00
										 |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   describe('read', () => { | 
					
						
							| 
									
										
										
										
											2022-05-05 18:44:50 +02:00
										 |  |  |     test('Can read a folder', async () => { | 
					
						
							|  |  |  |       const res = await rq({ | 
					
						
							|  |  |  |         method: 'GET', | 
					
						
							|  |  |  |         url: `/upload/folders/${data.folders[0].id}`, | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       expect(res.body.data).toMatchObject({ | 
					
						
							| 
									
										
										
										
											2022-06-03 16:21:52 +02:00
										 |  |  |         ...pick(['id', 'name', 'pathId', 'path', 'createAt', 'updatedAt'], data.folders[0]), | 
					
						
							| 
									
										
										
										
											2022-05-05 18:44:50 +02:00
										 |  |  |         children: { | 
					
						
							|  |  |  |           count: expect.anything(), | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         files: { | 
					
						
							|  |  |  |           count: expect.anything(), | 
					
						
							|  |  |  |         }, | 
					
						
							| 
									
										
										
										
											2022-06-14 15:54:45 +01:00
										 |  |  |       }); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     test('Can read a folder & populate its parent', async () => { | 
					
						
							|  |  |  |       const res = await rq({ | 
					
						
							|  |  |  |         method: 'GET', | 
					
						
							|  |  |  |         url: `/upload/folders/${data.folders[1].id}`, | 
					
						
							|  |  |  |         qs: { | 
					
						
							|  |  |  |           populate: 'parent', | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       expect(res.body.data).toMatchObject({ | 
					
						
							|  |  |  |         ...pick(['id', 'name', 'pathId', 'path', 'createAt', 'updatedAt'], data.folders[1]), | 
					
						
							|  |  |  |         parent: { | 
					
						
							|  |  |  |           id: expect.any(Number), | 
					
						
							|  |  |  |         }, | 
					
						
							| 
									
										
										
										
											2022-05-05 18:44:50 +02:00
										 |  |  |       }); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     test('Return 404 when folder does not exist', async () => { | 
					
						
							|  |  |  |       const res = await rq({ | 
					
						
							|  |  |  |         method: 'GET', | 
					
						
							|  |  |  |         url: '/upload/folders/99999', | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       expect(res.status).toBe(404); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-22 18:19:46 +01:00
										 |  |  |     test('Can read folders', async () => { | 
					
						
							|  |  |  |       const res = await rq({ | 
					
						
							|  |  |  |         method: 'GET', | 
					
						
							|  |  |  |         url: '/upload/folders', | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-19 14:47:23 +02:00
										 |  |  |       expect(res.body.data).toEqual( | 
					
						
							| 
									
										
										
										
											2022-03-22 18:19:46 +01:00
										 |  |  |         expect.arrayContaining([ | 
					
						
							|  |  |  |           { | 
					
						
							| 
									
										
										
										
											2022-04-05 17:36:09 +02:00
										 |  |  |             ...data.folders[0], | 
					
						
							| 
									
										
										
										
											2022-03-22 18:19:46 +01:00
										 |  |  |             children: { count: 1 }, | 
					
						
							|  |  |  |             files: { count: 0 }, | 
					
						
							|  |  |  |           }, | 
					
						
							|  |  |  |           { | 
					
						
							| 
									
										
										
										
											2022-04-05 17:36:09 +02:00
										 |  |  |             ...data.folders[1], | 
					
						
							| 
									
										
										
										
											2022-03-22 18:19:46 +01:00
										 |  |  |             children: { count: 0 }, | 
					
						
							| 
									
										
										
										
											2022-03-22 18:57:50 +01:00
										 |  |  |             files: { count: 0 }, | 
					
						
							| 
									
										
										
										
											2022-03-22 18:19:46 +01:00
										 |  |  |           }, | 
					
						
							|  |  |  |         ]) | 
					
						
							|  |  |  |       ); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |   }); | 
					
						
							| 
									
										
										
										
											2022-04-04 14:32:08 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-29 09:51:55 +02:00
										 |  |  |   describe('update', () => { | 
					
						
							| 
									
										
										
										
											2022-05-19 14:09:54 +02:00
										 |  |  |     test('Return 404 when folder does not exist', async () => { | 
					
						
							|  |  |  |       const res = await rq({ | 
					
						
							|  |  |  |         method: 'PUT', | 
					
						
							|  |  |  |         url: '/upload/folders/99999', | 
					
						
							|  |  |  |         body: { | 
					
						
							|  |  |  |           name: 'new name', | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       expect(res.status).toBe(404); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     test('Rename a folder', async () => { | 
					
						
							| 
									
										
										
										
											2022-04-29 09:51:55 +02:00
										 |  |  |       const folder = await createFolder('folder-name', null); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const res = await rq({ | 
					
						
							|  |  |  |         method: 'PUT', | 
					
						
							|  |  |  |         url: `/upload/folders/${folder.id}`, | 
					
						
							|  |  |  |         body: { | 
					
						
							|  |  |  |           name: 'new name', | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       expect(res.body.data).toMatchObject({ | 
					
						
							|  |  |  |         name: 'new name', | 
					
						
							|  |  |  |         path: folder.path, | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |       data.folders.push(res.body.data); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-19 14:09:54 +02:00
										 |  |  |     test('Cannot move and rename a folder if duplicated', async () => { | 
					
						
							| 
									
										
										
										
											2022-04-29 09:51:55 +02:00
										 |  |  |       const folder0 = await createFolder('folder-a-0', null); | 
					
						
							|  |  |  |       const folder1 = await createFolder('folder-a-1', null); | 
					
						
							| 
									
										
										
										
											2022-05-02 10:35:48 +02:00
										 |  |  |       const folder00 = await createFolder('folder-a-00', folder0.id); | 
					
						
							|  |  |  |       data.folders.push(folder0, folder1, folder00); | 
					
						
							| 
									
										
										
										
											2022-04-29 09:51:55 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |       const res = await rq({ | 
					
						
							|  |  |  |         method: 'PUT', | 
					
						
							|  |  |  |         url: `/upload/folders/${folder1.id}`, | 
					
						
							|  |  |  |         body: { | 
					
						
							|  |  |  |           name: 'folder-a-00', | 
					
						
							|  |  |  |           parent: folder0.id, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       expect(res.status).toBe(400); | 
					
						
							| 
									
										
										
										
											2022-05-13 16:10:18 +02:00
										 |  |  |       expect(res.body.error.message).toBe('A folder with this name already exists'); | 
					
						
							| 
									
										
										
										
											2022-05-02 16:31:27 +02:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-19 14:09:54 +02:00
										 |  |  |     test('Cannot move a folder if duplicated', async () => { | 
					
						
							| 
									
										
										
										
											2022-05-02 16:31:27 +02:00
										 |  |  |       const folder0 = await createFolder('folder-b-0', null); | 
					
						
							|  |  |  |       const folder1 = await createFolder('folder-b-samename', null); | 
					
						
							|  |  |  |       await createFolder('folder-b-samename', folder0.id); | 
					
						
							|  |  |  |       data.folders.push(folder0, folder1); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const res = await rq({ | 
					
						
							|  |  |  |         method: 'PUT', | 
					
						
							|  |  |  |         url: `/upload/folders/${folder1.id}`, | 
					
						
							|  |  |  |         body: { | 
					
						
							|  |  |  |           parent: folder0.id, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       expect(res.status).toBe(400); | 
					
						
							| 
									
										
										
										
											2022-05-13 16:10:18 +02:00
										 |  |  |       expect(res.body.error.message).toBe('A folder with this name already exists'); | 
					
						
							| 
									
										
										
										
											2022-04-29 09:51:55 +02:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-19 14:09:54 +02:00
										 |  |  |     test('Cannot move a folder to a folder that does not exist', async () => { | 
					
						
							| 
									
										
										
										
											2022-05-02 16:31:27 +02:00
										 |  |  |       const folder = await createFolder('folder-c-0', null); | 
					
						
							| 
									
										
										
										
											2022-05-02 10:35:48 +02:00
										 |  |  |       data.folders.push(folder); | 
					
						
							| 
									
										
										
										
											2022-04-29 09:51:55 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |       const res = await rq({ | 
					
						
							|  |  |  |         method: 'PUT', | 
					
						
							|  |  |  |         url: `/upload/folders/${folder.id}`, | 
					
						
							|  |  |  |         body: { | 
					
						
							|  |  |  |           parent: 9999, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       expect(res.status).toBe(400); | 
					
						
							|  |  |  |       expect(res.body.error.message).toBe('parent folder does not exist'); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-19 14:09:54 +02:00
										 |  |  |     test('Cannot move a folder inside itself (0 level)', async () => { | 
					
						
							| 
									
										
										
										
											2022-05-05 16:14:32 +02:00
										 |  |  |       const folder = await createFolder('folder-d-0', null); | 
					
						
							|  |  |  |       data.folders.push(folder); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const res = await rq({ | 
					
						
							|  |  |  |         method: 'PUT', | 
					
						
							|  |  |  |         url: `/upload/folders/${folder.id}`, | 
					
						
							|  |  |  |         body: { | 
					
						
							|  |  |  |           parent: folder.id, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       expect(res.status).toBe(400); | 
					
						
							|  |  |  |       expect(res.body.error.message).toBe('folder cannot be moved inside itself'); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-19 14:09:54 +02:00
										 |  |  |     test('Cannot move a folder inside itself (1 level)', async () => { | 
					
						
							| 
									
										
										
										
											2022-05-05 16:14:32 +02:00
										 |  |  |       const folder0 = await createFolder('folder-e-0', null); | 
					
						
							|  |  |  |       const folder00 = await createFolder('folder-e-00', folder0.id); | 
					
						
							|  |  |  |       data.folders.push(folder0, folder00); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const res = await rq({ | 
					
						
							|  |  |  |         method: 'PUT', | 
					
						
							|  |  |  |         url: `/upload/folders/${folder0.id}`, | 
					
						
							|  |  |  |         body: { | 
					
						
							|  |  |  |           parent: folder00.id, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       expect(res.status).toBe(400); | 
					
						
							|  |  |  |       expect(res.body.error.message).toBe('folder cannot be moved inside itself'); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-19 14:09:54 +02:00
										 |  |  |     test('Cannot move a folder inside itself (2 levels)', async () => { | 
					
						
							| 
									
										
										
										
											2022-05-05 16:14:32 +02:00
										 |  |  |       const folder0 = await createFolder('folder-f-0', null); | 
					
						
							|  |  |  |       const folder00 = await createFolder('folder-f-00', folder0.id); | 
					
						
							|  |  |  |       const folder000 = await createFolder('folder-f-000', folder00.id); | 
					
						
							|  |  |  |       data.folders.push(folder0, folder00, folder000); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const res = await rq({ | 
					
						
							|  |  |  |         method: 'PUT', | 
					
						
							|  |  |  |         url: `/upload/folders/${folder0.id}`, | 
					
						
							|  |  |  |         body: { | 
					
						
							|  |  |  |           parent: folder000.id, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       expect(res.status).toBe(400); | 
					
						
							|  |  |  |       expect(res.body.error.message).toBe('folder cannot be moved inside itself'); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-19 14:09:54 +02:00
										 |  |  |     test('Move a folder inside another folder', async () => { | 
					
						
							| 
									
										
										
										
											2022-04-29 09:51:55 +02:00
										 |  |  |       const folder0 = await createFolder('folder-0', null); | 
					
						
							|  |  |  |       const folder00 = await createFolder('folder-00', folder0.id); | 
					
						
							|  |  |  |       const folder01 = await createFolder('folder-01', folder0.id); | 
					
						
							|  |  |  |       const folder02 = await createFolder('folder-02', folder0.id); | 
					
						
							|  |  |  |       const folder000 = await createFolder('folder-000', folder00.id); | 
					
						
							|  |  |  |       const file000 = await createAFile(folder000.id); | 
					
						
							|  |  |  |       const file02 = await createAFile(folder02.id); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // moving folder00 in folder01
 | 
					
						
							|  |  |  |       const res = await rq({ | 
					
						
							|  |  |  |         method: 'PUT', | 
					
						
							|  |  |  |         url: `/upload/folders/${folder00.id}`, | 
					
						
							|  |  |  |         body: { | 
					
						
							|  |  |  |           name: 'folder-00-new', | 
					
						
							|  |  |  |           parent: folder01.id, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       expect(res.body.data).toMatchObject({ | 
					
						
							|  |  |  |         name: 'folder-00-new', | 
					
						
							| 
									
										
										
										
											2022-06-03 16:21:52 +02:00
										 |  |  |         path: `${folder01.path}/${folder00.pathId}`, | 
					
						
							| 
									
										
										
										
											2022-04-29 09:51:55 +02:00
										 |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const resFolders = await rq({ | 
					
						
							|  |  |  |         method: 'GET', | 
					
						
							|  |  |  |         url: '/upload/folders', | 
					
						
							|  |  |  |         qs: { | 
					
						
							|  |  |  |           filters: { id: { $in: map('id', [folder0, folder00, folder01, folder02, folder000]) } }, | 
					
						
							|  |  |  |           sort: 'id:asc', | 
					
						
							| 
									
										
										
										
											2022-05-05 18:44:50 +02:00
										 |  |  |           populate: { parent: '*' }, | 
					
						
							| 
									
										
										
										
											2022-04-29 09:51:55 +02:00
										 |  |  |         }, | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-19 14:47:23 +02:00
										 |  |  |       expect(resFolders.body.data[0]).toMatchObject({ path: folder0.path, parent: null }); | 
					
						
							|  |  |  |       expect(resFolders.body.data[1]).toMatchObject({ | 
					
						
							| 
									
										
										
										
											2022-06-03 16:21:52 +02:00
										 |  |  |         path: `${folder01.path}/${folder00.pathId}`, | 
					
						
							| 
									
										
										
										
											2022-04-29 09:51:55 +02:00
										 |  |  |         parent: { id: folder01.id }, | 
					
						
							|  |  |  |       }); | 
					
						
							| 
									
										
										
										
											2022-05-19 14:47:23 +02:00
										 |  |  |       expect(resFolders.body.data[2]).toMatchObject({ | 
					
						
							| 
									
										
										
										
											2022-04-29 09:51:55 +02:00
										 |  |  |         path: folder01.path, | 
					
						
							|  |  |  |         parent: { id: folder0.id }, | 
					
						
							|  |  |  |       }); | 
					
						
							| 
									
										
										
										
											2022-05-19 14:47:23 +02:00
										 |  |  |       expect(resFolders.body.data[3]).toMatchObject({ | 
					
						
							| 
									
										
										
										
											2022-04-29 09:51:55 +02:00
										 |  |  |         path: folder02.path, | 
					
						
							|  |  |  |         parent: { id: folder0.id }, | 
					
						
							|  |  |  |       }); | 
					
						
							| 
									
										
										
										
											2022-05-19 14:47:23 +02:00
										 |  |  |       expect(resFolders.body.data[4]).toMatchObject({ | 
					
						
							| 
									
										
										
										
											2022-06-03 16:21:52 +02:00
										 |  |  |         path: `${folder01.path}/${folder00.pathId}/${folder000.pathId}`, | 
					
						
							| 
									
										
										
										
											2022-04-29 09:51:55 +02:00
										 |  |  |         parent: { id: folder00.id }, | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const resFiles = await rq({ | 
					
						
							|  |  |  |         method: 'GET', | 
					
						
							|  |  |  |         url: '/upload/files', | 
					
						
							|  |  |  |         qs: { | 
					
						
							|  |  |  |           filters: { id: { $in: [file000.id, file02.id] } }, | 
					
						
							|  |  |  |           sort: 'id:asc', | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       expect(resFiles.body.results[0]).toMatchObject({ | 
					
						
							| 
									
										
										
										
											2022-06-03 16:21:52 +02:00
										 |  |  |         folderPath: `${folder01.path}/${folder00.pathId}/${folder000.pathId}`, | 
					
						
							| 
									
										
										
										
											2022-04-29 09:51:55 +02:00
										 |  |  |       }); | 
					
						
							|  |  |  |       expect(resFiles.body.results[1]).toMatchObject({ folderPath: file02.folderPath }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-19 14:47:23 +02:00
										 |  |  |       data.folders.push(...resFolders.body.data); | 
					
						
							| 
									
										
										
										
											2022-04-29 09:51:55 +02:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-19 14:09:54 +02:00
										 |  |  |     test('Move a folder to root level', async () => { | 
					
						
							| 
									
										
										
										
											2022-04-29 09:51:55 +02:00
										 |  |  |       const folder0 = await createFolder('folder-test-0', null); | 
					
						
							|  |  |  |       const folder00 = await createFolder('folder-test-00', folder0.id); | 
					
						
							|  |  |  |       const folder02 = await createFolder('folder-test-02', folder0.id); | 
					
						
							|  |  |  |       const folder000 = await createFolder('folder-test-000', folder00.id); | 
					
						
							|  |  |  |       const file000 = await createAFile(folder000.id); | 
					
						
							|  |  |  |       const file02 = await createAFile(folder02.id); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // moving folder00 in folder01
 | 
					
						
							|  |  |  |       const res = await rq({ | 
					
						
							|  |  |  |         method: 'PUT', | 
					
						
							|  |  |  |         url: `/upload/folders/${folder00.id}`, | 
					
						
							|  |  |  |         body: { | 
					
						
							|  |  |  |           name: 'folder-test-00-new', | 
					
						
							|  |  |  |           parent: null, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       expect(res.body.data).toMatchObject({ | 
					
						
							|  |  |  |         name: 'folder-test-00-new', | 
					
						
							| 
									
										
										
										
											2022-06-03 16:21:52 +02:00
										 |  |  |         path: `/${folder00.pathId}`, | 
					
						
							| 
									
										
										
										
											2022-04-29 09:51:55 +02:00
										 |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const resFolders = await rq({ | 
					
						
							|  |  |  |         method: 'GET', | 
					
						
							|  |  |  |         url: '/upload/folders', | 
					
						
							|  |  |  |         qs: { | 
					
						
							|  |  |  |           filters: { id: { $in: map('id', [folder0, folder00, folder02, folder000]) } }, | 
					
						
							|  |  |  |           sort: 'id:asc', | 
					
						
							| 
									
										
										
										
											2022-05-05 18:44:50 +02:00
										 |  |  |           populate: { parent: '*' }, | 
					
						
							| 
									
										
										
										
											2022-04-29 09:51:55 +02:00
										 |  |  |         }, | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-19 14:47:23 +02:00
										 |  |  |       expect(resFolders.body.data[0]).toMatchObject({ path: folder0.path, parent: null }); | 
					
						
							|  |  |  |       expect(resFolders.body.data[1]).toMatchObject({ | 
					
						
							| 
									
										
										
										
											2022-06-03 16:21:52 +02:00
										 |  |  |         path: `/${folder00.pathId}`, | 
					
						
							| 
									
										
										
										
											2022-04-29 09:51:55 +02:00
										 |  |  |         parent: null, | 
					
						
							|  |  |  |       }); | 
					
						
							| 
									
										
										
										
											2022-05-19 14:47:23 +02:00
										 |  |  |       expect(resFolders.body.data[2]).toMatchObject({ | 
					
						
							| 
									
										
										
										
											2022-04-29 09:51:55 +02:00
										 |  |  |         path: folder02.path, | 
					
						
							|  |  |  |         parent: { id: folder0.id }, | 
					
						
							|  |  |  |       }); | 
					
						
							| 
									
										
										
										
											2022-05-19 14:47:23 +02:00
										 |  |  |       expect(resFolders.body.data[3]).toMatchObject({ | 
					
						
							| 
									
										
										
										
											2022-06-03 16:21:52 +02:00
										 |  |  |         path: `/${folder00.pathId}/${folder000.pathId}`, | 
					
						
							| 
									
										
										
										
											2022-04-29 09:51:55 +02:00
										 |  |  |         parent: { id: folder00.id }, | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const resFiles = await rq({ | 
					
						
							|  |  |  |         method: 'GET', | 
					
						
							|  |  |  |         url: '/upload/files', | 
					
						
							|  |  |  |         qs: { | 
					
						
							|  |  |  |           filters: { id: { $in: [file000.id, file02.id] } }, | 
					
						
							|  |  |  |           sort: 'id:asc', | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       expect(resFiles.body.results[0]).toMatchObject({ | 
					
						
							| 
									
										
										
										
											2022-06-03 16:21:52 +02:00
										 |  |  |         folderPath: `/${folder00.pathId}/${folder000.pathId}`, | 
					
						
							| 
									
										
										
										
											2022-04-29 09:51:55 +02:00
										 |  |  |       }); | 
					
						
							|  |  |  |       expect(resFiles.body.results[1]).toMatchObject({ folderPath: file02.folderPath }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-19 14:47:23 +02:00
										 |  |  |       data.folders.push(...resFolders.body.data); | 
					
						
							| 
									
										
										
										
											2022-04-29 09:51:55 +02:00
										 |  |  |     }); | 
					
						
							|  |  |  |   }); | 
					
						
							| 
									
										
										
										
											2022-03-22 18:19:46 +01:00
										 |  |  | }); |