diff --git a/.drone.star b/.drone.star
index 102c53b7c5..c11ead2c59 100644
--- a/.drone.star
+++ b/.drone.star
@@ -932,6 +932,8 @@ def localApiTestPipeline(ctx):
return pipelines
def localApiTests(suite, storage, extra_environment = {}):
+ expectedFailuresFile = "%s/tests/acceptance/expected-failures-localAPI-on-%s-storage.md" % (dirs["base"], storage.upper())
+
environment = {
"PATH_TO_OCIS": dirs["base"],
"TEST_SERVER_URL": OCIS_URL,
@@ -945,6 +947,7 @@ def localApiTests(suite, storage, extra_environment = {}):
"EXPECTED_FAILURES_FILE": "%s/tests/acceptance/expected-failures-localAPI-on-%s-storage.md" % (dirs["base"], storage.upper()),
"UPLOAD_DELETE_WAIT_TIME": "1" if storage == "owncloud" else 0,
"OCIS_WRAPPER_URL": "http://ocis-server:5200",
+ "WITH_REMOTE_PHP": False,
}
for item in extra_environment:
@@ -955,7 +958,9 @@ def localApiTests(suite, storage, extra_environment = {}):
"image": OC_CI_PHP % DEFAULT_PHP_VERSION,
"environment": environment,
"commands": [
- "make test-acceptance-api",
+ "cat %s/tests/acceptance/expected-failures-without-remotephp.md >> %s" % (dirs["base"], expectedFailuresFile),
+ "make -C %s test-acceptance-api" % (dirs["base"]),
+ "cat %s" % expectedFailuresFile,
],
}]
@@ -1143,9 +1148,12 @@ def coreApiTests(ctx, part_number = 1, number_of_parts = 1, storage = "ocis", ac
"EXPECTED_FAILURES_FILE": expectedFailuresFile,
"UPLOAD_DELETE_WAIT_TIME": "1" if storage == "owncloud" else 0,
"OCIS_WRAPPER_URL": "http://ocis-server:5200",
+ "WITH_REMOTE_PHP": False,
},
"commands": [
+ "cat %s/tests/acceptance/expected-failures-without-remotephp.md >> %s" % (dirs["base"], expectedFailuresFile),
"make -C %s test-acceptance-api" % (dirs["base"]),
+ "cat %s" % expectedFailuresFile,
],
},
] +
diff --git a/tests/acceptance/TestHelpers/HttpRequestHelper.php b/tests/acceptance/TestHelpers/HttpRequestHelper.php
index 66bb859d62..f19b30472c 100644
--- a/tests/acceptance/TestHelpers/HttpRequestHelper.php
+++ b/tests/acceptance/TestHelpers/HttpRequestHelper.php
@@ -104,6 +104,27 @@ class HttpRequestHelper {
$timeout
);
}
+
+ if (WebdavHelper::isDAVRequest($url) && \str_starts_with($url, OcisHelper::getServerUrl())) {
+ $withRemotePhp = \getenv("WITH_REMOTE_PHP") === "true";
+ $urlHasRemotePhp = \str_contains($url, 'remote.php');
+ if (!$withRemotePhp && $urlHasRemotePhp) {
+ throw new Exception("remote.php is disabled but found in the URL: $url");
+ }
+ if ($withRemotePhp && !$urlHasRemotePhp) {
+ throw new Exception("remote.php is enabled but not found in the URL: $url");
+ }
+
+ if ($headers && \array_key_exists("Destination", $headers)) {
+ if (!$withRemotePhp && $urlHasRemotePhp) {
+ throw new Exception("remote.php is disabled but found in the URL: $url");
+ }
+ if ($withRemotePhp && !$urlHasRemotePhp) {
+ throw new Exception("remote.php is enabled but not found in the URL: $url");
+ }
+ }
+ }
+
$request = self::createRequest(
$url,
$xRequestId,
diff --git a/tests/acceptance/TestHelpers/OcisHelper.php b/tests/acceptance/TestHelpers/OcisHelper.php
index ca6d46d9ba..2aa14ad34a 100644
--- a/tests/acceptance/TestHelpers/OcisHelper.php
+++ b/tests/acceptance/TestHelpers/OcisHelper.php
@@ -33,6 +33,16 @@ use GuzzleHttp\Exception\GuzzleException;
* @package TestHelpers
*/
class OcisHelper {
+ /**
+ * @return string
+ */
+ public static function getServerUrl(): string {
+ if (\getenv('TEST_SERVER_URL')) {
+ return \getenv('TEST_SERVER_URL');
+ }
+ return 'https://localhost:9200';
+ }
+
/**
* @return bool
*/
diff --git a/tests/acceptance/TestHelpers/UploadHelper.php b/tests/acceptance/TestHelpers/UploadHelper.php
index ca8779215a..47849e7985 100644
--- a/tests/acceptance/TestHelpers/UploadHelper.php
+++ b/tests/acceptance/TestHelpers/UploadHelper.php
@@ -170,7 +170,7 @@ class UploadHelper extends Assert {
if ($chunkingVersion === 2) {
$source = $v2ChunksDestination . '/.file';
$headers['Destination'] = $baseUrl . "/" .
- WebDavHelper::getDavPath($user, $davPathVersionToUse) .
+ WebDavHelper::getDavPath($davPathVersionToUse, $user) .
$destination;
$result = WebDavHelper::makeDavRequest(
$baseUrl,
diff --git a/tests/acceptance/TestHelpers/WebDavHelper.php b/tests/acceptance/TestHelpers/WebDavHelper.php
index 6f182cad92..2078d42b8f 100644
--- a/tests/acceptance/TestHelpers/WebDavHelper.php
+++ b/tests/acceptance/TestHelpers/WebDavHelper.php
@@ -46,6 +46,30 @@ class WebDavHelper {
*/
public static array $spacesIdRef = [];
+ /**
+ * clear space id reference for user
+ *
+ * @param string $urlPath
+ *
+ * @return string
+ */
+ public static function withRemotePhp(string $urlPath): string {
+ if (\getenv("WITH_REMOTE_PHP") === "true") {
+ return "remote.php/$urlPath";
+ }
+ return $urlPath;
+ }
+
+ /**
+ * @param string $url
+ *
+ * @return bool
+ */
+ public static function isDAVRequest(string $url): bool {
+ $found = \preg_match("/(\bwebdav\b|\bdav\b)/", $url);
+ return (bool)$found;
+ }
+
/**
* clear space id reference for user
*
@@ -534,7 +558,7 @@ class WebDavHelper {
if ($json === null) {
// the graph endpoint did not give a useful answer
// try getting the information from the webdav endpoint
- $fullUrl = $trimmedBaseUrl . '/remote.php/webdav';
+ $fullUrl = "$trimmedBaseUrl/" . self::getDavPath(self::DAV_VERSION_NEW, $user);
$response = HttpRequestHelper::sendRequest(
$fullUrl,
$xRequestId,
@@ -702,12 +726,12 @@ class WebDavHelper {
}
// get space id if testing with spaces dav
- if ($spaceId === null && $davPathVersionToUse === self::DAV_VERSION_SPACES) {
+ if ($spaceId === null && $davPathVersionToUse === self::DAV_VERSION_SPACES && !\in_array($type, ["public-files", "versions"])) {
$path = \ltrim($path, "/");
if (\str_starts_with($path, "Shares/")) {
$spaceId = self::getSharesSpaceIdForUser(
$baseUrl,
- $doDavRequestAsUser ?? $user,
+ $user,
$password,
$xRequestId
);
@@ -715,14 +739,22 @@ class WebDavHelper {
} else {
$spaceId = self::getPersonalSpaceIdForUserOrFakeIfNotFound(
$baseUrl,
- $doDavRequestAsUser ?? $user,
+ $user,
$password,
$xRequestId
);
}
}
- $davPath = self::getDavPath($doDavRequestAsUser ?? $user, $davPathVersionToUse, $type, $spaceId);
+ $uniquePath = $user;
+ if ($davPathVersionToUse === self::DAV_VERSION_SPACES && !\in_array($type, ["archive", "versions", "public-files"])) {
+ $uniquePath = $spaceId;
+ } elseif ($type === "versions") {
+ // $path is file-id in case of versions
+ $uniquePath = $path;
+ }
+
+ $davPath = self::getDavPath($davPathVersionToUse, $uniquePath, $type);
//replace %, # and ? and in the path, Guzzle will not encode them
$urlSpecialChar = [['%', '#', '?'], ['%25', '%23', '%3F']];
@@ -732,14 +764,18 @@ class WebDavHelper {
$urlParameter = \http_build_query($urlParameter, '', '&');
$path .= '?' . $urlParameter;
}
- $fullUrl = self::sanitizeUrl($baseUrl . "/$davPath" . $path);
+ $fullUrl = self::sanitizeUrl("{$baseUrl}/{$davPath}");
+ // NOTE: no need to append path for archive and versions endpoints
+ if (!\in_array($type, ["archive", "versions"])) {
+ $fullUrl .= "/" . \ltrim($path, "/");
+ }
if ($authType === 'bearer') {
$headers['Authorization'] = 'Bearer ' . $password;
$user = null;
$password = null;
}
- if ($type === "public-files-new") {
+ if ($type === "public-files") {
if ($password === null || $password === "") {
$user = null;
} else {
@@ -769,7 +805,7 @@ class WebDavHelper {
$fullUrl,
$xRequestId,
$method,
- $user,
+ $doDavRequestAsUser ?? $user,
$password,
$headers,
$body,
@@ -785,67 +821,66 @@ class WebDavHelper {
/**
* get the dav path
*
- * @param string|null $user
- * @param int|null $davPathVersionToUse (1|2)
+ * @param int $davPathVersion (1|2|3)
+ * @param string|null $userOrItemIdOrSpaceIdOrToken 'user' or 'file-id' or 'space-id' or 'public-token'
* @param string|null $type
- * @param string|null $spaceId
*
* @return string
*/
public static function getDavPath(
- ?string $user,
- ?int $davPathVersionToUse = null,
- ?string $type = "files",
- ?string $spaceId = null
+ int $davPathVersion,
+ ?string $userOrItemIdOrSpaceIdOrToken = null,
+ ?string $type = "files"
):string {
- $newTrashbinDavPath = "remote.php/dav/trash-bin/$user/";
-
switch ($type) {
- case 'public-files':
- case 'public-files-old':
- return "public.php/webdav/";
- case 'public-files-new':
- return "remote.php/dav/public-files/$user/";
case 'archive':
- return "remote.php/dav/archive/$user/files";
+ return self::withRemotePhp("dav/archive/$userOrItemIdOrSpaceIdOrToken/files");
case 'versions':
- case 'customgroups':
- return "remote.php/dav/";
+ return self::withRemotePhp("dav/meta/$userOrItemIdOrSpaceIdOrToken/v");
+ case 'comments':
+ return self::withRemotePhp("dav/comments/files");
default:
break;
}
- if ($davPathVersionToUse === self::DAV_VERSION_SPACES) {
+ if ($davPathVersion === self::DAV_VERSION_SPACES) {
+ if ($type === "trash-bin") {
+ if ($userOrItemIdOrSpaceIdOrToken === null) {
+ throw new InvalidArgumentException("Space ID is required for trash-bin endpoint");
+ }
+ return self::withRemotePhp("dav/spaces/trash-bin/$userOrItemIdOrSpaceIdOrToken");
+ } elseif ($type === "public-files") {
+ // spaces DAV path doesn't have own public-files endpoint
+ return self::withRemotePhp("dav/public-files/$userOrItemIdOrSpaceIdOrToken");
+ }
// return spaces root path if spaceid is null
// REPORT request uses spaces root path
- if ($spaceId === null) {
- return "remote.php/dav/spaces/";
+ if ($userOrItemIdOrSpaceIdOrToken === null) {
+ return self::withRemotePhp("dav/spaces");
}
- if ($type === "trash-bin") {
- return "remote.php/dav/spaces/trash-bin/" . $spaceId . '/';
- }
- return "remote.php/dav/spaces/" . $spaceId . '/';
+ return self::withRemotePhp("dav/spaces/$userOrItemIdOrSpaceIdOrToken");
} else {
- if ($davPathVersionToUse === self::DAV_VERSION_OLD) {
- if ($type === "trash-bin") {
- // Since there is no trash bin endpoint for old dav version, new dav version's endpoint is used here.
- return $newTrashbinDavPath;
- }
- return "remote.php/webdav/";
- } elseif ($davPathVersionToUse === self::DAV_VERSION_NEW) {
- if ($type === "files") {
- $path = 'remote.php/dav/files/';
- return $path . $user . '/';
- } elseif ($type === "trash-bin") {
- return $newTrashbinDavPath;
- } else {
- return "remote.php/dav";
- }
- } else {
- throw new InvalidArgumentException(
- "DAV path version $davPathVersionToUse is unknown"
- );
+ if ($type === "trash-bin") {
+ // Since there is no trash bin endpoint for old dav version,
+ // new dav version's endpoint is used here.
+ return self::withRemotePhp("dav/trash-bin/$userOrItemIdOrSpaceIdOrToken");
}
+ if ($davPathVersion === self::DAV_VERSION_OLD) {
+ if ($type === "public-files") {
+ // TODO: cleanup
+ // this endpoint does not exist
+ return self::withRemotePhp("public.php/webdav");
+ }
+ return self::withRemotePhp("webdav");
+ } elseif ($davPathVersion === self::DAV_VERSION_NEW) {
+ if ($type === "files") {
+ return self::withRemotePhp("dav/files/$userOrItemIdOrSpaceIdOrToken");
+ } elseif ($type === "public-files") {
+ return self::withRemotePhp("dav/public-files/$userOrItemIdOrSpaceIdOrToken");
+ }
+ return self::withRemotePhp("dav");
+ }
+ throw new InvalidArgumentException("Invalid DAV path: $davPathVersion");
}
}
@@ -917,12 +952,12 @@ class WebDavHelper {
$baseUrl,
null,
null,
- "/public-files/$token/$fileName",
+ "{$token}/{$fileName}",
['d:getlastmodified'],
$xRequestId,
'1',
null,
- null,
+ "public-files",
$davVersionToUse
);
$responseXmlObject = HttpRequestHelper::getResponseXml(
diff --git a/tests/acceptance/bootstrap/ArchiverContext.php b/tests/acceptance/bootstrap/ArchiverContext.php
index 6e3146f144..48f15eaf50 100644
--- a/tests/acceptance/bootstrap/ArchiverContext.php
+++ b/tests/acceptance/bootstrap/ArchiverContext.php
@@ -60,6 +60,15 @@ class ArchiverContext implements Context {
$this->featureContext = BehatHelper::getContext($scope, $environment, 'FeatureContext');
}
+ /**
+ * @param string $query
+ *
+ * @return string
+ */
+ public function getArchiverUrl(string $query): string {
+ return $this->featureContext->getBaseUrl() . '/archiver?' . $query;
+ }
+
/**
* @param string $type
*
@@ -203,7 +212,7 @@ class ArchiverContext implements Context {
$queryString .= '&output-format=' . $archiveType;
}
return HttpRequestHelper::get(
- $this->featureContext->getBaseUrl() . '/archiver?' . $queryString,
+ $this->getArchiverUrl($queryString),
$this->featureContext->getStepLineRef(),
$downloader,
$this->featureContext->getPasswordForUser($downloader),
@@ -215,8 +224,8 @@ class ArchiverContext implements Context {
* @When user :user downloads the archive of these items using the resource :addressType
*
* @param string $user
- * @param TableNode $items
* @param string $addressType ids|paths
+ * @param TableNode $items
*
* @return void
*
@@ -224,19 +233,19 @@ class ArchiverContext implements Context {
*/
public function userDownloadsTheArchiveOfTheseItems(
string $user,
- TableNode $items,
- string $addressType
+ string $addressType,
+ TableNode $items
): void {
$user = $this->featureContext->getActualUsername($user);
- $queryString = '';
+ $queryString = [];
foreach ($items->getRows() as $item) {
- $queryString .= $this->getArchiverQueryString($user, $item[0], $addressType) . '&';
+ $queryString[] = $this->getArchiverQueryString($user, $item[0], $addressType);
}
+ $queryString = \join('&', $queryString);
- $queryString = \rtrim($queryString, '&');
$this->featureContext->setResponse(
HttpRequestHelper::get(
- $this->featureContext->getBaseUrl() . '/archiver?' . $queryString,
+ $this->getArchiverUrl($queryString),
$this->featureContext->getStepLineRef(),
$user,
$this->featureContext->getPasswordForUser($user),
diff --git a/tests/acceptance/bootstrap/AuthContext.php b/tests/acceptance/bootstrap/AuthContext.php
index 41ffe10867..ab4358568b 100644
--- a/tests/acceptance/bootstrap/AuthContext.php
+++ b/tests/acceptance/bootstrap/AuthContext.php
@@ -75,8 +75,16 @@ class AuthContext implements Context {
?string $body = null,
?array $headers = []
): ResponseInterface {
- $fullUrl = $this->featureContext->getBaseUrl() . $url;
-
+ // NOTE: preserving '/' for tests with special cases
+ // E.g: coreApiAuth/webDavSpecialURLs.feature
+ $url = \substr($url, 1);
+ $trimmedUrl = \ltrim($url, '/');
+ $slashCount = \strlen($url) - \strlen($trimmedUrl);
+ if (WebdavHelper::isDAVRequest($url)) {
+ $url = WebdavHelper::withRemotePhp($trimmedUrl);
+ }
+ $url = \str_repeat("/", $slashCount) . $url;
+ $fullUrl = $this->featureContext->getBaseUrl() . "/$url";
return HttpRequestHelper::sendRequest(
$fullUrl,
$this->featureContext->getStepLineRef(),
@@ -391,10 +399,11 @@ class AuthContext implements Context {
$ofUser
);
if (isset($row['destination'])) {
- $headers['Destination'] = $this->featureContext->substituteInLineCodes(
- $this->featureContext->getBaseUrl() . $row['destination'],
+ $destination = $this->featureContext->substituteInLineCodes(
+ $row['destination'],
$ofUser
);
+ $headers['Destination'] = $this->featureContext->getBaseUrl() . "/" . WebdavHelper::withRemotePhp(\ltrim($destination, "/"));
}
$response = $this->sendRequest(
$row['endpoint'],
@@ -440,10 +449,11 @@ class AuthContext implements Context {
$ofUser
);
if (isset($row['destination'])) {
- $headers['Destination'] = $this->featureContext->substituteInLineCodes(
- $this->featureContext->getBaseUrl() . $row['destination'],
+ $destination = $this->featureContext->substituteInLineCodes(
+ $row['destination'],
$ofUser
);
+ $headers['Destination'] = $this->featureContext->getBaseUrl() . "/" . WebdavHelper::withRemotePhp(\ltrim($destination, "/"));
}
$response = $this->sendRequest(
$row['endpoint'],
@@ -583,10 +593,10 @@ class AuthContext implements Context {
$baseUrl = $this->featureContext->getBaseUrl();
$suffix = "";
if ($this->featureContext->getDavPathVersion() === WebDavHelper::DAV_VERSION_SPACES) {
- $suffix = $this->featureContext->spacesContext->getSpaceIdByName($user, "Personal") . "/";
+ $suffix = $this->featureContext->spacesContext->getSpaceIdByName($user, "Personal");
}
- $davPath = WebDavHelper::getDavPath($user, $this->featureContext->getDavPathVersion());
- $headers['Destination'] = "{$baseUrl}/{$davPath}{$suffix}moved";
+ $davPath = WebDavHelper::getDavPath($this->featureContext->getDavPathVersion(), $user);
+ $headers['Destination'] = "{$baseUrl}/{$davPath}/{$suffix}/moved";
}
foreach ($table->getHash() as $row) {
@@ -625,7 +635,11 @@ class AuthContext implements Context {
$endpoint,
$username
);
- $fullUrl = $this->featureContext->getBaseUrl() . $endpoint;
+ $endpoint = \ltrim($endpoint, '/');
+ if (WebdavHelper::isDAVRequest($endpoint)) {
+ $endpoint = WebdavHelper::withRemotePhp($endpoint);
+ }
+ $fullUrl = $this->featureContext->getBaseUrl() . "/$endpoint";
$response = HttpRequestHelper::sendRequestOnce(
$fullUrl,
$this->featureContext->getStepLineRef(),
diff --git a/tests/acceptance/bootstrap/CollaborationContext.php b/tests/acceptance/bootstrap/CollaborationContext.php
index 0fdf4242a5..d3487dd969 100644
--- a/tests/acceptance/bootstrap/CollaborationContext.php
+++ b/tests/acceptance/bootstrap/CollaborationContext.php
@@ -150,9 +150,10 @@ class CollaborationContext implements Context {
*/
public function createFile(string $file, string $password, string $folder = ""): void {
$token = $this->featureContext->shareNgGetLastCreatedLinkShareToken();
- $davPath = WebDavHelper::getDavPath($token, null, "public-files-new") . "/$folder";
+ $baseUrl = $this->featureContext->getBaseUrl();
+ $davPath = WebDavHelper::getDavPath(WebDavHelper::DAV_VERSION_NEW, $token, "public-files");
$response = HttpRequestHelper::sendRequest(
- $this->featureContext->getBaseUrl() . "/$davPath",
+ "$baseUrl/$davPath/$folder",
$this->featureContext->getStepLineRef(),
"PROPFIND",
"public",
diff --git a/tests/acceptance/bootstrap/FeatureContext.php b/tests/acceptance/bootstrap/FeatureContext.php
index 0b30bf6497..ddfc13f45b 100644
--- a/tests/acceptance/bootstrap/FeatureContext.php
+++ b/tests/acceptance/bootstrap/FeatureContext.php
@@ -492,8 +492,7 @@ class FeatureContext extends BehatVariablesContext {
$this->alternateAdminPassword = "IHave99LotsOfPriv";
$this->publicLinkSharePassword = "publicPwd:1";
- // in case of CI deployment we take the server url from the environment
- $testServerUrl = \getenv('TEST_SERVER_URL');
+ $testServerUrl = OcisHelper::getServerUrl();
if ($testServerUrl !== false) {
$this->baseUrl = \rtrim($testServerUrl, '/');
$this->localBaseUrl = $this->baseUrl;
@@ -808,15 +807,6 @@ class FeatureContext extends BehatVariablesContext {
return \ltrim($this->getBasePath() . "/ocs/v$ocsApiVersion.php", "/");
}
- /**
- * returns the complete DAV path including the base path e.g. owncloud-core/remote.php/dav
- *
- * @return string
- */
- public function getDAVPathIncludingBasePath(): string {
- return \ltrim($this->getBasePath() . "/" . $this->getDavPath(), "/");
- }
-
/**
* returns the base URL but without "http(s)://" in front of it
*
@@ -1339,8 +1329,8 @@ class FeatureContext extends BehatVariablesContext {
*/
public function userSendsHTTPMethodToUrl(string $user, string $verb, string $url): void {
$user = $this->getActualUsername($user);
- $url = $this->substituteInLineCodes($url, $user);
- $this->setResponse($this->sendingToWithDirectUrl($user, $verb, $url));
+ $endpoint = $this->substituteInLineCodes($url, $user);
+ $this->setResponse($this->sendingToWithDirectUrl($user, $verb, $endpoint));
}
/**
@@ -1458,7 +1448,11 @@ class FeatureContext extends BehatVariablesContext {
* @throws GuzzleException
*/
public function sendingToWithDirectUrl(string $user, string $verb, string $url, ?string $body = null, ?string $password = null, ?array $headers = null): ResponseInterface {
- $fullUrl = $this->getBaseUrl() . $url;
+ $url = \ltrim($url, '/');
+ if (WebdavHelper::isDAVRequest($url)) {
+ $url = WebdavHelper::withRemotePhp($url);
+ }
+ $fullUrl = $this->getBaseUrl() . "/$url";
if ($password === null) {
$password = $this->getPasswordForUser($user);
@@ -1947,8 +1941,6 @@ class FeatureContext extends BehatVariablesContext {
}
}
- // TODO do similar for other usernames for e.g. %regularuser% or %test-user-1%
-
/**
* @param string|null $functionalUsername
*
@@ -2119,7 +2111,8 @@ class FeatureContext extends BehatVariablesContext {
*/
public function getCommentUrlRegExp(): string {
$basePath = \ltrim($this->getBasePath() . "/", "/");
- return "/{$basePath}remote.php/dav/comments/files/([0-9]+)";
+ $commentsPath = WebDAVHelper::getDavPath(WebDavHelper::DAV_VERSION_NEW, null, "comments");
+ return "/{$basePath}/{$commentsPath}/([0-9]+)";
}
/**
@@ -2226,14 +2219,6 @@ class FeatureContext extends BehatVariablesContext {
],
"parameter" => []
],
- [
- "code" => "%dav_path%",
- "function" => [
- $this,
- "getDAVPathIncludingBasePath"
- ],
- "parameter" => []
- ],
[
"code" => "%ocs_path_v1%",
"function" => [
diff --git a/tests/acceptance/bootstrap/FilesVersionsContext.php b/tests/acceptance/bootstrap/FilesVersionsContext.php
index 7c71b65e2f..ed66e4ffe5 100644
--- a/tests/acceptance/bootstrap/FilesVersionsContext.php
+++ b/tests/acceptance/bootstrap/FilesVersionsContext.php
@@ -37,15 +37,6 @@ require_once 'bootstrap.php';
class FilesVersionsContext implements Context {
private FeatureContext $featureContext;
- /**
- * @param string $fileId
- *
- * @return string
- */
- private function getVersionsPathForFileId(string $fileId):string {
- return "/meta/$fileId/v";
- }
-
/**
* @When user :user tries to get versions of file :file from :fileOwner
*
@@ -74,26 +65,26 @@ class FilesVersionsContext implements Context {
}
/**
- * @When the public tries to get the number of versions of file :file with password :password using file-id path :endpoint
+ * @When the public tries to get the number of versions of file :file with password :password using file-id :endpoint
*
* @param string $file
* @param string $password
- * @param string $endpoint
+ * @param string $fileId
*
* @return void
*/
- public function thePublicGetsTheNumberOfVersionsOfFileWithPasswordUsingFileIdPath(string $file, string $password, string $endpoint): void {
+ public function thePublicTriesToGetTheNumberOfVersionsOfFileWithPasswordUsingFileId(string $file, string $password, string $fileId): void {
$password = $this->featureContext->getActualPassword($password);
$this->featureContext->setResponse(
$this->featureContext->makeDavRequest(
"public",
"PROPFIND",
- $endpoint,
+ $fileId,
null,
null,
null,
"versions",
- (string)$this->featureContext->getDavPathVersion(),
+ $this->featureContext->getDavPathVersion(),
false,
$password
)
@@ -123,35 +114,33 @@ class FilesVersionsContext implements Context {
return $this->featureContext->makeDavRequest(
$user,
"PROPFIND",
- $this->getVersionsPathForFileId($fileId),
+ $fileId,
null,
null,
$spaceId,
- null,
- '2'
+ "versions"
);
}
/**
- * @When user :user gets the number of versions of file :resource using file-id path :endpoint
- * @When user :user tries to get the number of versions of file :resource using file-id path :endpoint
+ * @When user :user gets the number of versions of file :resource using file-id :fileId
+ * @When user :user tries to get the number of versions of file :resource using file-id :fileId
*
* @param string $user
- * @param string $endpoint
+ * @param string $fileId
*
* @return void
*/
- public function userGetsTheNumberOfVersionsOfFileOfTheSpace(string $user, string $endpoint):void {
+ public function userGetsTheNumberOfVersionsOfFileOfTheSpace(string $user, string $fileId):void {
$this->featureContext->setResponse(
$this->featureContext->makeDavRequest(
$user,
"PROPFIND",
- $endpoint,
+ $fileId,
null,
null,
null,
- "versions",
- (string)$this->featureContext->getDavPathVersion()
+ "versions"
)
);
}
@@ -190,12 +179,11 @@ class FilesVersionsContext implements Context {
return $this->featureContext->makeDavRequest(
$user,
"PROPFIND",
- $this->getVersionsPathForFileId($fileId),
+ $fileId,
null,
$body,
null,
- null,
- '2'
+ "versions",
);
}
@@ -219,7 +207,7 @@ class FilesVersionsContext implements Context {
$xmlPart = $responseXml->xpath("//d:response/d:href");
//restoring the version only works with DAV path v2
$destinationUrl = $this->featureContext->getBaseUrl() . "/" .
- WebDavHelper::getDavPath($user, 2) . \trim($path, "/");
+ WebDavHelper::getDavPath(WebDavHelper::DAV_VERSION_NEW, $user) . \trim($path, "/");
$fullUrl = $this->featureContext->getBaseUrlWithoutPath() .
$xmlPart[$versionIndex];
return HttpRequestHelper::sendRequest(
@@ -306,7 +294,7 @@ class FilesVersionsContext implements Context {
):void {
$user = $this->featureContext->getActualUsername($user);
$fileId = $this->featureContext->getFileIdForPath($user, $path);
- Assert::assertNotNull($fileId, __METHOD__ . " file '$path' for user '$user' not found (the file may not exist)");
+ Assert::assertNotNull($fileId, __METHOD__ . ". file '$path' for user '$user' not found (the file may not exist)");
$this->assertFileVersionsCount($user, $fileId, $count);
}
@@ -548,7 +536,7 @@ class FilesVersionsContext implements Context {
$this->featureContext->getBaseUrl(),
$user,
$password,
- $this->getVersionsPathForFileId($fileId),
+ $fileId,
$properties,
$this->featureContext->getStepLineRef(),
(string) $folderDepth,
diff --git a/tests/acceptance/bootstrap/GraphContext.php b/tests/acceptance/bootstrap/GraphContext.php
index e6db73a4bb..95d945d7fd 100644
--- a/tests/acceptance/bootstrap/GraphContext.php
+++ b/tests/acceptance/bootstrap/GraphContext.php
@@ -52,48 +52,6 @@ class GraphContext implements Context {
$this->spacesContext = BehatHelper::getContext($scope, $environment, 'SpacesContext');
}
- /**
- * @param string $user
- * @param string|null $userName
- * @param string|null $password
- * @param string|null $email
- * @param string|null $displayName
- * @param string|null $requester
- * @param string|null $requesterPassword
- *
- * @return void
- * @throws JsonException
- * @throws GuzzleException
- */
- public function userHasBeenEditedUsingTheGraphApi(
- string $user,
- ?string $userName = null,
- ?string $password = null,
- ?string $email = null,
- ?string $displayName = null,
- ?string $requester = null,
- ?string $requesterPassword = null
- ): void {
- if (!$requester) {
- $requester = $this->featureContext->getAdminUsername();
- $requesterPassword = $this->featureContext->getAdminPassword();
- }
- $userId = $this->featureContext->getAttributeOfCreatedUser($user, 'id');
- $response = GraphHelper::editUser(
- $this->featureContext->getBaseUrl(),
- $this->featureContext->getStepLineRef(),
- $requester,
- $requesterPassword,
- $userId,
- $userName,
- $password,
- $email,
- $displayName
- );
- $this->featureContext->setResponse($response);
- $this->featureContext->theHttpStatusCodeShouldBe(200); // TODO 204 when prefer=minimal header was sent
- }
-
/**
* @When /^the user "([^"]*)" changes the email of user "([^"]*)" to "([^"]*)" using the Graph API$/
* @When /^the user "([^"]*)" tries to change the email of user "([^"]*)" to "([^"]*)" using the Graph API$/
diff --git a/tests/acceptance/bootstrap/OcmContext.php b/tests/acceptance/bootstrap/OcmContext.php
index edda80a492..725664f162 100644
--- a/tests/acceptance/bootstrap/OcmContext.php
+++ b/tests/acceptance/bootstrap/OcmContext.php
@@ -56,7 +56,7 @@ class OcmContext implements Context {
* @return string
*/
public function getOcisDomain(): string {
- return $this->extractDomain(\getenv('TEST_SERVER_URL'));
+ return $this->extractDomain(OcisHelper::getServerUrl());
}
/**
diff --git a/tests/acceptance/bootstrap/PublicWebDavContext.php b/tests/acceptance/bootstrap/PublicWebDavContext.php
index 2bdfaa5a88..d016f6e5b5 100644
--- a/tests/acceptance/bootstrap/PublicWebDavContext.php
+++ b/tests/acceptance/bootstrap/PublicWebDavContext.php
@@ -37,6 +37,20 @@ require_once 'bootstrap.php';
class PublicWebDavContext implements Context {
private FeatureContext $featureContext;
+ /**
+ * @param string $versionString (old|new)
+ *
+ * @return int
+ */
+ public function getPublicDavVersion(string $versionString): int {
+ if ($versionString === "old") {
+ return WebDavHelper::DAV_VERSION_OLD;
+ } elseif ($versionString === "new") {
+ return WebDavHelper::DAV_VERSION_NEW;
+ }
+ throw new Exception("Unknown public WebDAV version: $versionString");
+ }
+
/**
* @param string $range ignore if empty
* @param string $publicWebDAVAPIVersion
@@ -128,15 +142,15 @@ class PublicWebDavContext implements Context {
*
* @return ResponseInterface
*/
- public function deleteFileFromPublicShare(string $fileName, string $password = ""):ResponseInterface {
+ public function deleteFileFromPublicShare(string $fileName, string $password = ""): ResponseInterface {
$token = ($this->featureContext->isUsingSharingNG()) ? $this->featureContext->shareNgGetLastCreatedLinkShareToken() : $this->featureContext->getLastCreatedPublicShareToken();
$davPath = WebDavHelper::getDavPath(
+ $this->getPublicDavVersion("new"),
$token,
- 0,
- "public-files-new"
+ "public-files"
);
$password = $this->featureContext->getActualPassword($password);
- $fullUrl = $this->featureContext->getBaseUrl() . "/$davPath$fileName";
+ $fullUrl = $this->featureContext->getBaseUrl() . "/$davPath/$fileName";
$userName = $this->getUsernameForPublicWebdavApi(
$token,
$password,
@@ -211,13 +225,13 @@ class PublicWebDavContext implements Context {
public function renameFileFromPublicShare(string $fileName, string $toFileName, string $publicWebDAVAPIVersion, ?string $password = ""):ResponseInterface {
$token = ($this->featureContext->isUsingSharingNG()) ? $this->featureContext->shareNgGetLastCreatedLinkShareToken() : $this->featureContext->getLastCreatedPublicShareToken();
$davPath = WebDavHelper::getDavPath(
+ $this->getPublicDavVersion($publicWebDAVAPIVersion),
$token,
- 0,
- "public-files-$publicWebDAVAPIVersion"
+ "public-files"
);
- $fullUrl = $this->featureContext->getBaseUrl() . "/$davPath$fileName";
+ $fullUrl = $this->featureContext->getBaseUrl() . "/$davPath/$fileName";
$password = $this->featureContext->getActualPassword($password);
- $destination = $this->featureContext->getBaseUrl() . "/$davPath$toFileName";
+ $destination = $this->featureContext->getBaseUrl() . "/$davPath/$toFileName";
$userName = $this->getUsernameForPublicWebdavApi(
$token,
$password,
@@ -326,14 +340,14 @@ class PublicWebDavContext implements Context {
$token = ($this->featureContext->isUsingSharingNG()) ? $this->featureContext->shareNgGetLastCreatedLinkShareToken() : $this->featureContext->getLastCreatedPublicShareToken();
$davPath = WebDavHelper::getDavPath(
+ $this->featureContext->getDavPathVersion(),
$token,
- 0,
- "public-files-new"
+ "public-files"
);
$username = $this->featureContext->getActualUsername($user);
$password = $this->featureContext->getPasswordForUser($user);
- $fullUrl = $this->featureContext->getBaseUrl() . "/$davPath$path";
+ $fullUrl = $this->featureContext->getBaseUrl() . "/$davPath/$path";
return HttpRequestHelper::get(
$fullUrl,
@@ -366,11 +380,11 @@ class PublicWebDavContext implements Context {
$token = $this->featureContext->getLastCreatedPublicShareToken();
}
$davPath = WebDavHelper::getDavPath(
+ $this->getPublicDavVersion($publicWebDAVAPIVersion),
$token,
- 0,
- "public-files-$publicWebDAVAPIVersion"
+ "public-files"
);
- $fullUrl = $this->featureContext->getBaseUrl() . "/$davPath$path";
+ $fullUrl = $this->featureContext->getBaseUrl() . "/$davPath/$path";
$userName = $this->getUsernameForPublicWebdavApi(
$token,
$password,
@@ -442,9 +456,9 @@ class PublicWebDavContext implements Context {
string $source,
string $destination
):ResponseInterface {
- $fullSourceUrl = $baseUrl . $source;
+ $fullSourceUrl = "$baseUrl/$source";
$fullDestUrl = WebDavHelper::sanitizeUrl(
- $baseUrl . $destination
+ "$baseUrl/$destination"
);
$headers["Destination"] = $fullDestUrl;
@@ -470,9 +484,9 @@ class PublicWebDavContext implements Context {
public function thePublicCopiesFileUsingTheWebDAVApi(string $source, string $destination, string $publicWebDAVAPIVersion):void {
$token = ($this->featureContext->isUsingSharingNG()) ? $this->featureContext->shareNgGetLastCreatedLinkShareToken() : $this->featureContext->getLastCreatedPublicShareToken();
$davPath = WebDavHelper::getDavPath(
+ $this->getPublicDavVersion($publicWebDAVAPIVersion),
$token,
- 0,
- "public-files-$publicWebDAVAPIVersion"
+ "public-files"
);
$baseUrl = $this->featureContext->getLocalBaseUrl() . '/' . $davPath;
@@ -674,46 +688,18 @@ class PublicWebDavContext implements Context {
}
/**
- * @param string $filename target file name
- * @param string $body content to upload
- * @param string $publicWebDAVAPIVersion
- *
- * @return ResponseInterface
- */
- public function publiclyUploadingContent(
- string $filename,
- string $body = 'test',
- string $publicWebDAVAPIVersion = "old"
- ):ResponseInterface {
- return $this->publicUploadContent(
- $filename,
- '',
- $body,
- false,
- [],
- $publicWebDAVAPIVersion
- );
- }
-
- /**
- * @When /^the public uploads file "([^"]*)" with content "([^"]*)" using the (old|new) public WebDAV API$/
+ * @When /^the public uploads file "([^"]*)" with content "([^"]*)" using the (?:old|new) public WebDAV API$/
*
* @param string $filename target file name
* @param string $body content to upload
- * @param string $publicWebDAVAPIVersion
*
* @return void
*/
public function thePublicUploadsFileWithContentUsingThePublicWebDavApi(
string $filename,
- string $body = 'test',
- string $publicWebDAVAPIVersion = "old"
+ string $body = 'test'
):void {
- $response = $this->publiclyUploadingContent(
- $filename,
- $body,
- $publicWebDAVAPIVersion
- );
+ $response = $this->publicUploadContent($filename, '', $body);
$this->featureContext->setResponse($response);
$this->featureContext->pushToLastStatusCodesArrays();
}
@@ -723,20 +709,11 @@ class PublicWebDavContext implements Context {
*
* @param string $filename target file name
* @param string $body content to upload
- * @param string $publicWebDAVAPIVersion
*
* @return void
*/
- public function thePublicHasUploadedFileWithContentUsingThePublicWebDavApi(
- string $filename,
- string $body = 'test',
- string $publicWebDAVAPIVersion = "old"
- ):void {
- $response = $this->publiclyUploadingContent(
- $filename,
- $body,
- $publicWebDAVAPIVersion
- );
+ public function thePublicHasUploadedFileWithContent(string $filename, string $body): void {
+ $response = $this->publicUploadContent($filename, '', $body);
$this->featureContext->theHTTPStatusCodeShouldBe([201, 204], "", $response);
}
@@ -1205,14 +1182,6 @@ class PublicWebDavContext implements Context {
$publicWebDAVAPIVersion,
$shareNg
);
-
- $responseContent = $response->getBody()->getContents();
- \libxml_use_internal_errors(true);
- Assert::assertNotFalse(
- \simplexml_load_string($responseContent),
- "response body is not valid XML, maybe download did work\n" .
- "response body: \n$responseContent\n"
- );
$this->featureContext->theHTTPStatusCodeShouldBe($expectedHttpCode, "", $response);
}
@@ -1575,11 +1544,11 @@ class PublicWebDavContext implements Context {
):ResponseInterface {
$token = ($this->featureContext->isUsingSharingNG()) ? $this->featureContext->shareNgGetLastCreatedLinkShareToken() : $this->featureContext->getLastCreatedPublicShareToken();
$davPath = WebDavHelper::getDavPath(
+ $this->featureContext->getDavPathVersion(),
$token,
- 0,
- "public-files-new"
+ "public-files"
);
- $url = $this->featureContext->getBaseUrl() . "/$davPath";
+ $url = $this->featureContext->getBaseUrl() . "/$davPath/";
$password = $this->featureContext->getActualPassword($password);
$userName = $this->getUsernameForPublicWebdavApi(
$token,
@@ -1731,11 +1700,10 @@ class PublicWebDavContext implements Context {
$token = $this->featureContext->getLastCreatedPublicShareToken();
}
$davPath = WebDavHelper::getDavPath(
+ $this->getPublicDavVersion("new"),
$token,
- 0,
- "public-files-new"
+ "public-files"
);
- $url = $this->featureContext->getBaseUrl() . "/$davPath";
$userName = $this->getUsernameForPublicWebdavApi(
$token,
$password,
@@ -1746,7 +1714,8 @@ class PublicWebDavContext implements Context {
'/',
\array_map('rawurlencode', \explode('/', $filename))
);
- $url .= \ltrim($filename, '/');
+ $encodedFilePath = \ltrim($filename, '/');
+ $url = $this->featureContext->getBaseUrl() . "/$davPath/$encodedFilePath";
// Trim any "/" from the end. For example, if we are putting content to a
// single file that has been shared with a link, then the URL should end
// with the link token and no "/" at the end.
@@ -1836,9 +1805,9 @@ class PublicWebDavContext implements Context {
}
$token = ($this->featureContext->isUsingSharingNG()) ? $this->featureContext->shareNgGetLastCreatedLinkShareToken() : $this->featureContext->getLastCreatedPublicShareToken();
$davPath = WebDavHelper::getDavPath(
- null,
- null,
- "public-files-$publicWebDAVAPIVersion"
+ $this->getPublicDavVersion($publicWebDAVAPIVersion),
+ $token,
+ "public-files"
);
$password = $this->featureContext->getActualPassword($password);
$username = $this->getUsernameForPublicWebdavApi(
@@ -1846,7 +1815,7 @@ class PublicWebDavContext implements Context {
$password,
$publicWebDAVAPIVersion
);
- $fullUrl = $this->featureContext->getBaseUrl() . "/$davPath$token";
+ $fullUrl = $this->featureContext->getBaseUrl() . "/$davPath";
$response = HttpRequestHelper::sendRequest(
$fullUrl,
$this->featureContext->getStepLineRef(),
diff --git a/tests/acceptance/bootstrap/SearchContext.php b/tests/acceptance/bootstrap/SearchContext.php
index dcec6458d8..f5d1c864d4 100644
--- a/tests/acceptance/bootstrap/SearchContext.php
+++ b/tests/acceptance/bootstrap/SearchContext.php
@@ -103,16 +103,15 @@ class SearchContext implements Context {
$body .= " ";
}
$body .= " ";
+
$davPathVersionToUse = $this->featureContext->getDavPathVersion();
- $davPath = WebDavHelper::getDavPath($doDavRequestAsUser ?? $user, $davPathVersionToUse, 'files', null);
-
- if ($davPathVersionToUse == WebDavHelper::DAV_VERSION_NEW) {
- // Removes the last component('username' in this case) from the WebDAV path by going up one level in the directory structure.
- // e.g. remote.php/dav/files/Alice ==> remote.php/dav/files/
- $davPath = \dirname($davPath, 1);
- }
-
+ // $davPath will be one of the followings:
+ // - webdav
+ // - dav/files
+ // - dav/spaces
+ $davPath = WebDavHelper::getDavPath($davPathVersionToUse);
$fullUrl = WebDavHelper::sanitizeUrl("$baseUrl/$davPath");
+
return HttpRequestHelper::sendRequest(
$fullUrl,
$this->featureContext->getStepLineRef(),
diff --git a/tests/acceptance/bootstrap/Sharing.php b/tests/acceptance/bootstrap/Sharing.php
index 096a098f41..c7f57f0a78 100755
--- a/tests/acceptance/bootstrap/Sharing.php
+++ b/tests/acceptance/bootstrap/Sharing.php
@@ -31,6 +31,7 @@ use TestHelpers\OcsApiHelper;
use TestHelpers\SharingHelper;
use TestHelpers\HttpRequestHelper;
use TestHelpers\TranslationHelper;
+use TestHelpers\WebDavHelper;
use GuzzleHttp\Exception\GuzzleException;
/**
@@ -3245,8 +3246,9 @@ trait Sharing {
* @return ResponseInterface
*/
public function getPublicPreviewOfFile(string $fileName, string $token):ResponseInterface {
- $url = $this->getBaseUrl() .
- "/remote.php/dav/public-files/$token/$fileName?preview=1";
+ $baseUrl = $this->getBaseUrl();
+ $davPath = WebdavHelper::getDavPath($this->getDavPathVersion(), $token, "public-files");
+ $url = "{$baseUrl}/{$davPath}/$fileName?preview=1";
return HttpRequestHelper::get(
$url,
$this->getStepLineRef()
diff --git a/tests/acceptance/bootstrap/SpacesContext.php b/tests/acceptance/bootstrap/SpacesContext.php
index e39b1771be..e52f93d4b4 100644
--- a/tests/acceptance/bootstrap/SpacesContext.php
+++ b/tests/acceptance/bootstrap/SpacesContext.php
@@ -49,13 +49,13 @@ class SpacesContext implements Context {
private FavoritesContext $favoritesContext;
private ChecksumContext $checksumContext;
private FilesVersionsContext $filesVersionsContext;
+ private ArchiverContext $archiverContext;
/**
* key is space name and value is the username that created the space
*/
private array $createdSpaces;
private string $ocsApiUrl = '/ocs/v2.php/apps/files_sharing/api/v1/shares';
- private string $davSpacesUrl = '/remote.php/dav/spaces/';
/**
* @var array map with user as key, spaces and file etags as value
@@ -267,7 +267,9 @@ class SpacesContext implements Context {
*/
public function getFileData(string $user, string $spaceName, string $fileName): ResponseInterface {
$space = $this->getSpaceByName($user, $spaceName);
- $fullUrl = $this->featureContext->getBaseUrl() . $this->davSpacesUrl . $space["id"] . "/" . $fileName;
+ $baseUrl = $this->featureContext->getBaseUrl();
+ $davPath = WebdavHelper::getDavPath(WebDavHelper::DAV_VERSION_SPACES, $space["id"]);
+ $fullUrl = "{$baseUrl}/{$davPath}/{$fileName}";
return HttpRequestHelper::get(
$fullUrl,
@@ -310,7 +312,12 @@ class SpacesContext implements Context {
if ($folderName === $space["name"]) {
$folderName = '';
}
- $fullUrl = $space["root"]["webDavUrl"] . "/" . \rawurlencode($folderName);
+
+ $encodedName = \rawurlencode($folderName);
+ $baseUrl = $this->featureContext->getBaseUrl();
+ $davPath = WebDavHelper::getDavPath(WebDavHelper::DAV_VERSION_SPACES, $space["id"]);
+ $fullUrl = "{$baseUrl}/{$davPath}/{$encodedName}";
+
$response = HttpRequestHelper::sendRequest(
$fullUrl,
$this->featureContext->getStepLineRef(),
@@ -400,6 +407,7 @@ class SpacesContext implements Context {
$this->favoritesContext = BehatHelper::getContext($scope, $environment, 'FavoritesContext');
$this->checksumContext = BehatHelper::getContext($scope, $environment, 'ChecksumContext');
$this->filesVersionsContext = BehatHelper::getContext($scope, $environment, 'FilesVersionsContext');
+ $this->archiverContext = BehatHelper::getContext($scope, $environment, 'ArchiverContext');
}
/**
@@ -1690,7 +1698,11 @@ class SpacesContext implements Context {
$spaceName
);
- $fullUrl = $space["root"]["webDavUrl"] . '/' . ltrim($fileSource, "/");
+ $encodedName = \rawurlencode(ltrim($fileSource, "/"));
+ $baseUrl = $this->featureContext->getBaseUrl();
+ $davPath = WebdavHelper::getDavPath(WebDavHelper::DAV_VERSION_SPACES, $space["id"]);
+ $fullUrl = "{$baseUrl}/{$davPath}/{$encodedName}";
+
$this->featureContext->setResponse($this->copyFilesAndFoldersRequest($user, $fullUrl, $headers));
}
@@ -1717,8 +1729,11 @@ class SpacesContext implements Context {
);
$headers['Overwrite'] = 'F';
- $fileSource = $this->escapePath(\trim($fileSource, "/"));
- $fullUrl = $space["root"]["webDavUrl"] . '/' . $fileSource;
+ $encodedName = \rawurlencode(ltrim($fileSource, "/"));
+ $baseUrl = $this->featureContext->getBaseUrl();
+ $davPath = WebdavHelper::getDavPath(WebDavHelper::DAV_VERSION_SPACES, $space["id"]);
+ $fullUrl = "{$baseUrl}/{$davPath}/{$encodedName}";
+
return $this->moveFilesAndFoldersRequest($user, $fullUrl, $headers);
}
@@ -1831,7 +1846,11 @@ class SpacesContext implements Context {
}
}
- $fullUrl = $space["root"]["webDavUrl"] . '/' . ltrim($fileSource, "/");
+ $encodedName = \rawurlencode(ltrim($fileSource, "/"));
+ $baseUrl = $this->featureContext->getBaseUrl();
+ $davPath = WebdavHelper::getDavPath(WebDavHelper::DAV_VERSION_SPACES, $space["id"]);
+ $fullUrl = "{$baseUrl}/{$davPath}/{$encodedName}";
+
$this->featureContext->setResponse($this->copyFilesAndFoldersRequest($user, $fullUrl, $headers));
}
@@ -1859,7 +1878,12 @@ class SpacesContext implements Context {
$space = $this->getSpaceByName($user, $fromSpaceName);
$headers['Destination'] = $this->destinationHeaderValueWithSpaceName($user, $fileDestination, $toSpaceName);
$headers['Overwrite'] = 'T';
- $fullUrl = $space["root"]["webDavUrl"] . '/' . ltrim($fileSource, "/");
+
+ $encodedName = \rawurlencode(ltrim($fileSource, "/"));
+ $baseUrl = $this->featureContext->getBaseUrl();
+ $davPath = WebdavHelper::getDavPath(WebDavHelper::DAV_VERSION_SPACES, $space["id"]);
+ $fullUrl = "{$baseUrl}/{$davPath}/{$encodedName}";
+
if ($action === 'copying') {
$response = $this->copyFilesAndFoldersRequest($user, $fullUrl, $headers);
} else {
@@ -1922,7 +1946,12 @@ class SpacesContext implements Context {
):void {
$space = $this->getSpaceByName($user, $fromSpaceName);
$headers['Destination'] = $this->destinationHeaderValueWithSpaceName($user, $fileDestination, $toSpaceName);
- $fullUrl = $space["root"]["webDavUrl"] . '/' . \ltrim($fileSource, "/");
+
+ $encodedName = \rawurlencode(ltrim($fileSource, "/"));
+ $baseUrl = $this->featureContext->getBaseUrl();
+ $davPath = WebdavHelper::getDavPath(WebDavHelper::DAV_VERSION_SPACES, $space["id"]);
+ $fullUrl = "{$baseUrl}/{$davPath}/{$encodedName}";
+
$this->featureContext->setResponse($this->moveFilesAndFoldersRequest($user, $fullUrl, $headers));
$this->featureContext->pushToLastHttpStatusCodesArray();
}
@@ -1941,12 +1970,9 @@ class SpacesContext implements Context {
public function destinationHeaderValueWithSpaceName(string $user, string $fileDestination, string $spaceName, string $endPath = null):string {
$space = $this->getSpaceByName($user, $spaceName);
$fileDestination = $this->escapePath(\ltrim($fileDestination, "/"));
- if ($endPath && str_contains($endPath, 'remote.php')) {
- // this is a check for when we want to test with the endpoint having `remote.php` in space webdav
- // by default spaces webdav is '/dav/spaces'
- return $this->featureContext->getBaseUrl() . '/remote.php/dav/spaces/' . $space['id'] . '/' . $fileDestination;
- }
- return $space["root"]["webDavUrl"] . '/' . $fileDestination;
+ $baseUrl = $this->featureContext->getBaseUrl();
+ $davPath = WebdavHelper::getDavPath(WebDavHelper::DAV_VERSION_SPACES, $space["id"]);
+ return "{$baseUrl}/{$davPath}/{$fileDestination}";
}
/**
@@ -1971,19 +1997,19 @@ class SpacesContext implements Context {
}
/**
- * @When /^user "([^"]*)" (copies|moves|renames) a file "([^"]*)" into "([^"]*)" inside space "([^"]*)" using file-id path "([^"]*)"$/
+ * @When /^user "([^"]*)" (copies|moves|renames) a file "([^"]*)" into "([^"]*)" inside space "([^"]*)" using file-id "([^"]*)"$/
*
* @param string $user
* @param string $actionType
* @param string $sourceFile
* @param string $destinationFile
* @param string $toSpaceName
- * @param string $url
+ * @param string $fileId
*
* @throws GuzzleException
* @return void
*/
- public function userCopiesOrMovesFileWithFileIdFromAndToSpaceBetweenSpaces(string $user, string $actionType, string $sourceFile, string $destinationFile, string $toSpaceName, string $url): void {
+ public function userCopiesMovesFileIntoInsideSpaceUsingFileId(string $user, string $actionType, string $sourceFile, string $destinationFile, string $toSpaceName, string $fileId): void {
// split the source when there are sub-folders
$sourceFile = \trim($sourceFile, "/");
$sourceFile = \explode("/", $sourceFile);
@@ -1995,15 +2021,17 @@ class SpacesContext implements Context {
} elseif ($actionType === 'renames') {
$fileDestination = $destinationFile;
}
+
$baseUrl = $this->featureContext->getBaseUrl();
+ $sourceDavPath = WebdavHelper::getDavPath($this->featureContext->getDavPathVersion());
if ($toSpaceName === 'Shares') {
$sharesPath = $this->featureContext->getSharesMountPath($user, $fileDestination);
- $davPath = WebDavHelper::getDavPath($user, $this->featureContext->getDavPathVersion());
- $headers['Destination'] = $baseUrl . "/$davPath" . $sharesPath;
+ $davPath = WebDavHelper::getDavPath($this->featureContext->getDavPathVersion());
+ $headers['Destination'] = "$baseUrl/$davPath/$sharesPath";
} else {
- $headers['Destination'] = $this->destinationHeaderValueWithSpaceName($user, $fileDestination, $toSpaceName, $url);
+ $headers['Destination'] = $this->destinationHeaderValueWithSpaceName($user, $fileDestination, $toSpaceName, $fileId);
}
- $fullUrl = $baseUrl . $url;
+ $fullUrl = "$baseUrl/$sourceDavPath/$fileId";
if ($actionType === 'copies') {
$this->featureContext->setResponse($this->copyFilesAndFoldersRequest($user, $fullUrl, $headers));
} elseif ($actionType === 'moves' || $actionType === 'renames') {
@@ -2012,15 +2040,14 @@ class SpacesContext implements Context {
}
/**
- * @When /^user "([^"]*)" tries to move (?:file|folder) "([^"]*)" of space "([^"]*)" to (space|folder) "([^"]*)" using its id in destination path "([^"]*)"$/
- * @When /^user "([^"]*)" moves (?:file|folder) "([^"]*)" of space "([^"]*)" to (folder) "([^"]*)" using its id in destination path "([^"]*)"$/
+ * @When /^user "([^"]*)" tries to move (?:file|folder) "([^"]*)" of space "([^"]*)" to (space|folder) "([^"]*)" using its id in destination path$/
+ * @When /^user "([^"]*)" moves (?:file|folder) "([^"]*)" of space "([^"]*)" to (folder) "([^"]*)" using its id in destination path$/
*
* @param string $user
* @param string $source
* @param string $sourceSpace
* @param string $destinationType
* @param string $destinationName
- * @param string $destinationPath
*
* @throws GuzzleException
* @return void
@@ -2030,23 +2057,25 @@ class SpacesContext implements Context {
string $source,
string $sourceSpace,
string $destinationType,
- string $destinationName,
- string $destinationPath
+ string $destinationName
): void {
$source = \trim($source, "/");
$baseUrl = $this->featureContext->getBaseUrl();
- $suffix = "";
- if ($this->featureContext->getDavPathVersion() === WebDavHelper::DAV_VERSION_SPACES) {
- $suffix = $this->getSpaceIdByName($user, $sourceSpace) . "/";
+ $davPathVersion = $this->featureContext->getDavPathVersion();
+ $uniquePath = $user;
+ if ($davPathVersion === WebDavHelper::DAV_VERSION_SPACES) {
+ $uniquePath = $this->getSpaceIdByName($user, $sourceSpace);
}
- $fullUrl = $baseUrl . \rtrim($destinationPath, "/") . "/$suffix$source";
+ $sourceDavPath = WebDavHelper::getDavPath($davPathVersion, $uniquePath);
+ $fullUrl = "$baseUrl/$sourceDavPath/$source";
if ($destinationType === "space") {
$destinationId = $this->getSpaceIdByName($user, $destinationName);
} else {
$destinationId = $this->getResourceId($user, $sourceSpace, $destinationName);
}
- $headers['Destination'] = $baseUrl . \rtrim($destinationPath, "/") . "/$destinationId";
+ $destinationDavPath = WebDavHelper::getDavPath($davPathVersion);
+ $headers['Destination'] = "$baseUrl/$destinationDavPath/$destinationId";
$response = $this->moveFilesAndFoldersRequest($user, $fullUrl, $headers);
$this->featureContext->setResponse($response);
@@ -2520,9 +2549,14 @@ class SpacesContext implements Context {
string $spaceName
): ResponseInterface {
$space = $this->getSpaceByName($user, $spaceName);
- $spaceWebDavUrl = $space["root"]["webDavUrl"] . '/' . ltrim($object, "/");
+
+ $encodedName = \rawurlencode(ltrim($object, "/"));
+ $baseUrl = $this->featureContext->getBaseUrl();
+ $davPath = WebdavHelper::getDavPath(WebDavHelper::DAV_VERSION_SPACES, $space["id"]);
+ $fullUrl = "{$baseUrl}/{$davPath}/{$encodedName}";
+
return HttpRequestHelper::delete(
- $spaceWebDavUrl,
+ $fullUrl,
$this->featureContext->getStepLineRef(),
$user,
$this->featureContext->getPasswordForUser($user)
@@ -2783,7 +2817,9 @@ class SpacesContext implements Context {
string $spaceName
): ResponseInterface {
$space = $this->getSpaceByName($user, $spaceName);
- $fullUrl = $this->featureContext->getBaseUrl() . $this->davSpacesUrl . "trash-bin/" . $space["id"];
+ $baseUrl = $this->featureContext->getBaseUrl();
+ $davPath = WebDavHelper::getDavPath(WebDavHelper::DAV_VERSION_SPACES, $space["id"], "trash-bin");
+ $fullUrl = "{$baseUrl}/{$davPath}";
return HttpRequestHelper::sendRequest(
$fullUrl,
$this->featureContext->getStepLineRef(),
@@ -2826,7 +2862,9 @@ class SpacesContext implements Context {
): void {
// get space by admin user
$space = $this->getSpaceByName($this->featureContext->getAdminUserName(), $spaceName);
- $fullUrl = $this->featureContext->getBaseUrl() . $this->davSpacesUrl . "trash-bin/" . $space["id"];
+ $baseUrl = $this->featureContext->getBaseUrl();
+ $davPath = WebDavHelper::getDavPath(WebDavHelper::DAV_VERSION_SPACES, $space["id"], "trash-bin");
+ $fullUrl = "{$baseUrl}/{$davPath}";
$this->featureContext->setResponse(
HttpRequestHelper::sendRequest($fullUrl, $this->featureContext->getStepLineRef(), 'PROPFIND', $user, $this->featureContext->getPasswordForUser($user))
);
@@ -2839,7 +2877,7 @@ class SpacesContext implements Context {
* and return array like:
* [1] => Array
* (
- * [href] => /remote.php/dav/spaces/trash-bin/spaceId/objectId/
+ * [href] => /dav/spaces/trash-bin/spaceId/objectId/
* [name] => deleted folder
* [mtime] => 1649147272
* [original-location] => deleted folder
@@ -2931,10 +2969,12 @@ class SpacesContext implements Context {
throw new Exception(__METHOD__ . " Object '$object' was not found in the trashbin of space '$spaceName' by user '$user'");
}
- $destination = $this->featureContext->getBaseUrl() . $this->davSpacesUrl . $space["id"] . $destination;
+ $baseUrl = $this->featureContext->getBaseUrl();
+ $davPath = WebDavHelper::getDavPath(WebDavHelper::DAV_VERSION_SPACES, $space["id"]);
+ $destination = "{$baseUrl}/{$davPath}/{$destination}";
$header = ["Destination" => $destination, "Overwrite" => "F"];
- $fullUrl = $this->featureContext->getBaseUrl() . $pathToDeletedObject;
+ $fullUrl = $baseUrl . $pathToDeletedObject;
$this->featureContext->setResponse(
HttpRequestHelper::sendRequest(
$fullUrl,
@@ -3025,8 +3065,9 @@ class SpacesContext implements Context {
$urlParameters = \http_build_query($urlParameters, '', '&');
$space = $this->getSpaceByName($user, $spaceName);
- $fullUrl = $this->featureContext->getBaseUrl() . $this->davSpacesUrl . $space['id'] . '/' . $fileName . '?' . $urlParameters;
-
+ $baseUrl = $this->featureContext->getBaseUrl();
+ $davPath = WebDavHelper::getDavPath(WebDavHelper::DAV_VERSION_SPACES, $space["id"]);
+ $fullUrl = "{$baseUrl}/{$davPath}/{$fileName}?{$urlParameters}";
$this->featureContext->setResponse(
HttpRequestHelper::get(
$fullUrl,
@@ -3602,11 +3643,18 @@ class SpacesContext implements Context {
$splitSpaceName = explode("/", $spaceName);
$space = $this->getSpaceByName($user, $splitSpaceName[1]);
$splitSpaceId = explode("$", $space['id']);
- $topWebDavPath = "/remote.php/dav/spaces/" . str_replace('!', '%21', $splitSpaceId[1]);
+ $spaceId = str_replace('!', '%21', $splitSpaceId[1]);
} else {
$space = $this->getSpaceByName($user, $spaceName);
- $topWebDavPath = "/remote.php/dav/spaces/" . $space['id'];
+ $spaceId = $space['id'];
}
+ $uniquePath = $user;
+ $davPathVersion = $this->featureContext->getDavPathVersion();
+ if ($davPathVersion === WebDavHelper::DAV_VERSION_SPACES) {
+ $uniquePath = $spaceId;
+ }
+
+ $topWebDavPath = "/" . WebDavHelper::getDavPath($davPathVersion, $uniquePath);
$spaceFound = false;
foreach ($responseArray as $value) {
@@ -3938,13 +3986,13 @@ class SpacesContext implements Context {
$resource,
'0',
['oc:fileid'],
- $this->featureContext->getDavPathVersion() === 1 ? "public-files" : "public-files-new"
+ "public-files"
);
$resourceId = json_decode(json_encode($response->xpath("//d:response/d:propstat/d:prop/oc:fileid")), true, 512, JSON_THROW_ON_ERROR);
$queryString = 'public-token=' . $token . '&id=' . $resourceId[0][0];
$this->featureContext->setResponse(
HttpRequestHelper::get(
- $this->featureContext->getBaseUrl() . '/archiver?' . $queryString,
+ $this->archiverContext->getArchiverUrl($queryString),
$this->featureContext->getStepLineRef(),
'',
'',
@@ -4033,7 +4081,7 @@ class SpacesContext implements Context {
*/
public function userDownloadsTheSpaceUsingTheWebdavApi(string $user, string $spaceName, string $owner = ''):void {
$space = $this->getSpaceByName($owner ?: $user, $spaceName);
- $url = $this->featureContext->getBaseUrl() . '/archiver?id=' . $space['id'];
+ $url = $this->archiverContext->getArchiverUrl('id=' . $space['id']);
$this->featureContext->setResponse(
HttpRequestHelper::get(
$url,
diff --git a/tests/acceptance/bootstrap/TUSContext.php b/tests/acceptance/bootstrap/TUSContext.php
index 83a26d961e..3240e7c12d 100644
--- a/tests/acceptance/bootstrap/TUSContext.php
+++ b/tests/acceptance/bootstrap/TUSContext.php
@@ -304,15 +304,15 @@ class TUSContext implements Context {
'headers' => $headers
]
);
+
+ $davPathVersion = $this->featureContext->getDavPathVersion();
+ $uniquePath = $user;
+ if ($davPathVersion === WebDavHelper::DAV_VERSION_SPACES) {
+ $uniquePath = $spaceId ?: $this->featureContext->getPersonalSpaceIdForUser($user);
+ }
+
$client->setChecksumAlgorithm('sha1');
- $client->setApiPath(
- WebDavHelper::getDavPath(
- $user,
- $this->featureContext->getDavPathVersion(),
- "files",
- $spaceId ?: $this->featureContext->getPersonalSpaceIdForUser($user)
- )
- );
+ $client->setApiPath(WebDavHelper::getDavPath($davPathVersion, $uniquePath));
$client->setMetadata($uploadMetadata);
$sourceFile = $this->featureContext->acceptanceTestsDirLocation() . $source;
$client->setKey((string)rand())->file($sourceFile, $destination);
diff --git a/tests/acceptance/bootstrap/TrashbinContext.php b/tests/acceptance/bootstrap/TrashbinContext.php
index d88145e591..d36a76981c 100644
--- a/tests/acceptance/bootstrap/TrashbinContext.php
+++ b/tests/acceptance/bootstrap/TrashbinContext.php
@@ -148,13 +148,25 @@ class TrashbinContext implements Context {
public function listTopOfTrashbinFolder(?string $user, string $depth = "1"):array {
$password = $this->featureContext->getPasswordForUser($user);
$davPathVersion = $this->featureContext->getDavPathVersion();
+
+ $uniquePath = $user;
+ $spaceId = null;
+ if ($davPathVersion === WebDavHelper::DAV_VERSION_SPACES) {
+ $spaceId = WebDavHelper::getPersonalSpaceIdForUser(
+ $this->featureContext->getBaseUrl(),
+ $user,
+ $password,
+ $this->featureContext->getStepLineRef()
+ );
+ $uniquePath = $spaceId;
+ }
$response = WebDavHelper::listFolder(
$this->featureContext->getBaseUrl(),
$user,
$password,
"",
$depth,
- null,
+ $spaceId,
$this->featureContext->getStepLineRef(),
[
'oc:trashbin-original-filename',
@@ -176,8 +188,9 @@ class TrashbinContext implements Context {
// filter root element
$files = \array_filter(
$files,
- static function ($element) use ($user) {
- return ($element['href'] !== "/remote.php/dav/trash-bin/$user/");
+ static function ($element) use ($davPathVersion, $uniquePath) {
+ $davPath = WebDavHelper::getDavPath($davPathVersion, $uniquePath, "trash-bin");
+ return ($element['href'] !== "/" . $davPath . "/");
}
);
return $files;
@@ -247,17 +260,16 @@ class TrashbinContext implements Context {
$files = $this->getTrashbinContentFromResponseXml($responseXml);
- // set endpoint according to webdav request (2 = new, 3 = spaces)
- $endpoint = "/remote.php/dav/trash-bin/$user";
- if ($davPathVersion === 3) {
- $space_id = WebDavHelper::getPersonalSpaceIdForUser(
+ $uniquePath = $user;
+ if ($davPathVersion === WebDavHelper::DAV_VERSION_SPACES) {
+ $uniquePath = WebDavHelper::getPersonalSpaceIdForUser(
$this->featureContext->getBaseUrl(),
$user,
$this->featureContext->getPasswordForUser($user),
$this->featureContext->getStepLineRef()
);
- $endpoint = "/remote.php/dav/spaces/trash-bin/$space_id";
}
+ $endpoint = WebDavHelper::getDavPath($davPathVersion, $uniquePath, "trash-bin");
// filter out the collection itself, we only want to return the members
$files = \array_filter(
@@ -267,7 +279,7 @@ class TrashbinContext implements Context {
if ($path !== "") {
$path = $path . "/";
}
- return ($element['href'] !== "$endpoint/$path");
+ return ($element['href'] !== "/$endpoint/$path");
}
);
@@ -276,13 +288,8 @@ class TrashbinContext implements Context {
// avoid "common" situations that could cause infinite recursion.
$trashbinRef = $file["href"];
$trimmedTrashbinRef = \trim($trashbinRef, "/");
- if ($davPathVersion === WebDavHelper::DAV_VERSION_SPACES) {
- $expectedStart = "remote.php/dav/spaces/trash-bin";
- } else {
- $expectedStart = "remote.php/dav/trash-bin/$user";
- }
- $expectedStartLength = \strlen($expectedStart);
- if ((\substr($trimmedTrashbinRef, 0, $expectedStartLength) !== $expectedStart)
+ $expectedStartLength = \strlen($endpoint);
+ if ((\substr($trimmedTrashbinRef, 0, $expectedStartLength) !== $endpoint)
|| (\strlen($trimmedTrashbinRef) === $expectedStartLength)
) {
// A top href (maybe without even the username) has been returned
@@ -338,7 +345,7 @@ class TrashbinContext implements Context {
*/
public function theTrashbinDavResponseShouldNotContainTheseNodes(TableNode $table):void {
$this->featureContext->verifyTableNodeColumns($table, ['name']);
- $responseXml = $this->featureContext->getResponseXmlObject();
+ $responseXml = $this->featureContext->getResponseXml();
$files = $this->getTrashbinContentFromResponseXml($responseXml);
foreach ($table->getHash() as $row) {
@@ -361,7 +368,7 @@ class TrashbinContext implements Context {
*/
public function theTrashbinDavResponseShouldContainTheseNodes(TableNode $table):void {
$this->featureContext->verifyTableNodeColumns($table, ['name']);
- $responseXml = $this->featureContext->getResponseXmlObject();
+ $responseXml = $this->featureContext->getResponseXml();
$files = $this->getTrashbinContentFromResponseXml($responseXml);
@@ -387,16 +394,16 @@ class TrashbinContext implements Context {
* @param string|null $asUser - To send request as another user
* @param string|null $password
*
- * @return void
+ * @return ResponseInterface
* @throws Exception
*/
- public function sendTrashbinListRequest(string $user, ?string $asUser = null, ?string $password = null):void {
+ public function sendTrashbinListRequest(string $user, ?string $asUser = null, ?string $password = null): ResponseInterface {
$asUser = $asUser ?? $user;
$password = $password ?? $this->featureContext->getPasswordForUser($asUser);
- $davPathVersion = $this->featureContext->getDavPathVersion();
- $response = WebDavHelper::propfind(
+
+ return WebDavHelper::propfind(
$this->featureContext->getBaseUrl(),
- $asUser,
+ $user,
$password,
null,
[
@@ -409,19 +416,9 @@ class TrashbinContext implements Context {
'1',
null,
'trash-bin',
- $davPathVersion,
- $user
+ $this->featureContext->getDavPathVersion(),
+ $asUser
);
- $this->featureContext->setResponse($response);
- try {
- $responseXmlObject = HttpRequestHelper::getResponseXml(
- $response,
- __METHOD__
- );
- $this->featureContext->setResponseXmlObject($responseXmlObject);
- } catch (Exception $e) {
- $this->featureContext->clearResponseXmlObject();
- }
}
/**
@@ -436,7 +433,8 @@ class TrashbinContext implements Context {
public function userTriesToListTheTrashbinContentForUser(string $asUser, string $user) {
$user = $this->featureContext->getActualUsername($user);
$asUser = $this->featureContext->getActualUsername($asUser);
- $this->sendTrashbinListRequest($user, $asUser);
+ $response = $this->sendTrashbinListRequest($user, $asUser);
+ $this->featureContext->setResponse($response);
}
/**
@@ -450,7 +448,8 @@ class TrashbinContext implements Context {
* @throws Exception
*/
public function userTriesToListTheTrashbinContentForUserUsingPassword(string $asUser, string $user, string $password):void {
- $this->sendTrashbinListRequest($user, $asUser, $password);
+ $response = $this->sendTrashbinListRequest($user, $asUser, $password);
+ $this->featureContext->setResponse($response);
}
/**
@@ -461,7 +460,7 @@ class TrashbinContext implements Context {
* @return void
*/
public function theLastWebdavResponseShouldContainFollowingElements(TableNode $elements):void {
- $files = $this->getTrashbinContentFromResponseXml($this->featureContext->getResponseXmlObject());
+ $files = $this->getTrashbinContentFromResponseXml($this->featureContext->getResponseXml());
$elementRows = $elements->getHash();
foreach ($elementRows as $expectedElement) {
$found = false;
@@ -485,7 +484,7 @@ class TrashbinContext implements Context {
* @throws Exception
*/
public function theLastWebdavResponseShouldNotContainFollowingElements(TableNode $elements):void {
- $files = $this->getTrashbinContentFromResponseXml($this->featureContext->getResponseXmlObject());
+ $files = $this->getTrashbinContentFromResponseXml($this->featureContext->getResponseXml());
// 'user' is also allowed in the table even though it is not used anywhere
// This for better readability in feature files
@@ -576,7 +575,7 @@ class TrashbinContext implements Context {
}
/**
- * converts the trashItemHRef from //remote.php/dav/trash-bin/// to /trash-bin//
+ * converts the trashItemHRef from //dav/trash-bin/// to /trash-bin//
*
* @param string $href
*
@@ -787,24 +786,43 @@ class TrashbinContext implements Context {
*/
private function sendUndeleteRequest(string $user, string $trashItemHRef, string $destinationPath, ?string $asUser = null, ?string $password = null):ResponseInterface {
$asUser = $asUser ?? $user;
+ $password = $password ?? $this->featureContext->getPasswordForUser($asUser);
$destinationPath = \trim($destinationPath, '/');
- $destinationValue = $this->featureContext->getBaseUrl() . "/remote.php/dav/files/$user/$destinationPath";
+ $baseUrl = $this->featureContext->getBaseUrl();
+ $davPathVersion = $this->featureContext->getDavPathVersion();
- $trashItemHRef = $this->convertTrashbinHref($trashItemHRef);
- $headers['Destination'] = $destinationValue;
+ $uniquePath = $asUser;
+ if ($davPathVersion === WebDavHelper::DAV_VERSION_SPACES) {
+ if (\str_starts_with($destinationPath, "Shares/")) {
+ $uniquePath = $this->featureContext->spacesContext->getSpaceIdByName($user, "Shares");
+ $destinationPath = \str_replace("Shares/", "", $destinationPath);
+ } else {
+ $uniquePath = WebDavHelper::getPersonalSpaceIdForUser(
+ $baseUrl,
+ $asUser,
+ $password,
+ $this->featureContext->getStepLineRef()
+ );
+ }
+ }
+ $destinationDavPath = WebDavHelper::getDavPath($davPathVersion, $uniquePath);
+ $destination = "{$baseUrl}/{$destinationDavPath}/{$destinationPath}";
+
+ $trashItemHRef = \ltrim($this->convertTrashbinHref($trashItemHRef), "/");
+ $headers['Destination'] = $destination;
return $this->featureContext->makeDavRequest(
- $asUser,
+ $user,
'MOVE',
$trashItemHRef,
$headers,
null,
null,
'trash-bin',
- '2',
+ $davPathVersion,
false,
$password,
[],
- $user
+ $asUser
);
}
@@ -1133,7 +1151,7 @@ class TrashbinContext implements Context {
*/
public function theDeletedFileFolderShouldHaveCorrectDeletionMtimeInTheResponse(string $resource):void {
$files = $this->getTrashbinContentFromResponseXml(
- $this->featureContext->getResponseXmlObject()
+ $this->featureContext->getResponseXml()
);
$found = false;
diff --git a/tests/acceptance/bootstrap/WebDav.php b/tests/acceptance/bootstrap/WebDav.php
index 4af50af567..ed99bbdf0d 100644
--- a/tests/acceptance/bootstrap/WebDav.php
+++ b/tests/acceptance/bootstrap/WebDav.php
@@ -37,9 +37,9 @@ use TestHelpers\GraphHelper;
* WebDav functions
*/
trait WebDav {
- private string $davPath = "remote.php/webdav";
- private bool $usingOldDavPath = true;
- private bool $usingSpacesDavPath = false;
+ // defaults to the new DAV path
+ // maybe we want to make spaces the default in the future
+ private int $currentDAVPath = WebDavHelper::DAV_VERSION_NEW;
/**
* @var ResponseInterface[]
@@ -53,12 +53,6 @@ trait WebDav {
private ?int $lastUploadDeleteTime = null;
- /**
- * a variable that contains the DAV path without "remote.php/(web)dav"
- * when setting $this->davPath directly by usingDavPath()
- */
- private ?string $customDavPath = null;
-
/**
* response content parsed from XML to an array
*/
@@ -125,13 +119,6 @@ trait WebDav {
return $this->lastUploadDeleteTime;
}
- /**
- * @return SimpleXMLElement|null
- */
- public function getResponseXmlObject():?SimpleXMLElement {
- return $this->responseXmlObject;
- }
-
/**
* @param SimpleXMLElement $responseXmlObject
*
@@ -203,83 +190,33 @@ trait WebDav {
}
/**
- * @return string
- */
- public function getOldDavPath():string {
- return "remote.php/webdav";
- }
-
- /**
- * @return string
- */
- public function getNewDavPath():string {
- return "remote.php/dav";
- }
-
- /**
- * @return string
- */
- public function getSpacesDavPath():string {
- return "dav/spaces";
- }
-
- /**
- * @Given /^using (old|new|spaces) (?:dav|DAV) path$/
+ * @Given /^using (old|new|spaces) DAV path$/
*
* @param string $davChoice
*
* @return void
*/
- public function usingOldOrNewDavPath(string $davChoice):void {
- if ($davChoice === 'old') {
- $this->usingOldDavPath();
- } elseif ($davChoice === 'new') {
- $this->usingNewDavPath();
- } else {
- $this->usingSpacesDavPath();
+ public function usingOldOrNewOrSpacesDavPath(string $davChoice):void {
+ switch ($davChoice) {
+ case 'old':
+ $this->currentDAVPath = WebDavHelper::DAV_VERSION_OLD;
+ break;
+ case 'new':
+ $this->currentDAVPath = WebDavHelper::DAV_VERSION_NEW;
+ break;
+ case 'spaces':
+ $this->currentDAVPath = WebDavHelper::DAV_VERSION_SPACES;
+ break;
+ default:
+ throw new Exception("Invalid DAV path: $davChoice");
+ break;
}
}
- /**
- * Select the old DAV path as the default for later scenario steps
- *
- * @return void
- */
- public function usingOldDavPath():void {
- $this->davPath = $this->getOldDavPath();
- $this->usingOldDavPath = true;
- $this->customDavPath = null;
- $this->usingSpacesDavPath = false;
- }
-
- /**
- * Select the new DAV path as the default for later scenario steps
- *
- * @return void
- */
- public function usingNewDavPath():void {
- $this->davPath = $this->getNewDavPath();
- $this->usingOldDavPath = false;
- $this->customDavPath = null;
- $this->usingSpacesDavPath = false;
- }
-
- /**
- * Select the spaces dav path as the default for later scenario steps
- *
- * @return void
- */
- public function usingSpacesDavPath():void {
- $this->davPath = $this->getSpacesDavPath();
- $this->usingOldDavPath = false;
- $this->customDavPath = null;
- $this->usingSpacesDavPath = true;
- }
-
/**
* gives the DAV path of a file including the subfolder of the webserver
* e.g. when the server runs in `http://localhost/owncloud/`
- * this function will return `owncloud/remote.php/webdav/prueba.txt`
+ * this function will return `owncloud/webdav/prueba.txt`
*
* @param string $user
* @param string $spaceId
@@ -296,21 +233,27 @@ trait WebDav {
$this->getStepLineRef()
);
}
- $path = $this->getBasePath() . "/" .
- WebDavHelper::getDavPath($user, $this->getDavPathVersion(), "files", $spaceId);
+
+ $davPathVersion = $this->getDavPathVersion();
+ $uniquePath = $user;
+ if ($davPathVersion === WebDavHelper::DAV_VERSION_SPACES) {
+ $uniquePath = $spaceId;
+ }
+
+ $davPath = WebDavHelper::getDavPath($davPathVersion, $uniquePath);
+ $path = "{$this->getBasePath()}/{$davPath}";
$path = WebDavHelper::sanitizeUrl($path);
return \ltrim($path, "/");
}
/**
* @param string $token
- * @param string $type
*
* @return string
*/
- public function getPublicLinkDavPath(string $token, string $type):string {
- $path = $this->getBasePath() . "/" .
- WebDavHelper::getDavPath($token, $this->getDavPathVersion(), $type);
+ public function getPublicLinkDavPath(string $token):string {
+ $davPath = WebDavHelper::getDavPath($this->getDavPathVersion(), $token, "public-files");
+ $path = "{$this->getBasePath()}/{$davPath}";
$path = WebDavHelper::sanitizeUrl($path);
return \ltrim($path, "/");
}
@@ -326,45 +269,12 @@ trait WebDav {
* @return int DAV path version (1, 2 or 3) selected, or appropriate for the endpoint
*/
public function getDavPathVersion(?string $for = null):?int {
- if ($this->usingSpacesDavPath) {
- return WebDavHelper::DAV_VERSION_SPACES;
- }
- if ($for === 'systemtags') {
- // systemtags only exists since DAV v2
+ if (\in_array($for, ['systemtags', 'file_versions'])) {
+ // 'systemtags' only exists since new DAV
+ // 'file_versions' only exists since new DAV
return WebDavHelper::DAV_VERSION_NEW;
}
- if ($for === 'file_versions') {
- // file_versions only exists since DAV v2
- return WebDavHelper::DAV_VERSION_NEW;
- }
- if ($this->usingOldDavPath === true) {
- return WebDavHelper::DAV_VERSION_OLD;
- } else {
- return WebDavHelper::DAV_VERSION_NEW;
- }
- }
-
- /**
- * Select a suitable DAV path.
- * Some endpoints have only existed since a certain point in time, so for
- * those make sure to return a DAV path that works for that endpoint.
- * Otherwise return the currently selected DAV path.
- *
- * @param string|null $for the category of endpoint that the DAV path will be used for
- *
- * @return string DAV path selected, or appropriate for the endpoint
- */
- public function getDavPath(?string $for = null):string {
- $davPathVersion = $this->getDavPathVersion($for);
- if ($davPathVersion === WebDavHelper::DAV_VERSION_OLD) {
- return $this->getOldDavPath();
- }
-
- if ($davPathVersion === WebDavHelper::DAV_VERSION_NEW) {
- return $this->getNewDavPath();
- }
-
- return $this->getSpacesDavPath();
+ return $this->currentDAVPath;
}
/**
@@ -396,7 +306,7 @@ trait WebDav {
$body = null,
?string $spaceId = null,
?string $type = "files",
- ?string $davPathVersion = null,
+ ?int $davPathVersion = null,
bool $stream = false,
?string $password = null,
?array $urlParameter = [],
@@ -404,9 +314,6 @@ trait WebDav {
?bool $isGivenStep = false
):ResponseInterface {
$user = $this->getActualUsername($user);
- if ($this->customDavPath !== null) {
- $path = $this->customDavPath . $path;
- }
if ($davPathVersion === null) {
$davPathVersion = $this->getDavPathVersion();
@@ -454,7 +361,6 @@ trait WebDav {
* @throws GuzzleException | JsonException
*/
public function createFolder(string $user, string $folder, ?bool $isGivenStep = false, ?string $password = null, ?string $spaceId=null): ResponseInterface {
- $folder = '/' . \ltrim($folder, '/');
return $this->makeDavRequest(
$user,
"MKCOL",
@@ -485,10 +391,11 @@ trait WebDav {
public function downloadPreviews(string $user, ?string $path, ?string $doDavRequestAsUser, ?string $width, ?string $height):ResponseInterface {
$user = $this->getActualUsername($user);
$doDavRequestAsUser = $this->getActualUsername($doDavRequestAsUser);
+ $doDavRequestAsUser = $doDavRequestAsUser ?? $user;
+ $password = $this->getPasswordForUser($doDavRequestAsUser);
$urlParameter = [
'x' => $width,
'y' => $height,
- 'forceIcon' => '0',
'preview' => '1'
];
return $this->makeDavRequest(
@@ -501,7 +408,7 @@ trait WebDav {
"files",
null,
false,
- null,
+ $password,
$urlParameter,
$doDavRequestAsUser
);
@@ -516,7 +423,7 @@ trait WebDav {
* @throws Exception
*/
public function theNumberOfVersionsShouldBe(int $number):void {
- $resXml = $this->getResponseXmlObject();
+ $resXml = $this->getResponseXml();
if ($resXml === null) {
$resXml = HttpRequestHelper::getResponseXml(
$this->getResponse(),
@@ -542,7 +449,7 @@ trait WebDav {
* @throws Exception
*/
public function theNumberOfEtagElementInTheResponseShouldBe(int $number):void {
- $resXml = $this->getResponseXmlObject();
+ $resXml = $this->getResponseXml();
if ($resXml === null) {
$resXml = HttpRequestHelper::getResponseXml(
$this->getResponse(),
@@ -575,8 +482,15 @@ trait WebDav {
$fileDestination = \preg_replace("/^Shares\//", "", $fileDestination);
}
}
- $fullUrl = $this->getBaseUrl() . '/' .
- WebDavHelper::getDavPath($user, $this->getDavPathVersion(), "files", $spaceId);
+
+ $davPathVersion = $this->getDavPathVersion();
+ $uniquePath = $user;
+ if ($davPathVersion === WebDavHelper::DAV_VERSION_SPACES) {
+ $uniquePath = $spaceId;
+ }
+
+ $davPath = WebDavHelper::getDavPath($davPathVersion, $uniquePath);
+ $fullUrl = $this->getBaseUrl() . "/$davPath";
return \rtrim($fullUrl, '/') . '/' . $fileDestination;
}
@@ -1199,7 +1113,8 @@ trait WebDav {
*/
public function publicGetsSizeOfLastSharedPublicLinkUsingTheWebdavApi():void {
$token = ($this->isUsingSharingNG()) ? $this->shareNgGetLastCreatedLinkShareToken() : $this->getLastCreatedPublicShareToken();
- $url = $this->getBaseUrl() . "/remote.php/dav/public-files/$token";
+ $davPath = WebDavHelper::getDavPath($this->getDavPathVersion(), $token, "public-files");
+ $url = "{$this->getBaseUrl()}/{$davPath}";
$this->response = HttpRequestHelper::sendRequest(
$url,
$this->getStepLineRef(),
@@ -1532,10 +1447,6 @@ trait WebDav {
?string $spaceId = null,
string $type = "files"
):ResponseInterface {
- if ($this->customDavPath !== null) {
- $path = $this->customDavPath . $path;
- }
-
return WebDavHelper::listFolder(
$this->getBaseUrl(),
$this->getActualUsername($user),
@@ -1844,9 +1755,9 @@ trait WebDav {
$noOfChunks,
"What does it mean to have $noOfChunks chunks?"
);
- //use the chunking version that works with the set DAV version
+ // use the chunking version that works with the set DAV version
if ($chunkingVersion === null) {
- if ($this->usingOldDavPath || $this->usingSpacesDavPath) {
+ if (\in_array($this->currentDAVPath, [WebDavHelper::DAV_VERSION_OLD, WebDavHelper::DAV_VERSION_SPACES])) {
$chunkingVersion = "v1";
} else {
$chunkingVersion = "v2";
@@ -2297,6 +2208,11 @@ trait WebDav {
): ResponseInterface {
$user = $this->getActualUsername($user);
$this->pauseUploadDelete();
+
+ if (\str_starts_with($destination, "Shares/") && $this->getDavPathVersion() === WebDavHelper::DAV_VERSION_SPACES) {
+ $spaceId = $this->spacesContext->getSpaceIdByName($user, "Shares");
+ $destination = \str_replace("Shares/", "", $destination);
+ }
$response = $this->makeDavRequest(
$user,
"PUT",
@@ -2731,21 +2647,23 @@ trait WebDav {
}
/**
- * @When user :user deletes file :filename from space :space using file-id path :davPath
+ * @When user :user deletes file :filename from space :space using file-id :fileId
*
* @param string $user
* @param string $filename
* @param string $space
- * @param string $davPath
+ * @param string $fileId
*
* @return void
*/
- public function userDeletesFileFromSpaceUsingFileIdPath(string $user, string $filename, string $space, string $davPath):void {
- $requestUrl = $this->getBaseUrl() . $davPath;
+ public function userDeletesFileFromSpaceUsingFileIdPath(string $user, string $filename, string $space, string $fileId):void {
+ $baseUrl = $this->getBaseUrl();
+ $davPath = WebDavHelper::getDavPath($this->getDavPathVersion());
$user = $this->getActualUsername($user);
$password = $this->getPasswordForUser($user);
+ $fullUrl = "$baseUrl/$davPath/$fileId";
$response = HttpRequestHelper::sendRequest(
- $requestUrl,
+ $fullUrl,
null,
'DELETE',
$user,
@@ -3764,7 +3682,7 @@ trait WebDav {
* @return void
*/
public function userDownloadsThePreviewOfSharedResourceWithWidthAndHeightUsingTheWebdavApi(string $user, string $path, string $width, string $height): void {
- if ($this->getDavPathVersion() === 3) {
+ if ($this->getDavPathVersion() === WebDavHelper::DAV_VERSION_SPACES) {
$this->setResponse($this->downloadSharedFilePreview($user, $path, $width, $height));
} else {
$this->setResponse($this->downloadPreviews($user, $path, null, $width, $height));
@@ -3817,7 +3735,7 @@ trait WebDav {
* @return void
*/
public function userHasDownloadedThePreviewOfSharedResourceWithWidthAndHeight(string $user, string $path, string $width, string $height): void {
- if ($this->getDavPathVersion() === 3) {
+ if ($this->getDavPathVersion() === WebDavHelper::DAV_VERSION_SPACES) {
$response = $this->downloadSharedFilePreview($user, $path, $width, $height);
} else {
$response = $this->downloadPreviews($user, $path, null, $width, $height);
@@ -3841,7 +3759,7 @@ trait WebDav {
* @return void
*/
public function asUserThePreviewOfSharedResourceWithWidthAndHeightShouldHaveBeenChanged(string $user, string $path, string $width, string $height):void {
- if ($this->getDavPathVersion() === 3) {
+ if ($this->getDavPathVersion() === WebDavHelper::DAV_VERSION_SPACES) {
$response = $this->downloadSharedFilePreview($user, $path, $width, $height);
} else {
$response = $this->downloadPreviews($user, $path, null, $width, $height);
@@ -3870,11 +3788,7 @@ trait WebDav {
* @return void
*/
public function userUploadsFileWithContentSharedResourceToUsingTheWebdavApi(string $user, string $content, string $destination): void {
- if ($this->getDavPathVersion() === 3) {
- $this->setResponse($this->uploadToSharedFolder($user, $destination, $content));
- } else {
- $this->setResponse($this->uploadFileWithContent($user, $content, $destination, null));
- }
+ $this->setResponse($this->uploadFileWithContent($user, $content, $destination));
}
/**
@@ -3933,10 +3847,17 @@ trait WebDav {
} else {
$urlParameter = null;
}
- $sharesPath = $this->getSharesMountPath($user, $path) . '/?' . $urlParameter;
- $davPath = WebDavHelper::getDavPath($user, $this->getDavPathVersion());
- $fullUrl = $this->getBaseUrl() . "/$davPath" . $sharesPath;
+ $davPathVersion = $this->getDavPathVersion();
+ $uniquePath = $user;
+ if ($davPathVersion === WebDavHelper::DAV_VERSION_SPACES) {
+ $uniquePath = $this->getSharesMountPath($user, $path);
+ $path = "";
+ }
+ $path = \ltrim($path, "/");
+ $davPath = WebDavHelper::getDavPath($this->getDavPathVersion(), $uniquePath);
+ $davPath = \rtrim($davPath, "/");
+ $fullUrl = $this->getBaseUrl() . "/$davPath/$path?$urlParameter";
return HttpRequestHelper::sendRequest(
$fullUrl,
@@ -3948,50 +3869,21 @@ trait WebDav {
}
/**
+ * @When user :user downloads the preview of :path of :ofUser with width :width and height :height using the WebDAV API
+ *
* @param string $user
- * @param string $destination
- * @param string|null $content
- *
- * @return ResponseInterface
- * @throws GuzzleException
- */
- public function uploadToSharedFolder(
- string $user,
- string $destination,
- ?string $content = null
- ): ResponseInterface {
- $sharesPath = $this->getSharesMountPath($user, $destination);
-
- $davPath = WebDavHelper::getDavPath($user, $this->getDavPathVersion());
- $fullUrl = $this->getBaseUrl() . "/$davPath" . $sharesPath;
-
- return HttpRequestHelper::sendRequest(
- $fullUrl,
- $this->getStepLineRef(),
- 'PUT',
- $user,
- $this->getPasswordForUser($user),
- null,
- $content
- );
- }
-
- /**
- * @When user :user1 downloads the preview of :path of :user2 with width :width and height :height using the WebDAV API
- *
- * @param string $user1
* @param string $path
- * @param string $doDavRequestAsUser
+ * @param string $ofUser
* @param string $width
* @param string $height
*
* @return void
*/
- public function downloadPreviewOfOtherUser(string $user1, string $path, string $doDavRequestAsUser, string $width, string $height):void {
+ public function downloadPreviewOfOtherUser(string $user, string $path, string $ofUser, string $width, string $height):void {
$response = $this->downloadPreviews(
- $user1,
+ $ofUser,
$path,
- $doDavRequestAsUser,
+ $user,
$width,
$height
);
@@ -4193,9 +4085,7 @@ trait WebDav {
?string $folderpath = '',
?string $spaceId = null
):void {
- if ($folderpath === "/") {
- $folderpath = "";
- }
+ $folderpath = \trim($folderpath, "/");
$this->verifyTableNodeColumnsCount($expectedFiles, 1);
$elementRows = $expectedFiles->getRows();
$should = ($shouldOrNot !== "not");
@@ -4478,10 +4368,10 @@ trait WebDav {
public function theLastPublicDavResponseShouldContainTheseNodes(TableNode $table):void {
$token = ($this->isUsingSharingNG()) ? $this->shareNgGetLastCreatedLinkShareToken() : $this->getLastCreatedPublicShareToken();
$this->verifyTableNodeColumns($table, ["name"]);
- $type = $this->usingOldDavPath ? "public-files" : "public-files-new";
+
foreach ($table->getHash() as $row) {
$path = $this->substituteInLineCodes($row['name']);
- $res = $this->findEntryFromPropfindResponse($path, $token, $type);
+ $res = $this->findEntryFromPropfindResponse($path, $token, "public-files");
Assert::assertNotFalse($res, "expected $path to be in DAV response but was not found");
}
}
@@ -4497,10 +4387,10 @@ trait WebDav {
public function theLastPublicDavResponseShouldNotContainTheseNodes(TableNode $table):void {
$token = ($this->isUsingSharingNG()) ? $this->shareNgGetLastCreatedLinkShareToken() : $this->getLastCreatedPublicShareToken();
$this->verifyTableNodeColumns($table, ["name"]);
- $type = $this->usingOldDavPath ? "public-files" : "public-files-new";
+
foreach ($table->getHash() as $row) {
$path = $this->substituteInLineCodes($row['name']);
- $res = $this->findEntryFromPropfindResponse($path, $token, $type);
+ $res = $this->findEntryFromPropfindResponse($path, $token, "public-files");
Assert::assertFalse($res, "expected $path to not be in DAV response but was found");
}
}
@@ -4515,13 +4405,14 @@ trait WebDav {
*/
public function thePublicListsTheResourcesInTheLastCreatedPublicLinkWithDepthUsingTheWebdavApi(string $depth):void {
$token = ($this->isUsingSharingNG()) ? $this->shareNgGetLastCreatedLinkShareToken() : $this->getLastCreatedPublicShareToken();
+ // https://drone.owncloud.com/owncloud/ocis/39693/29/6
$response = $this->listFolder(
$token,
'/',
$depth,
null,
null,
- $this->usingOldDavPath ? "public-files" : "public-files-new"
+ "public-files"
);
$this->setResponse($response);
$this->setResponseXml(HttpRequestHelper::parseResponseAsXml($this->response));
@@ -4533,7 +4424,7 @@ trait WebDav {
* @return array
*/
public function findEntryFromReportResponse(?string $user):array {
- $responseXmlObj = $this->getResponseXmlObject();
+ $responseXmlObj = $this->getResponseXml();
$responseResources = [];
$hrefs = $responseXmlObj->xpath('//d:href');
foreach ($hrefs as $href) {
@@ -4648,16 +4539,13 @@ trait WebDav {
}
// url encode for spaces and brackets that may appear in the filePath
$folderPath = $this->escapePath($folderPath);
- // topWebDavPath should be something like /remote.php/webdav/ or
- // /remote.php/dav/files/alice/
+ // topWebDavPath should be something like '/webdav/' or '/dav/files/{user}/'
$topWebDavPath = "/" . $this->getFullDavFilesPath($user, $spaceId) . "/" . $folderPath;
switch ($type) {
case "files":
break;
case "public-files":
- case "public-files-old":
- case "public-files-new":
- $topWebDavPath = "/" . $this->getPublicLinkDavPath($user, $type) . "/";
+ $topWebDavPath = "/" . $this->getPublicLinkDavPath($user) . "/";
break;
default:
throw new Exception("error");
@@ -4705,18 +4593,27 @@ trait WebDav {
if ($entryNameToSearch !== null) {
$entryNameToSearch = \trim($entryNameToSearch, "/");
}
- $spacesBaseUrl = "/" . webDavHelper::getDavPath(null, webDavHelper::DAV_VERSION_SPACES, 'files', $spaceId);
+
+ $spacesBaseUrl = "/" . WebDavHelper::getDavPath($this->getDavPathVersion(), $spaceId);
+ $spacesBaseUrl = \rtrim($spacesBaseUrl, "/") . "/";
+ $hrefRegex = \preg_quote($spacesBaseUrl, "/");
+ if (\in_array($this->getDavPathVersion(), [WebDavHelper::DAV_VERSION_SPACES, WebDavHelper::DAV_VERSION_NEW])
+ && !GraphHelper::isSpaceId($entryNameToSearch ?? '')
+ ) {
+ $hrefRegex .= "[a-zA-Z0-9-_$!:%]+";
+ }
+ $hrefRegex = "/^" . $hrefRegex . "/";
+
$searchResults = $this->getResponseXml()->xpath("//d:multistatus/d:response");
$results = [];
foreach ($searchResults as $item) {
$href = (string)$item->xpath("d:href")[0];
$shareRootXml = $item->xpath("d:propstat//oc:shareroot");
- $href = \str_replace($spacesBaseUrl, "", $href);
- $resourcePath = $href;
+ $resourcePath = \preg_replace($hrefRegex, "", $href);
// do not try to parse the resource path
// if the item to search is space itself
if (!GraphHelper::isSpaceId($entryNameToSearch ?? '')) {
- $resourcePath = \substr($href, \strpos($href, '/') + 1);
+ $resourcePath = \substr($resourcePath, \strpos($resourcePath, '/') + 1);
}
if (\count($shareRootXml)) {
$shareroot = \trim((string)$shareRootXml[0], "/");
@@ -4787,7 +4684,7 @@ trait WebDav {
*/
public function checkAuthorOfAVersionOfFile(string $index, string $expectedUsername):void {
$expectedUserDisplayName = $this->getUserDisplayName($expectedUsername);
- $resXml = $this->getResponseXmlObject();
+ $resXml = $this->getResponseXml();
if ($resXml === null) {
$resXml = HttpRequestHelper::getResponseXml(
$this->getResponse(),
diff --git a/tests/acceptance/bootstrap/WebDavLockingContext.php b/tests/acceptance/bootstrap/WebDavLockingContext.php
index 17555df351..29b073af6d 100644
--- a/tests/acceptance/bootstrap/WebDavLockingContext.php
+++ b/tests/acceptance/bootstrap/WebDavLockingContext.php
@@ -71,9 +71,8 @@ class WebDavLockingContext implements Context {
?string $spaceId = null
):ResponseInterface {
$user = $this->featureContext->getActualUsername($user);
- $baseUrl = $this->featureContext->getBaseUrl();
if ($public === true) {
- $type = "public-files-new";
+ $type = "public-files";
$password = $this->featureContext->getActualPassword("%public%");
} else {
$type = "files";
@@ -108,6 +107,7 @@ class WebDavLockingContext implements Context {
$body
);
} else {
+ $baseUrl = $this->featureContext->getBaseUrl();
$response = WebDavHelper::makeDavRequest(
$baseUrl,
$user,
@@ -145,7 +145,12 @@ class WebDavLockingContext implements Context {
* @return void
*/
public function userLocksFileSettingPropertiesUsingWebDavAPI(string $user, string $file, TableNode $properties) {
- $response = $this->lockFile($user, $file, $properties);
+ $spaceId = null;
+ if (\str_starts_with($file, "Shares/") && $this->featureContext->getDavPathVersion() === WebDavHelper::DAV_VERSION_SPACES) {
+ $spaceId = $this->spacesContext->getSpaceIdByName($user, "Shares");
+ $file = \str_replace("Shares/", "", $file);
+ }
+ $response = $this->lockFile($user, $file, $properties, null, false, true, $spaceId);
$this->featureContext->setResponse($response);
}
@@ -190,7 +195,15 @@ class WebDavLockingContext implements Context {
*/
public function userLocksFileInProjectSpace(string $user, string $file, string $space, TableNode $properties): ?ResponseInterface {
$spaceId = $this->spacesContext->getSpaceIdByName($user, $space);
- $fullUrl = $this->featureContext->getBaseUrl() . '/dav/spaces/' . $spaceId . '/' . $file;
+ $baseUrl = $this->featureContext->getBaseUrl();
+ $davPathVersion = $this->featureContext->getDavPathVersion();
+ $uniquePath = $user;
+ if ($davPathVersion === WebDavHelper::DAV_VERSION_SPACES) {
+ $uniquePath = $spaceId;
+ }
+
+ $davPath = WebDavHelper::getDavPath($davPathVersion, $uniquePath);
+ $fullUrl = "$baseUrl/$davPath/$file";
return $this->lockFile($user, $file, $properties, $fullUrl, false, true, $spaceId);
}
@@ -222,39 +235,50 @@ class WebDavLockingContext implements Context {
*/
public function userTriesToLockFileInProjectSpaceUsingWebDavAPI(string $user, string $file, string $space, TableNode $properties) {
$spaceId = $this->spacesContext->getSpaceIdByName($user, $space);
- $fullUrl = $this->featureContext->getBaseUrl() . '/dav/spaces/' . $spaceId . '/' . $file;
+ $davPathVersion = $this->featureContext->getDavPathVersion();
+ $uniquePath = $user;
+ if ($davPathVersion === WebDavHelper::DAV_VERSION_SPACES) {
+ $uniquePath = $spaceId;
+ }
+
+ $davPath = WebdavHelper::getDavPath($davPathVersion, $uniquePath);
+ $fullUrl = $this->featureContext->getBaseUrl() . "/$davPath/$file";
$response = $this->lockFile($user, $file, $properties, $fullUrl, false, false, $spaceId);
$this->featureContext->setResponse($response);
}
/**
- * @When user :user locks file :file using file-id path :path using the WebDAV API setting the following properties
+ * @When user :user locks file :file using file-id :fileId using the WebDAV API setting the following properties
*
* @param string $user
* @param string $file
- * @param string $filePath
+ * @param string $fileId
* @param TableNode $properties table with no heading with | property | value |
*
* @return void
*/
- public function userLocksFileUsingFileIdUsingWebDavAPI(string $user, string $file, string $filePath, TableNode $properties) {
- $fullUrl = $this->featureContext->getBaseUrl() . $filePath;
+ public function userLocksFileUsingFileIdUsingWebDavAPISettingFollowingProperties(string $user, string $file, string $fileId, TableNode $properties) {
+ $davPath = WebdavHelper::getDavPath($this->featureContext->getDavPathVersion());
+ $davPath = \rtrim($davPath, '/');
+ $fullUrl = $this->featureContext->getBaseUrl() . "/$davPath/$fileId";
$response = $this->lockFile($user, $file, $properties, $fullUrl);
$this->featureContext->setResponse($response);
}
/**
- * @When user :user tries to lock file :file using file-id path :path using the WebDAV API setting the following properties
+ * @When user :user tries to lock file :file using file-id :fileId using the WebDAV API setting the following properties
*
* @param string $user
* @param string $file
- * @param string $filePath
+ * @param string $fileId
* @param TableNode $properties table with no heading with | property | value |
*
* @return void
*/
- public function userTriesToLockFileUsingFileIdUsingWebDavAPI(string $user, string $file, string $filePath, TableNode $properties) {
- $fullUrl = $this->featureContext->getBaseUrl() . $filePath;
+ public function userTriesToLockFileUsingFileIdUsingWebDavAPI(string $user, string $file, string $fileId, TableNode $properties) {
+ $davPath = WebdavHelper::getDavPath($this->featureContext->getDavPathVersion());
+ $davPath = \rtrim($davPath, '/');
+ $fullUrl = $this->featureContext->getBaseUrl() . "/$davPath/$fileId";
$response = $this->lockFile($user, $file, $properties, $fullUrl, false, false);
$this->featureContext->setResponse($response);
}
@@ -290,17 +314,19 @@ class WebDavLockingContext implements Context {
}
/**
- * @Given user :user has locked file :file using file-id path :path setting the following properties
+ * @Given user :user has locked file :file using file-id :fileId setting the following properties
*
* @param string $user
* @param string $file
- * @param string $filePath
+ * @param string $fileId
* @param TableNode $properties table with no heading with | property | value |
*
* @return void
*/
- public function userHasLockedFileUsingFileId(string $user, string $file, string $filePath, TableNode $properties) {
- $fullUrl = $this->featureContext->getBaseUrl() . $filePath;
+ public function userHasLockedFileUsingFileId(string $user, string $file, string $fileId, TableNode $properties) {
+ $davPath = WebdavHelper::getDavPath($this->featureContext->getDavPathVersion());
+ $davPath = \rtrim($davPath, '/');
+ $fullUrl = $this->featureContext->getBaseUrl() . "/$davPath/$fileId";
$response = $this->lockFile($user, $file, $properties, $fullUrl);
$this->featureContext->theHTTPStatusCodeShouldBe(200, '', $response);
}
@@ -436,16 +462,18 @@ class WebDavLockingContext implements Context {
}
/**
- * @When user :user unlocks the last created lock of file :itemToUnlock using file-id path :filePath using the WebDAV API
+ * @When user :user unlocks the last created lock of file :itemToUnlock using file-id :fileId using the WebDAV API
*
* @param string $user
* @param string $itemToUnlock
- * @param string $filePath
+ * @param string $fileId
*
* @return void
*/
- public function userUnlocksTheLastCreatedLockOfFileWithFileIdPathUsingTheWebdavApi(string $user, string $itemToUnlock, string $filePath) {
- $fullUrl = $this->featureContext->getBaseUrl() . $filePath;
+ public function userUnlocksTheLastCreatedLockOfFileWithFileIdPathUsingTheWebdavApi(string $user, string $itemToUnlock, string $fileId) {
+ $davPath = WebdavHelper::getDavPath($this->featureContext->getDavPathVersion());
+ $davPath = \rtrim($davPath, '/');
+ $fullUrl = $this->featureContext->getBaseUrl() . "/$davPath/$fileId";
$response = $this->unlockItemWithLastLockOfUserAndItemUsingWebDavAPI($user, $itemToUnlock, $user, $itemToUnlock, false, $fullUrl);
$this->featureContext->setResponse($response);
}
@@ -603,7 +631,7 @@ class WebDavLockingContext implements Context {
$user = $this->featureContext->getActualUsername($user);
$lockOwner = $this->featureContext->getActualUsername($lockOwner);
if ($public === true) {
- $type = "public-files-new";
+ $type = "public-files";
$password = $this->featureContext->getActualPassword("%public%");
} else {
$type = "files";
diff --git a/tests/acceptance/bootstrap/WebDavPropertiesContext.php b/tests/acceptance/bootstrap/WebDavPropertiesContext.php
index 543e5d5b81..7ab4ab23ab 100644
--- a/tests/acceptance/bootstrap/WebDavPropertiesContext.php
+++ b/tests/acceptance/bootstrap/WebDavPropertiesContext.php
@@ -272,7 +272,7 @@ class WebDavPropertiesContext implements Context {
'0',
$properties,
null,
- $this->featureContext->getDavPathVersion() === 1 ? "public-files" : "public-files-new"
+ "public-files"
);
}
@@ -727,6 +727,8 @@ class WebDavPropertiesContext implements Context {
*/
public function valueOfItemOfPathShouldBe(string $user, string $xpath, string $path, string $expectedValue):void {
$path = $this->featureContext->substituteInLineCodes($path, $user);
+ $path = \ltrim($path, '/');
+ $path = "/" . WebdavHelper::withRemotePhp($path);
$fullXpath = "//d:response/d:href[.='$path']/following-sibling::d:propstat$xpath";
$this->assertValueOfItemInResponseAboutUserIs(
$fullXpath,
@@ -769,8 +771,8 @@ class WebDavPropertiesContext implements Context {
);
// The expected value can contain /%base_path%/ which can be empty some time
- // This will result in urls such as //remote.php, so replace that
- $expectedValue = preg_replace("/\/\/remote\.php/i", "/remote.php", $expectedValue);
+ // This will result in urls starting from '//', so replace that with single'/'
+ $expectedValue = preg_replace("/^\/\//i", "/", $expectedValue);
Assert::assertEquals(
$expectedValue,
$value,
@@ -811,9 +813,9 @@ class WebDavPropertiesContext implements Context {
);
// The expected value can contain /%base_path%/ which can be empty some time
- // This will result in urls such as //remote.php, so replace that
- $expectedValue1 = preg_replace("/\/\/remote\.php/i", "/remote.php", $expectedValue1);
- $expectedValue2 = preg_replace("/\/\/remote\.php/i", "/remote.php", $expectedValue2);
+ // This will result in urls starting from '//', so replace that with single'/'
+ $expectedValue1 = preg_replace("/^\/\//i", "/", $expectedValue1);
+ $expectedValue2 = preg_replace("/^\/\//i", "/", $expectedValue2);
$expectedValues = [$expectedValue1, $expectedValue2];
$isExpectedValueInMessage = \in_array($value, $expectedValues);
Assert::assertTrue($isExpectedValueInMessage, "The actual value \"$value\" is not one of the expected values: \"$expectedValue1\" or \"$expectedValue2\"");
@@ -896,6 +898,7 @@ class WebDavPropertiesContext implements Context {
$user,
['preg_quote' => ['/']]
);
+ $expectedHref = WebdavHelper::withRemotePhp($expectedHref);
$index = 0;
while (true) {
@@ -909,16 +912,12 @@ class WebDavPropertiesContext implements Context {
);
$value = $xmlPart[0]->__toString();
$decodedValue = \rawurldecode($value);
- // for folders, decoded value will be like: "/owncloud/core/remote.php/webdav/strängé folder/"
- // expected href should be like: "remote.php/webdav/strängé folder/"
- // for files, decoded value will be like: "/owncloud/core/remote.php/webdav/strängé folder/file.txt"
- // expected href should be like: "remote.php/webdav/strängé folder/file.txt"
$explodeDecoded = \explode('/', $decodedValue);
// get the first item of the expected href.
- // i.e. remote.php from "remote.php/webdav/strängé folder/file.txt"
- // or dav from "dav/spaces/%spaceid%/C++ file.cpp"
- $explodeExpected = \explode('/', $expectedHref);
- $remotePhpIndex = \array_search($explodeExpected[0], $explodeDecoded);
+ // 'dav' from "dav/spaces/%spaceid%/C++ file.cpp"
+ $explodeExpected = \explode('/', $expectedHref)[0];
+
+ $remotePhpIndex = \array_search($explodeExpected, $explodeDecoded);
if ($remotePhpIndex) {
$explodedHrefPartArray = \array_slice($explodeDecoded, $remotePhpIndex);
$actualHrefPart = \implode('/', $explodedHrefPartArray);
@@ -955,6 +954,14 @@ class WebDavPropertiesContext implements Context {
$user = $this->featureContext->getActualUsername($user);
$value = $xmlPart[0]->__toString();
$callback = ($this->featureContext->isUsingSharingNG()) ? "shareNgGetLastCreatedLinkShareToken" : "getLastCreatedPublicShareToken";
+
+ if (\str_ends_with($xpath, "d:href")) {
+ $pattern = \preg_replace("/^\//", "", $pattern);
+ $pattern = \preg_replace("/^\^/", "", $pattern);
+ $pattern = \ltrim($pattern, "\/");
+ $withRemotePhp = \rtrim(WebdavHelper::withRemotePhp(""), "/");
+ $pattern = "/^\/{$withRemotePhp}\/{$pattern}";
+ }
$pattern = $this->featureContext->substituteInLineCodes(
$pattern,
$user,
diff --git a/tests/acceptance/config/behat.yml b/tests/acceptance/config/behat.yml
index adefa793fe..35b72f4330 100644
--- a/tests/acceptance/config/behat.yml
+++ b/tests/acceptance/config/behat.yml
@@ -14,11 +14,11 @@ default:
ldapInitialUserFilePath: /../config/ldap-users.ldif
contexts:
- FeatureContext: &common_feature_context_params
- baseUrl: http://localhost:8080
+ baseUrl: http://localhost:8080 # TODO: clean me
adminUsername: admin
adminPassword: admin
regularUserPassword: 123456
- ocPath: apps/testing/api/v1/occ
+ ocPath: apps/testing/api/v1/occ # TODO: clean me
- SettingsContext:
- GraphContext:
- SpacesContext:
diff --git a/tests/acceptance/expected-failures-API-on-OCIS-storage.md b/tests/acceptance/expected-failures-API-on-OCIS-storage.md
index a9e687d791..8f59714af7 100644
--- a/tests/acceptance/expected-failures-API-on-OCIS-storage.md
+++ b/tests/acceptance/expected-failures-API-on-OCIS-storage.md
@@ -168,6 +168,27 @@ _ocdav: api compatibility, return correct status code_
- [coreApiWebdavProperties/copyFile.feature:1068](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties/copyFile.feature#L1068)
- [coreApiWebdavProperties/copyFile.feature:1069](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties/copyFile.feature#L1069)
+#### [same href in REPORT request for all dav-path-version](https://github.com/owncloud/ocis/issues/7060)
+
+- [coreApiWebdavOperations/search.feature:42](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavOperations/search.feature#L42)
+- [coreApiWebdavOperations/search.feature:43](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavOperations/search.feature#L43)
+- [coreApiWebdavOperations/search.feature:60](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavOperations/search.feature#L60)
+- [coreApiWebdavOperations/search.feature:61](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavOperations/search.feature#L61)
+- [coreApiWebdavOperations/search.feature:79](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavOperations/search.feature#L79)
+- [coreApiWebdavOperations/search.feature:80](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavOperations/search.feature#L80)
+- [coreApiWebdavOperations/search.feature:110](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavOperations/search.feature#L110)
+- [coreApiWebdavOperations/search.feature:111](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavOperations/search.feature#L111)
+- [coreApiWebdavOperations/search.feature:130](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavOperations/search.feature#L130)
+- [coreApiWebdavOperations/search.feature:131](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavOperations/search.feature#L131)
+- [coreApiWebdavOperations/search.feature:151](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavOperations/search.feature#L151)
+- [coreApiWebdavOperations/search.feature:152](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavOperations/search.feature#L152)
+- [coreApiWebdavOperations/search.feature:229](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavOperations/search.feature#L229)
+- [coreApiWebdavOperations/search.feature:230](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavOperations/search.feature#L230)
+
+#### [Trying to restore personal file to share received folder deletes shared file]()
+
+- [coreApiTrashbin/trashbinSharingToShares.feature:271](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbin/trashbinSharingToShares.feature#L271)
+
### Won't fix
Not everything needs to be implemented for ocis. While the oc10 testsuite covers these things we are not looking at them right now.
diff --git a/tests/acceptance/expected-failures-localAPI-on-OCIS-storage.md b/tests/acceptance/expected-failures-localAPI-on-OCIS-storage.md
index 6ada712dfb..e13a79058e 100644
--- a/tests/acceptance/expected-failures-localAPI-on-OCIS-storage.md
+++ b/tests/acceptance/expected-failures-localAPI-on-OCIS-storage.md
@@ -84,24 +84,24 @@ The expected failures in this file are from features in the owncloud/ocis repo.
#### [Shared file locking is not possible using different path](https://github.com/owncloud/ocis/issues/7599)
-- [apiLocks/lockFiles.feature:188](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiLocks/lockFiles.feature#L188)
-- [apiLocks/lockFiles.feature:189](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiLocks/lockFiles.feature#L189)
-- [apiLocks/lockFiles.feature:190](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiLocks/lockFiles.feature#L190)
-- [apiLocks/lockFiles.feature:311](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiLocks/lockFiles.feature#L311)
-- [apiLocks/lockFiles.feature:312](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiLocks/lockFiles.feature#L312)
-- [apiLocks/lockFiles.feature:313](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiLocks/lockFiles.feature#L313)
+- [apiLocks/lockFiles.feature:185](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiLocks/lockFiles.feature#L185)
+- [apiLocks/lockFiles.feature:186](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiLocks/lockFiles.feature#L186)
+- [apiLocks/lockFiles.feature:187](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiLocks/lockFiles.feature#L187)
+- [apiLocks/lockFiles.feature:308](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiLocks/lockFiles.feature#L308)
+- [apiLocks/lockFiles.feature:309](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiLocks/lockFiles.feature#L309)
+- [apiLocks/lockFiles.feature:310](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiLocks/lockFiles.feature#L310)
+- [apiLocks/lockFiles.feature:363](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiLocks/lockFiles.feature#L363)
+- [apiLocks/lockFiles.feature:364](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiLocks/lockFiles.feature#L364)
+- [apiLocks/lockFiles.feature:365](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiLocks/lockFiles.feature#L365)
- [apiLocks/lockFiles.feature:366](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiLocks/lockFiles.feature#L366)
- [apiLocks/lockFiles.feature:367](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiLocks/lockFiles.feature#L367)
- [apiLocks/lockFiles.feature:368](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiLocks/lockFiles.feature#L368)
-- [apiLocks/lockFiles.feature:369](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiLocks/lockFiles.feature#L369)
-- [apiLocks/lockFiles.feature:370](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiLocks/lockFiles.feature#L370)
-- [apiLocks/lockFiles.feature:371](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiLocks/lockFiles.feature#L371)
+- [apiLocks/lockFiles.feature:398](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiLocks/lockFiles.feature#L398)
+- [apiLocks/lockFiles.feature:399](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiLocks/lockFiles.feature#L399)
+- [apiLocks/lockFiles.feature:400](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiLocks/lockFiles.feature#L400)
- [apiLocks/lockFiles.feature:401](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiLocks/lockFiles.feature#L401)
- [apiLocks/lockFiles.feature:402](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiLocks/lockFiles.feature#L402)
- [apiLocks/lockFiles.feature:403](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiLocks/lockFiles.feature#L403)
-- [apiLocks/lockFiles.feature:404](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiLocks/lockFiles.feature#L404)
-- [apiLocks/lockFiles.feature:405](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiLocks/lockFiles.feature#L405)
-- [apiLocks/lockFiles.feature:406](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiLocks/lockFiles.feature#L406)
- [apiLocks/unlockFiles.feature:62](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiLocks/unlockFiles.feature#L62)
- [apiLocks/unlockFiles.feature:63](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiLocks/unlockFiles.feature#L63)
- [apiLocks/unlockFiles.feature:64](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiLocks/unlockFiles.feature#L64)
@@ -126,18 +126,18 @@ The expected failures in this file are from features in the owncloud/ocis repo.
#### [Folders can be locked and locking works partially](https://github.com/owncloud/ocis/issues/7641)
+- [apiLocks/lockFiles.feature:442](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiLocks/lockFiles.feature#L442)
+- [apiLocks/lockFiles.feature:443](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiLocks/lockFiles.feature#L443)
+- [apiLocks/lockFiles.feature:444](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiLocks/lockFiles.feature#L444)
- [apiLocks/lockFiles.feature:445](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiLocks/lockFiles.feature#L445)
- [apiLocks/lockFiles.feature:446](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiLocks/lockFiles.feature#L446)
- [apiLocks/lockFiles.feature:447](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiLocks/lockFiles.feature#L447)
-- [apiLocks/lockFiles.feature:448](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiLocks/lockFiles.feature#L448)
-- [apiLocks/lockFiles.feature:449](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiLocks/lockFiles.feature#L449)
-- [apiLocks/lockFiles.feature:450](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiLocks/lockFiles.feature#L450)
+- [apiLocks/lockFiles.feature:416](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiLocks/lockFiles.feature#L416)
+- [apiLocks/lockFiles.feature:417](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiLocks/lockFiles.feature#L417)
+- [apiLocks/lockFiles.feature:418](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiLocks/lockFiles.feature#L418)
- [apiLocks/lockFiles.feature:419](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiLocks/lockFiles.feature#L419)
- [apiLocks/lockFiles.feature:420](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiLocks/lockFiles.feature#L420)
- [apiLocks/lockFiles.feature:421](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiLocks/lockFiles.feature#L421)
-- [apiLocks/lockFiles.feature:422](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiLocks/lockFiles.feature#L422)
-- [apiLocks/lockFiles.feature:423](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiLocks/lockFiles.feature#L423)
-- [apiLocks/lockFiles.feature:424](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiLocks/lockFiles.feature#L424)
#### [Anonymous users can unlock a file shared to them through a public link if they get the lock token](https://github.com/owncloud/ocis/issues/7761)
@@ -165,18 +165,14 @@ The expected failures in this file are from features in the owncloud/ocis repo.
#### [Anonymous user trying lock a file shared to them through a public link gives 405](https://github.com/owncloud/ocis/issues/7790)
-- [apiLocks/lockFiles.feature:538](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiLocks/lockFiles.feature#L538)
-- [apiLocks/lockFiles.feature:539](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiLocks/lockFiles.feature#L539)
-- [apiLocks/lockFiles.feature:540](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiLocks/lockFiles.feature#L540)
-- [apiLocks/lockFiles.feature:541](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiLocks/lockFiles.feature#L541)
-- [apiLocks/lockFiles.feature:542](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiLocks/lockFiles.feature#L542)
-- [apiLocks/lockFiles.feature:543](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiLocks/lockFiles.feature#L543)
-- [apiLocks/lockFiles.feature:562](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiLocks/lockFiles.feature#L562)
-- [apiLocks/lockFiles.feature:563](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiLocks/lockFiles.feature#L563)
-- [apiLocks/lockFiles.feature:564](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiLocks/lockFiles.feature#L564)
-- [apiLocks/lockFiles.feature:565](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiLocks/lockFiles.feature#L565)
-- [apiLocks/lockFiles.feature:566](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiLocks/lockFiles.feature#L566)
-- [apiLocks/lockFiles.feature:567](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiLocks/lockFiles.feature#L567)
+- [apiLocks/lockFiles.feature:531](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiLocks/lockFiles.feature#L531)
+- [apiLocks/lockFiles.feature:532](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiLocks/lockFiles.feature#L532)
+- [apiLocks/lockFiles.feature:533](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiLocks/lockFiles.feature#L533)
+- [apiLocks/lockFiles.feature:534](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiLocks/lockFiles.feature#L534)
+- [apiLocks/lockFiles.feature:553](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiLocks/lockFiles.feature#L553)
+- [apiLocks/lockFiles.feature:554](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiLocks/lockFiles.feature#L554)
+- [apiLocks/lockFiles.feature:555](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiLocks/lockFiles.feature#L555)
+- [apiLocks/lockFiles.feature:556](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiLocks/lockFiles.feature#L556)
#### [blocksDownload link type is not implemented yet (sharing-ng)](https://github.com/owncloud/ocis/issues/7879)
@@ -233,39 +229,30 @@ The expected failures in this file are from features in the owncloud/ocis repo.
#### [sharee (editor role) MOVE a file by file-id into shared sub-folder returns 502](https://github.com/owncloud/ocis/issues/7617)
-- [apiSpacesDavOperation/moveByFileId.feature:469](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSpacesDavOperation/moveByFileId.feature#L469)
-- [apiSpacesDavOperation/moveByFileId.feature:470](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSpacesDavOperation/moveByFileId.feature#L470)
-- [apiSpacesDavOperation/moveByFileId.feature:732](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSpacesDavOperation/moveByFileId.feature#L732)
-- [apiSpacesDavOperation/moveByFileId.feature:733](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSpacesDavOperation/moveByFileId.feature#L733)
+- [apiSpacesDavOperation/moveByFileId.feature:368](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSpacesDavOperation/moveByFileId.feature#L368)
+- [apiSpacesDavOperation/moveByFileId.feature:591](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSpacesDavOperation/moveByFileId.feature#L591)
#### [MOVE a file into same folder with same name returns 404 instead of 403](https://github.com/owncloud/ocis/issues/1976)
- [apiSpacesShares/moveSpaces.feature:69](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSpacesShares/moveSpaces.feature#L69)
- [apiSpacesShares/moveSpaces.feature:70](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSpacesShares/moveSpaces.feature#L70)
- [apiSpacesShares/moveSpaces.feature:416](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSpacesShares/moveSpaces.feature#L416)
-- [apiSpacesDavOperation/moveByFileId.feature:86](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSpacesDavOperation/moveByFileId.feature#L86)
-- [apiSpacesDavOperation/moveByFileId.feature:87](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSpacesDavOperation/moveByFileId.feature#L87)
-- [apiSpacesDavOperation/moveByFileId.feature:205](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSpacesDavOperation/moveByFileId.feature#L205)
-- [apiSpacesDavOperation/moveByFileId.feature:206](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSpacesDavOperation/moveByFileId.feature#L206)
-- [apiSpacesDavOperation/moveByFileId.feature:207](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSpacesDavOperation/moveByFileId.feature#L207)
-- [apiSpacesDavOperation/moveByFileId.feature:208](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSpacesDavOperation/moveByFileId.feature#L208)
-- [apiSpacesDavOperation/moveByFileId.feature:209](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSpacesDavOperation/moveByFileId.feature#L209)
-- [apiSpacesDavOperation/moveByFileId.feature:210](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSpacesDavOperation/moveByFileId.feature#L210)
-- [apiSpacesDavOperation/moveByFileId.feature:492](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSpacesDavOperation/moveByFileId.feature#L492)
-- [apiSpacesDavOperation/moveByFileId.feature:493](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSpacesDavOperation/moveByFileId.feature#L493)
+- [apiSpacesDavOperation/moveByFileId.feature:61](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSpacesDavOperation/moveByFileId.feature#L61)
+- [apiSpacesDavOperation/moveByFileId.feature:174](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSpacesDavOperation/moveByFileId.feature#L174)
+- [apiSpacesDavOperation/moveByFileId.feature:175](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSpacesDavOperation/moveByFileId.feature#L175)
+- [apiSpacesDavOperation/moveByFileId.feature:176](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSpacesDavOperation/moveByFileId.feature#L176)
+- [apiSpacesDavOperation/moveByFileId.feature:393](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSpacesDavOperation/moveByFileId.feature#L393)
#### [OCM. admin cannot get federated users if he hasn't connection with them ](https://github.com/owncloud/ocis/issues/9829)
- [apiOcm/searchFederationUsers.feature:429](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiOcm/searchFederationUsers.feature#L429)
- [apiOcm/searchFederationUsers.feature:601](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiOcm/searchFederationUsers.feature#L601)
-
#### [OCM. federated connection is not dropped when one of the users deletes the connection](https://github.com/owncloud/ocis/issues/10216)
- [apiOcm/deleteFederatedConnections.feature:39](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiOcm/deleteFederatedConnections.feature#L39)
- [apiOcm/deleteFederatedConnections.feature:66](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiOcm/deleteFederatedConnections.feature#L66)
-
#### [OCM. server crash after deleting share for ocm user](https://github.com/owncloud/ocis/issues/10213)
- [apiOcm/deleteFederatedConnections.feature:103](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiOcm/deleteFederatedConnections.feature#L103)
@@ -276,5 +263,66 @@ The expected failures in this file are from features in the owncloud/ocis repo.
- [apiOcm/share.feature:232](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiOcm/share.feature#L232)
- [apiOcm/share.feature:233](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiOcm/share.feature#L233)
+#### [same href in REPORT request for all dav-path-version](https://github.com/owncloud/ocis/issues/7060)
+
+- [apiSearch1/dateSearch.feature:17](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch1/dateSearch.feature#L17)
+- [apiSearch1/dateSearch.feature:18](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch1/dateSearch.feature#L18)
+- [apiSearch1/search.feature:41](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch1/search.feature#L41)
+- [apiSearch1/search.feature:42](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch1/search.feature#L42)
+- [apiSearch1/search.feature:69](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch1/search.feature#L69)
+- [apiSearch1/search.feature:70](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch1/search.feature#L70)
+- [apiSearch1/search.feature:111](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch1/search.feature#L111)
+- [apiSearch1/search.feature:112](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch1/search.feature#L112)
+- [apiSearch1/search.feature:197](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch1/search.feature#L197)
+- [apiSearch1/search.feature:198](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch1/search.feature#L198)
+- [apiSearch1/search.feature:221](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch1/search.feature#L221)
+- [apiSearch1/search.feature:222](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch1/search.feature#L222)
+- [apiSearch1/search.feature:242](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch1/search.feature#L242)
+- [apiSearch1/search.feature:243](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch1/search.feature#L243)
+- [apiSearch1/search.feature:260](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch1/search.feature#L260)
+- [apiSearch1/search.feature:261](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch1/search.feature#L261)
+- [apiSearch1/search.feature:278](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch1/search.feature#L278)
+- [apiSearch1/search.feature:279](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch1/search.feature#L279)
+- [apiSearch1/search.feature:302](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch1/search.feature#L302)
+- [apiSearch1/search.feature:303](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch1/search.feature#L303)
+- [apiSearch1/search.feature:354](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch1/search.feature#L354)
+- [apiSearch1/search.feature:355](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch1/search.feature#L355)
+- [apiSearch2/tagSearch.feature:34](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch2/tagSearch.feature#L34)
+- [apiSearch2/tagSearch.feature:35](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch2/tagSearch.feature#L35)
+- [apiSearch2/tagSearch.feature:62](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch2/tagSearch.feature#L62)
+- [apiSearch2/tagSearch.feature:63](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch2/tagSearch.feature#L63)
+- [apiSearch2/tagSearch.feature:87](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch2/tagSearch.feature#L87)
+- [apiSearch2/tagSearch.feature:88](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch2/tagSearch.feature#L88)
+- [apiSearch2/tagSearch.feature:110](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch2/tagSearch.feature#L110)
+- [apiSearch2/tagSearch.feature:111](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch2/tagSearch.feature#L111)
+- [apiSearch2/tagSearch.feature:144](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch2/tagSearch.feature#L144)
+- [apiSearch2/tagSearch.feature:145](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch2/tagSearch.feature#L145)
+- [apiSearch2/tagSearch.feature:182](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch2/tagSearch.feature#L182)
+- [apiSearch2/tagSearch.feature:183](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch2/tagSearch.feature#L183)
+- [apiSearch2/tagSearch.feature:222](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch2/tagSearch.feature#L222)
+- [apiSearch2/tagSearch.feature:223](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch2/tagSearch.feature#L223)
+- [apiSearch2/tagSearch.feature:241](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch2/tagSearch.feature#L241)
+- [apiSearch2/tagSearch.feature:242](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch2/tagSearch.feature#L242)
+- [apiSearchContent/contentSearch.feature:25](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearchContent/contentSearch.feature#L25)
+- [apiSearchContent/contentSearch.feature:26](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearchContent/contentSearch.feature#L26)
+- [apiSearchContent/contentSearch.feature:49](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearchContent/contentSearch.feature#L49)
+- [apiSearchContent/contentSearch.feature:50](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearchContent/contentSearch.feature#L50)
+- [apiSearchContent/contentSearch.feature:82](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearchContent/contentSearch.feature#L82)
+- [apiSearchContent/contentSearch.feature:83](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearchContent/contentSearch.feature#L83)
+- [apiSearchContent/contentSearch.feature:110](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearchContent/contentSearch.feature#L110)
+- [apiSearchContent/contentSearch.feature:111](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearchContent/contentSearch.feature#L111)
+- [apiSearchContent/contentSearch.feature:129](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearchContent/contentSearch.feature#L129)
+- [apiSearchContent/contentSearch.feature:130](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearchContent/contentSearch.feature#L130)
+- [apiSearchContent/contentSearch.feature:146](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearchContent/contentSearch.feature#L146)
+- [apiSearchContent/contentSearch.feature:147](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearchContent/contentSearch.feature#L147)
+- [apiSearchContent/contentSearch.feature:162](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearchContent/contentSearch.feature#L162)
+- [apiSearchContent/contentSearch.feature:163](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearchContent/contentSearch.feature#L163)
+- [apiSearchContent/contentSearch.feature:185](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearchContent/contentSearch.feature#L185)
+- [apiSearchContent/contentSearch.feature:186](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearchContent/contentSearch.feature#L186)
+- [apiSearchContent/contentSearch.feature:214](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearchContent/contentSearch.feature#L214)
+- [apiSearchContent/contentSearch.feature:215](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearchContent/contentSearch.feature#L215)
+- [apiSearchContent/contentSearch.feature:266](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearchContent/contentSearch.feature#L266)
+- [apiSearchContent/contentSearch.feature:267](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearchContent/contentSearch.feature#L267)
+
Note: always have an empty line at the end of this file.
The bash script that processes this file requires that the last line has a newline on the end.
diff --git a/tests/acceptance/expected-failures-without-remotephp.md b/tests/acceptance/expected-failures-without-remotephp.md
new file mode 100644
index 0000000000..47a06a9a52
--- /dev/null
+++ b/tests/acceptance/expected-failures-without-remotephp.md
@@ -0,0 +1,381 @@
+## Scenarios that are expected to fail when remote.php is not used
+
+#### [REPORT request without remote.php returns empty result (only with dav/spaces path)](https://github.com/owncloud/ocis/issues/10329)
+
+- [apiContract/sharesReport.feature:126](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiContract/sharesReport.feature#L126)
+- [apiContract/sharesReport.feature:154](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiContract/sharesReport.feature#L154)
+- [apiContract/spacesReport.feature:16](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiContract/spacesReport.feature#L16)
+- [apiContract/spacesReport.feature:34](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiContract/spacesReport.feature#L34)
+- [apiContract/spacesReport.feature:53](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiContract/spacesReport.feature#L53)
+- [apiContract/spacesReport.feature:71](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiContract/spacesReport.feature#L71)
+- [apiSearch1/dateSearch.feature:19](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch1/dateSearch.feature#L19)
+- [apiSearch1/dateSearch.feature:39](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch1/dateSearch.feature#L39)
+- [apiSearch1/dateSearch.feature:40](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch1/dateSearch.feature#L40)
+- [apiSearch1/dateSearch.feature:41](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch1/dateSearch.feature#L41)
+- [apiSearch1/dateSearch.feature:42](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch1/dateSearch.feature#L42)
+- [apiSearch1/dateSearch.feature:43](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch1/dateSearch.feature#L43)
+- [apiSearch1/dateSearch.feature:44](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch1/dateSearch.feature#L44)
+- [apiSearch1/dateSearch.feature:45](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch1/dateSearch.feature#L45)
+- [apiSearch1/dateSearch.feature:46](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch1/dateSearch.feature#L46)
+- [apiSearch1/dateSearch.feature:47](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch1/dateSearch.feature#L47)
+- [apiSearch1/dateSearch.feature:48](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch1/dateSearch.feature#L48)
+- [apiSearch1/dateSearch.feature:50](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch1/dateSearch.feature#L50)
+- [apiSearch1/dateSearch.feature:53](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch1/dateSearch.feature#L53)
+- [apiSearch1/search.feature:43](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch1/search.feature#L43)
+- [apiSearch1/search.feature:71](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch1/search.feature#L71)
+- [apiSearch1/search.feature:113](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch1/search.feature#L113)
+- [apiSearch1/search.feature:176](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch1/search.feature#L176)
+- [apiSearch1/search.feature:199](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch1/search.feature#L199)
+- [apiSearch1/search.feature:223](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch1/search.feature#L223)
+- [apiSearch1/search.feature:244](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch1/search.feature#L244)
+- [apiSearch1/search.feature:262](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch1/search.feature#L262)
+- [apiSearch1/search.feature:280](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch1/search.feature#L280)
+- [apiSearch1/search.feature:304](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch1/search.feature#L304)
+- [apiSearch1/search.feature:317](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch1/search.feature#L317)
+- [apiSearch1/search.feature:318](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch1/search.feature#L318)
+- [apiSearch1/search.feature:319](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch1/search.feature#L319)
+- [apiSearch1/search.feature:320](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch1/search.feature#L320)
+- [apiSearch1/search.feature:321](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch1/search.feature#L321)
+- [apiSearch1/search.feature:324](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch1/search.feature#L324)
+- [apiSearch1/search.feature:356](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch1/search.feature#L356)
+- [apiSearch2/mediaTypeSearch.feature:31](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch2/mediaTypeSearch.feature#L31)
+- [apiSearch2/mediaTypeSearch.feature:32](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch2/mediaTypeSearch.feature#L32)
+- [apiSearch2/mediaTypeSearch.feature:33](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch2/mediaTypeSearch.feature#L33)
+- [apiSearch2/mediaTypeSearch.feature:34](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch2/mediaTypeSearch.feature#L34)
+- [apiSearch2/mediaTypeSearch.feature:35](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch2/mediaTypeSearch.feature#L35)
+- [apiSearch2/mediaTypeSearch.feature:36](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch2/mediaTypeSearch.feature#L36)
+- [apiSearch2/mediaTypeSearch.feature:37](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch2/mediaTypeSearch.feature#L37)
+- [apiSearch2/mediaTypeSearch.feature:38](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch2/mediaTypeSearch.feature#L38)
+- [apiSearch2/mediaTypeSearch.feature:39](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch2/mediaTypeSearch.feature#L39)
+- [apiSearch2/mediaTypeSearch.feature:60](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch2/mediaTypeSearch.feature#L60)
+- [apiSearch2/mediaTypeSearch.feature:61](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch2/mediaTypeSearch.feature#L61)
+- [apiSearch2/mediaTypeSearch.feature:62](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch2/mediaTypeSearch.feature#L62)
+- [apiSearch2/mediaTypeSearch.feature:63](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch2/mediaTypeSearch.feature#L63)
+- [apiSearch2/mediaTypeSearch.feature:64](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch2/mediaTypeSearch.feature#L64)
+- [apiSearch2/mediaTypeSearch.feature:65](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch2/mediaTypeSearch.feature#L65)
+- [apiSearch2/mediaTypeSearch.feature:66](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch2/mediaTypeSearch.feature#L66)
+- [apiSearch2/mediaTypeSearch.feature:67](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch2/mediaTypeSearch.feature#L67)
+- [apiSearch2/mediaTypeSearch.feature:68](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch2/mediaTypeSearch.feature#L68)
+- [apiSearch2/mediaTypeSearch.feature:90](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch2/mediaTypeSearch.feature#L90)
+- [apiSearch2/mediaTypeSearch.feature:91](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch2/mediaTypeSearch.feature#L91)
+- [apiSearch2/mediaTypeSearch.feature:92](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch2/mediaTypeSearch.feature#L92)
+- [apiSearch2/mediaTypeSearch.feature:93](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch2/mediaTypeSearch.feature#L93)
+- [apiSearch2/mediaTypeSearch.feature:94](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch2/mediaTypeSearch.feature#L94)
+- [apiSearch2/mediaTypeSearch.feature:95](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch2/mediaTypeSearch.feature#L95)
+- [apiSearch2/mediaTypeSearch.feature:96](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch2/mediaTypeSearch.feature#L96)
+- [apiSearch2/mediaTypeSearch.feature:97](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch2/mediaTypeSearch.feature#L97)
+- [apiSearch2/mediaTypeSearch.feature:98](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch2/mediaTypeSearch.feature#L98)
+- [apiSearch2/mediaTypeSearch.feature:126](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch2/mediaTypeSearch.feature#L126)
+- [apiSearch2/mediaTypeSearch.feature:127](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch2/mediaTypeSearch.feature#L127)
+- [apiSearch2/mediaTypeSearch.feature:128](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch2/mediaTypeSearch.feature#L128)
+- [apiSearch2/mediaTypeSearch.feature:129](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch2/mediaTypeSearch.feature#L129)
+- [apiSearch2/mediaTypeSearch.feature:130](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch2/mediaTypeSearch.feature#L130)
+- [apiSearch2/mediaTypeSearch.feature:131](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch2/mediaTypeSearch.feature#L131)
+- [apiSearch2/mediaTypeSearch.feature:132](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch2/mediaTypeSearch.feature#L132)
+- [apiSearch2/mediaTypeSearch.feature:133](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch2/mediaTypeSearch.feature#L133)
+- [apiSearch2/mediaTypeSearch.feature:134](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch2/mediaTypeSearch.feature#L134)
+- [apiSearch2/mediaTypeSearch.feature:161](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch2/mediaTypeSearch.feature#L161)
+- [apiSearch2/mediaTypeSearch.feature:162](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch2/mediaTypeSearch.feature#L162)
+- [apiSearch2/mediaTypeSearch.feature:163](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch2/mediaTypeSearch.feature#L163)
+- [apiSearch2/mediaTypeSearch.feature:164](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch2/mediaTypeSearch.feature#L164)
+- [apiSearch2/mediaTypeSearch.feature:165](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch2/mediaTypeSearch.feature#L165)
+- [apiSearch2/mediaTypeSearch.feature:166](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch2/mediaTypeSearch.feature#L166)
+- [apiSearch2/mediaTypeSearch.feature:167](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch2/mediaTypeSearch.feature#L167)
+- [apiSearch2/mediaTypeSearch.feature:168](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch2/mediaTypeSearch.feature#L168)
+- [apiSearch2/mediaTypeSearch.feature:169](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch2/mediaTypeSearch.feature#L169)
+- [apiSearch2/mediaTypeSearch.feature:172](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch2/mediaTypeSearch.feature#L172)
+- [apiSearch2/tagSearch.feature:36](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch2/tagSearch.feature#L36)
+- [apiSearch2/tagSearch.feature:68](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch2/tagSearch.feature#L68)
+- [apiSearch2/tagSearch.feature:89](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch2/tagSearch.feature#L89)
+- [apiSearch2/tagSearch.feature:116](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch2/tagSearch.feature#L116)
+- [apiSearch2/tagSearch.feature:150](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch2/tagSearch.feature#L150)
+- [apiSearch2/tagSearch.feature:188](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch2/tagSearch.feature#L188)
+- [apiSearch2/tagSearch.feature:224](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch2/tagSearch.feature#L224)
+- [apiSearch2/tagSearch.feature:243](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch2/tagSearch.feature#L243)
+- [apiSearch2/tagSearch.feature:271](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch2/tagSearch.feature#L271)
+- [apiSearch2/tagSearch.feature:272](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch2/tagSearch.feature#L272)
+- [apiSearch2/tagSearch.feature:273](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch2/tagSearch.feature#L273)
+- [apiSearch2/tagSearch.feature:274](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch2/tagSearch.feature#L274)
+- [apiSearch2/tagSearch.feature:275](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch2/tagSearch.feature#L275)
+- [apiSearch2/tagSearch.feature:276](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch2/tagSearch.feature#L276)
+- [apiSearch2/tagSearch.feature:277](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch2/tagSearch.feature#L277)
+- [apiSearch2/tagSearch.feature:278](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch2/tagSearch.feature#L278)
+- [apiSearch2/tagSearch.feature:279](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch2/tagSearch.feature#L279)
+- [apiSearch2/tagSearch.feature:280](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch2/tagSearch.feature#L280)
+- [apiSearch2/tagSearch.feature:282](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearch2/tagSearch.feature#L282)
+- [apiSearchContent/contentSearch.feature:27](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearchContent/contentSearch.feature#L27)
+- [apiSearchContent/contentSearch.feature:51](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearchContent/contentSearch.feature#L51)
+- [apiSearchContent/contentSearch.feature:84](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearchContent/contentSearch.feature#L84)
+- [apiSearchContent/contentSearch.feature:112](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearchContent/contentSearch.feature#L112)
+- [apiSearchContent/contentSearch.feature:131](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearchContent/contentSearch.feature#L131)
+- [apiSearchContent/contentSearch.feature:148](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearchContent/contentSearch.feature#L148)
+- [apiSearchContent/contentSearch.feature:164](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearchContent/contentSearch.feature#L164)
+- [apiSearchContent/contentSearch.feature:187](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearchContent/contentSearch.feature#L187)
+- [apiSearchContent/contentSearch.feature:216](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearchContent/contentSearch.feature#L216)
+- [apiSearchContent/contentSearch.feature:234](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearchContent/contentSearch.feature#L234)
+- [apiSearchContent/contentSearch.feature:235](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearchContent/contentSearch.feature#L235)
+- [apiSearchContent/contentSearch.feature:236](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearchContent/contentSearch.feature#L236)
+- [apiSearchContent/contentSearch.feature:237](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearchContent/contentSearch.feature#L237)
+- [apiSearchContent/contentSearch.feature:238](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearchContent/contentSearch.feature#L238)
+- [apiSearchContent/contentSearch.feature:239](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearchContent/contentSearch.feature#L239)
+- [apiSearchContent/contentSearch.feature:268](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSearchContent/contentSearch.feature#L268)
+- [cliCommands/searchReIndex.feature:15](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/cliCommands/searchReIndex.feature#L15)
+- [coreApiWebdavOperations/search.feature:44](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavOperations/search.feature#L44)
+- [coreApiWebdavOperations/search.feature:62](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavOperations/search.feature#L62)
+- [coreApiWebdavOperations/search.feature:81](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavOperations/search.feature#L81)
+- [coreApiWebdavOperations/search.feature:112](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavOperations/search.feature#L112)
+- [coreApiWebdavOperations/search.feature:132](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavOperations/search.feature#L132)
+- [coreApiWebdavOperations/search.feature:153](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavOperations/search.feature#L153)
+- [coreApiWebdavOperations/search.feature:231](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavOperations/search.feature#L231)
+
+#### [Downloading public files without remote.php returns 401 unauthorized error](https://github.com/owncloud/ocis/issues/9724)
+
+- [apiGraph/enforcePasswordPublicLink.feature:79](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiGraph/enforcePasswordPublicLink.feature#L79)
+- [apiGraph/enforcePasswordPublicLink.feature:80](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiGraph/enforcePasswordPublicLink.feature#L80)
+- [apiGraph/enforcePasswordPublicLink.feature:107](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiGraph/enforcePasswordPublicLink.feature#L107)
+- [apiGraph/enforcePasswordPublicLink.feature:108](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiGraph/enforcePasswordPublicLink.feature#L108)
+- [apiGraph/enforcePasswordPublicLink.feature:171](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiGraph/enforcePasswordPublicLink.feature#L171)
+- [apiGraph/enforcePasswordPublicLink.feature:172](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiGraph/enforcePasswordPublicLink.feature#L172)
+- [apiGraph/enforcePasswordPublicLink.feature:229](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiGraph/enforcePasswordPublicLink.feature#L229)
+- [apiGraph/enforcePasswordPublicLink.feature:230](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiGraph/enforcePasswordPublicLink.feature#L230)
+- [apiGraph/enforcePasswordPublicLink.feature:231](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiGraph/enforcePasswordPublicLink.feature#L231)
+- [apiGraph/enforcePasswordPublicLink.feature:232](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiGraph/enforcePasswordPublicLink.feature#L232)
+- [apiGraph/enforcePasswordPublicLink.feature:233](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiGraph/enforcePasswordPublicLink.feature#L233)
+- [apiGraph/enforcePasswordPublicLink.feature:234](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiGraph/enforcePasswordPublicLink.feature#L234)
+- [apiGraph/enforcePasswordPublicLink.feature:235](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiGraph/enforcePasswordPublicLink.feature#L235)
+- [apiGraph/enforcePasswordPublicLink.feature:236](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiGraph/enforcePasswordPublicLink.feature#L236)
+- [apiSpaces/editPublicLinkOfSpace.feature:52](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSpaces/editPublicLinkOfSpace.feature#L52)
+- [apiSpaces/editPublicLinkOfSpace.feature:53](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSpaces/editPublicLinkOfSpace.feature#L53)
+- [apiSpacesShares/publicLinkDownload.feature:16](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSpacesShares/publicLinkDownload.feature#L16)
+- [apiSpacesShares/publicLinkDownload.feature:32](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSpacesShares/publicLinkDownload.feature#L32)
+- [apiSpacesShares/shareSpacesViaLink.feature:45](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSpacesShares/shareSpacesViaLink.feature#L45)
+- [apiSpacesShares/shareSpacesViaLink.feature:46](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSpacesShares/shareSpacesViaLink.feature#L46)
+- [apiSpacesShares/shareSpacesViaLink.feature:47](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSpacesShares/shareSpacesViaLink.feature#L47)
+- [apiSpacesShares/shareSubItemOfSpaceViaPublicLink.feature:149](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSpacesShares/shareSubItemOfSpaceViaPublicLink.feature#L149)
+- [apiSpacesShares/shareSubItemOfSpaceViaPublicLink.feature:150](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSpacesShares/shareSubItemOfSpaceViaPublicLink.feature#L150)
+- [apiSharingNgLinkSharePermission/createLinkShare.feature:478](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSharingNgLinkSharePermission/createLinkShare.feature#L478)
+- [apiSharingNgLinkSharePermission/createLinkShare.feature:1225](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSharingNgLinkSharePermission/createLinkShare.feature#L1225)
+- [apiSharingNgLinkSharePermission/updateLinkShare.feature:209](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSharingNgLinkSharePermission/updateLinkShare.feature#L209)
+- [apiSharingNgLinkSharePermission/updateLinkShare.feature:287](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSharingNgLinkSharePermission/updateLinkShare.feature#L287)
+- [apiSharingNgLinkShareRoot/updateLinkShare.feature:10](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSharingNgLinkShareRoot/updateLinkShare.feature#L10)
+- [apiSharingNgLinkShareRoot/updateLinkShare.feature:42](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSharingNgLinkShareRoot/updateLinkShare.feature#L42)
+- [coreApiSharePublicLink1/changingPublicLinkShare.feature:219](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/changingPublicLinkShare.feature#L219)
+- [coreApiSharePublicLink1/changingPublicLinkShare.feature:220](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/changingPublicLinkShare.feature#L220)
+- [coreApiSharePublicLink1/createPublicLinkShare.feature:59](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/createPublicLinkShare.feature#L59)
+- [coreApiSharePublicLink1/createPublicLinkShare.feature:60](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/createPublicLinkShare.feature#L60)
+- [coreApiSharePublicLink1/createPublicLinkShare.feature:88](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/createPublicLinkShare.feature#L88)
+- [coreApiSharePublicLink1/createPublicLinkShare.feature:89](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/createPublicLinkShare.feature#L89)
+- [coreApiSharePublicLink1/createPublicLinkShare.feature:122](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/createPublicLinkShare.feature#L122)
+- [coreApiSharePublicLink1/createPublicLinkShare.feature:123](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/createPublicLinkShare.feature#L123)
+- [coreApiSharePublicLink1/createPublicLinkShare.feature:209](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/createPublicLinkShare.feature#L209)
+- [coreApiSharePublicLink1/createPublicLinkShare.feature:210](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/createPublicLinkShare.feature#L210)
+- [coreApiSharePublicLink1/createPublicLinkShare.feature:229](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/createPublicLinkShare.feature#L229)
+- [coreApiSharePublicLink1/createPublicLinkShare.feature:230](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/createPublicLinkShare.feature#L230)
+- [coreApiSharePublicLink1/createPublicLinkShare.feature:257](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/createPublicLinkShare.feature#L257)
+- [coreApiSharePublicLink1/createPublicLinkShare.feature:258](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/createPublicLinkShare.feature#L258)
+- [coreApiSharePublicLink1/createPublicLinkShare.feature:273](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/createPublicLinkShare.feature#L273)
+- [coreApiSharePublicLink1/createPublicLinkShare.feature:274](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/createPublicLinkShare.feature#L274)
+- [coreApiSharePublicLink1/createPublicLinkShare.feature:277](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/createPublicLinkShare.feature#L277)
+- [coreApiSharePublicLink1/createPublicLinkShare.feature:291](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/createPublicLinkShare.feature#L291)
+- [coreApiSharePublicLink2/updatePublicLinkShare.feature:111](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink2/updatePublicLinkShare.feature#L111)
+- [coreApiSharePublicLink2/updatePublicLinkShare.feature:112](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink2/updatePublicLinkShare.feature#L112)
+- [coreApiSharePublicLink2/updatePublicLinkShare.feature:249](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink2/updatePublicLinkShare.feature#L249)
+- [coreApiSharePublicLink2/updatePublicLinkShare.feature:250](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink2/updatePublicLinkShare.feature#L250)
+- [coreApiSharePublicLink2/updatePublicLinkShare.feature:276](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink2/updatePublicLinkShare.feature#L276)
+- [coreApiSharePublicLink2/updatePublicLinkShare.feature:277](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink2/updatePublicLinkShare.feature#L277)
+
+#### [Most (if not all) requests to public link share without remote.php returns 401 Unauthorized error](https://github.com/owncloud/ocis/issues/10331)
+
+- [apiSpaces/publicLink.feature:18](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSpaces/publicLink.feature#L18)
+- [apiSpaces/publicLink.feature:23](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSpaces/publicLink.feature#L23)
+- [apiSpaces/publicLink.feature:28](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSpaces/publicLink.feature#L28)
+- [apiSpaces/publicLink.feature:34](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSpaces/publicLink.feature#L34)
+- [apiSpaces/publicLink.feature:40](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSpaces/publicLink.feature#L40)
+- [apiSpacesShares/shareSpacesViaLink.feature:61](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSpacesShares/shareSpacesViaLink.feature#L61)
+- [apiDepthInfinity/propfind.feature:74](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiDepthInfinity/propfind.feature#L74)
+- [apiDepthInfinity/propfind.feature:125](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiDepthInfinity/propfind.feature#L125)
+- [apiLocks/lockFiles.feature:486](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiLocks/lockFiles.feature#L486)
+- [apiLocks/lockFiles.feature:487](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiLocks/lockFiles.feature#L487)
+- [apiLocks/lockFiles.feature:488](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiLocks/lockFiles.feature#L488)
+- [apiLocks/lockFiles.feature:489](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiLocks/lockFiles.feature#L489)
+- [apiLocks/lockFiles.feature:509](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiLocks/lockFiles.feature#L509)
+- [apiLocks/lockFiles.feature:510](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiLocks/lockFiles.feature#L510)
+- [apiLocks/lockFiles.feature:511](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiLocks/lockFiles.feature#L511)
+- [apiLocks/lockFiles.feature:512](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiLocks/lockFiles.feature#L512)
+- [apiLocks/unlockFiles.feature:320](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiLocks/unlockFiles.feature#L320)
+- [apiLocks/unlockFiles.feature:321](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiLocks/unlockFiles.feature#L321)
+- [apiLocks/unlockFiles.feature:322](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiLocks/unlockFiles.feature#L322)
+- [apiLocks/unlockFiles.feature:323](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiLocks/unlockFiles.feature#L323)
+- [apiActivities/shareActivities.feature:1775](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiActivities/shareActivities.feature#L1775)
+- [apiActivities/shareActivities.feature:1914](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiActivities/shareActivities.feature#L1914)
+- [apiAntivirus/antivirus.feature:113](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiAntivirus/antivirus.feature#L113)
+- [apiAntivirus/antivirus.feature:114](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiAntivirus/antivirus.feature#L114)
+- [apiAntivirus/antivirus.feature:115](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiAntivirus/antivirus.feature#L115)
+- [apiAntivirus/antivirus.feature:116](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiAntivirus/antivirus.feature#L116)
+- [apiAntivirus/antivirus.feature:117](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiAntivirus/antivirus.feature#L117)
+- [apiAntivirus/antivirus.feature:118](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiAntivirus/antivirus.feature#L118)
+- [apiAntivirus/antivirus.feature:139](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiAntivirus/antivirus.feature#L139)
+- [apiAntivirus/antivirus.feature:140](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiAntivirus/antivirus.feature#L140)
+- [apiAntivirus/antivirus.feature:141](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiAntivirus/antivirus.feature#L141)
+- [apiAntivirus/antivirus.feature:142](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiAntivirus/antivirus.feature#L142)
+- [apiAntivirus/antivirus.feature:143](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiAntivirus/antivirus.feature#L143)
+- [apiAntivirus/antivirus.feature:144](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiAntivirus/antivirus.feature#L144)
+- [apiAntivirus/antivirus.feature:401](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiAntivirus/antivirus.feature#L401)
+- [apiAntivirus/antivirus.feature:402](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiAntivirus/antivirus.feature#L402)
+- [apiAntivirus/antivirus.feature:403](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiAntivirus/antivirus.feature#L403)
+- [apiCollaboration/wopi.feature:956](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiCollaboration/wopi.feature#L956)
+- [apiCollaboration/wopi.feature:957](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiCollaboration/wopi.feature#L957)
+- [apiCollaboration/wopi.feature:958](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiCollaboration/wopi.feature#L958)
+- [apiCollaboration/wopi.feature:961](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiCollaboration/wopi.feature#L961)
+- [apiCollaboration/wopi.feature:1047](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiCollaboration/wopi.feature#L1047)
+- [apiCollaboration/wopi.feature:1048](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiCollaboration/wopi.feature#L1048)
+- [apiCollaboration/wopi.feature:1049](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiCollaboration/wopi.feature#L1049)
+- [apiCollaboration/wopi.feature:1052](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiCollaboration/wopi.feature#L1052)
+- [coreApiSharePublicLink1/changingPublicLinkShare.feature:27](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/changingPublicLinkShare.feature#L27)
+- [coreApiSharePublicLink1/changingPublicLinkShare.feature:28](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/changingPublicLinkShare.feature#L28)
+- [coreApiSharePublicLink1/changingPublicLinkShare.feature:29](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/changingPublicLinkShare.feature#L29)
+- [coreApiSharePublicLink1/changingPublicLinkShare.feature:30](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/changingPublicLinkShare.feature#L30)
+- [coreApiSharePublicLink1/changingPublicLinkShare.feature:33](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/changingPublicLinkShare.feature#L33)
+- [coreApiSharePublicLink1/changingPublicLinkShare.feature:46](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/changingPublicLinkShare.feature#L46)
+- [coreApiSharePublicLink1/changingPublicLinkShare.feature:70](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/changingPublicLinkShare.feature#L70)
+- [coreApiSharePublicLink1/changingPublicLinkShare.feature:95](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/changingPublicLinkShare.feature#L95)
+- [coreApiSharePublicLink1/changingPublicLinkShare.feature:120](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/changingPublicLinkShare.feature#L120)
+- [coreApiSharePublicLink1/changingPublicLinkShare.feature:132](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/changingPublicLinkShare.feature#L132)
+- [coreApiSharePublicLink1/changingPublicLinkShare.feature:145](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/changingPublicLinkShare.feature#L145)
+- [coreApiSharePublicLink1/createPublicLinkShare.feature:304](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/createPublicLinkShare.feature#L304)
+- [coreApiSharePublicLink1/createPublicLinkShare.feature:328](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/createPublicLinkShare.feature#L328)
+- [coreApiSharePublicLink1/createPublicLinkShare.feature:329](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/createPublicLinkShare.feature#L329)
+- [coreApiSharePublicLink1/createPublicLinkShare.feature:344](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/createPublicLinkShare.feature#L344)
+- [coreApiSharePublicLink1/createPublicLinkShare.feature:345](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/createPublicLinkShare.feature#L345)
+- [coreApiSharePublicLink1/createPublicLinkShare.feature:348](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/createPublicLinkShare.feature#L348)
+- [coreApiSharePublicLink1/createPublicLinkShare.feature:363](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/createPublicLinkShare.feature#L363)
+- [coreApiSharePublicLink1/createPublicLinkShare.feature:377](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/createPublicLinkShare.feature#L377)
+- [coreApiSharePublicLink2/copyFromPublicLink.feature:13](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink2/copyFromPublicLink.feature#L13)
+- [coreApiSharePublicLink2/copyFromPublicLink.feature:28](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink2/copyFromPublicLink.feature#L28)
+- [coreApiSharePublicLink2/copyFromPublicLink.feature:44](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink2/copyFromPublicLink.feature#L44)
+- [coreApiSharePublicLink2/copyFromPublicLink.feature:60](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink2/copyFromPublicLink.feature#L60)
+- [coreApiSharePublicLink2/copyFromPublicLink.feature:75](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink2/copyFromPublicLink.feature#L75)
+- [coreApiSharePublicLink2/copyFromPublicLink.feature:92](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink2/copyFromPublicLink.feature#L92)
+- [coreApiSharePublicLink2/copyFromPublicLink.feature:105](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink2/copyFromPublicLink.feature#L105)
+- [coreApiSharePublicLink2/copyFromPublicLink.feature:137](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink2/copyFromPublicLink.feature#L137)
+- [coreApiSharePublicLink2/copyFromPublicLink.feature:138](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink2/copyFromPublicLink.feature#L138)
+- [coreApiSharePublicLink2/copyFromPublicLink.feature:139](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink2/copyFromPublicLink.feature#L139)
+- [coreApiSharePublicLink2/copyFromPublicLink.feature:140](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink2/copyFromPublicLink.feature#L140)
+- [coreApiSharePublicLink2/copyFromPublicLink.feature:158](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink2/copyFromPublicLink.feature#L158)
+- [coreApiSharePublicLink2/copyFromPublicLink.feature:159](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink2/copyFromPublicLink.feature#L159)
+- [coreApiSharePublicLink2/copyFromPublicLink.feature:160](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink2/copyFromPublicLink.feature#L160)
+- [coreApiSharePublicLink2/copyFromPublicLink.feature:161](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink2/copyFromPublicLink.feature#L161)
+- [coreApiSharePublicLink2/copyFromPublicLink.feature:180](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink2/copyFromPublicLink.feature#L180)
+- [coreApiSharePublicLink2/copyFromPublicLink.feature:181](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink2/copyFromPublicLink.feature#L181)
+- [coreApiSharePublicLink2/copyFromPublicLink.feature:182](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink2/copyFromPublicLink.feature#L182)
+- [coreApiSharePublicLink2/copyFromPublicLink.feature:183](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink2/copyFromPublicLink.feature#L183)
+- [coreApiSharePublicLink2/copyFromPublicLink.feature:186](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink2/copyFromPublicLink.feature#L186)
+- [coreApiSharePublicLink2/copyFromPublicLink.feature:212](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink2/copyFromPublicLink.feature#L212)
+- [coreApiSharePublicLink2/copyFromPublicLink.feature:225](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink2/copyFromPublicLink.feature#L225)
+- [coreApiSharePublicLink2/uploadToPublicLinkShare.feature:28](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink2/uploadToPublicLinkShare.feature#L28)
+- [coreApiSharePublicLink2/uploadToPublicLinkShare.feature:29](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink2/uploadToPublicLinkShare.feature#L29)
+- [coreApiSharePublicLink2/uploadToPublicLinkShare.feature:30](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink2/uploadToPublicLinkShare.feature#L30)
+- [coreApiSharePublicLink2/uploadToPublicLinkShare.feature:33](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink2/uploadToPublicLinkShare.feature#L33)
+- [coreApiSharePublicLink2/uploadToPublicLinkShare.feature:44](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink2/uploadToPublicLinkShare.feature#L44)
+- [coreApiSharePublicLink2/uploadToPublicLinkShare.feature:58](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink2/uploadToPublicLinkShare.feature#L58)
+- [coreApiSharePublicLink2/uploadToPublicLinkShare.feature:70](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink2/uploadToPublicLinkShare.feature#L70)
+- [coreApiSharePublicLink2/uploadToPublicLinkShare.feature:82](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink2/uploadToPublicLinkShare.feature#L82)
+- [coreApiSharePublicLink2/uploadToPublicLinkShare.feature:94](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink2/uploadToPublicLinkShare.feature#L94)
+- [coreApiSharePublicLink2/uploadToPublicLinkShare.feature:106](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink2/uploadToPublicLinkShare.feature#L106)
+- [coreApiSharePublicLink2/uploadToPublicLinkShare.feature:118](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink2/uploadToPublicLinkShare.feature#L118)
+- [coreApiWebdavEtagPropagation1/deleteFileFolder.feature:238](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavEtagPropagation1/deleteFileFolder.feature#L238)
+- [coreApiWebdavEtagPropagation1/deleteFileFolder.feature:239](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavEtagPropagation1/deleteFileFolder.feature#L239)
+- [coreApiWebdavEtagPropagation1/deleteFileFolder.feature:240](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavEtagPropagation1/deleteFileFolder.feature#L240)
+- [coreApiWebdavEtagPropagation1/deleteFileFolder.feature:262](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavEtagPropagation1/deleteFileFolder.feature#L262)
+- [coreApiWebdavEtagPropagation1/deleteFileFolder.feature:263](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavEtagPropagation1/deleteFileFolder.feature#L263)
+- [coreApiWebdavEtagPropagation1/deleteFileFolder.feature:264](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavEtagPropagation1/deleteFileFolder.feature#L264)
+- [coreApiWebdavEtagPropagation1/moveFileFolder.feature:308](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavEtagPropagation1/moveFileFolder.feature#L308)
+- [coreApiWebdavEtagPropagation1/moveFileFolder.feature:309](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavEtagPropagation1/moveFileFolder.feature#L309)
+- [coreApiWebdavEtagPropagation1/moveFileFolder.feature:310](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavEtagPropagation1/moveFileFolder.feature#L310)
+- [coreApiWebdavEtagPropagation1/moveFileFolder.feature:333](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavEtagPropagation1/moveFileFolder.feature#L333)
+- [coreApiWebdavEtagPropagation1/moveFileFolder.feature:334](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavEtagPropagation1/moveFileFolder.feature#L334)
+- [coreApiWebdavEtagPropagation1/moveFileFolder.feature:335](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavEtagPropagation1/moveFileFolder.feature#L335)
+- [coreApiWebdavEtagPropagation2/copyFileFolder.feature:135](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavEtagPropagation2/copyFileFolder.feature#L135)
+- [coreApiWebdavEtagPropagation2/copyFileFolder.feature:136](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavEtagPropagation2/copyFileFolder.feature#L136)
+- [coreApiWebdavEtagPropagation2/copyFileFolder.feature:137](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavEtagPropagation2/copyFileFolder.feature#L137)
+- [coreApiWebdavEtagPropagation2/createFolder.feature:130](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavEtagPropagation2/createFolder.feature#L130)
+- [coreApiWebdavEtagPropagation2/createFolder.feature:131](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavEtagPropagation2/createFolder.feature#L131)
+- [coreApiWebdavEtagPropagation2/upload.feature:188](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavEtagPropagation2/upload.feature#L188)
+- [coreApiWebdavEtagPropagation2/upload.feature:189](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavEtagPropagation2/upload.feature#L189)
+- [coreApiWebdavEtagPropagation2/upload.feature:190](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavEtagPropagation2/upload.feature#L190)
+- [coreApiWebdavOperations/listFiles.feature:112](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavOperations/listFiles.feature#L112)
+- [coreApiWebdavOperations/listFiles.feature:140](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavOperations/listFiles.feature#L140)
+- [coreApiWebdavOperations/propfind.feature:40](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavOperations/propfind.feature#L40)
+- [coreApiWebdavOperations/propfind.feature:55](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavOperations/propfind.feature#L55)
+- [coreApiWebdavOperations/propfind.feature:69](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavOperations/propfind.feature#L69)
+- [coreApiWebdavUpload/uploadFile.feature:376](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUpload/uploadFile.feature#L376)
+
+#### [Cannot create new TUS upload resource using /webdav without remote.php - returns html instead](https://github.com/owncloud/ocis/issues/10346)
+
+- [apiSpaces/tusUpload.feature:60](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSpaces/tusUpload.feature#L60)
+- [apiSpaces/tusUpload.feature:104](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSpaces/tusUpload.feature#L104)
+- [coreApiWebdavUploadTUS/creationWithUploadExtension.feature:38](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/creationWithUploadExtension.feature#L38)
+- [coreApiWebdavUploadTUS/uploadFile.feature:16](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadFile.feature#L16)
+- [coreApiWebdavUploadTUS/uploadFile.feature:17](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadFile.feature#L17)
+- [coreApiWebdavUploadTUS/uploadFile.feature:18](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadFile.feature#L18)
+- [coreApiWebdavUploadTUS/uploadFile.feature:19](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadFile.feature#L19)
+- [coreApiWebdavUploadTUS/uploadFile.feature:20](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadFile.feature#L20)
+- [coreApiWebdavUploadTUS/uploadFile.feature:21](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadFile.feature#L21)
+- [coreApiWebdavUploadTUS/uploadFile.feature:22](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadFile.feature#L22)
+- [coreApiWebdavUploadTUS/uploadFile.feature:46](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadFile.feature#L46)
+- [coreApiWebdavUploadTUS/uploadFile.feature:47](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadFile.feature#L47)
+- [coreApiWebdavUploadTUS/uploadFile.feature:48](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadFile.feature#L48)
+- [coreApiWebdavUploadTUS/uploadFile.feature:49](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadFile.feature#L49)
+- [coreApiWebdavUploadTUS/uploadFile.feature:50](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadFile.feature#L50)
+- [coreApiWebdavUploadTUS/uploadFile.feature:51](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadFile.feature#L51)
+- [coreApiWebdavUploadTUS/uploadFile.feature:52](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadFile.feature#L52)
+- [coreApiWebdavUploadTUS/uploadFile.feature:75](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadFile.feature#L75)
+- [coreApiWebdavUploadTUS/uploadFile.feature:86](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadFile.feature#L86)
+- [coreApiWebdavUploadTUS/uploadFile.feature:98](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadFile.feature#L98)
+- [coreApiWebdavUploadTUS/uploadFile.feature:109](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadFile.feature#L109)
+- [coreApiWebdavUploadTUS/uploadFile.feature:122](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadFile.feature#L122)
+- [coreApiWebdavUploadTUS/uploadFile.feature:133](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadFile.feature#L133)
+- [coreApiWebdavUploadTUS/uploadFile.feature:145](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadFile.feature#L145)
+- [coreApiWebdavUploadTUS/uploadFile.feature:167](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadFile.feature#L167)
+- [coreApiWebdavUploadTUS/uploadFile.feature:186](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadFile.feature#L186)
+- [coreApiWebdavUploadTUS/uploadFile.feature:198](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadFile.feature#L198)
+- [coreApiWebdavUploadTUS/uploadFile.feature:211](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadFile.feature#L211)
+- [coreApiWebdavUploadTUS/uploadFileMtime.feature:16](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadFileMtime.feature#L16)
+- [coreApiWebdavUploadTUS/uploadFileMtime.feature:27](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadFileMtime.feature#L27)
+- [coreApiWebdavUploadTUS/uploadFileMtime.feature:39](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadFileMtime.feature#L39)
+- [coreApiWebdavUploadTUS/uploadFileMtime.feature:51](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadFileMtime.feature#L51)
+- [coreApiWebdavUploadTUS/uploadFileMtimeShares.feature:29](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadFileMtimeShares.feature#L29)
+- [coreApiWebdavUploadTUS/uploadFileMtimeShares.feature:48](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadFileMtimeShares.feature#L48)
+- [coreApiWebdavUploadTUS/uploadFileMtimeShares.feature:68](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadFileMtimeShares.feature#L68)
+- [coreApiWebdavUploadTUS/uploadFileMtimeShares.feature:88](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadFileMtimeShares.feature#L88)
+- [coreApiWebdavUploadTUS/uploadToMoveFolder.feature:20](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadToMoveFolder.feature#L20)
+- [coreApiWebdavUploadTUS/uploadToShare.feature:29](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadToShare.feature#L29)
+- [coreApiWebdavUploadTUS/uploadToShare.feature:48](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadToShare.feature#L48)
+- [coreApiWebdavUploadTUS/uploadToShare.feature:69](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadToShare.feature#L69)
+- [coreApiWebdavUploadTUS/uploadToShare.feature:89](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadToShare.feature#L89)
+
+#### [PROPFIND to /webdav root (old dav path) without remote.php returns html instead of xml](https://github.com/owncloud/ocis/issues/10334)
+
+- [coreApiAuth/webDavAuth.feature:15](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiAuth/webDavAuth.feature#L15)
+- [coreApiAuth/webDavAuth.feature:25](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiAuth/webDavAuth.feature#L25)
+- [coreApiShareManagementToShares/moveReceivedShare.feature:49](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementToShares/moveReceivedShare.feature#L49)
+- [coreApiShareManagementToShares/moveReceivedShare.feature:128](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementToShares/moveReceivedShare.feature#L128)
+- [coreApiShareManagementToShares/moveReceivedShare.feature:129](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementToShares/moveReceivedShare.feature#L129)
+- [coreApiWebdavOperations/propfind.feature:25](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavOperations/propfind.feature#L25)
+- [coreApiWebdavOperations/propfind.feature:26](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavOperations/propfind.feature#L26)
+- [coreApiWebdavOperations/propfind.feature:36](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavOperations/propfind.feature#L36)
+
+#### [Public cannot download file preview of unprotected (without password) link share without remote.php](https://github.com/owncloud/ocis/issues/10341)
+
+- [coreApiSharePublicLink1/accessToPublicLinkShare.feature:25](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/accessToPublicLinkShare.feature#L25)
+- [coreApiSharePublicLink1/accessToPublicLinkShare.feature:54](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/accessToPublicLinkShare.feature#L54)
+
+#### [Trying to create .. resource with /webdav root (old dav path) without remote.php returns html](https://github.com/owncloud/ocis/issues/10339)
+
+- [coreApiWebdavProperties/createFileFolder.feature:176](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties/createFileFolder.feature#L176)
+- [coreApiWebdavProperties/createFileFolder.feature:177](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties/createFileFolder.feature#L177)
+- [coreApiWebdavProperties/createFileFolder.feature:196](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties/createFileFolder.feature#L196)
+- [coreApiWebdavProperties/createFileFolder.feature:197](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties/createFileFolder.feature#L197)
+
+Note: always have an empty line at the end of this file.
+The bash script that processes this file requires that the last line has a newline on the end.
diff --git a/tests/acceptance/features/apiAccountsHashDifficulty/webDavPUTAuthInvalid.feature b/tests/acceptance/features/apiAccountsHashDifficulty/webDavPUTAuthInvalid.feature
index 65a7c2a993..d7c2afe672 100644
--- a/tests/acceptance/features/apiAccountsHashDifficulty/webDavPUTAuthInvalid.feature
+++ b/tests/acceptance/features/apiAccountsHashDifficulty/webDavPUTAuthInvalid.feature
@@ -15,20 +15,20 @@ Feature: attempt to PUT files with invalid password
Scenario: send PUT requests to webDav endpoints as normal user with wrong password
When user "Alice" requests these endpoints with "PUT" including body "doesnotmatter" using password "invalid" about user "Alice"
| endpoint |
- | /remote.php/webdav/textfile0.txt |
- | /remote.php/dav/files/%username%/textfile0.txt |
- | /remote.php/webdav/PARENT |
- | /remote.php/dav/files/%username%/PARENT |
- | /remote.php/dav/files/%username%/PARENT/parent.txt |
+ | /webdav/textfile0.txt |
+ | /dav/files/%username%/textfile0.txt |
+ | /webdav/PARENT |
+ | /dav/files/%username%/PARENT |
+ | /dav/files/%username%/PARENT/parent.txt |
Then the HTTP status code of responses on all endpoints should be "401"
Scenario: send PUT requests to webDav endpoints as normal user with no password
When user "Alice" requests these endpoints with "PUT" including body "doesnotmatter" using password "" about user "Alice"
| endpoint |
- | /remote.php/webdav/textfile0.txt |
- | /remote.php/dav/files/%username%/textfile0.txt |
- | /remote.php/webdav/PARENT |
- | /remote.php/dav/files/%username%/PARENT |
- | /remote.php/dav/files/%username%/PARENT/parent.txt |
+ | /webdav/textfile0.txt |
+ | /dav/files/%username%/textfile0.txt |
+ | /webdav/PARENT |
+ | /dav/files/%username%/PARENT |
+ | /dav/files/%username%/PARENT/parent.txt |
Then the HTTP status code of responses on all endpoints should be "401"
diff --git a/tests/acceptance/features/apiActivities/shareActivities.feature b/tests/acceptance/features/apiActivities/shareActivities.feature
index e89a345d27..c3be57082e 100644
--- a/tests/acceptance/features/apiActivities/shareActivities.feature
+++ b/tests/acceptance/features/apiActivities/shareActivities.feature
@@ -1771,7 +1771,7 @@ Feature: check share activity
When user "Brian" tries to list the activities of file "anotherTextfile.txt" from space "Personal" owned by user "Alice" using the Graph API
Then the HTTP status code should be "403"
- @issue-9676
+ @issue-9676 @issue-10331
Scenario: user checks public activities of a link shared file
Given using SharingNG
And user "Alice" has created the following resource link share:
@@ -1910,7 +1910,7 @@ Feature: check share activity
}
"""
- @issue-9676
+ @issue-9676 @issue-10331
Scenario: user checks public activities of a link shared folder
Given using SharingNG
And user "Alice" has created folder "/FOLDER"
diff --git a/tests/acceptance/features/apiAntivirus/antivirus.feature b/tests/acceptance/features/apiAntivirus/antivirus.feature
index 9801b6ff2a..0080827abe 100644
--- a/tests/acceptance/features/apiAntivirus/antivirus.feature
+++ b/tests/acceptance/features/apiAntivirus/antivirus.feature
@@ -91,7 +91,7 @@ Feature: antivirus
| old |
| spaces |
-
+ @issue-10331
Scenario Outline: public uploads a file with the virus to a public share
Given using DAV path
And the config "OCIS_SHARING_PUBLIC_SHARE_MUST_HAVE_PASSWORD" has been set to "false"
@@ -117,7 +117,7 @@ Feature: antivirus
| spaces | eicar.com | virusFile1.txt |
| spaces | eicar_com.zip | virusFile2.zip |
-
+ @issue-10331
Scenario Outline: public uploads a file with the virus to a password-protected public share
Given using DAV path
And using SharingNG
@@ -380,7 +380,7 @@ Feature: antivirus
| new |
| spaces |
- @env-config
+ @env-config @issue-10331
Scenario Outline: try to overwrite a file with the virus content in a public link share
Given the config "OCIS_SHARING_PUBLIC_SHARE_MUST_HAVE_PASSWORD" has been set to "false"
And using DAV path
diff --git a/tests/acceptance/features/apiAsyncUpload/delayPostprocessing.feature b/tests/acceptance/features/apiAsyncUpload/delayPostprocessing.feature
index 537a347002..f99413ff3b 100644
--- a/tests/acceptance/features/apiAsyncUpload/delayPostprocessing.feature
+++ b/tests/acceptance/features/apiAsyncUpload/delayPostprocessing.feature
@@ -14,10 +14,10 @@ Feature: delay post-processing of uploaded files
When user "Alice" requests "" with "GET" without retrying
Then the HTTP status code should be "425"
Examples:
- | dav-path |
- | /remote.php/webdav/file.txt |
- | /remote.php/dav/files/%username%/file.txt |
- | /dav/spaces/%spaceid%/file.txt |
+ | dav-path |
+ | /webdav/file.txt |
+ | /dav/files/%username%/file.txt |
+ | /dav/spaces/%spaceid%/file.txt |
Scenario Outline: user sends PROPFIND request to the file while it's still being processed
@@ -26,10 +26,10 @@ Feature: delay post-processing of uploaded files
Then the HTTP status code should be "207"
And the value of the item "//d:response/d:propstat/d:status" in the response should be "HTTP/1.1 425 TOO EARLY"
Examples:
- | dav-path |
- | /remote.php/webdav/file.txt |
- | /remote.php/dav/files/%username%/file.txt |
- | /dav/spaces/%spaceid%/file.txt |
+ | dav-path |
+ | /webdav/file.txt |
+ | /dav/files/%username%/file.txt |
+ | /dav/spaces/%spaceid%/file.txt |
Scenario Outline: user sends PROPFIND request to the folder while files in the folder are still being processed
@@ -40,7 +40,7 @@ Feature: delay post-processing of uploaded files
And as user "Alice" the value of the item "//d:status" of path "/" in the response should be "HTTP/1.1 200 OK"
And as user "Alice" the value of the item "//d:status" of path "/file.txt" in the response should be "HTTP/1.1 425 TOO EARLY"
Examples:
- | dav-path |
- | /remote.php/webdav/my_data |
- | /remote.php/dav/files/%username%/my_data |
- | /dav/spaces/%spaceid%/my_data |
+ | dav-path |
+ | /webdav/my_data |
+ | /dav/files/%username%/my_data |
+ | /dav/spaces/%spaceid%/my_data |
diff --git a/tests/acceptance/features/apiCollaboration/wopi.feature b/tests/acceptance/features/apiCollaboration/wopi.feature
index 60b285dfc3..741e003a5a 100644
--- a/tests/acceptance/features/apiCollaboration/wopi.feature
+++ b/tests/acceptance/features/apiCollaboration/wopi.feature
@@ -925,7 +925,7 @@ Feature: collaboration (wopi)
And as "Alice" file "testFolder/simple.odt" should not exist
And as "Brian" file "Shares/testFolder/simple.odt" should not exist
-
+ @issue-10331
Scenario Outline: public user with permission edit/upload/createOnly creates odt file inside public folder using wopi endpoint
Given user "Alice" has created folder "publicFolder"
And user "Alice" has created the following resource link share:
@@ -957,7 +957,7 @@ Feature: collaboration (wopi)
| upload |
| createOnly |
- @issue-10126
+ @issue-10126 @issue-10331
Scenario: public user with permission view tries to creates odt file inside public folder using wopi endpoint
Given user "Alice" has created folder "publicFolder"
And user "Alice" has created the following resource link share:
@@ -1013,7 +1013,7 @@ Feature: collaboration (wopi)
}
"""
- @issue-8691
+ @issue-8691 @issue-10331
Scenario Outline: public user with permission edit/upload/createOnly creates odt file inside folder of public space using wopi endpoint
Given using spaces DAV path
And the administrator has assigned the role "Space Admin" to user "Alice" using the Graph API
@@ -1048,7 +1048,7 @@ Feature: collaboration (wopi)
| upload |
| createOnly |
- @issue-8691 @issue-10126
+ @issue-8691 @issue-10126 @issue-10331
Scenario: public user with permission view tries to create odt file inside folder of public space using wopi endpoint
Given using spaces DAV path
And the administrator has assigned the role "Space Admin" to user "Alice" using the Graph API
diff --git a/tests/acceptance/features/apiContract/sharesReport.feature b/tests/acceptance/features/apiContract/sharesReport.feature
index a1d85d84e0..db3940dd3a 100644
--- a/tests/acceptance/features/apiContract/sharesReport.feature
+++ b/tests/acceptance/features/apiContract/sharesReport.feature
@@ -84,7 +84,7 @@ Feature: REPORT request to Shares space
| old |
| new |
- @issue-9607
+ @issue-9607 @issue-10329
Scenario Outline: check the REPORT response of a folder shared with secure viewer role
Given using DAV path
And user "Alice" has created folder "/secureFolder"
@@ -125,7 +125,7 @@ Feature: REPORT request to Shares space
| new |
| spaces |
- @issue-9607
+ @issue-9607 @issue-10329
Scenario Outline: check the REPORT response of a file shared with secure viewer role
Given using DAV path
And user "Alice" has uploaded file with content "secure content" to "/secure.txt"
diff --git a/tests/acceptance/features/apiContract/spacesReport.feature b/tests/acceptance/features/apiContract/spacesReport.feature
index dce427d705..fc377ba8d9 100644
--- a/tests/acceptance/features/apiContract/spacesReport.feature
+++ b/tests/acceptance/features/apiContract/spacesReport.feature
@@ -12,10 +12,9 @@ Feature: REPORT request to project space
And the administrator has assigned the role "Space Admin" to user "Alice" using the Graph API
And user "Alice" has created a space "findData" with the default quota using the Graph API
-
+ @issue-10329
Scenario: check the response of the searched file
Given user "Alice" has uploaded a file inside space "findData" with content "some content" to "testFile.txt"
- And using new DAV path
When user "Alice" searches for "testFile.txt" using the WebDAV API
Then the HTTP status code should be "207"
And the search result of user "Alice" should contain only these entries:
@@ -31,11 +30,10 @@ Feature: REPORT request to project space
| oc:permissions | RDNVW |
| d:getcontentlength | 12 |
-
+ @issue-10329
Scenario: check the response of the searched sub-file
Given user "Alice" has created a folder "folderMain/SubFolder1/subFOLDER2" in space "findData"
And user "Alice" has uploaded a file inside space "findData" with content "some content" to "folderMain/SubFolder1/subFOLDER2/insideTheFolder.txt"
- And using new DAV path
When user "Alice" searches for "insideTheFolder.txt" using the WebDAV API
Then the HTTP status code should be "207"
And the search result of user "Alice" should contain only these entries:
@@ -51,10 +49,9 @@ Feature: REPORT request to project space
| oc:permissions | RDNVW |
| d:getcontentlength | 12 |
-
+ @issue-10329
Scenario: check the response of the searched folder
Given user "Alice" has created a folder "folderMain" in space "findData"
- And using new DAV path
When user "Alice" searches for "folderMain" using the WebDAV API
Then the HTTP status code should be "207"
And the search result of user "Alice" should contain only these entries:
@@ -70,10 +67,9 @@ Feature: REPORT request to project space
| oc:permissions | RDNVCK |
| oc:size | 0 |
-
+ @issue-10329
Scenario: check the response of the searched sub-folder
Given user "Alice" has created a folder "folderMain/sub-folder" in space "findData"
- And using new DAV path
When user "Alice" searches for "*sub*" using the WebDAV API
Then the HTTP status code should be "207"
And the search result of user "Alice" should contain only these entries:
diff --git a/tests/acceptance/features/apiDepthInfinity/propfind.feature b/tests/acceptance/features/apiDepthInfinity/propfind.feature
index 6509ae3336..5d4901a25a 100644
--- a/tests/acceptance/features/apiDepthInfinity/propfind.feature
+++ b/tests/acceptance/features/apiDepthInfinity/propfind.feature
@@ -70,7 +70,7 @@ Feature: PROPFIND with depth:infinity
| new |
| spaces |
-
+ @issue-10331
Scenario: get the list of resources in a folder shared through public link with depth infinity
Given using new DAV path
And using SharingNG
@@ -121,7 +121,7 @@ Feature: PROPFIND with depth:infinity
| new |
| spaces |
-
+ @issue-10331
Scenario: get the list of resources in a folder shared through public link with depth infinity when depth infinity is not allowed
Given the following configs have been set:
| config | value |
diff --git a/tests/acceptance/features/apiGraph/enforcePasswordPublicLink.feature b/tests/acceptance/features/apiGraph/enforcePasswordPublicLink.feature
index 49d26aea51..c26841fbfb 100644
--- a/tests/acceptance/features/apiGraph/enforcePasswordPublicLink.feature
+++ b/tests/acceptance/features/apiGraph/enforcePasswordPublicLink.feature
@@ -51,7 +51,7 @@ Feature: enforce password on public link
| 1 | 100 |
| 2 | 200 |
-
+ @issue-9724 @issue-10331
Scenario Outline: updates a public link to edit permission with a password
Given the following configs have been set:
| config | value |
@@ -71,15 +71,15 @@ Feature: enforce password on public link
Then the HTTP status code should be "200"
And the OCS status code should be ""
And the OCS status message should be "OK"
- And the public should not be able to download file "/textfile.txt" from inside the last public link shared folder using the new public WebDAV API without a password
- And the public should not be able to download file "/textfile.txt" from inside the last public link shared folder using the new public WebDAV API with password "wrong pass"
- But the public should be able to download file "/textfile.txt" from inside the last public link shared folder using the new public WebDAV API with password "%public%"
+ And the public should not be able to download file "/testfile.txt" from inside the last public link shared folder using the new public WebDAV API without a password
+ And the public should not be able to download file "/testfile.txt" from inside the last public link shared folder using the new public WebDAV API with password "wrong pass"
+ But the public should be able to download file "/testfile.txt" from inside the last public link shared folder using the new public WebDAV API with password "%public%"
Examples:
| ocs-api-version | ocs-status-code |
| 1 | 100 |
| 2 | 200 |
-
+ @issue-9724 @issue-10331
Scenario Outline: create a public link with a password in accordance with the password policy
Given the following configs have been set:
| config | value |
@@ -99,9 +99,9 @@ Feature: enforce password on public link
Then the HTTP status code should be "200"
And the OCS status code should be ""
And the OCS status message should be "OK"
- And the public should not be able to download file "/textfile.txt" from inside the last public link shared folder using the new public WebDAV API without a password
- And the public should not be able to download file "/textfile.txt" from inside the last public link shared folder using the new public WebDAV API with password "wrong pass"
- But the public should be able to download file "/textfile.txt" from inside the last public link shared folder using the new public WebDAV API with password "3s:5WW9uE5h=A"
+ And the public should not be able to download file "/testfile.txt" from inside the last public link shared folder using the new public WebDAV API without a password
+ And the public should not be able to download file "/testfile.txt" from inside the last public link shared folder using the new public WebDAV API with password "wrong pass"
+ But the public should be able to download file "/testfile.txt" from inside the last public link shared folder using the new public WebDAV API with password "3s:5WW9uE5h=A"
Examples:
| ocs-api-version | ocs-status-code |
| 1 | 100 |
@@ -138,7 +138,7 @@ Feature: enforce password on public link
| 1 | 200 |
| 2 | 400 |
-
+ @issue-9724 @issue-10331
Scenario Outline: update a public link with a password in accordance with the password policy
Given the following configs have been set:
| config | value |
@@ -163,9 +163,9 @@ Feature: enforce password on public link
Then the HTTP status code should be "200"
And the OCS status code should be ""
And the OCS status message should be "OK"
- And the public should not be able to download file "/textfile.txt" from inside the last public link shared folder using the new public WebDAV API without a password
- And the public should not be able to download file "/textfile.txt" from inside the last public link shared folder using the new public WebDAV API with password "wrong pass"
- But the public should be able to download file "/textfile.txt" from inside the last public link shared folder using the new public WebDAV API with password "6a0Q;A3 +i^m["
+ And the public should not be able to download file "/testfile.txt" from inside the last public link shared folder using the new public WebDAV API without a password
+ And the public should not be able to download file "/testfile.txt" from inside the last public link shared folder using the new public WebDAV API with password "wrong pass"
+ But the public should be able to download file "/testfile.txt" from inside the last public link shared folder using the new public WebDAV API with password "6a0Q;A3 +i^m["
Examples:
| ocs-api-version | ocs-status-code |
| 1 | 100 |
@@ -208,7 +208,7 @@ Feature: enforce password on public link
| 1 | 200 |
| 2 | 400 |
-
+ @issue-9724 @issue-10331
Scenario Outline: create a public link with a password in accordance with the password policy (valid cases)
Given the config "" has been set to ""
And using OCS API version "2"
@@ -221,9 +221,9 @@ Feature: enforce password on public link
Then the HTTP status code should be "200"
And the OCS status code should be "200"
And the OCS status message should be "OK"
- And the public should not be able to download file "/textfile.txt" from inside the last public link shared folder using the new public WebDAV API without a password
- And the public should not be able to download file "/textfile.txt" from inside the last public link shared folder using the new public WebDAV API with password "wrong pass"
- But the public should be able to download file "/textfile.txt" from inside the last public link shared folder using the new public WebDAV API with password ""
+ And the public should not be able to download file "/testfile.txt" from inside the last public link shared folder using the new public WebDAV API without a password
+ And the public should not be able to download file "/testfile.txt" from inside the last public link shared folder using the new public WebDAV API with password "wrong pass"
+ But the public should be able to download file "/testfile.txt" from inside the last public link shared folder using the new public WebDAV API with password ""
Examples:
| config | config-value | password |
| OCIS_PASSWORD_POLICY_MIN_CHARACTERS | 4 | Ps-1 |
diff --git a/tests/acceptance/features/apiLocks/lockFiles.feature b/tests/acceptance/features/apiLocks/lockFiles.feature
index 3f4b4c8783..c9d790fa34 100644
--- a/tests/acceptance/features/apiLocks/lockFiles.feature
+++ b/tests/acceptance/features/apiLocks/lockFiles.feature
@@ -52,10 +52,11 @@ Feature: lock files
| spaces |
- Scenario Outline: lock a file using file-id
- Given user "Alice" has uploaded a file inside space "Alice Hansen" with content "some content" to "textfile.txt"
+ Scenario: lock a file using file-id
+ Given using spaces DAV path
+ And user "Alice" has uploaded a file inside space "Alice Hansen" with content "some content" to "textfile.txt"
And we save it into "FILEID"
- When user "Alice" locks file "textfile.txt" using file-id path "" using the WebDAV API setting the following properties
+ When user "Alice" locks file "textfile.txt" using file-id "<>" using the WebDAV API setting the following properties
| lockscope | exclusive |
| timeout | Second-3600 |
Then the HTTP status code should be "200"
@@ -67,10 +68,6 @@ Feature: lock files
| d:lockdiscovery/d:activelock/d:depth | Infinity |
| d:lockdiscovery/d:activelock/d:timeout | Second-3600 |
| d:lockdiscovery/d:activelock/oc:ownername | Alice Hansen |
- Examples:
- | dav-path |
- | /remote.php/dav/spaces/<> |
- | /dav/spaces/<> |
Scenario Outline: user cannot lock file twice
@@ -127,7 +124,7 @@ Feature: lock files
| sharee | Brian |
| shareType | user |
| permissionsRole | |
- When user "Brian" locks file "textfile.txt" using file-id path "" using the WebDAV API setting the following properties
+ When user "Brian" locks file "textfile.txt" using file-id "<>" using the WebDAV API setting the following properties
| lockscope | exclusive |
| timeout | Second-3600 |
Then the HTTP status code should be "200"
@@ -140,9 +137,9 @@ Feature: lock files
| d:lockdiscovery/d:activelock/d:timeout | Second-3600 |
| d:lockdiscovery/d:activelock/oc:ownername | Brian Murphy |
Examples:
- | space-role | dav-path |
- | Manager | /remote.php/dav/spaces/<> |
- | Space Editor | /dav/spaces/<> |
+ | space-role |
+ | Manager |
+ | Space Editor |
Scenario: viewer cannot lock a file in the project space
@@ -156,7 +153,7 @@ Feature: lock files
| sharee | Brian |
| shareType | user |
| permissionsRole | Space Viewer |
- When user "Brian" tries to lock file "textfile.txt" using file-id path "/dav/spaces/<>" using the WebDAV API setting the following properties
+ When user "Brian" tries to lock file "textfile.txt" using file-id "<>" using the WebDAV API setting the following properties
| lockscope | exclusive |
Then the HTTP status code should be "403"
When user "Brian" tries to lock file "textfile.txt" inside the space "Project" using the WebDAV API setting the following properties
@@ -190,8 +187,9 @@ Feature: lock files
| spaces |
- Scenario Outline: lock a file in the shares using file-id
- Given user "Alice" has uploaded a file inside space "Alice Hansen" with content "some content" to "textfile.txt"
+ Scenario: lock a file in the shares using file-id
+ Given using spaces DAV path
+ And user "Alice" has uploaded a file inside space "Alice Hansen" with content "some content" to "textfile.txt"
And we save it into "FILEID"
And user "Alice" has sent the following resource share invitation:
| resource | textfile.txt |
@@ -200,7 +198,7 @@ Feature: lock files
| shareType | user |
| permissionsRole | File Editor |
And user "Brian" has a share "textfile.txt" synced
- When user "Brian" locks file "textfile.txt" using file-id path "" using the WebDAV API setting the following properties
+ When user "Brian" locks file "textfile.txt" using file-id "<>" using the WebDAV API setting the following properties
| lockscope | exclusive |
| timeout | Second-3600 |
Then the HTTP status code should be "200"
@@ -210,14 +208,11 @@ Feature: lock files
| key | value |
| d:lockdiscovery/d:activelock/d:lockscope/d:exclusive | |
| d:lockdiscovery/d:activelock/oc:ownername | Brian Murphy |
- Examples:
- | dav-path |
- | /remote.php/dav/spaces/<> |
- | /dav/spaces/<> |
Scenario Outline: viewer cannot lock a file in the shares using file-id
- Given user "Alice" has uploaded a file inside space "Alice Hansen" with content "some content" to "textfile.txt"
+ Given using spaces DAV path
+ And user "Alice" has uploaded a file inside space "Alice Hansen" with content "some content" to "textfile.txt"
And we save it into "FILEID"
And user "Alice" has sent the following resource share invitation:
| resource | textfile.txt |
@@ -226,7 +221,7 @@ Feature: lock files
| shareType | user |
| permissionsRole | |
And user "Brian" has a share "textfile.txt" synced
- When user "Brian" tries to lock file "textfile.txt" using file-id path "/dav/spaces/<>" using the WebDAV API setting the following properties
+ When user "Brian" tries to lock file "textfile.txt" using file-id "<>" using the WebDAV API setting the following properties
| lockscope | exclusive |
Then the HTTP status code should be "403"
Examples:
@@ -236,7 +231,8 @@ Feature: lock files
Scenario: sharee cannot lock a resource exclusively locked by a sharer
- Given user "Alice" has uploaded a file inside space "Alice Hansen" with content "some content" to "textfile.txt"
+ Given using spaces DAV path
+ And user "Alice" has uploaded a file inside space "Alice Hansen" with content "some content" to "textfile.txt"
And we save it into "FILEID"
And user "Alice" has sent the following resource share invitation:
| resource | textfile.txt |
@@ -247,7 +243,7 @@ Feature: lock files
And user "Brian" has a share "textfile.txt" synced
And user "Alice" has locked file "textfile.txt" setting the following properties
| lockscope | exclusive |
- When user "Brian" tries to lock file "textfile.txt" using file-id path "/dav/spaces/<>" using the WebDAV API setting the following properties
+ When user "Brian" tries to lock file "textfile.txt" using file-id "<>" using the WebDAV API setting the following properties
| lockscope | exclusive |
| timeout | Second-3600 |
Then the HTTP status code should be "423"
@@ -260,7 +256,8 @@ Feature: lock files
Scenario: sharer cannot lock a resource exclusively locked by a sharee
- Given user "Alice" has uploaded a file inside space "Alice Hansen" with content "some content" to "textfile.txt"
+ Given using spaces DAV path
+ And user "Alice" has uploaded a file inside space "Alice Hansen" with content "some content" to "textfile.txt"
And we save it into "FILEID"
And user "Alice" has sent the following resource share invitation:
| resource | textfile.txt |
@@ -269,9 +266,9 @@ Feature: lock files
| shareType | user |
| permissionsRole | File Editor |
And user "Brian" has a share "textfile.txt" synced
- And user "Brian" has locked file "textfile.txt" using file-id path "/dav/spaces/<>" setting the following properties
+ And user "Brian" has locked file "textfile.txt" using file-id "<>" setting the following properties
| lockscope | exclusive |
- When user "Alice" tries to lock file "textfile.txt" using file-id path "/dav/spaces/<>" using the WebDAV API setting the following properties
+ When user "Alice" tries to lock file "textfile.txt" using file-id "<>" using the WebDAV API setting the following properties
| lockscope | exclusive |
| timeout | Second-3600 |
Then the HTTP status code should be "423"
@@ -293,7 +290,7 @@ Feature: lock files
| sharee | Brian |
| shareType | user |
| permissionsRole | File Editor |
- And user "Brian" has a share "textfile.txt" synced
+ And user "Brian" has a share "textfile0.txt" synced
And user "Alice" has locked file "textfile0.txt" setting the following properties
| lockscope | shared |
And user "Brian" has locked file "Shares/textfile0.txt" setting the following properties
@@ -423,7 +420,7 @@ Feature: lock files
| spaces | shared |
| spaces | exclusive |
- @issue-7641
+ @issue-7641 @issue-10331
Scenario Outline: try to lock a folder as anonymous user
Given using DAV path
And using SharingNG
@@ -468,7 +465,7 @@ Feature: lock files
| spaces | shared |
| spaces | exclusive |
-
+ @issue-10331
Scenario Outline: lock a file inside a folder shared by a link as anonymous user with edit permission
Given using DAV path
And using SharingNG
@@ -486,14 +483,12 @@ Feature: lock files
And user "Alice" should not be able to upload file "filesForUpload/lorem.txt" to "PARENT/textfile0.txt"
Examples:
| dav-path-version | lock-scope |
- | old | shared |
- | old | exclusive |
| new | shared |
| new | exclusive |
| spaces | shared |
| spaces | exclusive |
-
+ @issue-10331
Scenario Outline: try to lock a file inside a folder shared by a link as anonymous user with read permission
Given using DAV path
And using SharingNG
@@ -511,14 +506,12 @@ Feature: lock files
And user "Alice" should be able to upload file "filesForUpload/lorem.txt" to "PARENT/textfile0.txt"
Examples:
| dav-path-version | lock-scope |
- | old | shared |
- | old | exclusive |
| new | shared |
| new | exclusive |
| spaces | shared |
| spaces | exclusive |
- @issue-7790
+ @issue-7790 @issue-10331
Scenario Outline: lock a file shared by a link as anonymous user with edit permission
Given using DAV path
And using SharingNG
@@ -535,14 +528,12 @@ Feature: lock files
And user "Alice" should not be able to upload file "filesForUpload/lorem.txt" to "textfile0.txt"
Examples:
| dav-path-version | lock-scope |
- | old | shared |
- | old | exclusive |
| new | shared |
| new | exclusive |
| spaces | shared |
| spaces | exclusive |
- @issue-7790
+ @issue-7790 @issue-10331
Scenario Outline: try to lock a file shared by a link as anonymous user with read permission
Given using DAV path
And using SharingNG
@@ -559,8 +550,6 @@ Feature: lock files
And user "Alice" should be able to upload file "filesForUpload/lorem.txt" to "textfile0.txt"
Examples:
| dav-path-version | lock-scope |
- | old | shared |
- | old | exclusive |
| new | shared |
| new | exclusive |
| spaces | shared |
diff --git a/tests/acceptance/features/apiLocks/unlockFiles.feature b/tests/acceptance/features/apiLocks/unlockFiles.feature
index df4c9df624..bbcff8fbc7 100644
--- a/tests/acceptance/features/apiLocks/unlockFiles.feature
+++ b/tests/acceptance/features/apiLocks/unlockFiles.feature
@@ -21,7 +21,7 @@ Feature: unlock locked items
| new |
| spaces |
- @issue-7761
+ @issue-7761 @issue-10331
Scenario Outline: public tries to unlock a file in a share that was locked by the file owner
Given using DAV path
And using SharingNG
@@ -247,24 +247,20 @@ Feature: unlock locked items
| exclusive |
- Scenario Outline: unlock a file using file-id
+ Scenario: unlock a file using file-id
Given using spaces DAV path
And user "Alice" has uploaded a file inside space "Alice Hansen" with content "some content" to "textfile.txt"
And we save it into "FILEID"
- And user "Alice" has locked file "textfile.txt" using file-id path "" setting the following properties
+ And user "Alice" has locked file "textfile.txt" using file-id "<>" setting the following properties
| lockscope | exclusive |
| timeout | Second-3600 |
- When user "Alice" unlocks the last created lock of file "textfile.txt" using file-id path "" using the WebDAV API
+ When user "Alice" unlocks the last created lock of file "textfile.txt" using file-id "<>" using the WebDAV API
Then the HTTP status code should be "204"
And 0 locks should be reported for file "textfile.txt" of user "Alice" by the WebDAV API
And user "Alice" should be able to upload file "filesForUpload/lorem.txt" to "textfile.txt"
- Examples:
- | dav-path |
- | /remote.php/dav/spaces/<> |
- | /dav/spaces/<> |
- Scenario Outline: unlock a file in project space using file-id
+ Scenario: unlock a file in project space using file-id
Given using spaces DAV path
And the administrator has assigned the role "Space Admin" to user "Alice" using the Graph API
And user "Alice" has created a space "Project" with the default quota using the Graph API
@@ -273,17 +269,13 @@ Feature: unlock locked items
And user "Alice" has locked file "textfile.txt" inside the space "Project" setting the following properties
| lockscope | exclusive |
| timeout | Second-3600 |
- When user "Alice" unlocks the last created lock of file "textfile.txt" using file-id path "" using the WebDAV API
+ When user "Alice" unlocks the last created lock of file "textfile.txt" using file-id "<>" using the WebDAV API
Then the HTTP status code should be "204"
And 0 locks should be reported for file "textfile.txt" inside the space "Project" of user "Alice"
And user "Alice" should be able to upload file "filesForUpload/lorem.txt" to "textfile.txt"
- Examples:
- | dav-path |
- | /remote.php/dav/spaces/<> |
- | /dav/spaces/<> |
- Scenario Outline: unlock a file in the shares using file-id
+ Scenario: unlock a file in the shares using file-id
Given user "Brian" has been created with default attributes and without skeleton files
And using spaces DAV path
And user "Alice" has uploaded a file inside space "Alice Hansen" with content "some content" to "textfile.txt"
@@ -295,22 +287,18 @@ Feature: unlock locked items
| shareType | user |
| permissionsRole | File Editor |
And user "Brian" has a share "textfile.txt" synced
- And user "Brian" has locked file "textfile.txt" using file-id path "" setting the following properties
+ And user "Brian" has locked file "textfile.txt" using file-id "<>" setting the following properties
| lockscope | exclusive |
| timeout | Second-3600 |
- When user "Brian" unlocks the last created lock of file "textfile.txt" using file-id path "" using the WebDAV API
+ When user "Brian" unlocks the last created lock of file "textfile.txt" using file-id "<>" using the WebDAV API
Then the HTTP status code should be "204"
And 0 locks should be reported for file "textfile.txt" inside the space "Personal" of user "Alice"
And 0 locks should be reported for file "textfile.txt" inside the space "Shares" of user "Brian"
And user "Alice" should be able to upload file "filesForUpload/lorem.txt" to "textfile.txt"
And using new DAV path
And user "Brian" should be able to upload file "filesForUpload/lorem.txt" to "Shares/textfile.txt"
- Examples:
- | dav-path |
- | /remote.php/dav/spaces/<> |
- | /dav/spaces/<> |
-
+ @issue-10331
Scenario Outline: unlock a file as an anonymous user
Given using DAV path
And using SharingNG
@@ -329,8 +317,6 @@ Feature: unlock locked items
And user "Alice" should be able to upload file "filesForUpload/lorem.txt" to "PARENT/textfile0.txt"
Examples:
| dav-path-version | lock-scope |
- | old | shared |
- | old | exclusive |
| new | shared |
| new | exclusive |
| spaces | shared |
diff --git a/tests/acceptance/features/apiSearch1/dateSearch.feature b/tests/acceptance/features/apiSearch1/dateSearch.feature
index ffb3d02c7b..706b90153d 100644
--- a/tests/acceptance/features/apiSearch1/dateSearch.feature
+++ b/tests/acceptance/features/apiSearch1/dateSearch.feature
@@ -5,7 +5,7 @@ Feature: date search
Background:
Given user "Alice" has been created with default attributes and without skeleton files
-
+ @issue-7060 @issue-10329
Scenario Outline: search resources using different dav path
Given using DAV path
And user "Alice" has created folder "uploadFolder"
@@ -18,7 +18,7 @@ Feature: date search
| new |
| spaces |
-
+ @issue-10329
Scenario Outline: search resources using different search patterns (KQL feature) in the personal space
Given user "Alice" uploads a file "filesForUpload/textfile.txt" to "/today.txt" with mtime "today" via TUS inside of the space "Personal" using the WebDAV API
And user "Alice" uploads a file "filesForUpload/textfile.txt" to "/yesterday.txt" with mtime "yesterday" via TUS inside of the space "Personal" using the WebDAV API
@@ -49,7 +49,7 @@ Feature: date search
# Mtime<$today. "<" has to be escaped
| Mtime<$today | /yesterday.txt | /lastYear.txt | /today.txt | |
-
+ @issue-10329
Scenario: search resources using different search patterns (KQL feature) in the shares folder
Given user "Brian" has been created with default attributes and without skeleton files
And using spaces DAV path
diff --git a/tests/acceptance/features/apiSearch1/search.feature b/tests/acceptance/features/apiSearch1/search.feature
index 19b2225592..2446276621 100644
--- a/tests/acceptance/features/apiSearch1/search.feature
+++ b/tests/acceptance/features/apiSearch1/search.feature
@@ -14,7 +14,7 @@ Feature: Search
And user "Alice" has created a folder "folderMain/SubFolder1/subFOLDER2" in space "project101"
And user "Alice" has uploaded a file inside space "project101" with content "some content" to "folderMain/SubFolder1/subFOLDER2/insideTheFolder.txt"
-
+ @issue-10329
Scenario Outline: user can search items inside project space
Given using DAV path
And user "Alice" has created a folder "AlicePersonal" in space "Personal"
@@ -42,7 +42,7 @@ Feature: Search
| new |
| spaces |
-
+ @issue-10329
Scenario Outline: user can search items inside personal space
Given using DAV path
And user "Alice" has created a folder "AlicePersonal" in space "Personal"
@@ -97,7 +97,7 @@ Feature: Search
| new |
| spaces |
-
+ @issue-10329
Scenario Outline: user can search hidden files
Given using DAV path
And user "Alice" has created a folder ".space" in space "project101"
@@ -172,20 +172,15 @@ Feature: Search
| new |
| spaces |
-
- Scenario Outline: user can search project space by name
- Given using DAV path
+ @issue-10329
+ Scenario: user can search project space by name
+ Given using spaces DAV path
When user "Alice" searches for '*project101*' using the WebDAV API
Then the HTTP status code should be "207"
And the search result should contain "1" entries
And for user "Alice" the search result should contain space "project101"
- Examples:
- | dav-path-version |
- | old |
- | new |
- | spaces |
-
+ @issue-10329
Scenario Outline: user can search inside folder in space
Given using DAV path
When user "Alice" searches for "*folder*" inside folder "/folderMain" in space "project101" using the WebDAV API
@@ -203,7 +198,7 @@ Feature: Search
| new |
| spaces |
-
+ @issue-10329
Scenario Outline: search inside folder in shares
Given using DAV path
And user "Alice" has sent the following resource share invitation:
@@ -227,7 +222,7 @@ Feature: Search
| new |
| spaces |
- @skipOnStable3.0
+ @issue-10329
Scenario Outline: search files inside the folder
Given using DAV path
And user "Alice" has uploaded file with content "hello world inside root" to "file1.txt"
@@ -248,7 +243,7 @@ Feature: Search
| new |
| spaces |
- @issue-7114
+ @issue-7114 @issue-10329
Scenario Outline: search files inside the folder with white space character in its name
Given using DAV path
And user "Alice" has created folder "/New Folder"
@@ -266,7 +261,7 @@ Feature: Search
| new |
| spaces |
- @issue-7114
+ @issue-7114 @issue-10329
Scenario Outline: search files with white space character in its name
Given using DAV path
And user "Alice" has created folder "/New Folder"
@@ -284,7 +279,7 @@ Feature: Search
| new |
| spaces |
- @issue-enterprise-6000 @issue-7028 @issue-7092
+ @issue-enterprise-6000 @issue-7028 @issue-7092 @issue-10329
Scenario Outline: sharee cannot find resources that are not shared
Given using DAV path
And user "Alice" has created a folder "foo/sharedToBrian" in space "Alice Hansen"
@@ -308,7 +303,7 @@ Feature: Search
| new |
| spaces |
-
+ @issue-10329
Scenario Outline: search resources using different search patterns (KQL feature)
Given using spaces DAV path
And user "Alice" has created a folder "subfolder" in space "project101"
@@ -325,7 +320,7 @@ Feature: Search
| name:*der2 | /folderMain/SubFolder1/subFOLDER2 | patern 'name:'' |
| name:"*der2" | /folderMain/SubFolder1/subFOLDER2 | pattern 'name:""' (with quotes) |
- @issue-7812 @issue-8442
+ @issue-7812 @issue-8442 @issue-10329
Scenario: try to search with invalid patterns
Given using spaces DAV path
And user "Alice" has uploaded file with content "test file" to "testFile.txt"
@@ -333,7 +328,7 @@ Feature: Search
Then the HTTP status code should be "400"
And the value of the item "/d:error/s:message" in the response should be "error: bad request: the expression can't begin from a binary operator: 'AND'"
-
+ @issue-10329
Scenario Outline: search a file globally (in all spaces)
Given using DAV path
And user "Alice" has created a folder "AlicePersonal" in space "Personal"
diff --git a/tests/acceptance/features/apiSearch2/mediaTypeSearch.feature b/tests/acceptance/features/apiSearch2/mediaTypeSearch.feature
index 1780b2c94f..97a20914b0 100644
--- a/tests/acceptance/features/apiSearch2/mediaTypeSearch.feature
+++ b/tests/acceptance/features/apiSearch2/mediaTypeSearch.feature
@@ -10,7 +10,7 @@ Feature: media type search
| Brian |
And using spaces DAV path
-
+ @issue-10329
Scenario Outline: search for files using media type
Given user "Alice" has uploaded file "filesForUpload/lorem.txt" to "/lorem.txt"
And user "Alice" has uploaded file "filesForUpload/simple.pdf" to "/simple.pdf"
@@ -38,7 +38,7 @@ Feature: media type search
| *rar* | /data.rar |
| *bzip2* | /data.tar.bz2 |
-
+ @issue-10329
Scenario Outline: search for files inside sub folders using media type
Given user "Alice" has created folder "/uploadFolder"
And user "Alice" has uploaded file "filesForUpload/lorem.txt" to "/uploadFolder/lorem.txt"
@@ -67,7 +67,7 @@ Feature: media type search
| *rar* | /uploadFolder/data.rar |
| *bzip2* | /uploadFolder/data.tar.bz2 |
-
+ @issue-10329
Scenario Outline: search for file inside project space using media type
Given the administrator has assigned the role "Space Admin" to user "Alice" using the Graph API
And user "Alice" has created a space "project101" with the default quota using the Graph API
@@ -97,7 +97,7 @@ Feature: media type search
| *rar* | /data.rar |
| *bzip2* | /data.tar.bz2 |
-
+ @issue-10329
Scenario Outline: sharee searches for shared files using media type
Given user "Alice" has created folder "/uploadFolder"
And user "Alice" has uploaded file "filesForUpload/lorem.txt" to "/uploadFolder/lorem.txt"
@@ -133,7 +133,7 @@ Feature: media type search
| *rar* | /uploadFolder/data.rar |
| *bzip2* | /uploadFolder/data.tar.bz2 |
-
+ @issue-10329
Scenario Outline: space viewer searches for files using mediatype filter
Given the administrator has assigned the role "Space Admin" to user "Alice" using the Graph API
And user "Alice" has created a space "project101" with the default quota using the Graph API
@@ -168,7 +168,7 @@ Feature: media type search
| *rar* | /data.rar |
| *bzip2* | /data.tar.bz2 |
-
+ @issue-10329
Scenario: search files with different mediatype filter
Given user "Alice" has created folder "testFolder"
And user "Alice" has uploaded file "filesForUpload/lorem.txt" to "lorem.txt"
diff --git a/tests/acceptance/features/apiSearch2/tagSearch.feature b/tests/acceptance/features/apiSearch2/tagSearch.feature
index f69c3265e9..2f2d01cdcc 100644
--- a/tests/acceptance/features/apiSearch2/tagSearch.feature
+++ b/tests/acceptance/features/apiSearch2/tagSearch.feature
@@ -6,7 +6,7 @@ Feature: tag search
Background:
Given user "Alice" has been created with default attributes and without skeleton files
-
+ @issue-10329
Scenario Outline: search files by tag
Given using DAV path
And user "Alice" has created the following folders
@@ -35,7 +35,7 @@ Feature: tag search
| new |
| spaces |
-
+ @issue-10329
Scenario Outline: search project space files by tag
Given using spaces DAV path
And the administrator has assigned the role "Space Admin" to user "Alice" using the Graph API
@@ -67,7 +67,7 @@ Feature: tag search
| dav-path-version |
| spaces |
-
+ @issue-10329
Scenario Outline: search folders using a tag
Given using DAV path
And user "Alice" has created folder "uploadFolder1"
@@ -88,7 +88,7 @@ Feature: tag search
| new |
| spaces |
-
+ @issue-10329
Scenario Outline: search project space folders by tag
Given using spaces DAV path
And the administrator has assigned the role "Space Admin" to user "Alice" using the Graph API
@@ -115,7 +115,7 @@ Feature: tag search
| dav-path-version |
| spaces |
-
+ @issue-10329
Scenario Outline: sharee searches shared files using a tag
Given using DAV path
And user "Brian" has been created with default attributes and without skeleton files
@@ -149,7 +149,7 @@ Feature: tag search
| dav-path-version |
| spaces |
-
+ @issue-10329
Scenario Outline: sharee searches shared project space files using a tag
Given using spaces DAV path
And user "Brian" has been created with default attributes and without skeleton files
@@ -204,7 +204,7 @@ Feature: tag search
| new |
| spaces |
-
+ @issue-10329
Scenario Outline: search restored files using a tag
Given using DAV path
And user "Alice" has uploaded file with content "hello world" to "file1.txt"
@@ -223,7 +223,7 @@ Feature: tag search
| new |
| spaces |
-
+ @issue-10329
Scenario Outline: search restored version of a file using a tag
Given using DAV path
And user "Alice" has uploaded file with content "version one file" to "file.txt"
@@ -242,7 +242,7 @@ Feature: tag search
| new |
| spaces |
-
+ @issue-10329
Scenario Outline: search resources using different search patterns (KQL feature)
Given using spaces DAV path
And user "Alice" has created the following folders
diff --git a/tests/acceptance/features/apiSearchContent/contentSearch.feature b/tests/acceptance/features/apiSearchContent/contentSearch.feature
index e6c2db7771..96788555a0 100644
--- a/tests/acceptance/features/apiSearchContent/contentSearch.feature
+++ b/tests/acceptance/features/apiSearchContent/contentSearch.feature
@@ -7,7 +7,7 @@ Feature: content search
Background:
Given user "Alice" has been created with default attributes and without skeleton files
-
+ @issue-10329
Scenario Outline: search files by content
Given using DAV path
And user "Alice" has uploaded file with content "hello world from nepal" to "keywordAtStart.txt"
@@ -26,7 +26,7 @@ Feature: content search
| new |
| spaces |
-
+ @issue-10329
Scenario Outline: search files by different content types
Given using DAV path
And user "Alice" has uploaded file with content "Using k6, you can test the reliability and performance of your systems" to "wordWithNumber.md"
@@ -64,7 +64,7 @@ Feature: content search
| new |
| spaces |
- @env-config
+ @env-config @issue-10329
Scenario Outline: search files by stop words when clean_stop_words is disabled
Given using DAV path
And the config "SEARCH_EXTRACTOR_TIKA_CLEAN_STOP_WORDS" has been set to "false"
@@ -83,7 +83,7 @@ Feature: content search
| new |
| spaces |
-
+ @issue-10329
Scenario Outline: sharee searches files by content
Given using DAV path
And user "Brian" has been created with default attributes and without skeleton files
@@ -111,7 +111,7 @@ Feature: content search
| new |
| spaces |
-
+ @issue-10329
Scenario Outline: search deleted files by content
Given using DAV path
And user "Alice" has created folder "uploadFolder"
@@ -130,7 +130,7 @@ Feature: content search
| new |
| spaces |
-
+ @issue-10329
Scenario Outline: search restored files by content
Given using DAV path
And user "Alice" has created folder "uploadFolder"
@@ -147,7 +147,7 @@ Feature: content search
| new |
| spaces |
-
+ @issue-10329
Scenario Outline: search restored version of a file by content
Given using DAV path
And user "Alice" has uploaded file with content "hello world" to "test.txt"
@@ -163,7 +163,7 @@ Feature: content search
| new |
| spaces |
-
+ @issue-10329
Scenario Outline: search project space files by content
Given using spaces DAV path
And the administrator has assigned the role "Space Admin" to user "Alice" using the Graph API
@@ -186,7 +186,7 @@ Feature: content search
| new |
| spaces |
-
+ @issue-10329
Scenario Outline: sharee searches shared project space files by content
Given using spaces DAV path
And user "Brian" has been created with default attributes and without skeleton files
@@ -215,7 +215,7 @@ Feature: content search
| new |
| spaces |
-
+ @issue-10329
Scenario Outline: search resources using different search patterns (KQL feature)
Given using spaces DAV path
And user "Alice" has uploaded file with content "hello world, let start to test" to "technical task.txt"
@@ -238,7 +238,7 @@ Feature: content search
| content:hel* AND tag:test | 1 | /technical task.txt | |
| (name:*task* AND content:hel*) NOT tag:test | 1 | /task comments.txt | |
-
+ @issue-10329
Scenario Outline: search across files with different format with search text highlight
Given using DAV path
And the administrator has assigned the role "Space Admin" to user "Alice" using the Graph API
diff --git a/tests/acceptance/features/apiSharingNgLinkSharePermission/createLinkShare.feature b/tests/acceptance/features/apiSharingNgLinkSharePermission/createLinkShare.feature
index 85f533817d..7248b4058b 100644
--- a/tests/acceptance/features/apiSharingNgLinkSharePermission/createLinkShare.feature
+++ b/tests/acceptance/features/apiSharingNgLinkSharePermission/createLinkShare.feature
@@ -474,7 +474,7 @@ Feature: Create a link share for a resource
| internal |
| blocksDownload |
- @env-config
+ @env-config @issue-9724 @issue-10331
Scenario: set password on a file's link share using permissions endpoint
Given the following configs have been set:
| config | value |
@@ -1221,7 +1221,7 @@ Feature: Create a link share for a resource
| password | blocksDownload |
| ownCloud | blocksDownload |
- @env-config
+ @env-config @issue-9724 @issue-10331
Scenario: set password on a existing link share of a file inside project-space using permissions endpoint
Given the following configs have been set:
| config | value |
diff --git a/tests/acceptance/features/apiSharingNgLinkSharePermission/updateLinkShare.feature b/tests/acceptance/features/apiSharingNgLinkSharePermission/updateLinkShare.feature
index e3ba8383bb..ad13dc68a4 100644
--- a/tests/acceptance/features/apiSharingNgLinkSharePermission/updateLinkShare.feature
+++ b/tests/acceptance/features/apiSharingNgLinkSharePermission/updateLinkShare.feature
@@ -205,7 +205,7 @@ Feature: Update a link share for a resource
}
"""
-
+ @issue-9724 @issue-10331
Scenario: update password of a file's link share using permissions endpoint
Given user "Alice" has uploaded file with content "other data" to "textfile1.txt"
And user "Alice" has created the following resource link share:
@@ -283,7 +283,7 @@ Feature: Update a link share for a resource
| password |
| ownCloud |
- @env-config
+ @env-config @issue-9724 @issue-10331
Scenario: set password on a existing link share of a folder inside project-space using permissions endpoint
Given the following configs have been set:
| config | value |
diff --git a/tests/acceptance/features/apiSharingNgLinkShareRoot/updateLinkShare.feature b/tests/acceptance/features/apiSharingNgLinkShareRoot/updateLinkShare.feature
index 7f2d65b73c..c462bb5c7c 100644
--- a/tests/acceptance/features/apiSharingNgLinkShareRoot/updateLinkShare.feature
+++ b/tests/acceptance/features/apiSharingNgLinkShareRoot/updateLinkShare.feature
@@ -6,7 +6,7 @@ Feature: Update a link share for a resource
| username |
| Alice |
- @env-config
+ @env-config @issue-9724 @issue-10331
Scenario: set password on a existing link share of a project-space drive using root endpoint
Given the following configs have been set:
| config | value |
@@ -38,7 +38,7 @@ Feature: Update a link share for a resource
"""
And the public should be able to download file "textfile.txt" from the last link share with password "%public%" and the content should be "to share"
-
+ @issue-9724 @issue-10331
Scenario: update password on a existing link share of a project-space drive using root endpoint
And using spaces DAV path
And the administrator has assigned the role "Space Admin" to user "Alice" using the Graph API
diff --git a/tests/acceptance/features/apiSpaces/editPublicLinkOfSpace.feature b/tests/acceptance/features/apiSpaces/editPublicLinkOfSpace.feature
index 044810c627..4166c43392 100644
--- a/tests/acceptance/features/apiSpaces/editPublicLinkOfSpace.feature
+++ b/tests/acceptance/features/apiSpaces/editPublicLinkOfSpace.feature
@@ -25,7 +25,7 @@ Feature: A manager of the space can edit public link
And user "Alice" has uploaded a file inside space "edit space" with content "some content" to "test.txt"
And using SharingNG
-
+ @issue-9724 @issue-10331
Scenario Outline: manager of the space can edit public link.
Given using OCS API version "2"
When user "Alice" updates the last public link share using the sharing API with
diff --git a/tests/acceptance/features/apiSpaces/publicLink.feature b/tests/acceptance/features/apiSpaces/publicLink.feature
index a8b66570df..a4a4626085 100644
--- a/tests/acceptance/features/apiSpaces/publicLink.feature
+++ b/tests/acceptance/features/apiSpaces/publicLink.feature
@@ -14,29 +14,29 @@ Feature: public link for a space
| permissionsRole | view |
And using SharingNG
-
+ @issue-10331
Scenario: public tries to upload a file in the public space
When the public uploads file "test.txt" with content "test" using the new public WebDAV API
And the HTTP status code should be "403"
-
+ @issue-10331
Scenario: public tries to create a folder in the public space
When the public creates folder "created-by-public" using the new public WebDAV API
And the HTTP status code should be "403"
-
+ @issue-10331
Scenario: public tries to delete a file in the public space
Given user "Alice" has uploaded a file inside space "public space" with content "some content" to "test.txt"
When the public deletes file "test.txt" from the last public link share using the new public WebDAV API
And the HTTP status code should be "403"
-
+ @issue-10331
Scenario: public tries to delete a folder in the public space
And user "Alice" has created a folder "/public-folder" in space "public space"
When the public deletes folder "public-folder" from the last public link share using the new public WebDAV API
And the HTTP status code should be "403"
-
+ @issue-10331
Scenario: public tries to change content of a resources in the public space
Given user "Alice" has uploaded a file inside space "public space" with content "some content" to "test.txt"
When the public overwrites file "test.txt" with content "public content" using the new WebDAV API
diff --git a/tests/acceptance/features/apiSpaces/tusUpload.feature b/tests/acceptance/features/apiSpaces/tusUpload.feature
index ebe37f36da..1c6400512c 100644
--- a/tests/acceptance/features/apiSpaces/tusUpload.feature
+++ b/tests/acceptance/features/apiSpaces/tusUpload.feature
@@ -40,7 +40,7 @@ Feature: upload resources using TUS protocol
| test.txt |
| upload.txt |
-
+ @issue-10346
Scenario Outline: upload a zero-byte file inside a shared folder
Given using DAV path
And user "Brian" has been created with default attributes and without skeleton files
@@ -84,7 +84,7 @@ Feature: upload resources using TUS protocol
When user "Alice" uploads a file from "filesForUpload/zerobyte.txt" to "textfile.txt" via TUS inside of the space "new-space" using the WebDAV API
Then for user "Alice" the content of the file "textfile.txt" of the space "new-space" should be ""
- @issue-8003
+ @issue-8003 @issue-10346
Scenario Outline: replace a shared file with zero-byte file
Given using DAV path
And user "Brian" has been created with default attributes and without skeleton files
diff --git a/tests/acceptance/features/apiSpacesDavOperation/copyByFileId.feature b/tests/acceptance/features/apiSpacesDavOperation/copyByFileId.feature
index b66f82c44a..c762d7e11c 100644
--- a/tests/acceptance/features/apiSpacesDavOperation/copyByFileId.feature
+++ b/tests/acceptance/features/apiSpacesDavOperation/copyByFileId.feature
@@ -8,162 +8,126 @@ Feature: copying file using file id
And user "Alice" has been created with default attributes and without skeleton files
- Scenario Outline: copy a file into a folder in personal space
+ Scenario: copy a file into a folder in personal space
Given user "Alice" has created folder "/folder"
And user "Alice" has uploaded file with content "some data" to "/textfile.txt"
And we save it into "FILEID"
- When user "Alice" copies a file "/textfile.txt" into "/folder" inside space "Personal" using file-id path ""
+ When user "Alice" copies a file "/textfile.txt" into "/folder" inside space "Personal" using file-id "<>"
Then the HTTP status code should be "201"
And for user "Alice" folder "/" of the space "Personal" should contain these files:
| textfile.txt |
And for user "Alice" folder "folder" of the space "Personal" should contain these files:
| textfile.txt |
- Examples:
- | dav-path |
- | /remote.php/dav/spaces/<> |
- | /dav/spaces/<> |
- Scenario Outline: copy a file into a sub-folder in personal space
+ Scenario: copy a file into a sub-folder in personal space
Given user "Alice" has created folder "/folder"
And user "Alice" has created folder "folder/sub-folder"
And user "Alice" has uploaded file with content "some data" to "/textfile.txt"
And we save it into "FILEID"
- When user "Alice" copies a file "/textfile.txt" into "/folder/sub-folder" inside space "Personal" using file-id path ""
+ When user "Alice" copies a file "/textfile.txt" into "/folder/sub-folder" inside space "Personal" using file-id "<>"
Then the HTTP status code should be "201"
And for user "Alice" folder "/" of the space "Personal" should contain these files:
| textfile.txt |
And for user "Alice" folder "folder/sub-folder" of the space "Personal" should contain these files:
| textfile.txt |
- Examples:
- | dav-path |
- | /remote.php/dav/spaces/<> |
- | /dav/spaces/<> |
- Scenario Outline: copy a file from a folder into root of personal space
+ Scenario: copy a file from a folder into root of personal space
Given user "Alice" has created folder "/folder"
And user "Alice" has uploaded file with content "some data" to "folder/textfile.txt"
And we save it into "FILEID"
- When user "Alice" copies a file "folder/textfile.txt" into "/" inside space "Personal" using file-id path ""
+ When user "Alice" copies a file "folder/textfile.txt" into "/" inside space "Personal" using file-id "<>"
Then the HTTP status code should be "201"
And for user "Alice" folder "/" of the space "Personal" should contain these files:
| textfile.txt |
And for user "Alice" folder "folder" of the space "Personal" should contain these files:
| textfile.txt |
- Examples:
- | dav-path |
- | /remote.php/dav/spaces/<> |
- | /dav/spaces/<> |
- Scenario Outline: copy a file from sub-folder into root of personal space
+ Scenario: copy a file from sub-folder into root of personal space
Given user "Alice" has created folder "/folder"
And user "Alice" has created folder "folder/sub-folder"
And user "Alice" has uploaded file with content "some data" to "folder/sub-folder/textfile.txt"
And we save it into "FILEID"
- When user "Alice" copies a file "folder/sub-folder/textfile.txt" into "/" inside space "Personal" using file-id path ""
+ When user "Alice" copies a file "folder/sub-folder/textfile.txt" into "/" inside space "Personal" using file-id "<>"
Then the HTTP status code should be "201"
And for user "Alice" folder "/" of the space "Personal" should contain these files:
| textfile.txt |
And for user "Alice" folder "folder/sub-folder" of the space "Personal" should contain these files:
| textfile.txt |
- Examples:
- | dav-path |
- | /remote.php/dav/spaces/<> |
- | /dav/spaces/<> |
- Scenario Outline: copy a file into a folder in project space
+ Scenario: copy a file into a folder in project space
Given the administrator has assigned the role "Space Admin" to user "Alice" using the Graph API
And user "Alice" has created a space "project-space" with the default quota using the Graph API
And user "Alice" has created a folder "/folder" in space "project-space"
And user "Alice" has uploaded a file inside space "project-space" with content "some data" to "textfile.txt"
And we save it into "FILEID"
- When user "Alice" copies a file "/textfile.txt" into "/folder" inside space "project-space" using file-id path ""
+ When user "Alice" copies a file "/textfile.txt" into "/folder" inside space "project-space" using file-id "<>"
Then the HTTP status code should be "201"
And for user "Alice" folder "/" of the space "project-space" should contain these files:
| textfile.txt |
And for user "Alice" folder "folder" of the space "project-space" should contain these files:
| textfile.txt |
- Examples:
- | dav-path |
- | /remote.php/dav/spaces/<> |
- | /dav/spaces/<> |
- Scenario Outline: copy a file into a sub-folder in project space
+ Scenario: copy a file into a sub-folder in project space
Given the administrator has assigned the role "Space Admin" to user "Alice" using the Graph API
And user "Alice" has created a space "project-space" with the default quota using the Graph API
And user "Alice" has created a folder "folder/sub-folder" in space "project-space"
And user "Alice" has uploaded a file inside space "project-space" with content "some data" to "textfile.txt"
And we save it into "FILEID"
- When user "Alice" copies a file "/textfile.txt" into "/folder/sub-folder" inside space "project-space" using file-id path ""
+ When user "Alice" copies a file "/textfile.txt" into "/folder/sub-folder" inside space "project-space" using file-id "<>"
Then the HTTP status code should be "201"
And for user "Alice" folder "/" of the space "project-space" should contain these files:
| textfile.txt |
And for user "Alice" folder "folder/sub-folder" of the space "project-space" should contain these files:
| textfile.txt |
- Examples:
- | dav-path |
- | /remote.php/dav/spaces/<> |
- | /dav/spaces/<> |
- Scenario Outline: copy a file from a folder into root of project space
+ Scenario: copy a file from a folder into root of project space
Given the administrator has assigned the role "Space Admin" to user "Alice" using the Graph API
And user "Alice" has created a space "project-space" with the default quota using the Graph API
And user "Alice" has created a folder "folder" in space "project-space"
And user "Alice" has uploaded a file inside space "project-space" with content "some data" to "folder/textfile.txt"
And we save it into "FILEID"
- When user "Alice" copies a file "folder/textfile.txt" into "/" inside space "project-space" using file-id path ""
+ When user "Alice" copies a file "folder/textfile.txt" into "/" inside space "project-space" using file-id "<>"
Then the HTTP status code should be "201"
And for user "Alice" folder "/" of the space "project-space" should contain these files:
| textfile.txt |
And for user "Alice" folder "folder" of the space "project-space" should contain these files:
| textfile.txt |
- Examples:
- | dav-path |
- | /remote.php/dav/spaces/<> |
- | /dav/spaces/<> |
- Scenario Outline: copy a file from sub-folder into root of project space
+ Scenario: copy a file from sub-folder into root of project space
Given the administrator has assigned the role "Space Admin" to user "Alice" using the Graph API
And user "Alice" has created a space "project-space" with the default quota using the Graph API
And user "Alice" has created a folder "folder/sub-folder" in space "project-space"
And user "Alice" has uploaded a file inside space "project-space" with content "some data" to "folder/sub-folder/textfile.txt"
And we save it into "FILEID"
- When user "Alice" copies a file "folder/sub-folder/textfile.txt" into "/" inside space "project-space" using file-id path ""
+ When user "Alice" copies a file "folder/sub-folder/textfile.txt" into "/" inside space "project-space" using file-id "<>"
Then the HTTP status code should be "201"
And for user "Alice" folder "/" of the space "project-space" should contain these files:
| textfile.txt |
And for user "Alice" folder "folder/sub-folder" of the space "project-space" should contain these files:
| textfile.txt |
- Examples:
- | dav-path |
- | /remote.php/dav/spaces/<> |
- | /dav/spaces/<> |
- Scenario Outline: copy a file from personal to project space
+ Scenario: copy a file from personal to project space
Given the administrator has assigned the role "Space Admin" to user "Alice" using the Graph API
And user "Alice" has created a space "project-space" with the default quota using the Graph API
And user "Alice" has uploaded file with content "some data" to "textfile.txt"
And we save it into "FILEID"
- When user "Alice" copies a file "/textfile.txt" into "/" inside space "project-space" using file-id path ""
+ When user "Alice" copies a file "/textfile.txt" into "/" inside space "project-space" using file-id "<>"
Then the HTTP status code should be "201"
And for user "Alice" folder "/" of the space "project-space" should contain these files:
| textfile.txt |
And for user "Alice" folder "/" of the space "Personal" should contain these files:
| textfile.txt |
- Examples:
- | dav-path |
- | /remote.php/dav/spaces/<> |
- | /dav/spaces/<> |
- Scenario Outline: copy a file from sub-folder to root folder inside Shares space
+ Scenario: copy a file from sub-folder to root folder inside Shares space
Given user "Brian" has been created with default attributes and without skeleton files
And user "Alice" has created folder "/folder"
And user "Alice" has created folder "folder/sub-folder"
@@ -176,7 +140,7 @@ Feature: copying file using file id
| shareType | user |
| permissionsRole | Editor |
And user "Brian" has a share "folder" synced
- When user "Brian" copies a file "Shares/folder/sub-folder/test.txt" into "Shares/folder" inside space "Shares" using file-id path ""
+ When user "Brian" copies a file "Shares/folder/sub-folder/test.txt" into "Shares/folder" inside space "Shares" using file-id "<>"
Then the HTTP status code should be "201"
And for user "Brian" folder "folder" of the space "Shares" should contain these files:
| test.txt |
@@ -186,13 +150,9 @@ Feature: copying file using file id
| test.txt |
And for user "Alice" folder "folder/sub-folder" of the space "Personal" should contain these files:
| test.txt |
- Examples:
- | dav-path |
- | /remote.php/dav/spaces/<> |
- | /dav/spaces/<> |
- Scenario Outline: copy a file from personal to share space
+ Scenario: copy a file from personal to share space
Given user "Brian" has been created with default attributes and without skeleton files
And user "Alice" has created folder "/folder"
And user "Alice" has sent the following resource share invitation:
@@ -205,7 +165,7 @@ Feature: copying file using file id
And user "Brian" has uploaded file with content "some data" to "/test.txt"
And we save it into "FILEID"
And user "Brian" has a share "folder" synced
- When user "Brian" copies a file "/test.txt" into "Shares/folder" inside space "Shares" using file-id path ""
+ When user "Brian" copies a file "/test.txt" into "Shares/folder" inside space "Shares" using file-id "<>"
Then the HTTP status code should be "201"
And for user "Brian" folder "folder" of the space "Shares" should contain these files:
| test.txt |
@@ -213,10 +173,6 @@ Feature: copying file using file id
| test.txt |
And for user "Alice" folder "folder" of the space "Personal" should contain these files:
| test.txt |
- Examples:
- | dav-path |
- | /remote.php/dav/spaces/<> |
- | /dav/spaces/<> |
Scenario Outline: copy a file from share to personal space
@@ -231,7 +187,7 @@ Feature: copying file using file id
| shareType | user |
| permissionsRole | |
And user "Brian" has a share "folder" synced
- When user "Brian" copies a file "/test.txt" into "/" inside space "Personal" using file-id path ""
+ When user "Brian" copies a file "/test.txt" into "/" inside space "Personal" using file-id "<>"
Then the HTTP status code should be "201"
And for user "Brian" folder "folder" of the space "Shares" should contain these files:
| test.txt |
@@ -240,16 +196,13 @@ Feature: copying file using file id
And for user "Alice" folder "folder" of the space "Personal" should contain these files:
| test.txt |
Examples:
- | permission-role | dav-path |
- | Editor | /remote.php/dav/spaces/<> |
- | Viewer | /remote.php/dav/spaces/<> |
- | Uploader | /remote.php/dav/spaces/<> |
- | Editor | /dav/spaces/<> |
- | Viewer | /dav/spaces/<> |
- | Uploader | /dav/spaces/<> |
+ | permission-role |
+ | Editor |
+ | Viewer |
+ | Uploader |
- Scenario Outline: sharee tries to copy a file from shares space with secure viewer to personal space
+ Scenario: sharee tries to copy a file from shares space with secure viewer to personal space
Given user "Brian" has been created with default attributes and without skeleton files
And user "Alice" has created folder "/folder"
And user "Alice" has uploaded file with content "some data" to "/folder/test.txt"
@@ -261,16 +214,12 @@ Feature: copying file using file id
| shareType | user |
| permissionsRole | Secure viewer |
And user "Brian" has a share "folder" synced
- When user "Brian" copies a file "/test.txt" into "/" inside space "Personal" using file-id path ""
+ When user "Brian" copies a file "/test.txt" into "/" inside space "Personal" using file-id "<>"
Then the HTTP status code should be "403"
And for user "Brian" folder "folder" of the space "Shares" should contain these files:
| test.txt |
And for user "Brian" folder "/" of the space "Personal" should not contain these files:
| test.txt |
- Examples:
- | dav-path |
- | /remote.php/dav/spaces/<> |
- | /dav/spaces/<> |
Scenario Outline: sharee copies a file from shares to project space
@@ -292,7 +241,7 @@ Feature: copying file using file id
| sharee | Brian |
| shareType | user |
| permissionsRole | |
- When user "Brian" copies a file "Shares/folder/test.txt" into "/" inside space "project-space" using file-id path ""
+ When user "Brian" copies a file "Shares/folder/test.txt" into "/" inside space "project-space" using file-id "<>"
Then the HTTP status code should be "201"
And for user "Brian" folder "folder" of the space "Shares" should contain these files:
| test.txt |
@@ -301,19 +250,13 @@ Feature: copying file using file id
And for user "Alice" folder "/" of the space "project-space" should contain these files:
| test.txt |
Examples:
- | permission-role | space-role | dav-path |
- | Viewer | Manager | /remote.php/dav/spaces/<> |
- | Viewer | Space Editor | /remote.php/dav/spaces/<> |
- | Editor | Manager | /remote.php/dav/spaces/<> |
- | Editor | Space Editor | /remote.php/dav/spaces/<> |
- | Uploader | Manager | /remote.php/dav/spaces/<> |
- | Uploader | Space Editor | /remote.php/dav/spaces/<> |
- | Viewer | Manager | /dav/spaces/<> |
- | Viewer | Space Editor | /dav/spaces/<> |
- | Editor | Manager | /dav/spaces/<> |
- | Editor | Space Editor | /dav/spaces/<> |
- | Uploader | Manager | /dav/spaces/<> |
- | Uploader | Space Editor | /dav/spaces/<> |
+ | permission-role | space-role |
+ | Viewer | Manager |
+ | Viewer | Space Editor |
+ | Editor | Manager |
+ | Editor | Space Editor |
+ | Uploader | Manager |
+ | Uploader | Space Editor |
Scenario Outline: sharee tries to copy a file from shares to project space
@@ -335,7 +278,7 @@ Feature: copying file using file id
| sharee | Brian |
| shareType | user |
| permissionsRole | |
- When user "Brian" copies a file "Shares/folder/test.txt" into "/" inside space "project-space" using file-id path ""
+ When user "Brian" copies a file "Shares/folder/test.txt" into "/" inside space "project-space" using file-id "<>"
Then the HTTP status code should be "403"
And for user "Brian" folder "folder" of the space "Shares" should contain these files:
| test.txt |
@@ -344,19 +287,13 @@ Feature: copying file using file id
And for user "Alice" folder "/" of the space "project-space" should not contain these files:
| test.txt |
Examples:
- | permission-role | space-role | dav-path |
- | Secure viewer | Manager | /remote.php/dav/spaces/<> |
- | Secure viewer | Space Viewer | /remote.php/dav/spaces/<> |
- | Secure viewer | Space Editor | /remote.php/dav/spaces/<> |
- | Editor | Space Viewer | /remote.php/dav/spaces/<> |
- | Viewer | Space Viewer | /remote.php/dav/spaces/<> |
- | Uploader | Space Viewer | /remote.php/dav/spaces/<> |
- | Secure viewer | Manager | /dav/spaces/<> |
- | Secure viewer | Space Viewer | /dav/spaces/<> |
- | Secure viewer | Space Editor | /dav/spaces/<> |
- | Editor | Space Viewer | /dav/spaces/<> |
- | Viewer | Space Viewer | /dav/spaces/<> |
- | Uploader | Space Viewer | /dav/spaces/<> |
+ | permission-role | space-role |
+ | Secure viewer | Manager |
+ | Secure viewer | Space Viewer |
+ | Secure viewer | Space Editor |
+ | Editor | Space Viewer |
+ | Viewer | Space Viewer |
+ | Uploader | Space Viewer |
Scenario Outline: sharee copies a file between shares spaces
@@ -379,7 +316,7 @@ Feature: copying file using file id
| shareType | user |
| permissionsRole | |
And user "Brian" has a share "share2" synced
- When user "Brian" copies a file "Shares/share1/test.txt" into "share2" inside space "Shares" using file-id path ""
+ When user "Brian" copies a file "Shares/share1/test.txt" into "share2" inside space "Shares" using file-id "<>"
Then the HTTP status code should be "201"
And for user "Brian" folder "share1" of the space "Shares" should contain these files:
| test.txt |
@@ -390,19 +327,13 @@ Feature: copying file using file id
And for user "Alice" folder "share2" of the space "Personal" should contain these files:
| test.txt |
Examples:
- | from-share-role | to-share-role | dav-path |
- | Viewer | Editor | /remote.php/dav/spaces/<> |
- | Viewer | Uploader | /remote.php/dav/spaces/<> |
- | Editor | Editor | /remote.php/dav/spaces/<> |
- | Editor | Uploader | /remote.php/dav/spaces/<> |
- | Uploader | Editor | /remote.php/dav/spaces/<> |
- | Uploader | Uploader | /remote.php/dav/spaces/<> |
- | Viewer | Editor | /dav/spaces/<> |
- | Viewer | Uploader | /dav/spaces/<> |
- | Editor | Editor | /dav/spaces/<> |
- | Editor | Uploader | /dav/spaces/<> |
- | Uploader | Editor | /dav/spaces/<> |
- | Uploader | Uploader | /dav/spaces/<> |
+ | from-share-role | to-share-role |
+ | Viewer | Editor |
+ | Viewer | Uploader |
+ | Editor | Editor |
+ | Editor | Uploader |
+ | Uploader | Editor |
+ | Uploader | Uploader |
Scenario Outline: sharee tries to copy a file between shares space
@@ -425,7 +356,7 @@ Feature: copying file using file id
| shareType | user |
| permissionsRole | |
And user "Brian" has a share "share2" synced
- When user "Brian" copies a file "Shares/share1/test.txt" into "share2" inside space "Shares" using file-id path ""
+ When user "Brian" copies a file "Shares/share1/test.txt" into "share2" inside space "Shares" using file-id "<>"
Then the HTTP status code should be "403"
And for user "Brian" folder "share1" of the space "Shares" should contain these files:
| test.txt |
@@ -436,27 +367,17 @@ Feature: copying file using file id
And for user "Alice" folder "share2" of the space "Personal" should not contain these files:
| test.txt |
Examples:
- | from-share-role | to-share-role | dav-path |
- | Secure viewer | Viewer | /remote.php/dav/spaces/<> |
- | Secure viewer | Editor | /remote.php/dav/spaces/<> |
- | Secure viewer | Uploader | /remote.php/dav/spaces/<> |
- | Secure viewer | Secure viewer | /remote.php/dav/spaces/<> |
- | Viewer | Viewer | /remote.php/dav/spaces/<> |
- | Editor | Viewer | /remote.php/dav/spaces/<> |
- | Uploader | Viewer | /remote.php/dav/spaces/<> |
- | Viewer | Secure viewer | /remote.php/dav/spaces/<> |
- | Editor | Secure viewer | /remote.php/dav/spaces/<> |
- | Uploader | Secure viewer | /remote.php/dav/spaces/<> |
- | Secure viewer | Viewer | /dav/spaces/<> |
- | Secure viewer | Editor | /dav/spaces/<> |
- | Secure viewer | Uploader | /dav/spaces/<> |
- | Secure viewer | Secure viewer | /dav/spaces/<> |
- | Viewer | Viewer | /dav/spaces/<> |
- | Editor | Viewer | /dav/spaces/<> |
- | Uploader | Viewer | /dav/spaces/<> |
- | Viewer | Secure viewer | /dav/spaces/<> |
- | Editor | Secure viewer | /dav/spaces/<> |
- | Uploader | Secure viewer | /dav/spaces/<> |
+ | from-share-role | to-share-role |
+ | Secure viewer | Viewer |
+ | Secure viewer | Editor |
+ | Secure viewer | Uploader |
+ | Secure viewer | Secure viewer |
+ | Viewer | Viewer |
+ | Editor | Viewer |
+ | Uploader | Viewer |
+ | Viewer | Secure viewer |
+ | Editor | Secure viewer |
+ | Uploader | Secure viewer |
Scenario Outline: copy a file from project to personal space
@@ -470,20 +391,17 @@ Feature: copying file using file id
| sharee | Brian |
| shareType | user |
| permissionsRole | |
- When user "Brian" copies a file "/textfile.txt" into "/" inside space "Personal" using file-id path ""
+ When user "Brian" copies a file "/textfile.txt" into "/" inside space "Personal" using file-id "<>"
Then the HTTP status code should be "201"
And for user "Brian" folder "/" of the space "project-space" should contain these files:
| textfile.txt |
And for user "Brian" folder "/" of the space "Personal" should contain these files:
| textfile.txt |
Examples:
- | space-role | dav-path |
- | Manager | /remote.php/dav/spaces/<> |
- | Space Editor | /remote.php/dav/spaces/<> |
- | Space Viewer | /remote.php/dav/spaces/<> |
- | Manager | /dav/spaces/<> |
- | Space Editor | /dav/spaces/<> |
- | Space Viewer | /dav/spaces/<> |
+ | space-role |
+ | Manager |
+ | Space Editor |
+ | Space Viewer |
Scenario Outline: copy a file between two project spaces
@@ -503,7 +421,7 @@ Feature: copying file using file id
| sharee | Brian |
| shareType | user |
| permissionsRole | |
- When user "Brian" copies a file "textfile.txt" into "/" inside space "second-project-space" using file-id path ""
+ When user "Brian" copies a file "textfile.txt" into "/" inside space "second-project-space" using file-id "<>"
Then the HTTP status code should be "201"
And for user "Brian" the space "second-project-space" should contain these entries:
| textfile.txt |
@@ -512,19 +430,13 @@ Feature: copying file using file id
And for user "Alice" the space "second-project-space" should contain these entries:
| textfile.txt |
Examples:
- | from-space-role | to-space-role | dav-path |
- | Manager | Manager | /remote.php/dav/spaces/<> |
- | Manager | Space Editor | /remote.php/dav/spaces/<> |
- | Space Editor | Manager | /remote.php/dav/spaces/<> |
- | Space Editor | Space Editor | /remote.php/dav/spaces/<> |
- | Space Viewer | Manager | /remote.php/dav/spaces/<> |
- | Space Viewer | Space Editor | /remote.php/dav/spaces/<> |
- | Manager | Manager | /dav/spaces/<> |
- | Manager | Space Editor | /dav/spaces/<> |
- | Space Editor | Manager | /dav/spaces/<> |
- | Space Editor | Space Editor | /dav/spaces/<> |
- | Space Viewer | Manager | /dav/spaces/<> |
- | Space Viewer | Space Editor | /dav/spaces/<> |
+ | from-space-role | to-space-role |
+ | Manager | Manager |
+ | Manager | Space Editor |
+ | Space Editor | Manager |
+ | Space Editor | Space Editor |
+ | Space Viewer | Manager |
+ | Space Viewer | Space Editor |
Scenario Outline: try to copy a file from a project to another project space with read permission
@@ -544,7 +456,7 @@ Feature: copying file using file id
| sharee | Brian |
| shareType | user |
| permissionsRole | |
- When user "Brian" copies a file "textfile.txt" into "/" inside space "second-project-space" using file-id path ""
+ When user "Brian" copies a file "textfile.txt" into "/" inside space "second-project-space" using file-id "<>"
Then the HTTP status code should be "403"
And for user "Brian" the space "second-project-space" should not contain these entries:
| textfile.txt |
@@ -553,13 +465,10 @@ Feature: copying file using file id
But for user "Alice" the space "second-project-space" should not contain these entries:
| textfile.txt |
Examples:
- | from-space-role | to-space-role | dav-path |
- | Manager | Space Viewer | /remote.php/dav/spaces/<> |
- | Space Editor | Space Viewer | /remote.php/dav/spaces/<> |
- | Space Viewer | Space Viewer | /remote.php/dav/spaces/<> |
- | Manager | Space Viewer | /dav/spaces/<> |
- | Space Editor | Space Viewer | /dav/spaces/<> |
- | Space Viewer | Space Viewer | /dav/spaces/<