test zip archive download

This commit is contained in:
Artur Neumann
2021-11-10 13:54:49 +05:45
parent 89d4f2ae28
commit 701da23141
2 changed files with 39 additions and 12 deletions
@@ -11,21 +11,33 @@ Feature: download multiple resources bundled into an archive
Background: Background:
Given user "Alice" has been created with default attributes and without skeleton files Given user "Alice" has been created with default attributes and without skeleton files
Scenario: download a single file Scenario Outline: download a single file
Given user "Alice" has uploaded file with content "some data" to "/textfile0.txt" Given user "Alice" has uploaded file with content "some data" to "/textfile0.txt"
When user "Alice" downloads the archive of "/textfile0.txt" using the resource id When user "Alice" downloads the archive of "/textfile0.txt" using the resource id and setting these headers
| header | value |
| User-Agent | <user-agent> |
Then the HTTP status code should be "200" Then the HTTP status code should be "200"
And the downloaded archive should contain these files: And the downloaded <archive-type> archive should contain these files:
| name | content | | name | content |
| textfile0.txt | some data | | textfile0.txt | some data |
Examples:
| user-agent | archive-type |
| Linux | tar |
| Windows NT | zip |
Scenario: download a single folder Scenario Outline: download a single folder
Given user "Alice" has created folder "my_data" Given user "Alice" has created folder "my_data"
And user "Alice" has uploaded file with content "some data" to "/my_data/textfile0.txt" And user "Alice" has uploaded file with content "some data" to "/my_data/textfile0.txt"
And user "Alice" has uploaded file with content "more data" to "/my_data/an_other_file.txt" And user "Alice" has uploaded file with content "more data" to "/my_data/an_other_file.txt"
When user "Alice" downloads the archive of "/my_data" using the resource id When user "Alice" downloads the archive of "/my_data" using the resource id and setting these headers
| header | value |
| User-Agent | <user-agent> |
Then the HTTP status code should be "200" Then the HTTP status code should be "200"
And the downloaded archive should contain these files: And the downloaded <archive-type> archive should contain these files:
| name | content | | name | content |
| my_data/textfile0.txt | some data | | my_data/textfile0.txt | some data |
| my_data/an_other_file.txt | more data | | my_data/an_other_file.txt | more data |
Examples:
| user-agent | archive-type |
| Linux | tar |
| Windows NT | zip |
@@ -63,16 +63,29 @@ class ArchiverContext implements Context {
} }
/** /**
* @When user :user downloads the archive of :resourceId using the resource id * @When user :user downloads the archive of :resourceId using the resource id and setting these headers
* *
* @param string $user * @param string $user
* @param string $resource * @param string $resource
* @param TableNode $headersTable
* *
* @return void * @return void
* *
* @throws \GuzzleHttp\Exception\GuzzleException * @throws \GuzzleHttp\Exception\GuzzleException
*/ */
public function userDownloadsTheArchiveOfUsingTheResourceId(string $user, string $resource): void { public function userDownloadsTheArchiveOfUsingTheResourceId(
string $user,
string $resource,
TableNode $headersTable
): void {
$this->featureContext->verifyTableNodeColumns(
$headersTable,
['header', 'value']
);
$headers = [];
foreach ($headersTable as $row) {
$headers[$row['header']] = $row ['value'];
}
$resourceId = $this->featureContext->getFileIdForPath($user, $resource); $resourceId = $this->featureContext->getFileIdForPath($user, $resource);
$user = $this->featureContext->getActualUsername($user); $user = $this->featureContext->getActualUsername($user);
$this->featureContext->setResponse( $this->featureContext->setResponse(
@@ -80,25 +93,27 @@ class ArchiverContext implements Context {
$this->featureContext->getBaseUrl() . '/archiver?id=' . $resourceId, $this->featureContext->getBaseUrl() . '/archiver?id=' . $resourceId,
'', '',
$user, $user,
$this->featureContext->getPasswordForUser($user) $this->featureContext->getPasswordForUser($user),
$headers
) )
); );
} }
/** /**
* @Then the downloaded archive should contain these files: * @Then the downloaded :type archive should contain these files:
* *
* @param string $type
* @param TableNode $expectedFiles * @param TableNode $expectedFiles
* *
* @return void * @return void
* *
* @throws Exception * @throws Exception
*/ */
public function theDownloadedArchiveShouldContainTheseFiles(TableNode $expectedFiles) { public function theDownloadedArchiveShouldContainTheseFiles(string $type, TableNode $expectedFiles) {
$this->featureContext->verifyTableNodeColumns($expectedFiles, ['name', 'content']); $this->featureContext->verifyTableNodeColumns($expectedFiles, ['name', 'content']);
$tempFile = \tempnam(\sys_get_temp_dir(), 'OcAcceptanceTests_'); $tempFile = \tempnam(\sys_get_temp_dir(), 'OcAcceptanceTests_');
\unlink($tempFile); // we only need the name \unlink($tempFile); // we only need the name
$tempFile = $tempFile . '.tar'; // it needs the extension $tempFile = $tempFile . '.' . $type; // it needs the extension
\file_put_contents($tempFile, $this->featureContext->getResponse()->getBody()->getContents()); \file_put_contents($tempFile, $this->featureContext->getResponse()->getBody()->getContents());
$archive = UnifiedArchive::open($tempFile); $archive = UnifiedArchive::open($tempFile);
foreach ($expectedFiles->getHash() as $expectedFile) { foreach ($expectedFiles->getHash() as $expectedFile) {