Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[tests-only][full-ci] test downloading old file versions #38921

Merged
merged 5 commits into from
Jul 6, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 37 additions & 0 deletions tests/acceptance/features/apiVersions/fileVersions.feature
Original file line number Diff line number Diff line change
Expand Up @@ -415,3 +415,40 @@ Feature: dav-versions
Then the HTTP status code should be "207"
And the number of etag elements in the response should be "2"
And the number of versions should be "2"


Scenario: download old versions of a file
Given user "Alice" has uploaded file with content "uploaded content" to "textfile0.txt"
And user "Alice" has uploaded file with content "version 1" to "textfile0.txt"
And user "Alice" has uploaded file with content "version 2" to "textfile0.txt"
When user "Alice" downloads the version of file "textfile0.txt" with the index "1"
Then the HTTP status code should be "200"
And the following headers should be set
| header | value |
| Content-Disposition | attachment; filename*=UTF-8''textfile0.txt; filename="textfile0.txt" |
And the downloaded content should be "version 1"
When user "Alice" downloads the version of file "textfile0.txt" with the index "2"
Then the HTTP status code should be "200"
And the following headers should be set
| header | value |
| Content-Disposition | attachment; filename*=UTF-8''textfile0.txt; filename="textfile0.txt" |
And the downloaded content should be "uploaded content"


Scenario: download an old version of a restored file
Given user "Alice" has uploaded file with content "uploaded content" to "textfile0.txt"
And user "Alice" has uploaded file with content "version 1" to "textfile0.txt"
And user "Alice" has uploaded file with content "version 2" to "textfile0.txt"
And user "Alice" has restored version index "1" of file "textfile0.txt"
When user "Alice" downloads the version of file "textfile0.txt" with the index "1"
Then the HTTP status code should be "200"
And the following headers should be set
| header | value |
| Content-Disposition | attachment; filename*=UTF-8''textfile0.txt; filename="textfile0.txt" |
And the downloaded content should be "version 2"
When user "Alice" downloads the version of file "textfile0.txt" with the index "2"
Then the HTTP status code should be "200"
And the following headers should be set
| header | value |
| Content-Disposition | attachment; filename*=UTF-8''textfile0.txt; filename="textfile0.txt" |
And the downloaded content should be "uploaded content"
Original file line number Diff line number Diff line change
Expand Up @@ -296,3 +296,24 @@ Feature: dav-versions
Then the HTTP status code should be "204"
And the version folder of file "/Shares/sharefile.txt" for user "Brian" should contain "1" element
And the version folder of file "/sharefile.txt" for user "Alice" should contain "1" element

@issue-36228 @skipOnOcV10
Scenario: download old versions of a shared file as share receiver
Given user "Brian" has been created with default attributes and without skeleton files
And user "Alice" has uploaded file with content "uploaded content" to "textfile0.txt"
And user "Alice" has uploaded file with content "version 1" to "textfile0.txt"
And user "Alice" has uploaded file with content "version 2" to "textfile0.txt"
And user "Alice" has shared file "textfile0.txt" with user "Brian"
And user "Brian" has accepted share "/textfile0.txt" offered by user "Alice"
When user "Brian" downloads the version of file "/Shares/textfile0.txt" with the index "1"
Then the HTTP status code should be "200"
And the following headers should be set
| header | value |
| Content-Disposition | attachment; filename*=UTF-8''textfile0.txt; filename="textfile0.txt" |
And the downloaded content should be "version 1"
When user "Brian" downloads the version of file "/Shares/textfile0.txt" with the index "2"
Then the HTTP status code should be "200"
And the following headers should be set
| header | value |
| Content-Disposition | attachment; filename*=UTF-8''textfile0.txt; filename="textfile0.txt" |
And the downloaded content should be "uploaded content"
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
@api @files_versions-app-required @issue-36228 @notToImplementOnOCIS

Feature: dav-versions

Background:
Given the administrator has set the default folder for received shares to "Shares"
And auto-accept shares has been disabled
And user "Alice" has been created with default attributes and without skeleton files

Scenario: download old versions of a shared file as share receiver
Given user "Brian" has been created with default attributes and without skeleton files
And user "Alice" has uploaded file with content "uploaded content" to "textfile0.txt"
And user "Alice" has uploaded file with content "version 1" to "textfile0.txt"
And user "Alice" has uploaded file with content "version 2" to "textfile0.txt"
And user "Alice" has shared file "textfile0.txt" with user "Brian"
And user "Brian" has accepted share "/textfile0.txt" offered by user "Alice"
When user "Brian" downloads the version of file "/Shares/textfile0.txt" with the index "1"
Then the HTTP status code should be "200"
And the following headers should be set
| header | value |
| Content-Disposition | attachment; filename*=UTF-8''; filename="" |
And the downloaded content should be "version 1"
When user "Brian" downloads the version of file "/Shares/textfile0.txt" with the index "2"
Then the HTTP status code should be "200"
And the following headers should be set
| header | value |
| Content-Disposition | attachment; filename*=UTF-8''; filename="" |
And the downloaded content should be "uploaded content"
114 changes: 102 additions & 12 deletions tests/acceptance/features/bootstrap/FilesVersionsContext.php
Original file line number Diff line number Diff line change
Expand Up @@ -32,13 +32,71 @@
* Steps that relate to files_versions app
*/
class FilesVersionsContext implements Context {

/**
*
* @var FeatureContext
*/
private $featureContext;

/**
* @param string $fileId
*
* @return string
*/
private function getVersionsPathForFileId(string $fileId) {
return "/meta/$fileId/v";
}

/**
* @When user :user tries to get versions of file :file from :fileOwner
*
* @param string $user
* @param string $file
* @param string $fileOwner
*
* @return void
* @throws Exception
*/
public function userTriesToGetFileVersions($user, $file, $fileOwner) {
$user = $this->featureContext->getActualUsername($user);
$fileOwner = $this->featureContext->getActualUsername($fileOwner);
$fileId = $this->featureContext->getFileIdForPath($fileOwner, $file);
$response = $this->featureContext->makeDavRequest(
$user,
"PROPFIND",
$this->getVersionsPathForFileId($fileId),
null,
null,
null,
2
);
$this->featureContext->setResponse($response);
}

/**
* @When user :user gets the number of versions of file :file
*
* @param string $user
* @param string $file
*
* @return void
* @throws Exception
*/
public function userGetsFileVersions($user, $file) {
$user = $this->featureContext->getActualUsername($user);
$fileId = $this->featureContext->getFileIdForPath($user, $file);
$response = $this->featureContext->makeDavRequest(
$user,
"PROPFIND",
$this->getVersionsPathForFileId($fileId),
null,
null,
null,
2
);
$this->featureContext->setResponse($response);
}

/**
* @When user :user restores version index :versionIndex of file :path using the WebDAV API
* @Given user :user has restored version index :versionIndex of file :path
Expand All @@ -52,7 +110,7 @@ class FilesVersionsContext implements Context {
public function userRestoresVersionIndexOfFile($user, $versionIndex, $path) {
$user = $this->featureContext->getActualUsername($user);
$fileId = $this->featureContext->getFileIdForPath($user, $path);
$responseXml = $this->listVersionFolder($user, "/meta/$fileId/v", 1);
$responseXml = $this->listVersionFolder($user, $fileId, 1);
$xmlPart = $responseXml->xpath("//d:response/d:href");
//restoring the version only works with dav path v2
$destinationUrl = $this->featureContext->getBaseUrl() . "/" .
Expand Down Expand Up @@ -91,7 +149,7 @@ public function theVersionFolderOfFileShouldContainElements(
/**
* @Then the version folder of fileId :fileId for user :user should contain :count element(s)
*
* @param int $fileId
* @param string $fileId
* @param string $user
* @param int $count
*
Expand All @@ -102,7 +160,7 @@ public function theVersionFolderOfFileIdShouldContainElements(
$user,
$count
) {
$responseXml = $this->listVersionFolder($user, "/meta/$fileId/v", 1);
$responseXml = $this->listVersionFolder($user, $fileId, 1);
$xmlPart = $responseXml->xpath("//d:prop/d:getetag");
Assert::assertEquals(
$count,
Expand Down Expand Up @@ -131,7 +189,7 @@ public function theContentLengthOfFileForUserInVersionsFolderIs(
$fileId = $this->featureContext->getFileIdForPath($user, $path);
$responseXml = $this->listVersionFolder(
$user,
"/meta/$fileId/v",
$fileId,
1,
['getcontentlength']
);
Expand All @@ -144,22 +202,54 @@ public function theContentLengthOfFileForUserInVersionsFolderIs(
);
}

/**
* @When user :user downloads the version of file :path with the index :index
*
* @param string $user
* @param string $path
* @param string $index
*
* @return void
*/
public function downloadVersion(string $user, string $path, string $index) {
$user = $this->featureContext->getActualUsername($user);
$fileId = $this->featureContext->getFileIdForPath($user, $path);
$index = (int)$index;
$responseXml = $this->listVersionFolder($user, $fileId, 1);
$xmlPart = $responseXml->xpath("//d:response/d:href");
if (!isset($xmlPart[$index])) {
Assert::fail(
'could not find version of path "' . $path . '" with index "' . $index . '"'
);
}
// the href already contains the path
$url = WebDavHelper::sanitizeUrl(
$this->featureContext->getBaseUrlWithoutPath() . $xmlPart[$index]
);
$response = HttpRequestHelper::get(
$url,
$user,
$this->featureContext->getPasswordForUser($user)
);
$this->featureContext->setResponse($response);
}

/**
* returns the result parsed into an SimpleXMLElement
* with an registered namespace with 'd' as prefix and 'DAV:' as namespace
*
* @param string $user
* @param string $path
* @param string $fileId
* @param int $folderDepth
* @param string[] $properties
* @param string[]|null $properties
*
* @return SimpleXMLElement
*/
public function listVersionFolder(
$user,
$path,
$folderDepth,
$properties = null
string $user,
string $fileId,
int $folderDepth,
array $properties = null
) {
if (!$properties) {
$properties = [
Expand All @@ -172,7 +262,7 @@ public function listVersionFolder(
$this->featureContext->getBaseUrl(),
$user,
$password,
$path,
$this->getVersionsPathForFileId($fileId),
$properties,
$folderDepth,
"versions"
Expand Down
52 changes: 0 additions & 52 deletions tests/acceptance/features/bootstrap/WebDav.php
Original file line number Diff line number Diff line change
Expand Up @@ -396,58 +396,6 @@ public function downloadPreviews($user, $path, $doDavRequestAsUser, $width, $hei
);
}

/**
* @When user :user tries to get versions of file :file from :fileOwner
*
* @param string $user
* @param string $file
* @param string $fileOwner
*
* @return void
* @throws Exception
*/
public function userTriesToGetFileVersions($user, $file, $fileOwner) {
$user = $this->getActualUsername($user);
$fileOwner = $this->getActualUsername($fileOwner);
$fileId = $this->getFileIdForPath($fileOwner, $file);
$path = "/meta/" . $fileId . "/v";
$response = $this->makeDavRequest(
$user,
"PROPFIND",
$path,
null,
null,
null,
2
);
$this->setResponse($response);
}

/**
* @When user :user gets the number of versions of file :file
*
* @param string $user
* @param string $file
*
* @return void
* @throws Exception
*/
public function userGetsFileVersions($user, $file) {
$user = $this->getActualUsername($user);
$fileId = $this->getFileIdForPath($user, $file);
$path = "/meta/" . $fileId . "/v";
$response = $this->makeDavRequest(
$user,
"PROPFIND",
$path,
null,
null,
null,
2
);
$this->setResponse($response);
}

/**
* @Then the number of versions should be :arg1
*
Expand Down