Tests - work in progress
This commit is contained in:
parent
2181683c13
commit
f5f074eb86
|
@ -4,11 +4,11 @@
|
||||||
|
|
||||||
* Upgraded core API PHP version to 7.4
|
* Upgraded core API PHP version to 7.4
|
||||||
* New database rule validation options
|
* New database rule validation options
|
||||||
* Update docs example with auth info
|
|
||||||
* Allow non-web platform skip origin header
|
* Allow non-web platform skip origin header
|
||||||
* Limited to console UI to show max 5 alerts at the same time
|
* Limited console dashboard to show max 5 alerts at the same time
|
||||||
* Added new webhooks events
|
* Added new webhooks events
|
||||||
* Normnailized all webhooks event names
|
* Normailized all webhooks event names
|
||||||
|
* Merged Auth and Account service for making the API more REST compatible
|
||||||
|
|
||||||
## Bug Fixes
|
## Bug Fixes
|
||||||
|
|
||||||
|
|
12
app/app.php
12
app/app.php
|
@ -211,7 +211,7 @@ $utopia->shutdown(function () use ($response, $request, $webhook, $audit, $usage
|
||||||
if (!empty($webhook->getParam('event'))) {
|
if (!empty($webhook->getParam('event'))) {
|
||||||
$webhook->trigger();
|
$webhook->trigger();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!empty($audit->getParam('event'))) {
|
if (!empty($audit->getParam('event'))) {
|
||||||
$audit->trigger();
|
$audit->trigger();
|
||||||
}
|
}
|
||||||
|
@ -361,7 +361,7 @@ $utopia->get('/humans.txt')
|
||||||
);
|
);
|
||||||
|
|
||||||
$utopia->get('/v1/info') // This is only visible to gods
|
$utopia->get('/v1/info') // This is only visible to gods
|
||||||
->label('scope', 'god')
|
->label('scope', 'god')
|
||||||
->label('docs', false)
|
->label('docs', false)
|
||||||
->action(
|
->action(
|
||||||
function () use ($response, $user, $project, $version, $env) { //TODO CONSIDER BLOCKING THIS ACTION TO ROLE GOD
|
function () use ($response, $user, $project, $version, $env) { //TODO CONSIDER BLOCKING THIS ACTION TO ROLE GOD
|
||||||
|
@ -410,7 +410,7 @@ $utopia->get('/v1/proxy')
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
$utopia->get('/v1/open-api-2.json')
|
$utopia->get('/v1/open-api-2.json')
|
||||||
->label('scope', 'public')
|
->label('scope', 'public')
|
||||||
->label('docs', false)
|
->label('docs', false)
|
||||||
->param('platform', 'client', function () {return new WhiteList(['client', 'server']);}, 'Choose target platform.', true)
|
->param('platform', 'client', function () {return new WhiteList(['client', 'server']);}, 'Choose target platform.', true)
|
||||||
|
@ -740,6 +740,7 @@ $utopia->get('/v1/debug')
|
||||||
->action(
|
->action(
|
||||||
function () use ($response, $request, $utopia, $domain, $services) {
|
function () use ($response, $request, $utopia, $domain, $services) {
|
||||||
$output = [
|
$output = [
|
||||||
|
'scopes' => [],
|
||||||
'webhooks' => [],
|
'webhooks' => [],
|
||||||
'methods' => [],
|
'methods' => [],
|
||||||
'routes' => [],
|
'routes' => [],
|
||||||
|
@ -767,6 +768,10 @@ $utopia->get('/v1/debug')
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($route->getLabel('scope', false)) {
|
||||||
|
$output['scopes'][$route->getLabel('scope', false)] = $route->getMethod().' '.$route->getURL();
|
||||||
|
}
|
||||||
|
|
||||||
if ($route->getLabel('sdk.description', false)) {
|
if ($route->getLabel('sdk.description', false)) {
|
||||||
if(!realpath(__DIR__.'/../'.$route->getLabel('sdk.description', false))) {
|
if(!realpath(__DIR__.'/../'.$route->getLabel('sdk.description', false))) {
|
||||||
throw new Exception('Docs file ('.$route->getLabel('sdk.description', false).') is missing', 500);
|
throw new Exception('Docs file ('.$route->getLabel('sdk.description', false).') is missing', 500);
|
||||||
|
@ -802,6 +807,7 @@ $utopia->get('/v1/debug')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ksort($output['scopes']);
|
||||||
ksort($output['webhooks']);
|
ksort($output['webhooks']);
|
||||||
ksort($output['methods']);
|
ksort($output['methods']);
|
||||||
ksort($output['routes']);
|
ksort($output['routes']);
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
<a href="{{redirect}}">{{redirect}}</a>
|
<a href="{{redirect}}">{{redirect}}</a>
|
||||||
<br />
|
<br />
|
||||||
<br />
|
<br />
|
||||||
If you didn’t ask to reset your password, you can ignore this message.
|
If you didn't ask to reset your password, you can ignore this message.
|
||||||
<br />
|
<br />
|
||||||
<br />
|
<br />
|
||||||
Thanks,
|
Thanks,
|
||||||
|
|
|
@ -1,8 +1,10 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
global $utopia, $register, $request, $response, $user, $audit, $webhook, $project, $domain, $projectDB, $providers, $clients;
|
global $utopia, $register, $request, $response, $user, $audit,
|
||||||
|
$webhook, $project, $domain, $projectDB, $providers, $clients;
|
||||||
|
|
||||||
use Utopia\Exception;
|
use Utopia\Exception;
|
||||||
|
use Utopia\Response;
|
||||||
use Utopia\Validator\Text;
|
use Utopia\Validator\Text;
|
||||||
use Utopia\Validator\Email;
|
use Utopia\Validator\Email;
|
||||||
use Utopia\Validator\WhiteList;
|
use Utopia\Validator\WhiteList;
|
||||||
|
@ -24,6 +26,20 @@ use OpenSSL\OpenSSL;
|
||||||
|
|
||||||
include_once __DIR__ . '/../shared/api.php';
|
include_once __DIR__ . '/../shared/api.php';
|
||||||
|
|
||||||
|
$oauthKeys = [];
|
||||||
|
|
||||||
|
$utopia->init(function() use ($providers, &$oauthKeys) {
|
||||||
|
foreach ($providers as $key => $provider) {
|
||||||
|
if (!$provider['enabled']) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$oauthKeys[] = 'oauth'.ucfirst($key);
|
||||||
|
$oauthKeys[] = 'oauth'.ucfirst($key).'AccessToken';
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
$utopia->get('/v1/account')
|
$utopia->get('/v1/account')
|
||||||
->desc('Get Account')
|
->desc('Get Account')
|
||||||
->label('scope', 'account')
|
->label('scope', 'account')
|
||||||
|
@ -31,18 +47,7 @@ $utopia->get('/v1/account')
|
||||||
->label('sdk.method', 'getAccount')
|
->label('sdk.method', 'getAccount')
|
||||||
->label('sdk.description', '/docs/references/account/get.md')
|
->label('sdk.description', '/docs/references/account/get.md')
|
||||||
->action(
|
->action(
|
||||||
function () use ($response, &$user, $providers) {
|
function () use ($response, &$user, $oauthKeys) {
|
||||||
$oauthKeys = [];
|
|
||||||
|
|
||||||
foreach ($providers as $key => $provider) {
|
|
||||||
if (!$provider['enabled']) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
$oauthKeys[] = 'oauth'.ucfirst($key);
|
|
||||||
$oauthKeys[] = 'oauth'.ucfirst($key).'AccessToken';
|
|
||||||
}
|
|
||||||
|
|
||||||
$response->json(array_merge($user->getArrayCopy(array_merge(
|
$response->json(array_merge($user->getArrayCopy(array_merge(
|
||||||
[
|
[
|
||||||
'$uid',
|
'$uid',
|
||||||
|
@ -109,7 +114,7 @@ $utopia->get('/v1/account/sessions')
|
||||||
$dd->parse();
|
$dd->parse();
|
||||||
|
|
||||||
$sessions[$index] = [
|
$sessions[$index] = [
|
||||||
'id' => $token->getUid(),
|
'$uid' => $token->getUid(),
|
||||||
'OS' => $dd->getOs(),
|
'OS' => $dd->getOs(),
|
||||||
'client' => $dd->getClient(),
|
'client' => $dd->getClient(),
|
||||||
'device' => $dd->getDevice(),
|
'device' => $dd->getDevice(),
|
||||||
|
@ -146,6 +151,7 @@ $utopia->get('/v1/account/logs')
|
||||||
function () use ($response, $register, $project, $user) {
|
function () use ($response, $register, $project, $user) {
|
||||||
$adapter = new AuditAdapter($register->get('db'));
|
$adapter = new AuditAdapter($register->get('db'));
|
||||||
$adapter->setNamespace('app_'.$project->getUid());
|
$adapter->setNamespace('app_'.$project->getUid());
|
||||||
|
|
||||||
$audit = new Audit($adapter);
|
$audit = new Audit($adapter);
|
||||||
$countries = Locale::getText('countries');
|
$countries = Locale::getText('countries');
|
||||||
|
|
||||||
|
@ -220,7 +226,7 @@ $utopia->post('/v1/account')
|
||||||
->param('password', '', function () { return new Password(); }, 'User password')
|
->param('password', '', function () { return new Password(); }, 'User password')
|
||||||
->param('name', '', function () { return new Text(100); }, 'User name', true)
|
->param('name', '', function () { return new Text(100); }, 'User name', true)
|
||||||
->action(
|
->action(
|
||||||
function ($email, $password, $name) use ($request, $response, $providers, $audit, $projectDB, $project, $webhook) {
|
function ($email, $password, $name) use ($register, $request, $response, $audit, $projectDB, $project, $webhook, $oauthKeys) {
|
||||||
if ('console' === $project->getUid()) {
|
if ('console' === $project->getUid()) {
|
||||||
$whitlistEmails = $project->getAttribute('authWhitelistEmails');
|
$whitlistEmails = $project->getAttribute('authWhitelistEmails');
|
||||||
$whitlistIPs = $project->getAttribute('authWhitelistIPs');
|
$whitlistIPs = $project->getAttribute('authWhitelistIPs');
|
||||||
|
@ -276,14 +282,6 @@ $utopia->post('/v1/account')
|
||||||
throw new Exception('Failed saving user to DB', 500);
|
throw new Exception('Failed saving user to DB', 500);
|
||||||
}
|
}
|
||||||
|
|
||||||
Authorization::setRole('user:'.$user->getUid());
|
|
||||||
|
|
||||||
$user = $projectDB->createDocument($user->getArrayCopy());
|
|
||||||
|
|
||||||
if (false === $user) {
|
|
||||||
throw new Exception('Failed saving tokens to DB', 500);
|
|
||||||
}
|
|
||||||
|
|
||||||
$webhook
|
$webhook
|
||||||
->setParam('payload', [
|
->setParam('payload', [
|
||||||
'name' => $name,
|
'name' => $name,
|
||||||
|
@ -297,26 +295,17 @@ $utopia->post('/v1/account')
|
||||||
->setParam('resource', 'users/'.$user->getUid())
|
->setParam('resource', 'users/'.$user->getUid())
|
||||||
;
|
;
|
||||||
|
|
||||||
$oauthKeys = [];
|
$response
|
||||||
|
->setStatusCode(Response::STATUS_CODE_CREATED)
|
||||||
foreach ($providers as $key => $provider) {
|
->json(array_merge($user->getArrayCopy(array_merge(
|
||||||
if (!$provider['enabled']) {
|
[
|
||||||
continue;
|
'$uid',
|
||||||
}
|
'email',
|
||||||
|
'registration',
|
||||||
$oauthKeys[] = 'oauth'.ucfirst($key);
|
'name',
|
||||||
$oauthKeys[] = 'oauth'.ucfirst($key).'AccessToken';
|
],
|
||||||
}
|
$oauthKeys
|
||||||
|
)), ['roles' => Authorization::getRoles()]));
|
||||||
$response->json(array_merge($user->getArrayCopy(array_merge(
|
|
||||||
[
|
|
||||||
'$uid',
|
|
||||||
'email',
|
|
||||||
'registration',
|
|
||||||
'name',
|
|
||||||
],
|
|
||||||
$oauthKeys
|
|
||||||
)), ['roles' => Authorization::getRoles()]));
|
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -342,11 +331,11 @@ $utopia->post('/v1/account/sessions')
|
||||||
],
|
],
|
||||||
]);
|
]);
|
||||||
|
|
||||||
if (!$profile || !Auth::passwordVerify($password, $profile->getAttribute('password'))) {
|
if (false == $profile || !Auth::passwordVerify($password, $profile->getAttribute('password'))) {
|
||||||
$audit
|
$audit
|
||||||
//->setParam('userId', $profile->getUid())
|
//->setParam('userId', $profile->getUid())
|
||||||
->setParam('event', 'account.sesssions.failed')
|
->setParam('event', 'account.sesssions.failed')
|
||||||
->setParam('resource', 'users/'.$profile->getUid())
|
->setParam('resource', 'users/'.($profile ? $profile->getUid() : ''))
|
||||||
;
|
;
|
||||||
|
|
||||||
throw new Exception('Invalid credentials', 401); // Wrong password or username
|
throw new Exception('Invalid credentials', 401); // Wrong password or username
|
||||||
|
@ -354,8 +343,7 @@ $utopia->post('/v1/account/sessions')
|
||||||
|
|
||||||
$expiry = time() + Auth::TOKEN_EXPIRATION_LOGIN_LONG;
|
$expiry = time() + Auth::TOKEN_EXPIRATION_LOGIN_LONG;
|
||||||
$secret = Auth::tokenGenerator();
|
$secret = Auth::tokenGenerator();
|
||||||
|
$session = new Document([
|
||||||
$profile->setAttribute('tokens', new Document([
|
|
||||||
'$collection' => Database::SYSTEM_COLLECTION_TOKENS,
|
'$collection' => Database::SYSTEM_COLLECTION_TOKENS,
|
||||||
'$permissions' => ['read' => ['user:'.$profile->getUid()], 'write' => ['user:'.$profile->getUid()]],
|
'$permissions' => ['read' => ['user:'.$profile->getUid()], 'write' => ['user:'.$profile->getUid()]],
|
||||||
'type' => Auth::TOKEN_TYPE_LOGIN,
|
'type' => Auth::TOKEN_TYPE_LOGIN,
|
||||||
|
@ -363,10 +351,18 @@ $utopia->post('/v1/account/sessions')
|
||||||
'expire' => $expiry,
|
'expire' => $expiry,
|
||||||
'userAgent' => $request->getServer('HTTP_USER_AGENT', 'UNKNOWN'),
|
'userAgent' => $request->getServer('HTTP_USER_AGENT', 'UNKNOWN'),
|
||||||
'ip' => $request->getIP(),
|
'ip' => $request->getIP(),
|
||||||
]), Document::SET_TYPE_APPEND);
|
]);
|
||||||
|
|
||||||
Authorization::setRole('user:'.$profile->getUid());
|
Authorization::setRole('user:'.$profile->getUid());
|
||||||
|
|
||||||
|
$session = $projectDB->createDocument($session->getArrayCopy());
|
||||||
|
|
||||||
|
if (false === $session) {
|
||||||
|
throw new Exception('Failed saving session to DB', 500);
|
||||||
|
}
|
||||||
|
|
||||||
|
$profile->setAttribute('tokens', $session, Document::SET_TYPE_APPEND);
|
||||||
|
|
||||||
$profile = $projectDB->updateDocument($profile->getArrayCopy());
|
$profile = $projectDB->updateDocument($profile->getArrayCopy());
|
||||||
|
|
||||||
if (false === $profile) {
|
if (false === $profile) {
|
||||||
|
@ -382,15 +378,15 @@ $utopia->post('/v1/account/sessions')
|
||||||
|
|
||||||
$audit
|
$audit
|
||||||
->setParam('userId', $profile->getUid())
|
->setParam('userId', $profile->getUid())
|
||||||
->setParam('event', 'account.sesssions.create')
|
->setParam('event', 'account.sessions.create')
|
||||||
->setParam('resource', 'users/'.$profile->getUid())
|
->setParam('resource', 'users/'.$profile->getUid())
|
||||||
;
|
;
|
||||||
|
|
||||||
$response
|
$response
|
||||||
->addCookie(Auth::$cookieName, Auth::encodeSession($profile->getUid(), $secret), $expiry, '/', COOKIE_DOMAIN, ('https' == $request->getServer('REQUEST_SCHEME', 'https')), true, COOKIE_SAMESITE);
|
->addCookie(Auth::$cookieName, Auth::encodeSession($profile->getUid(), $secret), $expiry, '/', COOKIE_DOMAIN, ('https' == $request->getServer('REQUEST_SCHEME', 'https')), true, COOKIE_SAMESITE)
|
||||||
|
->setStatusCode(Response::STATUS_CODE_CREATED)
|
||||||
$response
|
->json($session->getArrayCopy(['$uid', 'type', 'expire']))
|
||||||
->json(array('result' => 'success'));
|
;
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -583,20 +579,21 @@ $utopia->get('/v1/account/sessions/oauth/:provider/redirect')
|
||||||
|
|
||||||
$secret = Auth::tokenGenerator();
|
$secret = Auth::tokenGenerator();
|
||||||
$expiry = time() + Auth::TOKEN_EXPIRATION_LOGIN_LONG;
|
$expiry = time() + Auth::TOKEN_EXPIRATION_LOGIN_LONG;
|
||||||
|
$session = new Document([
|
||||||
|
'$collection' => Database::SYSTEM_COLLECTION_TOKENS,
|
||||||
|
'$permissions' => ['read' => ['user:'.$user['$uid']], 'write' => ['user:'.$user['$uid']]],
|
||||||
|
'type' => Auth::TOKEN_TYPE_LOGIN,
|
||||||
|
'secret' => Auth::hash($secret), // On way hash encryption to protect DB leak
|
||||||
|
'expire' => $expiry,
|
||||||
|
'userAgent' => $request->getServer('HTTP_USER_AGENT', 'UNKNOWN'),
|
||||||
|
'ip' => $request->getIP(),
|
||||||
|
]);
|
||||||
|
|
||||||
$user
|
$user
|
||||||
->setAttribute('oauth'.ucfirst($provider), $oauthID)
|
->setAttribute('oauth'.ucfirst($provider), $oauthID)
|
||||||
->setAttribute('oauth'.ucfirst($provider).'AccessToken', $accessToken)
|
->setAttribute('oauth'.ucfirst($provider).'AccessToken', $accessToken)
|
||||||
->setAttribute('status', Auth::USER_STATUS_ACTIVATED)
|
->setAttribute('status', Auth::USER_STATUS_ACTIVATED)
|
||||||
->setAttribute('tokens', new Document([
|
->setAttribute('tokens', $session, Document::SET_TYPE_APPEND)
|
||||||
'$collection' => Database::SYSTEM_COLLECTION_TOKENS,
|
|
||||||
'$permissions' => ['read' => ['user:'.$user['$uid']], 'write' => ['user:'.$user['$uid']]],
|
|
||||||
'type' => Auth::TOKEN_TYPE_LOGIN,
|
|
||||||
'secret' => Auth::hash($secret), // On way hash encryption to protect DB leak
|
|
||||||
'expire' => $expiry,
|
|
||||||
'userAgent' => $request->getServer('HTTP_USER_AGENT', 'UNKNOWN'),
|
|
||||||
'ip' => $request->getIP(),
|
|
||||||
]), Document::SET_TYPE_APPEND)
|
|
||||||
;
|
;
|
||||||
|
|
||||||
Authorization::setRole('user:'.$user->getUid());
|
Authorization::setRole('user:'.$user->getUid());
|
||||||
|
@ -631,7 +628,7 @@ $utopia->patch('/v1/account/name')
|
||||||
->label('sdk.description', '/docs/references/account/update-name.md')
|
->label('sdk.description', '/docs/references/account/update-name.md')
|
||||||
->param('name', '', function () { return new Text(100); }, 'User name')
|
->param('name', '', function () { return new Text(100); }, 'User name')
|
||||||
->action(
|
->action(
|
||||||
function ($name) use ($response, $user, $projectDB, $audit) {
|
function ($name) use ($response, $user, $projectDB, $audit, $oauthKeys) {
|
||||||
$user = $projectDB->updateDocument(array_merge($user->getArrayCopy(), [
|
$user = $projectDB->updateDocument(array_merge($user->getArrayCopy(), [
|
||||||
'name' => $name,
|
'name' => $name,
|
||||||
]));
|
]));
|
||||||
|
@ -645,7 +642,15 @@ $utopia->patch('/v1/account/name')
|
||||||
->setParam('resource', 'users/'.$user->getUid())
|
->setParam('resource', 'users/'.$user->getUid())
|
||||||
;
|
;
|
||||||
|
|
||||||
$response->json(array('result' => 'success'));
|
$response->json(array_merge($user->getArrayCopy(array_merge(
|
||||||
|
[
|
||||||
|
'$uid',
|
||||||
|
'email',
|
||||||
|
'registration',
|
||||||
|
'name',
|
||||||
|
],
|
||||||
|
$oauthKeys
|
||||||
|
)), ['roles' => Authorization::getRoles()]));
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -659,7 +664,7 @@ $utopia->patch('/v1/account/password')
|
||||||
->param('password', '', function () { return new Password(); }, 'New password')
|
->param('password', '', function () { return new Password(); }, 'New password')
|
||||||
->param('old-password', '', function () { return new Password(); }, 'Old password')
|
->param('old-password', '', function () { return new Password(); }, 'Old password')
|
||||||
->action(
|
->action(
|
||||||
function ($password, $oldPassword) use ($response, $user, $projectDB, $audit) {
|
function ($password, $oldPassword) use ($response, $user, $projectDB, $audit, $oauthKeys) {
|
||||||
if (!Auth::passwordVerify($oldPassword, $user->getAttribute('password'))) { // Double check user password
|
if (!Auth::passwordVerify($oldPassword, $user->getAttribute('password'))) { // Double check user password
|
||||||
throw new Exception('Invalid credentials', 401);
|
throw new Exception('Invalid credentials', 401);
|
||||||
}
|
}
|
||||||
|
@ -677,7 +682,15 @@ $utopia->patch('/v1/account/password')
|
||||||
->setParam('resource', 'users/'.$user->getUid())
|
->setParam('resource', 'users/'.$user->getUid())
|
||||||
;
|
;
|
||||||
|
|
||||||
$response->json(array('result' => 'success'));
|
$response->json(array_merge($user->getArrayCopy(array_merge(
|
||||||
|
[
|
||||||
|
'$uid',
|
||||||
|
'email',
|
||||||
|
'registration',
|
||||||
|
'name',
|
||||||
|
],
|
||||||
|
$oauthKeys
|
||||||
|
)), ['roles' => Authorization::getRoles()]));
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -691,7 +704,7 @@ $utopia->patch('/v1/account/email')
|
||||||
->param('email', '', function () { return new Email(); }, 'Email Address')
|
->param('email', '', function () { return new Email(); }, 'Email Address')
|
||||||
->param('password', '', function () { return new Password(); }, 'User Password')
|
->param('password', '', function () { return new Password(); }, 'User Password')
|
||||||
->action(
|
->action(
|
||||||
function ($email, $password) use ($response, $user, $projectDB, $audit) {
|
function ($email, $password) use ($response, $user, $projectDB, $audit, $oauthKeys) {
|
||||||
if (!Auth::passwordVerify($password, $user->getAttribute('password'))) { // Double check user password
|
if (!Auth::passwordVerify($password, $user->getAttribute('password'))) { // Double check user password
|
||||||
throw new Exception('Invalid credentials', 401);
|
throw new Exception('Invalid credentials', 401);
|
||||||
}
|
}
|
||||||
|
@ -724,7 +737,15 @@ $utopia->patch('/v1/account/email')
|
||||||
->setParam('resource', 'users/'.$user->getUid())
|
->setParam('resource', 'users/'.$user->getUid())
|
||||||
;
|
;
|
||||||
|
|
||||||
$response->json(array('result' => 'success'));
|
$response->json(array_merge($user->getArrayCopy(array_merge(
|
||||||
|
[
|
||||||
|
'$uid',
|
||||||
|
'email',
|
||||||
|
'registration',
|
||||||
|
'name',
|
||||||
|
],
|
||||||
|
$oauthKeys
|
||||||
|
)), ['roles' => Authorization::getRoles()]));
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -751,7 +772,19 @@ $utopia->patch('/v1/account/prefs')
|
||||||
->setParam('resource', 'users/'.$user->getUid())
|
->setParam('resource', 'users/'.$user->getUid())
|
||||||
;
|
;
|
||||||
|
|
||||||
$response->json(array('result' => 'success'));
|
$prefs = $user->getAttribute('prefs', '{}');
|
||||||
|
|
||||||
|
if (empty($prefs)) {
|
||||||
|
$prefs = '[]';
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
$prefs = json_decode($prefs, true);
|
||||||
|
} catch (\Exception $error) {
|
||||||
|
throw new Exception('Failed to parse preferences', 500);
|
||||||
|
}
|
||||||
|
|
||||||
|
$response->json($prefs);
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -795,39 +828,46 @@ $utopia->delete('/v1/account')
|
||||||
|
|
||||||
$response
|
$response
|
||||||
->addCookie(Auth::$cookieName, '', time() - 3600, '/', COOKIE_DOMAIN, ('https' == $request->getServer('REQUEST_SCHEME', 'https')), true, COOKIE_SAMESITE)
|
->addCookie(Auth::$cookieName, '', time() - 3600, '/', COOKIE_DOMAIN, ('https' == $request->getServer('REQUEST_SCHEME', 'https')), true, COOKIE_SAMESITE)
|
||||||
->json(array('result' => 'success'));
|
->noContent()
|
||||||
|
;
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
$utopia->delete('/v1/account/sessions/current')
|
$utopia->delete('/v1/account/sessions')
|
||||||
->desc('Delete Current Account Session')
|
->desc('Delete All Account Sessions')
|
||||||
->label('webhook', 'account.sessions.delete')
|
|
||||||
->label('scope', 'account')
|
->label('scope', 'account')
|
||||||
|
->label('webhook', 'account.sessions.delete')
|
||||||
->label('sdk.namespace', 'account')
|
->label('sdk.namespace', 'account')
|
||||||
->label('sdk.method', 'deleteAccountCurrentSession')
|
->label('sdk.method', 'deleteAccountSessions')
|
||||||
->label('sdk.description', '/docs/references/account/delete-session-current.md')
|
->label('sdk.description', '/docs/references/account/delete-sessions.md')
|
||||||
->label('abuse-limit', 100)
|
->label('abuse-limit', 100)
|
||||||
->action(
|
->action(
|
||||||
function () use ($response, $request, $user, $projectDB, $audit, $webhook) {
|
function () use ($response, $request, $user, $projectDB, $audit, $webhook) {
|
||||||
$token = Auth::tokenVerify($user->getAttribute('tokens'), Auth::TOKEN_TYPE_LOGIN, Auth::$secret);
|
$tokens = $user->getAttribute('tokens', []);
|
||||||
|
|
||||||
if (!$projectDB->deleteDocument($token)) {
|
foreach ($tokens as $token) { /* @var $token Document */
|
||||||
throw new Exception('Failed to remove token from DB', 500);
|
if (!$projectDB->deleteDocument($token->getUid())) {
|
||||||
|
throw new Exception('Failed to remove token from DB', 500);
|
||||||
|
}
|
||||||
|
|
||||||
|
$audit
|
||||||
|
->setParam('event', 'account.sessions.delete')
|
||||||
|
->setParam('resource', '/user/'.$user->getUid())
|
||||||
|
;
|
||||||
|
|
||||||
|
$webhook
|
||||||
|
->setParam('payload', [
|
||||||
|
'name' => $user->getAttribute('name', ''),
|
||||||
|
'email' => $user->getAttribute('email', ''),
|
||||||
|
])
|
||||||
|
;
|
||||||
|
|
||||||
|
if ($token->getAttribute('secret') == Auth::hash(Auth::$secret)) { // If current session delete the cookies too
|
||||||
|
$response->addCookie(Auth::$cookieName, '', time() - 3600, '/', COOKIE_DOMAIN, ('https' == $request->getServer('REQUEST_SCHEME', 'https')), true, COOKIE_SAMESITE);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$webhook
|
$response->noContent();
|
||||||
->setParam('payload', [
|
|
||||||
'name' => $user->getAttribute('name', ''),
|
|
||||||
'email' => $user->getAttribute('email', ''),
|
|
||||||
])
|
|
||||||
;
|
|
||||||
|
|
||||||
$audit->setParam('event', 'account.sessions.delete');
|
|
||||||
|
|
||||||
$response
|
|
||||||
->addCookie(Auth::$cookieName, '', time() - 3600, '/', COOKIE_DOMAIN, ('https' == $request->getServer('REQUEST_SCHEME', 'https')), true, COOKIE_SAMESITE)
|
|
||||||
->json(array('result' => 'success'))
|
|
||||||
;
|
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -868,45 +908,39 @@ $utopia->delete('/v1/account/sessions/:id')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$response->json(array('result' => 'success'));
|
$response->noContent();
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
$utopia->delete('/v1/account/sessions')
|
$utopia->delete('/v1/account/sessions/current')
|
||||||
->desc('Delete All Account Sessions')
|
->desc('Delete Current Account Session')
|
||||||
->label('scope', 'account')
|
|
||||||
->label('webhook', 'account.sessions.delete')
|
->label('webhook', 'account.sessions.delete')
|
||||||
|
->label('scope', 'account')
|
||||||
->label('sdk.namespace', 'account')
|
->label('sdk.namespace', 'account')
|
||||||
->label('sdk.method', 'deleteAccountSessions')
|
->label('sdk.method', 'deleteAccountCurrentSession')
|
||||||
->label('sdk.description', '/docs/references/account/delete-sessions.md')
|
->label('sdk.description', '/docs/references/account/delete-session-current.md')
|
||||||
->label('abuse-limit', 100)
|
->label('abuse-limit', 100)
|
||||||
->action(
|
->action(
|
||||||
function () use ($response, $request, $user, $projectDB, $audit, $webhook) {
|
function () use ($response, $request, $user, $projectDB, $audit, $webhook) {
|
||||||
$tokens = $user->getAttribute('tokens', []);
|
$token = Auth::tokenVerify($user->getAttribute('tokens'), Auth::TOKEN_TYPE_LOGIN, Auth::$secret);
|
||||||
|
|
||||||
foreach ($tokens as $token) { /* @var $token Document */
|
if (!$projectDB->deleteDocument($token)) {
|
||||||
if (!$projectDB->deleteDocument($token->getUid())) {
|
throw new Exception('Failed to remove token from DB', 500);
|
||||||
throw new Exception('Failed to remove token from DB', 500);
|
|
||||||
}
|
|
||||||
|
|
||||||
$audit
|
|
||||||
->setParam('event', 'account.sessions.delete')
|
|
||||||
->setParam('resource', '/user/'.$user->getUid())
|
|
||||||
;
|
|
||||||
|
|
||||||
$webhook
|
|
||||||
->setParam('payload', [
|
|
||||||
'name' => $user->getAttribute('name', ''),
|
|
||||||
'email' => $user->getAttribute('email', ''),
|
|
||||||
])
|
|
||||||
;
|
|
||||||
|
|
||||||
if ($token->getAttribute('secret') == Auth::hash(Auth::$secret)) { // If current session delete the cookies too
|
|
||||||
$response->addCookie(Auth::$cookieName, '', time() - 3600, '/', COOKIE_DOMAIN, ('https' == $request->getServer('REQUEST_SCHEME', 'https')), true, COOKIE_SAMESITE);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$response->json(array('result' => 'success'));
|
$webhook
|
||||||
|
->setParam('payload', [
|
||||||
|
'name' => $user->getAttribute('name', ''),
|
||||||
|
'email' => $user->getAttribute('email', ''),
|
||||||
|
])
|
||||||
|
;
|
||||||
|
|
||||||
|
$audit->setParam('event', 'account.sessions.delete');
|
||||||
|
|
||||||
|
$response
|
||||||
|
->addCookie(Auth::$cookieName, '', time() - 3600, '/', COOKIE_DOMAIN, ('https' == $request->getServer('REQUEST_SCHEME', 'https')), true, COOKIE_SAMESITE)
|
||||||
|
->noContent()
|
||||||
|
;
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -936,8 +970,7 @@ $utopia->post('/v1/account/recovery')
|
||||||
}
|
}
|
||||||
|
|
||||||
$secret = Auth::tokenGenerator();
|
$secret = Auth::tokenGenerator();
|
||||||
|
$recovery = new Document([
|
||||||
$profile->setAttribute('tokens', new Document([
|
|
||||||
'$collection' => Database::SYSTEM_COLLECTION_TOKENS,
|
'$collection' => Database::SYSTEM_COLLECTION_TOKENS,
|
||||||
'$permissions' => ['read' => ['user:'.$profile->getUid()], 'write' => ['user:'.$profile->getUid()]],
|
'$permissions' => ['read' => ['user:'.$profile->getUid()], 'write' => ['user:'.$profile->getUid()]],
|
||||||
'type' => Auth::TOKEN_TYPE_RECOVERY,
|
'type' => Auth::TOKEN_TYPE_RECOVERY,
|
||||||
|
@ -945,10 +978,18 @@ $utopia->post('/v1/account/recovery')
|
||||||
'expire' => time() + Auth::TOKEN_EXPIRATION_RECOVERY,
|
'expire' => time() + Auth::TOKEN_EXPIRATION_RECOVERY,
|
||||||
'userAgent' => $request->getServer('HTTP_USER_AGENT', 'UNKNOWN'),
|
'userAgent' => $request->getServer('HTTP_USER_AGENT', 'UNKNOWN'),
|
||||||
'ip' => $request->getIP(),
|
'ip' => $request->getIP(),
|
||||||
]), Document::SET_TYPE_APPEND);
|
]);
|
||||||
|
|
||||||
Authorization::setRole('user:'.$profile->getUid());
|
Authorization::setRole('user:'.$profile->getUid());
|
||||||
|
|
||||||
|
$recovery = $projectDB->createDocument($recovery->getArrayCopy());
|
||||||
|
|
||||||
|
if (false === $recovery) {
|
||||||
|
throw new Exception('Failed saving recovery to DB', 500);
|
||||||
|
}
|
||||||
|
|
||||||
|
$profile->setAttribute('tokens', $recovery, Document::SET_TYPE_APPEND);
|
||||||
|
|
||||||
$profile = $projectDB->updateDocument($profile->getArrayCopy());
|
$profile = $projectDB->updateDocument($profile->getArrayCopy());
|
||||||
|
|
||||||
if (false === $profile) {
|
if (false === $profile) {
|
||||||
|
@ -978,7 +1019,7 @@ $utopia->post('/v1/account/recovery')
|
||||||
try {
|
try {
|
||||||
$mail->send();
|
$mail->send();
|
||||||
} catch (\Exception $error) {
|
} catch (\Exception $error) {
|
||||||
//throw new Exception('Problem sending mail: ' . $error->getMessage(), 500);
|
throw new Exception('Error sending mail: ' . $error->getMessage(), 500);
|
||||||
}
|
}
|
||||||
|
|
||||||
$audit
|
$audit
|
||||||
|
@ -986,7 +1027,10 @@ $utopia->post('/v1/account/recovery')
|
||||||
->setParam('event', 'account.recovery.create')
|
->setParam('event', 'account.recovery.create')
|
||||||
;
|
;
|
||||||
|
|
||||||
$response->json(array('result' => 'success'));
|
$response
|
||||||
|
->setStatusCode(Response::STATUS_CODE_CREATED)
|
||||||
|
->json($recovery->getArrayCopy(['$uid', 'type', 'expire']))
|
||||||
|
;
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -998,7 +1042,7 @@ $utopia->put('/v1/account/recovery')
|
||||||
->label('sdk.description', '/docs/references/account/update-recovery.md')
|
->label('sdk.description', '/docs/references/account/update-recovery.md')
|
||||||
->label('abuse-limit', 10)
|
->label('abuse-limit', 10)
|
||||||
->label('abuse-key', 'url:{url},userId:{param-userId}')
|
->label('abuse-key', 'url:{url},userId:{param-userId}')
|
||||||
->param('userId', '', function () { return new UID(); }, 'User account email address.')
|
->param('userId', '', function () { return new UID(); }, 'User account UID address.')
|
||||||
->param('token', '', function () { return new Text(256); }, 'Valid reset token.')
|
->param('token', '', function () { return new Text(256); }, 'Valid reset token.')
|
||||||
->param('password-a', '', function () { return new Password(); }, 'New password.')
|
->param('password-a', '', function () { return new Password(); }, 'New password.')
|
||||||
->param('password-b', '', function () {return new Password(); }, 'New password again.')
|
->param('password-b', '', function () {return new Password(); }, 'New password again.')
|
||||||
|
@ -1021,10 +1065,10 @@ $utopia->put('/v1/account/recovery')
|
||||||
throw new Exception('User not found', 404); // TODO maybe hide this
|
throw new Exception('User not found', 404); // TODO maybe hide this
|
||||||
}
|
}
|
||||||
|
|
||||||
$token = Auth::tokenVerify($profile->getAttribute('tokens', []), Auth::TOKEN_TYPE_RECOVERY, $token);
|
$recovery = Auth::tokenVerify($profile->getAttribute('tokens', []), Auth::TOKEN_TYPE_RECOVERY, $token);
|
||||||
|
|
||||||
if (!$token) {
|
if (!$recovery) {
|
||||||
throw new Exception('Recovery token is not valid', 401);
|
throw new Exception('Invalid recovery token', 401);
|
||||||
}
|
}
|
||||||
|
|
||||||
Authorization::setRole('user:'.$profile->getUid());
|
Authorization::setRole('user:'.$profile->getUid());
|
||||||
|
@ -1039,8 +1083,12 @@ $utopia->put('/v1/account/recovery')
|
||||||
throw new Exception('Failed saving user to DB', 500);
|
throw new Exception('Failed saving user to DB', 500);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!$projectDB->deleteDocument($token)) {
|
/**
|
||||||
throw new Exception('Failed to remove token from DB', 500);
|
* We act like we're updating and validating
|
||||||
|
* the recovery token but actually we don't need it anymore.
|
||||||
|
*/
|
||||||
|
if (!$projectDB->deleteDocument($recovery)) {
|
||||||
|
throw new Exception('Failed to remove recovery from DB', 500);
|
||||||
}
|
}
|
||||||
|
|
||||||
$audit
|
$audit
|
||||||
|
@ -1048,6 +1096,8 @@ $utopia->put('/v1/account/recovery')
|
||||||
->setParam('event', 'account.recovery.update')
|
->setParam('event', 'account.recovery.update')
|
||||||
;
|
;
|
||||||
|
|
||||||
$response->json(array('result' => 'success'));
|
$recovery = $profile->search('$uid', $recovery, $profile->getAttribute('tokens', []));
|
||||||
|
|
||||||
|
$response->json($recovery->getArrayCopy(['$uid', 'type', 'expire']));
|
||||||
}
|
}
|
||||||
);
|
);
|
|
@ -378,7 +378,7 @@ $utopia->post('/v1/teams/:teamId/memberships')
|
||||||
try {
|
try {
|
||||||
$mail->send();
|
$mail->send();
|
||||||
} catch (\Exception $error) {
|
} catch (\Exception $error) {
|
||||||
//throw new Exception('Problem sending mail: ' . $error->getMessage(), 500);
|
throw new Exception('Error sending mail: ' . $error->getMessage(), 500);
|
||||||
}
|
}
|
||||||
|
|
||||||
$audit
|
$audit
|
||||||
|
@ -457,7 +457,7 @@ $utopia->post('/v1/teams/:teamId/memberships/:inviteId/resend')
|
||||||
try {
|
try {
|
||||||
$mail->send();
|
$mail->send();
|
||||||
} catch (\Exception $error) {
|
} catch (\Exception $error) {
|
||||||
//throw new Exception('Problem sending mail: ' . $error->getMessage(), 500);
|
throw new Exception('Error sending mail: ' . $error->getMessage(), 500);
|
||||||
}
|
}
|
||||||
|
|
||||||
$audit
|
$audit
|
||||||
|
|
|
@ -111,8 +111,8 @@ $register->set('smtp', function () use ($request) {
|
||||||
|
|
||||||
$mail->isSMTP();
|
$mail->isSMTP();
|
||||||
|
|
||||||
$username = $request->getServer('_APP_SMTP_USERNAME', '');
|
$username = $request->getServer('_APP_SMTP_USERNAME', null);
|
||||||
$password = $request->getServer('_APP_SMTP_PASSWORD', '');
|
$password = $request->getServer('_APP_SMTP_PASSWORD', null);
|
||||||
|
|
||||||
$mail->XMailer = 'Appwrite Mailer';
|
$mail->XMailer = 'Appwrite Mailer';
|
||||||
$mail->Host = $request->getServer('_APP_SMTP_HOST', 'smtp');
|
$mail->Host = $request->getServer('_APP_SMTP_HOST', 'smtp');
|
||||||
|
@ -120,7 +120,8 @@ $register->set('smtp', function () use ($request) {
|
||||||
$mail->SMTPAuth = (!empty($username) && !empty($password));
|
$mail->SMTPAuth = (!empty($username) && !empty($password));
|
||||||
$mail->Username = $username;
|
$mail->Username = $username;
|
||||||
$mail->Password = $password;
|
$mail->Password = $password;
|
||||||
$mail->SMTPSecure = $request->getServer('_APP_SMTP_SECURE', '');
|
$mail->SMTPSecure = $request->getServer('_APP_SMTP_SECURE', false);
|
||||||
|
$mail->SMTPAutoTLS = false;
|
||||||
|
|
||||||
$mail->setFrom('team@appwrite.io', APP_NAME.' Team');
|
$mail->setFrom('team@appwrite.io', APP_NAME.' Team');
|
||||||
$mail->addReplyTo('team@appwrite.io', APP_NAME.' Team');
|
$mail->addReplyTo('team@appwrite.io', APP_NAME.' Team');
|
||||||
|
|
|
@ -17,6 +17,7 @@ services:
|
||||||
- ./phpunit.xml:/usr/share/nginx/html/phpunit.xml
|
- ./phpunit.xml:/usr/share/nginx/html/phpunit.xml
|
||||||
- ./tests:/usr/share/nginx/html/tests
|
- ./tests:/usr/share/nginx/html/tests
|
||||||
- ./app:/usr/share/nginx/html/app
|
- ./app:/usr/share/nginx/html/app
|
||||||
|
- ./vendor:/usr/share/nginx/html/vendor
|
||||||
- ./docs:/usr/share/nginx/html/docs
|
- ./docs:/usr/share/nginx/html/docs
|
||||||
- ./public:/usr/share/nginx/html/public
|
- ./public:/usr/share/nginx/html/public
|
||||||
- ./src:/usr/share/nginx/html/src
|
- ./src:/usr/share/nginx/html/src
|
||||||
|
@ -31,6 +32,7 @@ services:
|
||||||
- clamav
|
- clamav
|
||||||
- influxdb
|
- influxdb
|
||||||
- telegraf
|
- telegraf
|
||||||
|
- maildev
|
||||||
environment:
|
environment:
|
||||||
- _APP_ENV=development
|
- _APP_ENV=development
|
||||||
- _APP_OPTIONS_ABUSE=disabled
|
- _APP_OPTIONS_ABUSE=disabled
|
||||||
|
@ -46,6 +48,8 @@ services:
|
||||||
- _APP_INFLUXDB_PORT=8086
|
- _APP_INFLUXDB_PORT=8086
|
||||||
- _APP_STATSD_HOST=telegraf
|
- _APP_STATSD_HOST=telegraf
|
||||||
- _APP_STATSD_PORT=8125
|
- _APP_STATSD_PORT=8125
|
||||||
|
- _APP_SMTP_HOST=maildev
|
||||||
|
- _APP_SMTP_PORT=25
|
||||||
|
|
||||||
mariadb:
|
mariadb:
|
||||||
image: appwrite/mariadb:1.0.2 # fix issues when upgrading using: mysql_upgrade -u root -p
|
image: appwrite/mariadb:1.0.2 # fix issues when upgrading using: mysql_upgrade -u root -p
|
||||||
|
@ -100,18 +104,25 @@ services:
|
||||||
networks:
|
networks:
|
||||||
- appwrite
|
- appwrite
|
||||||
|
|
||||||
# resque:
|
resque:
|
||||||
# image: registry.gitlab.com/appwrite/appwrite/resque-web:v1.0.2
|
image: registry.gitlab.com/appwrite/appwrite/resque-web:v1.0.2
|
||||||
# restart: unless-stopped
|
restart: unless-stopped
|
||||||
# networks:
|
networks:
|
||||||
# - appwrite
|
- appwrite
|
||||||
# ports:
|
ports:
|
||||||
# - "5678:5678"
|
- "5678:5678"
|
||||||
# environment:
|
environment:
|
||||||
# - RESQUE_WEB_HOST=redis
|
- RESQUE_WEB_HOST=redis
|
||||||
# - RESQUE_WEB_PORT=6379
|
- RESQUE_WEB_PORT=6379
|
||||||
# - RESQUE_WEB_HTTP_BASIC_AUTH_USER=user
|
- RESQUE_WEB_HTTP_BASIC_AUTH_USER=user
|
||||||
# - RESQUE_WEB_HTTP_BASIC_AUTH_PASSWORD=password
|
- RESQUE_WEB_HTTP_BASIC_AUTH_PASSWORD=password
|
||||||
|
|
||||||
|
maildev:
|
||||||
|
ports:
|
||||||
|
- '1080:80'
|
||||||
|
networks:
|
||||||
|
- appwrite
|
||||||
|
image: djfarrelly/maildev
|
||||||
|
|
||||||
networks:
|
networks:
|
||||||
appwrite:
|
appwrite:
|
||||||
|
|
920
tests/e2e/AccountBase.php
Normal file
920
tests/e2e/AccountBase.php
Normal file
|
@ -0,0 +1,920 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Tests\E2E;
|
||||||
|
|
||||||
|
use Tests\E2E\Client;
|
||||||
|
|
||||||
|
trait AccountBase
|
||||||
|
{
|
||||||
|
public function testCreateAccount():array
|
||||||
|
{
|
||||||
|
$email = uniqid().'user@localhost.test';
|
||||||
|
$password = 'passwrod';
|
||||||
|
$name = 'User Name';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test for SUCCESS
|
||||||
|
*/
|
||||||
|
$response = $this->client->call(Client::METHOD_POST, '/account', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
], [
|
||||||
|
'email' => $email,
|
||||||
|
'password' => $password,
|
||||||
|
'name' => $name,
|
||||||
|
]);
|
||||||
|
|
||||||
|
$uid = $response['body']['$uid'];
|
||||||
|
|
||||||
|
$this->assertEquals($response['headers']['status-code'], 201);
|
||||||
|
$this->assertNotEmpty($response['body']);
|
||||||
|
$this->assertNotEmpty($response['body']['$uid']);
|
||||||
|
$this->assertIsNumeric($response['body']['registration']);
|
||||||
|
$this->assertEquals($response['body']['email'], $email);
|
||||||
|
$this->assertEquals($response['body']['name'], $name);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test for FAILURE
|
||||||
|
*/
|
||||||
|
$response = $this->client->call(Client::METHOD_POST, '/account', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
], [
|
||||||
|
'email' => $email,
|
||||||
|
'password' => $password,
|
||||||
|
'name' => $name,
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals($response['headers']['status-code'], 409);
|
||||||
|
|
||||||
|
return [
|
||||||
|
'uid' => $uid,
|
||||||
|
'email' => $email,
|
||||||
|
'password' => $password,
|
||||||
|
'name' => $name,
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @depends testCreateAccount
|
||||||
|
*/
|
||||||
|
public function testCreateAccountSession($data):array
|
||||||
|
{
|
||||||
|
$email = (isset($data['email'])) ? $data['email'] : '';
|
||||||
|
$password = (isset($data['password'])) ? $data['password'] : '';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test for SUCCESS
|
||||||
|
*/
|
||||||
|
$response = $this->client->call(Client::METHOD_POST, '/account/sessions', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
], [
|
||||||
|
'email' => $email,
|
||||||
|
'password' => $password,
|
||||||
|
]);
|
||||||
|
|
||||||
|
$sessionUid = $response['body']['$uid'];
|
||||||
|
$session = $this->client->parseCookie($response['headers']['set-cookie'])['a_session_console'];
|
||||||
|
|
||||||
|
$this->assertEquals($response['headers']['status-code'], 201);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test for FAILURE
|
||||||
|
*/
|
||||||
|
$response = $this->client->call(Client::METHOD_POST, '/account/sessions', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
], [
|
||||||
|
'email' => $email.'x',
|
||||||
|
'password' => $password,
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals($response['headers']['status-code'], 401);
|
||||||
|
|
||||||
|
$response = $this->client->call(Client::METHOD_POST, '/account/sessions', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
], [
|
||||||
|
'email' => $email,
|
||||||
|
'password' => $password.'x',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals($response['headers']['status-code'], 401);
|
||||||
|
|
||||||
|
$response = $this->client->call(Client::METHOD_POST, '/account/sessions', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
], [
|
||||||
|
'email' => '',
|
||||||
|
'password' => '',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals($response['headers']['status-code'], 400);
|
||||||
|
|
||||||
|
return array_merge($data, [
|
||||||
|
'sessionUid' => $sessionUid,
|
||||||
|
'session' => $session,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @depends testCreateAccountSession
|
||||||
|
*/
|
||||||
|
public function testGetAccount($data):array
|
||||||
|
{
|
||||||
|
$email = (isset($data['email'])) ? $data['email'] : '';
|
||||||
|
$name = (isset($data['name'])) ? $data['name'] : '';
|
||||||
|
$session = (isset($data['session'])) ? $data['session'] : '';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test for SUCCESS
|
||||||
|
*/
|
||||||
|
$response = $this->client->call(Client::METHOD_GET, '/account', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'cookie' => 'a_session_console=' . $session,
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals($response['headers']['status-code'], 200);
|
||||||
|
$this->assertNotEmpty($response['body']);
|
||||||
|
$this->assertNotEmpty($response['body']['$uid']);
|
||||||
|
$this->assertIsNumeric($response['body']['registration']);
|
||||||
|
$this->assertEquals($response['body']['email'], $email);
|
||||||
|
$this->assertEquals($response['body']['name'], $name);
|
||||||
|
$this->assertContains('*', $response['body']['roles']);
|
||||||
|
$this->assertContains('user:'.$response['body']['$uid'], $response['body']['roles']);
|
||||||
|
$this->assertContains('role:1', $response['body']['roles']);
|
||||||
|
$this->assertCount(3, $response['body']['roles']);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test for FAILURE
|
||||||
|
*/
|
||||||
|
$response = $this->client->call(Client::METHOD_GET, '/account', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals($response['headers']['status-code'], 401);
|
||||||
|
|
||||||
|
$response = $this->client->call(Client::METHOD_GET, '/account', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'cookie' => 'a_session_console=' . $session.'xx',
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals($response['headers']['status-code'], 401);
|
||||||
|
|
||||||
|
return $data;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @depends testCreateAccountSession
|
||||||
|
*/
|
||||||
|
public function testGetAccountPrefs($data):array
|
||||||
|
{
|
||||||
|
$session = (isset($data['session'])) ? $data['session'] : '';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test for SUCCESS
|
||||||
|
*/
|
||||||
|
$response = $this->client->call(Client::METHOD_GET, '/account/prefs', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'cookie' => 'a_session_console=' . $session,
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals($response['headers']['status-code'], 200);
|
||||||
|
$this->assertIsArray($response['body']);
|
||||||
|
$this->assertEmpty($response['body']);
|
||||||
|
$this->assertCount(0, $response['body']);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test for FAILURE
|
||||||
|
*/
|
||||||
|
$response = $this->client->call(Client::METHOD_GET, '/account/prefs', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals($response['headers']['status-code'], 401);
|
||||||
|
|
||||||
|
return $data;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @depends testCreateAccountSession
|
||||||
|
*/
|
||||||
|
public function testGetAccountSessions($data):array
|
||||||
|
{
|
||||||
|
$session = (isset($data['session'])) ? $data['session'] : '';
|
||||||
|
$sessionUid = (isset($data['sessionUid'])) ? $data['sessionUid'] : '';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test for SUCCESS
|
||||||
|
*/
|
||||||
|
$response = $this->client->call(Client::METHOD_GET, '/account/sessions', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'cookie' => 'a_session_console=' . $session,
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals($response['headers']['status-code'], 200);
|
||||||
|
$this->assertIsArray($response['body']);
|
||||||
|
$this->assertNotEmpty($response['body']);
|
||||||
|
$this->assertCount(1, $response['body']);
|
||||||
|
$this->assertEquals($sessionUid, $response['body'][0]['$uid']);
|
||||||
|
|
||||||
|
$this->assertIsArray($response['body'][0]['OS']);
|
||||||
|
$this->assertEquals('Windows', $response['body'][0]['OS']['name']);
|
||||||
|
$this->assertEquals('WIN', $response['body'][0]['OS']['short_name']);
|
||||||
|
$this->assertEquals('10', $response['body'][0]['OS']['version']);
|
||||||
|
$this->assertEquals('x64', $response['body'][0]['OS']['platform']);
|
||||||
|
|
||||||
|
$this->assertIsArray($response['body'][0]['client']);
|
||||||
|
$this->assertEquals('browser', $response['body'][0]['client']['type']);
|
||||||
|
$this->assertEquals('Chrome', $response['body'][0]['client']['name']);
|
||||||
|
$this->assertEquals('CH', $response['body'][0]['client']['short_name']); // FIXME (v1) key name should be camelcase
|
||||||
|
$this->assertEquals('70.0', $response['body'][0]['client']['version']);
|
||||||
|
$this->assertEquals('Blink', $response['body'][0]['client']['engine']);
|
||||||
|
$this->assertEquals(0, $response['body'][0]['device']);
|
||||||
|
$this->assertEquals('', $response['body'][0]['brand']);
|
||||||
|
$this->assertEquals('', $response['body'][0]['model']);
|
||||||
|
$this->assertEquals($response['body'][0]['ip'], filter_var($response['body'][0]['ip'], FILTER_VALIDATE_IP));
|
||||||
|
|
||||||
|
$this->assertIsArray($response['body'][0]['geo']);
|
||||||
|
$this->assertEquals('--', $response['body'][0]['geo']['isoCode']);
|
||||||
|
$this->assertEquals('Unknown', $response['body'][0]['geo']['country']);
|
||||||
|
|
||||||
|
$this->assertEquals(true, $response['body'][0]['current']);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test for FAILURE
|
||||||
|
*/
|
||||||
|
$response = $this->client->call(Client::METHOD_GET, '/account/sessions', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals($response['headers']['status-code'], 401);
|
||||||
|
|
||||||
|
return $data;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @depends testCreateAccountSession
|
||||||
|
*/
|
||||||
|
public function testGetAccountLogs($data):array
|
||||||
|
{
|
||||||
|
sleep(5);
|
||||||
|
$session = (isset($data['session'])) ? $data['session'] : '';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test for SUCCESS
|
||||||
|
*/
|
||||||
|
$response = $this->client->call(Client::METHOD_GET, '/account/logs', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'cookie' => 'a_session_console=' . $session,
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals($response['headers']['status-code'], 200);
|
||||||
|
$this->assertIsArray($response['body']);
|
||||||
|
$this->assertNotEmpty($response['body']);
|
||||||
|
$this->assertCount(2, $response['body']);
|
||||||
|
|
||||||
|
$this->assertEquals('account.create', $response['body'][0]['event']);
|
||||||
|
$this->assertEquals($response['body'][0]['ip'], filter_var($response['body'][0]['ip'], FILTER_VALIDATE_IP));
|
||||||
|
$this->assertIsNumeric($response['body'][0]['time']);
|
||||||
|
|
||||||
|
$this->assertIsArray($response['body'][0]['OS']);
|
||||||
|
$this->assertEquals('Windows', $response['body'][0]['OS']['name']);
|
||||||
|
$this->assertEquals('WIN', $response['body'][0]['OS']['short_name']);
|
||||||
|
$this->assertEquals('10', $response['body'][0]['OS']['version']);
|
||||||
|
$this->assertEquals('x64', $response['body'][0]['OS']['platform']);
|
||||||
|
|
||||||
|
$this->assertIsArray($response['body'][0]['client']);
|
||||||
|
$this->assertEquals('browser', $response['body'][0]['client']['type']);
|
||||||
|
$this->assertEquals('Chrome', $response['body'][0]['client']['name']);
|
||||||
|
$this->assertEquals('CH', $response['body'][0]['client']['short_name']); // FIXME (v1) key name should be camelcase
|
||||||
|
$this->assertEquals('70.0', $response['body'][0]['client']['version']);
|
||||||
|
$this->assertEquals('Blink', $response['body'][0]['client']['engine']);
|
||||||
|
$this->assertEquals(0, $response['body'][0]['device']);
|
||||||
|
$this->assertEquals('', $response['body'][0]['brand']);
|
||||||
|
$this->assertEquals('', $response['body'][0]['model']);
|
||||||
|
$this->assertEquals($response['body'][0]['ip'], filter_var($response['body'][0]['ip'], FILTER_VALIDATE_IP));
|
||||||
|
|
||||||
|
$this->assertIsArray($response['body'][0]['geo']);
|
||||||
|
$this->assertEquals('--', $response['body'][0]['geo']['isoCode']);
|
||||||
|
$this->assertEquals('Unknown', $response['body'][0]['geo']['country']);
|
||||||
|
|
||||||
|
$this->assertEquals('account.sessions.create', $response['body'][1]['event']);
|
||||||
|
$this->assertEquals($response['body'][1]['ip'], filter_var($response['body'][0]['ip'], FILTER_VALIDATE_IP));
|
||||||
|
$this->assertIsNumeric($response['body'][1]['time']);
|
||||||
|
|
||||||
|
$this->assertIsArray($response['body'][1]['OS']);
|
||||||
|
$this->assertEquals('Windows', $response['body'][1]['OS']['name']);
|
||||||
|
$this->assertEquals('WIN', $response['body'][1]['OS']['short_name']);
|
||||||
|
$this->assertEquals('10', $response['body'][1]['OS']['version']);
|
||||||
|
$this->assertEquals('x64', $response['body'][1]['OS']['platform']);
|
||||||
|
|
||||||
|
$this->assertIsArray($response['body'][1]['client']);
|
||||||
|
$this->assertEquals('browser', $response['body'][1]['client']['type']);
|
||||||
|
$this->assertEquals('Chrome', $response['body'][1]['client']['name']);
|
||||||
|
$this->assertEquals('CH', $response['body'][1]['client']['short_name']); // FIXME (v1) key name should be camelcase
|
||||||
|
$this->assertEquals('70.0', $response['body'][1]['client']['version']);
|
||||||
|
$this->assertEquals('Blink', $response['body'][1]['client']['engine']);
|
||||||
|
$this->assertEquals(0, $response['body'][1]['device']);
|
||||||
|
$this->assertEquals('', $response['body'][1]['brand']);
|
||||||
|
$this->assertEquals('', $response['body'][1]['model']);
|
||||||
|
$this->assertEquals($response['body'][1]['ip'], filter_var($response['body'][0]['ip'], FILTER_VALIDATE_IP));
|
||||||
|
|
||||||
|
$this->assertIsArray($response['body'][1]['geo']);
|
||||||
|
$this->assertEquals('--', $response['body'][1]['geo']['isoCode']);
|
||||||
|
$this->assertEquals('Unknown', $response['body'][1]['geo']['country']);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test for FAILURE
|
||||||
|
*/
|
||||||
|
$response = $this->client->call(Client::METHOD_GET, '/account/logs', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals($response['headers']['status-code'], 401);
|
||||||
|
|
||||||
|
return $data;
|
||||||
|
}
|
||||||
|
|
||||||
|
//TODO Add tests for OAuth session creation
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @depends testCreateAccountSession
|
||||||
|
*/
|
||||||
|
public function testUpdateAccountName($data):array
|
||||||
|
{
|
||||||
|
$email = (isset($data['email'])) ? $data['email'] : '';
|
||||||
|
$session = (isset($data['session'])) ? $data['session'] : '';
|
||||||
|
$newName = 'New Name';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test for SUCCESS
|
||||||
|
*/
|
||||||
|
$response = $this->client->call(Client::METHOD_PATCH, '/account/name', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'cookie' => 'a_session_console=' . $session,
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
], [
|
||||||
|
'name' => $newName
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals($response['headers']['status-code'], 200);
|
||||||
|
$this->assertIsArray($response['body']);
|
||||||
|
$this->assertNotEmpty($response['body']);
|
||||||
|
$this->assertNotEmpty($response['body']);
|
||||||
|
$this->assertNotEmpty($response['body']['$uid']);
|
||||||
|
$this->assertIsNumeric($response['body']['registration']);
|
||||||
|
$this->assertEquals($response['body']['email'], $email);
|
||||||
|
$this->assertEquals($response['body']['name'], $newName);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test for FAILURE
|
||||||
|
*/
|
||||||
|
$response = $this->client->call(Client::METHOD_PATCH, '/account/name', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals($response['headers']['status-code'], 401);
|
||||||
|
|
||||||
|
$response = $this->client->call(Client::METHOD_PATCH, '/account/name', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'cookie' => 'a_session_console=' . $session,
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
], [
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals($response['headers']['status-code'], 400);
|
||||||
|
|
||||||
|
$response = $this->client->call(Client::METHOD_PATCH, '/account/name', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'cookie' => 'a_session_console=' . $session,
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
], [
|
||||||
|
'name' => 'ocSRq1d3QphHivJyUmYY7WMnrxyjdk5YvVwcDqx2zS0coxESN8RmsQwLWw5Whnf0WbVohuFWTRAaoKgCOO0Y0M7LwgFnZmi8881Y7'
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals($response['headers']['status-code'], 400);
|
||||||
|
|
||||||
|
$data['name'] = $newName;
|
||||||
|
|
||||||
|
return $data;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @depends testUpdateAccountName
|
||||||
|
*/
|
||||||
|
public function testUpdateAccountPassword($data):array
|
||||||
|
{
|
||||||
|
$email = (isset($data['email'])) ? $data['email'] : '';
|
||||||
|
$password = (isset($data['password'])) ? $data['password'] : '';
|
||||||
|
$session = (isset($data['session'])) ? $data['session'] : '';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test for SUCCESS
|
||||||
|
*/
|
||||||
|
$response = $this->client->call(Client::METHOD_PATCH, '/account/password', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'cookie' => 'a_session_console=' . $session,
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
], [
|
||||||
|
'password' => 'new-password',
|
||||||
|
'old-password' => $password,
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals($response['headers']['status-code'], 200);
|
||||||
|
$this->assertIsArray($response['body']);
|
||||||
|
$this->assertNotEmpty($response['body']);
|
||||||
|
$this->assertNotEmpty($response['body']);
|
||||||
|
$this->assertNotEmpty($response['body']['$uid']);
|
||||||
|
$this->assertIsNumeric($response['body']['registration']);
|
||||||
|
$this->assertEquals($response['body']['email'], $email);
|
||||||
|
$this->assertEquals($response['body']['name'], 'New Name');
|
||||||
|
|
||||||
|
$response = $this->client->call(Client::METHOD_POST, '/account/sessions', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
], [
|
||||||
|
'email' => $email,
|
||||||
|
'password' => 'new-password',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals($response['headers']['status-code'], 201);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test for FAILURE
|
||||||
|
*/
|
||||||
|
$response = $this->client->call(Client::METHOD_PATCH, '/account/password', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals($response['headers']['status-code'], 401);
|
||||||
|
|
||||||
|
$response = $this->client->call(Client::METHOD_PATCH, '/account/password', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'cookie' => 'a_session_console=' . $session,
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
], [
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals($response['headers']['status-code'], 400);
|
||||||
|
|
||||||
|
$data['password'] = 'new-password';
|
||||||
|
|
||||||
|
return $data;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @depends testUpdateAccountPassword
|
||||||
|
*/
|
||||||
|
public function testUpdateAccountEmail($data):array
|
||||||
|
{
|
||||||
|
$newEmail = uniqid().'new@localhost.test';
|
||||||
|
$session = (isset($data['session'])) ? $data['session'] : '';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test for SUCCESS
|
||||||
|
*/
|
||||||
|
$response = $this->client->call(Client::METHOD_PATCH, '/account/email', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'cookie' => 'a_session_console=' . $session,
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
], [
|
||||||
|
'email' => $newEmail,
|
||||||
|
'password' => 'new-password',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals($response['headers']['status-code'], 200);
|
||||||
|
$this->assertIsArray($response['body']);
|
||||||
|
$this->assertNotEmpty($response['body']);
|
||||||
|
$this->assertNotEmpty($response['body']);
|
||||||
|
$this->assertNotEmpty($response['body']['$uid']);
|
||||||
|
$this->assertIsNumeric($response['body']['registration']);
|
||||||
|
$this->assertEquals($response['body']['email'], $newEmail);
|
||||||
|
$this->assertEquals($response['body']['name'], 'New Name');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test for FAILURE
|
||||||
|
*/
|
||||||
|
$response = $this->client->call(Client::METHOD_PATCH, '/account/email', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals($response['headers']['status-code'], 401);
|
||||||
|
|
||||||
|
$response = $this->client->call(Client::METHOD_PATCH, '/account/email', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'cookie' => 'a_session_console=' . $session,
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
], [
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals($response['headers']['status-code'], 400);
|
||||||
|
|
||||||
|
$data['email'] = $newEmail;
|
||||||
|
|
||||||
|
return $data;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @depends testUpdateAccountEmail
|
||||||
|
*/
|
||||||
|
public function testUpdateAccountPrefs($data):array
|
||||||
|
{
|
||||||
|
$newEmail = uniqid().'new@localhost.test';
|
||||||
|
$session = (isset($data['session'])) ? $data['session'] : '';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test for SUCCESS
|
||||||
|
*/
|
||||||
|
$response = $this->client->call(Client::METHOD_PATCH, '/account/prefs', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'cookie' => 'a_session_console=' . $session,
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
], [
|
||||||
|
'prefs' => [
|
||||||
|
'key1' => 'value1',
|
||||||
|
'key2' => 'value2',
|
||||||
|
]
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals($response['headers']['status-code'], 200);
|
||||||
|
$this->assertIsArray($response['body']);
|
||||||
|
$this->assertNotEmpty($response['body']);
|
||||||
|
$this->assertNotEmpty($response['body']);
|
||||||
|
$this->assertEquals('value1', $response['body']['key1']);
|
||||||
|
$this->assertEquals('value2', $response['body']['key2']);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test for FAILURE
|
||||||
|
*/
|
||||||
|
$response = $this->client->call(Client::METHOD_PATCH, '/account/prefs', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals($response['headers']['status-code'], 401);
|
||||||
|
|
||||||
|
return $data;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @depends testUpdateAccountPrefs
|
||||||
|
*/
|
||||||
|
public function testDeleteAccountSession($data):array
|
||||||
|
{
|
||||||
|
$email = (isset($data['email'])) ? $data['email'] : '';
|
||||||
|
$password = (isset($data['password'])) ? $data['password'] : '';
|
||||||
|
$session = (isset($data['session'])) ? $data['session'] : '';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test for SUCCESS
|
||||||
|
*/
|
||||||
|
$response = $this->client->call(Client::METHOD_POST, '/account/sessions', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
], [
|
||||||
|
'email' => $email,
|
||||||
|
'password' => $password,
|
||||||
|
]);
|
||||||
|
|
||||||
|
$sessionNewUid = $response['body']['$uid'];
|
||||||
|
$sessionNew = $this->client->parseCookie($response['headers']['set-cookie'])['a_session_console'];
|
||||||
|
|
||||||
|
$this->assertEquals($response['headers']['status-code'], 201);
|
||||||
|
|
||||||
|
$response = $this->client->call(Client::METHOD_GET, '/account', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'cookie' => 'a_session_console=' . $sessionNew,
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals($response['headers']['status-code'], 200);
|
||||||
|
|
||||||
|
$response = $this->client->call(Client::METHOD_DELETE, '/account/sessions/'.$sessionNewUid, [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'cookie' => 'a_session_console=' . $session,
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals($response['headers']['status-code'], 204);
|
||||||
|
|
||||||
|
$response = $this->client->call(Client::METHOD_GET, '/account', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'cookie' => 'a_session_console=' . $session,
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals($response['headers']['status-code'], 200);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test for FAILURE
|
||||||
|
*/
|
||||||
|
$response = $this->client->call(Client::METHOD_GET, '/account', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'cookie' => 'a_session_console=' . $sessionNew,
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals($response['headers']['status-code'], 401);
|
||||||
|
|
||||||
|
return $data;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @depends testUpdateAccountPrefs
|
||||||
|
*/
|
||||||
|
public function testDeleteAccountSessionCurrent($data):array
|
||||||
|
{
|
||||||
|
$email = (isset($data['email'])) ? $data['email'] : '';
|
||||||
|
$password = (isset($data['password'])) ? $data['password'] : '';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test for SUCCESS
|
||||||
|
*/
|
||||||
|
$response = $this->client->call(Client::METHOD_POST, '/account/sessions', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
], [
|
||||||
|
'email' => $email,
|
||||||
|
'password' => $password,
|
||||||
|
]);
|
||||||
|
|
||||||
|
$sessionNew = $this->client->parseCookie($response['headers']['set-cookie'])['a_session_console'];
|
||||||
|
|
||||||
|
$this->assertEquals($response['headers']['status-code'], 201);
|
||||||
|
|
||||||
|
$response = $this->client->call(Client::METHOD_GET, '/account', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'cookie' => 'a_session_console=' . $sessionNew,
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals($response['headers']['status-code'], 200);
|
||||||
|
|
||||||
|
$response = $this->client->call(Client::METHOD_DELETE, '/account/sessions/current', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'cookie' => 'a_session_console=' . $sessionNew,
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals($response['headers']['status-code'], 204);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test for FAILURE
|
||||||
|
*/
|
||||||
|
$response = $this->client->call(Client::METHOD_GET, '/account', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'cookie' => 'a_session_console=' . $sessionNew,
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals($response['headers']['status-code'], 401);
|
||||||
|
|
||||||
|
return $data;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @depends testUpdateAccountPrefs
|
||||||
|
*/
|
||||||
|
public function testDeleteAccountSessions($data):array
|
||||||
|
{
|
||||||
|
$session = (isset($data['session'])) ? $data['session'] : '';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test for SUCCESS
|
||||||
|
*/
|
||||||
|
$response = $this->client->call(Client::METHOD_DELETE, '/account/sessions', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'cookie' => 'a_session_console=' . $session,
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals($response['headers']['status-code'], 204);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test for FAILURE
|
||||||
|
*/
|
||||||
|
$response = $this->client->call(Client::METHOD_GET, '/account', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'cookie' => 'a_session_console=' . $session,
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals($response['headers']['status-code'], 401);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create new fallback session
|
||||||
|
*/
|
||||||
|
$email = (isset($data['email'])) ? $data['email'] : '';
|
||||||
|
$password = (isset($data['password'])) ? $data['password'] : '';
|
||||||
|
|
||||||
|
$response = $this->client->call(Client::METHOD_POST, '/account/sessions', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
], [
|
||||||
|
'email' => $email,
|
||||||
|
'password' => $password,
|
||||||
|
]);
|
||||||
|
|
||||||
|
$data['session'] = $this->client->parseCookie($response['headers']['set-cookie'])['a_session_console'];
|
||||||
|
|
||||||
|
return $data;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @depends testDeleteAccountSession
|
||||||
|
*/
|
||||||
|
public function testCreateAccountRecovery($data):array
|
||||||
|
{
|
||||||
|
$email = (isset($data['email'])) ? $data['email'] : '';
|
||||||
|
$name = (isset($data['name'])) ? $data['name'] : '';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test for SUCCESS
|
||||||
|
*/
|
||||||
|
$response = $this->client->call(Client::METHOD_POST, '/account/recovery', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
], [
|
||||||
|
'email' => $email,
|
||||||
|
'reset' => 'http://localhost/recovery',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals(201, $response['headers']['status-code']);
|
||||||
|
$this->assertNotEmpty(3, $response['body']['$uid']);
|
||||||
|
$this->assertEquals(3, $response['body']['type']);
|
||||||
|
$this->assertIsNumeric($response['body']['expire']);
|
||||||
|
|
||||||
|
$lastEmail = $this->getLastEmail();
|
||||||
|
|
||||||
|
$this->assertEquals($email, $lastEmail['to'][0]['address']);
|
||||||
|
$this->assertEquals($name, $lastEmail['to'][0]['name']);
|
||||||
|
$this->assertEquals('Password Reset', $lastEmail['subject']);
|
||||||
|
|
||||||
|
$recovery = substr($lastEmail['text'], strpos($lastEmail['text'], '&token=', 0) + 7, 256);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test for FAILURE
|
||||||
|
*/
|
||||||
|
$response = $this->client->call(Client::METHOD_POST, '/account/recovery', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
], [
|
||||||
|
'email' => $email,
|
||||||
|
'reset' => 'localhost/recovery',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals(400, $response['headers']['status-code']);
|
||||||
|
|
||||||
|
$response = $this->client->call(Client::METHOD_POST, '/account/recovery', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
], [
|
||||||
|
'email' => $email,
|
||||||
|
'reset' => 'http://remotehost/recovery',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals(400, $response['headers']['status-code']);
|
||||||
|
|
||||||
|
$response = $this->client->call(Client::METHOD_POST, '/account/recovery', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
], [
|
||||||
|
'email' => 'not-found@localhost.test',
|
||||||
|
'reset' => 'http://localhost/recovery',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals(404, $response['headers']['status-code']);
|
||||||
|
|
||||||
|
$data['recovery'] = $recovery;
|
||||||
|
|
||||||
|
return $data;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @depends testCreateAccountRecovery
|
||||||
|
*/
|
||||||
|
public function testUpdateAccountRecovery($data):array
|
||||||
|
{
|
||||||
|
$uid = (isset($data['uid'])) ? $data['uid'] : '';
|
||||||
|
$recovery = (isset($data['recovery'])) ? $data['recovery'] : '';
|
||||||
|
$newPassowrd = 'test-recovery';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test for SUCCESS
|
||||||
|
*/
|
||||||
|
$response = $this->client->call(Client::METHOD_PUT, '/account/recovery', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
], [
|
||||||
|
'userId' => $uid,
|
||||||
|
'token' => $recovery,
|
||||||
|
'password-a' => $newPassowrd,
|
||||||
|
'password-b' => $newPassowrd,
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals(200, $response['headers']['status-code']);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test for FAILURE
|
||||||
|
*/
|
||||||
|
$response = $this->client->call(Client::METHOD_PUT, '/account/recovery', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
], [
|
||||||
|
'userId' => 'ewewe',
|
||||||
|
'token' => $recovery,
|
||||||
|
'password-a' => $newPassowrd,
|
||||||
|
'password-b' => $newPassowrd,
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals(404, $response['headers']['status-code']);
|
||||||
|
|
||||||
|
$response = $this->client->call(Client::METHOD_PUT, '/account/recovery', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
], [
|
||||||
|
'userId' => $uid,
|
||||||
|
'token' => 'sdasdasdasd',
|
||||||
|
'password-a' => $newPassowrd,
|
||||||
|
'password-b' => $newPassowrd,
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals(401, $response['headers']['status-code']);
|
||||||
|
|
||||||
|
$response = $this->client->call(Client::METHOD_PUT, '/account/recovery', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
], [
|
||||||
|
'userId' => $uid,
|
||||||
|
'token' => $recovery,
|
||||||
|
'password-a' => $newPassowrd.'x',
|
||||||
|
'password-b' => $newPassowrd,
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals(400, $response['headers']['status-code']);
|
||||||
|
|
||||||
|
return $data;
|
||||||
|
}
|
||||||
|
}
|
14
tests/e2e/AccountConsoleClientTest.php
Normal file
14
tests/e2e/AccountConsoleClientTest.php
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Tests\E2E;
|
||||||
|
|
||||||
|
use Tests\E2E\Scopes\Scope;
|
||||||
|
use Tests\E2E\Scopes\ProjectConsole;
|
||||||
|
use Tests\E2E\Scopes\SideClient;
|
||||||
|
|
||||||
|
class AccountConsoleClientTest extends Scope
|
||||||
|
{
|
||||||
|
use AccountBase;
|
||||||
|
use ProjectConsole;
|
||||||
|
use SideClient;
|
||||||
|
}
|
14
tests/e2e/AccountCustomClientTest.php
Normal file
14
tests/e2e/AccountCustomClientTest.php
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Tests\E2E;
|
||||||
|
|
||||||
|
use Tests\E2E\Scopes\Scope;
|
||||||
|
use Tests\E2E\Scopes\ProjectCustom;
|
||||||
|
use Tests\E2E\Scopes\SideClient;
|
||||||
|
|
||||||
|
class AccountCustomClientTest extends Scope
|
||||||
|
{
|
||||||
|
use AccountBase;
|
||||||
|
use ProjectCustom;
|
||||||
|
use SideClient;
|
||||||
|
}
|
9
tests/e2e/AccountCustomServerTest.php
Normal file
9
tests/e2e/AccountCustomServerTest.php
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Tests\E2E;
|
||||||
|
|
||||||
|
use Tests\E2E\Scopes\Scope;
|
||||||
|
|
||||||
|
class AccountServerClientTest extends Scope
|
||||||
|
{
|
||||||
|
}
|
|
@ -184,7 +184,7 @@ class Client
|
||||||
|
|
||||||
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method);
|
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method);
|
||||||
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
|
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
|
||||||
curl_setopt($ch, CURLOPT_USERAGENT, php_uname('s') . '-' . php_uname('r') . ':php-' . phpversion());
|
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36');
|
||||||
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
|
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
|
||||||
curl_setopt($ch, CURLOPT_HEADERFUNCTION, function ($curl, $header) use (&$responseHeaders) {
|
curl_setopt($ch, CURLOPT_HEADERFUNCTION, function ($curl, $header) use (&$responseHeaders) {
|
||||||
$len = strlen($header);
|
$len = strlen($header);
|
||||||
|
@ -215,7 +215,14 @@ class Client
|
||||||
|
|
||||||
switch (substr($responseType, 0, strpos($responseType, ';'))) {
|
switch (substr($responseType, 0, strpos($responseType, ';'))) {
|
||||||
case 'application/json':
|
case 'application/json':
|
||||||
$responseBody = json_decode($responseBody, true);
|
$json = json_decode($responseBody, true);
|
||||||
|
|
||||||
|
if($json === null) {
|
||||||
|
throw new Exception('Failed to parse response: '.$responseBody);
|
||||||
|
}
|
||||||
|
|
||||||
|
$responseBody = $json;
|
||||||
|
$json = null;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
15
tests/e2e/Scopes/ProjectConsole.php
Normal file
15
tests/e2e/Scopes/ProjectConsole.php
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Tests\E2E\Scopes;
|
||||||
|
|
||||||
|
trait ProjectConsole
|
||||||
|
{
|
||||||
|
public function getProject(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'$uid' => 'console',
|
||||||
|
'name' => 'Appwrite',
|
||||||
|
'apiKey' => '',
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
119
tests/e2e/Scopes/ProjectCustom.php
Normal file
119
tests/e2e/Scopes/ProjectCustom.php
Normal file
|
@ -0,0 +1,119 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Tests\E2E\Scopes;
|
||||||
|
|
||||||
|
use Tests\E2E\Client;
|
||||||
|
|
||||||
|
trait ProjectCustom
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected $rootEmail = '';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected $rootPassword = '';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
protected $project = [];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function getProject(): array
|
||||||
|
{
|
||||||
|
if(!empty($this->project)) {
|
||||||
|
return $this->project;
|
||||||
|
}
|
||||||
|
|
||||||
|
$root = $this->client->call(Client::METHOD_POST, '/account', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
], [
|
||||||
|
'email' => $this->rootEmail,
|
||||||
|
'password' => $this->rootEmail,
|
||||||
|
'name' => 'Demo User',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals(201, $root['headers']['status-code']);
|
||||||
|
|
||||||
|
$session = $this->client->parseCookie($root['headers']['set-cookie'])['a_session_console'];
|
||||||
|
|
||||||
|
$team = $this->client->call(Client::METHOD_POST, '/teams', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'cookie' => 'a_session_console=' . $session,
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
], [
|
||||||
|
'name' => 'Demo Project Team',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals(201, $team['headers']['status-code']);
|
||||||
|
$this->assertEquals('Demo Project Team', $team['body']['name']);
|
||||||
|
$this->assertNotEmpty($team['body']['$uid']);
|
||||||
|
|
||||||
|
$project = $this->client->call(Client::METHOD_POST, '/projects', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'cookie' => 'a_session_console=' . $session,
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
], [
|
||||||
|
'name' => 'Demo Project',
|
||||||
|
'teamId' => $team['body']['$uid'],
|
||||||
|
'description' => 'Demo Project Description',
|
||||||
|
'logo' => '',
|
||||||
|
'url' => 'https://appwrite.io',
|
||||||
|
'legalName' => '',
|
||||||
|
'legalCountry' => '',
|
||||||
|
'legalState' => '',
|
||||||
|
'legalCity' => '',
|
||||||
|
'legalAddress' => '',
|
||||||
|
'legalTaxId' => '',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals(201, $project['headers']['status-code']);
|
||||||
|
$this->assertNotEmpty($project['body']);
|
||||||
|
|
||||||
|
$key = $this->client->call(Client::METHOD_POST, '/projects/' . $project['body']['$uid'] . '/keys', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'cookie' => 'a_session_console=' . $session,
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
], [
|
||||||
|
'name' => 'Demo Project Key',
|
||||||
|
'scopes' => [
|
||||||
|
'account',
|
||||||
|
'',
|
||||||
|
'',
|
||||||
|
],
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals(201, $project['headers']['status-code']);
|
||||||
|
$this->assertNotEmpty($key['body']);
|
||||||
|
$this->assertNotEmpty($key['body']['secret']);
|
||||||
|
|
||||||
|
// return [
|
||||||
|
// 'email' => $this->demoEmail,
|
||||||
|
// 'password' => $this->demoPassword,
|
||||||
|
// 'session' => $session,
|
||||||
|
// 'projectUid' => $project['body']['$uid'],
|
||||||
|
// 'projectAPIKeySecret' => $key['body']['secret'],
|
||||||
|
// 'projectSession' => $this->client->parseCookie($user['headers']['set-cookie'])['a_session_' . $project['body']['$uid']],
|
||||||
|
// ];
|
||||||
|
|
||||||
|
$this->project = [
|
||||||
|
'$uid' => $project['body']['$uid'],
|
||||||
|
'name' => $project['body']['name'],
|
||||||
|
'apiKey' => $key['body']['secret'],
|
||||||
|
];
|
||||||
|
|
||||||
|
var_dump('init project');
|
||||||
|
|
||||||
|
return $this->project;
|
||||||
|
}
|
||||||
|
}
|
55
tests/e2e/Scopes/Scope.php
Normal file
55
tests/e2e/Scopes/Scope.php
Normal file
|
@ -0,0 +1,55 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Tests\E2E\Scopes;
|
||||||
|
|
||||||
|
use Tests\E2E\Client;
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
|
|
||||||
|
abstract class Scope extends TestCase
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @var Client
|
||||||
|
*/
|
||||||
|
protected $client = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected $endpoint = 'http://localhost/v1';
|
||||||
|
|
||||||
|
protected function setUp(): void
|
||||||
|
{
|
||||||
|
$this->client = new Client();
|
||||||
|
|
||||||
|
$this->client
|
||||||
|
->setEndpoint($this->endpoint)
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function tearDown(): void
|
||||||
|
{
|
||||||
|
$this->client = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function getLastEmail():array
|
||||||
|
{
|
||||||
|
sleep(3);
|
||||||
|
$emails = json_decode(file_get_contents('http://maildev/email'), true);
|
||||||
|
|
||||||
|
if($emails && is_array($emails)) {
|
||||||
|
return end($emails);
|
||||||
|
}
|
||||||
|
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
abstract public function getHeaders():array;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
abstract public function getProject():array;
|
||||||
|
}
|
11
tests/e2e/Scopes/SideClient.php
Normal file
11
tests/e2e/Scopes/SideClient.php
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Tests\E2E\Scopes;
|
||||||
|
|
||||||
|
trait SideClient
|
||||||
|
{
|
||||||
|
public function getHeaders():array
|
||||||
|
{
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
}
|
19
tests/e2e/Scopes/SideServer.php
Normal file
19
tests/e2e/Scopes/SideServer.php
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Tests\E2E\Scopes;
|
||||||
|
|
||||||
|
trait SideServer
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
protected $key = [];
|
||||||
|
|
||||||
|
public function getHeaders():array
|
||||||
|
{
|
||||||
|
|
||||||
|
return [
|
||||||
|
'x-appwrite-key' => $this->getProject()
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
930
tests/old/AccountTest.php
Normal file
930
tests/old/AccountTest.php
Normal file
|
@ -0,0 +1,930 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Tests\E2E;
|
||||||
|
|
||||||
|
use Tests\E2E\Client;
|
||||||
|
|
||||||
|
trait TraitDemo {
|
||||||
|
function demo2() { var_dump(9876); $this->demo(); }
|
||||||
|
}
|
||||||
|
|
||||||
|
class AccountTest extends Base
|
||||||
|
{
|
||||||
|
use TraitDemo;
|
||||||
|
|
||||||
|
public function demo() {
|
||||||
|
var_dump(4321);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testCreateAccount():array
|
||||||
|
{
|
||||||
|
$email = uniqid().'user@localhost.test';
|
||||||
|
$password = 'passwrod';
|
||||||
|
$name = 'User Name';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test for SUCCESS
|
||||||
|
*/
|
||||||
|
$response = $this->client->call(Client::METHOD_POST, '/account', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
], [
|
||||||
|
'email' => $email,
|
||||||
|
'password' => $password,
|
||||||
|
'name' => $name,
|
||||||
|
]);
|
||||||
|
|
||||||
|
$uid = $response['body']['$uid'];
|
||||||
|
|
||||||
|
$this->assertEquals($response['headers']['status-code'], 201);
|
||||||
|
$this->assertNotEmpty($response['body']);
|
||||||
|
$this->assertNotEmpty($response['body']['$uid']);
|
||||||
|
$this->assertIsNumeric($response['body']['registration']);
|
||||||
|
$this->assertEquals($response['body']['email'], $email);
|
||||||
|
$this->assertEquals($response['body']['name'], $name);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test for FAILURE
|
||||||
|
*/
|
||||||
|
$response = $this->client->call(Client::METHOD_POST, '/account', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
], [
|
||||||
|
'email' => $email,
|
||||||
|
'password' => $password,
|
||||||
|
'name' => $name,
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals($response['headers']['status-code'], 409);
|
||||||
|
|
||||||
|
return [
|
||||||
|
'uid' => $uid,
|
||||||
|
'email' => $email,
|
||||||
|
'password' => $password,
|
||||||
|
'name' => $name,
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @depends testCreateAccount
|
||||||
|
*/
|
||||||
|
public function testCreateAccountSession($data):array
|
||||||
|
{
|
||||||
|
$email = (isset($data['email'])) ? $data['email'] : '';
|
||||||
|
$password = (isset($data['password'])) ? $data['password'] : '';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test for SUCCESS
|
||||||
|
*/
|
||||||
|
$response = $this->client->call(Client::METHOD_POST, '/account/sessions', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
], [
|
||||||
|
'email' => $email,
|
||||||
|
'password' => $password,
|
||||||
|
]);
|
||||||
|
|
||||||
|
$sessionUid = $response['body']['$uid'];
|
||||||
|
$session = $this->client->parseCookie($response['headers']['set-cookie'])['a_session_console'];
|
||||||
|
|
||||||
|
$this->assertEquals($response['headers']['status-code'], 201);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test for FAILURE
|
||||||
|
*/
|
||||||
|
$response = $this->client->call(Client::METHOD_POST, '/account/sessions', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
], [
|
||||||
|
'email' => $email.'x',
|
||||||
|
'password' => $password,
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals($response['headers']['status-code'], 401);
|
||||||
|
|
||||||
|
$response = $this->client->call(Client::METHOD_POST, '/account/sessions', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
], [
|
||||||
|
'email' => $email,
|
||||||
|
'password' => $password.'x',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals($response['headers']['status-code'], 401);
|
||||||
|
|
||||||
|
$response = $this->client->call(Client::METHOD_POST, '/account/sessions', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
], [
|
||||||
|
'email' => '',
|
||||||
|
'password' => '',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals($response['headers']['status-code'], 400);
|
||||||
|
|
||||||
|
return array_merge($data, [
|
||||||
|
'sessionUid' => $sessionUid,
|
||||||
|
'session' => $session,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @depends testCreateAccountSession
|
||||||
|
*/
|
||||||
|
public function testGetAccount($data):array
|
||||||
|
{
|
||||||
|
$email = (isset($data['email'])) ? $data['email'] : '';
|
||||||
|
$name = (isset($data['name'])) ? $data['name'] : '';
|
||||||
|
$session = (isset($data['session'])) ? $data['session'] : '';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test for SUCCESS
|
||||||
|
*/
|
||||||
|
$response = $this->client->call(Client::METHOD_GET, '/account', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'cookie' => 'a_session_console=' . $session,
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals($response['headers']['status-code'], 200);
|
||||||
|
$this->assertNotEmpty($response['body']);
|
||||||
|
$this->assertNotEmpty($response['body']['$uid']);
|
||||||
|
$this->assertIsNumeric($response['body']['registration']);
|
||||||
|
$this->assertEquals($response['body']['email'], $email);
|
||||||
|
$this->assertEquals($response['body']['name'], $name);
|
||||||
|
$this->assertContains('*', $response['body']['roles']);
|
||||||
|
$this->assertContains('user:'.$response['body']['$uid'], $response['body']['roles']);
|
||||||
|
$this->assertContains('role:1', $response['body']['roles']);
|
||||||
|
$this->assertCount(3, $response['body']['roles']);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test for FAILURE
|
||||||
|
*/
|
||||||
|
$response = $this->client->call(Client::METHOD_GET, '/account', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals($response['headers']['status-code'], 401);
|
||||||
|
|
||||||
|
$response = $this->client->call(Client::METHOD_GET, '/account', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'cookie' => 'a_session_console=' . $session.'xx',
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals($response['headers']['status-code'], 401);
|
||||||
|
|
||||||
|
return $data;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @depends testCreateAccountSession
|
||||||
|
*/
|
||||||
|
public function testGetAccountPrefs($data):array
|
||||||
|
{
|
||||||
|
$session = (isset($data['session'])) ? $data['session'] : '';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test for SUCCESS
|
||||||
|
*/
|
||||||
|
$response = $this->client->call(Client::METHOD_GET, '/account/prefs', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'cookie' => 'a_session_console=' . $session,
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals($response['headers']['status-code'], 200);
|
||||||
|
$this->assertIsArray($response['body']);
|
||||||
|
$this->assertEmpty($response['body']);
|
||||||
|
$this->assertCount(0, $response['body']);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test for FAILURE
|
||||||
|
*/
|
||||||
|
$response = $this->client->call(Client::METHOD_GET, '/account/prefs', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals($response['headers']['status-code'], 401);
|
||||||
|
|
||||||
|
return $data;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @depends testCreateAccountSession
|
||||||
|
*/
|
||||||
|
public function testGetAccountSessions($data):array
|
||||||
|
{
|
||||||
|
$session = (isset($data['session'])) ? $data['session'] : '';
|
||||||
|
$sessionUid = (isset($data['sessionUid'])) ? $data['sessionUid'] : '';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test for SUCCESS
|
||||||
|
*/
|
||||||
|
$response = $this->client->call(Client::METHOD_GET, '/account/sessions', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'cookie' => 'a_session_console=' . $session,
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals($response['headers']['status-code'], 200);
|
||||||
|
$this->assertIsArray($response['body']);
|
||||||
|
$this->assertNotEmpty($response['body']);
|
||||||
|
$this->assertCount(1, $response['body']);
|
||||||
|
$this->assertEquals($sessionUid, $response['body'][0]['$uid']);
|
||||||
|
|
||||||
|
$this->assertIsArray($response['body'][0]['OS']);
|
||||||
|
$this->assertEquals('Windows', $response['body'][0]['OS']['name']);
|
||||||
|
$this->assertEquals('WIN', $response['body'][0]['OS']['short_name']);
|
||||||
|
$this->assertEquals('10', $response['body'][0]['OS']['version']);
|
||||||
|
$this->assertEquals('x64', $response['body'][0]['OS']['platform']);
|
||||||
|
|
||||||
|
$this->assertIsArray($response['body'][0]['client']);
|
||||||
|
$this->assertEquals('browser', $response['body'][0]['client']['type']);
|
||||||
|
$this->assertEquals('Chrome', $response['body'][0]['client']['name']);
|
||||||
|
$this->assertEquals('CH', $response['body'][0]['client']['short_name']); // FIXME (v1) key name should be camelcase
|
||||||
|
$this->assertEquals('70.0', $response['body'][0]['client']['version']);
|
||||||
|
$this->assertEquals('Blink', $response['body'][0]['client']['engine']);
|
||||||
|
$this->assertEquals(0, $response['body'][0]['device']);
|
||||||
|
$this->assertEquals('', $response['body'][0]['brand']);
|
||||||
|
$this->assertEquals('', $response['body'][0]['model']);
|
||||||
|
$this->assertEquals($response['body'][0]['ip'], filter_var($response['body'][0]['ip'], FILTER_VALIDATE_IP));
|
||||||
|
|
||||||
|
$this->assertIsArray($response['body'][0]['geo']);
|
||||||
|
$this->assertEquals('--', $response['body'][0]['geo']['isoCode']);
|
||||||
|
$this->assertEquals('Unknown', $response['body'][0]['geo']['country']);
|
||||||
|
|
||||||
|
$this->assertEquals(true, $response['body'][0]['current']);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test for FAILURE
|
||||||
|
*/
|
||||||
|
$response = $this->client->call(Client::METHOD_GET, '/account/sessions', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals($response['headers']['status-code'], 401);
|
||||||
|
|
||||||
|
return $data;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @depends testCreateAccountSession
|
||||||
|
*/
|
||||||
|
public function testGetAccountLogs($data):array
|
||||||
|
{
|
||||||
|
sleep(5);
|
||||||
|
$session = (isset($data['session'])) ? $data['session'] : '';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test for SUCCESS
|
||||||
|
*/
|
||||||
|
$response = $this->client->call(Client::METHOD_GET, '/account/logs', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'cookie' => 'a_session_console=' . $session,
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals($response['headers']['status-code'], 200);
|
||||||
|
$this->assertIsArray($response['body']);
|
||||||
|
$this->assertNotEmpty($response['body']);
|
||||||
|
$this->assertCount(2, $response['body']);
|
||||||
|
|
||||||
|
$this->assertEquals('account.create', $response['body'][0]['event']);
|
||||||
|
$this->assertEquals($response['body'][0]['ip'], filter_var($response['body'][0]['ip'], FILTER_VALIDATE_IP));
|
||||||
|
$this->assertIsNumeric($response['body'][0]['time']);
|
||||||
|
|
||||||
|
$this->assertIsArray($response['body'][0]['OS']);
|
||||||
|
$this->assertEquals('Windows', $response['body'][0]['OS']['name']);
|
||||||
|
$this->assertEquals('WIN', $response['body'][0]['OS']['short_name']);
|
||||||
|
$this->assertEquals('10', $response['body'][0]['OS']['version']);
|
||||||
|
$this->assertEquals('x64', $response['body'][0]['OS']['platform']);
|
||||||
|
|
||||||
|
$this->assertIsArray($response['body'][0]['client']);
|
||||||
|
$this->assertEquals('browser', $response['body'][0]['client']['type']);
|
||||||
|
$this->assertEquals('Chrome', $response['body'][0]['client']['name']);
|
||||||
|
$this->assertEquals('CH', $response['body'][0]['client']['short_name']); // FIXME (v1) key name should be camelcase
|
||||||
|
$this->assertEquals('70.0', $response['body'][0]['client']['version']);
|
||||||
|
$this->assertEquals('Blink', $response['body'][0]['client']['engine']);
|
||||||
|
$this->assertEquals(0, $response['body'][0]['device']);
|
||||||
|
$this->assertEquals('', $response['body'][0]['brand']);
|
||||||
|
$this->assertEquals('', $response['body'][0]['model']);
|
||||||
|
$this->assertEquals($response['body'][0]['ip'], filter_var($response['body'][0]['ip'], FILTER_VALIDATE_IP));
|
||||||
|
|
||||||
|
$this->assertIsArray($response['body'][0]['geo']);
|
||||||
|
$this->assertEquals('--', $response['body'][0]['geo']['isoCode']);
|
||||||
|
$this->assertEquals('Unknown', $response['body'][0]['geo']['country']);
|
||||||
|
|
||||||
|
$this->assertEquals('account.sessions.create', $response['body'][1]['event']);
|
||||||
|
$this->assertEquals($response['body'][1]['ip'], filter_var($response['body'][0]['ip'], FILTER_VALIDATE_IP));
|
||||||
|
$this->assertIsNumeric($response['body'][1]['time']);
|
||||||
|
|
||||||
|
$this->assertIsArray($response['body'][1]['OS']);
|
||||||
|
$this->assertEquals('Windows', $response['body'][1]['OS']['name']);
|
||||||
|
$this->assertEquals('WIN', $response['body'][1]['OS']['short_name']);
|
||||||
|
$this->assertEquals('10', $response['body'][1]['OS']['version']);
|
||||||
|
$this->assertEquals('x64', $response['body'][1]['OS']['platform']);
|
||||||
|
|
||||||
|
$this->assertIsArray($response['body'][1]['client']);
|
||||||
|
$this->assertEquals('browser', $response['body'][1]['client']['type']);
|
||||||
|
$this->assertEquals('Chrome', $response['body'][1]['client']['name']);
|
||||||
|
$this->assertEquals('CH', $response['body'][1]['client']['short_name']); // FIXME (v1) key name should be camelcase
|
||||||
|
$this->assertEquals('70.0', $response['body'][1]['client']['version']);
|
||||||
|
$this->assertEquals('Blink', $response['body'][1]['client']['engine']);
|
||||||
|
$this->assertEquals(0, $response['body'][1]['device']);
|
||||||
|
$this->assertEquals('', $response['body'][1]['brand']);
|
||||||
|
$this->assertEquals('', $response['body'][1]['model']);
|
||||||
|
$this->assertEquals($response['body'][1]['ip'], filter_var($response['body'][0]['ip'], FILTER_VALIDATE_IP));
|
||||||
|
|
||||||
|
$this->assertIsArray($response['body'][1]['geo']);
|
||||||
|
$this->assertEquals('--', $response['body'][1]['geo']['isoCode']);
|
||||||
|
$this->assertEquals('Unknown', $response['body'][1]['geo']['country']);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test for FAILURE
|
||||||
|
*/
|
||||||
|
$response = $this->client->call(Client::METHOD_GET, '/account/logs', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals($response['headers']['status-code'], 401);
|
||||||
|
|
||||||
|
return $data;
|
||||||
|
}
|
||||||
|
|
||||||
|
//TODO Add tests for OAuth session creation
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @depends testCreateAccountSession
|
||||||
|
*/
|
||||||
|
public function testUpdateAccountName($data):array
|
||||||
|
{
|
||||||
|
$email = (isset($data['email'])) ? $data['email'] : '';
|
||||||
|
$session = (isset($data['session'])) ? $data['session'] : '';
|
||||||
|
$newName = 'New Name';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test for SUCCESS
|
||||||
|
*/
|
||||||
|
$response = $this->client->call(Client::METHOD_PATCH, '/account/name', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'cookie' => 'a_session_console=' . $session,
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
], [
|
||||||
|
'name' => $newName
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals($response['headers']['status-code'], 200);
|
||||||
|
$this->assertIsArray($response['body']);
|
||||||
|
$this->assertNotEmpty($response['body']);
|
||||||
|
$this->assertNotEmpty($response['body']);
|
||||||
|
$this->assertNotEmpty($response['body']['$uid']);
|
||||||
|
$this->assertIsNumeric($response['body']['registration']);
|
||||||
|
$this->assertEquals($response['body']['email'], $email);
|
||||||
|
$this->assertEquals($response['body']['name'], $newName);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test for FAILURE
|
||||||
|
*/
|
||||||
|
$response = $this->client->call(Client::METHOD_PATCH, '/account/name', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals($response['headers']['status-code'], 401);
|
||||||
|
|
||||||
|
$response = $this->client->call(Client::METHOD_PATCH, '/account/name', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'cookie' => 'a_session_console=' . $session,
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
], [
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals($response['headers']['status-code'], 400);
|
||||||
|
|
||||||
|
$response = $this->client->call(Client::METHOD_PATCH, '/account/name', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'cookie' => 'a_session_console=' . $session,
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
], [
|
||||||
|
'name' => 'ocSRq1d3QphHivJyUmYY7WMnrxyjdk5YvVwcDqx2zS0coxESN8RmsQwLWw5Whnf0WbVohuFWTRAaoKgCOO0Y0M7LwgFnZmi8881Y7'
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals($response['headers']['status-code'], 400);
|
||||||
|
|
||||||
|
$data['name'] = $newName;
|
||||||
|
|
||||||
|
return $data;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @depends testUpdateAccountName
|
||||||
|
*/
|
||||||
|
public function testUpdateAccountPassword($data):array
|
||||||
|
{
|
||||||
|
$email = (isset($data['email'])) ? $data['email'] : '';
|
||||||
|
$password = (isset($data['password'])) ? $data['password'] : '';
|
||||||
|
$session = (isset($data['session'])) ? $data['session'] : '';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test for SUCCESS
|
||||||
|
*/
|
||||||
|
$response = $this->client->call(Client::METHOD_PATCH, '/account/password', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'cookie' => 'a_session_console=' . $session,
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
], [
|
||||||
|
'password' => 'new-password',
|
||||||
|
'old-password' => $password,
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals($response['headers']['status-code'], 200);
|
||||||
|
$this->assertIsArray($response['body']);
|
||||||
|
$this->assertNotEmpty($response['body']);
|
||||||
|
$this->assertNotEmpty($response['body']);
|
||||||
|
$this->assertNotEmpty($response['body']['$uid']);
|
||||||
|
$this->assertIsNumeric($response['body']['registration']);
|
||||||
|
$this->assertEquals($response['body']['email'], $email);
|
||||||
|
$this->assertEquals($response['body']['name'], 'New Name');
|
||||||
|
|
||||||
|
$response = $this->client->call(Client::METHOD_POST, '/account/sessions', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
], [
|
||||||
|
'email' => $email,
|
||||||
|
'password' => 'new-password',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals($response['headers']['status-code'], 201);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test for FAILURE
|
||||||
|
*/
|
||||||
|
$response = $this->client->call(Client::METHOD_PATCH, '/account/password', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals($response['headers']['status-code'], 401);
|
||||||
|
|
||||||
|
$response = $this->client->call(Client::METHOD_PATCH, '/account/password', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'cookie' => 'a_session_console=' . $session,
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
], [
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals($response['headers']['status-code'], 400);
|
||||||
|
|
||||||
|
$data['password'] = 'new-password';
|
||||||
|
|
||||||
|
return $data;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @depends testUpdateAccountPassword
|
||||||
|
*/
|
||||||
|
public function testUpdateAccountEmail($data):array
|
||||||
|
{
|
||||||
|
$newEmail = uniqid().'new@localhost.test';
|
||||||
|
$session = (isset($data['session'])) ? $data['session'] : '';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test for SUCCESS
|
||||||
|
*/
|
||||||
|
$response = $this->client->call(Client::METHOD_PATCH, '/account/email', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'cookie' => 'a_session_console=' . $session,
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
], [
|
||||||
|
'email' => $newEmail,
|
||||||
|
'password' => 'new-password',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals($response['headers']['status-code'], 200);
|
||||||
|
$this->assertIsArray($response['body']);
|
||||||
|
$this->assertNotEmpty($response['body']);
|
||||||
|
$this->assertNotEmpty($response['body']);
|
||||||
|
$this->assertNotEmpty($response['body']['$uid']);
|
||||||
|
$this->assertIsNumeric($response['body']['registration']);
|
||||||
|
$this->assertEquals($response['body']['email'], $newEmail);
|
||||||
|
$this->assertEquals($response['body']['name'], 'New Name');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test for FAILURE
|
||||||
|
*/
|
||||||
|
$response = $this->client->call(Client::METHOD_PATCH, '/account/email', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals($response['headers']['status-code'], 401);
|
||||||
|
|
||||||
|
$response = $this->client->call(Client::METHOD_PATCH, '/account/email', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'cookie' => 'a_session_console=' . $session,
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
], [
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals($response['headers']['status-code'], 400);
|
||||||
|
|
||||||
|
$data['email'] = $newEmail;
|
||||||
|
|
||||||
|
return $data;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @depends testUpdateAccountEmail
|
||||||
|
*/
|
||||||
|
public function testUpdateAccountPrefs($data):array
|
||||||
|
{
|
||||||
|
$newEmail = uniqid().'new@localhost.test';
|
||||||
|
$session = (isset($data['session'])) ? $data['session'] : '';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test for SUCCESS
|
||||||
|
*/
|
||||||
|
$response = $this->client->call(Client::METHOD_PATCH, '/account/prefs', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'cookie' => 'a_session_console=' . $session,
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
], [
|
||||||
|
'prefs' => [
|
||||||
|
'key1' => 'value1',
|
||||||
|
'key2' => 'value2',
|
||||||
|
]
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals($response['headers']['status-code'], 200);
|
||||||
|
$this->assertIsArray($response['body']);
|
||||||
|
$this->assertNotEmpty($response['body']);
|
||||||
|
$this->assertNotEmpty($response['body']);
|
||||||
|
$this->assertEquals('value1', $response['body']['key1']);
|
||||||
|
$this->assertEquals('value2', $response['body']['key2']);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test for FAILURE
|
||||||
|
*/
|
||||||
|
$response = $this->client->call(Client::METHOD_PATCH, '/account/prefs', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals($response['headers']['status-code'], 401);
|
||||||
|
|
||||||
|
return $data;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @depends testUpdateAccountPrefs
|
||||||
|
*/
|
||||||
|
public function testDeleteAccountSession($data):array
|
||||||
|
{
|
||||||
|
$email = (isset($data['email'])) ? $data['email'] : '';
|
||||||
|
$password = (isset($data['password'])) ? $data['password'] : '';
|
||||||
|
$session = (isset($data['session'])) ? $data['session'] : '';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test for SUCCESS
|
||||||
|
*/
|
||||||
|
$response = $this->client->call(Client::METHOD_POST, '/account/sessions', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
], [
|
||||||
|
'email' => $email,
|
||||||
|
'password' => $password,
|
||||||
|
]);
|
||||||
|
|
||||||
|
$sessionNewUid = $response['body']['$uid'];
|
||||||
|
$sessionNew = $this->client->parseCookie($response['headers']['set-cookie'])['a_session_console'];
|
||||||
|
|
||||||
|
$this->assertEquals($response['headers']['status-code'], 201);
|
||||||
|
|
||||||
|
$response = $this->client->call(Client::METHOD_GET, '/account', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'cookie' => 'a_session_console=' . $sessionNew,
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals($response['headers']['status-code'], 200);
|
||||||
|
|
||||||
|
$response = $this->client->call(Client::METHOD_DELETE, '/account/sessions/'.$sessionNewUid, [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'cookie' => 'a_session_console=' . $session,
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals($response['headers']['status-code'], 204);
|
||||||
|
|
||||||
|
$response = $this->client->call(Client::METHOD_GET, '/account', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'cookie' => 'a_session_console=' . $session,
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals($response['headers']['status-code'], 200);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test for FAILURE
|
||||||
|
*/
|
||||||
|
$response = $this->client->call(Client::METHOD_GET, '/account', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'cookie' => 'a_session_console=' . $sessionNew,
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals($response['headers']['status-code'], 401);
|
||||||
|
|
||||||
|
return $data;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @depends testUpdateAccountPrefs
|
||||||
|
*/
|
||||||
|
public function testDeleteAccountSessionCurrent($data):array
|
||||||
|
{
|
||||||
|
$email = (isset($data['email'])) ? $data['email'] : '';
|
||||||
|
$password = (isset($data['password'])) ? $data['password'] : '';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test for SUCCESS
|
||||||
|
*/
|
||||||
|
$response = $this->client->call(Client::METHOD_POST, '/account/sessions', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
], [
|
||||||
|
'email' => $email,
|
||||||
|
'password' => $password,
|
||||||
|
]);
|
||||||
|
|
||||||
|
$sessionNew = $this->client->parseCookie($response['headers']['set-cookie'])['a_session_console'];
|
||||||
|
|
||||||
|
$this->assertEquals($response['headers']['status-code'], 201);
|
||||||
|
|
||||||
|
$response = $this->client->call(Client::METHOD_GET, '/account', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'cookie' => 'a_session_console=' . $sessionNew,
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals($response['headers']['status-code'], 200);
|
||||||
|
|
||||||
|
$response = $this->client->call(Client::METHOD_DELETE, '/account/sessions/current', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'cookie' => 'a_session_console=' . $sessionNew,
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals($response['headers']['status-code'], 204);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test for FAILURE
|
||||||
|
*/
|
||||||
|
$response = $this->client->call(Client::METHOD_GET, '/account', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'cookie' => 'a_session_console=' . $sessionNew,
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals($response['headers']['status-code'], 401);
|
||||||
|
|
||||||
|
return $data;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @depends testUpdateAccountPrefs
|
||||||
|
*/
|
||||||
|
public function testDeleteAccountSessions($data):array
|
||||||
|
{
|
||||||
|
$session = (isset($data['session'])) ? $data['session'] : '';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test for SUCCESS
|
||||||
|
*/
|
||||||
|
$response = $this->client->call(Client::METHOD_DELETE, '/account/sessions', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'cookie' => 'a_session_console=' . $session,
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals($response['headers']['status-code'], 204);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test for FAILURE
|
||||||
|
*/
|
||||||
|
$response = $this->client->call(Client::METHOD_GET, '/account', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'cookie' => 'a_session_console=' . $session,
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals($response['headers']['status-code'], 401);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create new fallback session
|
||||||
|
*/
|
||||||
|
$email = (isset($data['email'])) ? $data['email'] : '';
|
||||||
|
$password = (isset($data['password'])) ? $data['password'] : '';
|
||||||
|
|
||||||
|
$response = $this->client->call(Client::METHOD_POST, '/account/sessions', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
], [
|
||||||
|
'email' => $email,
|
||||||
|
'password' => $password,
|
||||||
|
]);
|
||||||
|
|
||||||
|
$data['session'] = $this->client->parseCookie($response['headers']['set-cookie'])['a_session_console'];
|
||||||
|
|
||||||
|
return $data;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @depends testDeleteAccountSession
|
||||||
|
*/
|
||||||
|
public function testCreateAccountRecovery($data):array
|
||||||
|
{
|
||||||
|
$email = (isset($data['email'])) ? $data['email'] : '';
|
||||||
|
$name = (isset($data['name'])) ? $data['name'] : '';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test for SUCCESS
|
||||||
|
*/
|
||||||
|
$response = $this->client->call(Client::METHOD_POST, '/account/recovery', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
], [
|
||||||
|
'email' => $email,
|
||||||
|
'reset' => 'http://localhost/recovery',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals(201, $response['headers']['status-code']);
|
||||||
|
$this->assertNotEmpty(3, $response['body']['$uid']);
|
||||||
|
$this->assertEquals(3, $response['body']['type']);
|
||||||
|
$this->assertIsNumeric($response['body']['expire']);
|
||||||
|
|
||||||
|
$lastEmail = $this->getLastEmail();
|
||||||
|
|
||||||
|
$this->assertEquals($email, $lastEmail['to'][0]['address']);
|
||||||
|
$this->assertEquals($name, $lastEmail['to'][0]['name']);
|
||||||
|
$this->assertEquals('Password Reset', $lastEmail['subject']);
|
||||||
|
|
||||||
|
$recovery = substr($lastEmail['text'], strpos($lastEmail['text'], '&token=', 0) + 7, 256);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test for FAILURE
|
||||||
|
*/
|
||||||
|
$response = $this->client->call(Client::METHOD_POST, '/account/recovery', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
], [
|
||||||
|
'email' => $email,
|
||||||
|
'reset' => 'localhost/recovery',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals(400, $response['headers']['status-code']);
|
||||||
|
|
||||||
|
$response = $this->client->call(Client::METHOD_POST, '/account/recovery', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
], [
|
||||||
|
'email' => $email,
|
||||||
|
'reset' => 'http://remotehost/recovery',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals(400, $response['headers']['status-code']);
|
||||||
|
|
||||||
|
$response = $this->client->call(Client::METHOD_POST, '/account/recovery', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
], [
|
||||||
|
'email' => 'not-found@localhost.test',
|
||||||
|
'reset' => 'http://localhost/recovery',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals(404, $response['headers']['status-code']);
|
||||||
|
|
||||||
|
$data['recovery'] = $recovery;
|
||||||
|
|
||||||
|
return $data;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @depends testCreateAccountRecovery
|
||||||
|
*/
|
||||||
|
public function testUpdateAccountRecovery($data):array
|
||||||
|
{
|
||||||
|
$uid = (isset($data['uid'])) ? $data['uid'] : '';
|
||||||
|
$recovery = (isset($data['recovery'])) ? $data['recovery'] : '';
|
||||||
|
$newPassowrd = 'test-recovery';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test for SUCCESS
|
||||||
|
*/
|
||||||
|
$response = $this->client->call(Client::METHOD_PUT, '/account/recovery', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
], [
|
||||||
|
'userId' => $uid,
|
||||||
|
'token' => $recovery,
|
||||||
|
'password-a' => $newPassowrd,
|
||||||
|
'password-b' => $newPassowrd,
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals(200, $response['headers']['status-code']);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test for FAILURE
|
||||||
|
*/
|
||||||
|
$response = $this->client->call(Client::METHOD_PUT, '/account/recovery', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
], [
|
||||||
|
'userId' => 'ewewe',
|
||||||
|
'token' => $recovery,
|
||||||
|
'password-a' => $newPassowrd,
|
||||||
|
'password-b' => $newPassowrd,
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals(404, $response['headers']['status-code']);
|
||||||
|
|
||||||
|
$response = $this->client->call(Client::METHOD_PUT, '/account/recovery', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
], [
|
||||||
|
'userId' => $uid,
|
||||||
|
'token' => 'sdasdasdasd',
|
||||||
|
'password-a' => $newPassowrd,
|
||||||
|
'password-b' => $newPassowrd,
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals(401, $response['headers']['status-code']);
|
||||||
|
|
||||||
|
$response = $this->client->call(Client::METHOD_PUT, '/account/recovery', [
|
||||||
|
'origin' => 'http://localhost',
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'x-appwrite-project' => 'console',
|
||||||
|
], [
|
||||||
|
'userId' => $uid,
|
||||||
|
'token' => $recovery,
|
||||||
|
'password-a' => $newPassowrd.'x',
|
||||||
|
'password-b' => $newPassowrd,
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals(400, $response['headers']['status-code']);
|
||||||
|
|
||||||
|
return $data;
|
||||||
|
}
|
||||||
|
}
|
41
tests/old/Base.php
Normal file
41
tests/old/Base.php
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Tests\E2E;
|
||||||
|
|
||||||
|
use Tests\E2E\Client;
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
|
|
||||||
|
class Base extends TestCase
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @var Client
|
||||||
|
*/
|
||||||
|
protected $client = null;
|
||||||
|
protected $endpoint = 'http://localhost/v1';
|
||||||
|
|
||||||
|
protected function setUp(): void
|
||||||
|
{
|
||||||
|
$this->client = new Client();
|
||||||
|
|
||||||
|
$this->client
|
||||||
|
->setEndpoint($this->endpoint)
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function tearDown(): void
|
||||||
|
{
|
||||||
|
$this->client = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function getLastEmail():array
|
||||||
|
{
|
||||||
|
sleep(3);
|
||||||
|
$emails = json_decode(file_get_contents('http://localhost:1080/email'), true);
|
||||||
|
|
||||||
|
if($emails && is_array($emails)) {
|
||||||
|
return end($emails);
|
||||||
|
}
|
||||||
|
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue