diff options
author | Sergio Bertolin <sbertolin@solidgear.es> | 2015-11-24 12:48:06 +0000 |
---|---|---|
committer | Thomas Müller <thomas.mueller@tmit.eu> | 2015-11-26 17:03:17 +0100 |
commit | 9d44576819911b7cf0761191135dbc4de7b617ec (patch) | |
tree | 1332338d1fdddd078bf54c2a877a4ae13e72f0ec /build/integration/features/bootstrap/Sharing.php | |
parent | 8fe878afe9af165b98470a75203df2f1b32cb68f (diff) | |
download | nextcloud-server-9d44576819911b7cf0761191135dbc4de7b617ec.tar.gz nextcloud-server-9d44576819911b7cf0761191135dbc4de7b617ec.zip |
Restructured FeatureContext to reuse some parts and run two servers in parallel
Diffstat (limited to 'build/integration/features/bootstrap/Sharing.php')
-rw-r--r-- | build/integration/features/bootstrap/Sharing.php | 374 |
1 files changed, 374 insertions, 0 deletions
diff --git a/build/integration/features/bootstrap/Sharing.php b/build/integration/features/bootstrap/Sharing.php new file mode 100644 index 00000000000..9c5dc9f374b --- /dev/null +++ b/build/integration/features/bootstrap/Sharing.php @@ -0,0 +1,374 @@ +<?php + +use Behat\Behat\Context\Context; +use Behat\Behat\Context\SnippetAcceptingContext; +use GuzzleHttp\Client; +use GuzzleHttp\Message\ResponseInterface; + +require __DIR__ . '/../../vendor/autoload.php'; + + + +trait Sharing{ + + /** @var int */ + private $sharingApiVersion = 1; + + /** @var SimpleXMLElement */ + private $lastShareData = null; + + /** + * @When /^creating a share with$/ + * @param \Behat\Gherkin\Node\TableNode|null $formData + */ + public function creatingShare($body) { + $fullUrl = $this->baseUrl . "v{$this->apiVersion}.php/apps/files_sharing/api/v1/shares"; + $client = new Client(); + $options = []; + if ($this->currentUser === 'admin') { + $options['auth'] = $this->adminUser; + } else { + $options['auth'] = [$this->currentUser, $this->regularUser]; + } + + if ($body instanceof \Behat\Gherkin\Node\TableNode) { + $fd = $body->getRowsHash(); + if (array_key_exists('expireDate', $fd)){ + $dateModification = $fd['expireDate']; + $fd['expireDate'] = date('Y-m-d', strtotime($dateModification)); + } + $options['body'] = $fd; + } + + try { + $this->response = $client->send($client->createRequest("POST", $fullUrl, $options)); + } catch (\GuzzleHttp\Exception\ClientException $ex) { + $this->response = $ex->getResponse(); + } + + $this->lastShareData = $this->response->xml(); + } + + /** + * @Then /^Public shared file "([^"]*)" can be downloaded$/ + */ + public function checkPublicSharedFile($filename) { + $client = new Client(); + $options = []; + if (count($this->lastShareData->data->element) > 0){ + $url = $this->lastShareData->data[0]->url; + } + else{ + $url = $this->lastShareData->data->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 = []; + if (count($this->lastShareData->data->element) > 0){ + $token = $this->lastShareData->data[0]->token; + } + else{ + $token = $this->lastShareData->data->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->sharingApiVersion}/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()); + } + + /** + * @When /^Updating last share with$/ + * @param \Behat\Gherkin\Node\TableNode|null $body + */ + public function updatingLastShare($body) { + $share_id = $this->lastShareData->data[0]->id; + $fullUrl = $this->baseUrl . "v{$this->apiVersion}.php/apps/files_sharing/api/v{$this->sharingApiVersion}/shares/$share_id"; + $client = new Client(); + $options = []; + if ($this->currentUser === 'admin') { + $options['auth'] = $this->adminUser; + } else { + $options['auth'] = [$this->currentUser, $this->regularUser]; + } + + if ($body instanceof \Behat\Gherkin\Node\TableNode) { + $fd = $body->getRowsHash(); + if (array_key_exists('expireDate', $fd)){ + $dateModification = $fd['expireDate']; + $fd['expireDate'] = date('Y-m-d', strtotime($dateModification)); + } + $options['body'] = $fd; + } + + try { + $this->response = $client->send($client->createRequest("PUT", $fullUrl, $options)); + } catch (\GuzzleHttp\Exception\ClientException $ex) { + $this->response = $ex->getResponse(); + } + + PHPUnit_Framework_Assert::assertEquals(200, $this->response->getStatusCode()); + } + + public function createShare($user, + $path = null, + $shareType = null, + $shareWith = null, + $publicUpload = null, + $password = null, + $permissions = null){ + $fullUrl = $this->baseUrl . "v{$this->apiVersion}.php/apps/files_sharing/api/v{$this->sharingApiVersion}/shares"; + $client = new Client(); + $options = []; + + if ($user === 'admin') { + $options['auth'] = $this->adminUser; + } else { + $options['auth'] = [$user, $this->regularUser]; + } + $fd = []; + if (!is_null($path)){ + $fd['path'] = $path; + } + if (!is_null($shareType)){ + $fd['shareType'] = $shareType; + } + if (!is_null($shareWith)){ + $fd['shareWith'] = $shareWith; + } + if (!is_null($publicUpload)){ + $fd['publicUpload'] = $publicUpload; + } + if (!is_null($password)){ + $fd['password'] = $password; + } + if (!is_null($permissions)){ + $fd['permissions'] = $permissions; + } + + $options['body'] = $fd; + + try { + $this->response = $client->send($client->createRequest("POST", $fullUrl, $options)); + $this->lastShareData = $this->response->xml(); + } catch (\GuzzleHttp\Exception\ClientException $ex) { + $this->response = $ex->getResponse(); + } + } + + public function isFieldInResponse($field, $contentExpected){ + $data = $this->response->xml()->data[0]; + if ((string)$field == 'expiration'){ + $contentExpected = date('Y-m-d', strtotime($contentExpected)) . " 00:00:00"; + } + if (count($data->element) > 0){ + foreach($data as $element) { + if ($contentExpected == "A_TOKEN"){ + return (strlen((string)$element->$field) == 15); + } + elseif ($contentExpected == "A_NUMBER"){ + return is_numeric((string)$element->$field); + } + elseif($contentExpected == "AN_URL"){ + return $this->isExpectedUrl((string)$element->$field, "index.php/s/"); + } + elseif ((string)$element->$field == $contentExpected){ + return True; + } + } + + return False; + } else { + if ($contentExpected == "A_TOKEN"){ + return (strlen((string)$data->$field) == 15); + } + elseif ($contentExpected == "A_NUMBER"){ + return is_numeric((string)$data->$field); + } + elseif($contentExpected == "AN_URL"){ + return $this->isExpectedUrl((string)$data->$field, "index.php/s/"); + } + elseif ($data->$field == $contentExpected){ + return True; + } + return False; + } + } + + /** + * @Then /^File "([^"]*)" should be included in the response$/ + */ + public function checkSharedFileInResponse($filename){ + PHPUnit_Framework_Assert::assertEquals(True, $this->isFieldInResponse('file_target', "/$filename")); + } + + /** + * @Then /^File "([^"]*)" should not be included in the response$/ + */ + public function checkSharedFileNotInResponse($filename){ + PHPUnit_Framework_Assert::assertEquals(False, $this->isFieldInResponse('file_target', "/$filename")); + } + + /** + * @Then /^User "([^"]*)" should be included in the response$/ + */ + public function checkSharedUserInResponse($user){ + PHPUnit_Framework_Assert::assertEquals(True, $this->isFieldInResponse('share_with', "$user")); + } + + /** + * @Then /^User "([^"]*)" should not be included in the response$/ + */ + public function checkSharedUserNotInResponse($user){ + PHPUnit_Framework_Assert::assertEquals(False, $this->isFieldInResponse('share_with', "$user")); + } + + public function isUserOrGroupInSharedData($userOrGroup){ + $data = $this->response->xml()->data[0]; + foreach($data as $element) { + if ($element->share_with == $userOrGroup){ + return True; + } + } + return False; + } + + /** + * @Given /^file "([^"]*)" from user "([^"]*)" is shared with user "([^"]*)"$/ + */ + public function assureFileIsShared($filepath, $user1, $user2){ + $fullUrl = $this->baseUrl . "v{$this->apiVersion}.php/apps/files_sharing/api/v{$this->sharingApiVersion}/shares" . "?path=$filepath"; + $client = new Client(); + $options = []; + if ($user1 === 'admin') { + $options['auth'] = $this->adminUser; + } else { + $options['auth'] = [$user1, $this->regularUser]; + } + $this->response = $client->get($fullUrl, $options); + if ($this->isUserOrGroupInSharedData($user2)){ + return; + } else { + $this->createShare($user1, $filepath, 0, $user2, null, null, null); + } + $this->response = $client->get($fullUrl, $options); + PHPUnit_Framework_Assert::assertEquals(True, $this->isUserOrGroupInSharedData($user2)); + } + + /** + * @Given /^file "([^"]*)" from user "([^"]*)" is shared with group "([^"]*)"$/ + */ + public function assureFileIsSharedWithGroup($filepath, $user, $group){ + $fullUrl = $this->baseUrl . "v{$this->apiVersion}.php/apps/files_sharing/api/v{$this->sharingApiVersion}/shares" . "?path=$filepath"; + $client = new Client(); + $options = []; + if ($user === 'admin') { + $options['auth'] = $this->adminUser; + } else { + $options['auth'] = [$user, $this->regularUser]; + } + $this->response = $client->get($fullUrl, $options); + if ($this->isUserOrGroupInSharedData($group)){ + return; + } else { + $this->createShare($user, $filepath, 1, $group, null, null, null); + } + $this->response = $client->get($fullUrl, $options); + PHPUnit_Framework_Assert::assertEquals(True, $this->isUserOrGroupInSharedData($group)); + } + + /** + * @When /^Deleting last share$/ + */ + public function deletingLastShare(){ + $share_id = $this->lastShareData->data[0]->id; + $url = "/apps/files_sharing/api/v{$this->sharingApiVersion}/shares/$share_id"; + $this->sendingToWith("DELETE", $url, null); + } + + /** + * @When /^Getting info of last share$/ + */ + public function gettingInfoOfLastShare(){ + $share_id = $this->lastShareData->data[0]->id; + $url = "/apps/files_sharing/api/v{$this->sharingApiVersion}/shares/$share_id"; + $this->sendingToWith("GET", $url, null); + } + + /** + * @Then /^last share_id is included in the answer$/ + */ + public function checkingLastShareIDIsIncluded(){ + $share_id = $this->lastShareData->data[0]->id; + if (!$this->isFieldInResponse('id', $share_id)){ + PHPUnit_Framework_Assert::fail("Share id $share_id not found in response"); + } + } + + /** + * @Then /^last share_id is not included in the answer$/ + */ + public function checkingLastShareIDIsNotIncluded(){ + $share_id = $this->lastShareData->data[0]->id; + if ($this->isFieldInResponse('id', $share_id)){ + PHPUnit_Framework_Assert::fail("Share id $share_id has been found in response"); + } + } + + /** + * @Then /^Share fields of last share match with$/ + * @param \Behat\Gherkin\Node\TableNode|null $formData + */ + public function checkShareFields($body){ + if ($body instanceof \Behat\Gherkin\Node\TableNode) { + $fd = $body->getRowsHash(); + + foreach($fd as $field => $value) { + if (!$this->isFieldInResponse($field, $value)){ + PHPUnit_Framework_Assert::fail("$field" . " doesn't have value " . "$value"); + } + } + } + } + +} + |