From d821f7487a6b106313824d1b57bb881142110b14 Mon Sep 17 00:00:00 2001 From: Maxence Lange Date: Fri, 24 Nov 2023 08:35:01 -0100 Subject: [PATCH] confirm content on dav-v2 test Signed-off-by: Maxence Lange --- .../integration/features/bootstrap/WebDav.php | 68 +++++++++++++++---- build/integration/features/dav-v2.feature | 19 ++++-- 2 files changed, 69 insertions(+), 18 deletions(-) diff --git a/build/integration/features/bootstrap/WebDav.php b/build/integration/features/bootstrap/WebDav.php index 4212f56ce2b44..c239461b78864 100644 --- a/build/integration/features/bootstrap/WebDav.php +++ b/build/integration/features/bootstrap/WebDav.php @@ -7,6 +7,7 @@ * @author Joas Schilling * @author John Molakvoæ * @author Lukas Reschke + * @author Maxence Lange * @author Morris Jobke * @author Robin Appelman * @author Roeland Jago Douma @@ -31,9 +32,10 @@ * along with this program. If not, see . * */ + use GuzzleHttp\Client as GClient; -use GuzzleHttp\Message\ResponseInterface; use PHPUnit\Framework\Assert; +use Psr\Http\Message\ResponseInterface; use Sabre\DAV\Client as SClient; use Sabre\DAV\Xml\Property\ResourceType; @@ -43,17 +45,13 @@ trait WebDav { use Sharing; - /** @var string */ - private $davPath = "remote.php/webdav"; - /** @var boolean */ - private $usingOldDavPath = true; + private string $davPath = "remote.php/webdav"; + private bool $usingOldDavPath = true; + private ?array $storedETAG = null; // map with user as key and another map as value, which has path as key and etag as value + private ?int $storedFileID = null; /** @var ResponseInterface */ private $response; - /** @var array map with user as key and another map as value, which has path as key and etag as value */ - private $storedETAG = null; - /** @var int */ - private $storedFileID = null; - + private array $parsedResponse = []; private string $s3MultipartDestination; private string $uploadId; @@ -237,7 +235,7 @@ public function search(): void { public function searchFavorite(): void { $this->searchFile( $this->currentUser, - null, + '', null, ' @@ -333,6 +331,19 @@ public function asTheFileOrFolderExists($user, $entry, $path) { $this->response = $this->listFolder($user, $path, 0); } + /** + * @Then the response should be empty + * @throws \Exception + */ + public function theResponseShouldBeEmpty(): void { + $response = ($this->response instanceof ResponseInterface) ? $this->convertResponseToDavEntries() : $this->response; + if ($response === []) { + return; + } + + throw new \Exception('response is not empty'); + } + /** * @Then the single response should contain a property :key with value :value * @param string $key @@ -340,12 +351,12 @@ public function asTheFileOrFolderExists($user, $entry, $path) { * @throws \Exception */ public function theSingleResponseShouldContainAPropertyWithValue($key, $expectedValue) { - $keys = $this->response; - if (!array_key_exists($key, $keys)) { + $response = ($this->response instanceof ResponseInterface) ? $this->convertResponseToDavSingleEntry() : $this->response; + if (!array_key_exists($key, $response)) { throw new \Exception("Cannot find property \"$key\" with \"$expectedValue\""); } - $value = $keys[$key]; + $value = $response[$key]; if ($value instanceof ResourceType) { $value = $value->getValue(); if (empty($value)) { @@ -533,6 +544,7 @@ public function searchFile(string $user, ?string $properties = null, ?string $sc $this->response = $this->makeDavRequest($user, "SEARCH", '', [ 'Content-Type' => 'text/xml' ], $body, ''); + var_dump((string)$this->response->getBody()); } catch (\GuzzleHttp\Exception\ServerException $e) { // 5xx responses cause a server exception @@ -1112,4 +1124,32 @@ public function theUploadShouldFailOnObjectStorage() { $this->theHTTPStatusCodeShouldBe(500); } } + + /** + * @return array + * @throws Exception + */ + private function convertResponseToDavSingleEntry(): array { + $results = $this->convertResponseToDavEntries(); + if (count($results) > 1) { + throw new \Exception('result is empty or contain more than one (1) entry'); + } + + return array_shift($results); + } + + /** + * @return array + */ + private function convertResponseToDavEntries(): array { + $client = $this->getSabreClient($this->currentUser); + $parsedResponse = $client->parseMultiStatus((string)$this->response->getBody()); + + $results = []; + foreach ($parsedResponse as $href => $statusList) { + $results[$href] = $statusList[200] ?? []; + } + + return $results; + } } diff --git a/build/integration/features/dav-v2.feature b/build/integration/features/dav-v2.feature index 235ae5339134e..a3ac59578e97e 100644 --- a/build/integration/features/dav-v2.feature +++ b/build/integration/features/dav-v2.feature @@ -81,16 +81,27 @@ Feature: dav-v2 When User "user0" uploads file "data/textfile.txt" to "/testquota/asdf.txt" Then the HTTP status code should be "201" - Scenario: Create a search query + Scenario: Create a search query on image Given using new dav path And As an "admin" - When User "user0" uploads file "data/green-square-256.png" to "/image.png" - When Image search should work + And user "user0" exists + And As an "user0" + When User "user0" uploads file "data/textfile.txt" to "/testquota/asdf.txt" + Then Image search should work + And the response should be empty + When User "user0" uploads file "data/green-square-256.png" to "/image.png" + Then Image search should work + And the single response should contain a property "{DAV:}getcontenttype" with value "image/png" Scenario: Create a search query on favorite Given using new dav path And As an "admin" And user "user0" exists + And As an "user0" When User "user0" uploads file "data/green-square-256.png" to "/fav_image.png" + Then Favorite search should work + And the response should be empty When user "user0" favorites element "/fav_image.png" - When Favorite search should work + Then Favorite search should work + And the single response should contain a property "{http://owncloud.org/ns}favorite" with value "1" +