Merge branch '1.5.x' into fix-templates-copy-hidden-files

This commit is contained in:
Luke B. Silver 2024-02-26 09:29:08 +00:00 committed by GitHub
commit 00c8774554
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
49 changed files with 158 additions and 41 deletions

View file

@ -4,7 +4,7 @@
"settings.direction": "ltr",
"emails.sender": "El equipo de %s",
"emails.verification.subject": "Verificación de cuenta",
"emails.verification.hello": "Hola, {{name}}",
"emails.verification.hello": "Hola, {{name}}.",
"emails.verification.body": "Haz clic en este enlace para verificar tu correo:",
"emails.verification.footer": "Si no has solicitado verificar este correo, puedes ignorar este mensaje.",
"emails.verification.thanks": "Gracias.",
@ -16,7 +16,7 @@
"emails.magicSession.thanks": "Gracias.",
"emails.magicSession.signature": "El equipo de {{project}}",
"emails.recovery.subject": "Restablecer contraseña",
"emails.recovery.hello": "Hola, {{name}}",
"emails.recovery.hello": "Hola, {{name}}.",
"emails.recovery.body": "Haz clic en este enlace para restablecer la contraseña de {{project}}:",
"emails.recovery.footer": "Si no has solicitado restablecer la contraseña, puedes ignorar este mensaje.",
"emails.recovery.thanks": "Gracias.",
@ -236,10 +236,10 @@
"emails.magicSession.securityPhrase": "La frase de seguridad para este correo electrónico es {{phrase}}. Puedes confiar en este correo electrónico si esta frase coincide con la frase que se muestra durante el inicio de sesión.",
"emails.magicSession.optionUrl": "Si no puedes iniciar sesión utilizando el botón anterior, visita el siguiente enlace:",
"emails.otpSession.subject": "Inicio de sesión en {{project}}",
"emails.otpSession.hello": "Hola,",
"emails.otpSession.hello": "Hola",
"emails.otpSession.description": "Ingrese el siguiente código de verificación cuando se le solicite para iniciar sesión de forma segura en su cuenta de {{project}}. Expirará en 15 minutos.",
"emails.otpSession.clientInfo": "Este inicio de sesión fue solicitado usando {{agentClient}} en {{agentDevice}} {{agentOs}}. Si no solicitaste el inicio de sesión, puedes ignorar este correo electrónico de forma segura.",
"emails.otpSession.securityPhrase": "La frase de seguridad para este correo electrónico es {{phrase}}. Puedes confiar en este correo si esta frase coincide con la frase mostrada durante el inicio de sesión.",
"emails.otpSession.thanks": "Gracias,",
"emails.otpSession.signature": "equipo {{project}}"
}
"emails.otpSession.thanks": "Gracias.",
"emails.otpSession.signature": "El equipo de {{project}}"
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -1 +1 @@
Subproject commit c72ba12e479b0d3d9b3f4e48e01625c12a38fd7f
Subproject commit f196bcfb485adfb36324aabf32a3449471319bbd

View file

@ -2700,7 +2700,7 @@ App::delete('/v1/account/sessions/:sessionId')
});
App::patch('/v1/account/sessions/:sessionId')
->desc('Update (or renew) a session')
->desc('Update (or renew) session')
->groups(['api', 'account'])
->label('scope', 'account')
->label('event', 'users.[userId].sessions.[sessionId].update')
@ -2994,7 +2994,7 @@ App::post('/v1/account/recovery')
$queueForMails
->setRecipient($profile->getAttribute('email', ''))
->setName($profile->getAttribute('name'))
->setName($profile->getAttribute('name', ''))
->setBody($body)
->setVariables($emailVariables)
->setSubject($subject)
@ -4024,7 +4024,7 @@ App::delete('/v1/account')
});
App::post('/v1/account/targets/push')
->desc('Create a push target')
->desc('Create push target')
->groups(['api', 'account'])
->label('scope', 'targets.write')
->label('audits.event', 'target.create')
@ -4097,7 +4097,7 @@ App::post('/v1/account/targets/push')
});
App::put('/v1/account/targets/:targetId/push')
->desc('Update a push target')
->desc('Update push target')
->groups(['api', 'account'])
->label('scope', 'targets.write')
->label('audits.event', 'target.update')
@ -4152,7 +4152,7 @@ App::put('/v1/account/targets/:targetId/push')
});
App::delete('/v1/account/targets/:targetId/push')
->desc('Delete a push target')
->desc('Delete push target')
->groups(['api', 'account'])
->label('scope', 'targets.write')
->label('audits.event', 'target.delete')

View file

@ -2404,7 +2404,7 @@ App::post('/v1/databases/:databaseId/collections/:collectionId/indexes')
->param('databaseId', '', new UID(), 'Database ID.')
->param('collectionId', '', new UID(), 'Collection ID. You can create a new collection using the Database service [server integration](https://appwrite.io/docs/server/databases#databasesCreateCollection).')
->param('key', null, new Key(), 'Index Key.')
->param('type', null, new WhiteList([Database::INDEX_KEY, Database::INDEX_FULLTEXT, Database::INDEX_UNIQUE, Database::INDEX_SPATIAL]), 'Index type.')
->param('type', null, new WhiteList([Database::INDEX_KEY, Database::INDEX_FULLTEXT, Database::INDEX_UNIQUE]), 'Index type.')
->param('attributes', null, new ArrayList(new Key(true), APP_LIMIT_ARRAY_PARAMS_SIZE), 'Array of attributes to index. Maximum of ' . APP_LIMIT_ARRAY_PARAMS_SIZE . ' attributes are allowed, each 32 characters long.')
->param('orders', [], new ArrayList(new WhiteList(['ASC', 'DESC'], false, Database::VAR_STRING), APP_LIMIT_ARRAY_PARAMS_SIZE), 'Array of index orders. Maximum of ' . APP_LIMIT_ARRAY_PARAMS_SIZE . ' orders are allowed.', true)
->inject('response')
@ -3090,6 +3090,33 @@ App::get('/v1/databases/:databaseId/collections/:collectionId/documents')
$processDocument($collection, $document);
}
$select = \array_reduce($queries, function ($result, $query) {
return $result || ($query->getMethod() === Query::TYPE_SELECT);
}, false);
// Check if the SELECT query includes $databaseId and $collectionId
$hasDatabaseId = false;
$hasCollectionId = false;
if ($select) {
$hasDatabaseId = \array_reduce($queries, function ($result, $query) {
return $result || ($query->getMethod() === Query::TYPE_SELECT && \in_array('$databaseId', $query->getValues()));
}, false);
$hasCollectionId = \array_reduce($queries, function ($result, $query) {
return $result || ($query->getMethod() === Query::TYPE_SELECT && \in_array('$collectionId', $query->getValues()));
}, false);
}
if ($select) {
foreach ($documents as $document) {
if (!$hasDatabaseId) {
$document->removeAttribute('$databaseId');
}
if (!$hasCollectionId) {
$document->removeAttribute('$collectionId');
}
}
}
$response->dynamic(new Document([
'total' => $total,
'documents' => $documents,
@ -3635,7 +3662,7 @@ App::delete('/v1/databases/:databaseId/collections/:collectionId/documents/:docu
});
App::get('/v1/databases/usage')
->desc('Get usage stats for the database')
->desc('Get databases usage stats')
->groups(['api', 'database', 'usage'])
->label('scope', 'collections.read')
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
@ -3713,7 +3740,7 @@ App::get('/v1/databases/usage')
});
App::get('/v1/databases/:databaseId/usage')
->desc('Get usage stats for the database')
->desc('Get database usage stats')
->groups(['api', 'database', 'usage'])
->label('scope', 'collections.read')
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
@ -3797,7 +3824,7 @@ App::get('/v1/databases/:databaseId/usage')
App::get('/v1/databases/:databaseId/collections/:collectionId/usage')
->alias('/v1/database/:collectionId/usage', ['databaseId' => 'default'])
->desc('Get usage stats for a collection')
->desc('Get collection usage stats')
->groups(['api', 'database', 'usage'])
->label('scope', 'collections.read')
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])

View file

@ -145,7 +145,7 @@ App::post('/v1/messaging/providers/sendgrid')
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN, APP_AUTH_TYPE_KEY])
->label('sdk.namespace', 'messaging')
->label('sdk.method', 'createSendgridProvider')
->label('sdk.description', '/docs/references/messaging/create-sengrid-provider.md')
->label('sdk.description', '/docs/references/messaging/create-sendgrid-provider.md')
->label('sdk.response.code', Response::STATUS_CODE_CREATED)
->label('sdk.response.type', Response::CONTENT_TYPE_JSON)
->label('sdk.response.model', Response::MODEL_PROVIDER)
@ -1924,7 +1924,7 @@ App::delete('/v1/messaging/providers/:providerId')
});
App::post('/v1/messaging/topics')
->desc('Create a topic')
->desc('Create topic')
->groups(['api', 'messaging'])
->label('audits.event', 'topic.create')
->label('audits.resource', 'topic/{response.$id}')
@ -2107,7 +2107,7 @@ App::get('/v1/messaging/topics/:topicId/logs')
});
App::get('/v1/messaging/topics/:topicId')
->desc('Get a topic')
->desc('Get topic')
->groups(['api', 'messaging'])
->label('scope', 'topics.read')
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN, APP_AUTH_TYPE_KEY])
@ -2134,7 +2134,7 @@ App::get('/v1/messaging/topics/:topicId')
});
App::patch('/v1/messaging/topics/:topicId')
->desc('Update a topic')
->desc('Update topic')
->groups(['api', 'messaging'])
->label('audits.event', 'topic.update')
->label('audits.resource', 'topic/{response.$id}')
@ -2178,7 +2178,7 @@ App::patch('/v1/messaging/topics/:topicId')
});
App::delete('/v1/messaging/topics/:topicId')
->desc('Delete a topic')
->desc('Delete topic')
->groups(['api', 'messaging'])
->label('audits.event', 'topic.delete')
->label('audits.resource', 'topic/{request.$topicId}')
@ -2218,7 +2218,7 @@ App::delete('/v1/messaging/topics/:topicId')
});
App::post('/v1/messaging/topics/:topicId/subscribers')
->desc('Create a subscriber')
->desc('Create subscriber')
->groups(['api', 'messaging'])
->label('audits.event', 'subscriber.create')
->label('audits.resource', 'subscriber/{response.$id}')
@ -2477,7 +2477,7 @@ App::get('/v1/messaging/subscribers/:subscriberId/logs')
});
App::get('/v1/messaging/topics/:topicId/subscribers/:subscriberId')
->desc('Get a subscriber')
->desc('Get subscriber')
->groups(['api', 'messaging'])
->label('scope', 'subscribers.read')
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN, APP_AUTH_TYPE_KEY])
@ -2516,7 +2516,7 @@ App::get('/v1/messaging/topics/:topicId/subscribers/:subscriberId')
});
App::delete('/v1/messaging/topics/:topicId/subscribers/:subscriberId')
->desc('Delete a subscriber')
->desc('Delete subscriber')
->groups(['api', 'messaging'])
->label('audits.event', 'subscriber.delete')
->label('audits.resource', 'subscriber/{request.$subscriberId}')
@ -2575,7 +2575,7 @@ App::delete('/v1/messaging/topics/:topicId/subscribers/:subscriberId')
});
App::post('/v1/messaging/messages/email')
->desc('Create an email')
->desc('Create email')
->groups(['api', 'messaging'])
->label('audits.event', 'message.create')
->label('audits.resource', 'message/{response.$id}')
@ -2719,7 +2719,7 @@ App::post('/v1/messaging/messages/email')
});
App::post('/v1/messaging/messages/sms')
->desc('Create an SMS')
->desc('Create SMS')
->groups(['api', 'messaging'])
->label('audits.event', 'message.create')
->label('audits.resource', 'message/{response.$id}')
@ -2827,7 +2827,7 @@ App::post('/v1/messaging/messages/sms')
});
App::post('/v1/messaging/messages/push')
->desc('Create a push notification')
->desc('Create push notification')
->groups(['api', 'messaging'])
->label('audits.event', 'message.create')
->label('audits.resource', 'message/{response.$id}')
@ -3190,7 +3190,7 @@ App::get('/v1/messaging/messages/:messageId/targets')
});
App::get('/v1/messaging/messages/:messageId')
->desc('Get a message')
->desc('Get message')
->groups(['api', 'messaging'])
->label('scope', 'messages.read')
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN, APP_AUTH_TYPE_KEY])
@ -3214,7 +3214,7 @@ App::get('/v1/messaging/messages/:messageId')
});
App::patch('/v1/messaging/messages/email/:messageId')
->desc('Update an email')
->desc('Update email')
->groups(['api', 'messaging'])
->label('audits.event', 'message.update')
->label('audits.resource', 'message/{response.$id}')
@ -3352,7 +3352,7 @@ App::patch('/v1/messaging/messages/email/:messageId')
});
App::patch('/v1/messaging/messages/sms/:messageId')
->desc('Update an SMS')
->desc('Update SMS')
->groups(['api', 'messaging'])
->label('audits.event', 'message.update')
->label('audits.resource', 'message/{response.$id}')
@ -3470,7 +3470,7 @@ App::patch('/v1/messaging/messages/sms/:messageId')
});
App::patch('/v1/messaging/messages/push/:messageId')
->desc('Update a push notification')
->desc('Update push notification')
->groups(['api', 'messaging'])
->label('audits.event', 'message.update')
->label('audits.resource', 'message/{response.$id}')
@ -3661,7 +3661,7 @@ App::patch('/v1/messaging/messages/push/:messageId')
});
App::delete('/v1/messaging/messages/:messageId')
->desc('Delete a message')
->desc('Delete message')
->groups(['api', 'messaging'])
->label('audits.event', 'message.delete')
->label('audits.resource', 'message/{request.route.messageId}')

View file

@ -1038,7 +1038,7 @@ App::delete('/v1/migrations/:migrationId')
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
->label('sdk.namespace', 'migrations')
->label('sdk.method', 'delete')
->label('sdk.description', '/docs/references/functions/delete-migration.md')
->label('sdk.description', '/docs/references/migrations/delete-migration.md')
->label('sdk.response.code', Response::STATUS_CODE_NOCONTENT)
->label('sdk.response.model', Response::MODEL_NONE)
->param('migrationId', '', new UID(), 'Migration ID.')

View file

@ -18,7 +18,7 @@ use Utopia\Validator\Text;
use Utopia\Validator\WhiteList;
App::get('/v1/project/usage')
->desc('Get usage stats for a project')
->desc('Get project usage stats')
->groups(['api', 'usage'])
->label('scope', 'projects.read')
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])

View file

@ -1514,7 +1514,7 @@ App::delete('/v1/storage/buckets/:bucketId/files/:fileId')
});
App::get('/v1/storage/usage')
->desc('Get usage stats for storage')
->desc('Get storage usage stats')
->groups(['api', 'storage'])
->label('scope', 'files.read')
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
@ -1593,7 +1593,7 @@ App::get('/v1/storage/usage')
});
App::get('/v1/storage/:bucketId/usage')
->desc('Get usage stats for storage bucket')
->desc('Get bucket usage stats')
->groups(['api', 'storage'])
->label('scope', 'files.read')
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])

View file

@ -756,8 +756,20 @@ App::get('/v1/teams/:teamId/memberships')
$memberships = array_map(function ($membership) use ($dbForProject, $team) {
$user = $dbForProject->getDocument('users', $membership->getAttribute('userId'));
$mfa = $user->getAttribute('mfa', false);
if ($mfa) {
$totpEnabled = $user->getAttribute('totp', false) && $user->getAttribute('totpVerification', false);
$emailEnabled = $user->getAttribute('email', false) && $user->getAttribute('emailVerification', false);
$phoneEnabled = $user->getAttribute('phone', false) && $user->getAttribute('phoneVerification', false);
if (!$totpEnabled && !$emailEnabled && !$phoneEnabled) {
$mfa = false;
}
}
$membership
->setAttribute('mfa', $user->getAttribute('mfa'))
->setAttribute('mfa', $mfa)
->setAttribute('teamName', $team->getAttribute('name'))
->setAttribute('userName', $user->getAttribute('name'))
->setAttribute('userEmail', $user->getAttribute('email'))
@ -805,7 +817,20 @@ App::get('/v1/teams/:teamId/memberships/:membershipId')
$user = $dbForProject->getDocument('users', $membership->getAttribute('userId'));
$mfa = $user->getAttribute('mfa', false);
if ($mfa) {
$totpEnabled = $user->getAttribute('totp', false) && $user->getAttribute('totpVerification', false);
$emailEnabled = $user->getAttribute('email', false) && $user->getAttribute('emailVerification', false);
$phoneEnabled = $user->getAttribute('phone', false) && $user->getAttribute('phoneVerification', false);
if (!$totpEnabled && !$emailEnabled && !$phoneEnabled) {
$mfa = false;
}
}
$membership
->setAttribute('mfa', $mfa)
->setAttribute('teamName', $team->getAttribute('name'))
->setAttribute('userName', $user->getAttribute('name'))
->setAttribute('userEmail', $user->getAttribute('email'))

View file

@ -71,7 +71,14 @@ function createUser(string $hash, mixed $hashOptions, string $userId, ?string $e
: ID::custom($userId);
if ($project->getAttribute('auths', [])['personalDataCheck'] ?? false) {
$personalDataValidator = new PersonalData($userId, $email, $name, $phone);
$personalDataValidator = new PersonalData(
$userId,
$email,
$name,
$phone,
strict: false,
allowEmpty: true
);
if (!$personalDataValidator->isValid($plaintextPassword)) {
throw new Exception(Exception::USER_PASSWORD_PERSONAL_DATA);
}
@ -1968,7 +1975,7 @@ App::delete('/v1/users/identities/:identityId')
});
App::get('/v1/users/usage')
->desc('Get usage stats for the users API')
->desc('Get users usage stats')
->groups(['api', 'users'])
->label('scope', 'users.read')
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])

View file

@ -0,0 +1 @@
Add an authenticator app to be used as an MFA factor. Verify the authenticator using the [verify authenticator](/docs/references/cloud/client-web/account#verifyAuthenticator) method.

View file

@ -0,0 +1 @@
Initialize an MFA challenge of the specified factor. The factor must be available on the account.

View file

@ -0,0 +1 @@
Delete an authenticator for a user by ID.

View file

@ -0,0 +1 @@
List the factors available on the account to be used as a MFA challange.

View file

@ -0,0 +1 @@
Complete the MFA challenge by providing the one-time password.

View file

@ -0,0 +1 @@
Enable or disable MFA on an account.

View file

@ -0,0 +1 @@
Verify an authenticator app after adding it using the [add authenticator](/docs/references/cloud/client-web/account#addAuthenticator) method.

View file

@ -0,0 +1 @@
Create an enumeration attribute. The `elements` param acts as a white-list of accepted values for this attribute.

View file

@ -0,0 +1 @@
Create a date time attribute according to the ISO 8601 standard.

View file

@ -0,0 +1,2 @@
Creates an index on the attributes listed. Your index should include all the attributes you will query in a single request.
Attributes can be `key`, `fulltext`, and `unique`.

View file

@ -0,0 +1 @@
Deletes an attribute.

View file

@ -0,0 +1 @@
Delete an index.

View file

@ -0,0 +1 @@
Get attribute by ID.

View file

@ -0,0 +1 @@
Get index by ID.

View file

@ -0,0 +1 @@
List attributes in the collection.

View file

@ -0,0 +1 @@
List indexes in the collection.

View file

@ -0,0 +1 @@
Update a boolean attribute. Changing the `default` value will not update already existing documents.

View file

@ -0,0 +1 @@
Update a date time attribute. Changing the `default` value will not update already existing documents.

View file

@ -0,0 +1 @@
Get the number of function executions that are waiting to be processed in the Appwrite internal queue server.

View file

@ -0,0 +1 @@
Delete a message. If the message is not a draft or scheduled, but has been sent, this will not recall the message.

View file

@ -0,0 +1 @@
Create a messaging target.

View file

@ -0,0 +1 @@
Delete an authenticator app.

View file

@ -0,0 +1 @@
Delete a messaging target.

View file

@ -0,0 +1 @@
Get a user's push notification target by ID.

View file

@ -0,0 +1 @@
List the factors available on the account to be used as a MFA challange.

View file

@ -0,0 +1 @@
List the messaging targets that are associated with a user.

View file

@ -0,0 +1 @@
Update a messaging target.

View file

@ -0,0 +1 @@
Enable or disable MFA on a user account.

View file

@ -12,9 +12,10 @@ class PersonalData extends Password
protected ?string $email = null,
protected ?string $name = null,
protected ?string $phone = null,
protected bool $strict = false
protected bool $strict = false,
protected bool $allowEmpty = false,
) {
parent::__construct();
parent::__construct($allowEmpty);
}
/**

View file

@ -4532,6 +4532,8 @@ trait DatabasesBase
$this->assertEquals(2, count($response['body']['documents']));
$this->assertEquals(null, $response['body']['documents'][0]['fullName']);
$this->assertArrayNotHasKey("libraries", $response['body']['documents'][0]);
$this->assertArrayNotHasKey('$databaseId', $response['body']['documents'][0]);
$this->assertArrayNotHasKey('$collectionId', $response['body']['documents'][0]);
}
/**
@ -4551,6 +4553,8 @@ trait DatabasesBase
$this->assertEquals(200, $response['headers']['status-code']);
$this->assertArrayNotHasKey('libraries', $response['body']['documents'][0]);
$this->assertArrayNotHasKey('$databaseId', $response['body']['documents'][0]);
$this->assertArrayNotHasKey('$collectionId', $response['body']['documents'][0]);
$response = $this->client->call(Client::METHOD_GET, '/databases/' . $data['databaseId'] . '/collections/' . $data['personCollection'] . '/documents', array_merge([
'content-type' => 'application/json',
@ -4563,6 +4567,8 @@ trait DatabasesBase
$document = $response['body']['documents'][0];
$this->assertEquals(200, $response['headers']['status-code']);
$this->assertArrayHasKey('libraries', $document);
$this->assertArrayNotHasKey('$databaseId', $document);
$this->assertArrayNotHasKey('$collectionId', $document);
$response = $this->client->call(Client::METHOD_GET, '/databases/' . $data['databaseId'] . '/collections/' . $data['personCollection'] . '/documents/' . $document['$id'], array_merge([
'content-type' => 'application/json',

View file

@ -1731,6 +1731,19 @@ class ProjectsConsoleClientTest extends Scope
$this->assertEquals(201, $response['headers']['status-code']);
$response = $this->client->call(Client::METHOD_POST, '/users', array_merge($this->getHeaders(), [
'content-type' => 'application/json',
'x-appwrite-project' => $id,
'x-appwrite-mode' => 'admin',
]), [
// Empty password
'email' => uniqid() . 'user@localhost.test',
'name' => 'User',
'userId' => ID::unique(),
]);
$this->assertEquals(201, $response['headers']['status-code']);
$email = uniqid() . 'user@localhost.test';
$userId = ID::unique();
$response = $this->client->call(Client::METHOD_POST, '/users', array_merge($this->getHeaders(), [

View file

@ -30,6 +30,7 @@ trait TeamsBaseClient
$this->assertEquals(200, $response['headers']['status-code']);
$this->assertIsInt($response['body']['total']);
$this->assertNotEmpty($response['body']['memberships'][0]['$id']);
$this->assertFalse($response['body']['memberships'][0]['mfa']);
$this->assertEquals($this->getUser()['name'], $response['body']['memberships'][0]['userName']);
$this->assertEquals($this->getUser()['email'], $response['body']['memberships'][0]['userEmail']);
$this->assertEquals($teamName, $response['body']['memberships'][0]['teamName']);
@ -155,6 +156,7 @@ trait TeamsBaseClient
$this->assertEquals(200, $response['headers']['status-code']);
$this->assertNotEmpty($response['body']['$id']);
$this->assertFalse($response['body']['mfa']);
$this->assertNotEmpty($response['body']['userId']);
$this->assertNotEmpty($response['body']['userName']);
$this->assertNotEmpty($response['body']['userEmail']);

View file

@ -51,6 +51,7 @@ trait TeamsBaseServer
$this->assertEquals(200, $response['headers']['status-code']);
$this->assertNotEmpty($response['body']['$id']);
$this->assertNotEmpty($response['body']['userId']);
$this->assertFalse($response['body']['mfa']);
$this->assertNotEmpty($response['body']['userName']);
$this->assertNotEmpty($response['body']['userEmail']);
$this->assertNotEmpty($response['body']['teamId']);