e2e tests
This commit is contained in:
parent
7601c9047b
commit
86638e0079
4 changed files with 341 additions and 297 deletions
|
@ -21,6 +21,8 @@ use Utopia\Database\Database;
|
|||
use Utopia\Database\DateTime;
|
||||
use Utopia\Database\Document;
|
||||
use Utopia\Database\Validator\Authorization;
|
||||
use Utopia\Logger\Log;
|
||||
use Utopia\Logger\Logger;
|
||||
|
||||
$parseLabel = function (string $label, array $responsePayload, array $requestParams, Document $user) {
|
||||
preg_match_all('/{(.*?)}/', $label, $matches);
|
||||
|
@ -48,9 +50,9 @@ $parseLabel = function (string $label, array $responsePayload, array $requestPar
|
|||
return $label;
|
||||
};
|
||||
|
||||
$databaseListener = function (string $event, array $args, Document $project, Usage $queueForUsage, Database $dbForProject) {
|
||||
$value = 1;
|
||||
$databaseListener = function (string $event, array $args, Document $project, Usage $queueForUsage, Database $dbForProject, Logger|null $logger) {
|
||||
|
||||
$value = 1;
|
||||
$document = $args['document'];
|
||||
$collection = $args['collection'];
|
||||
|
||||
|
@ -62,225 +64,150 @@ $databaseListener = function (string $event, array $args, Document $project, Usa
|
|||
* On Documents that tied by relations like functions>deployments>build || documents>collection>database || buckets>files
|
||||
* When we remove a parent document we need to deduct his children aggregation from the project scope
|
||||
*/
|
||||
//var_dump($document->getCollection());
|
||||
switch (true) {
|
||||
case $document->getCollection() === 'teams':
|
||||
$queueForUsage->addMetric("teams", $value); // per project
|
||||
break;
|
||||
case $document->getCollection() === 'users':
|
||||
$queueForUsage->addMetric("users", $value); // per project
|
||||
// Project sessions deduction
|
||||
if ($event === Database::EVENT_DOCUMENT_DELETE) {
|
||||
$userSessions = (count($document->getAttribute('sessions')));
|
||||
$sessions = $dbForProject->getDocument('stats', md5("_inf_sessions"));
|
||||
if (!empty($userSessions)) {
|
||||
$dbForProject->decreaseDocumentAttribute(
|
||||
'stats',
|
||||
$sessions->getId(),
|
||||
'value',
|
||||
$userSessions
|
||||
);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case $document->getCollection() === 'sessions': // sessions Todo sessions count offset issue
|
||||
$queueForUsage->addMetric("sessions", $value); // per project
|
||||
break;
|
||||
case $document->getCollection() === 'databases': // databases
|
||||
$queueForUsage->addMetric("databases", $value); // per project
|
||||
try {
|
||||
switch (true) {
|
||||
case $document->getCollection() === 'teams':
|
||||
$queueForUsage
|
||||
->addMetric("teams", $value); // per project
|
||||
break;
|
||||
case $document->getCollection() === 'users':
|
||||
$queueForUsage
|
||||
->addMetric("users", $value); // per project
|
||||
|
||||
if ($event === Database::EVENT_DOCUMENT_DELETE) {
|
||||
//Project collections deduction
|
||||
$dbCollections = $dbForProject->getDocument('stats', md5("_inf_" . "{$document->getId()}" . ".collections"));
|
||||
$projectCollections = $dbForProject->getDocument('stats', md5("_inf_collections"));
|
||||
if (!$dbCollections->isEmpty()) {
|
||||
$dbForProject->decreaseDocumentAttribute(
|
||||
'stats',
|
||||
$projectCollections->getId(),
|
||||
'value',
|
||||
$dbCollections['value']
|
||||
);
|
||||
//Project level sessions deduction
|
||||
if ($event === Database::EVENT_DOCUMENT_DELETE) {
|
||||
$sessions = (count($document->getAttribute('sessions')));
|
||||
$queueForUsage
|
||||
->addMetric("databases", ($sessions['value'] * -1)); // per project
|
||||
}
|
||||
break;
|
||||
case $document->getCollection() === 'sessions': // sessions
|
||||
$queueForUsage
|
||||
->addMetric("sessions", $value); //per project
|
||||
break;
|
||||
case $document->getCollection() === 'databases': // databases
|
||||
$queueForUsage
|
||||
->addMetric("databases", $value); // per project
|
||||
|
||||
//Project documents deduction
|
||||
$dbDocuments = $dbForProject->getDocument('stats', md5("_inf_" . "{$document->getId()}" . ".documents"));
|
||||
$projectDocuments = $dbForProject->getDocument('stats', md5("_inf_documents"));
|
||||
if (!$dbDocuments->isEmpty()) {
|
||||
$dbForProject->decreaseDocumentAttribute(
|
||||
'stats',
|
||||
$projectDocuments->getId(),
|
||||
'value',
|
||||
$dbDocuments['value']
|
||||
);
|
||||
if ($event === Database::EVENT_DOCUMENT_DELETE) {
|
||||
//Project level collections/documents deduction
|
||||
$collections = $dbForProject->getDocument('stats', md5("_inf_" . "{$document->getId()}" . ".collections"));
|
||||
$documents = $dbForProject->getDocument('stats', md5("_inf_" . "{$document->getId()}" . ".documents"));
|
||||
$queueForUsage
|
||||
->addMetric("collections", ($collections['value'] * -1))
|
||||
->addMetric("documents", ($documents['value'] * -1))
|
||||
;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case str_starts_with($document->getCollection(), 'database_') && !str_contains($document->getCollection(), 'collection'): //collections
|
||||
$queueForUsage
|
||||
->addMetric("collections", $value) // per project
|
||||
->addMetric("{$document['databaseId']}" . ".collections", $value) // per database
|
||||
;
|
||||
|
||||
if ($event === Database::EVENT_DOCUMENT_DELETE) {
|
||||
//Project documents deduction
|
||||
$dbDocuments = $dbForProject->getDocument('stats', md5("_inf_" . "{$document['databaseId']}" . ".documents"));
|
||||
$projectDocuments = $dbForProject->getDocument('stats', md5("_inf_documents"));
|
||||
if (!$dbDocuments->isEmpty()) {
|
||||
$dbForProject->decreaseDocumentAttribute(
|
||||
'stats',
|
||||
$projectDocuments->getId(),
|
||||
'value',
|
||||
$dbDocuments['value']
|
||||
);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case str_starts_with($document->getCollection(), 'database_') && str_contains($document->getCollection(), '_collection_'): //documents
|
||||
$queueForUsage
|
||||
->addMetric("documents", $value) // per project
|
||||
->addMetric("{$document->getAttribute('$databaseId')}" . ".documents", $value) // per database
|
||||
->addMetric("{$document->getAttribute('$databaseId')}" . "." . "{$collection->getId()}" . ".documents", $value) // per collection
|
||||
break;
|
||||
case str_starts_with($document->getCollection(), 'database_') && !str_contains($document->getCollection(), 'collection'): //collections
|
||||
$queueForUsage
|
||||
->addMetric("collections", $value) // per project
|
||||
->addMetric("{$document['databaseId']}" . ".collections", $value) // per database
|
||||
;
|
||||
break;
|
||||
case $document->getCollection() === 'buckets':
|
||||
$queueForUsage->addMetric("buckets", $value); // per project
|
||||
if ($event === Database::EVENT_DOCUMENT_DELETE) {
|
||||
//Project files deduction
|
||||
$bucketFiles = $dbForProject->getDocument('stats', md5("_inf_" . "{$document->getId()}" . ".files"));
|
||||
$projectFiles = $dbForProject->getDocument('stats', md5("_inf_files"));
|
||||
if (!$bucketFiles->isEmpty()) {
|
||||
$dbForProject->decreaseDocumentAttribute(
|
||||
'stats',
|
||||
$projectFiles->getId(),
|
||||
'value',
|
||||
$bucketFiles['value']
|
||||
);
|
||||
|
||||
if ($event === Database::EVENT_DOCUMENT_DELETE) {
|
||||
//Project documents deduction
|
||||
$documents = $dbForProject->getDocument('stats', md5("_inf_" . "{$document['databaseId']}" . ".documents"));
|
||||
$queueForUsage
|
||||
->addMetric("documents", ($documents['value'] * -1))
|
||||
;
|
||||
}
|
||||
//Project files storage deduction
|
||||
$bucketStorage = $dbForProject->getDocument('stats', md5("_inf_" . "{$document->getId()}" . ".files.storage"));
|
||||
$projectStorage = $dbForProject->getDocument('stats', md5("_inf_files.storage"));
|
||||
if (!$bucketStorage->isEmpty()) {
|
||||
$dbForProject->decreaseDocumentAttribute(
|
||||
'stats',
|
||||
$projectStorage->getId(),
|
||||
'value',
|
||||
$bucketStorage['value']
|
||||
);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case str_starts_with($document->getCollection(), 'bucket_'): // files
|
||||
$queueForUsage
|
||||
->addMetric("files", $value) // per project
|
||||
->addMetric("files.storage", $document->getAttribute('sizeOriginal') * $value) // per project
|
||||
->addMetric("{$document['bucketId']}" . ".files", $value) // per bucket
|
||||
->addMetric("{$document['bucketId']}" . ".files.storage", $document->getAttribute('sizeOriginal') * $value)// per bucket
|
||||
break;
|
||||
case str_starts_with($document->getCollection(), 'database_') && str_contains($document->getCollection(), '_collection_'): //documents
|
||||
$queueForUsage
|
||||
->addMetric("documents", $value) // per project
|
||||
->addMetric("{$document->getAttribute('$databaseId')}" . ".documents", $value) // per database
|
||||
->addMetric("{$document->getAttribute('$databaseId')}" . "." . "{$collection->getId()}" . ".documents", $value) // per collection
|
||||
;
|
||||
break;
|
||||
case $document->getCollection() === 'functions':
|
||||
$queueForUsage->addMetric("functions", $value); // per project
|
||||
break;
|
||||
case $document->getCollection() === 'buckets':
|
||||
$queueForUsage
|
||||
->addMetric("buckets", $value); // per project
|
||||
|
||||
if ($event === Database::EVENT_DOCUMENT_DELETE) {
|
||||
//Project deployments deduction
|
||||
$functionDeployments = $dbForProject->getDocument('stats', md5("_inf_function." . "{$document->getId()}" . ".deployments"));
|
||||
$projectDeployments = $dbForProject->getDocument('stats', md5("_inf_deployments"));
|
||||
if (!$functionDeployments->isEmpty()) {
|
||||
$dbForProject->decreaseDocumentAttribute(
|
||||
'stats',
|
||||
$projectDeployments->getId(),
|
||||
'value',
|
||||
$functionDeployments['value']
|
||||
);
|
||||
}
|
||||
if ($event === Database::EVENT_DOCUMENT_DELETE) {
|
||||
$files = $dbForProject->getDocument('stats', md5("_inf_" . "{$document->getId()}" . ".files"));
|
||||
$storage = $dbForProject->getDocument('stats', md5("_inf_" . "{$document->getId()}" . ".files.storage"));
|
||||
|
||||
//Project deployments storage deduction
|
||||
$functionDeploymentsStorage = $dbForProject->getDocument('stats', md5("_inf_function." . "{$document->getId()}" . ".deployments.storage"));
|
||||
$projectDeploymentsStorage = $dbForProject->getDocument('stats', md5("_inf_function.deployments.storage"));
|
||||
if (!$functionDeployments->isEmpty()) {
|
||||
$dbForProject->decreaseDocumentAttribute(
|
||||
'stats',
|
||||
$projectDeploymentsStorage->getId(),
|
||||
'value',
|
||||
$functionDeploymentsStorage['value']
|
||||
);
|
||||
//Project level function deduction
|
||||
$queueForUsage
|
||||
->addMetric("files", ($files['value'] * -1))
|
||||
->addMetric("files.storage", ($storage['value'] * -1))
|
||||
;
|
||||
}
|
||||
|
||||
//Project builds deduction
|
||||
$functionBuilds = $dbForProject->getDocument('stats', md5("_inf_" . "{$document->getId()}" . ".builds"));
|
||||
$projectBuilds = $dbForProject->getDocument('stats', md5("_inf_builds"));
|
||||
if (!$functionBuilds->isEmpty()) {
|
||||
$dbForProject->decreaseDocumentAttribute(
|
||||
'stats',
|
||||
$projectBuilds->getId(),
|
||||
'value',
|
||||
$functionBuilds['value']
|
||||
);
|
||||
}
|
||||
|
||||
//Project builds storage deduction
|
||||
$functionBuildsStorage = $dbForProject->getDocument('stats', md5("_inf_" . "{$document->getId()}" . ".builds.storage"));
|
||||
$projectFunctionBuilds = $dbForProject->getDocument('stats', md5("_inf_builds.storage"));
|
||||
if (!$functionBuildsStorage->isEmpty()) {
|
||||
$dbForProject->decreaseDocumentAttribute(
|
||||
'stats',
|
||||
$projectFunctionBuilds->getId(),
|
||||
'value',
|
||||
$functionBuildsStorage['value']
|
||||
);
|
||||
}
|
||||
|
||||
//Project executions deduction
|
||||
$functionExecutions = $dbForProject->getDocument('stats', md5("_inf_" . "{$document->getId()}" . ".executions"));
|
||||
$projectExecutions = $dbForProject->getDocument('stats', md5("_inf_executions"));
|
||||
if (!$functionExecutions->isEmpty()) {
|
||||
$dbForProject->decreaseDocumentAttribute(
|
||||
'stats',
|
||||
$projectExecutions->getId(),
|
||||
'value',
|
||||
$functionExecutions['value']
|
||||
);
|
||||
}
|
||||
|
||||
//Project executions compute deduction
|
||||
$functionExecutionsCompute = $dbForProject->getDocument('stats', md5("_inf_" . "{$document->getId()}" . ".executions.compute"));
|
||||
$projectExecutionsCompute = $dbForProject->getDocument('stats', md5("_inf_executions.compute"));
|
||||
if (!$functionExecutionsCompute->isEmpty()) {
|
||||
$dbForProject->decreaseDocumentAttribute(
|
||||
'stats',
|
||||
$projectExecutionsCompute->getId(),
|
||||
'value',
|
||||
$functionExecutionsCompute['value']
|
||||
);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case $document->getCollection() === 'deployments':
|
||||
$queueForUsage
|
||||
->addMetric("deployments", $value) // per project
|
||||
->addMetric("deployments.storage", $document->getAttribute('size') * $value) // per project
|
||||
->addMetric("{$document['resourceType']}" . "." . "{$document['resourceId']}" . ".deployments", $value)// per function
|
||||
->addMetric("{$document['resourceType']}" . "." . "{$document['resourceId']}" . ".deployments.storage", $document->getAttribute('size') * $value) // per function
|
||||
break;
|
||||
case str_starts_with($document->getCollection(), 'bucket_'): // files
|
||||
$queueForUsage
|
||||
->addMetric("files", $value) // per project
|
||||
->addMetric("files.storage", $document->getAttribute('sizeOriginal') * $value) // per project
|
||||
->addMetric("{$document['bucketId']}" . ".files", $value) // per bucket
|
||||
->addMetric("{$document['bucketId']}" . ".files.storage", $document->getAttribute('sizeOriginal') * $value)// per bucket
|
||||
;
|
||||
break;
|
||||
case $document->getCollection() === 'builds':
|
||||
$deployment = $dbForProject->getDocument('deployments', $document->getAttribute('deploymentId')); // Todo temp fix
|
||||
break;
|
||||
case $document->getCollection() === 'functions':
|
||||
$queueForUsage
|
||||
->addMetric("functions", $value); // per project
|
||||
|
||||
$queueForUsage
|
||||
->addMetric("builds", $value) // per project
|
||||
->addMetric("builds.compute", $document->getAttribute('duration') * $value) // per project
|
||||
->addMetric("{$deployment['resourceId']}" . ".builds", $value) // per function
|
||||
->addMetric("{$deployment['resourceId']}" . ".builds.compute", (int)($document->getAttribute('duration') * 1000) * $value) // per function
|
||||
;
|
||||
break;
|
||||
case $document->getCollection() === 'executions':
|
||||
$queueForUsage
|
||||
->addMetric("executions", $value) // per project
|
||||
->addMetric("{$document['functionId']}" . ".executions", $value) // per function
|
||||
if ($event === Database::EVENT_DOCUMENT_DELETE) {
|
||||
//Project level function deduction
|
||||
$deployments = $dbForProject->getDocument('stats', md5("_inf_function." . "{$document->getId()}" . ".deployments"));
|
||||
$deploymentsStorage = $dbForProject->getDocument('stats', md5("_inf_function." . "{$document->getId()}" . ".deployments.storage"));
|
||||
$builds = $dbForProject->getDocument('stats', md5("_inf_" . "{$document->getId()}" . ".builds"));
|
||||
$buildsStorage = $dbForProject->getDocument('stats', md5("_inf_" . "{$document->getId()}" . ".builds.storage"));
|
||||
$buildsCompute = $dbForProject->getDocument('stats', md5("_inf_" . "{$document->getId()}" . ".builds.compute"));
|
||||
$executions = $dbForProject->getDocument('stats', md5("_inf_" . "{$document->getId()}" . ".executions"));
|
||||
$executionsCompute = $dbForProject->getDocument('stats', md5("_inf_" . "{$document->getId()}" . ".executions.compute"));
|
||||
|
||||
$queueForUsage
|
||||
->addMetric("deployments", ($deployments['value'] * -1))
|
||||
->addMetric("deployments.storage", ($deploymentsStorage['value'] * -1))
|
||||
->addMetric("builds", ($builds['value'] * -1))
|
||||
->addMetric("builds.storage", ($buildsStorage['value'] * -1))
|
||||
->addMetric("builds.compute", ($buildsCompute['value'] * -1))
|
||||
->addMetric("executions", ($executions['value'] * -1))
|
||||
->addMetric("executions.compute", ($executionsCompute['value'] * -1))
|
||||
;
|
||||
}
|
||||
break;
|
||||
case $document->getCollection() === 'deployments':
|
||||
$queueForUsage
|
||||
->addMetric("deployments", $value) // per project
|
||||
->addMetric("deployments.storage", $document->getAttribute('size') * $value) // per project
|
||||
->addMetric("{$document['resourceType']}" . "." . "{$document['resourceId']}" . ".deployments", $value)// per function
|
||||
->addMetric("{$document['resourceType']}" . "." . "{$document['resourceId']}" . ".deployments.storage", $document->getAttribute('size') * $value) // per function
|
||||
;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
break;
|
||||
case $document->getCollection() === 'executions':
|
||||
$queueForUsage
|
||||
->addMetric("executions", $value) // per project
|
||||
->addMetric("{$document['functionId']}" . ".executions", $value) // per function
|
||||
;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
} catch (Throwable $error) {
|
||||
if (!empty($logger) && $error->getCode() === 500) {
|
||||
$log = new Log();
|
||||
$isProduction = App::getEnv('_APP_ENV', 'development') === 'production';
|
||||
$log
|
||||
->setNamespace("appwrite-worker")
|
||||
->setServer(\gethostname())
|
||||
->setVersion(App::getEnv('_APP_VERSION', 'UNKNOWN'))
|
||||
->setType(Log::TYPE_ERROR)
|
||||
->setMessage($error->getMessage())
|
||||
->setAction('appwrite-queue-usage')
|
||||
->addTag('verboseType', get_class($error))
|
||||
->addTag('code', $error->getCode())
|
||||
->addExtra('collection', $document->getCollection())
|
||||
->addExtra('file', $error->getFile())
|
||||
->addExtra('line', $error->getLine())
|
||||
->addExtra('trace', $error->getTraceAsString())
|
||||
->addExtra('detailedTrace', $error->getTrace())
|
||||
->addExtra('roles', \Utopia\Database\Validator\Authorization::$roles)
|
||||
->setEnvironment($isProduction ? Log::ENVIRONMENT_PRODUCTION : Log::ENVIRONMENT_STAGING)
|
||||
;
|
||||
$logger->addLog($log);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -298,8 +225,9 @@ App::init()
|
|||
->inject('database')
|
||||
->inject('dbForProject')
|
||||
->inject('queueForUsage')
|
||||
->inject('logger')
|
||||
->inject('mode')
|
||||
->action(function (App $utopia, Request $request, Response $response, Document $project, Document $user, Event $events, Audit $audits, Mail $mails, Delete $deletes, EventDatabase $database, Database $dbForProject, Usage $queueForUsage, string $mode) use ($databaseListener) {
|
||||
->action(function (App $utopia, Request $request, Response $response, Document $project, Document $user, Event $events, Audit $audits, Mail $mails, Delete $deletes, EventDatabase $database, Database $dbForProject, Usage $queueForUsage, Logger|null $logger, string $mode) use ($databaseListener) {
|
||||
|
||||
$route = $utopia->match($request);
|
||||
|
||||
|
@ -389,8 +317,8 @@ App::init()
|
|||
$database->setProject($project);
|
||||
|
||||
$dbForProject
|
||||
->on(Database::EVENT_DOCUMENT_CREATE, fn ($event, $args) => $databaseListener($event, $args, $project, $queueForUsage, $dbForProject))
|
||||
->on(Database::EVENT_DOCUMENT_DELETE, fn ($event, $args) => $databaseListener($event, $args, $project, $queueForUsage, $dbForProject))
|
||||
->on(Database::EVENT_DOCUMENT_CREATE, fn ($event, $args) => $databaseListener($event, $args, $project, $queueForUsage, $dbForProject, $logger))
|
||||
->on(Database::EVENT_DOCUMENT_DELETE, fn ($event, $args) => $databaseListener($event, $args, $project, $queueForUsage, $dbForProject, $logger))
|
||||
;
|
||||
|
||||
$useCache = $route->getLabel('cache', false);
|
||||
|
|
|
@ -817,7 +817,6 @@ App::setResource('loggerBreadcrumbs', function () {
|
|||
});
|
||||
|
||||
App::setResource('register', fn() => $register);
|
||||
|
||||
App::setResource('locale', fn() => new Locale(App::getEnv('_APP_LOCALE', 'en')));
|
||||
|
||||
// Queues
|
||||
|
|
|
@ -19,7 +19,7 @@ $stats = [];
|
|||
|
||||
$periods['1h'] = 'Y-m-d H:00';
|
||||
$periods['1d'] = 'Y-m-d 00:00';
|
||||
$periods['1m'] = 'Y-m-1 00:00';
|
||||
//$periods['1m'] = 'Y-m-1 00:00';
|
||||
$periods['inf'] = '0000-00-00 00:00';
|
||||
|
||||
$server->job()
|
||||
|
|
|
@ -20,6 +20,7 @@ class UsageTest extends Scope
|
|||
use FunctionsBase;
|
||||
|
||||
const WAIT = 5;
|
||||
const CREATE = 20;
|
||||
|
||||
protected string $projectId;
|
||||
|
||||
|
@ -28,8 +29,6 @@ class UsageTest extends Scope
|
|||
parent::setUp();
|
||||
}
|
||||
|
||||
|
||||
|
||||
protected static string $formatTz = 'Y-m-d\TH:i:s.vP';
|
||||
|
||||
protected function validateDates(array $metrics): void
|
||||
|
@ -49,23 +48,28 @@ class UsageTest extends Scope
|
|||
|
||||
$usersCount = 0;
|
||||
$requestsCount = 0;
|
||||
for ($i = 0; $i < 10; $i++) {
|
||||
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, [
|
||||
$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++;
|
||||
|
||||
if ($i < 5) {
|
||||
if ($i < (self::CREATE / 2)) {
|
||||
$userId = $res['body']['$id'];
|
||||
$res = $this->client->call(Client::METHOD_DELETE, '/users/' . $userId, $headers);
|
||||
$this->assertEmpty($res['body']);
|
||||
|
@ -102,25 +106,33 @@ class UsageTest extends Scope
|
|||
'x-appwrite-mode' => 'admin',
|
||||
];
|
||||
|
||||
$res = $this->client->call(Client::METHOD_GET, '/project/usage?range=30d', $consoleHeaders);
|
||||
$res = $this->client->call(
|
||||
Client::METHOD_GET,
|
||||
'/project/usage?range=24h',
|
||||
$consoleHeaders
|
||||
);
|
||||
$res = $res['body'];
|
||||
|
||||
$this->assertEquals('30d', $res['range']);
|
||||
$this->assertEquals('24h', $res['range']);
|
||||
$this->assertEquals(9, count($res));
|
||||
$this->assertEquals(30, count($res['requests']));
|
||||
$this->assertEquals(30, count($res['users']));
|
||||
$this->assertEquals(24, count($res['requests']));
|
||||
$this->assertEquals(24, 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']);
|
||||
|
||||
$res = $this->client->call(Client::METHOD_GET, '/users/usage?range=90d', $consoleHeaders);
|
||||
$res = $this->client->call(
|
||||
Client::METHOD_GET,
|
||||
'/users/usage?range=90d',
|
||||
$consoleHeaders
|
||||
);
|
||||
|
||||
$res = $res['body'];
|
||||
$this->assertEquals('90d', $res['range']);
|
||||
$this->assertEquals(90, count($res['usersCount']));
|
||||
$this->assertEquals(90, count($res['sessionsCount']));
|
||||
$this->assertEquals(5, $res['usersCount'][array_key_last($res['usersCount'])]['value']);
|
||||
$this->assertEquals((self::CREATE / 2), $res['usersCount'][array_key_last($res['usersCount'])]['value']);
|
||||
|
||||
return [
|
||||
'projectId' => $projectId,
|
||||
|
@ -133,22 +145,23 @@ class UsageTest extends Scope
|
|||
/** @depends testUsersStats */
|
||||
public function testPrepareStorageStats(array $data): array
|
||||
{
|
||||
|
||||
$projectId = $data['projectId'];
|
||||
$consoleHeaders = $data['consoleHeaders'];
|
||||
$headers = $data['headers'];
|
||||
$bucketsCount = 0;
|
||||
$requestsCount = $data['requestsCount'];
|
||||
$storageTotal = 0;
|
||||
$bucketsCreate = 0;
|
||||
$bucketsDelete = 0;
|
||||
$filesCount = 0;
|
||||
$filesCreate = 0;
|
||||
$filesDelete = 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' => 'multipart/form-data']), [
|
||||
$res = $this->client->call(
|
||||
Client::METHOD_POST,
|
||||
'/storage/buckets',
|
||||
array_merge(
|
||||
$headers,
|
||||
['content-type' => 'multipart/form-data']
|
||||
),
|
||||
[
|
||||
'bucketId' => 'unique()',
|
||||
'name' => $name,
|
||||
'fileSecurity' => false,
|
||||
|
@ -158,18 +171,21 @@ class UsageTest extends Scope
|
|||
Permission::update(Role::any()),
|
||||
Permission::delete(Role::any()),
|
||||
],
|
||||
]);
|
||||
]
|
||||
);
|
||||
$this->assertEquals($name, $res['body']['name']);
|
||||
$this->assertNotEmpty($res['body']['$id']);
|
||||
$bucketId = $res['body']['$id'];
|
||||
$bucketsCreate++;
|
||||
$bucketsCount++;
|
||||
$requestsCount++;
|
||||
|
||||
if ($i < 5) {
|
||||
$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++;
|
||||
$bucketsCount--;
|
||||
}
|
||||
|
@ -195,27 +211,34 @@ 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']), [
|
||||
$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++;
|
||||
|
||||
$fileId = $res['body']['$id'];
|
||||
if ($i < 5) {
|
||||
$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++;
|
||||
$filesCount--;
|
||||
$storageTotal -= $fileSize;
|
||||
|
@ -227,11 +250,7 @@ class UsageTest extends Scope
|
|||
'bucketsCount' => $bucketsCount,
|
||||
'requestsCount' => $requestsCount,
|
||||
'storageTotal' => $storageTotal,
|
||||
'bucketsCreate' => $bucketsCreate,
|
||||
'bucketsDelete' => $bucketsDelete,
|
||||
'filesCount' => $filesCount,
|
||||
'filesCreate' => $filesCreate,
|
||||
'filesDelete' => $filesDelete,
|
||||
]);
|
||||
}
|
||||
|
||||
|
@ -248,7 +267,14 @@ class UsageTest extends Scope
|
|||
|
||||
sleep(self::WAIT);
|
||||
|
||||
$res = $this->client->call(Client::METHOD_GET, '/project/usage?range=30d', array_merge($data['headers'], $data['consoleHeaders']));
|
||||
$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));
|
||||
|
@ -260,7 +286,14 @@ class UsageTest extends Scope
|
|||
$this->assertEquals($storageTotal, $res['storage'][array_key_last($res['storage'])]['value']);
|
||||
$this->validateDates($res['storage']);
|
||||
|
||||
$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/usage?range=30d',
|
||||
array_merge(
|
||||
$data['headers'],
|
||||
$data['consoleHeaders']
|
||||
)
|
||||
);
|
||||
|
||||
$res = $res['body'];
|
||||
$this->assertEquals($storageTotal, $res['filesStorage'][array_key_last($res['filesStorage'])]['value']);
|
||||
|
@ -270,7 +303,14 @@ class UsageTest extends Scope
|
|||
$this->assertEquals($filesCount, $res['filesCount'][array_key_last($res['filesCount'])]['value']);
|
||||
$this->validateDates($res['filesCount']);
|
||||
|
||||
$res = $this->client->call(Client::METHOD_GET, '/storage/' . $bucketId . '/usage?range=30d', array_merge($data['headers'], $data['consoleHeaders']));
|
||||
$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']);
|
||||
|
@ -291,12 +331,17 @@ class UsageTest extends Scope
|
|||
$collectionsCount = 0;
|
||||
$documentsCount = 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', array_merge($headers, ['content-type' => 'multipart/form-data']), [
|
||||
$res = $this->client->call(
|
||||
Client::METHOD_POST,
|
||||
'/databases',
|
||||
array_merge($headers, ['content-type' => 'multipart/form-data']),
|
||||
[
|
||||
'databaseId' => 'unique()',
|
||||
'name' => $name,
|
||||
]);
|
||||
]
|
||||
);
|
||||
|
||||
|
||||
$this->assertEquals($name, $res['body']['name']);
|
||||
|
@ -306,8 +351,12 @@ class UsageTest extends Scope
|
|||
$requestsCount++;
|
||||
$databasesCount++;
|
||||
|
||||
if ($i < 5) {
|
||||
$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']);
|
||||
|
||||
$databasesCount--;
|
||||
|
@ -315,9 +364,13 @@ class UsageTest extends Scope
|
|||
}
|
||||
}
|
||||
|
||||
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', array_merge($headers, ['content-type' => 'multipart/form-data']), [
|
||||
$res = $this->client->call(
|
||||
Client::METHOD_POST,
|
||||
'/databases/' . $databaseId . '/collections',
|
||||
array_merge($headers, ['content-type' => 'multipart/form-data']),
|
||||
[
|
||||
'collectionId' => 'unique()',
|
||||
'name' => $name,
|
||||
'documentSecurity' => false,
|
||||
|
@ -327,7 +380,8 @@ class UsageTest extends Scope
|
|||
Permission::update(Role::any()),
|
||||
Permission::delete(Role::any()),
|
||||
],
|
||||
]);
|
||||
]
|
||||
);
|
||||
|
||||
$this->assertEquals($name, $res['body']['name']);
|
||||
$this->assertNotEmpty($res['body']['$id']);
|
||||
|
@ -336,31 +390,45 @@ class UsageTest extends Scope
|
|||
$requestsCount++;
|
||||
$collectionsCount++;
|
||||
|
||||
if ($i < 5) {
|
||||
$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']);
|
||||
$collectionsCount--;
|
||||
$requestsCount++;
|
||||
}
|
||||
}
|
||||
|
||||
$res = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes' . '/string', array_merge($headers, ['content-type' => 'multipart/form-data']), [
|
||||
$res = $this->client->call(
|
||||
Client::METHOD_POST,
|
||||
'/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes' . '/string',
|
||||
array_merge($headers, ['content-type' => 'multipart/form-data']),
|
||||
[
|
||||
'key' => 'name',
|
||||
'size' => 255,
|
||||
'required' => true,
|
||||
]);
|
||||
]
|
||||
);
|
||||
|
||||
$this->assertEquals('name', $res['body']['key']);
|
||||
$requestsCount++;
|
||||
|
||||
sleep(self::WAIT);
|
||||
|
||||
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/' . $collectionId . '/documents', array_merge($headers, ['content-type' => 'multipart/form-data']), [
|
||||
$res = $this->client->call(
|
||||
Client::METHOD_POST,
|
||||
'/databases/' . $databaseId . '/collections/' . $collectionId . '/documents',
|
||||
array_merge($headers, ['content-type' => 'multipart/form-data']),
|
||||
[
|
||||
'documentId' => 'unique()',
|
||||
'data' => ['name' => $name]
|
||||
]);
|
||||
]
|
||||
);
|
||||
$this->assertEquals($name, $res['body']['name']);
|
||||
$this->assertNotEmpty($res['body']['$id']);
|
||||
$documentId = $res['body']['$id'];
|
||||
|
@ -368,15 +436,19 @@ class UsageTest extends Scope
|
|||
$requestsCount++;
|
||||
$documentsCount++;
|
||||
|
||||
if ($i < 5) {
|
||||
$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']);
|
||||
$documentsCount--;
|
||||
$requestsCount++;
|
||||
}
|
||||
}
|
||||
|
||||
$data = array_merge($data, [
|
||||
return array_merge($data, [
|
||||
'databaseId' => $databaseId,
|
||||
'collectionId' => $collectionId,
|
||||
'requestsCount' => $requestsCount,
|
||||
|
@ -384,8 +456,6 @@ class UsageTest extends Scope
|
|||
'collectionsCount' => $collectionsCount,
|
||||
'documentsCount' => $documentsCount,
|
||||
]);
|
||||
|
||||
return $data;
|
||||
}
|
||||
|
||||
/** @depends testPrepareDatabaseStats */
|
||||
|
@ -403,7 +473,11 @@ class UsageTest extends Scope
|
|||
|
||||
sleep(self::WAIT);
|
||||
|
||||
$res = $this->client->call(Client::METHOD_GET, '/project/usage?range=30d', $data['consoleHeaders']);
|
||||
$res = $this->client->call(
|
||||
Client::METHOD_GET,
|
||||
'/project/usage?range=30d',
|
||||
$data['consoleHeaders']
|
||||
);
|
||||
$res = $res['body'];
|
||||
|
||||
$this->assertEquals(9, count($res));
|
||||
|
@ -416,7 +490,11 @@ class UsageTest extends Scope
|
|||
$this->assertEquals($documentsCount, $res['documents'][array_key_last($res['documents'])]['value']);
|
||||
$this->validateDates($res['documents']);
|
||||
|
||||
$res = $this->client->call(Client::METHOD_GET, '/databases/usage?range=30d', $data['consoleHeaders']);
|
||||
$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']);
|
||||
|
@ -426,7 +504,11 @@ class UsageTest extends Scope
|
|||
$this->assertEquals($documentsCount, $res['documentsCount'][array_key_last($res['documentsCount'])]['value']);
|
||||
$this->validateDates($res['documentsCount']);
|
||||
|
||||
$res = $this->client->call(Client::METHOD_GET, '/databases/' . $databaseId . '/usage?range=30d', $data['consoleHeaders']);
|
||||
$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']);
|
||||
|
@ -451,12 +533,15 @@ class UsageTest extends Scope
|
|||
public function testPrepareFunctionsStats(array $data): array
|
||||
{
|
||||
$headers = $data['headers'];
|
||||
$functionId = '';
|
||||
$executionTime = 0;
|
||||
$executions = 0;
|
||||
$failures = 0;
|
||||
|
||||
$response1 = $this->client->call(Client::METHOD_POST, '/functions', $headers, [
|
||||
$response1 = $this->client->call(
|
||||
Client::METHOD_POST,
|
||||
'/functions',
|
||||
$headers,
|
||||
[
|
||||
'functionId' => 'unique()',
|
||||
'name' => 'Test',
|
||||
'runtime' => 'php-8.0',
|
||||
|
@ -471,7 +556,8 @@ class UsageTest extends Scope
|
|||
],
|
||||
'schedule' => '0 0 1 1 *',
|
||||
'timeout' => 10,
|
||||
]);
|
||||
]
|
||||
);
|
||||
|
||||
$functionId = $response1['body']['$id'] ?? '';
|
||||
|
||||
|
@ -481,11 +567,16 @@ 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',]), [
|
||||
$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'] ?? '';
|
||||
|
||||
|
@ -497,7 +588,11 @@ class UsageTest extends Scope
|
|||
// 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']);
|
||||
|
@ -505,9 +600,14 @@ class UsageTest extends Scope
|
|||
$this->assertEquals(true, DateTime::isValid($response['body']['$updatedAt']));
|
||||
$this->assertEquals($deploymentId, $response['body']['deployment']);
|
||||
|
||||
$execution = $this->client->call(Client::METHOD_POST, '/functions/' . $functionId . '/executions', $headers, [
|
||||
$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']);
|
||||
|
@ -521,9 +621,14 @@ class UsageTest extends Scope
|
|||
$executions++;
|
||||
}
|
||||
|
||||
$execution = $this->client->call(Client::METHOD_POST, '/functions/' . $functionId . '/executions', $headers, [
|
||||
$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']);
|
||||
|
@ -535,9 +640,14 @@ class UsageTest extends Scope
|
|||
}
|
||||
$executionTime += (int) ($execution['body']['duration'] * 1000);
|
||||
|
||||
$execution = $this->client->call(Client::METHOD_POST, '/functions/' . $functionId . '/executions', $headers, [
|
||||
$execution = $this->client->call(
|
||||
Client::METHOD_POST,
|
||||
'/functions/' . $functionId . '/executions',
|
||||
$headers,
|
||||
[
|
||||
'async' => true,
|
||||
]);
|
||||
]
|
||||
);
|
||||
|
||||
$this->assertEquals(202, $execution['headers']['status-code']);
|
||||
$this->assertNotEmpty($execution['body']['$id']);
|
||||
|
@ -545,7 +655,11 @@ class UsageTest extends Scope
|
|||
|
||||
sleep(self::WAIT);
|
||||
|
||||
$execution = $this->client->call(Client::METHOD_GET, '/functions/' . $functionId . '/executions/' . $execution['body']['$id'], $headers);
|
||||
$execution = $this->client->call(
|
||||
Client::METHOD_GET,
|
||||
'/functions/' . $functionId . '/executions/' . $execution['body']['$id'],
|
||||
$headers
|
||||
);
|
||||
|
||||
if ($execution['body']['status'] == 'failed') {
|
||||
$failures++;
|
||||
|
@ -555,29 +669,28 @@ class UsageTest extends Scope
|
|||
|
||||
$executionTime += (int) ($execution['body']['duration'] * 1000);
|
||||
|
||||
$data = array_merge($data, [
|
||||
return array_merge($data, [
|
||||
'functionId' => $functionId,
|
||||
'executionTime' => $executionTime,
|
||||
'executions' => $executions,
|
||||
'failures' => $failures,
|
||||
]);
|
||||
|
||||
return $data;
|
||||
}
|
||||
|
||||
/** @depends testPrepareFunctionsStats */
|
||||
public function testFunctionsStats(array $data): void
|
||||
{
|
||||
$headers = $data['headers'];
|
||||
$functionId = $data['functionId'];
|
||||
$executionTime = $data['executionTime'];
|
||||
$executions = $data['executions'];
|
||||
$failures = $data['failures'];
|
||||
|
||||
|
||||
sleep(self::WAIT);
|
||||
|
||||
$response = $this->client->call(Client::METHOD_GET, '/functions/' . $functionId . '/usage?range=30d', $data['consoleHeaders']);
|
||||
$response = $this->client->call(
|
||||
Client::METHOD_GET,
|
||||
'/functions/' . $functionId . '/usage?range=30d',
|
||||
$data['consoleHeaders']
|
||||
);
|
||||
|
||||
$this->assertEquals(200, $response['headers']['status-code']);
|
||||
$this->assertEquals(7, count($response['body']));
|
||||
|
@ -597,7 +710,11 @@ class UsageTest extends Scope
|
|||
$this->assertEquals($executionTime, $response['executionsCompute'][array_key_last($response['executionsCompute'])]['value']);
|
||||
$this->validateDates($response['executionsCompute']);
|
||||
|
||||
$response = $this->client->call(Client::METHOD_GET, '/functions/usage?range=30d', $data['consoleHeaders']);
|
||||
$response = $this->client->call(
|
||||
Client::METHOD_GET,
|
||||
'/functions/usage?range=30d',
|
||||
$data['consoleHeaders']
|
||||
);
|
||||
|
||||
$this->assertEquals(200, $response['headers']['status-code']);
|
||||
$this->assertEquals(8, count($response['body']));
|
||||
|
|
Loading…
Reference in a new issue