62 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			62 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
 | 
						|
namespace NoccyLabs\Mercureact\Broker;
 | 
						|
 | 
						|
use NoccyLabs\Mercureact\Broker\Subscriber\SubscriberInterface;
 | 
						|
use PHPUnit\Framework\Attributes\CoversClass;
 | 
						|
 | 
						|
#[CoversClass(Topic::class)]
 | 
						|
#[CoversClass(Message::class)]
 | 
						|
class TopicTest extends \PHPUnit\Framework\TestCase
 | 
						|
{
 | 
						|
 | 
						|
    public function testPublicMessagesAreDeliveredToAllSubscribers()
 | 
						|
    {
 | 
						|
        $authorizedSubscriber = new class extends _Subscriber {
 | 
						|
            public function isAuthenticated():bool { return true; }
 | 
						|
        };
 | 
						|
        $unauthorizedSubscriber = new class extends _Subscriber {
 | 
						|
            public function isAuthenticated():bool { return false; }
 | 
						|
        };
 | 
						|
 | 
						|
        $topic = new Topic("foo");
 | 
						|
        $topic->addSubscriber($authorizedSubscriber);
 | 
						|
        $topic->addSubscriber($unauthorizedSubscriber);
 | 
						|
 | 
						|
        $message = new Message(topic:["foo"], data:"test", private:false);
 | 
						|
        $topic->publish($message);
 | 
						|
 | 
						|
        $this->assertEquals(1, count($authorizedSubscriber->messages));
 | 
						|
        $this->assertEquals(1, count($unauthorizedSubscriber->messages));
 | 
						|
    }
 | 
						|
 | 
						|
    public function testPrivateMessagesAreNotDeliveredToUnauthorizedSubscribers()
 | 
						|
    {
 | 
						|
        $authorizedSubscriber = new class extends _Subscriber {
 | 
						|
            public function isAuthenticated():bool { return true; }
 | 
						|
        };
 | 
						|
        $unauthorizedSubscriber = new class extends _Subscriber {
 | 
						|
            public function isAuthenticated():bool { return false; }
 | 
						|
        };
 | 
						|
 | 
						|
        $topic = new Topic("foo");
 | 
						|
        $topic->addSubscriber($authorizedSubscriber);
 | 
						|
        $topic->addSubscriber($unauthorizedSubscriber);
 | 
						|
 | 
						|
        $message = new Message(topic:["foo"], data:"test", private:true);
 | 
						|
        $topic->publish($message);
 | 
						|
 | 
						|
        $this->assertEquals(1, count($authorizedSubscriber->messages));
 | 
						|
        $this->assertEquals(0, count($unauthorizedSubscriber->messages));
 | 
						|
    }
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
abstract class _Subscriber implements SubscriberInterface {
 | 
						|
    public array $messages = [];
 | 
						|
    public function isAuthenticated():bool { return false; }
 | 
						|
    public function deliver(Message $message):void { $this->messages[] = $message; }
 | 
						|
    public function getMercureClaims(): ?array { return []; }
 | 
						|
    public function getPayload(): ?array { return null; }
 | 
						|
    public function getId(): string { return ""; }
 | 
						|
}; |