Fix bugs when implementing tests

This commit is contained in:
Matej Bačo
2026-04-27 16:50:14 +02:00
parent af95e71244
commit 4ba413fcc0
48 changed files with 223 additions and 24 deletions
@@ -3,6 +3,7 @@
namespace Appwrite\Platform\Modules\Project\Http\Project\OAuth2\Apple;
use Appwrite\Auth\OAuth2\Apple;
use Appwrite\Event\Event as QueueEvent;
use Appwrite\Platform\Action;
use Appwrite\Platform\Modules\Project\Http\Project\OAuth2\Base;
use Appwrite\SDK\AuthType;
@@ -71,8 +72,8 @@ class Update extends Base
->desc('Update project OAuth2 ' . $providerLabel)
->groups(['api', 'project'])
->label('scope', 'oauth2.write')
->label('event', 'oauth2.' . $providerId . '.update')
->label('audits.event', 'project.oauth2.' . $providerId . '.update')
->label('event', 'oauth2.[providerId].update')
->label('audits.event', 'project.oauth2.[providerId].update')
->label('audits.resource', 'project.oauth2/{response.$id}')
->label('sdk', new Method(
namespace: 'project',
@@ -96,6 +97,7 @@ class Update extends Base
->inject('dbForPlatform')
->inject('project')
->inject('authorization')
->inject('queueForEvents')
->callback($this->handle(...));
}
@@ -130,9 +132,11 @@ class Update extends Base
Response $response,
Database $dbForPlatform,
Document $project,
Authorization $authorization
Authorization $authorization,
QueueEvent $queueForEvents
): void {
$providerId = static::getProviderId();
$queueForEvents->setParam('providerId', $providerId);
// The secret is stored as JSON `{"p8": "...", "keyID": "...", "teamID": "..."}`
// to match the shape Apple's OAuth2 adapter expects in getAppSecret().
@@ -3,6 +3,7 @@
namespace Appwrite\Platform\Modules\Project\Http\Project\OAuth2\Auth0;
use Appwrite\Auth\OAuth2\Auth0;
use Appwrite\Event\Event as QueueEvent;
use Appwrite\Platform\Action;
use Appwrite\Platform\Modules\Project\Http\Project\OAuth2\Base;
use Appwrite\SDK\AuthType;
@@ -64,8 +65,8 @@ class Update extends Base
->desc('Update project OAuth2 ' . $providerLabel)
->groups(['api', 'project'])
->label('scope', 'oauth2.write')
->label('event', 'oauth2.' . $providerId . '.update')
->label('audits.event', 'project.oauth2.' . $providerId . '.update')
->label('event', 'oauth2.[providerId].update')
->label('audits.event', 'project.oauth2.[providerId].update')
->label('audits.resource', 'project.oauth2/{response.$id}')
->label('sdk', new Method(
namespace: 'project',
@@ -88,6 +89,7 @@ class Update extends Base
->inject('dbForPlatform')
->inject('project')
->inject('authorization')
->inject('queueForEvents')
->callback($this->handle(...));
}
@@ -119,9 +121,11 @@ class Update extends Base
Response $response,
Database $dbForPlatform,
Document $project,
Authorization $authorization
Authorization $authorization,
QueueEvent $queueForEvents
): void {
$providerId = static::getProviderId();
$queueForEvents->setParam('providerId', $providerId);
// The secret is stored as JSON `{"clientSecret": "...", "auth0Domain": "..."}`
// to match the shape Auth0's OAuth2 adapter expects (getAuth0Domain()).
@@ -3,6 +3,7 @@
namespace Appwrite\Platform\Modules\Project\Http\Project\OAuth2\Authentik;
use Appwrite\Auth\OAuth2\Authentik;
use Appwrite\Event\Event as QueueEvent;
use Appwrite\Platform\Action;
use Appwrite\Platform\Modules\Project\Http\Project\OAuth2\Base;
use Appwrite\SDK\AuthType;
@@ -64,8 +65,8 @@ class Update extends Base
->desc('Update project OAuth2 ' . $providerLabel)
->groups(['api', 'project'])
->label('scope', 'oauth2.write')
->label('event', 'oauth2.' . $providerId . '.update')
->label('audits.event', 'project.oauth2.' . $providerId . '.update')
->label('event', 'oauth2.[providerId].update')
->label('audits.event', 'project.oauth2.[providerId].update')
->label('audits.resource', 'project.oauth2/{response.$id}')
->label('sdk', new Method(
namespace: 'project',
@@ -88,6 +89,7 @@ class Update extends Base
->inject('dbForPlatform')
->inject('project')
->inject('authorization')
->inject('queueForEvents')
->callback($this->handle(...));
}
@@ -119,9 +121,11 @@ class Update extends Base
Response $response,
Database $dbForPlatform,
Document $project,
Authorization $authorization
Authorization $authorization,
QueueEvent $queueForEvents
): void {
$providerId = static::getProviderId();
$queueForEvents->setParam('providerId', $providerId);
// The secret is stored as JSON `{"clientSecret": "...", "authentikDomain": "..."}`
// to match the shape Authentik's OAuth2 adapter expects (getAuthentikDomain()).
@@ -2,6 +2,7 @@
namespace Appwrite\Platform\Modules\Project\Http\Project\OAuth2;
use Appwrite\Event\Event as QueueEvent;
use Appwrite\Extend\Exception;
use Appwrite\Platform\Action;
use Appwrite\SDK\AuthType;
@@ -111,8 +112,8 @@ abstract class Base extends Action
->desc('Update project OAuth2 ' . $providerLabel)
->groups(['api', 'project'])
->label('scope', 'oauth2.write')
->label('event', 'oauth2.' . $providerId . '.update')
->label('audits.event', 'project.oauth2.' . $providerId . '.update')
->label('event', 'oauth2.[providerId].update')
->label('audits.event', 'project.oauth2.[providerId].update')
->label('audits.resource', 'project.oauth2/{response.$id}')
->label('sdk', new Method(
namespace: 'project',
@@ -134,6 +135,7 @@ abstract class Base extends Action
->inject('dbForPlatform')
->inject('project')
->inject('authorization')
->inject('queueForEvents')
->callback($this->action(...));
}
@@ -304,13 +306,16 @@ abstract class Base extends Action
Response $response,
Database $dbForPlatform,
Document $project,
Authorization $authorization
Authorization $authorization,
QueueEvent $queueForEvents
): void {
$project = $this->persistCredentials($project, $dbForPlatform, $authorization, $clientId, $clientSecret, $enabled);
$providerId = static::getProviderId();
$oAuthProviders = $project->getAttribute('oAuthProviders', []);
$queueForEvents->setParam('providerId', $providerId);
$response->dynamic(new Document([
'$id' => $providerId,
'enabled' => $oAuthProviders[$providerId . 'Enabled'] ?? false,
@@ -3,6 +3,7 @@
namespace Appwrite\Platform\Modules\Project\Http\Project\OAuth2\Gitlab;
use Appwrite\Auth\OAuth2\Gitlab;
use Appwrite\Event\Event as QueueEvent;
use Appwrite\Platform\Action;
use Appwrite\Platform\Modules\Project\Http\Project\OAuth2\Base;
use Appwrite\SDK\AuthType;
@@ -75,8 +76,8 @@ class Update extends Base
->desc('Update project OAuth2 ' . $providerLabel)
->groups(['api', 'project'])
->label('scope', 'oauth2.write')
->label('event', 'oauth2.' . $providerId . '.update')
->label('audits.event', 'project.oauth2.' . $providerId . '.update')
->label('event', 'oauth2.[providerId].update')
->label('audits.event', 'project.oauth2.[providerId].update')
->label('audits.resource', 'project.oauth2/{response.$id}')
->label('sdk', new Method(
namespace: 'project',
@@ -99,6 +100,7 @@ class Update extends Base
->inject('dbForPlatform')
->inject('project')
->inject('authorization')
->inject('queueForEvents')
->callback($this->handle(...));
}
@@ -130,9 +132,11 @@ class Update extends Base
Response $response,
Database $dbForPlatform,
Document $project,
Authorization $authorization
Authorization $authorization,
QueueEvent $queueForEvents
): void {
$providerId = static::getProviderId();
$queueForEvents->setParam('providerId', $providerId);
// The secret is stored as JSON `{"clientSecret": "...", "endpoint": "..."}`
// so that the Gitlab OAuth2 adapter can extract the endpoint via getEndpoint().
@@ -3,6 +3,7 @@
namespace Appwrite\Platform\Modules\Project\Http\Project\OAuth2\Microsoft;
use Appwrite\Auth\OAuth2\Microsoft;
use Appwrite\Event\Event as QueueEvent;
use Appwrite\Platform\Action;
use Appwrite\Platform\Modules\Project\Http\Project\OAuth2\Base;
use Appwrite\SDK\AuthType;
@@ -74,8 +75,8 @@ class Update extends Base
->desc('Update project OAuth2 ' . $providerLabel)
->groups(['api', 'project'])
->label('scope', 'oauth2.write')
->label('event', 'oauth2.' . $providerId . '.update')
->label('audits.event', 'project.oauth2.' . $providerId . '.update')
->label('event', 'oauth2.[providerId].update')
->label('audits.event', 'project.oauth2.[providerId].update')
->label('audits.resource', 'project.oauth2/{response.$id}')
->label('sdk', new Method(
namespace: 'project',
@@ -98,6 +99,7 @@ class Update extends Base
->inject('dbForPlatform')
->inject('project')
->inject('authorization')
->inject('queueForEvents')
->callback($this->handle(...));
}
@@ -129,9 +131,11 @@ class Update extends Base
Response $response,
Database $dbForPlatform,
Document $project,
Authorization $authorization
Authorization $authorization,
QueueEvent $queueForEvents
): void {
$providerId = static::getProviderId();
$queueForEvents->setParam('providerId', $providerId);
// The secret is stored as JSON `{"clientSecret": "...", "tenantID": "..."}`
// to match the shape Microsoft's OAuth2 adapter expects (getTenantID()).
@@ -3,6 +3,7 @@
namespace Appwrite\Platform\Modules\Project\Http\Project\OAuth2\Oidc;
use Appwrite\Auth\OAuth2\Oidc;
use Appwrite\Event\Event as QueueEvent;
use Appwrite\Extend\Exception;
use Appwrite\Platform\Action;
use Appwrite\Platform\Modules\Project\Http\Project\OAuth2\Base;
@@ -66,8 +67,8 @@ class Update extends Base
->desc('Update project OAuth2 ' . $providerLabel)
->groups(['api', 'project'])
->label('scope', 'oauth2.write')
->label('event', 'oauth2.' . $providerId . '.update')
->label('audits.event', 'project.oauth2.' . $providerId . '.update')
->label('event', 'oauth2.[providerId].update')
->label('audits.event', 'project.oauth2.[providerId].update')
->label('audits.resource', 'project.oauth2/{response.$id}')
->label('sdk', new Method(
namespace: 'project',
@@ -93,6 +94,7 @@ class Update extends Base
->inject('dbForPlatform')
->inject('project')
->inject('authorization')
->inject('queueForEvents')
->callback($this->handle(...));
}
@@ -138,9 +140,11 @@ class Update extends Base
Response $response,
Database $dbForPlatform,
Document $project,
Authorization $authorization
Authorization $authorization,
QueueEvent $queueForEvents
): void {
$providerId = static::getProviderId();
$queueForEvents->setParam('providerId', $providerId);
// The secret is stored as JSON
// `{"clientSecret": "...", "wellKnownEndpoint": "...", "authorizationEndpoint": "...", "tokenEndpoint": "...", "userInfoEndpoint": "..."}`
@@ -3,6 +3,7 @@
namespace Appwrite\Platform\Modules\Project\Http\Project\OAuth2\Okta;
use Appwrite\Auth\OAuth2\Okta;
use Appwrite\Event\Event as QueueEvent;
use Appwrite\Extend\Exception;
use Appwrite\Platform\Action;
use Appwrite\Platform\Modules\Project\Http\Project\OAuth2\Base;
@@ -66,8 +67,8 @@ class Update extends Base
->desc('Update project OAuth2 ' . $providerLabel)
->groups(['api', 'project'])
->label('scope', 'oauth2.write')
->label('event', 'oauth2.' . $providerId . '.update')
->label('audits.event', 'project.oauth2.' . $providerId . '.update')
->label('event', 'oauth2.[providerId].update')
->label('audits.event', 'project.oauth2.[providerId].update')
->label('audits.resource', 'project.oauth2/{response.$id}')
->label('sdk', new Method(
namespace: 'project',
@@ -91,6 +92,7 @@ class Update extends Base
->inject('dbForPlatform')
->inject('project')
->inject('authorization')
->inject('queueForEvents')
->callback($this->handle(...));
}
@@ -125,9 +127,11 @@ class Update extends Base
Response $response,
Database $dbForPlatform,
Document $project,
Authorization $authorization
Authorization $authorization,
QueueEvent $queueForEvents
): void {
$providerId = static::getProviderId();
$queueForEvents->setParam('providerId', $providerId);
// The secret is stored as JSON `{"clientSecret": "...", "oktaDomain": "...", "authorizationServerId": "..."}`
// to match the shape Okta's OAuth2 adapter expects.
@@ -17,6 +17,7 @@ use Appwrite\Platform\Modules\Project\Http\Project\MockPhone\Get as GetMockPhone
use Appwrite\Platform\Modules\Project\Http\Project\MockPhone\Update as UpdateMockPhone;
use Appwrite\Platform\Modules\Project\Http\Project\MockPhone\XList as ListMockPhones;
use Appwrite\Platform\Modules\Project\Http\Project\OAuth2\Amazon\Update as UpdateOAuth2Amazon;
use Appwrite\Platform\Modules\Project\Http\Project\OAuth2\Apple\Update as UpdateOAuth2Apple;
use Appwrite\Platform\Modules\Project\Http\Project\OAuth2\Auth0\Update as UpdateOAuth2Auth0;
use Appwrite\Platform\Modules\Project\Http\Project\OAuth2\Authentik\Update as UpdateOAuth2Authentik;
use Appwrite\Platform\Modules\Project\Http\Project\OAuth2\Autodesk\Update as UpdateOAuth2Autodesk;
@@ -212,6 +213,7 @@ class Http extends Service
$this->addAction(UpdateOAuth2Oidc::getName(), new UpdateOAuth2Oidc());
$this->addAction(UpdateOAuth2Okta::getName(), new UpdateOAuth2Okta());
$this->addAction(UpdateOAuth2Kick::getName(), new UpdateOAuth2Kick());
$this->addAction(UpdateOAuth2Apple::getName(), new UpdateOAuth2Apple());
$this->addAction(UpdateOAuth2Microsoft::getName(), new UpdateOAuth2Microsoft());
}
}
@@ -6,6 +6,10 @@ use Appwrite\Utopia\Response;
class OAuth2Amazon extends OAuth2Base
{
public array $conditions = [
'$id' => 'amazon',
];
public function getProviderLabel(): string
{
return 'Amazon';
@@ -6,6 +6,10 @@ use Appwrite\Utopia\Response;
class OAuth2Apple extends OAuth2Base
{
public array $conditions = [
'$id' => 'apple',
];
public function getProviderLabel(): string
{
return 'Apple';
@@ -39,6 +43,12 @@ class OAuth2Apple extends OAuth2Base
// contents, Key ID, Team ID) instead of a single clientSecret, so the
// rules are defined manually rather than delegating to OAuth2Base.
$this
->addRule('$id', [
'type' => self::TYPE_STRING,
'description' => 'OAuth2 provider ID.',
'default' => '',
'example' => 'apple',
])
->addRule('enabled', [
'type' => self::TYPE_BOOLEAN,
'description' => 'OAuth2 provider is active and can be used to create sessions.',
@@ -6,6 +6,10 @@ use Appwrite\Utopia\Response;
class OAuth2Auth0 extends OAuth2Base
{
public array $conditions = [
'$id' => 'auth0',
];
public function getProviderLabel(): string
{
return 'Auth0';
@@ -6,6 +6,10 @@ use Appwrite\Utopia\Response;
class OAuth2Authentik extends OAuth2Base
{
public array $conditions = [
'$id' => 'authentik',
];
public function getProviderLabel(): string
{
return 'Authentik';
@@ -6,6 +6,10 @@ use Appwrite\Utopia\Response;
class OAuth2Autodesk extends OAuth2Base
{
public array $conditions = [
'$id' => 'autodesk',
];
public function getProviderLabel(): string
{
return 'Autodesk';
@@ -97,6 +97,12 @@ abstract class OAuth2Base extends Model
public function __construct()
{
$this
->addRule('$id', [
'type' => self::TYPE_STRING,
'description' => 'OAuth2 provider ID.',
'default' => '',
'example' => 'github',
])
->addRule('enabled', [
'type' => self::TYPE_BOOLEAN,
'description' => 'OAuth2 provider is active and can be used to create sessions.',
@@ -6,6 +6,10 @@ use Appwrite\Utopia\Response;
class OAuth2Bitbucket extends OAuth2Base
{
public array $conditions = [
'$id' => 'bitbucket',
];
public function getProviderLabel(): string
{
return 'Bitbucket';
@@ -6,6 +6,10 @@ use Appwrite\Utopia\Response;
class OAuth2Bitly extends OAuth2Base
{
public array $conditions = [
'$id' => 'bitly',
];
public function getProviderLabel(): string
{
return 'Bitly';
@@ -6,6 +6,10 @@ use Appwrite\Utopia\Response;
class OAuth2Box extends OAuth2Base
{
public array $conditions = [
'$id' => 'box',
];
public function getProviderLabel(): string
{
return 'Box';
@@ -6,6 +6,10 @@ use Appwrite\Utopia\Response;
class OAuth2Dailymotion extends OAuth2Base
{
public array $conditions = [
'$id' => 'dailymotion',
];
public function getProviderLabel(): string
{
return 'Dailymotion';
@@ -6,6 +6,10 @@ use Appwrite\Utopia\Response;
class OAuth2Discord extends OAuth2Base
{
public array $conditions = [
'$id' => 'discord',
];
public function getProviderLabel(): string
{
return 'Discord';
@@ -6,6 +6,10 @@ use Appwrite\Utopia\Response;
class OAuth2Disqus extends OAuth2Base
{
public array $conditions = [
'$id' => 'disqus',
];
public function getProviderLabel(): string
{
return 'Disqus';
@@ -6,6 +6,10 @@ use Appwrite\Utopia\Response;
class OAuth2Dropbox extends OAuth2Base
{
public array $conditions = [
'$id' => 'dropbox',
];
public function getProviderLabel(): string
{
return 'Dropbox';
@@ -6,6 +6,10 @@ use Appwrite\Utopia\Response;
class OAuth2Etsy extends OAuth2Base
{
public array $conditions = [
'$id' => 'etsy',
];
public function getProviderLabel(): string
{
return 'Etsy';
@@ -6,6 +6,10 @@ use Appwrite\Utopia\Response;
class OAuth2Facebook extends OAuth2Base
{
public array $conditions = [
'$id' => 'facebook',
];
public function getProviderLabel(): string
{
return 'Facebook';
@@ -6,6 +6,10 @@ use Appwrite\Utopia\Response;
class OAuth2Figma extends OAuth2Base
{
public array $conditions = [
'$id' => 'figma',
];
public function getProviderLabel(): string
{
return 'Figma';
@@ -6,6 +6,10 @@ use Appwrite\Utopia\Response;
class OAuth2GitHub extends OAuth2Base
{
public array $conditions = [
'$id' => 'github',
];
public function getProviderLabel(): string
{
return 'GitHub';
@@ -6,6 +6,10 @@ use Appwrite\Utopia\Response;
class OAuth2Gitlab extends OAuth2Base
{
public array $conditions = [
'$id' => 'gitlab',
];
public function getProviderLabel(): string
{
return 'GitLab';
@@ -6,6 +6,10 @@ use Appwrite\Utopia\Response;
class OAuth2Google extends OAuth2Base
{
public array $conditions = [
'$id' => 'google',
];
public function getProviderLabel(): string
{
return 'Google';
@@ -6,6 +6,10 @@ use Appwrite\Utopia\Response;
class OAuth2Kick extends OAuth2Base
{
public array $conditions = [
'$id' => 'kick',
];
public function getProviderLabel(): string
{
return 'Kick';
@@ -6,6 +6,10 @@ use Appwrite\Utopia\Response;
class OAuth2Linkedin extends OAuth2Base
{
public array $conditions = [
'$id' => 'linkedin',
];
public function getProviderLabel(): string
{
return 'LinkedIn';
@@ -6,6 +6,10 @@ use Appwrite\Utopia\Response;
class OAuth2Microsoft extends OAuth2Base
{
public array $conditions = [
'$id' => 'microsoft',
];
public function getProviderLabel(): string
{
return 'Microsoft';
@@ -6,6 +6,10 @@ use Appwrite\Utopia\Response;
class OAuth2Notion extends OAuth2Base
{
public array $conditions = [
'$id' => 'notion',
];
public function getProviderLabel(): string
{
return 'Notion';
@@ -6,6 +6,10 @@ use Appwrite\Utopia\Response;
class OAuth2Oidc extends OAuth2Base
{
public array $conditions = [
'$id' => 'oidc',
];
public function getProviderLabel(): string
{
return 'OpenID Connect';
@@ -6,6 +6,10 @@ use Appwrite\Utopia\Response;
class OAuth2Okta extends OAuth2Base
{
public array $conditions = [
'$id' => 'okta',
];
public function getProviderLabel(): string
{
return 'Okta';
@@ -6,6 +6,10 @@ use Appwrite\Utopia\Response;
class OAuth2Paypal extends OAuth2Base
{
public array $conditions = [
'$id' => ['paypal', 'paypalSandbox'],
];
public function getProviderLabel(): string
{
return 'PayPal';
@@ -6,6 +6,10 @@ use Appwrite\Utopia\Response;
class OAuth2Podio extends OAuth2Base
{
public array $conditions = [
'$id' => 'podio',
];
public function getProviderLabel(): string
{
return 'Podio';
@@ -6,6 +6,10 @@ use Appwrite\Utopia\Response;
class OAuth2Salesforce extends OAuth2Base
{
public array $conditions = [
'$id' => 'salesforce',
];
public function getProviderLabel(): string
{
return 'Salesforce';
@@ -6,6 +6,10 @@ use Appwrite\Utopia\Response;
class OAuth2Slack extends OAuth2Base
{
public array $conditions = [
'$id' => 'slack',
];
public function getProviderLabel(): string
{
return 'Slack';
@@ -6,6 +6,10 @@ use Appwrite\Utopia\Response;
class OAuth2Spotify extends OAuth2Base
{
public array $conditions = [
'$id' => 'spotify',
];
public function getProviderLabel(): string
{
return 'Spotify';
@@ -6,6 +6,10 @@ use Appwrite\Utopia\Response;
class OAuth2Stripe extends OAuth2Base
{
public array $conditions = [
'$id' => 'stripe',
];
public function getProviderLabel(): string
{
return 'Stripe';
@@ -6,6 +6,10 @@ use Appwrite\Utopia\Response;
class OAuth2Tradeshift extends OAuth2Base
{
public array $conditions = [
'$id' => ['tradeshift', 'tradeshiftSandbox'],
];
public function getProviderLabel(): string
{
return 'Tradeshift';
@@ -6,6 +6,10 @@ use Appwrite\Utopia\Response;
class OAuth2Twitch extends OAuth2Base
{
public array $conditions = [
'$id' => 'twitch',
];
public function getProviderLabel(): string
{
return 'Twitch';
@@ -6,6 +6,10 @@ use Appwrite\Utopia\Response;
class OAuth2WordPress extends OAuth2Base
{
public array $conditions = [
'$id' => 'wordpress',
];
public function getProviderLabel(): string
{
return 'WordPress';
@@ -6,6 +6,10 @@ use Appwrite\Utopia\Response;
class OAuth2X extends OAuth2Base
{
public array $conditions = [
'$id' => 'x',
];
public function getProviderLabel(): string
{
return 'X';
@@ -6,6 +6,10 @@ use Appwrite\Utopia\Response;
class OAuth2Yahoo extends OAuth2Base
{
public array $conditions = [
'$id' => 'yahoo',
];
public function getProviderLabel(): string
{
return 'Yahoo';
@@ -6,6 +6,10 @@ use Appwrite\Utopia\Response;
class OAuth2Yandex extends OAuth2Base
{
public array $conditions = [
'$id' => 'yandex',
];
public function getProviderLabel(): string
{
return 'Yandex';
@@ -6,6 +6,10 @@ use Appwrite\Utopia\Response;
class OAuth2Zoho extends OAuth2Base
{
public array $conditions = [
'$id' => 'zoho',
];
public function getProviderLabel(): string
{
return 'Zoho';
@@ -6,6 +6,10 @@ use Appwrite\Utopia\Response;
class OAuth2Zoom extends OAuth2Base
{
public array $conditions = [
'$id' => 'zoom',
];
public function getProviderLabel(): string
{
return 'Zoom';