@@ -10,6 +10,7 @@ package no.ndla.myndlaapi.e2e
1010
1111import no .ndla .common .configuration .Prop
1212import no .ndla .common .model .NDLADate
13+ import no .ndla .common .model .api .UpdateWith
1314import no .ndla .common .model .domain .ResourceType .Article
1415import no .ndla .common .model .domain .myndla .FolderStatus
1516import no .ndla .common .{CirceUtil , Clock }
@@ -128,10 +129,10 @@ class FolderTest extends DatabaseIntegrationSuite with RedisIntegrationSuite wit
128129 )
129130 }
130131
131- def createFolder (feideId : String , name : String ): api.FolderDTO = {
132+ def createFolder (feideId : String , name : String , parentId : Option [ String ] ): api.FolderDTO = {
132133 import io .circe .generic .auto .*
133134 val newFolderData =
134- api.NewFolderDTO (name = name, status = Some (FolderStatus .SHARED .toString), parentId = None , description = None )
135+ api.NewFolderDTO (name = name, status = Some (FolderStatus .SHARED .toString), parentId = parentId , description = None )
135136 val body = CirceUtil .toJsonString(newFolderData)
136137
137138 val newFolder = simpleHttpClient.send(
@@ -147,10 +148,29 @@ class FolderTest extends DatabaseIntegrationSuite with RedisIntegrationSuite wit
147148 CirceUtil .unsafeParseAs[api.FolderDTO ](newFolder.body)
148149 }
149150
150- def getFolders (feideId : String ): api.UserFolderDTO = {
151+ def updateFolder (feideId : String , folderId : UUID , updatedFolder : api. UpdatedFolderDTO ): api.FolderDTO = {
151152 import io .circe .generic .auto .*
153+ val body = CirceUtil .toJsonString(updatedFolder)
154+
155+ val updatedFolderResponse = simpleHttpClient.send(
156+ quickRequest
157+ .patch(uri " $myndlaApiFolderUrl/ $folderId" )
158+ .header(" FeideAuthorization" , s " Bearer $feideId" )
159+ .contentType(" application/json" )
160+ .body(body)
161+ )
162+ if (! updatedFolderResponse.isSuccess)
163+ fail(s " Failed to update folder $folderId failed with code ${updatedFolderResponse.code} and body: \n ${updatedFolderResponse.body}" )
164+
165+ CirceUtil .unsafeParseAs[api.FolderDTO ](updatedFolderResponse.body)
166+ }
167+
168+ def getFolders (feideId : String , includeSubfolders : Boolean ): api.UserFolderDTO = {
169+ import io .circe .generic .auto .*
170+ var uri = uri " $myndlaApiFolderUrl/ "
171+ if (includeSubfolders) uri = uri.addParam(" include-subfolders" , " true" )
152172 val folders = simpleHttpClient.send(
153- quickRequest.get(uri " $myndlaApiFolderUrl / " ).header(" FeideAuthorization" , s " Bearer $feideId" )
173+ quickRequest.get(uri).header(" FeideAuthorization" , s " Bearer $feideId" )
154174 )
155175 if (! folders.isSuccess)
156176 fail(s " Fetching all folders for $feideId failed with code ${folders.code} and body: \n ${folders.body}" )
@@ -250,12 +270,12 @@ class FolderTest extends DatabaseIntegrationSuite with RedisIntegrationSuite wit
250270 when(myndlaApi.componentRegistry.feideApiClient.getFeideID(eqTo(Some (feideId1)))).thenReturn(Success (feideId1))
251271 when(myndlaApi.componentRegistry.feideApiClient.getFeideGroups(any)).thenReturn(Success (Seq .empty))
252272
253- val f1 = createFolder(feideId1, " folder1" )
254- val f2 = createFolder(feideId1, " folder2" )
255- val f3 = createFolder(feideId1, " folder3" )
256- val f4 = createFolder(feideId1, " folder4" )
273+ val f1 = createFolder(feideId1, " folder1" , None )
274+ val f2 = createFolder(feideId1, " folder2" , None )
275+ val f3 = createFolder(feideId1, " folder3" , None )
276+ val f4 = createFolder(feideId1, " folder4" , None )
257277
258- val foldersForU1 = getFolders(feideId1)
278+ val foldersForU1 = getFolders(feideId1, false )
259279 foldersForU1.sharedFolders.length should be(0 )
260280 foldersForU1.folders.length should be(4 )
261281 foldersForU1.folders.head.id should be(f1.id)
@@ -269,7 +289,7 @@ class FolderTest extends DatabaseIntegrationSuite with RedisIntegrationSuite wit
269289
270290 sortFolders(feideId1, List (f4.id, f2.id, f3.id, f1.id))
271291
272- val foldersForU1Sorted = getFolders(feideId1)
292+ val foldersForU1Sorted = getFolders(feideId1, false )
273293 foldersForU1Sorted.sharedFolders.length should be(0 )
274294 foldersForU1Sorted.folders.length should be(4 )
275295 foldersForU1Sorted.folders.head.id should be(f4.id)
@@ -289,12 +309,12 @@ class FolderTest extends DatabaseIntegrationSuite with RedisIntegrationSuite wit
289309 when(myndlaApi.componentRegistry.feideApiClient.getFeideID(eqTo(Some (feideId2)))).thenReturn(Success (feideId2))
290310 when(myndlaApi.componentRegistry.feideApiClient.getFeideGroups(any)).thenReturn(Success (Seq .empty))
291311
292- val f1 = createFolder(feideId1, " folder1" )
293- val f2 = createFolder(feideId1, " folder2" )
294- val f3 = createFolder(feideId1, " folder3" )
295- val f4 = createFolder(feideId1, " folder4" )
312+ val f1 = createFolder(feideId1, " folder1" , None )
313+ val f2 = createFolder(feideId1, " folder2" , None )
314+ val f3 = createFolder(feideId1, " folder3" , None )
315+ val f4 = createFolder(feideId1, " folder4" , None )
296316
297- val foldersForU1 = getFolders(feideId1)
317+ val foldersForU1 = getFolders(feideId1, false )
298318 foldersForU1.sharedFolders.length should be(0 )
299319 foldersForU1.folders.length should be(4 )
300320 foldersForU1.folders.head.id should be(f1.id)
@@ -308,7 +328,7 @@ class FolderTest extends DatabaseIntegrationSuite with RedisIntegrationSuite wit
308328
309329 sortFolders(feideId1, List (f4.id, f2.id, f3.id, f1.id))
310330
311- val foldersForU1Sorted = getFolders(feideId1)
331+ val foldersForU1Sorted = getFolders(feideId1, false )
312332 foldersForU1Sorted.sharedFolders.length should be(0 )
313333 foldersForU1Sorted.folders.length should be(4 )
314334 foldersForU1Sorted.folders.head.id should be(f4.id)
@@ -320,13 +340,13 @@ class FolderTest extends DatabaseIntegrationSuite with RedisIntegrationSuite wit
320340 foldersForU1Sorted.folders(3 ).id should be(f1.id)
321341 foldersForU1Sorted.folders(3 ).rank should be(4 )
322342
323- val foldersForU2 = getFolders(feideId2)
343+ val foldersForU2 = getFolders(feideId2, false )
324344 foldersForU2.sharedFolders.length should be(0 )
325345
326346 saveFolder(feideId2, f1.id)
327347 saveFolder(feideId2, f3.id)
328348
329- val foldersForU2AfterSave = getFolders(feideId2)
349+ val foldersForU2AfterSave = getFolders(feideId2, false )
330350 foldersForU2AfterSave.sharedFolders.length should be(2 )
331351 foldersForU2AfterSave.sharedFolders.head.id should be(f1.id)
332352 foldersForU2AfterSave.sharedFolders.head.rank should be(1 )
@@ -335,7 +355,7 @@ class FolderTest extends DatabaseIntegrationSuite with RedisIntegrationSuite wit
335355
336356 sortFolders(feideId2, List (f3.id, f1.id), sortShared = true )
337357
338- val foldersForU2AfterSort = getFolders(feideId2)
358+ val foldersForU2AfterSort = getFolders(feideId2, false )
339359 foldersForU2AfterSort.sharedFolders.length should be(2 )
340360 foldersForU2AfterSort.sharedFolders.head.id should be(f3.id)
341361 foldersForU2AfterSort.sharedFolders.head.rank should be(1 )
@@ -349,9 +369,9 @@ class FolderTest extends DatabaseIntegrationSuite with RedisIntegrationSuite wit
349369 when(myndlaApi.componentRegistry.feideApiClient.getFeideID(eqTo(Some (feideId1)))).thenReturn(Success (feideId1))
350370 when(myndlaApi.componentRegistry.feideApiClient.getFeideGroups(any)).thenReturn(Success (Seq .empty))
351371
352- val f1 = createFolder(feideId1, " folder1" )
372+ val f1 = createFolder(feideId1, " folder1" , None )
353373
354- val foldersForU1 = getFolders(feideId1)
374+ val foldersForU1 = getFolders(feideId1, false )
355375 foldersForU1.sharedFolders.length should be(0 )
356376 foldersForU1.folders.length should be(1 )
357377 foldersForU1.folders.head.id should be(f1.id)
@@ -404,4 +424,40 @@ class FolderTest extends DatabaseIntegrationSuite with RedisIntegrationSuite wit
404424 folderAfterDelete.resources.map(_.id) should be(List (res3.id, res2.id, res5.id, res4.id))
405425
406426 }
427+
428+ test(" Saving and then moving folder to different parent" ) {
429+ val feideId1 = " feide1"
430+ when(myndlaApi.componentRegistry.feideApiClient.getFeideID(eqTo(Some (feideId1)))).thenReturn(Success (feideId1))
431+ when(myndlaApi.componentRegistry.feideApiClient.getFeideGroups(any)).thenReturn(Success (Seq .empty))
432+
433+ /*
434+ f1
435+ ├─ f2
436+ ├─ f3
437+ └─ f4
438+ */
439+ val f1 = createFolder(feideId1, " folder1" , None )
440+ val f2 = createFolder(feideId1, " folder2" , Some (f1.id.toString))
441+ val f3 = createFolder(feideId1, " folder3" , Some (f1.id.toString))
442+ val f4 = createFolder(feideId1, " folder4" , Some (f3.id.toString))
443+
444+ // Move f4 to be child of f1
445+ val updated = updateFolder(feideId = feideId1, folderId = f4.id, updatedFolder = api.UpdatedFolderDTO (parentId = UpdateWith (f1.id.toString), name = None , status = None , description = None ))
446+ updated.parentId should be(Some (f1.id))
447+
448+ val foldersForU1Sorted = getFolders(feideId1, true )
449+ foldersForU1Sorted.sharedFolders.length should be(0 )
450+ foldersForU1Sorted.folders.length should be(1 )
451+ foldersForU1Sorted.folders.head.id should be(f1.id)
452+ foldersForU1Sorted.folders.head.rank should be(1 )
453+ foldersForU1Sorted.folders.head.subfolders.length should be(3 )
454+ val subfoldersOfF1 = foldersForU1Sorted.folders.head.subfolders.sortBy(_.rank)
455+ subfoldersOfF1.head.id should be(f2.id)
456+ subfoldersOfF1.head.rank should be(1 )
457+ subfoldersOfF1(1 ).id should be(f4.id) // rank is reset to 0 when moving
458+ subfoldersOfF1(1 ).rank should be(2 )
459+ subfoldersOfF1(2 ).id should be(f3.id)
460+ subfoldersOfF1(2 ).rank should be(3 )
461+
462+ }
407463}
0 commit comments