1
0
Fork 0
mirror of synced 2024-07-03 05:31:38 +12:00
appwrite/tests/unit/Messaging/MessagingChannelsTest.php

307 lines
9.2 KiB
PHP
Raw Normal View History

2021-02-27 05:01:37 +13:00
<?php
namespace Appwrite\Tests;
2021-06-30 01:11:14 +12:00
use Appwrite\Auth\Auth;
2021-02-27 05:01:37 +13:00
use Appwrite\Database\Document;
2021-06-30 01:11:14 +12:00
use Appwrite\Messaging\Adapter\Realtime;
2021-02-27 05:01:37 +13:00
use PHPUnit\Framework\TestCase;
2021-06-30 01:11:14 +12:00
class MessagingChannelsTest extends TestCase
2021-02-27 05:01:37 +13:00
{
/**
* Configures how many Connections the Test should Mock.
*/
public $connectionsPerChannel = 10;
2021-06-30 01:11:14 +12:00
public Realtime $realtime;
2021-02-27 05:01:37 +13:00
public $connectionsCount = 0;
public $connectionsAuthenticated = 0;
public $connectionsGuest = 0;
public $connectionsTotal = 0;
public $allChannels = [
'files',
'files.1',
'collections',
'collections.1',
'collections.1.documents',
'documents',
'documents.1',
2021-03-25 03:17:17 +13:00
'executions',
'executions.1',
'functions.1',
2021-02-27 05:01:37 +13:00
];
public function setUp(): void
{
/**
* Setup global Counts
*/
$this->connectionsAuthenticated = count($this->allChannels) * $this->connectionsPerChannel;
$this->connectionsGuest = count($this->allChannels) * $this->connectionsPerChannel;
$this->connectionsTotal = $this->connectionsAuthenticated + $this->connectionsGuest;
2021-06-30 01:11:14 +12:00
$this->realtime = new Realtime();
2021-02-27 05:01:37 +13:00
/**
2021-02-27 05:07:53 +13:00
* Add Authenticated Clients
2021-02-27 05:01:37 +13:00
*/
for ($i = 0; $i < $this->connectionsPerChannel; $i++) {
foreach ($this->allChannels as $index => $channel) {
2021-06-30 01:11:14 +12:00
$user = new Document([
2021-02-27 05:01:37 +13:00
'$id' => 'user' . $this->connectionsCount,
'memberships' => [
[
'teamId' => 'team' . $i,
'roles' => [
empty($index % 2) ? 'admin' : 'member'
]
]
]
2021-06-30 01:11:14 +12:00
]);
2021-07-01 02:29:33 +12:00
$roles = Auth::getRoles($user);
2021-06-30 01:11:14 +12:00
2021-07-14 03:18:02 +12:00
$parsedChannels = Realtime::convertChannels([0 => $channel], $user->getId());
2021-02-27 05:01:37 +13:00
2021-06-30 01:11:14 +12:00
$this->realtime->subscribe(
2021-02-27 05:01:37 +13:00
'1',
$this->connectionsCount,
2021-05-20 20:54:18 +12:00
$roles,
$parsedChannels
2021-02-27 05:01:37 +13:00
);
$this->connectionsCount++;
}
}
/**
2021-02-27 05:07:53 +13:00
* Add Guest Clients
2021-02-27 05:01:37 +13:00
*/
for ($i = 0; $i < $this->connectionsPerChannel; $i++) {
foreach ($this->allChannels as $index => $channel) {
2021-06-30 01:11:14 +12:00
$user = new Document([
2021-02-27 05:01:37 +13:00
'$id' => ''
2021-06-30 01:11:14 +12:00
]);
2021-02-27 05:01:37 +13:00
2021-07-01 02:29:33 +12:00
$roles = Auth::getRoles($user);
2021-06-30 01:11:14 +12:00
2021-07-14 03:18:02 +12:00
$parsedChannels = Realtime::convertChannels([0 => $channel], $user->getId());
2021-05-20 20:54:18 +12:00
2021-06-30 01:11:14 +12:00
$this->realtime->subscribe(
2021-02-27 05:01:37 +13:00
'1',
$this->connectionsCount,
2021-05-20 20:54:18 +12:00
$roles,
$parsedChannels
2021-02-27 05:01:37 +13:00
);
$this->connectionsCount++;
}
}
}
public function tearDown(): void
{
2021-06-30 01:11:14 +12:00
unset($this->realtime);
2021-02-27 05:01:37 +13:00
$this->connectionsCount = 0;
}
public function testSubscriptions()
{
/**
* Check for 1 project.
*/
2021-06-30 01:11:14 +12:00
$this->assertCount(1, $this->realtime->subscriptions);
2021-02-27 05:01:37 +13:00
/**
2021-02-27 05:07:53 +13:00
* Check for correct amount of subscriptions:
2021-02-27 05:01:37 +13:00
* - XXX users
2021-02-27 05:09:47 +13:00
* - XXX teams
* - XXX team roles (2 roles per team)
2021-02-27 05:01:37 +13:00
* - 1 role:guest
* - 1 role:member
*/
2021-06-30 01:11:14 +12:00
$this->assertCount(($this->connectionsAuthenticated + (3 * $this->connectionsPerChannel) + 2), $this->realtime->subscriptions['1']);
2021-02-27 05:01:37 +13:00
/**
2021-02-27 05:07:53 +13:00
* Check for connections
* - Authenticated
* - Guests
2021-02-27 05:01:37 +13:00
*/
2021-06-30 01:11:14 +12:00
$this->assertCount($this->connectionsTotal, $this->realtime->connections);
$this->realtime->unsubscribe(-1);
2021-02-27 06:26:22 +13:00
2021-06-30 01:11:14 +12:00
$this->assertCount($this->connectionsTotal, $this->realtime->connections);
$this->assertCount(($this->connectionsAuthenticated + (3 * $this->connectionsPerChannel) + 2), $this->realtime->subscriptions['1']);
2021-02-27 06:26:22 +13:00
for ($i = 0; $i < $this->connectionsCount; $i++) {
2021-06-30 01:11:14 +12:00
$this->realtime->unsubscribe($i);
2021-02-27 06:26:22 +13:00
2021-06-30 01:11:14 +12:00
$this->assertCount(($this->connectionsCount - $i - 1), $this->realtime->connections);
2021-02-27 06:26:22 +13:00
}
2021-06-30 01:11:14 +12:00
$this->assertEmpty($this->realtime->connections);
$this->assertEmpty($this->realtime->subscriptions);
2021-02-27 05:01:37 +13:00
}
/**
* Tests Wildcard (*) Permissions on every channel.
*/
public function testWildcardPermission()
{
foreach ($this->allChannels as $index => $channel) {
$event = [
'project' => '1',
2021-07-14 03:18:02 +12:00
'roles' => ['*'],
2021-02-27 05:01:37 +13:00
'data' => [
'channels' => [
0 => $channel,
]
]
];
2021-07-14 03:18:02 +12:00
$receivers = $this->realtime->getSubscribers($event);
2021-02-27 05:01:37 +13:00
/**
* Every Client subscribed to the Wildcard should receive this event.
*/
$this->assertCount($this->connectionsTotal / count($this->allChannels), $receivers, $channel);
foreach ($receivers as $receiver) {
/**
* Making sure the right clients receive the event.
*/
$this->assertStringEndsWith($index, $receiver);
}
}
}
public function testRolePermissions()
{
$roles = ['role:guest', 'role:member'];
foreach ($this->allChannels as $index => $channel) {
foreach ($roles as $role) {
$permissions = [$role];
$event = [
'project' => '1',
2021-07-14 03:18:02 +12:00
'roles' => $permissions,
2021-02-27 05:01:37 +13:00
'data' => [
'channels' => [
0 => $channel,
]
]
];
2021-07-14 03:18:02 +12:00
$receivers = $this->realtime->getSubscribers($event);
2021-02-27 05:01:37 +13:00
/**
* Every Role subscribed to a Channel should receive this event.
*/
$this->assertCount($this->connectionsPerChannel, $receivers, $channel);
foreach ($receivers as $receiver) {
/**
* Making sure the right clients receive the event.
*/
$this->assertStringEndsWith($index, $receiver);
}
}
}
}
public function testUserPermissions()
{
foreach ($this->allChannels as $index => $channel) {
$permissions = [];
for ($i = 0; $i < $this->connectionsPerChannel; $i++) {
$permissions[] = 'user:user' . (!empty($i) ? $i : '') . $index;
}
$event = [
'project' => '1',
2021-07-14 03:18:02 +12:00
'roles' => $permissions,
2021-02-27 05:01:37 +13:00
'data' => [
'channels' => [
0 => $channel,
]
]
];
2021-07-14 03:18:02 +12:00
$receivers = $this->realtime->getSubscribers($event);
2021-02-27 05:01:37 +13:00
/**
* Every Client subscribed to a Channel should receive this event.
*/
$this->assertCount($this->connectionsAuthenticated / count($this->allChannels), $receivers, $channel);
foreach ($receivers as $receiver) {
/**
* Making sure the right clients receive the event.
*/
$this->assertStringEndsWith($index, $receiver);
}
}
}
public function testTeamPermissions()
{
foreach ($this->allChannels as $index => $channel) {
$permissions = [];
for ($i = 0; $i < $this->connectionsPerChannel; $i++) {
$permissions[] = 'team:team' . $i;
}
$event = [
'project' => '1',
2021-07-14 03:18:02 +12:00
'roles' => $permissions,
2021-02-27 05:01:37 +13:00
'data' => [
'channels' => [
0 => $channel,
]
]
];
2021-07-14 03:18:02 +12:00
$receivers = $this->realtime->getSubscribers($event);
2021-02-27 05:01:37 +13:00
/**
* Every Team Member should receive this event.
*/
$this->assertCount($this->connectionsAuthenticated / count($this->allChannels), $receivers, $channel);
foreach ($receivers as $receiver) {
/**
* Making sure the right clients receive the event.
*/
$this->assertStringEndsWith($index, $receiver);
}
$permissions = ['team:team' . $index . '/' . (empty($index % 2) ? 'admin' : 'member')];
$event = [
'project' => '1',
2021-07-14 03:18:02 +12:00
'roles' => $permissions,
2021-02-27 05:01:37 +13:00
'data' => [
'channels' => [
0 => $channel,
]
]
];
2021-07-14 03:18:02 +12:00
$receivers = $this->realtime->getSubscribers($event);
2021-02-27 05:01:37 +13:00
/**
* Only 1 Team Member of a role should have access to a specific channel.
*/
$this->assertCount(1, $receivers, $channel);
foreach ($receivers as $receiver) {
/**
* Making sure the right clients receive the event.
*/
$this->assertStringEndsWith($index, $receiver);
}
}
}
}