123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122 |
- <?php
- /**
- * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
- * SPDX-License-Identifier: AGPL-3.0-or-later
- */
- use Behat\Gherkin\Node\TableNode;
- use PHPUnit\Framework\Assert;
- require __DIR__ . '/../../vendor/autoload.php';
- trait ExternalStorage {
- private array $storageIds = [];
- private array $lastExternalStorageData;
- /**
- * @AfterScenario
- **/
- public function deleteCreatedStorages(): void {
- foreach ($this->storageIds as $storageId) {
- $this->deleteStorage($storageId);
- }
- $this->storageIds = [];
- }
- private function deleteStorage(string $storageId): void {
- // Based on "runOcc" from CommandLine trait
- $args = ['files_external:delete', '--yes', $storageId];
- $args = array_map(function ($arg) {
- return escapeshellarg($arg);
- }, $args);
- $args[] = '--no-ansi --no-warnings';
- $args = implode(' ', $args);
- $descriptor = [
- 0 => ['pipe', 'r'],
- 1 => ['pipe', 'w'],
- 2 => ['pipe', 'w'],
- ];
- $process = proc_open('php console.php ' . $args, $descriptor, $pipes, $ocPath = '../..');
- $lastStdOut = stream_get_contents($pipes[1]);
- proc_close($process);
- }
- /**
- * @When logged in user creates external global storage
- *
- * @param TableNode $fields
- */
- public function loggedInUserCreatesExternalGlobalStorage(TableNode $fields): void {
- $this->sendJsonWithRequestTokenAndBasicAuth('POST', '/index.php/apps/files_external/globalstorages', $fields);
- $this->theHTTPStatusCodeShouldBe('201');
- $this->lastExternalStorageData = json_decode($this->response->getBody(), $asAssociativeArray = true);
- $this->storageIds[] = $this->lastExternalStorageData['id'];
- }
- /**
- * @When logged in user updates last external userglobal storage
- *
- * @param TableNode $fields
- */
- public function loggedInUserUpdatesLastExternalUserglobalStorage(TableNode $fields): void {
- $this->sendJsonWithRequestTokenAndBasicAuth('PUT', '/index.php/apps/files_external/userglobalstorages/' . $this->lastExternalStorageData['id'], $fields);
- $this->theHTTPStatusCodeShouldBe('200');
- $this->lastExternalStorageData = json_decode($this->response->getBody(), $asAssociativeArray = true);
- }
- /**
- * @Then fields of last external storage match with
- *
- * @param TableNode $fields
- */
- public function fieldsOfLastExternalStorageMatchWith(TableNode $fields): void {
- foreach ($fields->getRowsHash() as $expectedField => $expectedValue) {
- if (!array_key_exists($expectedField, $this->lastExternalStorageData)) {
- Assert::fail("$expectedField was not found in response");
- }
- Assert::assertEquals($expectedValue, $this->lastExternalStorageData[$expectedField], "Field '$expectedField' does not match ({$this->lastExternalStorageData[$expectedField]})");
- }
- }
- private function sendJsonWithRequestToken(string $method, string $url, TableNode $fields): void {
- $isFirstField = true;
- $fieldsAsJsonString = '{';
- foreach ($fields->getRowsHash() as $key => $value) {
- $fieldsAsJsonString .= ($isFirstField ? '' : ',') . '"' . $key . '":' . $value;
- $isFirstField = false;
- }
- $fieldsAsJsonString .= '}';
- $body = [
- 'headers' => [
- 'Content-Type' => 'application/json',
- ],
- 'body' => $fieldsAsJsonString,
- ];
- $this->sendingAToWithRequesttoken($method, $url, $body);
- }
- private function sendJsonWithRequestTokenAndBasicAuth(string $method, string $url, TableNode $fields): void {
- $isFirstField = true;
- $fieldsAsJsonString = '{';
- foreach ($fields->getRowsHash() as $key => $value) {
- $fieldsAsJsonString .= ($isFirstField ? '' : ',') . '"' . $key . '":' . $value;
- $isFirstField = false;
- }
- $fieldsAsJsonString .= '}';
- $body = [
- 'headers' => [
- 'Content-Type' => 'application/json',
- 'Authorization' => 'Basic ' . base64_encode('admin:admin'),
- ],
- 'body' => $fieldsAsJsonString,
- ];
- $this->sendingAToWithRequesttoken($method, $url, $body);
- }
- }
|