diff --git a/.woodpecker.star b/.woodpecker.star index 543fca0ac..a498dbf3a 100644 --- a/.woodpecker.star +++ b/.woodpecker.star @@ -946,7 +946,7 @@ def localApiTests(name, suites, storage = "decomposed", extra_environment = {}, "OC_WRAPPER_URL": "http://%s:5200" % OC_SERVER_NAME, "WITH_REMOTE_PHP": with_remote_php, "COLLABORATION_SERVICE_URL": "http://wopi-fakeoffice:9300", - "OC_STORAGE_PATH": "$HOME/.opencloud/storage/users/users", + "OC_STORAGE_PATH": "$HOME/.opencloud/storage/users", } for item in extra_environment: diff --git a/tests/acceptance/bootstrap/CliContext.php b/tests/acceptance/bootstrap/CliContext.php index 34418c13c..a1d450ca5 100644 --- a/tests/acceptance/bootstrap/CliContext.php +++ b/tests/acceptance/bootstrap/CliContext.php @@ -35,12 +35,23 @@ class CliContext implements Context { private SpacesContext $spacesContext; /** - * opencloud user storage path + * opencloud users storage path * * @return string */ - public static function getStoragePath(): string { - return getenv('OC_STORAGE_PATH') ?: '/var/lib/opencloud/storage/users/users'; + public static function getUsersStoragePath(): string { + $path = getenv('OC_STORAGE_PATH') ?: '/var/lib/opencloud/storage/users'; + return $path . '/users'; + } + + /** + * opencloud project spaces storage path + * + * @return string + */ + public static function getProjectsStoragePath(): string { + $path = getenv('OC_STORAGE_PATH') ?: '/var/lib/opencloud/storage/users'; + return $path . '/projects'; } /** @@ -447,7 +458,7 @@ class CliContext implements Context { } /** - * @When the administrator creates folder :folder for user :user on the POSIX filesystem + * @When the administrator creates the folder :folder for user :user on the POSIX filesystem * * @param string $folder * @param string $user @@ -456,7 +467,7 @@ class CliContext implements Context { */ public function theAdministratorCreatesFolder(string $folder, string $user): void { $userUuid = $this->featureContext->getUserIdByUserName($user); - $storagePath = $this->getStoragePath(); + $storagePath = $this->getUsersStoragePath(); $body = [ "command" => "mkdir -p $storagePath/$userUuid/$folder", "raw" => true @@ -474,11 +485,207 @@ class CliContext implements Context { */ public function theAdministratorCheckUsersFolder(string $user): void { $userUuid = $this->featureContext->getUserIdByUserName($user); - $storagePath = $this->getStoragePath(); + $storagePath = $this->getUsersStoragePath(); $body = [ "command" => "ls -la $storagePath/$userUuid", "raw" => true ]; $this->featureContext->setResponse(CliHelper::runCommand($body)); } + + /** + * @When the administrator creates the file :file with content :content for user :user on the POSIX filesystem + * + * @param string $file + * @param string $content + * @param string $user + * + * @return void + */ + public function theAdministratorCreatesFile(string $file, string $content, string $user): void { + $userUuid = $this->featureContext->getUserIdByUserName($user); + $storagePath = $this->getUsersStoragePath(); + $safeContent = escapeshellarg($content); + $body = [ + "command" => "echo -n $safeContent > $storagePath/$userUuid/$file", + "raw" => true + ]; + $this->featureContext->setResponse(CliHelper::runCommand($body)); + sleep(1); + } + + /** + * @When the administrator puts the content :content into the file :file in the POSIX storage folder of user :user + * + * @param string $content + * @param string $file + * @param string $user + * + * @return void + */ + public function theAdministratorChangesFileContent(string $content, string $file, string $user): void { + $userUuid = $this->featureContext->getUserIdByUserName($user); + $storagePath = $this->getUsersStoragePath(); + $safeContent = escapeshellarg($content); + $body = [ + "command" => "echo -n $safeContent >> $storagePath/$userUuid/$file", + "raw" => true + ]; + sleep(1); + $this->featureContext->setResponse(CliHelper::runCommand($body)); + sleep(1); + } + + /** + * @When the administrator reads the content of the file :file in the POSIX storage folder of user :user + * + * @param string $user + * @param string $file + * + * @return void + */ + public function theAdministratorReadsTheFileContent(string $user, string $file): void { + $userUuid = $this->featureContext->getUserIdByUserName($user); + $storagePath = $this->getUsersStoragePath(); + $body = [ + "command" => "cat $storagePath/$userUuid/$file", + "raw" => true + ]; + $this->featureContext->setResponse(CliHelper::runCommand($body)); + } + + /** + * @When the administrator copies the file :file to the folder :folder for user :user on the POSIX filesystem + * + * @param string $user + * @param string $file + * @param string $folder + * + * @return void + */ + public function theAdministratorCopiesFileToFolder(string $user, string $file, string $folder): void { + $userUuid = $this->featureContext->getUserIdByUserName($user); + $storagePath = $this->getUsersStoragePath(); + + $source = "$storagePath/$userUuid/$file"; + $destination = "$storagePath/$userUuid/$folder"; + + $body = [ + "command" => "cp $source $destination", + "raw" => true + ]; + $this->featureContext->setResponse(CliHelper::runCommand($body)); + sleep(1); + } + + /** + * @When the administrator moves the file :file to the folder :folder for user :user on the POSIX filesystem + * + * @param string $user + * @param string $file + * @param string $folder + * + * @return void + */ + public function theAdministratorMovesFileToFolder(string $user, string $file, string $folder): void { + $userUuid = $this->featureContext->getUserIdByUserName($user); + $storagePath = $this->getUsersStoragePath(); + + $source = "$storagePath/$userUuid/$file"; + $destination = "$storagePath/$userUuid/$folder"; + + $body = [ + "command" => "mv $source $destination", + "raw" => true + ]; + $this->featureContext->setResponse(CliHelper::runCommand($body)); + sleep(1); + } + + /** + * @When the administrator deletes the file :file for user :user on the POSIX filesystem + * + * @param string $file + * @param string $user + * + * @return void + */ + public function theAdministratorDeletesFile(string $file, string $user): void { + $userUuid = $this->featureContext->getUserIdByUserName($user); + $storagePath = $this->getUsersStoragePath(); + + $body = [ + "command" => "rm $storagePath/$userUuid/$file", + "raw" => true + ]; + $this->featureContext->setResponse(CliHelper::runCommand($body)); + sleep(1); + } + + /** + * @When the administrator deletes the folder :folder for user :user on the POSIX filesystem + * + * @param string $folder + * @param string $user + * + * @return void + */ + public function theAdministratorDeletesFolder(string $folder, string $user): void { + $userUuid = $this->featureContext->getUserIdByUserName($user); + $storagePath = $this->getUsersStoragePath(); + + $body = [ + "command" => "rm -r $storagePath/$userUuid/$folder", + "raw" => true + ]; + $this->featureContext->setResponse(CliHelper::runCommand($body)); + sleep(1); + } + + /** + * @When the administrator copies the file :file to the space :space for user :user on the POSIX filesystem + * + * @param string $user + * @param string $file + * @param string $space + * + * @return void + */ + public function theAdministratorCopiesFileToSpace(string $user, string $file, string $space): void { + $userUuid = $this->featureContext->getUserIdByUserName($user); + $usersStoragePath = $this->getUsersStoragePath(); + $projectsStoragePath = $this->getProjectsStoragePath(); + $spaceId = $this->spacesContext->getSpaceIdByName($this->featureContext->getAdminUsername(), $space); + $spaceId = explode('$', $spaceId)[1]; + + $source = "$usersStoragePath/$userUuid/$file"; + $destination = "$projectsStoragePath/$spaceId"; + + $body = [ + "command" => "cp $source $destination", + "raw" => true + ]; + $this->featureContext->setResponse(CliHelper::runCommand($body)); + sleep(1); + } + + /** + * @When the administrator deletes the project space :space on the POSIX filesystem + * + * @param string $space + * + * @return void + */ + public function theAdministratorDeletesSpace(string $space): void { + $projectsStoragePath = $this->getProjectsStoragePath(); + $spaceId = $this->spacesContext->getSpaceIdByName($this->featureContext->getAdminUsername(), $space); + $spaceId = explode('$', $spaceId)[1]; + + $body = [ + "command" => "rm -r $projectsStoragePath/$spaceId", + "raw" => true + ]; + $this->featureContext->setResponse(CliHelper::runCommand($body)); + sleep(1); + } } diff --git a/tests/acceptance/features/collaborativePosix/collaborativePosixFS.feature b/tests/acceptance/features/collaborativePosix/collaborativePosixFS.feature index 2a1e9231a..ec454f796 100644 --- a/tests/acceptance/features/collaborativePosix/collaborativePosixFS.feature +++ b/tests/acceptance/features/collaborativePosix/collaborativePosixFS.feature @@ -8,8 +8,80 @@ Feature: create a resources using collaborative posixfs Scenario: create folder Given user "Alice" has uploaded file with content "content" to "textfile.txt" - When the administrator creates folder "myFolder" for user "Alice" on the POSIX filesystem + When the administrator creates the folder "myFolder" for user "Alice" on the POSIX filesystem Then the command should be successful When the administrator lists the content of the POSIX storage folder of user "Alice" Then the command output should contain "myFolder" And as "Alice" folder "/myFolder" should exist + + + Scenario: create file + Given user "Alice" has created folder "/folder" + When the administrator creates the file "test.txt" with content "content" for user "Alice" on the POSIX filesystem + Then the command should be successful + When the administrator lists the content of the POSIX storage folder of user "Alice" + Then the command output should contain "test.txt" + And the content of file "/test.txt" for user "Alice" should be "content" + + + Scenario: edit file + Given user "Alice" has uploaded file with content "content" to "test.txt" + When the administrator puts the content "new" into the file "test.txt" in the POSIX storage folder of user "Alice" + Then the content of file "/test.txt" for user "Alice" should be "contentnew" + + + Scenario: read file content + Given user "Alice" has uploaded file with content "content" to "textfile.txt" + When the administrator reads the content of the file "textfile.txt" in the POSIX storage folder of user "Alice" + Then the command output should contain "content" + + + Scenario: copy file to folder + Given user "Alice" has created folder "/folder" + And user "Alice" has uploaded file with content "content" to "test.txt" + When the administrator copies the file "test.txt" to the folder "folder" for user "Alice" on the POSIX filesystem + Then the command should be successful + And the content of file "/folder/test.txt" for user "Alice" should be "content" + + + Scenario: move file to folder + Given user "Alice" has created folder "/folder" + And user "Alice" has uploaded file with content "content" to "test.txt" + When the administrator moves the file "test.txt" to the folder "folder" for user "Alice" on the POSIX filesystem + Then the command should be successful + And the content of file "/folder/test.txt" for user "Alice" should be "content" + And as "Alice" file "/test.txt" should not exist + + + Scenario: delete file + Given user "Alice" has uploaded file with content "content" to "test.txt" + When the administrator deletes the file "test.txt" for user "Alice" on the POSIX filesystem + Then the command should be successful + And as "Alice" file "/test.txt" should not exist + + + Scenario: delete folder + Given user "Alice" has created folder "/folder" + And user "Alice" has uploaded file with content "content" to "/folder/test.txt" + When the administrator deletes the folder "folder" for user "Alice" on the POSIX filesystem + Then the command should be successful + And as "Alice" folder "folder" should not exist + + + Scenario: copy file from personal to project space + Given user "Alice" has uploaded file with content "content" to "test.txt" + And the administrator has assigned the role "Space Admin" to user "Alice" using the Graph API + And user "Alice" has created a space "Project space" with the default quota using the Graph API + When the administrator copies the file "test.txt" to the space "Project space" for user "Alice" on the POSIX filesystem + Then the command should be successful + And using spaces DAV path + And for user "Alice" the space "Project space" should contain these entries: + | test.txt | + + + Scenario: delete project space + Given the administrator has assigned the role "Space Admin" to user "Alice" using the Graph API + And user "Alice" has created a space "Project space" with the default quota using the Graph API + When the administrator deletes the project space "Project space" on the POSIX filesystem + Then the command should be successful + And the user "Alice" should not have a space called "Project space"