more trashbin integration tests

Signed-off-by: Robin Appelman <robin@icewind.nl>
This commit is contained in:
Robin Appelman 2018-09-11 14:24:35 +02:00
parent 8491c9bdc6
commit d4087811e5
No known key found for this signature in database
GPG Key ID: 42B69D8A64526EFB
2 changed files with 101 additions and 26 deletions

View File

@ -20,8 +20,6 @@
* *
*/ */
use GuzzleHttp\Client;
use GuzzleHttp\Message\ResponseInterface;
use PHPUnit\Framework\Assert; use PHPUnit\Framework\Assert;
require __DIR__ . '/../../vendor/autoload.php'; require __DIR__ . '/../../vendor/autoload.php';
@ -42,6 +40,36 @@ trait Trashbin {
Assert::assertEquals(204, $response['statusCode']); 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 * List trashbin folder
* *
@ -50,13 +78,21 @@ trait Trashbin {
* @return array response * @return array response
*/ */
public function listTrashbinFolder($user, $path) { public function listTrashbinFolder($user, $path) {
$path = $this->getFullTrashPath($user, $path);
$client = $this->getSabreClient($user); $client = $this->getSabreClient($user);
return $client->propfind($this->makeSabrePath($user, 'trash' . $path, 'trashbin'), [ $results = $client->propfind($this->makeSabrePath($user, 'trash' . $path, 'trashbin'), [
'{http://nextcloud.org/ns}trashbin-filename', '{http://nextcloud.org/ns}trashbin-filename',
'{http://nextcloud.org/ns}trashbin-original-location', '{http://nextcloud.org/ns}trashbin-original-location',
'{http://nextcloud.org/ns}trashbin-deletion-time' '{http://nextcloud.org/ns}trashbin-deletion-time'
], 1); ], 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;
} }
/** /**
@ -67,7 +103,7 @@ trait Trashbin {
*/ */
public function checkTrashContents($user, $folder, $expectedElements) { public function checkTrashContents($user, $folder, $expectedElements) {
$elementList = $this->listTrashbinFolder($user, $folder); $elementList = $this->listTrashbinFolder($user, $folder);
$trashContent = array_filter(array_map(function(array $item) { $trashContent = array_filter(array_map(function (array $item) {
return $item['{http://nextcloud.org/ns}trashbin-filename']; return $item['{http://nextcloud.org/ns}trashbin-filename'];
}, $elementList)); }, $elementList));
if ($expectedElements instanceof \Behat\Gherkin\Node\TableNode) { if ($expectedElements instanceof \Behat\Gherkin\Node\TableNode) {
@ -90,8 +126,7 @@ trait Trashbin {
*/ */
public function checkTrashSize($user, $folder, $expectedCount) { public function checkTrashSize($user, $folder, $expectedCount) {
$elementList = $this->listTrashbinFolder($user, $folder); $elementList = $this->listTrashbinFolder($user, $folder);
// first item is listed folder Assert::assertEquals($expectedCount, count($elementList));
Assert::assertEquals($expectedCount, count($elementList) - 1);
} }
/** /**
@ -100,25 +135,14 @@ trait Trashbin {
* @param string $file * @param string $file
*/ */
public function restoreFromTrash($user, $file) { public function restoreFromTrash($user, $file) {
// find the full name in trashbin $file = $this->getFullTrashPath($user, $file);
$file = ltrim($file, '/'); $url = $this->makeSabrePath($user, 'trash' . $file, 'trashbin');
$parent = dirname($file); $client = $this->getSabreClient($user);
if ($parent === '.') { $response = $client->request('MOVE', $url, null, [
$parent = ''; 'Destination' => $this->makeSabrePath($user, 'restore/' . basename($file), 'trashbin'),
} ]);
$elementList = $this->listTrashbinFolder($user, $parent); Assert::assertEquals(201, $response['statusCode']);
$name = basename($file); return;
foreach($elementList as $href => $item) {
if ($item['{http://nextcloud.org/ns}trashbin-filename'] === $name) {
$client = $this->getSabreClient($user);
$response = $client->request('MOVE', $href, null, [
'Destination' => $this->makeSabrePath($user, 'restore/' . $name, 'trashbin'),
]);
Assert::assertEquals(201, $response['statusCode']);
return;
}
}
Assert::fail("$file" . " is not in trash listing");
} }
} }

View File

@ -11,7 +11,7 @@ Feature: trashbin
When User "user0" deletes file "/textfile0.txt" When User "user0" deletes file "/textfile0.txt"
Then user "user0" in trash folder "/" should have 1 element Then user "user0" in trash folder "/" should have 1 element
And user "user0" in trash folder "/" should have the following elements And user "user0" in trash folder "/" should have the following elements
| /textfile0.txt | | textfile0.txt |
Scenario: clearing the trashbin Scenario: clearing the trashbin
Given As an "admin" Given As an "admin"
@ -28,3 +28,54 @@ Feature: trashbin
Then user "user0" in trash folder "/" should have 0 elements Then user "user0" in trash folder "/" should have 0 elements
And as "user0" the file "/textfile0.txt" exists And as "user0" the file "/textfile0.txt" exists
Scenario: deleting and restoring a folder
Given As an "admin"
And user "user0" exists
When User "user0" created a folder "/testfolder"
And User "user0" moves file "/textfile0.txt" to "/testfolder/textfile0.txt"
And as "user0" the file "/testfolder/textfile0.txt" exists
And User "user0" deletes file "/testfolder"
And user "user0" in trash folder "/" should have 1 element
And user "user0" in trash folder "/" should have the following elements
| testfolder |
And user "user0" in trash folder "/testfolder" should have 1 element
And user "user0" in trash folder "/testfolder" should have the following elements
| textfile0.txt |
And user "user0" in restores "/testfolder" from trash
Then user "user0" in trash folder "/" should have 0 elements
And as "user0" the file "/testfolder/textfile0.txt" exists
Scenario: deleting a file from a subfolder and restoring it moves it back to the subfolder
Given As an "admin"
And user "user0" exists
When User "user0" created a folder "/testfolder"
And User "user0" moves file "/textfile0.txt" to "/testfolder/textfile0.txt"
And as "user0" the file "/testfolder/textfile0.txt" exists
And User "user0" deletes file "/testfolder/textfile0.txt"
And user "user0" in trash folder "/" should have 1 element
And user "user0" in trash folder "/" should have the following elements
| textfile0.txt |
And user "user0" in restores "/textfile0.txt" from trash
Then user "user0" in trash folder "/" should have 0 elements
And as "user0" the file "/textfile0.txt" does not exist
And as "user0" the file "/testfolder/textfile0.txt" exists
Scenario: deleting and a folder and restoring a file inside it
Given As an "admin"
And user "user0" exists
When User "user0" created a folder "/testfolder"
And User "user0" moves file "/textfile0.txt" to "/testfolder/textfile0.txt"
And as "user0" the file "/testfolder/textfile0.txt" exists
And User "user0" deletes file "/testfolder"
And user "user0" in trash folder "/" should have 1 element
And user "user0" in trash folder "/" should have the following elements
| testfolder |
And user "user0" in trash folder "/testfolder" should have 1 element
And user "user0" in trash folder "/testfolder" should have the following elements
| textfile0.txt |
And user "user0" in restores "/testfolder/textfile0.txt" from trash
Then user "user0" in trash folder "/" should have 1 elements
And user "user0" in trash folder "/testfolder" should have 0 element
And as "user0" the file "/textfile0.txt" exists