when: | when: | ||||
matrix: | matrix: | ||||
TESTS: integration-ldap-features | TESTS: integration-ldap-features | ||||
integration-trashbin: | |||||
image: nextcloudci/integration-php7.0:integration-php7.0-3 | |||||
commands: | |||||
- ./occ maintenance:install --admin-pass=admin | |||||
- cd build/integration | |||||
- ./run.sh features/trashbin.feature | |||||
when: | |||||
matrix: | |||||
TESTS: integration-trashbin | |||||
nodb-codecov: | nodb-codecov: | ||||
image: nextcloudci/php7.0:php7.0-7 | image: nextcloudci/php7.0:php7.0-7 | ||||
commands: | commands: | ||||
- TESTS: integration-filesdrop-features | - TESTS: integration-filesdrop-features | ||||
- TESTS: integration-transfer-ownership-features | - TESTS: integration-transfer-ownership-features | ||||
- TESTS: integration-ldap-features | - TESTS: integration-ldap-features | ||||
- TESTS: integration-trashbin | |||||
- TESTS: jsunit | - TESTS: jsunit | ||||
- TESTS: check-autoloader | - TESTS: check-autoloader | ||||
- TESTS: app-check-code | - TESTS: app-check-code |
trait BasicStructure { | trait BasicStructure { | ||||
use Auth; | use Auth; | ||||
use Trashbin; | |||||
/** @var string */ | /** @var string */ | ||||
private $currentUser = ''; | private $currentUser = ''; | ||||
fclose($file); | fclose($file); | ||||
} | } | ||||
/** | |||||
* @When User :user empties trashbin | |||||
* @param string $user | |||||
*/ | |||||
public function emptyTrashbin($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'); | |||||
} | |||||
/** | /** | ||||
* @When Sleep for :seconds seconds | * @When Sleep for :seconds seconds | ||||
* @param int $seconds | * @param int $seconds |
<?php | |||||
/** | |||||
* @author Vincent Petry <pvince81@owncloud.com> | |||||
* | |||||
* @copyright Copyright (c) 2017, ownCloud GmbH. | |||||
* @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; | |||||
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); | |||||
$params = '?dir=' . rawurlencode('/' . trim($path, '/')); | |||||
$this->sendingToWithDirectUrl('GET', '/index.php/apps/files_trashbin/ajax/list.php' . $params, null); | |||||
$this->theHTTPStatusCodeShouldBe('200'); | |||||
$response = json_decode($this->response->getBody(), true); | |||||
return $response['data']['files']; | |||||
} | |||||
/** | |||||
* @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], '/')); | |||||
PHPUnit_Framework_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; | |||||
} | |||||
} | |||||
PHPUnit_Framework_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; | |||||
} | |||||
} | |||||
| /subfolder/textfile0.txt | | | /subfolder/textfile0.txt | | ||||
| /subfolder/textfile2.txt | | | /subfolder/textfile2.txt | | ||||
Scenario: moving a favorite file out of a share keeps favorite state | |||||
Given using old dav path | |||||
And As an "admin" | |||||
And user "user0" exists | |||||
And user "user1" exists | |||||
And user "user0" created a folder "/shared" | |||||
And User "user0" moved file "/textfile0.txt" to "/shared/shared_file.txt" | |||||
And folder "/shared" of user "user0" is shared with user "user1" | |||||
And user "user1" favorites element "/shared/shared_file.txt" | |||||
When User "user1" moved file "/shared/shared_file.txt" to "/taken_out.txt" | |||||
Then user "user1" in folder "/" should have favorited the following elements | |||||
| /taken_out.txt | | |||||
And Updating last share with | And Updating last share with | ||||
| publicUpload | true | | | publicUpload | true | | ||||
Then the OCS status code should be "404" | Then the OCS status code should be "404" | ||||
And the HTTP status code should be "200" | |||||
Scenario: deleting file out of a share as recipient creates a backup for the owner | |||||
Given As an "admin" | |||||
And user "user0" exists | |||||
And user "user1" exists | |||||
And user "user0" created a folder "/shared" | |||||
And User "user0" moved file "/textfile0.txt" to "/shared/shared_file.txt" | |||||
And folder "/shared" of user "user0" is shared with user "user1" | |||||
When User "user1" deletes file "/shared/shared_file.txt" | |||||
Then as "user1" the file "/shared/shared_file.txt" does not exist | |||||
And as "user0" the file "/shared/shared_file.txt" does not exist | |||||
And as "user0" the file "/shared_file.txt" exists in trash | |||||
And as "user1" the file "/shared_file.txt" exists in trash | |||||
Scenario: deleting folder out of a share as recipient creates a backup for the owner | |||||
Given As an "admin" | |||||
And user "user0" exists | |||||
And user "user1" exists | |||||
And user "user0" created a folder "/shared" | |||||
And user "user0" created a folder "/shared/sub" | |||||
And User "user0" moved file "/textfile0.txt" to "/shared/sub/shared_file.txt" | |||||
And folder "/shared" of user "user0" is shared with user "user1" | |||||
When User "user1" deletes folder "/shared/sub" | |||||
Then as "user1" the folder "/shared/sub" does not exist | |||||
And as "user0" the folder "/shared/sub" does not exist | |||||
And as "user0" the folder "/sub" exists in trash | |||||
And as "user0" the file "/sub/shared_file.txt" exists in trash | |||||
And as "user1" the folder "/sub" exists in trash | |||||
And as "user1" the file "/sub/shared_file.txt" exists in trash |
Feature: trashbin | |||||
Background: | |||||
Given using api version "1" | |||||
And using old dav path | |||||
And As an "admin" | |||||
And app "files_trashbin" is enabled | |||||
Scenario: deleting a file moves it to trashbin | |||||
Given As an "admin" | |||||
And user "user0" exists | |||||
When User "user0" deletes file "/textfile0.txt" | |||||
Then as "user0" the file "/textfile0.txt" exists in trash | |||||