From 5e17cde10fd15dc816a01da79cff40a3588a308b Mon Sep 17 00:00:00 2001 From: shimon Date: Wed, 25 Oct 2023 15:57:03 +0300 Subject: [PATCH] usage test --- tests/e2e/General/UsageTest.php | 885 +++++++++++++++----------------- 1 file changed, 414 insertions(+), 471 deletions(-) diff --git a/tests/e2e/General/UsageTest.php b/tests/e2e/General/UsageTest.php index cd5ddb07b8..77426a3830 100644 --- a/tests/e2e/General/UsageTest.php +++ b/tests/e2e/General/UsageTest.php @@ -2,16 +2,15 @@ namespace Tests\E2E\General; -use Appwrite\Tests\Retry; use Tests\E2E\Client; use Tests\E2E\Scopes\ProjectCustom; use Tests\E2E\Scopes\Scope; use Tests\E2E\Scopes\SideServer; use CURLFile; use Tests\E2E\Services\Functions\FunctionsBase; -use Utopia\Database\DateTime; use Utopia\Database\Helpers\Permission; use Utopia\Database\Helpers\Role; +use Utopia\Database\Validator\Datetime as DatetimeValidator; class UsageTest extends Scope { @@ -19,11 +18,12 @@ class UsageTest extends Scope use SideServer; use FunctionsBase; - protected string $projectId; - private int $requestsCount; - private int $usersCount; + private const WAIT = 35; + private const CREATE = 20; - protected function setUp(): void + protected string $projectId; + + public function setUp(): void { parent::setUp(); } @@ -45,147 +45,149 @@ class UsageTest extends Scope $headers['x-appwrite-key'] = $project['apiKey']; $headers['content-type'] = 'application/json'; - $usersCount = 0; - $requestsCount = 0; - for ($i = 0; $i < 10; $i++) { + $usersTotal = 0; + $requestsTotal = 0; + for ($i = 0; $i < self::CREATE; $i++) { $email = uniqid() . 'user@usage.test'; $password = 'password'; $name = uniqid() . 'User'; - $res = $this->client->call(Client::METHOD_POST, '/users', $headers, [ - 'userId' => 'unique()', - 'email' => $email, - 'password' => $password, - 'name' => $name, - ]); + $res = $this->client->call( + Client::METHOD_POST, + '/users', + $headers, + [ + 'userId' => 'unique()', + 'email' => $email, + 'password' => $password, + 'name' => $name, + ] + ); + $this->assertEquals($email, $res['body']['email']); $this->assertNotEmpty($res['body']['$id']); - $usersCount++; - $requestsCount++; + $usersTotal++; + $requestsTotal++; - if ($i < 5) { + if ($i < (self::CREATE / 2)) { $userId = $res['body']['$id']; - $res = $this->client->call(Client::METHOD_GET, '/users/' . $userId, $headers); - $this->assertEquals($userId, $res['body']['$id']); $res = $this->client->call(Client::METHOD_DELETE, '/users/' . $userId, $headers); $this->assertEmpty($res['body']); - $requestsCount += 2; - $usersCount--; + $requestsTotal++; + $usersTotal--; } } return [ - 'projectId' => $projectId, - 'headers' => $headers, - 'usersCount' => $usersCount, - 'requestsCount' => $requestsCount + 'projectId' => $projectId, + 'headers' => $headers, + 'usersTotal' => $usersTotal, + 'requestsTotal' => $requestsTotal ]; } /** * @depends testPrepareUsersStats */ - #[Retry(count: 1)] public function testUsersStats(array $data): array { - sleep(20); + sleep(self::WAIT); - $projectId = $data['projectId']; - $headers = $data['headers']; - $usersCount = $data['usersCount']; - $requestsCount = $data['requestsCount']; + $projectId = $data['projectId']; + $headers = $data['headers']; + $usersTotal = $data['usersTotal']; + $requestsTotal = $data['requestsTotal']; - //console request - $headers = [ - 'origin' => 'http:localhost', + $consoleHeaders = [ + 'origin' => 'http://localhost', 'x-appwrite-project' => 'console', 'cookie' => 'a_session_console=' . $this->getRoot()['session'], 'x-appwrite-project' => $projectId, 'x-appwrite-mode' => 'admin', ]; - $res = $this->client->call(Client::METHOD_GET, '/project/usage?range=30d', $headers); + $res = $this->client->call( + Client::METHOD_GET, + '/project/usage?range=24h', + $consoleHeaders + ); $res = $res['body']; + $this->assertEquals('24h', $res['range']); $this->assertEquals(9, count($res)); - $this->assertEquals(30, count($res['requests'])); - $this->assertEquals(30, count($res['users'])); - $this->assertEquals($usersCount, $res['users'][array_key_last($res['users'])]['value']); - $this->validateDates($res['users']); - $this->assertEquals($requestsCount, $res['requests'][array_key_last($res['requests'])]['value']); - $this->validateDates($res['requests']); + $this->assertEquals(24, count($res['requestsTotal'])); + $this->assertEquals(24, count($res['usersTotal'])); + $this->assertEquals($usersTotal, $res['usersTotal'][array_key_last($res['usersTotal'])]['value']); + $this->validateDates($res['usersTotal']); + $this->assertEquals($requestsTotal, $res['requestsTotal'][array_key_last($res['requestsTotal'])]['value']); + $this->validateDates($res['requestsTotal']); + + $res = $this->client->call( + Client::METHOD_GET, + '/users/usage?range=90d', + $consoleHeaders + ); - $res = $this->client->call(Client::METHOD_GET, '/users/usage?range=30d', array_merge($headers, [ - 'x-appwrite-project' => $projectId, - 'x-appwrite-mode' => 'admin' - ])); - $requestsCount++; $res = $res['body']; - $this->assertEquals(10, $res['usersCreate'][array_key_last($res['usersCreate'])]['value']); - $this->validateDates($res['usersCreate']); - $this->assertEquals(5, $res['usersRead'][array_key_last($res['usersRead'])]['value']); - $this->validateDates($res['usersRead']); - $this->assertEquals(5, $res['usersDelete'][array_key_last($res['usersDelete'])]['value']); - $this->validateDates($res['usersDelete']); + $this->assertEquals('90d', $res['range']); + $this->assertEquals(90, count($res['usersTotal'])); + $this->assertEquals(90, count($res['sessionsTotal'])); + $this->assertEquals((self::CREATE / 2), $res['usersTotal'][array_key_last($res['usersTotal'])]['value']); - return ['projectId' => $projectId, 'headers' => $headers, 'requestsCount' => $requestsCount]; + return [ + 'projectId' => $projectId, + 'headers' => $headers, + 'consoleHeaders' => $consoleHeaders, + 'requestsTotal' => $requestsTotal, + ]; } /** @depends testUsersStats */ public function testPrepareStorageStats(array $data): array { - $projectId = $data['projectId']; $headers = $data['headers']; - - $bucketId = ''; - $bucketsCount = 0; - $requestsCount = $data['requestsCount']; + $bucketsTotal = 0; + $requestsTotal = $data['requestsTotal']; $storageTotal = 0; - $bucketsCreate = 0; - $bucketsDelete = 0; - $bucketsRead = 0; - $filesCount = 0; - $filesRead = 0; - $filesCreate = 0; - $filesDelete = 0; + $filesTotal = 0; - for ($i = 0; $i < 10; $i++) { + + for ($i = 0; $i < self::CREATE; $i++) { $name = uniqid() . ' bucket'; - $res = $this->client->call(Client::METHOD_POST, '/storage/buckets', \array_merge($headers, [ - 'content-type' => 'application/json' - ]), [ - 'bucketId' => 'unique()', - 'name' => $name, - 'fileSecurity' => false, - 'permissions' => [ - Permission::read(Role::any()), - Permission::create(Role::any()), - Permission::update(Role::any()), - Permission::delete(Role::any()), - ], - ]); + $res = $this->client->call( + Client::METHOD_POST, + '/storage/buckets', + $headers, + [ + 'bucketId' => 'unique()', + 'name' => $name, + 'fileSecurity' => false, + 'permissions' => [ + Permission::read(Role::any()), + Permission::create(Role::any()), + Permission::update(Role::any()), + Permission::delete(Role::any()), + ], + ] + ); $this->assertEquals($name, $res['body']['name']); $this->assertNotEmpty($res['body']['$id']); $bucketId = $res['body']['$id']; + $bucketsTotal++; + $requestsTotal++; - $bucketsCreate++; - $bucketsCount++; - $requestsCount++; - - if ($i < 5) { - $res = $this->client->call(Client::METHOD_GET, '/storage/buckets/' . $bucketId, $headers); - $this->assertEquals($bucketId, $res['body']['$id']); - $bucketsRead++; - - $res = $this->client->call(Client::METHOD_DELETE, '/storage/buckets/' . $bucketId, $headers); + if ($i < (self::CREATE / 2)) { + $res = $this->client->call( + Client::METHOD_DELETE, + '/storage/buckets/' . $bucketId, + $headers + ); $this->assertEmpty($res['body']); - $bucketsDelete++; - - $requestsCount += 2; - $bucketsCount--; + $requestsTotal++; + $bucketsTotal--; } } - //upload some files + // upload some files $files = [ [ 'path' => realpath(__DIR__ . '/../../resources/logo.png'), @@ -205,129 +207,112 @@ class UsageTest extends Scope ], ]; - for ($i = 0; $i < 10; $i++) { + for ($i = 0; $i < self::CREATE; $i++) { $file = $files[$i % count($files)]; - $res = $this->client->call(Client::METHOD_POST, '/storage/buckets/' . $bucketId . '/files', array_merge($headers, ['content-type' => 'multipart/form-data']), [ - 'fileId' => 'unique()', - 'file' => new CURLFile($file['path'], '', $file['name']), - ]); + + $res = $this->client->call( + Client::METHOD_POST, + '/storage/buckets/' . $bucketId . '/files', + array_merge($headers, ['content-type' => 'multipart/form-data']), + [ + 'fileId' => 'unique()', + 'file' => new CURLFile($file['path'], '', $file['name']), + ] + ); + $this->assertNotEmpty($res['body']['$id']); $fileSize = $res['body']['sizeOriginal']; $storageTotal += $fileSize; - $filesCount++; - $filesCreate++; - $requestsCount++; + $filesTotal++; + $requestsTotal++; $fileId = $res['body']['$id']; - if ($i < 5) { - $res = $this->client->call(Client::METHOD_GET, '/storage/buckets/' . $bucketId . '/files/' . $fileId, $headers); - $this->assertEquals($fileId, $res['body']['$id']); - $filesRead++; - - $res = $this->client->call(Client::METHOD_DELETE, '/storage/buckets/' . $bucketId . '/files/' . $fileId, $headers); + if ($i < (self::CREATE / 2)) { + $res = $this->client->call( + Client::METHOD_DELETE, + '/storage/buckets/' . $bucketId . '/files/' . $fileId, + $headers + ); $this->assertEmpty($res['body']); - $filesDelete++; - $requestsCount += 2; - $filesCount--; + $requestsTotal++; + $filesTotal--; $storageTotal -= $fileSize; } } return array_merge($data, [ 'bucketId' => $bucketId, - 'bucketsCount' => $bucketsCount, - 'requestsCount' => $requestsCount, + 'bucketsTotal' => $bucketsTotal, + 'requestsTotal' => $requestsTotal, 'storageTotal' => $storageTotal, - 'bucketsCreate' => $bucketsCreate, - 'bucketsDelete' => $bucketsDelete, - 'bucketsRead' => $bucketsRead, - 'filesCount' => $filesCount, - 'filesRead' => $filesRead, - 'filesCreate' => $filesCreate, - 'filesDelete' => $filesDelete, + 'filesTotal' => $filesTotal, ]); } /** * @depends testPrepareStorageStats */ - #[Retry(count: 1)] public function testStorageStats(array $data): array { - $projectId = $data['projectId']; - $bucketId = $data['bucketId']; - $bucketsCount = $data['bucketsCount']; - $requestsCount = $data['requestsCount']; - $storageTotal = $data['storageTotal']; - $bucketsCreate = $data['bucketsCreate']; - $bucketsDelete = $data['bucketsDelete']; - $bucketsRead = $data['bucketsRead']; - $filesCount = $data['filesCount']; - $filesRead = $data['filesRead']; - $filesCreate = $data['filesCreate']; - $filesDelete = $data['filesDelete']; + $bucketId = $data['bucketId']; + $bucketsTotal = $data['bucketsTotal']; + $requestsTotal = $data['requestsTotal']; + $storageTotal = $data['storageTotal']; + $filesTotal = $data['filesTotal']; - sleep(20); + sleep(self::WAIT); - //console request - $headers = [ - 'origin' => 'http:localhost', - 'x-appwrite-project' => 'console', - 'cookie' => 'a_session_console=' . $this->getRoot()['session'], - 'x-appwrite-project' => $projectId, - 'x-appwrite-mode' => 'admin', - ]; - - $res = $this->client->call(Client::METHOD_GET, '/project/usage?range=30d', $headers); + $res = $this->client->call( + Client::METHOD_GET, + '/project/usage?range=30d', + array_merge( + $data['headers'], + $data['consoleHeaders'] + ) + ); $res = $res['body']; $this->assertEquals(9, count($res)); - $this->assertEquals(30, count($res['requests'])); - $this->assertEquals(30, count($res['storage'])); - $this->assertEquals($requestsCount, $res['requests'][array_key_last($res['requests'])]['value']); - $this->validateDates($res['requests']); - $this->assertEquals($storageTotal, $res['storage'][array_key_last($res['storage'])]['value']); - $this->validateDates($res['storage']); + $this->assertEquals(30, count($res['requestsTotal'])); + $this->assertEquals(30, count($res['filesStorage'])); + $this->assertEquals($requestsTotal, $res['requestsTotal'][array_key_last($res['requestsTotal'])]['value']); + $this->validateDates($res['requestsTotal']); + $this->assertEquals($storageTotal, $res['filesStorage'][array_key_last($res['filesStorage'])]['value']); + $this->validateDates($res['filesStorage']); - $res = $this->client->call(Client::METHOD_GET, '/storage/usage?range=30d', array_merge($headers, [ - 'x-appwrite-project' => $projectId, - 'x-appwrite-mode' => 'admin' - ])); - $requestsCount++; - $res = $res['body']; - $this->assertEquals($storageTotal, $res['storage'][array_key_last($res['storage'])]['value']); - $this->validateDates($res['storage']); - $this->assertEquals($bucketsCount, $res['bucketsCount'][array_key_last($res['bucketsCount'])]['value']); - $this->validateDates($res['bucketsCount']); - $this->assertEquals($bucketsRead, $res['bucketsRead'][array_key_last($res['bucketsRead'])]['value']); - $this->validateDates($res['bucketsRead']); - $this->assertEquals($bucketsCreate, $res['bucketsCreate'][array_key_last($res['bucketsCreate'])]['value']); - $this->validateDates($res['bucketsCreate']); - $this->assertEquals($bucketsDelete, $res['bucketsDelete'][array_key_last($res['bucketsDelete'])]['value']); - $this->validateDates($res['bucketsDelete']); - $this->assertEquals($filesCount, $res['filesCount'][array_key_last($res['filesCount'])]['value']); - $this->validateDates($res['filesCount']); - $this->assertEquals($filesRead, $res['filesRead'][array_key_last($res['filesRead'])]['value']); - $this->validateDates($res['filesRead']); - $this->assertEquals($filesCreate, $res['filesCreate'][array_key_last($res['filesCreate'])]['value']); - $this->validateDates($res['filesCreate']); - $this->assertEquals($filesDelete, $res['filesDelete'][array_key_last($res['filesDelete'])]['value']); - $this->validateDates($res['filesDelete']); + $res = $this->client->call( + Client::METHOD_GET, + '/storage/usage?range=30d', + array_merge( + $data['headers'], + $data['consoleHeaders'] + ) + ); - $res = $this->client->call(Client::METHOD_GET, '/storage/' . $bucketId . '/usage?range=30d', array_merge($headers, [ - 'x-appwrite-project' => $projectId, - 'x-appwrite-mode' => 'admin' - ])); - $requestsCount++; $res = $res['body']; $this->assertEquals($storageTotal, $res['filesStorage'][array_key_last($res['filesStorage'])]['value']); - $this->assertEquals($filesCount, $res['filesCount'][array_key_last($res['filesCount'])]['value']); - $this->assertEquals($filesRead, $res['filesRead'][array_key_last($res['filesRead'])]['value']); - $this->assertEquals($filesCreate, $res['filesCreate'][array_key_last($res['filesCreate'])]['value']); - $this->assertEquals($filesDelete, $res['filesDelete'][array_key_last($res['filesDelete'])]['value']); + $this->validateDates($res['filesStorage']); + $this->assertEquals($bucketsTotal, $res['bucketsTotal'][array_key_last($res['bucketsTotal'])]['value']); + $this->validateDates($res['bucketsTotal']); + $this->assertEquals($filesTotal, $res['filesTotal'][array_key_last($res['filesTotal'])]['value']); + $this->validateDates($res['filesTotal']); + + $res = $this->client->call( + Client::METHOD_GET, + '/storage/' . $bucketId . '/usage?range=30d', + array_merge( + $data['headers'], + $data['consoleHeaders'] + ) + ); + + $res = $res['body']; + $this->assertEquals($storageTotal, $res['filesStorage'][array_key_last($res['filesStorage'])]['value']); + $this->assertEquals($filesTotal, $res['filesTotal'][array_key_last($res['filesTotal'])]['value']); + + $data['requestsTotal'] = $requestsTotal; - $data['requestsCount'] = $requestsCount; return $data; } @@ -335,282 +320,206 @@ class UsageTest extends Scope public function testPrepareDatabaseStats(array $data): array { $headers = $data['headers']; - $projectId = $data['projectId']; - $databaseId = ''; - $collectionId = ''; + $requestsTotal = $data['requestsTotal']; + $databasesTotal = 0; + $collectionsTotal = 0; + $documentsTotal = 0; - $requestsCount = $data['requestsCount']; - $databasesCount = 0; - $databasesCreate = 0; - $databasesRead = 0; - $databasesDelete = 0; - - $collectionsCount = 0; - $collectionsCreate = 0; - $collectionsRead = 0; - $collectionsUpdate = 0; - $collectionsDelete = 0; - - $documentsCount = 0; - $documentsCreate = 0; - $documentsRead = 0; - $documentsDelete = 0; - - for ($i = 0; $i < 10; $i++) { + for ($i = 0; $i < self::CREATE; $i++) { $name = uniqid() . ' database'; - $res = $this->client->call(Client::METHOD_POST, '/databases', $headers, [ - 'databaseId' => 'unique()', - 'name' => $name, - ]); + $res = $this->client->call( + Client::METHOD_POST, + '/databases', + $headers, + [ + 'databaseId' => 'unique()', + 'name' => $name, + ] + ); + + $this->assertEquals($name, $res['body']['name']); $this->assertNotEmpty($res['body']['$id']); $databaseId = $res['body']['$id']; - $requestsCount++; - $databasesCount++; - $databasesCreate++; + $requestsTotal++; + $databasesTotal++; - if ($i < 5) { - $res = $this->client->call(Client::METHOD_GET, '/databases/' . $databaseId, $headers); - $this->assertEquals($databaseId, $res['body']['$id']); - $databasesRead++; - - $res = $this->client->call(Client::METHOD_DELETE, '/databases/' . $databaseId, $headers); + if ($i < (self::CREATE / 2)) { + $res = $this->client->call( + Client::METHOD_DELETE, + '/databases/' . $databaseId, + $headers + ); $this->assertEmpty($res['body']); - $databasesDelete++; - $databasesCount--; - $requestsCount += 2; + $databasesTotal--; + $requestsTotal++; } } - for ($i = 0; $i < 10; $i++) { + for ($i = 0; $i < self::CREATE; $i++) { $name = uniqid() . ' collection'; - $res = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/collections', $headers, [ - 'collectionId' => 'unique()', - 'name' => $name, - 'documentSecurity' => false, - 'permissions' => [ - Permission::read(Role::any()), - Permission::create(Role::any()), - Permission::update(Role::any()), - Permission::delete(Role::any()), - ], - ]); + $res = $this->client->call( + Client::METHOD_POST, + '/databases/' . $databaseId . '/collections', + $headers, + [ + 'collectionId' => 'unique()', + 'name' => $name, + 'documentSecurity' => false, + 'permissions' => [ + Permission::read(Role::any()), + Permission::create(Role::any()), + Permission::update(Role::any()), + Permission::delete(Role::any()), + ], + ] + ); + $this->assertEquals($name, $res['body']['name']); $this->assertNotEmpty($res['body']['$id']); $collectionId = $res['body']['$id']; - $requestsCount++; - $collectionsCount++; - $collectionsCreate++; + $requestsTotal++; + $collectionsTotal++; - if ($i < 5) { - $res = $this->client->call(Client::METHOD_GET, '/databases/' . $databaseId . '/collections/' . $collectionId, $headers); - $this->assertEquals($collectionId, $res['body']['$id']); - $collectionsRead++; - - $res = $this->client->call(Client::METHOD_DELETE, '/databases/' . $databaseId . '/collections/' . $collectionId, $headers); + if ($i < (self::CREATE / 2)) { + $res = $this->client->call( + Client::METHOD_DELETE, + '/databases/' . $databaseId . '/collections/' . $collectionId, + $headers + ); $this->assertEmpty($res['body']); - $collectionsDelete++; - - $collectionsCount--; - $requestsCount += 2; + $collectionsTotal--; + $requestsTotal++; } } - $res = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes' . '/string', $headers, [ - 'key' => 'name', - 'size' => 255, - 'required' => true, - ]); - $this->assertEquals('name', $res['body']['key']); - $collectionsUpdate++; - $requestsCount++; - sleep(20); + $res = $this->client->call( + Client::METHOD_POST, + '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes' . '/string', + $headers, + [ + 'key' => 'name', + 'size' => 255, + 'required' => true, + ] + ); - for ($i = 0; $i < 10; $i++) { + $this->assertEquals('name', $res['body']['key']); + $requestsTotal++; + + sleep(self::WAIT); + + for ($i = 0; $i < self::CREATE; $i++) { $name = uniqid() . ' collection'; - $res = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/collections/' . $collectionId . '/documents', $headers, [ - 'documentId' => 'unique()', - 'data' => ['name' => $name] - ]); + $res = $this->client->call( + Client::METHOD_POST, + '/databases/' . $databaseId . '/collections/' . $collectionId . '/documents', + $headers, + [ + 'documentId' => 'unique()', + 'data' => ['name' => $name] + ] + ); $this->assertEquals($name, $res['body']['name']); $this->assertNotEmpty($res['body']['$id']); $documentId = $res['body']['$id']; - $requestsCount++; - $documentsCount++; - $documentsCreate++; + $requestsTotal++; + $documentsTotal++; - if ($i < 5) { - $res = $this->client->call(Client::METHOD_GET, '/databases/' . $databaseId . '/collections/' . $collectionId . '/documents/' . $documentId, $headers); - $this->assertEquals($documentId, $res['body']['$id']); - $documentsRead++; - - $res = $this->client->call(Client::METHOD_DELETE, '/databases/' . $databaseId . '/collections/' . $collectionId . '/documents/' . $documentId, $headers); + if ($i < (self::CREATE / 2)) { + $res = $this->client->call( + Client::METHOD_DELETE, + '/databases/' . $databaseId . '/collections/' . $collectionId . '/documents/' . $documentId, + $headers + ); $this->assertEmpty($res['body']); - $documentsDelete++; - - $documentsCount--; - $requestsCount += 2; + $documentsTotal--; + $requestsTotal++; } } - $data = array_merge($data, [ + return array_merge($data, [ 'databaseId' => $databaseId, 'collectionId' => $collectionId, - - 'requestsCount' => $requestsCount, - 'databasesCount' => $databasesCount, - 'databasesCreate' => $databasesCreate, - 'databasesRead' => $databasesRead, - 'databasesDelete' => $databasesDelete, - - 'collectionsCount' => $collectionsCount, - 'collectionsCreate' => $collectionsCreate, - 'collectionsRead' => $collectionsRead, - 'collectionsUpdate' => $collectionsUpdate, - 'collectionsDelete' => $collectionsDelete, - - 'documentsCount' => $documentsCount, - 'documentsCreate' => $documentsCreate, - 'documentsRead' => $documentsRead, - 'documentsDelete' => $documentsDelete, + 'requestsTotal' => $requestsTotal, + 'databasesTotal' => $databasesTotal, + 'collectionsTotal' => $collectionsTotal, + 'documentsTotal' => $documentsTotal, ]); - - return $data; } /** @depends testPrepareDatabaseStats */ - #[Retry(count: 1)] + public function testDatabaseStats(array $data): array { - $headers = $data['headers']; - $projectId = $data['projectId']; + $projectId = $data['projectId']; $databaseId = $data['databaseId']; $collectionId = $data['collectionId']; + $requestsTotal = $data['requestsTotal']; + $databasesTotal = $data['databasesTotal']; + $collectionsTotal = $data['collectionsTotal']; + $documentsTotal = $data['documentsTotal']; - $requestsCount = $data['requestsCount']; - $databasesCount = $data['databasesCount']; - $databasesCreate = $data['databasesCreate']; - $databasesRead = $data['databasesRead']; - $databasesDelete = $data['databasesDelete']; + sleep(self::WAIT); - $collectionsCount = $data['collectionsCount']; - $collectionsCreate = $data['collectionsCreate']; - $collectionsRead = $data['collectionsRead']; - $collectionsUpdate = $data['collectionsUpdate']; - $collectionsDelete = $data['collectionsDelete']; - - $documentsCount = $data['documentsCount']; - $documentsCreate = $data['documentsCreate']; - $documentsRead = $data['documentsRead']; - $documentsDelete = $data['documentsDelete']; - - sleep(20); - - //check datbase stats - $headers = [ - 'origin' => 'http:localhost', - 'x-appwrite-project' => 'console', - 'cookie' => 'a_session_console=' . $this->getRoot()['session'], - 'x-appwrite-project' => $projectId, - 'x-appwrite-mode' => 'admin', - ]; - - $res = $this->client->call(Client::METHOD_GET, '/project/usage?range=30d', $headers); + $res = $this->client->call( + Client::METHOD_GET, + '/project/usage?range=30d', + $data['consoleHeaders'] + ); $res = $res['body']; $this->assertEquals(9, count($res)); - $this->assertEquals(30, count($res['requests'])); - $this->assertEquals(30, count($res['storage'])); - $this->assertEquals($requestsCount, $res['requests'][array_key_last($res['requests'])]['value']); - $this->validateDates($res['requests']); - $this->assertEquals($databasesCount, $res['databases'][array_key_last($res['databases'])]['value']); - $this->validateDates($res['databases']); - $this->assertEquals($documentsCount, $res['documents'][array_key_last($res['documents'])]['value']); - $this->validateDates($res['documents']); + $this->assertEquals(30, count($res['requestsTotal'])); + $this->assertEquals(30, count($res['filesStorage'])); + $this->assertEquals($requestsTotal, $res['requestsTotal'][array_key_last($res['requestsTotal'])]['value']); + $this->validateDates($res['requestsTotal']); + $this->assertEquals($databasesTotal, $res['databasesTotal'][array_key_last($res['databasesTotal'])]['value']); + $this->validateDates($res['databasesTotal']); + $this->assertEquals($documentsTotal, $res['documentsTotal'][array_key_last($res['documentsTotal'])]['value']); + $this->validateDates($res['documentsTotal']); - $res = $this->client->call(Client::METHOD_GET, '/databases/usage?range=30d', array_merge($headers, [ - 'x-appwrite-project' => $projectId, - 'x-appwrite-mode' => 'admin' - ])); + $res = $this->client->call( + Client::METHOD_GET, + '/databases/usage?range=30d', + $data['consoleHeaders'] + ); $res = $res['body']; - $this->assertEquals($databasesCount, $res['databasesCount'][array_key_last($res['databasesCount'])]['value']); - $this->validateDates($res['databasesCount']); - $this->assertEquals($collectionsCount, $res['collectionsCount'][array_key_last($res['collectionsCount'])]['value']); - $this->validateDates($res['collectionsCount']); - $this->assertEquals($documentsCount, $res['documentsCount'][array_key_last($res['documentsCount'])]['value']); - $this->validateDates($res['documentsCount']); - $this->assertEquals($databasesCreate, $res['databasesCreate'][array_key_last($res['databasesCreate'])]['value']); - $this->validateDates($res['databasesCreate']); - $this->assertEquals($databasesRead, $res['databasesRead'][array_key_last($res['databasesRead'])]['value']); - $this->validateDates($res['databasesRead']); - $this->assertEquals($databasesDelete, $res['databasesDelete'][array_key_last($res['databasesDelete'])]['value']); - $this->validateDates($res['databasesDelete']); + $this->assertEquals($databasesTotal, $res['databasesTotal'][array_key_last($res['databasesTotal'])]['value']); + $this->validateDates($res['databasesTotal']); + $this->assertEquals($collectionsTotal, $res['collectionsTotal'][array_key_last($res['collectionsTotal'])]['value']); + $this->validateDates($res['collectionsTotal']); + $this->assertEquals($documentsTotal, $res['documentsTotal'][array_key_last($res['documentsTotal'])]['value']); + $this->validateDates($res['documentsTotal']); - $this->assertEquals($collectionsCreate, $res['collectionsCreate'][array_key_last($res['collectionsCreate'])]['value']); - $this->validateDates($res['collectionsCreate']); - $this->assertEquals($collectionsRead, $res['collectionsRead'][array_key_last($res['collectionsRead'])]['value']); - $this->validateDates($res['collectionsRead']); - $this->assertEquals($collectionsUpdate, $res['collectionsUpdate'][array_key_last($res['collectionsUpdate'])]['value']); - $this->validateDates($res['collectionsUpdate']); - $this->assertEquals($collectionsDelete, $res['collectionsDelete'][array_key_last($res['collectionsDelete'])]['value']); - $this->validateDates($res['collectionsDelete']); - - $this->assertEquals($documentsCreate, $res['documentsCreate'][array_key_last($res['documentsCreate'])]['value']); - $this->validateDates($res['documentsCreate']); - $this->assertEquals($documentsRead, $res['documentsRead'][array_key_last($res['documentsRead'])]['value']); - $this->validateDates($res['documentsRead']); - $this->assertEquals($documentsDelete, $res['documentsDelete'][array_key_last($res['documentsDelete'])]['value']); - $this->validateDates($res['documentsDelete']); - - $res = $this->client->call(Client::METHOD_GET, '/databases/' . $databaseId . '/usage?range=30d', array_merge($headers, [ - 'x-appwrite-project' => $projectId, - 'x-appwrite-mode' => 'admin' - ])); + $res = $this->client->call( + Client::METHOD_GET, + '/databases/' . $databaseId . '/usage?range=30d', + $data['consoleHeaders'] + ); $res = $res['body']; - $this->assertEquals($collectionsCount, $res['collectionsCount'][array_key_last($res['collectionsCount'])]['value']); - $this->validateDates($res['collectionsCount']); - $this->assertEquals($documentsCount, $res['documentsCount'][array_key_last($res['documentsCount'])]['value']); - $this->validateDates($res['documentsCount']); - $this->assertEquals($collectionsCreate, $res['collectionsCreate'][array_key_last($res['collectionsCreate'])]['value']); - $this->validateDates($res['collectionsCreate']); - $this->assertEquals($collectionsRead, $res['collectionsRead'][array_key_last($res['collectionsRead'])]['value']); - $this->validateDates($res['collectionsRead']); - $this->assertEquals($collectionsUpdate, $res['collectionsUpdate'][array_key_last($res['collectionsUpdate'])]['value']); - $this->validateDates($res['collectionsUpdate']); - $this->assertEquals($collectionsDelete, $res['collectionsDelete'][array_key_last($res['collectionsDelete'])]['value']); - $this->validateDates($res['collectionsDelete']); + $this->assertEquals($collectionsTotal, $res['collectionsTotal'][array_key_last($res['collectionsTotal'])]['value']); + $this->validateDates($res['collectionsTotal']); - $this->assertEquals($documentsCreate, $res['documentsCreate'][array_key_last($res['documentsCreate'])]['value']); - $this->validateDates($res['documentsCreate']); - $this->assertEquals($documentsRead, $res['documentsRead'][array_key_last($res['documentsRead'])]['value']); - $this->validateDates($res['documentsRead']); - $this->assertEquals($documentsDelete, $res['documentsDelete'][array_key_last($res['documentsDelete'])]['value']); - $this->validateDates($res['documentsDelete']); + $this->assertEquals($documentsTotal, $res['documentsTotal'][array_key_last($res['documentsTotal'])]['value']); + $this->validateDates($res['documentsTotal']); - $res = $this->client->call(Client::METHOD_GET, '/databases/' . $databaseId . '/collections/' . $collectionId . '/usage?range=30d', array_merge($headers, [ - 'x-appwrite-project' => $projectId, - 'x-appwrite-mode' => 'admin' - ])); + $res = $this->client->call(Client::METHOD_GET, '/databases/' . $databaseId . '/collections/' . $collectionId . '/usage?range=30d', $data['consoleHeaders']); $res = $res['body']; - $this->assertEquals($documentsCount, $res['documentsCount'][array_key_last($res['documentsCount'])]['value']); - $this->validateDates($res['documentsCount']); - $this->assertEquals($documentsCreate, $res['documentsCreate'][array_key_last($res['documentsCreate'])]['value']); - $this->validateDates($res['documentsCreate']); - $this->assertEquals($documentsRead, $res['documentsRead'][array_key_last($res['documentsRead'])]['value']); - $this->validateDates($res['documentsRead']); - $this->assertEquals($documentsDelete, $res['documentsDelete'][array_key_last($res['documentsDelete'])]['value']); - $this->validateDates($res['documentsDelete']); + $this->assertEquals($documentsTotal, $res['documentsTotal'][array_key_last($res['documentsTotal'])]['value']); + $this->validateDates($res['documentsTotal']); + + $data['requestsTotal'] = $requestsTotal; - $data['requestsCount'] = $requestsCount; return $data; } @@ -618,28 +527,33 @@ class UsageTest extends Scope /** @depends testDatabaseStats */ public function testPrepareFunctionsStats(array $data): array { + $dateValidator = new DatetimeValidator(); $headers = $data['headers']; - $functionId = ''; $executionTime = 0; $executions = 0; $failures = 0; - $response1 = $this->client->call(Client::METHOD_POST, '/functions', $headers, [ - 'functionId' => 'unique()', - 'name' => 'Test', - 'runtime' => 'php-8.0', - 'vars' => [ - 'funcKey1' => 'funcValue1', - 'funcKey2' => 'funcValue2', - 'funcKey3' => 'funcValue3', - ], - 'events' => [ - 'users.*.create', - 'users.*.delete', - ], - 'schedule' => '0 0 1 1 *', - 'timeout' => 10, - ]); + $response1 = $this->client->call( + Client::METHOD_POST, + '/functions', + $headers, + [ + 'functionId' => 'unique()', + 'name' => 'Test', + 'runtime' => 'php-8.0', + 'vars' => [ + 'funcKey1' => 'funcValue1', + 'funcKey2' => 'funcValue2', + 'funcKey3' => 'funcValue3', + ], + 'events' => [ + 'users.*.create', + 'users.*.delete', + ], + 'schedule' => '0 0 1 1 *', + 'timeout' => 10, + ] + ); $functionId = $response1['body']['$id'] ?? ''; @@ -649,47 +563,69 @@ class UsageTest extends Scope $code = realpath(__DIR__ . '/../../resources/functions') . "/php/code.tar.gz"; $this->packageCode('php'); - $deployment = $this->client->call(Client::METHOD_POST, '/functions/' . $functionId . '/deployments', array_merge($headers, ['content-type' => 'multipart/form-data',]), [ - 'entrypoint' => 'index.php', - 'code' => new CURLFile($code, 'application/x-gzip', \basename($code)), - 'activate' => true - ]); + $deployment = $this->client->call( + Client::METHOD_POST, + '/functions/' . $functionId . '/deployments', + array_merge($headers, ['content-type' => 'multipart/form-data',]), + [ + 'entrypoint' => 'index.php', + 'code' => new CURLFile($code, 'application/x-gzip', \basename($code)), + 'activate' => true + ] + ); $deploymentId = $deployment['body']['$id'] ?? ''; $this->assertEquals(202, $deployment['headers']['status-code']); $this->assertNotEmpty($deployment['body']['$id']); - $this->assertEquals(true, DateTime::isValid($deployment['body']['$createdAt'])); + $this->assertEquals(true, (new DatetimeValidator())->isValid($deployment['body']['$createdAt'])); $this->assertEquals('index.php', $deployment['body']['entrypoint']); - //Wait for deployment to build. - sleep(30); + // Wait for deployment to build. + sleep(self::WAIT + 20); - $response = $this->client->call(Client::METHOD_PATCH, '/functions/' . $functionId . '/deployments/' . $deploymentId, $headers, []); + $response = $this->client->call( + Client::METHOD_PATCH, + '/functions/' . $functionId . '/deployments/' . $deploymentId, + $headers + ); $this->assertEquals(200, $response['headers']['status-code']); $this->assertNotEmpty($response['body']['$id']); - $this->assertEquals(true, DateTime::isValid($response['body']['$createdAt'])); - $this->assertEquals(true, DateTime::isValid($response['body']['$updatedAt'])); + + $this->assertEquals(true, (new DatetimeValidator())->isValid($response['body']['$createdAt'])); + $this->assertEquals(true, (new DatetimeValidator())->isValid($response['body']['$updatedAt'])); $this->assertEquals($deploymentId, $response['body']['deployment']); - $execution = $this->client->call(Client::METHOD_POST, '/functions/' . $functionId . '/executions', $headers, [ - 'async' => false, - ]); + $execution = $this->client->call( + Client::METHOD_POST, + '/functions/' . $functionId . '/executions', + $headers, + [ + 'async' => false, + ] + ); $this->assertEquals(201, $execution['headers']['status-code']); $this->assertNotEmpty($execution['body']['$id']); $this->assertEquals($functionId, $execution['body']['functionId']); + $executionTime += (int) ($execution['body']['duration'] * 1000); + if ($execution['body']['status'] == 'failed') { $failures++; } elseif ($execution['body']['status'] == 'completed') { $executions++; } - $execution = $this->client->call(Client::METHOD_POST, '/functions/' . $functionId . '/executions', $headers, [ - 'async' => false, - ]); + $execution = $this->client->call( + Client::METHOD_POST, + '/functions/' . $functionId . '/executions', + $headers, + [ + 'async' => false, + ] + ); $this->assertEquals(201, $execution['headers']['status-code']); $this->assertNotEmpty($execution['body']['$id']); @@ -701,19 +637,33 @@ class UsageTest extends Scope } $executionTime += (int) ($execution['body']['duration'] * 1000); - $execution = $this->client->call(Client::METHOD_POST, '/functions/' . $functionId . '/executions', $headers, [ - 'async' => true, - ]); + $execution = $this->client->call( + Client::METHOD_POST, + '/functions/' . $functionId . '/executions', + $headers, + [ + 'async' => true, + ] + ); - sleep(10); + $this->assertEquals(202, $execution['headers']['status-code']); + $this->assertNotEmpty($execution['body']['$id']); + $this->assertEquals($functionId, $execution['body']['functionId']); - $execution = $this->client->call(Client::METHOD_GET, '/functions/' . $functionId . '/executions/' . $execution['body']['$id'], $headers); + sleep(self::WAIT); + + $execution = $this->client->call( + Client::METHOD_GET, + '/functions/' . $functionId . '/executions/' . $execution['body']['$id'], + $headers + ); if ($execution['body']['status'] == 'failed') { $failures++; } elseif ($execution['body']['status'] == 'completed') { $executions++; } + $executionTime += (int) ($execution['body']['duration'] * 1000); return array_merge($data, [ @@ -725,56 +675,54 @@ class UsageTest extends Scope } /** @depends testPrepareFunctionsStats */ - #[Retry(count: 1)] public function testFunctionsStats(array $data): void { - $headers = $data['headers']; $functionId = $data['functionId']; $executionTime = $data['executionTime']; $executions = $data['executions']; - $failures = $data['failures']; - sleep(20); + sleep(self::WAIT); - $response = $this->client->call(Client::METHOD_GET, '/functions/' . $functionId . '/usage', $headers, [ - 'range' => '30d' - ]); + $response = $this->client->call( + Client::METHOD_GET, + '/functions/' . $functionId . '/usage?range=30d', + $data['consoleHeaders'] + ); $this->assertEquals(200, $response['headers']['status-code']); - $this->assertEquals(9, count($response['body'])); + $this->assertEquals(8, count($response['body'])); $this->assertEquals('30d', $response['body']['range']); - $this->assertIsArray($response['body']['executionsTotal']); - $this->assertIsArray($response['body']['executionsFailure']); - $this->assertIsArray($response['body']['executionsSuccess']); - $this->assertIsArray($response['body']['executionsTime']); + $this->assertIsArray($response['body']['deploymentsTotal']); + $this->assertIsArray($response['body']['deploymentsStorage']); $this->assertIsArray($response['body']['buildsTotal']); - $this->assertIsArray($response['body']['buildsFailure']); - $this->assertIsArray($response['body']['buildsSuccess']); $this->assertIsArray($response['body']['buildsTime']); + $this->assertIsArray($response['body']['executionsTotal']); + $this->assertIsArray($response['body']['executionsTime']); + $response = $response['body']; $this->assertEquals($executions, $response['executionsTotal'][array_key_last($response['executionsTotal'])]['value']); $this->validateDates($response['executionsTotal']); $this->assertEquals($executionTime, $response['executionsTime'][array_key_last($response['executionsTime'])]['value']); $this->validateDates($response['executionsTime']); - $this->assertEquals($failures, $response['executionsFailure'][array_key_last($response['executionsFailure'])]['value']); - $this->validateDates($response['executionsFailure']); - $response = $this->client->call(Client::METHOD_GET, '/functions/usage', $headers, [ - 'range' => '30d' - ]); + $response = $this->client->call( + Client::METHOD_GET, + '/functions/usage?range=30d', + $data['consoleHeaders'] + ); $this->assertEquals(200, $response['headers']['status-code']); $this->assertEquals(9, count($response['body'])); $this->assertEquals($response['body']['range'], '30d'); - $this->assertIsArray($response['body']['executionsTotal']); - $this->assertIsArray($response['body']['executionsFailure']); - $this->assertIsArray($response['body']['executionsSuccess']); - $this->assertIsArray($response['body']['executionsTime']); + $this->assertIsArray($response['body']['functionsTotal']); + $this->assertIsArray($response['body']['deploymentsTotal']); + $this->assertIsArray($response['body']['deploymentsStorage']); $this->assertIsArray($response['body']['buildsTotal']); - $this->assertIsArray($response['body']['buildsFailure']); - $this->assertIsArray($response['body']['buildsSuccess']); $this->assertIsArray($response['body']['buildsTime']); + $this->assertIsArray($response['body']['executionsTotal']); + $this->assertIsArray($response['body']['executionsTime']); + $response = $response['body']; $this->assertEquals($executions, $response['executionsTotal'][array_key_last($response['executionsTotal'])]['value']); @@ -783,15 +731,10 @@ class UsageTest extends Scope $this->validateDates($response['executionsTime']); $this->assertGreaterThan(0, $response['buildsTime'][array_key_last($response['buildsTime'])]['value']); $this->validateDates($response['buildsTime']); - $this->assertEquals($failures, $response['executionsFailure'][array_key_last($response['executionsFailure'])]['value']); - $this->validateDates($response['executionsFailure']); } - protected function tearDown(): void + public function tearDown(): void { - $this->usersCount = 0; - $this->requestsCount = 0; - $projectId = ''; - $headers = []; + $this->projectId = ''; } }