127 lines
3.2 KiB
PHP
127 lines
3.2 KiB
PHP
<?php
|
|
/**
|
|
* @copyright Copyright (c) 2017, ownCloud GmbH.
|
|
*
|
|
* @author Vincent Petry <pvince81@owncloud.com>
|
|
*
|
|
* @license AGPL-3.0
|
|
*
|
|
* This code is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU Affero General Public License, version 3,
|
|
* as published by the Free Software Foundation.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU Affero General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Affero General Public License, version 3,
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>
|
|
*
|
|
*/
|
|
|
|
use GuzzleHttp\Client;
|
|
use GuzzleHttp\Message\ResponseInterface;
|
|
use PHPUnit\Framework\Assert;
|
|
|
|
require __DIR__ . '/../../vendor/autoload.php';
|
|
|
|
/**
|
|
* Trashbin functions
|
|
*/
|
|
trait Trashbin {
|
|
|
|
/**
|
|
* @When User :user empties trashbin
|
|
* @param string $user user
|
|
*/
|
|
public function emptyTrashbin($user) {
|
|
$this->asAn($user);
|
|
$body = new \Behat\Gherkin\Node\TableNode([['allfiles', 'true'], ['dir', '%2F']]);
|
|
$this->sendingToWithDirectUrl('POST', "/index.php/apps/files_trashbin/ajax/delete.php", $body);
|
|
$this->theHTTPStatusCodeShouldBe('200');
|
|
}
|
|
|
|
/**
|
|
* List trashbin folder
|
|
*
|
|
* @param string $user user
|
|
* @param string $path path
|
|
* @return array response
|
|
*/
|
|
public function listTrashbinFolder($user, $path){
|
|
$this->asAn($user);
|
|
$this->sendingToWithDirectUrl('PROPFIND', "/remote.php/dav/trashbin/$user/$path", null);
|
|
$this->theHTTPStatusCodeShouldBe('200');
|
|
|
|
$body = $this->response->getBody();
|
|
if($body && substr($body, 0, 1) === '<') {
|
|
$reader = new Sabre\Xml\Reader();
|
|
$reader->xml($body);
|
|
return $reader->parse();
|
|
} else {
|
|
return [];
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @Then /^as "([^"]*)" the (file|folder|entry) "([^"]*)" exists in trash$/
|
|
* @param string $user
|
|
* @param string $entryText
|
|
* @param string $path
|
|
*/
|
|
public function asTheFileOrFolderExistsInTrash($user, $entryText, $path) {
|
|
$path = trim($path, '/');
|
|
$sections = explode('/', $path, 2);
|
|
|
|
$firstEntry = $this->findFirstTrashedEntry($user, trim($sections[0], '/'));
|
|
|
|
Assert::assertNotNull($firstEntry);
|
|
|
|
// query was on the main element ?
|
|
if (count($sections) === 1) {
|
|
// already found, return
|
|
return;
|
|
}
|
|
|
|
$subdir = trim(dirname($sections[1]), '/');
|
|
if ($subdir !== '' && $subdir !== '.') {
|
|
$subdir = $firstEntry . '/' . $subdir;
|
|
} else {
|
|
$subdir = $firstEntry;
|
|
}
|
|
|
|
$listing = $this->listTrashbinFolder($user, $subdir);
|
|
$checkedName = basename($path);
|
|
|
|
$found = false;
|
|
foreach ($listing as $entry) {
|
|
if ($entry['name'] === $checkedName) {
|
|
$found = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
Assert::assertTrue($found);
|
|
}
|
|
|
|
/**
|
|
* Finds the first trashed entry matching the given name
|
|
*
|
|
* @param string $name
|
|
* @return string|null real entry name with timestamp suffix or null if not found
|
|
*/
|
|
private function findFirstTrashedEntry($user, $name) {
|
|
$listing = $this->listTrashbinFolder($user, '/');
|
|
|
|
foreach ($listing as $entry) {
|
|
if ($entry['name'] === $name) {
|
|
return $entry['name'] . '.d' . ((int)$entry['mtime'] / 1000);
|
|
}
|
|
}
|
|
|
|
return null;
|
|
}
|
|
}
|
|
|