2021-03-02 22:56:18 +13:00
< ? php
namespace Tests\E2E\Services\Realtime ;
2021-12-07 01:03:12 +13:00
use CURLFile ;
use Tests\E2E\Client ;
2021-03-02 22:56:18 +13:00
use Tests\E2E\Scopes\Scope ;
use Tests\E2E\Scopes\ProjectCustom ;
use Tests\E2E\Scopes\SideClient ;
2022-02-22 01:31:39 +13:00
use Utopia\CLI\Console ;
2021-12-07 01:03:12 +13:00
use WebSocket\ConnectionException ;
2021-03-02 22:56:18 +13:00
class RealtimeCustomClientTest extends Scope
{
use RealtimeBase ;
use ProjectCustom ;
use SideClient ;
2021-12-07 01:03:12 +13:00
public function testChannelParsing ()
{
$user = $this -> getUser ();
$userId = $user [ '$id' ] ? ? '' ;
$session = $user [ 'session' ] ? ? '' ;
$headers = [
'origin' => 'http://localhost' ,
2022-04-19 04:21:45 +12:00
'cookie' => 'a_session_' . $this -> getProject ()[ '$id' ] . '=' . $session
2021-12-07 01:03:12 +13:00
];
$client = $this -> getWebsocket ([ 'documents' ], $headers );
$response = json_decode ( $client -> receive (), true );
$this -> assertArrayHasKey ( 'type' , $response );
$this -> assertArrayHasKey ( 'data' , $response );
$this -> assertEquals ( 'connected' , $response [ 'type' ]);
$this -> assertNotEmpty ( $response [ 'data' ]);
$this -> assertNotEmpty ( $response [ 'data' ][ 'user' ]);
$this -> assertCount ( 1 , $response [ 'data' ][ 'channels' ]);
$this -> assertContains ( 'documents' , $response [ 'data' ][ 'channels' ]);
$this -> assertEquals ( $userId , $response [ 'data' ][ 'user' ][ '$id' ]);
$client -> close ();
$client = $this -> getWebsocket ([ 'account' ], $headers );
$response = json_decode ( $client -> receive (), true );
$this -> assertArrayHasKey ( 'type' , $response );
$this -> assertArrayHasKey ( 'data' , $response );
$this -> assertEquals ( 'connected' , $response [ 'type' ]);
$this -> assertNotEmpty ( $response [ 'data' ]);
$this -> assertNotEmpty ( $response [ 'data' ][ 'user' ]);
$this -> assertCount ( 2 , $response [ 'data' ][ 'channels' ]);
$this -> assertContains ( 'account' , $response [ 'data' ][ 'channels' ]);
$this -> assertContains ( 'account.' . $userId , $response [ 'data' ][ 'channels' ]);
$this -> assertEquals ( $userId , $response [ 'data' ][ 'user' ][ '$id' ]);
$client -> close ();
$client = $this -> getWebsocket ([ 'account' , 'documents' , 'account.123' ], $headers );
$response = json_decode ( $client -> receive (), true );
$this -> assertArrayHasKey ( 'type' , $response );
$this -> assertArrayHasKey ( 'data' , $response );
$this -> assertEquals ( 'connected' , $response [ 'type' ]);
$this -> assertNotEmpty ( $response [ 'data' ]);
$this -> assertNotEmpty ( $response [ 'data' ][ 'user' ]);
$this -> assertCount ( 3 , $response [ 'data' ][ 'channels' ]);
$this -> assertContains ( 'documents' , $response [ 'data' ][ 'channels' ]);
$this -> assertContains ( 'account' , $response [ 'data' ][ 'channels' ]);
$this -> assertContains ( 'account.' . $userId , $response [ 'data' ][ 'channels' ]);
$this -> assertEquals ( $userId , $response [ 'data' ][ 'user' ][ '$id' ]);
$client -> close ();
$client = $this -> getWebsocket ([
'account' ,
'files' ,
'files.1' ,
'collections' ,
'collections.1.documents' ,
'collections.2.documents' ,
'documents' ,
2022-02-10 07:47:46 +13:00
'collections.1.documents.1' ,
'collections.2.documents.2' ,
2021-12-07 01:03:12 +13:00
], $headers );
$response = json_decode ( $client -> receive (), true );
$this -> assertArrayHasKey ( 'type' , $response );
$this -> assertArrayHasKey ( 'data' , $response );
$this -> assertEquals ( 'connected' , $response [ 'type' ]);
$this -> assertNotEmpty ( $response [ 'data' ]);
$this -> assertNotEmpty ( $response [ 'data' ][ 'user' ]);
2021-12-17 07:12:06 +13:00
$this -> assertCount ( 10 , $response [ 'data' ][ 'channels' ]);
2021-12-07 01:03:12 +13:00
$this -> assertContains ( 'account' , $response [ 'data' ][ 'channels' ]);
$this -> assertContains ( 'account.' . $userId , $response [ 'data' ][ 'channels' ]);
$this -> assertContains ( 'files' , $response [ 'data' ][ 'channels' ]);
$this -> assertContains ( 'files.1' , $response [ 'data' ][ 'channels' ]);
$this -> assertContains ( 'collections' , $response [ 'data' ][ 'channels' ]);
$this -> assertContains ( 'collections.1.documents' , $response [ 'data' ][ 'channels' ]);
$this -> assertContains ( 'collections.2.documents' , $response [ 'data' ][ 'channels' ]);
$this -> assertContains ( 'documents' , $response [ 'data' ][ 'channels' ]);
2022-02-10 07:47:46 +13:00
$this -> assertContains ( 'collections.1.documents.1' , $response [ 'data' ][ 'channels' ]);
$this -> assertContains ( 'collections.2.documents.2' , $response [ 'data' ][ 'channels' ]);
2021-12-07 01:03:12 +13:00
$this -> assertEquals ( $userId , $response [ 'data' ][ 'user' ][ '$id' ]);
$client -> close ();
}
public function testManualAuthentication ()
{
$user = $this -> getUser ();
$userId = $user [ '$id' ] ? ? '' ;
$session = $user [ 'session' ] ? ? '' ;
/**
* Test for SUCCESS
*/
$client = $this -> getWebsocket ([ 'account' ], [
'origin' => 'http://localhost'
]);
$response = json_decode ( $client -> receive (), true );
$this -> assertArrayHasKey ( 'type' , $response );
$this -> assertArrayHasKey ( 'data' , $response );
$this -> assertEquals ( 'connected' , $response [ 'type' ]);
$this -> assertNotEmpty ( $response [ 'data' ]);
$this -> assertCount ( 1 , $response [ 'data' ][ 'channels' ]);
$this -> assertContains ( 'account' , $response [ 'data' ][ 'channels' ]);
$client -> send ( \json_encode ([
'type' => 'authentication' ,
'data' => [
'session' => $session
]
]));
$response = json_decode ( $client -> receive (), true );
$this -> assertArrayHasKey ( 'type' , $response );
$this -> assertArrayHasKey ( 'data' , $response );
$this -> assertEquals ( 'response' , $response [ 'type' ]);
$this -> assertNotEmpty ( $response [ 'data' ]);
$this -> assertEquals ( 'authentication' , $response [ 'data' ][ 'to' ]);
$this -> assertTrue ( $response [ 'data' ][ 'success' ]);
$this -> assertNotEmpty ( $response [ 'data' ][ 'user' ]);
$this -> assertEquals ( $userId , $response [ 'data' ][ 'user' ][ '$id' ]);
/**
* Test for FAILURE
*/
$client -> send ( \json_encode ([
'type' => 'authentication' ,
'data' => [
'session' => 'invalid_session'
]
]));
$response = json_decode ( $client -> receive (), true );
$this -> assertArrayHasKey ( 'type' , $response );
$this -> assertArrayHasKey ( 'data' , $response );
$this -> assertEquals ( 'error' , $response [ 'type' ]);
$this -> assertNotEmpty ( $response [ 'data' ]);
$this -> assertEquals ( 1003 , $response [ 'data' ][ 'code' ]);
$this -> assertEquals ( 'Session is not valid.' , $response [ 'data' ][ 'message' ]);
$client -> send ( \json_encode ([
'type' => 'authentication' ,
'data' => []
]));
$response = json_decode ( $client -> receive (), true );
$this -> assertArrayHasKey ( 'type' , $response );
$this -> assertArrayHasKey ( 'data' , $response );
$this -> assertEquals ( 'error' , $response [ 'type' ]);
$this -> assertNotEmpty ( $response [ 'data' ]);
$this -> assertEquals ( 1003 , $response [ 'data' ][ 'code' ]);
$this -> assertEquals ( 'Payload is not valid.' , $response [ 'data' ][ 'message' ]);
$client -> send ( \json_encode ([
'type' => 'unknown' ,
'data' => [
'session' => 'invalid_session'
]
]));
$response = json_decode ( $client -> receive (), true );
$this -> assertArrayHasKey ( 'type' , $response );
$this -> assertArrayHasKey ( 'data' , $response );
$this -> assertEquals ( 'error' , $response [ 'type' ]);
$this -> assertNotEmpty ( $response [ 'data' ]);
$this -> assertEquals ( 1003 , $response [ 'data' ][ 'code' ]);
$this -> assertEquals ( 'Message type is not valid.' , $response [ 'data' ][ 'message' ]);
$client -> send ( \json_encode ([
'test' => '123' ,
]));
$response = json_decode ( $client -> receive (), true );
$this -> assertArrayHasKey ( 'type' , $response );
$this -> assertArrayHasKey ( 'data' , $response );
$this -> assertEquals ( 'error' , $response [ 'type' ]);
$this -> assertNotEmpty ( $response [ 'data' ]);
$this -> assertEquals ( 1003 , $response [ 'data' ][ 'code' ]);
$this -> assertEquals ( 'Message format is not valid.' , $response [ 'data' ][ 'message' ]);
$client -> close ();
}
public function testConnectionPlatform ()
{
/**
* Test for FAILURE
*/
$client = $this -> getWebsocket ([ 'documents' ], [ 'origin' => 'http://appwrite.unknown' ]);
$payload = json_decode ( $client -> receive (), true );
$this -> assertArrayHasKey ( 'type' , $payload );
$this -> assertArrayHasKey ( 'data' , $payload );
$this -> assertEquals ( 'error' , $payload [ 'type' ]);
$this -> assertEquals ( 1008 , $payload [ 'data' ][ 'code' ]);
$this -> assertEquals ( 'Invalid Origin. Register your new client (appwrite.unknown) as a new Web platform on your project console dashboard' , $payload [ 'data' ][ 'message' ]);
2022-03-02 08:52:29 +13:00
\usleep ( 250000 ); // 250ms
2021-12-07 01:03:12 +13:00
$this -> expectException ( ConnectionException :: class ); // Check if server disconnnected client
$client -> close ();
}
public function testChannelAccount ()
{
$user = $this -> getUser ();
$userId = $user [ '$id' ] ? ? '' ;
$session = $user [ 'session' ] ? ? '' ;
$projectId = $this -> getProject ()[ '$id' ];
$client = $this -> getWebsocket ([ 'account' ], [
'origin' => 'http://localhost' ,
2022-04-19 04:21:45 +12:00
'cookie' => 'a_session_' . $projectId . '=' . $session
2021-12-07 01:03:12 +13:00
]);
$response = json_decode ( $client -> receive (), true );
$this -> assertArrayHasKey ( 'type' , $response );
$this -> assertArrayHasKey ( 'data' , $response );
$this -> assertEquals ( 'connected' , $response [ 'type' ]);
$this -> assertNotEmpty ( $response [ 'data' ]);
$this -> assertCount ( 2 , $response [ 'data' ][ 'channels' ]);
$this -> assertContains ( 'account' , $response [ 'data' ][ 'channels' ]);
$this -> assertContains ( 'account.' . $userId , $response [ 'data' ][ 'channels' ]);
$this -> assertNotEmpty ( $response [ 'data' ][ 'user' ]);
$this -> assertEquals ( $userId , $response [ 'data' ][ 'user' ][ '$id' ]);
/**
* Test Account Name Event
*/
$name = " Torsten Dittmann " ;
$this -> client -> call ( Client :: METHOD_PATCH , '/account/name' , array_merge ([
'origin' => 'http://localhost' ,
'content-type' => 'application/json' ,
'x-appwrite-project' => $projectId ,
'cookie' => 'a_session_' . $projectId . '=' . $session ,
]), [
'name' => $name
]);
$response = json_decode ( $client -> receive (), true );
$this -> assertArrayHasKey ( 'type' , $response );
$this -> assertArrayHasKey ( 'data' , $response );
$this -> assertEquals ( 'event' , $response [ 'type' ]);
$this -> assertNotEmpty ( $response [ 'data' ]);
$this -> assertCount ( 2 , $response [ 'data' ][ 'channels' ]);
$this -> assertArrayHasKey ( 'timestamp' , $response [ 'data' ]);
$this -> assertContains ( 'account' , $response [ 'data' ][ 'channels' ]);
$this -> assertContains ( 'account.' . $userId , $response [ 'data' ][ 'channels' ]);
2022-04-19 04:21:45 +12:00
$this -> assertContains ( " users. { $userId } .update.name " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " users. { $userId } .update " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " users. { $userId } " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " users.*.update.name " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " users.*.update " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " users.* " , $response [ 'data' ][ 'events' ]);
2021-12-07 01:03:12 +13:00
$this -> assertNotEmpty ( $response [ 'data' ][ 'payload' ]);
$this -> assertEquals ( $name , $response [ 'data' ][ 'payload' ][ 'name' ]);
/**
* Test Account Password Event
*/
$this -> client -> call ( Client :: METHOD_PATCH , '/account/password' , array_merge ([
'origin' => 'http://localhost' ,
'content-type' => 'application/json' ,
'x-appwrite-project' => $projectId ,
2022-04-19 04:21:45 +12:00
'cookie' => 'a_session_' . $projectId . '=' . $session ,
2021-12-07 01:03:12 +13:00
]), [
'password' => 'new-password' ,
'oldPassword' => 'password' ,
]);
$response = json_decode ( $client -> receive (), true );
$this -> assertArrayHasKey ( 'type' , $response );
$this -> assertArrayHasKey ( 'data' , $response );
$this -> assertEquals ( 'event' , $response [ 'type' ]);
$this -> assertNotEmpty ( $response [ 'data' ]);
$this -> assertCount ( 2 , $response [ 'data' ][ 'channels' ]);
$this -> assertArrayHasKey ( 'timestamp' , $response [ 'data' ]);
$this -> assertContains ( 'account' , $response [ 'data' ][ 'channels' ]);
$this -> assertContains ( 'account.' . $userId , $response [ 'data' ][ 'channels' ]);
2022-04-19 04:21:45 +12:00
$this -> assertContains ( " users. { $userId } .update.password " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " users. { $userId } .update " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " users. { $userId } " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " users.*.update.password " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " users.*.update " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " users.* " , $response [ 'data' ][ 'events' ]);
2021-12-07 01:03:12 +13:00
$this -> assertNotEmpty ( $response [ 'data' ][ 'payload' ]);
$this -> assertEquals ( $name , $response [ 'data' ][ 'payload' ][ 'name' ]);
/**
* Test Account Email Update
*/
$this -> client -> call ( Client :: METHOD_PATCH , '/account/email' , array_merge ([
'origin' => 'http://localhost' ,
'content-type' => 'application/json' ,
'x-appwrite-project' => $projectId ,
2022-04-19 04:21:45 +12:00
'cookie' => 'a_session_' . $projectId . '=' . $session ,
2021-12-07 01:03:12 +13:00
]), [
'email' => 'torsten@appwrite.io' ,
'password' => 'new-password' ,
]);
$response = json_decode ( $client -> receive (), true );
$this -> assertArrayHasKey ( 'type' , $response );
$this -> assertArrayHasKey ( 'data' , $response );
$this -> assertEquals ( 'event' , $response [ 'type' ]);
$this -> assertNotEmpty ( $response [ 'data' ]);
$this -> assertCount ( 2 , $response [ 'data' ][ 'channels' ]);
$this -> assertArrayHasKey ( 'timestamp' , $response [ 'data' ]);
$this -> assertContains ( 'account' , $response [ 'data' ][ 'channels' ]);
$this -> assertContains ( 'account.' . $userId , $response [ 'data' ][ 'channels' ]);
2022-04-19 04:21:45 +12:00
$this -> assertContains ( " users. { $userId } .update.email " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " users. { $userId } .update " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " users. { $userId } " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " users.*.update.email " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " users.*.update " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " users.* " , $response [ 'data' ][ 'events' ]);
2021-12-07 01:03:12 +13:00
$this -> assertNotEmpty ( $response [ 'data' ][ 'payload' ]);
$this -> assertEquals ( 'torsten@appwrite.io' , $response [ 'data' ][ 'payload' ][ 'email' ]);
/**
* Test Account Verification Create
*/
2022-04-14 00:39:31 +12:00
$verification = $this -> client -> call ( Client :: METHOD_POST , '/account/verification' , array_merge ([
2021-12-07 01:03:12 +13:00
'origin' => 'http://localhost' ,
'content-type' => 'application/json' ,
'x-appwrite-project' => $projectId ,
2022-04-19 04:21:45 +12:00
'cookie' => 'a_session_' . $projectId . '=' . $session ,
2021-12-07 01:03:12 +13:00
]), [
'url' => 'http://localhost/verification' ,
]);
2022-04-19 04:21:45 +12:00
$verificationId = $verification [ 'body' ][ '$id' ];
2021-12-07 01:03:12 +13:00
$response = json_decode ( $client -> receive (), true );
$this -> assertArrayHasKey ( 'type' , $response );
$this -> assertArrayHasKey ( 'data' , $response );
$this -> assertEquals ( 'event' , $response [ 'type' ]);
$this -> assertNotEmpty ( $response [ 'data' ]);
$this -> assertCount ( 2 , $response [ 'data' ][ 'channels' ]);
$this -> assertArrayHasKey ( 'timestamp' , $response [ 'data' ]);
$this -> assertContains ( 'account' , $response [ 'data' ][ 'channels' ]);
$this -> assertContains ( 'account.' . $userId , $response [ 'data' ][ 'channels' ]);
2022-04-19 04:21:45 +12:00
$this -> assertContains ( " users. { $userId } .verification. { $verificationId } .create " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " users. { $userId } .verification. { $verificationId } " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " users. { $userId } .verification.*.create " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " users. { $userId } .verification.* " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " users. { $userId } " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " users.*.verification. { $verificationId } .create " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " users.*.verification. { $verificationId } " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " users.*.verification.*.create " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " users.*.verification.* " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " users.* " , $response [ 'data' ][ 'events' ]);
2021-12-07 01:03:12 +13:00
$lastEmail = $this -> getLastEmail ();
$verification = substr ( $lastEmail [ 'text' ], strpos ( $lastEmail [ 'text' ], '&secret=' , 0 ) + 8 , 256 );
/**
* Test Account Verification Complete
*/
2022-04-14 00:39:31 +12:00
$verification = $this -> client -> call ( Client :: METHOD_PUT , '/account/verification' , array_merge ([
2021-12-07 01:03:12 +13:00
'origin' => 'http://localhost' ,
'content-type' => 'application/json' ,
'x-appwrite-project' => $projectId ,
2022-04-19 04:21:45 +12:00
'cookie' => 'a_session_' . $projectId . '=' . $session ,
2021-12-07 01:03:12 +13:00
]), [
'userId' => $userId ,
'secret' => $verification ,
]);
$response = json_decode ( $client -> receive (), true );
$this -> assertArrayHasKey ( 'type' , $response );
$this -> assertArrayHasKey ( 'data' , $response );
$this -> assertEquals ( 'event' , $response [ 'type' ]);
$this -> assertNotEmpty ( $response [ 'data' ]);
$this -> assertCount ( 2 , $response [ 'data' ][ 'channels' ]);
$this -> assertArrayHasKey ( 'timestamp' , $response [ 'data' ]);
$this -> assertContains ( 'account' , $response [ 'data' ][ 'channels' ]);
$this -> assertContains ( 'account.' . $userId , $response [ 'data' ][ 'channels' ]);
2022-04-19 04:21:45 +12:00
$this -> assertContains ( " users. { $userId } .verification. { $verificationId } .update " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " users. { $userId } .verification. { $verificationId } " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " users. { $userId } .verification.*.update " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " users. { $userId } .verification.* " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " users. { $userId } " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " users.*.verification. { $verificationId } .update " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " users.*.verification. { $verificationId } " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " users.*.verification.*.update " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " users.*.verification.* " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " users.* " , $response [ 'data' ][ 'events' ]);
2021-12-07 01:03:12 +13:00
/**
* Test Acoount Prefs Update
*/
$this -> client -> call ( Client :: METHOD_PATCH , '/account/prefs' , array_merge ([
'origin' => 'http://localhost' ,
'content-type' => 'application/json' ,
'x-appwrite-project' => $projectId ,
2022-04-19 04:21:45 +12:00
'cookie' => 'a_session_' . $projectId . '=' . $session ,
2021-12-07 01:03:12 +13:00
]), [
'prefs' => [
'prefKey1' => 'prefValue1' ,
'prefKey2' => 'prefValue2' ,
]
]);
$response = json_decode ( $client -> receive (), true );
$this -> assertArrayHasKey ( 'type' , $response );
$this -> assertArrayHasKey ( 'data' , $response );
$this -> assertEquals ( 'event' , $response [ 'type' ]);
$this -> assertNotEmpty ( $response [ 'data' ]);
$this -> assertCount ( 2 , $response [ 'data' ][ 'channels' ]);
$this -> assertArrayHasKey ( 'timestamp' , $response [ 'data' ]);
$this -> assertContains ( 'account' , $response [ 'data' ][ 'channels' ]);
$this -> assertContains ( 'account.' . $userId , $response [ 'data' ][ 'channels' ]);
2022-04-19 04:21:45 +12:00
$this -> assertContains ( " users. { $userId } .update.prefs " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " users. { $userId } .update " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " users. { $userId } " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " users.*.update.prefs " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " users.*.update " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " users.* " , $response [ 'data' ][ 'events' ]);
2021-12-07 01:03:12 +13:00
$this -> assertNotEmpty ( $response [ 'data' ][ 'payload' ]);
/**
* Test Account Session Create
*/
2022-06-14 20:17:50 +12:00
$response = $this -> client -> call ( Client :: METHOD_POST , '/account/sessions/email' , array_merge ([
2021-12-07 01:03:12 +13:00
'origin' => 'http://localhost' ,
'content-type' => 'application/json' ,
'x-appwrite-project' => $projectId ,
]), [
'email' => 'torsten@appwrite.io' ,
'password' => 'new-password' ,
]);
2022-04-19 04:21:45 +12:00
$sessionNew = $this -> client -> parseCookie (( string ) $response [ 'headers' ][ 'set-cookie' ])[ 'a_session_' . $projectId ];
2021-12-07 01:03:12 +13:00
$sessionNewId = $response [ 'body' ][ '$id' ];
$response = json_decode ( $client -> receive (), true );
$this -> assertArrayHasKey ( 'type' , $response );
$this -> assertArrayHasKey ( 'data' , $response );
$this -> assertEquals ( 'event' , $response [ 'type' ]);
$this -> assertNotEmpty ( $response [ 'data' ]);
$this -> assertCount ( 2 , $response [ 'data' ][ 'channels' ]);
$this -> assertArrayHasKey ( 'timestamp' , $response [ 'data' ]);
$this -> assertContains ( 'account' , $response [ 'data' ][ 'channels' ]);
$this -> assertContains ( 'account.' . $userId , $response [ 'data' ][ 'channels' ]);
2022-04-19 04:21:45 +12:00
$this -> assertContains ( " users. { $userId } .sessions. { $sessionNewId } .create " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " users. { $userId } .sessions. { $sessionNewId } " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " users. { $userId } .sessions.*.create " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " users. { $userId } .sessions.* " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " users. { $userId } " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " users.*.sessions. { $sessionNewId } .create " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " users.*.sessions. { $sessionNewId } " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " users.*.sessions.*.create " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " users.*.sessions.* " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " users.* " , $response [ 'data' ][ 'events' ]);
2021-12-07 01:03:12 +13:00
$this -> assertNotEmpty ( $response [ 'data' ][ 'payload' ]);
/**
* Test Account Session Delete
*/
2022-04-19 04:21:45 +12:00
$this -> client -> call ( Client :: METHOD_DELETE , '/account/sessions/' . $sessionNewId , array_merge ([
2021-12-07 01:03:12 +13:00
'origin' => 'http://localhost' ,
'content-type' => 'application/json' ,
'x-appwrite-project' => $projectId ,
2022-04-19 04:21:45 +12:00
'cookie' => 'a_session_' . $projectId . '=' . $sessionNew ,
2021-12-07 01:03:12 +13:00
]));
$response = json_decode ( $client -> receive (), true );
$this -> assertArrayHasKey ( 'type' , $response );
$this -> assertArrayHasKey ( 'data' , $response );
$this -> assertEquals ( 'event' , $response [ 'type' ]);
$this -> assertNotEmpty ( $response [ 'data' ]);
$this -> assertCount ( 2 , $response [ 'data' ][ 'channels' ]);
$this -> assertArrayHasKey ( 'timestamp' , $response [ 'data' ]);
$this -> assertContains ( 'account' , $response [ 'data' ][ 'channels' ]);
$this -> assertContains ( 'account.' . $userId , $response [ 'data' ][ 'channels' ]);
2022-04-19 04:21:45 +12:00
$this -> assertContains ( " users. { $userId } .sessions. { $sessionNewId } .delete " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " users. { $userId } .sessions. { $sessionNewId } " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " users. { $userId } .sessions.*.delete " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " users. { $userId } .sessions.* " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " users. { $userId } " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " users.*.sessions. { $sessionNewId } .delete " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " users.*.sessions. { $sessionNewId } " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " users.*.sessions.*.delete " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " users.*.sessions.* " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " users.* " , $response [ 'data' ][ 'events' ]);
2021-12-07 01:03:12 +13:00
$this -> assertNotEmpty ( $response [ 'data' ][ 'payload' ]);
/**
* Test Account Create Recovery
*/
2022-04-14 00:39:31 +12:00
$recovery = $this -> client -> call ( Client :: METHOD_POST , '/account/recovery' , array_merge ([
2021-12-07 01:03:12 +13:00
'origin' => 'http://localhost' ,
'content-type' => 'application/json' ,
'x-appwrite-project' => $projectId ,
]), [
'email' => 'torsten@appwrite.io' ,
'url' => 'http://localhost/recovery' ,
]);
2022-04-14 00:39:31 +12:00
$recoveryId = $recovery [ 'body' ][ '$id' ];
2021-12-07 01:03:12 +13:00
$response = json_decode ( $client -> receive (), true );
$lastEmail = $this -> getLastEmail ();
$recovery = substr ( $lastEmail [ 'text' ], strpos ( $lastEmail [ 'text' ], '&secret=' , 0 ) + 8 , 256 );
$this -> assertArrayHasKey ( 'type' , $response );
$this -> assertArrayHasKey ( 'data' , $response );
$this -> assertEquals ( 'event' , $response [ 'type' ]);
$this -> assertNotEmpty ( $response [ 'data' ]);
$this -> assertCount ( 2 , $response [ 'data' ][ 'channels' ]);
$this -> assertArrayHasKey ( 'timestamp' , $response [ 'data' ]);
$this -> assertContains ( 'account' , $response [ 'data' ][ 'channels' ]);
$this -> assertContains ( 'account.' . $userId , $response [ 'data' ][ 'channels' ]);
2022-04-19 04:21:45 +12:00
$this -> assertContains ( " users. { $userId } .recovery. { $recoveryId } .create " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " users. { $userId } .recovery. { $recoveryId } " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " users. { $userId } .recovery.*.create " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " users. { $userId } .recovery.* " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " users. { $userId } " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " users.*.recovery. { $recoveryId } .create " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " users.*.recovery. { $recoveryId } " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " users.*.recovery.*.create " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " users.*.recovery.* " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " users.* " , $response [ 'data' ][ 'events' ]);
2021-12-07 01:03:12 +13:00
$this -> assertNotEmpty ( $response [ 'data' ][ 'payload' ]);
$response = $this -> client -> call ( Client :: METHOD_PUT , '/account/recovery' , array_merge ([
'origin' => 'http://localhost' ,
'content-type' => 'application/json' ,
'x-appwrite-project' => $projectId ,
]), [
'userId' => $userId ,
'secret' => $recovery ,
'password' => 'test-recovery' ,
'passwordAgain' => 'test-recovery' ,
]);
$response = json_decode ( $client -> receive (), true );
$this -> assertArrayHasKey ( 'type' , $response );
$this -> assertArrayHasKey ( 'data' , $response );
$this -> assertEquals ( 'event' , $response [ 'type' ]);
$this -> assertNotEmpty ( $response [ 'data' ]);
$this -> assertCount ( 2 , $response [ 'data' ][ 'channels' ]);
$this -> assertArrayHasKey ( 'timestamp' , $response [ 'data' ]);
$this -> assertContains ( 'account' , $response [ 'data' ][ 'channels' ]);
$this -> assertContains ( 'account.' . $userId , $response [ 'data' ][ 'channels' ]);
2022-04-19 04:21:45 +12:00
$this -> assertContains ( " users. { $userId } .recovery. { $recoveryId } .update " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " users. { $userId } .recovery. { $recoveryId } " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " users. { $userId } .recovery.*.update " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " users. { $userId } .recovery.* " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " users. { $userId } " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " users.*.recovery. { $recoveryId } .update " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " users.*.recovery. { $recoveryId } " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " users.*.recovery.*.update " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " users.*.recovery.* " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " users.* " , $response [ 'data' ][ 'events' ]);
2021-12-07 01:03:12 +13:00
$this -> assertNotEmpty ( $response [ 'data' ][ 'payload' ]);
$client -> close ();
}
public function testChannelDatabase ()
{
$user = $this -> getUser ();
$session = $user [ 'session' ] ? ? '' ;
$projectId = $this -> getProject ()[ '$id' ];
$client = $this -> getWebsocket ([ 'documents' , 'collections' ], [
'origin' => 'http://localhost' ,
2022-04-19 04:21:45 +12:00
'cookie' => 'a_session_' . $projectId . '=' . $session
2021-12-07 01:03:12 +13:00
]);
$response = json_decode ( $client -> receive (), true );
$this -> assertArrayHasKey ( 'type' , $response );
$this -> assertArrayHasKey ( 'data' , $response );
$this -> assertEquals ( 'connected' , $response [ 'type' ]);
$this -> assertNotEmpty ( $response [ 'data' ]);
$this -> assertCount ( 2 , $response [ 'data' ][ 'channels' ]);
$this -> assertContains ( 'documents' , $response [ 'data' ][ 'channels' ]);
$this -> assertContains ( 'collections' , $response [ 'data' ][ 'channels' ]);
$this -> assertNotEmpty ( $response [ 'data' ][ 'user' ]);
$this -> assertEquals ( $user [ '$id' ], $response [ 'data' ][ 'user' ][ '$id' ]);
2022-06-22 22:51:49 +12:00
/**
* Test Database Create
*/
$database = $this -> client -> call ( Client :: METHOD_POST , '/databases' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'databaseId' => 'unique()' ,
'name' => 'Actors DB' ,
]);
$databaseId = $database [ 'body' ][ '$id' ];
2021-12-07 01:03:12 +13:00
/**
* Test Collection Create
*/
2022-06-22 22:51:49 +12:00
$actors = $this -> client -> call ( Client :: METHOD_POST , '/databases/' . $databaseId . '/collections' , array_merge ([
2021-12-07 01:03:12 +13:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'collectionId' => 'unique()' ,
'name' => 'Actors' ,
2021-12-17 07:12:06 +13:00
'read' => [],
'write' => [],
'permission' => 'document'
]);
2022-04-19 04:21:45 +12:00
$actorsId = $actors [ 'body' ][ '$id' ];
2021-12-17 07:12:06 +13:00
2022-06-22 22:51:49 +12:00
$name = $this -> client -> call ( Client :: METHOD_POST , '/databases/' . $databaseId . '/collections/' . $actorsId . '/attributes/string' , array_merge ([
2021-12-17 07:12:06 +13:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
2021-12-17 23:41:26 +13:00
'key' => 'name' ,
2021-12-17 07:12:06 +13:00
'size' => 256 ,
'required' => true ,
]);
2022-07-19 01:22:23 +12:00
$this -> assertEquals ( $name [ 'headers' ][ 'status-code' ], 202 );
2021-12-17 07:12:06 +13:00
$this -> assertEquals ( $name [ 'body' ][ 'key' ], 'name' );
$this -> assertEquals ( $name [ 'body' ][ 'type' ], 'string' );
$this -> assertEquals ( $name [ 'body' ][ 'size' ], 256 );
$this -> assertEquals ( $name [ 'body' ][ 'required' ], true );
sleep ( 2 );
/**
* Test Document Create
*/
2022-06-22 22:51:49 +12:00
$document = $this -> client -> call ( Client :: METHOD_POST , '/databases/' . $databaseId . '/collections/' . $actorsId . '/documents' , array_merge ([
2021-12-17 07:12:06 +13:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()), [
'documentId' => 'unique()' ,
'data' => [
'name' => 'Chris Evans'
],
2021-12-07 01:03:12 +13:00
'read' => [ 'role:all' ],
'write' => [ 'role:all' ],
]);
$response = json_decode ( $client -> receive (), true );
2022-04-19 04:21:45 +12:00
$documentId = $document [ 'body' ][ '$id' ];
2021-12-07 01:03:12 +13:00
$this -> assertArrayHasKey ( 'type' , $response );
$this -> assertArrayHasKey ( 'data' , $response );
$this -> assertEquals ( 'event' , $response [ 'type' ]);
$this -> assertNotEmpty ( $response [ 'data' ]);
$this -> assertArrayHasKey ( 'timestamp' , $response [ 'data' ]);
2021-12-17 07:12:06 +13:00
$this -> assertCount ( 3 , $response [ 'data' ][ 'channels' ]);
$this -> assertContains ( 'documents' , $response [ 'data' ][ 'channels' ]);
2022-06-22 22:51:49 +12:00
$this -> assertContains ( 'databases.' . $databaseId . '.collections.' . $actorsId . '.documents.' . $documentId , $response [ 'data' ][ 'channels' ]);
$this -> assertContains ( 'databases.' . $databaseId . '.collections.' . $actorsId . '.documents' , $response [ 'data' ][ 'channels' ]);
$this -> assertContains ( " databases. { $databaseId } .collections. { $actorsId } .documents. { $documentId } .create " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " databases. { $databaseId } .collections. { $actorsId } .documents. { $documentId } " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " databases. { $databaseId } .collections. { $actorsId } .documents.*.create " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " databases. { $databaseId } .collections. { $actorsId } .documents.* " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " databases. { $databaseId } .collections. { $actorsId } " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " databases. { $databaseId } .collections.*.documents. { $documentId } .create " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " databases. { $databaseId } .collections.*.documents. { $documentId } " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " databases. { $databaseId } .collections.*.documents.*.create " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " databases. { $databaseId } .collections.*.documents.* " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " databases. { $databaseId } .collections.* " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " databases. { $databaseId } " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " databases.* " , $response [ 'data' ][ 'events' ]);
2021-12-17 07:12:06 +13:00
$this -> assertNotEmpty ( $response [ 'data' ][ 'payload' ]);
$this -> assertEquals ( $response [ 'data' ][ 'payload' ][ 'name' ], 'Chris Evans' );
/**
* Test Document Update
*/
2022-06-22 22:51:49 +12:00
$document = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $actorsId . '/documents/' . $documentId , array_merge ([
2021-12-17 07:12:06 +13:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()), [
'documentId' => 'unique()' ,
'data' => [
'name' => 'Chris Evans 2'
],
'read' => [ 'role:all' ],
'write' => [ 'role:all' ],
]);
$response = json_decode ( $client -> receive (), true );
$this -> assertArrayHasKey ( 'type' , $response );
$this -> assertArrayHasKey ( 'data' , $response );
$this -> assertEquals ( 'event' , $response [ 'type' ]);
$this -> assertNotEmpty ( $response [ 'data' ]);
$this -> assertArrayHasKey ( 'timestamp' , $response [ 'data' ]);
$this -> assertCount ( 3 , $response [ 'data' ][ 'channels' ]);
$this -> assertContains ( 'documents' , $response [ 'data' ][ 'channels' ]);
2022-06-22 22:51:49 +12:00
$this -> assertContains ( " databases. { $databaseId } .collections. { $actorsId } .documents. { $documentId } " , $response [ 'data' ][ 'channels' ]);
$this -> assertContains ( " databases. { $databaseId } .collections. { $actorsId } .documents " , $response [ 'data' ][ 'channels' ]);
$this -> assertContains ( " databases. { $databaseId } .collections. { $actorsId } .documents. { $documentId } .update " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " databases. { $databaseId } .collections. { $actorsId } .documents. { $documentId } " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " databases. { $databaseId } .collections. { $actorsId } .documents.*.update " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " databases. { $databaseId } .collections. { $actorsId } .documents.* " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " databases. { $databaseId } .collections. { $actorsId } " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " databases. { $databaseId } .collections.*.documents. { $documentId } .update " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " databases. { $databaseId } .collections.*.documents. { $documentId } " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " databases. { $databaseId } .collections.*.documents.*.update " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " databases. { $databaseId } .collections.*.documents.* " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " databases. { $databaseId } .collections.* " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " databases. { $databaseId } " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " databases.* " , $response [ 'data' ][ 'events' ]);
2021-12-17 07:12:06 +13:00
$this -> assertNotEmpty ( $response [ 'data' ][ 'payload' ]);
$this -> assertEquals ( $response [ 'data' ][ 'payload' ][ 'name' ], 'Chris Evans 2' );
/**
* Test Document Delete
*/
2022-06-22 22:51:49 +12:00
$document = $this -> client -> call ( Client :: METHOD_POST , '/databases/' . $databaseId . '/collections/' . $actorsId . '/documents' , array_merge ([
2021-12-17 07:12:06 +13:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()), [
'documentId' => 'unique()' ,
'data' => [
'name' => 'Bradley Cooper'
],
2021-12-07 01:03:12 +13:00
'read' => [ 'role:all' ],
'write' => [ 'role:all' ],
]);
2021-12-17 07:12:06 +13:00
$client -> receive ();
2022-04-19 04:21:45 +12:00
$documentId = $document [ 'body' ][ '$id' ];
2022-06-22 22:51:49 +12:00
$this -> client -> call ( Client :: METHOD_DELETE , '/databases/' . $databaseId . '/collections/' . $actorsId . '/documents/' . $documentId , array_merge ([
2021-12-17 07:12:06 +13:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()));
2021-12-07 01:03:12 +13:00
$response = json_decode ( $client -> receive (), true );
$this -> assertArrayHasKey ( 'type' , $response );
$this -> assertArrayHasKey ( 'data' , $response );
$this -> assertEquals ( 'event' , $response [ 'type' ]);
$this -> assertNotEmpty ( $response [ 'data' ]);
$this -> assertArrayHasKey ( 'timestamp' , $response [ 'data' ]);
2021-12-17 07:12:06 +13:00
$this -> assertCount ( 3 , $response [ 'data' ][ 'channels' ]);
$this -> assertContains ( 'documents' , $response [ 'data' ][ 'channels' ]);
2022-06-22 22:51:49 +12:00
$this -> assertContains ( " databases. { $databaseId } .collections. { $actorsId } .documents. { $documentId } " , $response [ 'data' ][ 'channels' ]);
$this -> assertContains ( " databases. { $databaseId } .collections. { $actorsId } .documents " , $response [ 'data' ][ 'channels' ]);
$this -> assertContains ( " databases. { $databaseId } .collections. { $actorsId } .documents. { $documentId } .delete " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " databases. { $databaseId } .collections. { $actorsId } .documents. { $documentId } " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " databases. { $databaseId } .collections. { $actorsId } .documents.*.delete " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " databases. { $databaseId } .collections. { $actorsId } .documents.* " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " databases. { $databaseId } .collections. { $actorsId } " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " databases. { $databaseId } .collections.*.documents. { $documentId } .delete " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " databases. { $databaseId } .collections.*.documents. { $documentId } " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " databases. { $databaseId } .collections.*.documents.*.delete " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " databases. { $databaseId } .collections.*.documents.* " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " databases. { $databaseId } .collections.* " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " databases. { $databaseId } " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " databases.* " , $response [ 'data' ][ 'events' ]);
2021-12-17 07:12:06 +13:00
$this -> assertNotEmpty ( $response [ 'data' ][ 'payload' ]);
$this -> assertEquals ( $response [ 'data' ][ 'payload' ][ 'name' ], 'Bradley Cooper' );
$client -> close ();
}
public function testChannelDatabaseCollectionPermissions ()
{
$user = $this -> getUser ();
$session = $user [ 'session' ] ? ? '' ;
$projectId = $this -> getProject ()[ '$id' ];
$client = $this -> getWebsocket ([ 'documents' , 'collections' ], [
'origin' => 'http://localhost' ,
2022-04-19 04:21:45 +12:00
'cookie' => 'a_session_' . $projectId . '=' . $session
2021-12-17 07:12:06 +13:00
]);
$response = json_decode ( $client -> receive (), true );
$this -> assertArrayHasKey ( 'type' , $response );
$this -> assertArrayHasKey ( 'data' , $response );
$this -> assertEquals ( 'connected' , $response [ 'type' ]);
$this -> assertNotEmpty ( $response [ 'data' ]);
2021-12-07 01:03:12 +13:00
$this -> assertCount ( 2 , $response [ 'data' ][ 'channels' ]);
2021-12-17 07:12:06 +13:00
$this -> assertContains ( 'documents' , $response [ 'data' ][ 'channels' ]);
2021-12-07 01:03:12 +13:00
$this -> assertContains ( 'collections' , $response [ 'data' ][ 'channels' ]);
2021-12-17 07:12:06 +13:00
$this -> assertNotEmpty ( $response [ 'data' ][ 'user' ]);
$this -> assertEquals ( $user [ '$id' ], $response [ 'data' ][ 'user' ][ '$id' ]);
2022-06-22 22:51:49 +12:00
/**
* Test Database Create
*/
$database = $this -> client -> call ( Client :: METHOD_POST , '/databases' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'databaseId' => 'unique()' ,
'name' => 'Actors DB' ,
]);
$databaseId = $database [ 'body' ][ '$id' ];
2021-12-17 07:12:06 +13:00
/**
* Test Collection Create
*/
2022-06-22 22:51:49 +12:00
$actors = $this -> client -> call ( Client :: METHOD_POST , '/databases/' . $databaseId . '/collections' , array_merge ([
2021-12-17 07:12:06 +13:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'collectionId' => 'unique()' ,
'name' => 'Actors' ,
'read' => [ 'role:all' ],
'write' => [ 'role:all' ],
'permission' => 'collection'
]);
2021-12-07 01:03:12 +13:00
2022-04-19 04:21:45 +12:00
$actorsId = $actors [ 'body' ][ '$id' ];
2021-12-07 01:03:12 +13:00
2022-06-22 22:51:49 +12:00
$name = $this -> client -> call ( Client :: METHOD_POST , '/databases/' . $databaseId . '/collections/' . $actorsId . '/attributes/string' , array_merge ([
2021-12-07 01:03:12 +13:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
2021-12-17 05:10:01 +13:00
'key' => 'name' ,
2021-12-07 01:03:12 +13:00
'size' => 256 ,
'required' => true ,
]);
2022-07-19 01:22:23 +12:00
$this -> assertEquals ( $name [ 'headers' ][ 'status-code' ], 202 );
2021-12-07 01:03:12 +13:00
$this -> assertEquals ( $name [ 'body' ][ 'key' ], 'name' );
$this -> assertEquals ( $name [ 'body' ][ 'type' ], 'string' );
$this -> assertEquals ( $name [ 'body' ][ 'size' ], 256 );
$this -> assertEquals ( $name [ 'body' ][ 'required' ], true );
sleep ( 2 );
/**
* Test Document Create
*/
2022-06-22 22:51:49 +12:00
$document = $this -> client -> call ( Client :: METHOD_POST , '/databases/' . $databaseId . '/collections/' . $actorsId . '/documents' , array_merge ([
2021-12-07 01:03:12 +13:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()), [
'documentId' => 'unique()' ,
'data' => [
'name' => 'Chris Evans'
],
2021-12-17 07:12:06 +13:00
'read' => [],
'write' => [],
2021-12-07 01:03:12 +13:00
]);
2022-04-19 04:21:45 +12:00
$documentId = $document [ 'body' ][ '$id' ];
2021-12-07 01:03:12 +13:00
$response = json_decode ( $client -> receive (), true );
$this -> assertArrayHasKey ( 'type' , $response );
$this -> assertArrayHasKey ( 'data' , $response );
$this -> assertEquals ( 'event' , $response [ 'type' ]);
$this -> assertNotEmpty ( $response [ 'data' ]);
$this -> assertArrayHasKey ( 'timestamp' , $response [ 'data' ]);
$this -> assertCount ( 3 , $response [ 'data' ][ 'channels' ]);
$this -> assertContains ( 'documents' , $response [ 'data' ][ 'channels' ]);
2022-06-22 22:51:49 +12:00
$this -> assertContains ( " databases. { $databaseId } .collections. { $actorsId } .documents. { $documentId } " , $response [ 'data' ][ 'channels' ]);
$this -> assertContains ( " databases. { $databaseId } .collections. { $actorsId } .documents " , $response [ 'data' ][ 'channels' ]);
$this -> assertContains ( " databases. { $databaseId } .collections. { $actorsId } .documents. { $documentId } .create " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " databases. { $databaseId } .collections. { $actorsId } .documents. { $documentId } " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " databases. { $databaseId } .collections. { $actorsId } .documents.*.create " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " databases. { $databaseId } .collections. { $actorsId } .documents.* " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " databases. { $databaseId } .collections. { $actorsId } " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " databases. { $databaseId } .collections.*.documents. { $documentId } .create " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " databases. { $databaseId } .collections.*.documents. { $documentId } " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " databases. { $databaseId } .collections.*.documents.*.create " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " databases. { $databaseId } .collections.*.documents.* " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " databases. { $databaseId } .collections.* " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " databases. { $databaseId } " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " databases.* " , $response [ 'data' ][ 'events' ]);
2021-12-07 01:03:12 +13:00
$this -> assertNotEmpty ( $response [ 'data' ][ 'payload' ]);
$this -> assertEquals ( $response [ 'data' ][ 'payload' ][ 'name' ], 'Chris Evans' );
/**
* Test Document Update
*/
2022-06-22 22:51:49 +12:00
$document = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $actorsId . '/documents/' . $documentId , array_merge ([
2021-12-07 01:03:12 +13:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()), [
'data' => [
'name' => 'Chris Evans 2'
],
2021-12-17 07:12:06 +13:00
'read' => [],
'write' => [],
2021-12-07 01:03:12 +13:00
]);
$response = json_decode ( $client -> receive (), true );
$this -> assertArrayHasKey ( 'type' , $response );
$this -> assertArrayHasKey ( 'data' , $response );
$this -> assertEquals ( 'event' , $response [ 'type' ]);
$this -> assertNotEmpty ( $response [ 'data' ]);
$this -> assertArrayHasKey ( 'timestamp' , $response [ 'data' ]);
$this -> assertCount ( 3 , $response [ 'data' ][ 'channels' ]);
$this -> assertContains ( 'documents' , $response [ 'data' ][ 'channels' ]);
2022-06-22 22:51:49 +12:00
$this -> assertContains ( " databases. { $databaseId } .collections. { $actorsId } .documents. { $documentId } " , $response [ 'data' ][ 'channels' ]);
$this -> assertContains ( " databases. { $databaseId } .collections. { $actorsId } .documents " , $response [ 'data' ][ 'channels' ]);
$this -> assertContains ( " databases. { $databaseId } .collections. { $actorsId } .documents. { $documentId } .update " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " databases. { $databaseId } .collections. { $actorsId } .documents. { $documentId } " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " databases. { $databaseId } .collections. { $actorsId } .documents.*.update " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " databases. { $databaseId } .collections. { $actorsId } .documents.* " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " databases. { $databaseId } .collections. { $actorsId } " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " databases. { $databaseId } .collections.*.documents. { $documentId } .update " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " databases. { $databaseId } .collections.*.documents. { $documentId } " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " databases. { $databaseId } .collections.*.documents.*.update " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " databases. { $databaseId } .collections.*.documents.* " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " databases. { $databaseId } .collections.* " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " databases. { $databaseId } " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " databases.* " , $response [ 'data' ][ 'events' ]);
2021-12-07 01:03:12 +13:00
$this -> assertNotEmpty ( $response [ 'data' ][ 'payload' ]);
$this -> assertEquals ( $response [ 'data' ][ 'payload' ][ 'name' ], 'Chris Evans 2' );
/**
* Test Document Delete
*/
2022-06-22 22:51:49 +12:00
$document = $this -> client -> call ( Client :: METHOD_POST , '/databases/' . $databaseId . '/collections/' . $actorsId . '/documents' , array_merge ([
2021-12-07 01:03:12 +13:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()), [
'documentId' => 'unique()' ,
'data' => [
'name' => 'Bradley Cooper'
],
2021-12-17 07:12:06 +13:00
'read' => [],
'write' => [],
2021-12-07 01:03:12 +13:00
]);
2022-04-19 04:21:45 +12:00
$documentId = $document [ 'body' ][ '$id' ];
2021-12-07 01:03:12 +13:00
$client -> receive ();
2022-06-22 22:51:49 +12:00
$this -> client -> call ( Client :: METHOD_DELETE , '/databases/' . $databaseId . '/collections/' . $actorsId . '/documents/' . $documentId , array_merge ([
2021-12-07 01:03:12 +13:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()));
$response = json_decode ( $client -> receive (), true );
$this -> assertArrayHasKey ( 'type' , $response );
$this -> assertArrayHasKey ( 'data' , $response );
$this -> assertEquals ( 'event' , $response [ 'type' ]);
$this -> assertNotEmpty ( $response [ 'data' ]);
$this -> assertArrayHasKey ( 'timestamp' , $response [ 'data' ]);
$this -> assertCount ( 3 , $response [ 'data' ][ 'channels' ]);
$this -> assertContains ( 'documents' , $response [ 'data' ][ 'channels' ]);
2022-06-22 22:51:49 +12:00
$this -> assertContains ( " databases. { $databaseId } .collections. { $actorsId } .documents. { $documentId } " , $response [ 'data' ][ 'channels' ]);
$this -> assertContains ( " databases. { $databaseId } .collections. { $actorsId } .documents " , $response [ 'data' ][ 'channels' ]);
$this -> assertContains ( " databases. { $databaseId } .collections. { $actorsId } .documents. { $documentId } .delete " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " databases. { $databaseId } .collections. { $actorsId } .documents. { $documentId } " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " databases. { $databaseId } .collections. { $actorsId } .documents.*.delete " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " databases. { $databaseId } .collections. { $actorsId } .documents.* " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " databases. { $databaseId } .collections. { $actorsId } " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " databases. { $databaseId } .collections.*.documents. { $documentId } .delete " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " databases. { $databaseId } .collections.*.documents. { $documentId } " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " databases. { $databaseId } .collections.*.documents.*.delete " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " databases. { $databaseId } .collections.*.documents.* " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " databases. { $databaseId } .collections.* " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " databases. { $databaseId } " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " databases.* " , $response [ 'data' ][ 'events' ]);
2021-12-07 01:03:12 +13:00
$this -> assertNotEmpty ( $response [ 'data' ][ 'payload' ]);
$this -> assertEquals ( $response [ 'data' ][ 'payload' ][ 'name' ], 'Bradley Cooper' );
$client -> close ();
}
public function testChannelFiles ()
{
$user = $this -> getUser ();
$session = $user [ 'session' ] ? ? '' ;
$projectId = $this -> getProject ()[ '$id' ];
$client = $this -> getWebsocket ([ 'files' ], [
'origin' => 'http://localhost' ,
2022-04-19 04:21:45 +12:00
'cookie' => 'a_session_' . $projectId . '=' . $session
2021-12-07 01:03:12 +13:00
]);
$response = json_decode ( $client -> receive (), true );
$this -> assertArrayHasKey ( 'type' , $response );
$this -> assertArrayHasKey ( 'data' , $response );
$this -> assertEquals ( 'connected' , $response [ 'type' ]);
$this -> assertNotEmpty ( $response [ 'data' ]);
$this -> assertCount ( 1 , $response [ 'data' ][ 'channels' ]);
$this -> assertContains ( 'files' , $response [ 'data' ][ 'channels' ]);
$this -> assertNotEmpty ( $response [ 'data' ][ 'user' ]);
$this -> assertEquals ( $user [ '$id' ], $response [ 'data' ][ 'user' ][ '$id' ]);
2021-12-14 21:01:17 +13:00
/**
* Test Bucket Create
*/
$bucket1 = $this -> client -> call ( Client :: METHOD_POST , '/storage/buckets' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'bucketId' => 'unique()' ,
'name' => 'Bucket 1' ,
'read' => [ 'role:all' ],
'write' => [ 'role:all' ],
'permission' => 'bucket'
]);
2022-04-19 04:21:45 +12:00
$bucketId = $bucket1 [ 'body' ][ '$id' ];
2021-12-07 01:03:12 +13:00
/**
* Test File Create
*/
2022-04-19 04:21:45 +12:00
$file = $this -> client -> call ( Client :: METHOD_POST , '/storage/buckets/' . $bucketId . '/files' , array_merge ([
2021-12-07 01:03:12 +13:00
'content-type' => 'multipart/form-data' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()), [
'fileId' => 'unique()' ,
'file' => new CURLFile ( realpath ( __DIR__ . '/../../../resources/logo.png' ), 'image/png' , 'logo.png' ),
'read' => [ 'role:all' ],
'write' => [ 'role:all' ],
]);
2022-04-19 04:21:45 +12:00
$fileId = $file [ 'body' ][ '$id' ];
2021-12-07 01:03:12 +13:00
$response = json_decode ( $client -> receive (), true );
$this -> assertArrayHasKey ( 'type' , $response );
$this -> assertArrayHasKey ( 'data' , $response );
$this -> assertEquals ( 'event' , $response [ 'type' ]);
$this -> assertNotEmpty ( $response [ 'data' ]);
$this -> assertArrayHasKey ( 'timestamp' , $response [ 'data' ]);
2021-12-14 21:01:17 +13:00
$this -> assertCount ( 3 , $response [ 'data' ][ 'channels' ]);
2021-12-07 01:03:12 +13:00
$this -> assertContains ( 'files' , $response [ 'data' ][ 'channels' ]);
2022-04-19 04:21:45 +12:00
$this -> assertContains ( " buckets. { $bucketId } .files. { $fileId } " , $response [ 'data' ][ 'channels' ]);
$this -> assertContains ( " buckets. { $bucketId } .files " , $response [ 'data' ][ 'channels' ]);
$this -> assertContains ( " buckets. { $bucketId } .files. { $fileId } .create " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " buckets. { $bucketId } .files. { $fileId } " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " buckets. { $bucketId } .files.*.create " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " buckets. { $bucketId } .files.* " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " buckets. { $bucketId } " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " buckets.*.files. { $fileId } .create " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " buckets.*.files. { $fileId } " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " buckets.*.files.*.create " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " buckets.*.files.* " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " buckets.* " , $response [ 'data' ][ 'events' ]);
2021-12-07 01:03:12 +13:00
$this -> assertNotEmpty ( $response [ 'data' ][ 'payload' ]);
2022-04-19 04:21:45 +12:00
$fileId = $file [ 'body' ][ '$id' ];
2021-12-07 01:03:12 +13:00
/**
* Test File Update
*/
2022-04-19 04:21:45 +12:00
$this -> client -> call ( Client :: METHOD_PUT , '/storage/buckets/' . $bucketId . '/files/' . $fileId , array_merge ([
2021-12-07 01:03:12 +13:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()), [
'read' => [ 'role:all' ],
'write' => [ 'role:all' ],
]);
$response = json_decode ( $client -> receive (), true );
$this -> assertArrayHasKey ( 'type' , $response );
$this -> assertArrayHasKey ( 'data' , $response );
$this -> assertEquals ( 'event' , $response [ 'type' ]);
$this -> assertNotEmpty ( $response [ 'data' ]);
$this -> assertArrayHasKey ( 'timestamp' , $response [ 'data' ]);
2021-12-14 21:01:17 +13:00
$this -> assertCount ( 3 , $response [ 'data' ][ 'channels' ]);
2021-12-07 01:03:12 +13:00
$this -> assertContains ( 'files' , $response [ 'data' ][ 'channels' ]);
2022-04-19 04:21:45 +12:00
$this -> assertContains ( " buckets. { $bucketId } .files. { $fileId } " , $response [ 'data' ][ 'channels' ]);
$this -> assertContains ( " buckets. { $bucketId } .files " , $response [ 'data' ][ 'channels' ]);
$this -> assertContains ( " buckets. { $bucketId } .files. { $fileId } .update " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " buckets. { $bucketId } .files. { $fileId } " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " buckets. { $bucketId } .files.*.update " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " buckets. { $bucketId } .files.* " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " buckets. { $bucketId } " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " buckets.*.files. { $fileId } .update " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " buckets.*.files. { $fileId } " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " buckets.*.files.*.update " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " buckets.*.files.* " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " buckets.* " , $response [ 'data' ][ 'events' ]);
2021-12-07 01:03:12 +13:00
$this -> assertNotEmpty ( $response [ 'data' ][ 'payload' ]);
/**
* Test File Delete
*/
2022-04-19 04:21:45 +12:00
$this -> client -> call ( Client :: METHOD_DELETE , '/storage/buckets/' . $bucketId . '/files/' . $fileId , array_merge ([
2021-12-07 01:03:12 +13:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()));
$response = json_decode ( $client -> receive (), true );
$this -> assertArrayHasKey ( 'type' , $response );
$this -> assertArrayHasKey ( 'data' , $response );
$this -> assertEquals ( 'event' , $response [ 'type' ]);
$this -> assertNotEmpty ( $response [ 'data' ]);
$this -> assertArrayHasKey ( 'timestamp' , $response [ 'data' ]);
2021-12-14 21:01:17 +13:00
$this -> assertCount ( 3 , $response [ 'data' ][ 'channels' ]);
2021-12-07 01:03:12 +13:00
$this -> assertContains ( 'files' , $response [ 'data' ][ 'channels' ]);
2022-04-19 04:21:45 +12:00
$this -> assertContains ( " buckets. { $bucketId } .files. { $fileId } " , $response [ 'data' ][ 'channels' ]);
$this -> assertContains ( " buckets. { $bucketId } .files " , $response [ 'data' ][ 'channels' ]);
$this -> assertContains ( " buckets. { $bucketId } .files. { $fileId } .delete " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " buckets. { $bucketId } .files. { $fileId } " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " buckets. { $bucketId } .files.*.delete " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " buckets. { $bucketId } .files.* " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " buckets. { $bucketId } " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " buckets.*.files. { $fileId } .delete " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " buckets.*.files. { $fileId } " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " buckets.*.files.*.delete " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " buckets.*.files.* " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " buckets.* " , $response [ 'data' ][ 'events' ]);
2021-12-07 01:03:12 +13:00
$this -> assertNotEmpty ( $response [ 'data' ][ 'payload' ]);
$client -> close ();
}
public function testChannelExecutions ()
{
$user = $this -> getUser ();
$session = $user [ 'session' ] ? ? '' ;
$projectId = $this -> getProject ()[ '$id' ];
$client = $this -> getWebsocket ([ 'executions' ], [
'origin' => 'http://localhost' ,
2022-04-19 04:21:45 +12:00
'cookie' => 'a_session_' . $projectId . '=' . $session
2021-12-07 01:03:12 +13:00
]);
$response = json_decode ( $client -> receive (), true );
$this -> assertArrayHasKey ( 'type' , $response );
$this -> assertArrayHasKey ( 'data' , $response );
$this -> assertEquals ( 'connected' , $response [ 'type' ]);
$this -> assertNotEmpty ( $response [ 'data' ]);
$this -> assertCount ( 1 , $response [ 'data' ][ 'channels' ]);
$this -> assertContains ( 'executions' , $response [ 'data' ][ 'channels' ]);
$this -> assertNotEmpty ( $response [ 'data' ][ 'user' ]);
$this -> assertEquals ( $user [ '$id' ], $response [ 'data' ][ 'user' ][ '$id' ]);
/**
* Test Functions Create
*/
$function = $this -> client -> call ( Client :: METHOD_POST , '/functions' , [
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
], [
'functionId' => 'unique()' ,
'name' => 'Test' ,
'execute' => [ 'role:member' ],
'runtime' => 'php-8.0' ,
'timeout' => 10 ,
]);
$functionId = $function [ 'body' ][ '$id' ] ? ? '' ;
$this -> assertEquals ( $function [ 'headers' ][ 'status-code' ], 201 );
$this -> assertNotEmpty ( $function [ 'body' ][ '$id' ]);
2022-02-22 01:31:39 +13:00
$folder = 'timeout' ;
$stderr = '' ;
2022-04-19 04:21:45 +12:00
$stdout = '' ;
$code = realpath ( __DIR__ . '/../../../resources/functions' ) . " / { $folder } /code.tar.gz " ;
2022-04-14 00:39:31 +12:00
2022-04-19 04:21:45 +12:00
Console :: execute ( 'cd ' . realpath ( __DIR__ . " /../../../resources/functions " ) . " / { $folder } && tar --exclude code.tar.gz -czf code.tar.gz . " , '' , $stdout , $stderr );
$deployment = $this -> client -> call ( Client :: METHOD_POST , '/functions/' . $functionId . '/deployments' , array_merge ([
2021-12-07 01:03:12 +13:00
'content-type' => 'multipart/form-data' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
2022-01-06 22:45:56 +13:00
'entrypoint' => 'index.php' ,
2022-02-22 01:31:39 +13:00
'code' => new CURLFile ( $code , 'application/x-gzip' , basename ( $code ))
2021-12-07 01:03:12 +13:00
]);
2022-01-25 12:46:43 +13:00
$deploymentId = $deployment [ 'body' ][ '$id' ] ? ? '' ;
2021-12-07 01:03:12 +13:00
2022-07-21 00:43:18 +12:00
$this -> assertEquals ( $deployment [ 'headers' ][ 'status-code' ], 202 );
2022-01-25 12:46:43 +13:00
$this -> assertNotEmpty ( $deployment [ 'body' ][ '$id' ]);
2021-12-07 01:03:12 +13:00
2022-01-25 12:46:43 +13:00
// Wait for deployment to be built.
2022-01-06 22:45:56 +13:00
sleep ( 5 );
2022-04-19 04:21:45 +12:00
$response = $this -> client -> call ( Client :: METHOD_PATCH , '/functions/' . $functionId . '/deployments/' . $deploymentId , array_merge ([
2021-12-07 01:03:12 +13:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
2022-02-15 22:16:32 +13:00
]), []);
2021-12-07 01:03:12 +13:00
$this -> assertEquals ( $response [ 'headers' ][ 'status-code' ], 200 );
$this -> assertNotEmpty ( $response [ 'body' ][ '$id' ]);
2022-04-19 04:21:45 +12:00
$execution = $this -> client -> call ( Client :: METHOD_POST , '/functions/' . $functionId . '/executions' , array_merge ([
2021-12-07 01:03:12 +13:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ]
], $this -> getHeaders ()), []);
2022-07-21 01:25:05 +12:00
$this -> assertEquals ( $execution [ 'headers' ][ 'status-code' ], 202 );
2021-12-07 01:03:12 +13:00
$this -> assertNotEmpty ( $execution [ 'body' ][ '$id' ]);
$response = json_decode ( $client -> receive (), true );
$responseUpdate = json_decode ( $client -> receive (), true );
2022-04-19 04:21:45 +12:00
$executionId = $execution [ 'body' ][ '$id' ];
2021-12-07 01:03:12 +13:00
$this -> assertArrayHasKey ( 'type' , $response );
$this -> assertArrayHasKey ( 'data' , $response );
$this -> assertEquals ( 'event' , $response [ 'type' ]);
$this -> assertNotEmpty ( $response [ 'data' ]);
$this -> assertArrayHasKey ( 'timestamp' , $response [ 'data' ]);
2022-03-01 04:17:37 +13:00
$this -> assertCount ( 4 , $response [ 'data' ][ 'channels' ]);
$this -> assertContains ( 'console' , $response [ 'data' ][ 'channels' ]);
2021-12-07 01:03:12 +13:00
$this -> assertContains ( 'executions' , $response [ 'data' ][ 'channels' ]);
2022-04-19 04:21:45 +12:00
$this -> assertContains ( " executions. { $executionId } " , $response [ 'data' ][ 'channels' ]);
$this -> assertContains ( " functions. { $functionId } " , $response [ 'data' ][ 'channels' ]);
$this -> assertContains ( " functions. { $functionId } .executions. { $executionId } .create " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " functions. { $functionId } .executions. { $executionId } " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " functions. { $functionId } .executions.*.create " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " functions. { $functionId } .executions.* " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " functions. { $functionId } " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " functions.*.executions. { $executionId } .create " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " functions.*.executions. { $executionId } " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " functions.*.executions.*.create " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " functions.*.executions.* " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " functions.* " , $response [ 'data' ][ 'events' ]);
2021-12-07 01:03:12 +13:00
$this -> assertNotEmpty ( $response [ 'data' ][ 'payload' ]);
$this -> assertArrayHasKey ( 'type' , $responseUpdate );
$this -> assertArrayHasKey ( 'data' , $responseUpdate );
$this -> assertEquals ( 'event' , $responseUpdate [ 'type' ]);
$this -> assertNotEmpty ( $responseUpdate [ 'data' ]);
$this -> assertArrayHasKey ( 'timestamp' , $responseUpdate [ 'data' ]);
2022-03-01 04:42:52 +13:00
$this -> assertCount ( 4 , $responseUpdate [ 'data' ][ 'channels' ]);
$this -> assertContains ( 'console' , $responseUpdate [ 'data' ][ 'channels' ]);
2021-12-07 01:03:12 +13:00
$this -> assertContains ( 'executions' , $responseUpdate [ 'data' ][ 'channels' ]);
2022-04-19 04:21:45 +12:00
$this -> assertContains ( " executions. { $executionId } " , $responseUpdate [ 'data' ][ 'channels' ]);
$this -> assertContains ( " functions. { $functionId } " , $responseUpdate [ 'data' ][ 'channels' ]);
$this -> assertContains ( " functions. { $functionId } .executions. { $executionId } .update " , $responseUpdate [ 'data' ][ 'events' ]);
$this -> assertContains ( " functions. { $functionId } .executions. { $executionId } " , $responseUpdate [ 'data' ][ 'events' ]);
$this -> assertContains ( " functions. { $functionId } .executions.*.update " , $responseUpdate [ 'data' ][ 'events' ]);
$this -> assertContains ( " functions. { $functionId } .executions.* " , $responseUpdate [ 'data' ][ 'events' ]);
$this -> assertContains ( " functions. { $functionId } " , $responseUpdate [ 'data' ][ 'events' ]);
$this -> assertContains ( " functions.*.executions. { $executionId } .update " , $responseUpdate [ 'data' ][ 'events' ]);
$this -> assertContains ( " functions.*.executions. { $executionId } " , $responseUpdate [ 'data' ][ 'events' ]);
$this -> assertContains ( " functions.*.executions.*.update " , $responseUpdate [ 'data' ][ 'events' ]);
$this -> assertContains ( " functions.*.executions.* " , $responseUpdate [ 'data' ][ 'events' ]);
$this -> assertContains ( " functions.* " , $responseUpdate [ 'data' ][ 'events' ]);
2021-12-07 01:03:12 +13:00
$this -> assertNotEmpty ( $responseUpdate [ 'data' ][ 'payload' ]);
$client -> close ();
2022-02-10 09:20:28 +13:00
2022-05-24 02:54:50 +12:00
// Cleanup : Delete function
2022-04-19 04:21:45 +12:00
$response = $this -> client -> call ( Client :: METHOD_DELETE , '/functions/' . $functionId , [
2022-02-10 09:20:28 +13:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ],
], []);
$this -> assertEquals ( 204 , $response [ 'headers' ][ 'status-code' ]);
2021-12-07 01:03:12 +13:00
}
public function testChannelTeams () : array
{
$user = $this -> getUser ();
$session = $user [ 'session' ] ? ? '' ;
$projectId = $this -> getProject ()[ '$id' ];
$client = $this -> getWebsocket ([ 'teams' ], [
'origin' => 'http://localhost' ,
2022-04-19 04:21:45 +12:00
'cookie' => 'a_session_' . $projectId . '=' . $session
2021-12-07 01:03:12 +13:00
]);
$response = json_decode ( $client -> receive (), true );
$this -> assertArrayHasKey ( 'type' , $response );
$this -> assertArrayHasKey ( 'data' , $response );
$this -> assertEquals ( 'connected' , $response [ 'type' ]);
$this -> assertNotEmpty ( $response [ 'data' ]);
$this -> assertCount ( 1 , $response [ 'data' ][ 'channels' ]);
$this -> assertContains ( 'teams' , $response [ 'data' ][ 'channels' ]);
$this -> assertNotEmpty ( $response [ 'data' ][ 'user' ]);
$this -> assertEquals ( $user [ '$id' ], $response [ 'data' ][ 'user' ][ '$id' ]);
/**
* Test Team Create
*/
$team = $this -> client -> call ( Client :: METHOD_POST , '/teams' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $projectId ,
], $this -> getHeaders ()), [
'teamId' => 'unique()' ,
'name' => 'Arsenal'
]);
$teamId = $team [ 'body' ][ '$id' ] ? ? '' ;
$this -> assertEquals ( 201 , $team [ 'headers' ][ 'status-code' ]);
$this -> assertNotEmpty ( $team [ 'body' ][ '$id' ]);
$response = json_decode ( $client -> receive (), true );
$this -> assertArrayHasKey ( 'type' , $response );
$this -> assertArrayHasKey ( 'data' , $response );
$this -> assertEquals ( 'event' , $response [ 'type' ]);
$this -> assertNotEmpty ( $response [ 'data' ]);
$this -> assertArrayHasKey ( 'timestamp' , $response [ 'data' ]);
$this -> assertCount ( 2 , $response [ 'data' ][ 'channels' ]);
$this -> assertContains ( 'teams' , $response [ 'data' ][ 'channels' ]);
2022-04-19 04:21:45 +12:00
$this -> assertContains ( " teams. { $teamId } " , $response [ 'data' ][ 'channels' ]);
$this -> assertContains ( " teams. { $teamId } .create " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " teams. { $teamId } " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " teams.*.create " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " teams.* " , $response [ 'data' ][ 'events' ]);
2021-12-07 01:03:12 +13:00
$this -> assertNotEmpty ( $response [ 'data' ][ 'payload' ]);
/**
* Test Team Update
*/
2022-04-19 04:21:45 +12:00
$team = $this -> client -> call ( Client :: METHOD_PUT , '/teams/' . $teamId , array_merge ([
2021-12-07 01:03:12 +13:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $projectId ,
], $this -> getHeaders ()), [
'name' => 'Manchester'
]);
$this -> assertEquals ( $team [ 'headers' ][ 'status-code' ], 200 );
$this -> assertNotEmpty ( $team [ 'body' ][ '$id' ]);
$response = json_decode ( $client -> receive (), true );
$this -> assertArrayHasKey ( 'type' , $response );
$this -> assertArrayHasKey ( 'data' , $response );
$this -> assertEquals ( 'event' , $response [ 'type' ]);
$this -> assertNotEmpty ( $response [ 'data' ]);
$this -> assertArrayHasKey ( 'timestamp' , $response [ 'data' ]);
$this -> assertCount ( 2 , $response [ 'data' ][ 'channels' ]);
$this -> assertContains ( 'teams' , $response [ 'data' ][ 'channels' ]);
2022-04-19 04:21:45 +12:00
$this -> assertContains ( " teams. { $teamId } " , $response [ 'data' ][ 'channels' ]);
$this -> assertContains ( " teams. { $teamId } .update " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " teams. { $teamId } " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " teams.*.update " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " teams.* " , $response [ 'data' ][ 'events' ]);
2021-12-07 01:03:12 +13:00
$this -> assertNotEmpty ( $response [ 'data' ][ 'payload' ]);
$client -> close ();
return [ 'teamId' => $teamId ];
}
/**
* @ depends testChannelTeams
*/
public function testChannelMemberships ( array $data )
{
$teamId = $data [ 'teamId' ] ? ? '' ;
$user = $this -> getUser ();
$session = $user [ 'session' ] ? ? '' ;
$projectId = $this -> getProject ()[ '$id' ];
$client = $this -> getWebsocket ([ 'memberships' ], [
'origin' => 'http://localhost' ,
2022-04-19 04:21:45 +12:00
'cookie' => 'a_session_' . $projectId . '=' . $session
2021-12-07 01:03:12 +13:00
]);
$response = json_decode ( $client -> receive (), true );
$this -> assertArrayHasKey ( 'type' , $response );
$this -> assertArrayHasKey ( 'data' , $response );
$this -> assertEquals ( 'connected' , $response [ 'type' ]);
$this -> assertNotEmpty ( $response [ 'data' ]);
$this -> assertCount ( 1 , $response [ 'data' ][ 'channels' ]);
$this -> assertContains ( 'memberships' , $response [ 'data' ][ 'channels' ]);
$this -> assertNotEmpty ( $response [ 'data' ][ 'user' ]);
$this -> assertEquals ( $user [ '$id' ], $response [ 'data' ][ 'user' ][ '$id' ]);
2022-04-19 04:21:45 +12:00
$response = $this -> client -> call ( Client :: METHOD_GET , '/teams/' . $teamId . '/memberships' , array_merge ([
2021-12-07 01:03:12 +13:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()));
$membershipId = $response [ 'body' ][ 'memberships' ][ 0 ][ '$id' ];
/**
* Test Update Membership
*/
$roles = [ 'admin' , 'editor' , 'uncle' ];
2022-04-19 04:21:45 +12:00
$this -> client -> call ( Client :: METHOD_PATCH , '/teams/' . $teamId . '/memberships/' . $membershipId , array_merge ([
2021-12-07 01:03:12 +13:00
'origin' => 'http://localhost' ,
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()), [
'roles' => $roles
]);
$response = json_decode ( $client -> receive (), true );
$this -> assertArrayHasKey ( 'type' , $response );
$this -> assertArrayHasKey ( 'data' , $response );
$this -> assertEquals ( 'event' , $response [ 'type' ]);
$this -> assertNotEmpty ( $response [ 'data' ]);
$this -> assertArrayHasKey ( 'timestamp' , $response [ 'data' ]);
$this -> assertCount ( 2 , $response [ 'data' ][ 'channels' ]);
$this -> assertContains ( 'memberships' , $response [ 'data' ][ 'channels' ]);
2022-04-19 04:21:45 +12:00
$this -> assertContains ( " memberships. { $membershipId } " , $response [ 'data' ][ 'channels' ]);
$this -> assertContains ( " teams. { $teamId } .memberships. { $membershipId } .update " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " teams. { $teamId } .memberships. { $membershipId } " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " teams. { $teamId } .memberships.*.update " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " teams. { $teamId } .memberships.* " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " teams. { $teamId } " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " teams.*.memberships. { $membershipId } .update " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " teams.*.memberships. { $membershipId } " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " teams.*.memberships.*.update " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " teams.*.memberships.* " , $response [ 'data' ][ 'events' ]);
$this -> assertContains ( " teams.* " , $response [ 'data' ][ 'events' ]);
2021-12-07 01:03:12 +13:00
$this -> assertNotEmpty ( $response [ 'data' ][ 'payload' ]);
$client -> close ();
}
2022-04-19 04:21:45 +12:00
}