2021-03-02 22:56:18 +13:00
|
|
|
<?php
|
|
|
|
|
|
|
|
namespace Tests\E2E\Services\Realtime;
|
|
|
|
|
2021-03-03 07:01:34 +13:00
|
|
|
use WebSocket\ConnectionException;
|
2021-12-07 01:03:12 +13:00
|
|
|
use WebSocket\Client as WebSocketClient;
|
2021-03-03 07:01:34 +13:00
|
|
|
|
2021-03-02 22:56:18 +13:00
|
|
|
trait RealtimeBase
|
|
|
|
{
|
2022-01-04 03:01:35 +13:00
|
|
|
private function getWebsocket($channels = [], $headers = [], $projectId = null): WebSocketClient
|
2021-03-03 07:01:34 +13:00
|
|
|
{
|
2021-12-07 01:03:12 +13:00
|
|
|
if (is_null($projectId)) {
|
|
|
|
$projectId = $this->getProject()['$id'];
|
|
|
|
}
|
|
|
|
|
2021-03-03 07:01:34 +13:00
|
|
|
$headers = array_merge([
|
|
|
|
'Origin' => 'appwrite.test'
|
|
|
|
], $headers);
|
|
|
|
|
|
|
|
$query = [
|
2021-12-07 01:03:12 +13:00
|
|
|
'project' => $projectId,
|
2021-03-03 07:01:34 +13:00
|
|
|
'channels' => $channels
|
|
|
|
];
|
2021-12-07 01:03:12 +13:00
|
|
|
|
2021-03-03 07:01:34 +13:00
|
|
|
return new WebSocketClient('ws://appwrite-traefik/v1/realtime?' . http_build_query($query), [
|
|
|
|
'headers' => $headers,
|
2021-06-25 00:22:32 +12:00
|
|
|
'timeout' => 30,
|
2021-03-03 07:01:34 +13:00
|
|
|
]);
|
|
|
|
}
|
|
|
|
|
2022-01-04 03:01:35 +13:00
|
|
|
public function testConnection(): void
|
2021-03-03 07:01:34 +13:00
|
|
|
{
|
|
|
|
/**
|
|
|
|
* Test for SUCCESS
|
|
|
|
*/
|
|
|
|
$client = $this->getWebsocket(['documents']);
|
2021-08-27 21:20:49 +12:00
|
|
|
$this->assertNotEmpty($client->receive());
|
2021-03-03 07:01:34 +13:00
|
|
|
$client->close();
|
2022-01-04 03:01:35 +13:00
|
|
|
}
|
2021-03-03 07:01:34 +13:00
|
|
|
|
2022-01-04 03:01:35 +13:00
|
|
|
public function testConnectionFailureMissingChannels(): void
|
|
|
|
{
|
2021-03-03 07:01:34 +13:00
|
|
|
$client = $this->getWebsocket();
|
2021-03-11 22:50:19 +13:00
|
|
|
$payload = json_decode($client->receive(), true);
|
2021-08-27 20:20:44 +12:00
|
|
|
|
|
|
|
$this->assertArrayHasKey('type', $payload);
|
|
|
|
$this->assertArrayHasKey('data', $payload);
|
|
|
|
$this->assertEquals('error', $payload['type']);
|
|
|
|
$this->assertEquals(1008, $payload['data']['code']);
|
|
|
|
$this->assertEquals('Missing channels', $payload['data']['message']);
|
2022-02-23 06:01:03 +13:00
|
|
|
\usleep(250000); // 250ms
|
2021-03-03 07:01:34 +13:00
|
|
|
$this->expectException(ConnectionException::class); // Check if server disconnnected client
|
|
|
|
$client->close();
|
2022-01-04 03:01:35 +13:00
|
|
|
}
|
2021-03-03 07:01:34 +13:00
|
|
|
|
2022-01-04 03:01:35 +13:00
|
|
|
public function testConnectionFailureUnknownProject(): void
|
|
|
|
{
|
2021-03-03 07:01:34 +13:00
|
|
|
$client = new WebSocketClient('ws://appwrite-traefik/v1/realtime?project=123', [
|
|
|
|
'headers' => [
|
|
|
|
'Origin' => 'appwrite.test'
|
|
|
|
]
|
|
|
|
]);
|
2021-03-11 22:50:19 +13:00
|
|
|
$payload = json_decode($client->receive(), true);
|
2021-08-27 20:20:44 +12:00
|
|
|
|
|
|
|
$this->assertArrayHasKey('type', $payload);
|
|
|
|
$this->assertArrayHasKey('data', $payload);
|
|
|
|
$this->assertEquals('error', $payload['type']);
|
|
|
|
$this->assertEquals(1008, $payload['data']['code']);
|
|
|
|
$this->assertEquals('Missing or unknown project ID', $payload['data']['message']);
|
2022-01-22 06:53:13 +13:00
|
|
|
\usleep(250000); // 250ms
|
2021-03-03 07:01:34 +13:00
|
|
|
$this->expectException(ConnectionException::class); // Check if server disconnnected client
|
|
|
|
$client->close();
|
|
|
|
}
|
2021-03-03 02:06:54 +13:00
|
|
|
}
|