diff --git a/app/controllers/api/messaging.php b/app/controllers/api/messaging.php index d9b5543e5c..396d81c06b 100644 --- a/app/controllers/api/messaging.php +++ b/app/controllers/api/messaging.php @@ -445,7 +445,7 @@ App::post('/v1/messaging/providers/fcm') ->label('scope', 'providers.write') ->label('sdk.auth', [APP_AUTH_TYPE_ADMIN, APP_AUTH_TYPE_KEY]) ->label('sdk.namespace', 'messaging') - ->label('sdk.method', 'createFCMProvider') + ->label('sdk.method', 'createFcmProvider') ->label('sdk.description', '/docs/references/messaging/create-fcm-provider.md') ->label('sdk.response.code', Response::STATUS_CODE_CREATED) ->label('sdk.response.type', Response::CONTENT_TYPE_JSON) @@ -501,7 +501,7 @@ App::post('/v1/messaging/providers/apns') ->label('scope', 'providers.write') ->label('sdk.auth', [APP_AUTH_TYPE_ADMIN, APP_AUTH_TYPE_KEY]) ->label('sdk.namespace', 'messaging') - ->label('sdk.method', 'createAPNSProvider') + ->label('sdk.method', 'createApnsProvider') ->label('sdk.description', '/docs/references/messaging/create-apns-provider.md') ->label('sdk.response.code', Response::STATUS_CODE_CREATED) ->label('sdk.response.type', Response::CONTENT_TYPE_JSON) @@ -1048,7 +1048,7 @@ App::patch('/v1/messaging/providers/fcm/:id') ->label('scope', 'providers.write') ->label('sdk.auth', [APP_AUTH_TYPE_ADMIN, APP_AUTH_TYPE_KEY]) ->label('sdk.namespace', 'messaging') - ->label('sdk.method', 'updateFCMProvider') + ->label('sdk.method', 'updateFcmProvider') ->label('sdk.description', '/docs/references/messaging/update-fcm-provider.md') ->label('sdk.response.code', Response::STATUS_CODE_OK) ->label('sdk.response.type', Response::CONTENT_TYPE_JSON) @@ -1099,7 +1099,7 @@ App::patch('/v1/messaging/providers/apns/:id') ->label('scope', 'providers.write') ->label('sdk.auth', [APP_AUTH_TYPE_ADMIN, APP_AUTH_TYPE_KEY]) ->label('sdk.namespace', 'messaging') - ->label('sdk.method', 'updateAPNSProvider') + ->label('sdk.method', 'updateApnsProvider') ->label('sdk.description', '/docs/references/messaging/update-apns-provider.md') ->label('sdk.response.code', Response::STATUS_CODE_OK) ->label('sdk.response.type', Response::CONTENT_TYPE_JSON) diff --git a/tests/e2e/Services/GraphQL/AccountTest.php b/tests/e2e/Services/GraphQL/AccountTest.php index dc399cf2b3..801be808c9 100644 --- a/tests/e2e/Services/GraphQL/AccountTest.php +++ b/tests/e2e/Services/GraphQL/AccountTest.php @@ -133,7 +133,7 @@ class AccountTest extends Scope } $projectId = $this->getProject()['$id']; - $query = $this->getQuery(self::$CREATE_PROVIDER); + $query = $this->getQuery(self::$CREATE_MSG91_PROVIDER); $graphQLPayload = [ 'query' => $query, 'variables' => [ diff --git a/tests/e2e/Services/GraphQL/Base.php b/tests/e2e/Services/GraphQL/Base.php index c670f8e17c..3a7859662a 100644 --- a/tests/e2e/Services/GraphQL/Base.php +++ b/tests/e2e/Services/GraphQL/Base.php @@ -197,6 +197,29 @@ trait Base public static string $GET_QRCODE = 'get_qrcode'; public static string $GET_USER_INITIALS = 'get_user_initials'; + // Providers + public static string $CREATE_MAILGUN_PROVIDER = 'create_mailgun_provider'; + public static string $CREATE_SENDGRID_PROVIDER = 'create_sendgrid_provider'; + public static string $CREATE_TWILIO_PROVIDER = 'create_twilio_provider'; + public static string $CREATE_TELESIGN_PROVIDER = 'create_telesign_provider'; + public static string $CREATE_TEXTMAGIC_PROVIDER = 'create_textmagic_provider'; + public static string $CREATE_MSG91_PROVIDER = 'create_msg91_provider'; + public static string $CREATE_VONAGE_PROVIDER = 'create_vonage_provider'; + public static string $CREATE_FCM_PROVIDER = 'create_fcm_provider'; + public static string $CREATE_APNS_PROVIDER = 'create_apns_provider'; + public static string $LIST_PROVIDERS = 'list_providers'; + public static string $GET_PROVIDER = 'get_provider'; + public static string $UPDATE_MAILGUN_PROVIDER = 'update_mailgun_provider'; + public static string $UPDATE_SENDGRID_PROVIDER = 'update_sendgrid_provider'; + public static string $UPDATE_TWILIO_PROVIDER = 'update_twilio_provider'; + public static string $UPDATE_TELESIGN_PROVIDER = 'update_telesign_provider'; + public static string $UPDATE_TEXTMAGIC_PROVIDER = 'update_textmagic_provider'; + public static string $UPDATE_MSG91_PROVIDER = 'update_msg91_provider'; + public static string $UPDATE_VONAGE_PROVIDER = 'update_vonage_provider'; + public static string $UPDATE_FCM_PROVIDER = 'update_fcm_provider'; + public static string $UPDATE_APNS_PROVIDER = 'update_apns_provider'; + public static string $DELETE_PROVIDER = 'delete_provider'; + // Complex queries public static string $COMPLEX_QUERY = 'complex_query'; @@ -296,8 +319,6 @@ trait Base } '; - public static string $CREATE_PROVIDER = 'create_provider'; - public function getQuery(string $name): string { switch ($name) { @@ -1688,6 +1709,235 @@ trait Base status } }'; + case self::$CREATE_MAILGUN_PROVIDER: + return 'mutation createMailgunProvider($providerId: String!, $name: String!, $domain: String!, $apiKey: String!, $from: String!) { + messagingCreateMailgunProvider(providerId: $providerId, name: $name, domain: $domain, apiKey: $apiKey, from: $from) { + _id + name + provider + type + default + enabled + } + }'; + case self::$CREATE_SENDGRID_PROVIDER: + return 'mutation createSendgridProvider($providerId: String!, $name: String!, $apiKey: String!) { + messagingCreateSendgridProvider(providerId: $providerId, name: $name, apiKey: $apiKey) { + _id + name + provider + type + default + enabled + } + }'; + case self::$CREATE_TWILIO_PROVIDER: + return 'mutation createTwilioProvider($providerId: String!, $name: String!, $accountSid: String!, $authToken: String!) { + messagingCreateTwilioProvider(providerId: $providerId, name: $name, accountSid: $accountSid, authToken: $authToken) { + _id + name + provider + type + default + enabled + } + }'; + case self::$CREATE_TELESIGN_PROVIDER: + return 'mutation createTelesignProvider($providerId: String!, $name: String!, $username: String!, $password: String!) { + messagingCreateTelesignProvider(providerId: $providerId, name: $name, username: $username, password: $password) { + _id + name + provider + type + default + enabled + } + }'; + case self::$CREATE_TEXTMAGIC_PROVIDER: + return 'mutation createTextmagicProvider($providerId: String!, $name: String!, $username: String!, $apiKey: String!) { + messagingCreateTextmagicProvider(providerId: $providerId, name: $name, username: $username, apiKey: $apiKey) { + _id + name + provider + type + default + enabled + } + }'; + case self::$CREATE_MSG91_PROVIDER: + return 'mutation createMsg91Provider($providerId: String!, $name: String!, $from: String!, $senderId: String!, $authKey: String!, $default: Boolean, $enabled: Boolean) { + messagingCreateMsg91Provider(providerId: $providerId, name: $name, from: $from, senderId: $senderId, authKey: $authKey, default: $default, enabled: $enabled) { + _id + name + provider + type + default + enabled + } + }'; + case self::$CREATE_VONAGE_PROVIDER: + return 'mutation createVonageProvider($providerId: String!, $name: String!, $apiKey: String!, $apiSecret: String!) { + messagingCreateVonageProvider(providerId: $providerId, name: $name, apiKey: $apiKey, apiSecret: $apiSecret) { + _id + name + provider + type + default + enabled + } + }'; + case self::$CREATE_FCM_PROVIDER: + return 'mutation createFcmProvider($providerId: String!, $name: String!, $serverKey: String!) { + messagingCreateFcmProvider(providerId: $providerId, name: $name, serverKey: $serverKey) { + _id + name + provider + type + default + enabled + } + }'; + case self::$CREATE_APNS_PROVIDER: + return 'mutation createApnsProvider($providerId: String!, $name: String!, $authKey: String!, $authKeyId: String!, $teamId: String!, $bundleId: String!, $endpoint: String!) { + messagingCreateApnsProvider(providerId: $providerId, name: $name, authKey: $authKey, authKeyId: $authKeyId, teamId: $teamId, bundleId: $bundleId, endpoint: $endpoint) { + _id + name + provider + type + default + enabled + } + }'; + case self::$LIST_PROVIDERS: + return 'query listProviders { + messagingListProviders { + total + providers { + _id + name + provider + type + default + enabled + } + } + }'; + case self::$GET_PROVIDER: + return 'query getProvider($id: String!) { + messagingGetProvider(id: $id) { + _id + name + provider + type + default + enabled + } + }'; + case self::$UPDATE_MAILGUN_PROVIDER: + return 'mutation updateMailgunProvider($id: String!, $name: String!, $domain: String!, $apiKey: String!, $isEuRegion: Boolean, $enabled: Boolean) { + messagingUpdateMailgunProvider(id: $id, name: $name, domain: $domain, apiKey: $apiKey, isEuRegion: $isEuRegion, enabled: $enabled) { + _id + name + provider + type + default + enabled + } + }'; + case self::$UPDATE_SENDGRID_PROVIDER: + return 'mutation messagingUpdateSendgridProvider($id: String!, $name: String!, $apiKey: String!) { + messagingUpdateSendgridProvider(id: $id, name: $name, apiKey: $apiKey) { + _id + name + provider + type + default + enabled + } + }'; + case self::$UPDATE_TWILIO_PROVIDER: + return 'mutation updateTwilioProvider($id: String!, $name: String!, $accountSid: String!, $authToken: String!) { + messagingUpdateTwilioProvider(id: $id, name: $name, accountSid: $accountSid, authToken: $authToken) { + _id + name + provider + type + default + enabled + } + }'; + case self::$UPDATE_TELESIGN_PROVIDER: + return 'mutation updateTelesignProvider($id: String!, $name: String!, $username: String!, $password: String!) { + messagingUpdateTelesignProvider(id: $id, name: $name, username: $username, password: $password) { + _id + name + provider + type + default + enabled + } + }'; + case self::$UPDATE_TEXTMAGIC_PROVIDER: + return 'mutation updateTextmagicProvider($id: String!, $name: String!, $username: String!, $apiKey: String!) { + messagingUpdateTextmagicProvider(id: $id, name: $name, username: $username, apiKey: $apiKey) { + _id + name + provider + type + default + enabled + } + }'; + case self::$UPDATE_MSG91_PROVIDER: + return 'mutation updateMsg91Provider($id: String!, $name: String!, $senderId: String!, $authKey: String!) { + messagingUpdateMsg91Provider(id: $id, name: $name, senderId: $senderId, authKey: $authKey) { + _id + name + provider + type + default + enabled + } + }'; + case self::$UPDATE_VONAGE_PROVIDER: + return 'mutation updateVonageProvider($id: String!, $name: String!, $apiKey: String!, $apiSecret: String!) { + messagingUpdateVonageProvider(id: $id, name: $name, apiKey: $apiKey, apiSecret: $apiSecret) { + _id + name + provider + type + default + enabled + } + }'; + case self::$UPDATE_FCM_PROVIDER: + return 'mutation updateFcmProvider($id: String!, $name: String!, $serverKey: String!) { + messagingUpdateFcmProvider(id: $id, name: $name, serverKey: $serverKey) { + _id + name + provider + type + default + enabled + } + }'; + case self::$UPDATE_APNS_PROVIDER: + return 'mutation updateApnsProvider($id: String!, $name: String!, $authKey: String!, $authKeyId: String!, $teamId: String!, $bundleId: String!, $endpoint: String!) { + messagingUpdateApnsProvider(id: $id, name: $name, authKey: $authKey, authKeyId: $authKeyId, teamId: $teamId, bundleId: $bundleId, endpoint: $endpoint) { + _id + name + provider + type + default + enabled + } + }'; + case self::$DELETE_PROVIDER: + return 'mutation deleteProvider($id: String!) { + messagingDeleteProvider(id: $id) { + status + } + }'; case self::$COMPLEX_QUERY: return 'mutation complex($databaseId: String!, $databaseName: String!, $collectionId: String!, $collectionName: String!, $documentSecurity: Boolean!, $collectionPermissions: [String!]!) { databasesCreate(databaseId: $databaseId, name: $databaseName) { @@ -1931,33 +2181,6 @@ trait Base } } }' . PHP_EOL . self::$FRAGMENT_ATTRIBUTES; - case self::$CREATE_PROVIDER: - return 'mutation createProviderMsg91( - $providerId: String!, - $name: String!, - $from: String!, - $senderId: String!, - $authKey: String! - $default: Boolean, - $enabled: Boolean, - ) { - messagingCreateProviderMsg91( - providerId: $providerId, - name: $name, - from: $from, - senderId: $senderId, - authKey: $authKey - default: $default, - enabled: $enabled, - ) { - _id - name - provider - type - default - enabled - } - }'; } throw new \InvalidArgumentException('Invalid query type'); diff --git a/tests/e2e/Services/GraphQL/MessagingTest.php b/tests/e2e/Services/GraphQL/MessagingTest.php new file mode 100644 index 0000000000..1bc5e70477 --- /dev/null +++ b/tests/e2e/Services/GraphQL/MessagingTest.php @@ -0,0 +1,260 @@ + [ + 'providerId' => ID::unique(), + 'name' => 'Sengrid1', + 'apiKey' => 'my-apikey', + ], + 'Mailgun' => [ + 'providerId' => ID::unique(), + 'name' => 'Mailgun1', + 'apiKey' => 'my-apikey', + 'domain' => 'my-domain', + 'from' => 'sender-email@my-domain', + ], + 'Twilio' => [ + 'providerId' => ID::unique(), + 'name' => 'Twilio1', + 'accountSid' => 'my-accountSid', + 'authToken' => 'my-authToken', + ], + 'Telesign' => [ + 'providerId' => ID::unique(), + 'name' => 'Telesign1', + 'username' => 'my-username', + 'password' => 'my-password', + ], + 'Textmagic' => [ + 'providerId' => ID::unique(), + 'name' => 'Textmagic1', + 'username' => 'my-username', + 'apiKey' => 'my-apikey', + ], + 'Msg91' => [ + 'providerId' => ID::unique(), + 'name' => 'Ms91-1', + 'senderId' => 'my-senderid', + 'authKey' => 'my-authkey', + 'from' => '+123456789' + ], + 'Vonage' => [ + 'providerId' => ID::unique(), + 'name' => 'Vonage1', + 'apiKey' => 'my-apikey', + 'apiSecret' => 'my-apisecret', + ], + 'Fcm' => [ + 'providerId' => ID::unique(), + 'name' => 'FCM1', + 'serverKey' => 'my-serverkey', + ], + 'Apns' => [ + 'providerId' => ID::unique(), + 'name' => 'APNS1', + 'authKey' => 'my-authkey', + 'authKeyId' => 'my-authkeyid', + 'teamId' => 'my-teamid', + 'bundleId' => 'my-bundleid', + 'endpoint' => 'my-endpoint', + ], + ]; + + $providers = []; + + foreach (\array_keys($providersParams) as $key) { + $query = $this->getQuery('create_' . \strtolower($key) . '_provider'); + $graphQLPayload = [ + 'query' => $query, + 'variables' => $providersParams[$key], + ]; + $response = $this->client->call(Client::METHOD_POST, '/graphql', \array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + 'x-appwrite-key' => $this->getProject()['apiKey'], + ]), $graphQLPayload); + \array_push($providers, $response['body']['data']['messagingCreate' . $key . 'Provider']); + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertEquals($providersParams[$key]['name'], $response['body']['data']['messagingCreate' . $key . 'Provider']['name']); + } + + return $providers; + } + + /** + * @depends testCreateProviders + */ + public function testUpdateProviders(array $providers): array + { + $providersParams = [ + 'Sendgrid' => [ + 'id' => $providers[0]['_id'], + 'name' => 'Sengrid2', + 'apiKey' => 'my-apikey', + ], + 'Mailgun' => [ + 'id' => $providers[1]['_id'], + 'name' => 'Mailgun2', + 'apiKey' => 'my-apikey', + 'domain' => 'my-domain', + ], + 'Twilio' => [ + 'id' => $providers[2]['_id'], + 'name' => 'Twilio2', + 'accountSid' => 'my-accountSid', + 'authToken' => 'my-authToken', + ], + 'Telesign' => [ + 'id' => $providers[3]['_id'], + 'name' => 'Telesign2', + 'username' => 'my-username', + 'password' => 'my-password', + ], + 'Textmagic' => [ + 'id' => $providers[4]['_id'], + 'name' => 'Textmagic2', + 'username' => 'my-username', + 'apiKey' => 'my-apikey', + ], + 'Msg91' => [ + 'id' => $providers[5]['_id'], + 'name' => 'Ms91-2', + 'senderId' => 'my-senderid', + 'authKey' => 'my-authkey', + ], + 'Vonage' => [ + 'id' => $providers[6]['_id'], + 'name' => 'Vonage2', + 'apiKey' => 'my-apikey', + 'apiSecret' => 'my-apisecret', + ], + 'Fcm' => [ + 'id' => $providers[7]['_id'], + 'name' => 'FCM2', + 'serverKey' => 'my-serverkey', + ], + 'Apns' => [ + 'id' => $providers[8]['_id'], + 'name' => 'APNS2', + 'authKey' => 'my-authkey', + 'authKeyId' => 'my-authkeyid', + 'teamId' => 'my-teamid', + 'bundleId' => 'my-bundleid', + 'endpoint' => 'my-endpoint', + ], + ]; + foreach (\array_keys($providersParams) as $index => $key) { + $query = $this->getQuery('update_' . \strtolower($key) . '_provider'); + $graphQLPayload = [ + 'query' => $query, + 'variables' => $providersParams[$key], + ]; + $response = $this->client->call(Client::METHOD_POST, '/graphql', [ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + 'x-appwrite-key' => $this->getProject()['apiKey'], + ], $graphQLPayload); + $providers[$index] = $response['body']['data']['messagingUpdate' . $key . 'Provider']; + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertEquals($providersParams[$key]['name'], $response['body']['data']['messagingUpdate' . $key . 'Provider']['name']); + } + + $response = $this->client->call(Client::METHOD_POST, '/graphql', [ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + 'x-appwrite-key' => $this->getProject()['apiKey'], + ], [ + 'query' => $this->getQuery('update_mailgun_provider'), + 'variables' => [ + 'id' => $providers[1]['_id'], + 'name' => 'Mailgun2', + 'apiKey' => 'my-apikey', + 'domain' => 'my-domain', + 'isEuRegion' => true, + 'enabled' => false, + ] + ]); + $providers[1] = $response['body']['data']['messagingUpdateMailgunProvider']; + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertEquals('Mailgun2', $response['body']['data']['messagingUpdateMailgunProvider']['name']); + $this->assertEquals(false, $response['body']['data']['messagingUpdateMailgunProvider']['enabled']); + return $providers; + } + + /** + * @depends testUpdateProviders + */ + public function testListProviders(array $providers) + { + $query = $this->getQuery(self::$LIST_PROVIDERS); + $graphQLPayload = [ + 'query' => $query, + ]; + $response = $this->client->call(Client::METHOD_POST, '/graphql', [ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + 'x-appwrite-key' => $this->getProject()['apiKey'], + ], $graphQLPayload); + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertEquals(\count($providers), \count($response['body']['data']['messagingListProviders']['providers'])); + } + + /** + * @depends testUpdateProviders + */ + public function testGetProvider(array $providers) + { + $query = $this->getQuery(self::$GET_PROVIDER); + $graphQLPayload = [ + 'query' => $query, + 'variables' => [ + 'id' => $providers[0]['_id'], + ] + ]; + $response = $this->client->call(Client::METHOD_POST, '/graphql', [ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + 'x-appwrite-key' => $this->getProject()['apiKey'], + ], $graphQLPayload); + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertEquals($providers[0]['name'], $response['body']['data']['messagingGetProvider']['name']); + } + + /** + * @depends testUpdateProviders + */ + public function testDeleteProvider(array $providers) + { + foreach ($providers as $provider) { + $query = $this->getQuery(self::$DELETE_PROVIDER); + $graphQLPayload = [ + 'query' => $query, + 'variables' => [ + 'id' => $provider['_id'], + ] + ]; + $response = $this->client->call(Client::METHOD_POST, '/graphql', [ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + 'x-appwrite-key' => $this->getProject()['apiKey'], + ], $graphQLPayload); + $this->assertEquals(204, $response['headers']['status-code']); + } + } +} diff --git a/tests/e2e/Services/Messaging/MessagingBase.php b/tests/e2e/Services/Messaging/MessagingBase.php index e9225b93d6..3282330d86 100644 --- a/tests/e2e/Services/Messaging/MessagingBase.php +++ b/tests/e2e/Services/Messaging/MessagingBase.php @@ -76,9 +76,9 @@ trait MessagingBase 'x-appwrite-project' => $this->getProject()['$id'], 'x-appwrite-key' => $this->getProject()['apiKey'], ]), $providersParams[$key]); - \array_push($providers, $response['body']); $this->assertEquals(201, $response['headers']['status-code']); $this->assertEquals($providersParams[$key]['name'], $response['body']['name']); + \array_push($providers, $response['body']); } return $providers; @@ -143,9 +143,9 @@ trait MessagingBase 'x-appwrite-project' => $this->getProject()['$id'], 'x-appwrite-key' => $this->getProject()['apiKey'], ], $providersParams[$key]); - $providers[$index] = $response['body']; $this->assertEquals(200, $response['headers']['status-code']); $this->assertEquals($providersParams[$key]['name'], $response['body']['name']); + $providers[$index] = $response['body']; } $response = $this->client->call(Client::METHOD_PATCH, '/messaging/providers/mailgun/' . $providers[1]['$id'], [ @@ -159,10 +159,10 @@ trait MessagingBase 'isEuRegion' => true, 'enabled' => false, ]); - $providers[1] = $response['body']; $this->assertEquals(200, $response['headers']['status-code']); $this->assertEquals('Mailgun2', $response['body']['name']); $this->assertEquals(false, $response['body']['enabled']); + $providers[1] = $response['body']; return $providers; }