diff --git a/tests/TestHelpers/WebDavHelper.php b/tests/TestHelpers/WebDavHelper.php index 55064e7fb0..56d15d92b5 100644 --- a/tests/TestHelpers/WebDavHelper.php +++ b/tests/TestHelpers/WebDavHelper.php @@ -63,6 +63,18 @@ class WebDavHelper { } } + /** + * @param string $namespaceString + * + * @return object + */ + public static function parseNamespace(string $namespaceString): object { + //calculate the namespace prefix and namespace + $matches = []; + \preg_match("/^(.*)='(.*)'$/", $namespaceString, $matches); + return (object)["namespace" => $matches[2], "prefix" => $matches[1]]; + } + /** * returns the id of a file * @@ -132,12 +144,9 @@ class WebDavHelper { //also used if no prefix is given in the property value $namespacePrefix = null; } else { - //calculate the namespace prefix and namespace from the array key - $matches = []; - \preg_match("/^(.*)='(.*)'$/", $namespaceString, $matches); - $nameSpace = $matches[2]; - $namespacePrefix = $matches[1]; - $extraNamespaces .= " xmlns:$namespacePrefix=\"$nameSpace\" "; + $ns = self::parseNamespace($namespaceString); + $namespacePrefix = $ns->prefix; + $extraNamespaces .= " xmlns:$namespacePrefix=\"$ns->namespace\" "; } //if a namespace prefix is given in the property value use that if (\strpos($property, ":") !== false) { @@ -263,14 +272,11 @@ class WebDavHelper { ?string $type="files" ):ResponseInterface { if ($namespaceString !== null) { - $matches = []; - \preg_match("/^(.*)='(.*)'$/", $namespaceString, $matches); - $namespace = $matches[2]; - $namespacePrefix = $matches[1]; - $propertyBody = "<$namespacePrefix:$propertyName" . - " xmlns:$namespacePrefix=\"$namespace\">" . + $ns = self::parseNamespace($namespaceString); + $propertyBody = "<$ns->prefix:$propertyName" . + " xmlns:$ns->prefix=\"$ns->namespace\">" . "$propertyValue" . - ""; + "prefix:$propertyName>"; } else { $propertyBody = "<$propertyName>$propertyValue"; } @@ -299,12 +305,12 @@ class WebDavHelper { * gets namespace-prefix, namespace url and propName from provided namespaceString or property * or otherwise use default * - * @param string|null $namespaceString - * @param string|null $property + * @param string $namespaceString + * @param string $property * * @return array */ - public static function getPropertyWithNamespaceInfo(?string $namespaceString = "", ?string $property = ""):array { + public static function getPropertyWithNamespaceInfo(string $namespaceString = "", string $property = ""):array { $namespace = ""; $namespacePrefix = ""; if (\is_int($namespaceString)) { @@ -313,11 +319,9 @@ class WebDavHelper { $namespacePrefix = "d"; $namespace = "DAV:"; } elseif ($namespaceString) { - //calculate the namespace prefix and namespace from the array key - $matches = []; - \preg_match("/^(.*)='(.*)'$/", $namespaceString, $matches); - $namespacePrefix = $matches[1]; - $namespace = $matches[2]; + $ns = self::parseNamespace($namespaceString); + $namespacePrefix = $ns->prefix; + $namespace = $ns->namespace; } //if a namespace prefix is given in the property value use that if ($property && \strpos($property, ":")) { @@ -352,20 +356,26 @@ class WebDavHelper { ?array $propertiesArray, ?string $xRequestId = '', ?int $davPathVersion = null, - ?string $namespaceString = "oc='http://owncloud.org/ns'", + ?string $namespaceString = null, ?string $type="files" ):ResponseInterface { $propertyBody = ""; foreach ($propertiesArray as $propertyArray) { $property = $propertyArray["propertyName"]; $value = $propertyArray["propertyValue"]; - [$namespacePrefix, $namespace, $property] = self::getPropertyWithNamespaceInfo( - $namespaceString, - $property - ); - $propertyBody .= "\n\t<$namespacePrefix:$property>" . - "$value" . - ""; + + if ($namespaceString !== null) { + $matches = []; + [$namespacePrefix, $namespace, $property] = self::getPropertyWithNamespaceInfo( + $namespaceString, + $property + ); + $propertyBody .= "\n\t<$namespacePrefix:$property>" . + "$value" . + ""; + } else { + $propertyBody .= "<$property>$value"; + } } $body = " $matches[2], "prefix" => $matches[1]]; - } - /** * @When /^user "([^"]*)" gets the properties of (?:file|folder|entry) "([^"]*)" using the WebDAV API$/ * @@ -165,10 +153,7 @@ class WebDavPropertiesContext implements Context { } /** - * @Given /^user "([^"]*)" has set the following properties of (?:file|folder|entry) "([^"]*)" using the WebDav API$/ - * - * if no namespace prefix is provided before property, default `oc:` prefix is set for added props - * only and everything rest on xml is set to prefix `d:` + * @Given /^user "([^"]*)" has set the following properties to (?:file|folder|entry) "([^"]*)" using the WebDav API$/ * * @param string $username * @param string $path @@ -490,7 +475,7 @@ class WebDavPropertiesContext implements Context { $this->featureContext->getResponse(), __METHOD__ ); - $ns = $this->parseNamespace($namespaceString); + $ns = WebDavHelper::parseNamespace($namespaceString); $responseXmlObject->registerXPathNamespace( $ns->prefix, $ns->namespace @@ -646,7 +631,7 @@ class WebDavPropertiesContext implements Context { $xmlPart = $this->featureContext->getResponseXml($response); if ($namespaceString !== null) { - $ns = $this->parseNamespace($namespaceString); + $ns = WebDavHelper::parseNamespace($namespaceString); $xmlPart->registerXPathNamespace( $ns->prefix, $ns->namespace @@ -1264,6 +1249,23 @@ class WebDavPropertiesContext implements Context { ); } + /** + * @param string $href + * + * @return string + */ + public function parseBaseDavPathFromXMLHref(string $href): string { + $hrefArr = \explode('/', $href); + if (\in_array("webdav", $hrefArr)) { + $hrefArr = \array_slice($hrefArr, 0, \array_search("webdav", $hrefArr) + 1); + } elseif (\in_array("files", $hrefArr)) { + $hrefArr = \array_slice($hrefArr, 0, \array_search("files", $hrefArr) + 2); + } elseif (\in_array("spaces", $hrefArr)) { + $hrefArr = \array_slice($hrefArr, 0, \array_search("spaces", $hrefArr) + 2); + } + return \implode('/', $hrefArr); + } + /** * @Then as user :username the last response should have the following properties * @@ -1283,28 +1285,14 @@ class WebDavPropertiesContext implements Context { $this->featureContext->verifyTableNodeColumns($expectedPropTable, ['resource', 'propertyName', 'propertyValue']); $responseXmlObject = $this->featureContext->getResponseXml(); - $hrefSplitUptoUsername = \explode("/", (string)$responseXmlObject->xpath("//d:href")[0]); - $xmlHrefSplitArray = \array_slice( - $hrefSplitUptoUsername, - 0, - \array_search($username, $hrefSplitUptoUsername) + 1 - ); - $xmlHref = \implode("/", $xmlHrefSplitArray); + $href = (string)$responseXmlObject->xpath("//d:href")[0]; + $hrefBase = $this->parseBaseDavPathFromXMLHref($href); + foreach ($expectedPropTable->getColumnsHash() as $col) { - if ($col["propertyName"] === "status") { - $xmlPart = $responseXmlObject->xpath( - "//d:href[.='" . - $xmlHref . $col["resource"] . - "']/following-sibling::d:propstat//d:" . - $col["propertyName"] - ); - } else { - $xmlPart = $responseXmlObject->xpath( - "//d:href[.= '" . - $xmlHref . $col["resource"] . - "']/..//oc:" . $col["propertyName"] - ); - } + $xpath = "//d:href[.='$hrefBase" . $col["resource"] . "']" . + "/following-sibling::d:propstat//" . $col["propertyName"]; + $xmlPart = $responseXmlObject->xpath($xpath); + Assert::assertEquals( $col["propertyValue"], $xmlPart[0], diff --git a/tests/acceptance/features/coreApiWebdavProperties/getFileProperties.feature b/tests/acceptance/features/coreApiWebdavProperties/getFileProperties.feature index 22766e1ec8..24680b033b 100644 --- a/tests/acceptance/features/coreApiWebdavProperties/getFileProperties.feature +++ b/tests/acceptance/features/coreApiWebdavProperties/getFileProperties.feature @@ -297,20 +297,20 @@ Feature: get file properties Given using DAV path And user "Alice" has created folder "/TestFolder" And user "Alice" has uploaded file with content "test data one" to "/TestFolder/test1.txt" - And user "Alice" has set the following properties of file "/TestFolder/test1.txt" using the WebDav API + And user "Alice" has set the following properties to file "/TestFolder/test1.txt" using the WebDav API | propertyName | propertyValue | | testprop1 | AAAAA | | testprop2 | BBBBB | When user "Alice" gets the following properties of file "/TestFolder/test1.txt" using the WebDAV API | propertyName | - | oc:testprop1 | - | oc:testprop2 | + | testprop1 | + | testprop2 | Then the HTTP status code should be "207" And as user "Alice" the last response should have the following properties | resource | propertyName | propertyValue | | /TestFolder/test1.txt | testprop1 | AAAAA | | /TestFolder/test1.txt | testprop2 | BBBBB | - | /TestFolder/test1.txt | status | HTTP/1.1 200 OK | + | /TestFolder/test1.txt | d:status | HTTP/1.1 200 OK | Examples: | dav-path-version | | new | @@ -323,18 +323,18 @@ Feature: get file properties And user "Alice" has created folder "/TestFolder" And user "Alice" has uploaded file with content "test data one" to "/TestFolder/test1.txt" And user "Alice" has uploaded file with content "test data two" to "/TestFolder/test2.txt" - And user "Alice" has set the following properties of file "/TestFolder/test1.txt" using the WebDav API + And user "Alice" has set the following properties to file "/TestFolder/test1.txt" using the WebDav API | propertyName | propertyValue | | testprop1 | AAAAA | | testprop2 | BBBBB | - And user "Alice" has set the following properties of file "/TestFolder/test2.txt" using the WebDav API + And user "Alice" has set the following properties to file "/TestFolder/test2.txt" using the WebDav API | propertyName | propertyValue | | testprop1 | CCCCC | | testprop2 | DDDDD | When user "Alice" gets the following properties of folder "/TestFolder" using the WebDAV API | propertyName | - | oc:testprop1 | - | oc:testprop2 | + | testprop1 | + | testprop2 | Then the HTTP status code should be "207" And as user "Alice" the last response should have the following properties | resource | propertyName | propertyValue | @@ -342,7 +342,7 @@ Feature: get file properties | /TestFolder/test1.txt | testprop2 | BBBBB | | /TestFolder/test2.txt | testprop1 | CCCCC | | /TestFolder/test2.txt | testprop2 | DDDDD | - | /TestFolder/ | status | HTTP/1.1 404 Not Found | + | /TestFolder/ | d:status | HTTP/1.1 404 Not Found | Examples: | dav-path-version | | new |