From d11b69bfb9fdb75389fd6c3f6234e52eb85b88ce Mon Sep 17 00:00:00 2001 From: Sergio Bertolin Date: Fri, 9 Oct 2015 13:00:34 +0000 Subject: [PATCH] added sharing feature file added logic necessary for preconditions and postconditions of sharing tests Added sharing by link tests and sharing with group Added test which reproduces issue 19950 (adding expiration date) refactored given and then statements to be preconditions and not operations --- .../features/bootstrap/FeatureContext.php | 250 +++++++++++++++--- build/integration/features/sharing-v1.feature | 68 +++++ 2 files changed, 284 insertions(+), 34 deletions(-) create mode 100644 build/integration/features/sharing-v1.feature diff --git a/build/integration/features/bootstrap/FeatureContext.php b/build/integration/features/bootstrap/FeatureContext.php index 70e73b66a7..df4b853edd 100644 --- a/build/integration/features/bootstrap/FeatureContext.php +++ b/build/integration/features/bootstrap/FeatureContext.php @@ -23,6 +23,9 @@ class FeatureContext extends BehatContext { /** @var int */ private $apiVersion = 1; + /** @var SimpleXMLElement */ + private $lastShareData = null; + /** * Initializes context. * Every scenario gets it's own context object. @@ -197,16 +200,27 @@ class FeatureContext extends BehatContext { /** * @Given /^user "([^"]*)" exists$/ */ - public function userExists($user) { + public function assureUserExists($user) { + try { + $this->userExists($user); + } catch (\GuzzleHttp\Exception\ClientException $ex) { + $previous_user = $this->currentUser; + $this->currentUser = "admin"; + $this->creatingTheUser($user); + $this->currentUser = $previous_user; + } + $this->userExists($user); + PHPUnit_Framework_Assert::assertEquals(200, $this->response->getStatusCode()); + + } + + public function userExists($user){ $fullUrl = $this->baseUrl . "v2.php/cloud/users/$user"; $client = new Client(); $options = []; - if ($this->currentUser === 'admin') { - $options['auth'] = $this->adminUser; - } + $options['auth'] = $this->adminUser; $this->response = $client->get($fullUrl, $options); - PHPUnit_Framework_Assert::assertEquals(200, $this->response->getStatusCode()); } /** @@ -284,14 +298,23 @@ class FeatureContext extends BehatContext { PHPUnit_Framework_Assert::assertEquals(200, $this->response->getStatusCode()); } - /** * @Given /^user "([^"]*)" does not exist$/ */ public function userDoesNotExist($user) { try { $this->userExists($user); - PHPUnit_Framework_Assert::fail('The user "' . $user . '" exists'); + } catch (\GuzzleHttp\Exception\ClientException $ex) { + $this->response = $ex->getResponse(); + PHPUnit_Framework_Assert::assertEquals(404, $ex->getResponse()->getStatusCode()); + return; + } + $previous_user = $this->currentUser; + $this->currentUser = "admin"; + $this->deletingTheUser($user); + $this->currentUser = $previous_user; + try { + $this->userExists($user); } catch (\GuzzleHttp\Exception\ClientException $ex) { $this->response = $ex->getResponse(); PHPUnit_Framework_Assert::assertEquals(404, $ex->getResponse()->getStatusCode()); @@ -332,10 +355,65 @@ class FeatureContext extends BehatContext { PHPUnit_Framework_Assert::assertEquals(200, $this->response->getStatusCode()); } - /** - * @When /^creating the user "([^"]*)r"$/ - */ + public function createUser($user) { + $this->creatingTheUser($user); + $this->userExists($user); + } + + public function deleteUser($user) { + $this->deletingTheUser($user); + $this->userDoesNotExist($user); + } + + public function createGroup($group) { + $this->creatingTheGroup($group); + $this->groupExists($group); + } + + public function deleteGroup($group) { + $this->deletingTheGroup($group); + $this->groupDoesNotExist($group); + } + public function creatingTheUser($user) { + $fullUrl = $this->baseUrl . "v{$this->apiVersion}.php/cloud/users"; + $client = new Client(); + $options = []; + if ($this->currentUser === 'admin') { + $options['auth'] = $this->adminUser; + } + + $options['body'] = [ + 'userid' => $user, + 'password' => '123456' + ]; + + $this->response = $client->send($client->createRequest("POST", $fullUrl, $options)); + + } + + /** + * @When /^creating the group "([^"]*)"$/ + */ + public function creatingTheGroup($group) { + $fullUrl = $this->baseUrl . "v{$this->apiVersion}.php/cloud/groups"; + $client = new Client(); + $options = []; + if ($this->currentUser === 'admin') { + $options['auth'] = $this->adminUser; + } + + $options['body'] = [ + 'groupid' => $group, + ]; + + $this->response = $client->send($client->createRequest("POST", $fullUrl, $options)); + } + + /** + * @When /^Deleting the user "([^"]*)"$/ + */ + public function deletingTheUser($user) { $fullUrl = $this->baseUrl . "v{$this->apiVersion}.php/cloud/users/$user"; $client = new Client(); $options = []; @@ -343,45 +421,74 @@ class FeatureContext extends BehatContext { $options['auth'] = $this->adminUser; } - $this->response = $client->post($fullUrl, [ - 'form_params' => [ - 'userid' => $user, - 'password' => '123456' - ] - ]); - + $this->response = $client->send($client->createRequest("DELETE", $fullUrl, $options)); } /** - * @When /^creating the group "([^"]*)r"$/ + * @When /^Deleting the group "([^"]*)"$/ */ - public function creatingTheGroup($group) { - $fullUrl = $this->baseUrl . "v{$this->apiVersion}.php/cloud/groups/addgroup"; + public function deletingTheGroup($group) { + $fullUrl = $this->baseUrl . "v{$this->apiVersion}.php/cloud/groups/$group"; $client = new Client(); $options = []; if ($this->currentUser === 'admin') { $options['auth'] = $this->adminUser; } - $this->response = $client->post($fullUrl, [ - 'form_params' => [ - 'groupid' => $user - ] - ]); + $this->response = $client->send($client->createRequest("DELETE", $fullUrl, $options)); + } + + /** + * @Given /^Add user "([^"]*)" to the group "([^"]*)"$/ + */ + public function addUserToGroup($user, $group) { + $this->userExists($user); + $this->groupExists($group); + $this->addingUserToGroup($user, $group); + + } + + /** + * @When /^User "([^"]*)" is added to the group "([^"]*)"$/ + */ + public function addingUserToGroup($user, $group) { + $fullUrl = $this->baseUrl . "v{$this->apiVersion}.php/cloud/users/$user/groups"; + $client = new Client(); + $options = []; + if ($this->currentUser === 'admin') { + $options['auth'] = $this->adminUser; + } + + $options['body'] = [ + 'groupid' => $group, + ]; + + $this->response = $client->send($client->createRequest("POST", $fullUrl, $options)); + } + + + public function groupExists($group) { + $fullUrl = $this->baseUrl . "v2.php/cloud/groups/$group"; + $client = new Client(); + $options = []; + $options['auth'] = $this->adminUser; + + $this->response = $client->get($fullUrl, $options); } /** * @Given /^group "([^"]*)" exists$/ */ - public function groupExists($group) { - $fullUrl = $this->baseUrl . "v2.php/cloud/groups/$group"; - $client = new Client(); - $options = []; - if ($this->currentUser === 'admin') { - $options['auth'] = $this->adminUser; + public function assureGroupExists($group) { + try { + $this->groupExists($group); + } catch (\GuzzleHttp\Exception\ClientException $ex) { + $previous_user = $this->currentUser; + $this->currentUser = "admin"; + $this->creatingTheGroup($group); + $this->currentUser = $previous_user; } - - $this->response = $client->get($fullUrl, $options); + $this->groupExists($group); PHPUnit_Framework_Assert::assertEquals(200, $this->response->getStatusCode()); } @@ -391,7 +498,17 @@ class FeatureContext extends BehatContext { public function groupDoesNotExist($group) { try { $this->groupExists($group); - PHPUnit_Framework_Assert::fail('The group "' . $group . '" exists'); + } catch (\GuzzleHttp\Exception\ClientException $ex) { + $this->response = $ex->getResponse(); + PHPUnit_Framework_Assert::assertEquals(404, $ex->getResponse()->getStatusCode()); + return; + } + $previous_user = $this->currentUser; + $this->currentUser = "admin"; + $this->deletingTheGroup($group); + $this->currentUser = $previous_user; + try { + $this->groupExists($group); } catch (\GuzzleHttp\Exception\ClientException $ex) { $this->response = $ex->getResponse(); PHPUnit_Framework_Assert::assertEquals(404, $ex->getResponse()->getStatusCode()); @@ -422,4 +539,69 @@ class FeatureContext extends BehatContext { $this->response = $ex->getResponse(); } } + + /** + * @When /^creating a public share with$/ + * @param \Behat\Gherkin\Node\TableNode|null $formData + */ + public function createPublicShare($body) { + $this->sendingToWith("POST", "/apps/files_sharing/api/v1/shares", $body); + $this->lastShareData = $this->response->xml(); + } + + /** + * @Then /^Public shared file "([^"]*)" can be downloaded$/ + */ + public function checkPublicSharedFile($filename) { + $client = new Client(); + $options = []; + $url = $this->lastShareData->data[0]->url; + $fullUrl = $url . "/download"; + $options['save_to'] = "./$filename"; + $this->response = $client->get($fullUrl, $options); + $finfo = new finfo; + $fileinfo = $finfo->file("./$filename", FILEINFO_MIME_TYPE); + PHPUnit_Framework_Assert::assertEquals($fileinfo, "text/plain"); + if (file_exists("./$filename")) { + unlink("./$filename"); + } + } + + /** + * @Then /^Public shared file "([^"]*)" with password "([^"]*)" can be downloaded$/ + */ + public function checkPublicSharedFileWithPassword($filename, $password) { + $client = new Client(); + $options = []; + $token = $this->lastShareData->data[0]->token; + $fullUrl = substr($this->baseUrl, 0, -4) . "public.php/webdav"; + $options['auth'] = [$token, $password]; + $options['save_to'] = "./$filename"; + $this->response = $client->get($fullUrl, $options); + $finfo = new finfo; + $fileinfo = $finfo->file("./$filename", FILEINFO_MIME_TYPE); + PHPUnit_Framework_Assert::assertEquals($fileinfo, "text/plain"); + if (file_exists("./$filename")) { + unlink("./$filename"); + } + } + + /** + * @When /^Adding expiration date to last share$/ + */ + public function addingExpirationDate() { + $share_id = $this->lastShareData->data[0]->id; + $fullUrl = $this->baseUrl . "v{$this->apiVersion}.php/apps/files_sharing/api/v{$this->apiVersion}/shares/$share_id"; + $client = new Client(); + $options = []; + if ($this->currentUser === 'admin') { + $options['auth'] = $this->adminUser; + } else { + $options['auth'] = [$this->currentUser, $this->regularUser]; + } + $date = date('Y-m-d', strtotime("+3 days")); + $options['body'] = ['expireDate' => $date]; + $this->response = $client->send($client->createRequest("PUT", $fullUrl, $options)); + PHPUnit_Framework_Assert::assertEquals(200, $this->response->getStatusCode()); + } } diff --git a/build/integration/features/sharing-v1.feature b/build/integration/features/sharing-v1.feature new file mode 100644 index 0000000000..ed5ac8930a --- /dev/null +++ b/build/integration/features/sharing-v1.feature @@ -0,0 +1,68 @@ +Feature: sharing + Background: + Given using api version "1" + + Scenario: Creating a new share with user + Given user "user0" exists + And user "user1" exists + And As an "user0" + When sending "POST" to "/apps/files_sharing/api/v1/shares" with + | path | welcome.txt | + | shareWith | user1 | + | shareType | 0 | + Then the OCS status code should be "100" + And the HTTP status code should be "200" + And user "user0" does not exist + And user "user1" does not exist + + Scenario: Creating a share with a group + Given user "user0" exists + And user "user1" exists + And group "sharing-group" exists + And As an "user0" + When sending "POST" to "/apps/files_sharing/api/v1/shares" with + | path | welcome.txt | + | shareWith | sharing-group | + | shareType | 1 | + Then the OCS status code should be "100" + And the HTTP status code should be "200" + And user "user0" does not exist + And user "user1" does not exist + And group "sharing-group" does not exist + + Scenario: Creating a new public share + Given user "user0" exists + And As an "user0" + When creating a public share with + | path | welcome.txt | + | shareType | 3 | + Then the OCS status code should be "100" + And the HTTP status code should be "200" + And Public shared file "welcome.txt" can be downloaded + And user "user0" does not exist + + Scenario: Creating a new public share with password + Given user "user0" exists + And As an "user0" + When creating a public share with + | path | welcome.txt | + | shareType | 3 | + | password | publicpw | + Then the OCS status code should be "100" + And the HTTP status code should be "200" + And Public shared file "welcome.txt" with password "publicpw" can be downloaded + And user "user0" does not exist + + Scenario: Creating a new public share with password and adding an expiration date + Given user "user0" exists + And As an "user0" + When creating a public share with + | path | welcome.txt | + | shareType | 3 | + | password | publicpw | + And Adding expiration date to last share + Then the OCS status code should be "100" + And the HTTP status code should be "200" + And Public shared file "welcome.txt" with password "publicpw" can be downloaded + And user "user0" does not exist +