X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/defe89ef5c3e8995b275120f060cf85296f6396b..f3b8d03f7063b162355bccfd71aeb2b8b67bbdbb:/sdk/R/tests/testthat/test-Subcollection.R diff --git a/sdk/R/tests/testthat/test-Subcollection.R b/sdk/R/tests/testthat/test-Subcollection.R index e69de29bb2..a95247f77c 100644 --- a/sdk/R/tests/testthat/test-Subcollection.R +++ b/sdk/R/tests/testthat/test-Subcollection.R @@ -0,0 +1,444 @@ +# Copyright (C) The Arvados Authors. All rights reserved. +# +# SPDX-License-Identifier: Apache-2.0 + +source("fakes/FakeRESTService.R") + +context("Subcollection") + +test_that("getRelativePath returns path relative to the tree root", { + + animal <- Subcollection$new("animal") + + fish <- Subcollection$new("fish") + animal$add(fish) + + expect_that(animal$getRelativePath(), equals("animal")) + expect_that(fish$getRelativePath(), equals("animal/fish")) +}) + +test_that(paste("getFileListing by default returns sorted path of all files", + "relative to the current subcollection"), { + + animal <- Subcollection$new("animal") + fish <- Subcollection$new("fish") + shark <- ArvadosFile$new("shark") + blueFish <- ArvadosFile$new("blueFish") + + animal$add(fish) + fish$add(shark) + fish$add(blueFish) + + result <- animal$getFileListing() + + #expect sorted array + expectedResult <- c("animal/fish/blueFish", "animal/fish/shark") + + resultsMatch <- length(expectedResult) == length(result) && + all(expectedResult == result) + + expect_true(resultsMatch) +}) + +test_that(paste("getFileListing returns sorted names of all direct children", + "if fullPath is set to FALSE"), { + + animal <- Subcollection$new("animal") + fish <- Subcollection$new("fish") + shark <- ArvadosFile$new("shark") + dog <- ArvadosFile$new("dog") + + animal$add(fish) + animal$add(dog) + fish$add(shark) + + result <- animal$getFileListing(fullPath = FALSE) + expectedResult <- c("dog", "fish") + + resultsMatch <- length(expectedResult) == length(result) && + all(expectedResult == result) + + expect_true(resultsMatch) +}) + +test_that("add adds content to inside collection tree", { + + animal <- Subcollection$new("animal") + fish <- Subcollection$new("fish") + dog <- ArvadosFile$new("dog") + + animal$add(fish) + animal$add(dog) + + animalContainsFish <- animal$get("fish")$getName() == fish$getName() + animalContainsDog <- animal$get("dog")$getName() == dog$getName() + + expect_true(animalContainsFish) + expect_true(animalContainsDog) +}) + +test_that("add raises exception if content name is empty string", { + + animal <- Subcollection$new("animal") + rootFolder <- Subcollection$new("") + + expect_that(animal$add(rootFolder), + throws_error("Content has invalid name.", fixed = TRUE)) +}) + +test_that(paste("add raises exception if ArvadosFile/Subcollection", + "with same name already exists in the subcollection"), { + + animal <- Subcollection$new("animal") + fish <- Subcollection$new("fish") + secondFish <- Subcollection$new("fish") + thirdFish <- ArvadosFile$new("fish") + + animal$add(fish) + + expect_that(animal$add(secondFish), + throws_error(paste("Subcollection already contains ArvadosFile or", + "Subcollection with same name."), fixed = TRUE)) + expect_that(animal$add(thirdFish), + throws_error(paste("Subcollection already contains ArvadosFile or", + "Subcollection with same name."), fixed = TRUE)) +}) + +test_that(paste("add raises exception if passed argument is", + "not ArvadosFile or Subcollection"), { + + animal <- Subcollection$new("animal") + number <- 10 + + expect_that(animal$add(number), + throws_error(paste("Expected AravodsFile or Subcollection object,", + "got (numeric)."), fixed = TRUE)) +}) + +test_that(paste("add post content to a REST service", + "if subcollection belongs to a collection"), { + + collectionContent <- c("animal", "animal/fish") + fakeREST <- FakeRESTService$new(collectionContent) + + api <- Arvados$new("myToken", "myHostName") + api$setRESTService(fakeREST) + + collection <- Collection$new(api, "myUUID") + animal <- collection$get("animal") + dog <- ArvadosFile$new("dog") + + animal$add(dog) + + expect_that(fakeREST$createCallCount, equals(1)) +}) + +test_that("remove removes content from subcollection", { + + animal <- Subcollection$new("animal") + fish <- Subcollection$new("fish") + + animal$add(fish) + animal$remove("fish") + + returnValueAfterRemovalIsNull <- is.null(animal$get("fish")) + + expect_true(returnValueAfterRemovalIsNull) +}) + +test_that(paste("remove raises exception", + "if content to remove doesn't exist in the subcollection"), { + + animal <- Subcollection$new("animal") + + expect_that(animal$remove("fish"), + throws_error(paste("Subcollection doesn't contains ArvadosFile", + "or Subcollection with specified name."))) +}) + +test_that("remove raises exception if passed argument is not character vector", { + + animal <- Subcollection$new("animal") + number <- 10 + + expect_that(animal$remove(number), + throws_error(paste("Expected character,", + "got (numeric)."), fixed = TRUE)) +}) + +test_that(paste("remove removes content from REST service", + "if subcollection belongs to a collection"), { + + collectionContent <- c("animal", "animal/fish", "animal/dog") + fakeREST <- FakeRESTService$new(collectionContent) + + api <- Arvados$new("myToken", "myHostName") + api$setRESTService(fakeREST) + collection <- Collection$new(api, "myUUID") + animal <- collection$get("animal") + + animal$remove("fish") + + expect_that(fakeREST$deleteCallCount, equals(1)) +}) + +test_that(paste("get returns ArvadosFile or Subcollection", + "if file or folder with given name exists"), { + + animal <- Subcollection$new("animal") + fish <- Subcollection$new("fish") + dog <- ArvadosFile$new("dog") + + animal$add(fish) + animal$add(dog) + + returnedFish <- animal$get("fish") + returnedDog <- animal$get("dog") + + returnedFishIsSubcollection <- "Subcollection" %in% class(returnedFish) + returnedDogIsArvadosFile <- "ArvadosFile" %in% class(returnedDog) + + expect_true(returnedFishIsSubcollection) + expect_that(returnedFish$getName(), equals("fish")) + + expect_true(returnedDogIsArvadosFile) + expect_that(returnedDog$getName(), equals("dog")) +}) + +test_that(paste("get returns NULL if file or folder", + "with given name doesn't exists"), { + + animal <- Subcollection$new("animal") + fish <- Subcollection$new("fish") + + animal$add(fish) + + returnedDogIsNull <- is.null(animal$get("dog")) + + expect_true(returnedDogIsNull) +}) + +test_that("getFirst returns first child in the subcollection", { + + animal <- Subcollection$new("animal") + fish <- Subcollection$new("fish") + + animal$add(fish) + + expect_that(animal$getFirst()$getName(), equals("fish")) +}) + +test_that("getFirst returns NULL if subcollection contains no children", { + + animal <- Subcollection$new("animal") + + returnedElementIsNull <- is.null(animal$getFirst()) + + expect_true(returnedElementIsNull) +}) + +test_that(paste("setCollection by default sets collection", + "filed of subcollection and all its children"), { + + animal <- Subcollection$new("animal") + fish <- Subcollection$new("fish") + animal$add(fish) + + animal$setCollection("myCollection") + + expect_that(animal$getCollection(), equals("myCollection")) + expect_that(fish$getCollection(), equals("myCollection")) +}) + +test_that(paste("setCollection sets collection filed of subcollection only", + "if parameter setRecursively is set to FALSE"), { + + animal <- Subcollection$new("animal") + fish <- Subcollection$new("fish") + animal$add(fish) + + animal$setCollection("myCollection", setRecursively = FALSE) + fishCollectionIsNull <- is.null(fish$getCollection()) + + expect_that(animal$getCollection(), equals("myCollection")) + expect_true(fishCollectionIsNull) +}) + +test_that(paste("move raises exception if subcollection", + "doesn't belong to any collection"), { + + animal <- Subcollection$new("animal") + + expect_that(animal$move("new/location"), + throws_error("Subcollection doesn't belong to any collection")) +}) + +test_that("move raises exception if new location contains content with the same name", { + + collectionContent <- c("animal", + "animal/fish", + "animal/dog", + "animal/fish/shark", + "fish") + fakeREST <- FakeRESTService$new(collectionContent) + + api <- Arvados$new("myToken", "myHostName") + api$setRESTService(fakeREST) + collection <- Collection$new(api, "myUUID") + fish <- collection$get("animal/fish") + + expect_that(fish$move("fish"), + throws_error("Destination already contains content with same name.")) + +}) + +test_that(paste("move raises exception if newLocationInCollection", + "parameter is invalid"), { + + collectionContent <- c("animal", + "animal/fish", + "animal/dog", + "animal/fish/shark", + "ball") + fakeREST <- FakeRESTService$new(collectionContent) + + api <- Arvados$new("myToken", "myHostName") + api$setRESTService(fakeREST) + + collection <- Collection$new(api, "myUUID") + fish <- collection$get("animal/fish") + + expect_that(fish$move("objects/dog"), + throws_error("Unable to get destination subcollection.")) +}) + +test_that("move moves subcollection inside collection tree", { + + collectionContent <- c("animal", + "animal/fish", + "animal/dog", + "animal/fish/shark", + "ball") + fakeREST <- FakeRESTService$new(collectionContent) + + api <- Arvados$new("myToken", "myHostName") + api$setRESTService(fakeREST) + collection <- Collection$new(api, "myUUID") + fish <- collection$get("animal/fish") + + fish$move("fish") + fishIsNullOnOldLocation <- is.null(collection$get("animal/fish")) + fishExistsOnNewLocation <- !is.null(collection$get("fish")) + + expect_true(fishIsNullOnOldLocation) + expect_true(fishExistsOnNewLocation) +}) + +test_that(paste("getSizeInBytes returns zero if subcollection", + "is not part of a collection"), { + + animal <- Subcollection$new("animal") + + expect_that(animal$getSizeInBytes(), equals(0)) +}) + +test_that(paste("getSizeInBytes delegates size calculation", + "to REST service class"), { + + collectionContent <- c("animal", "animal/fish") + returnSize <- 100 + fakeREST <- FakeRESTService$new(collectionContent, returnSize) + + api <- Arvados$new("myToken", "myHostName") + api$setRESTService(fakeREST) + collection <- Collection$new(api, "myUUID") + animal <- collection$get("animal") + + resourceSize <- animal$getSizeInBytes() + + expect_that(resourceSize, equals(100)) +}) + +######################### +test_that(paste("copy raises exception if subcollection", + "doesn't belong to any collection"), { + + animal <- Subcollection$new("animal") + + expect_that(animal$copy("new/location"), + throws_error("Subcollection doesn't belong to any collection.")) +}) + +test_that("copy raises exception if new location contains content with the same name", { + + collectionContent <- c("animal", + "animal/fish", + "animal/dog", + "animal/fish/shark", + "fish") + fakeREST <- FakeRESTService$new(collectionContent) + + api <- Arvados$new("myToken", "myHostName") + api$setRESTService(fakeREST) + collection <- Collection$new(api, "myUUID") + fish <- collection$get("animal/fish") + + expect_that(fish$copy("fish"), + throws_error("Destination already contains content with same name.")) + +}) + +test_that(paste("copy raises exception if location parameter is invalid"), { + + collectionContent <- c("animal", + "animal/fish", + "animal/dog", + "animal/fish/shark", + "ball") + fakeREST <- FakeRESTService$new(collectionContent) + + api <- Arvados$new("myToken", "myHostName") + api$setRESTService(fakeREST) + + collection <- Collection$new(api, "myUUID") + fish <- collection$get("animal/fish") + + expect_that(fish$copy("objects/dog"), + throws_error("Unable to get destination subcollection.")) +}) + +test_that("copy copies subcollection inside collection tree", { + + collectionContent <- c("animal", + "animal/fish", + "animal/dog", + "animal/fish/shark", + "ball") + fakeREST <- FakeRESTService$new(collectionContent) + + api <- Arvados$new("myToken", "myHostName") + api$setRESTService(fakeREST) + collection <- Collection$new(api, "myUUID") + fish <- collection$get("animal/fish") + + fish$copy("fish") + fishExistsOnOldLocation <- !is.null(collection$get("animal/fish")) + fishExistsOnNewLocation <- !is.null(collection$get("fish")) + + expect_true(fishExistsOnOldLocation) + expect_true(fishExistsOnNewLocation) +}) + +test_that("duplicate performs deep cloning of Subcollection", { + foo <- ArvadosFile$new("foo") + bar <- ArvadosFile$new("bar") + sub <- Subcollection$new("qux") + sub$add(foo) + sub$add(bar) + + newSub1 <- sub$duplicate() + newSub2 <- sub$duplicate("quux") + + expect_that(newSub1$getFileListing(), equals(sub$getFileListing())) + expect_that(sort(newSub2$getFileListing()), equals(c("quux/bar", "quux/foo"))) +})