aboutsummaryrefslogtreecommitdiffstats
path: root/build/integration/features/bootstrap/ExternalStorage.php
blob: b1e4c92810b1614d88f42c1f37eb7b48a9a6fb33 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
<?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);
	}
}