diff --git a/tests/acceptance/bootstrap/SearchContext.php b/tests/acceptance/bootstrap/SearchContext.php index 7c5dc83b6d..dcec6458d8 100644 --- a/tests/acceptance/bootstrap/SearchContext.php +++ b/tests/acceptance/bootstrap/SearchContext.php @@ -23,7 +23,9 @@ use Behat\Behat\Context\Context; use Behat\Behat\Hook\Scope\BeforeScenarioScope; use Behat\Gherkin\Node\TableNode; +use GuzzleHttp\Exception\GuzzleException; use PHPUnit\Framework\Assert; +use Psr\Http\Message\ResponseInterface; use TestHelpers\WebDavHelper; use TestHelpers\HttpRequestHelper; use TestHelpers\BehatHelper; @@ -37,33 +39,26 @@ class SearchContext implements Context { private FeatureContext $featureContext; /** - * @When user :user searches for :pattern using the WebDAV API - * @When user :user searches for :pattern and limits the results to :limit items using the WebDAV API - * @When user :user searches for :pattern using the WebDAV API requesting these properties: - * @When user :user searches for :pattern and limits the results to :limit items using the WebDAV API requesting these properties: - * @When user :user searches for :pattern inside folder :scope using the WebDAV API - * @When user :user searches for :pattern inside folder :scope in space :spaceName using the WebDAV API - * * @param string $user * @param string $pattern * @param string|null $limit + * @param string|null $scopeType * @param string|null $scope * @param string|null $spaceName * @param TableNode|null $properties * - * @return void + * @return ResponseInterface + * @throws GuzzleException|JsonException */ - public function userSearchesUsingWebDavAPI( - string $user, - string $pattern, - ?string $limit = null, - ?string $scope = null, - ?string $spaceName = null, - TableNode $properties = null - ): void { - // NOTE: because indexing of newly uploaded files or directories with ocis is decoupled and occurs asynchronously - // short wait is necessary before searching - sleep(5); + private function searchFiles( + string $user, + string $pattern, + ?string $limit = null, + ?string $scopeType = null, + ?string $scope = null, + ?string $spaceName = null, + ?TableNode $properties = null + ): ResponseInterface { $user = $this->featureContext->getActualUsername($user); $baseUrl = $this->featureContext->getBaseUrl(); $password = $this->featureContext->getPasswordForUser($user); @@ -85,9 +80,13 @@ class SearchContext implements Context { " \n" . " \n"; if ($scope !== null) { - $scope = \trim($scope, "/"); - $resourceID = $this->featureContext->spacesContext->getResourceId($user, $spaceName ?? "Personal", $scope); - $pattern .= " scope:$resourceID"; + if ($scopeType === "space") { + $spaceId = $this->featureContext->spacesContext->getSpaceIdByName($user, $scope); + $pattern .= " scope:$spaceId"; + } else { + $resourceID = $this->featureContext->spacesContext->getResourceId($user, $spaceName ?? "Personal", $scope); + $pattern .= " scope:$resourceID"; + } } $body .= "$pattern\n"; if ($limit !== null) { @@ -114,7 +113,7 @@ class SearchContext implements Context { } $fullUrl = WebDavHelper::sanitizeUrl("$baseUrl/$davPath"); - $response = HttpRequestHelper::sendRequest( + return HttpRequestHelper::sendRequest( $fullUrl, $this->featureContext->getStepLineRef(), 'REPORT', @@ -123,6 +122,32 @@ class SearchContext implements Context { null, $body ); + } + + /** + * @When user :user searches for :pattern using the WebDAV API + * @When user :user searches for :pattern and limits the results to :limit items using the WebDAV API + * @When user :user searches for :pattern using the WebDAV API requesting these properties: + * @When user :user searches for :pattern and limits the results to :limit items using the WebDAV API requesting these properties: + * + * @param string $user + * @param string $pattern + * @param string|null $limit + * @param TableNode|null $properties + * + * @return void + * @throws Exception|GuzzleException + */ + public function userSearchesUsingWebDavAPI( + string $user, + string $pattern, + ?string $limit = null, + ?TableNode $properties = null + ): void { + // NOTE: because indexing of newly uploaded files or directories with ocis is decoupled and occurs asynchronously + // short wait is necessary before searching + sleep(5); + $response = $this->searchFiles($user, $pattern, $limit, null, null, null, $properties); $this->featureContext->setResponse($response); } @@ -221,4 +246,31 @@ class SearchContext implements Context { ); } } + + /** + * @When /^user "([^"]*)" searches for "([^"]*)" inside (folder|space) "([^"]*)" using the WebDAV API$/ + * @When /^user "([^"]*)" searches for "([^"]*)" inside (folder) "([^"]*)" in space "([^"]*)" using the WebDAV API$/ + * + * @param string $user + * @param string $pattern + * @param string $scopeType + * @param string $scope + * @param string|null $spaceName + * + * @return void + * @throws Exception|GuzzleException + */ + public function userSearchesInsideFolderOrSpaceUsingWebDavAPI( + string $user, + string $pattern, + string $scopeType, + string $scope, + ?string $spaceName = null, + ): void { + // NOTE: since indexing of newly uploaded files or directories with ocis is decoupled and occurs asynchronously, + // a short wait is necessary before searching + sleep(5); + $response = $this-> searchFiles($user, $pattern, null, $scopeType, $scope, $spaceName); + $this->featureContext->setResponse($response); + } } diff --git a/tests/acceptance/features/apiSearch1/search.feature b/tests/acceptance/features/apiSearch1/search.feature index f3762b6636..19b2225592 100644 --- a/tests/acceptance/features/apiSearch1/search.feature +++ b/tests/acceptance/features/apiSearch1/search.feature @@ -15,17 +15,27 @@ Feature: Search And user "Alice" has uploaded a file inside space "project101" with content "some content" to "folderMain/SubFolder1/subFOLDER2/insideTheFolder.txt" - Scenario Outline: user can search items from the project space + Scenario Outline: user can search items inside project space Given using DAV path - When user "Alice" searches for "*SUB*" using the WebDAV API + And user "Alice" has created a folder "AlicePersonal" in space "Personal" + And user "Alice" has uploaded a file inside space "Personal" with content "inside Alice personal space" to "AlicePersonal/insideAlicePersonal.txt" + And user "Brian" has created a folder "BrianPersonal" in space "Personal" + And user "Brian" has uploaded file with content "inside Brian personal space" to "BrianPersonal/insideBrianPersonal.txt" + And user "Brian" has sent the following resource share invitation: + | resource | BrianPersonal | + | space | Personal | + | sharee | Alice | + | shareType | user | + | permissionsRole | Viewer | + And user "Alice" has a share "BrianPersonal" synced + When user "Alice" searches for "*inside*" inside space "project101" using the WebDAV API Then the HTTP status code should be "207" - And the search result should contain "2" entries + And the search result should contain "1" entries And the search result of user "Alice" should contain these entries: - | /folderMain/SubFolder1 | - | /folderMain/SubFolder1/subFOLDER2 | + | folderMain/SubFolder1/subFOLDER2/insideTheFolder.txt | But the search result of user "Alice" should not contain these entries: - | /folderMain | - | /folderMain/SubFolder1/subFOLDER2/insideTheFolder.txt | + | /AlicePersonal/insideAlicePersonal.txt | + | /BrianPersonal/insideBrianPersonal.txt | Examples: | dav-path-version | | old | @@ -33,23 +43,54 @@ Feature: Search | spaces | - Scenario Outline: user can search items from the shares + Scenario Outline: user can search items inside personal space Given using DAV path - And user "Alice" has sent the following resource share invitation: - | resource | folderMain | - | space | project101 | - | sharee | Brian | - | shareType | user | - | permissionsRole | Viewer | - And user "Brian" has a share "folderMain" synced - When user "Brian" searches for "*folder*" using the WebDAV API + And user "Alice" has created a folder "AlicePersonal" in space "Personal" + And user "Alice" has uploaded a file inside space "Personal" with content "inside Alice personal space" to "AlicePersonal/insideAlicePersonal.txt" + And user "Brian" has created a folder "BrianPersonal" in space "Personal" + And user "Brian" has uploaded file with content "inside Brian personal space" to "BrianPersonal/insideBrianPersonal.txt" + And user "Brian" has sent the following resource share invitation: + | resource | BrianPersonal | + | space | Personal | + | sharee | Alice | + | shareType | user | + | permissionsRole | Viewer | + And user "Alice" has a share "BrianPersonal" synced + When user "Alice" searches for "*inside*" inside space "Personal" using the WebDAV API Then the HTTP status code should be "207" - And the search result should contain "4" entries - And the search result of user "Brian" should contain these entries: - | folderMain/SubFolder1 | - | folderMain/SubFolder1/subFOLDER2 | + And the search result should contain "1" entries + And the search result of user "Alice" should contain only these entries: + | AlicePersonal/insideAlicePersonal.txt | + But the search result of user "Alice" should not contain these entries: + | BrianPersonal/insideBrianPersonal.txt | + | folderMain/SubFolder1/subFOLDER2/insideTheFolder.txt | + Examples: + | dav-path-version | + | old | + | new | + | spaces | + + + Scenario Outline: user cannot search items inside shares space + Given using DAV path + And user "Alice" has created a folder "AlicePersonal" in space "Personal" + And user "Alice" has uploaded a file inside space "Personal" with content "inside Alice personal space" to "AlicePersonal/insideAlicePersonal.txt" + And user "Brian" has created a folder "BrianPersonal" in space "Personal" + And user "Brian" has uploaded file with content "inside Brian personal space" to "BrianPersonal/insideBrianPersonal.txt" + And user "Brian" has sent the following resource share invitation: + | resource | BrianPersonal | + | space | Personal | + | sharee | Alice | + | shareType | user | + | permissionsRole | Viewer | + And user "Alice" has a share "BrianPersonal" synced + When user "Alice" searches for "*inside*" inside space "Shares" using the WebDAV API + Then the HTTP status code should be "207" + And the search result should contain "0" entries + And the search result of user "Alice" should not contain these entries: + | BrianPersonal/insideBrianPersonal.txt | + | AlicePersonal/insideAlicePersonal.txt | | folderMain/SubFolder1/subFOLDER2/insideTheFolder.txt | - And for user "Brian" the search result should contain space "mountpoint/folderMain" Examples: | dav-path-version | | old | @@ -291,3 +332,30 @@ Feature: Search When user "Alice" searches for 'AND mediatype:document' using the WebDAV API 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'" + + + Scenario Outline: search a file globally (in all spaces) + Given using DAV path + And user "Alice" has created a folder "AlicePersonal" in space "Personal" + And user "Alice" has uploaded a file inside space "Personal" with content "inside Alice personal space" to "AlicePersonal/insideAlicePersonal.txt" + And user "Brian" has created a folder "BrianPersonal" in space "Personal" + And user "Brian" has uploaded file with content "inside Brian personal space" to "BrianPersonal/insideBrianPersonal.txt" + And user "Brian" has sent the following resource share invitation: + | resource | BrianPersonal | + | space | Personal | + | sharee | Alice | + | shareType | user | + | permissionsRole | Viewer | + And user "Alice" has a share "BrianPersonal" synced + When user "Alice" searches for "*inside*" using the WebDAV API + Then the HTTP status code should be "207" + And the search result should contain "3" entries + And the search result of user "Alice" should contain these entries: + | AlicePersonal/insideAlicePersonal.txt | + | folderMain/SubFolder1/subFOLDER2/insideTheFolder.txt | + | BrianPersonal/insideBrianPersonal.txt | + Examples: + | dav-path-version | + | old | + | new | + | spaces |