diff options
Diffstat (limited to 'build/integration/features/bootstrap/Trashbin.php')
-rw-r--r-- | build/integration/features/bootstrap/Trashbin.php | 153 |
1 files changed, 153 insertions, 0 deletions
diff --git a/build/integration/features/bootstrap/Trashbin.php b/build/integration/features/bootstrap/Trashbin.php new file mode 100644 index 00000000000..dfcc23289a7 --- /dev/null +++ b/build/integration/features/bootstrap/Trashbin.php @@ -0,0 +1,153 @@ +<?php + +/** + * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2017 ownCloud GmbH + * SPDX-License-Identifier: AGPL-3.0-only + */ +use DMS\PHPUnitExtensions\ArraySubset\Assert as AssertArraySubset; +use PHPUnit\Framework\Assert; + +require __DIR__ . '/../../vendor/autoload.php'; + +/** + * Trashbin functions + */ +trait Trashbin { + // WebDav trait is expected to be used in the class that uses this trait. + + /** + * @When User :user empties trashbin + * @param string $user user + */ + public function emptyTrashbin($user) { + $client = $this->getSabreClient($user); + $response = $client->request('DELETE', $this->makeSabrePath($user, 'trash', 'trashbin')); + Assert::assertEquals(204, $response['statusCode']); + } + + private function findFullTrashname($user, $name) { + $rootListing = $this->listTrashbinFolder($user, '/'); + + foreach ($rootListing as $href => $rootItem) { + if ($rootItem['{http://nextcloud.org/ns}trashbin-filename'] === $name) { + return basename($href); + } + } + + return null; + } + + /** + * Get the full /startofpath.dxxxx/rest/of/path from /startofpath/rest/of/path + */ + private function getFullTrashPath($user, $path) { + if ($path !== '' && $path !== '/') { + $parts = explode('/', $path); + $fullName = $this->findFullTrashname($user, $parts[1]); + if ($fullName === null) { + Assert::fail("cant find $path in trash"); + return '/dummy_full_path_not_found'; + } + $parts[1] = $fullName; + + $path = implode('/', $parts); + } + return $path; + } + + /** + * List trashbin folder + * + * @param string $user user + * @param string $path path + * @return array response + */ + public function listTrashbinFolder($user, $path) { + $path = $this->getFullTrashPath($user, $path); + $client = $this->getSabreClient($user); + + $results = $client->propfind($this->makeSabrePath($user, 'trash' . $path, 'trashbin'), [ + '{http://nextcloud.org/ns}trashbin-filename', + '{http://nextcloud.org/ns}trashbin-original-location', + '{http://nextcloud.org/ns}trashbin-deletion-time' + ], 1); + $results = array_filter($results, function (array $item) { + return isset($item['{http://nextcloud.org/ns}trashbin-filename']); + }); + if ($path !== '' && $path !== '/') { + array_shift($results); + } + return $results; + } + + /** + * @Then /^user "([^"]*)" in trash folder "([^"]*)" should have the following elements$/ + * @param string $user + * @param string $folder + * @param \Behat\Gherkin\Node\TableNode|null $expectedElements + */ + public function checkTrashContents($user, $folder, $expectedElements) { + $elementList = $this->listTrashbinFolder($user, $folder); + $trashContent = array_filter(array_map(function (array $item) { + return $item['{http://nextcloud.org/ns}trashbin-filename']; + }, $elementList)); + if ($expectedElements instanceof \Behat\Gherkin\Node\TableNode) { + $elementRows = $expectedElements->getRows(); + $elementsSimplified = $this->simplifyArray($elementRows); + foreach ($elementsSimplified as $expectedElement) { + $expectedElement = ltrim($expectedElement, '/'); + if (array_search($expectedElement, $trashContent) === false) { + Assert::fail("$expectedElement" . ' is not in trash listing'); + } + } + } + } + + /** + * @Then /^as "([^"]*)" the (file|folder) "([^"]*)" exists in trash$/ + * @param string $user + * @param string $type + * @param string $file + */ + public function checkTrashContains($user, $type, $file) { + $parent = dirname($file); + if ($parent === '.') { + $parent = '/'; + } + $name = basename($file); + $elementList = $this->listTrashbinFolder($user, $parent); + $trashContent = array_filter(array_map(function (array $item) { + return $item['{http://nextcloud.org/ns}trashbin-filename']; + }, $elementList)); + + AssertArraySubset::assertArraySubset([$name], array_values($trashContent)); + } + + /** + * @Then /^user "([^"]*)" in trash folder "([^"]*)" should have (\d+) elements?$/ + * @param string $user + * @param string $folder + * @param \Behat\Gherkin\Node\TableNode|null $expectedElements + */ + public function checkTrashSize($user, $folder, $expectedCount) { + $elementList = $this->listTrashbinFolder($user, $folder); + Assert::assertEquals($expectedCount, count($elementList)); + } + + /** + * @When /^user "([^"]*)" in restores "([^"]*)" from trash$/ + * @param string $user + * @param string $file + */ + public function restoreFromTrash($user, $file) { + $file = $this->getFullTrashPath($user, $file); + $url = $this->makeSabrePath($user, 'trash' . $file, 'trashbin'); + $client = $this->getSabreClient($user); + $response = $client->request('MOVE', $url, null, [ + 'Destination' => $this->makeSabrePath($user, 'restore/' . basename($file), 'trashbin'), + ]); + Assert::assertEquals(201, $response['statusCode']); + return; + } +} |