[WAMP]
Lots of unit tests for new WAMP classes Fixed parse error in TopicManager Aliased Topic::getId -> __toString to WampConnection can work with Topics or raw protocol strings API docs CS
This commit is contained in:
parent
9d0e6735db
commit
8d0cf5ffb2
@ -48,8 +48,8 @@ class ServerProtocol implements MessageComponentInterface, WsServerInterface {
|
||||
/**
|
||||
* @param WampServerInterface An class to propagate calls through
|
||||
*/
|
||||
public function __construct(WampServerInterface $server_component) {
|
||||
$this->_decorating = $server_component;
|
||||
public function __construct(WampServerInterface $serverComponent) {
|
||||
$this->_decorating = $serverComponent;
|
||||
$this->connections = new \SplObjectStorage;
|
||||
}
|
||||
|
||||
|
@ -24,14 +24,21 @@ class Topic implements \IteratorAggregate, \Countable {
|
||||
return $this->id;
|
||||
}
|
||||
|
||||
public function __toString() {
|
||||
return $this->getId();
|
||||
}
|
||||
|
||||
/**
|
||||
* Send a message to all the connectiosn in this topic
|
||||
* @param string
|
||||
* @return Topic
|
||||
*/
|
||||
public function broadcast($msg) {
|
||||
foreach ($this->subscribers as $client) {
|
||||
$client->event($this->id, $msg);
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -49,7 +49,7 @@ class TopicManager implements WsServerInterface, WampServerInterface {
|
||||
public function onUnsubscribe(ConnectionInterface $conn, $topic) {
|
||||
$topicObj = $this->getTopic($topic);
|
||||
|
||||
if ($conn->WAMP->topics->contains($topicobj) {
|
||||
if ($conn->WAMP->topics->contains($topicobj)) {
|
||||
$conn->WAMP->topics->remove($topicObj);
|
||||
}
|
||||
|
||||
@ -93,6 +93,10 @@ class TopicManager implements WsServerInterface, WampServerInterface {
|
||||
return array();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string
|
||||
* @return Topic
|
||||
*/
|
||||
protected function getTopic($topic) {
|
||||
if (!array_key_exists($topic, $this->topicLookup)) {
|
||||
$this->topicLookup[$topic] = new Topic($topic);
|
||||
|
@ -10,6 +10,9 @@ use Ratchet\Wamp\ServerProtocol as WAMP;
|
||||
* @property stdClass $WAMP
|
||||
*/
|
||||
class WampConnection extends AbstractConnectionDecorator {
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function __construct(ConnectionInterface $conn) {
|
||||
parent::__construct($conn);
|
||||
|
||||
@ -21,6 +24,7 @@ class WampConnection extends AbstractConnectionDecorator {
|
||||
}
|
||||
|
||||
/**
|
||||
* Successfully respond to a call made by the client
|
||||
* @param string The unique ID given by the client to respond to
|
||||
* @param array An array of data to return to the client
|
||||
*/
|
||||
@ -29,13 +33,14 @@ class WampConnection extends AbstractConnectionDecorator {
|
||||
}
|
||||
|
||||
/**
|
||||
* Respond with an error to a client call
|
||||
* @param string The unique ID given by the client to respond to
|
||||
* @param string The URI given by the client ot respond to
|
||||
* @param string A developer-oriented description of the error
|
||||
* @param string|null An optional human readable detail message to send back
|
||||
*/
|
||||
public function callError($id, $topic, $desc = '', $details = null) {
|
||||
$data = array(WAMP::MSG_CALL_ERROR, $id, $topic, $desc);
|
||||
$data = array(WAMP::MSG_CALL_ERROR, $id, (string)$topic, $desc);
|
||||
|
||||
if (null !== $details) {
|
||||
$data[] = $details;
|
||||
@ -49,7 +54,7 @@ class WampConnection extends AbstractConnectionDecorator {
|
||||
* @param mixed Data to send with the event. Anything that is json'able
|
||||
*/
|
||||
public function event($topic, $msg) {
|
||||
$this->send(json_encode(array(WAMP::MSG_EVENT, $topic, $msg)));
|
||||
$this->send(json_encode(array(WAMP::MSG_EVENT, (string)$topic, $msg)));
|
||||
}
|
||||
|
||||
/**
|
||||
@ -57,8 +62,8 @@ class WampConnection extends AbstractConnectionDecorator {
|
||||
* @param string
|
||||
*/
|
||||
public function prefix($curie, $uri) {
|
||||
$this->WAMP->prefixes[$curie] = $uri;
|
||||
$this->send(json_encode(array(WAMP::MSG_PREFIX, $curie, $uri)));
|
||||
$this->WAMP->prefixes[$curie] = (string)$uri;
|
||||
$this->send(json_encode(array(WAMP::MSG_PREFIX, $curie, (string)$uri)));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -12,7 +12,7 @@ interface WampServerInterface extends ComponentInterface {
|
||||
* An RPC call has been received
|
||||
* @param Ratchet\ConnectionInterface
|
||||
* @param string The unique ID of the RPC, required to respond to
|
||||
* @param string The topic to execute the call against
|
||||
* @param string|Topic The topic to execute the call against
|
||||
* @param array Call parameters received from the client
|
||||
*/
|
||||
function onCall(ConnectionInterface $conn, $id, $topic, array $params);
|
||||
@ -20,21 +20,21 @@ interface WampServerInterface extends ComponentInterface {
|
||||
/**
|
||||
* A request to subscribe to a topic has been made
|
||||
* @param Ratchet\ConnectionInterface
|
||||
* @param string The topic to subscribe to
|
||||
* @param string|Topic The topic to subscribe to
|
||||
*/
|
||||
function onSubscribe(ConnectionInterface $conn, $topic);
|
||||
|
||||
/**
|
||||
* A request to unsubscribe from a topic has been made
|
||||
* @param Ratchet\ConnectionInterface
|
||||
* @param The topic to unsubscribe from
|
||||
* @param string|Topic The topic to unsubscribe from
|
||||
*/
|
||||
function onUnSubscribe(ConnectionInterface $conn, $topic);
|
||||
|
||||
/**
|
||||
* A client is attempting to publish content to a subscribed connections on a URI
|
||||
* @param Ratchet\ConnectionInterface
|
||||
* @param The topic the user has attempted to publish to
|
||||
* @param string|Topic The topic the user has attempted to publish to
|
||||
* @param string Payload of the publish
|
||||
* @param array A list of session IDs the message should be excluded from (blacklist)
|
||||
* @param array A list of session Ids the message should be send to (whitelist)
|
||||
|
97
tests/Ratchet/Tests/Wamp/TopicManagerTest.php
Normal file
97
tests/Ratchet/Tests/Wamp/TopicManagerTest.php
Normal file
@ -0,0 +1,97 @@
|
||||
<?php
|
||||
namespace Ratchet\Tests\Wamp;
|
||||
use Ratchet\Wamp\TopicManager;
|
||||
|
||||
/**
|
||||
* @covers Ratchet\Wamp\TopicManager
|
||||
*/
|
||||
class TopicManagerTest extends \PHPUnit_Framework_TestCase {
|
||||
private $mock;
|
||||
private $mngr;
|
||||
private $conn;
|
||||
|
||||
public function setUp() {
|
||||
$this->conn = $this->getMock('\\Ratchet\\ConnectionInterface');
|
||||
$this->mock = $this->getMock('\\Ratchet\\Wamp\\WampServerInterface');
|
||||
$this->mngr = new TopicManager($this->mock);
|
||||
|
||||
$this->mngr->onOpen($this->conn);
|
||||
}
|
||||
|
||||
public function isTopic() {
|
||||
return new \PHPUnit_Framework_Constraint_IsInstanceOf('\\Ratchet\\Wamp\\Topic');
|
||||
}
|
||||
|
||||
public function testGetTopicReturnsTopicObject() {
|
||||
$class = new \ReflectionClass('\\Ratchet\\Wamp\\TopicManager');
|
||||
$method = $class->getMethod('getTopic');
|
||||
$method->setAccessible(true);
|
||||
|
||||
$topic = $method->invokeArgs($this->mngr, array('The Topic'));
|
||||
|
||||
$this->assertInstanceOf('\\Ratchet\\Wamp\\Topic', $topic);
|
||||
}
|
||||
|
||||
public function testGetTopicCreatesTopicWithSameName() {
|
||||
$name = 'The Topic';
|
||||
|
||||
$class = new \ReflectionClass('\\Ratchet\\Wamp\\TopicManager');
|
||||
$method = $class->getMethod('getTopic');
|
||||
$method->setAccessible(true);
|
||||
|
||||
$topic = $method->invokeArgs($this->mngr, array($name));
|
||||
|
||||
$this->assertEquals($name, $topic->getId());
|
||||
}
|
||||
|
||||
public function testGetTopicReturnsSameObject() {
|
||||
$class = new \ReflectionClass('\\Ratchet\\Wamp\\TopicManager');
|
||||
$method = $class->getMethod('getTopic');
|
||||
$method->setAccessible(true);
|
||||
|
||||
$topic = $method->invokeArgs($this->mngr, array('No copy'));
|
||||
$again = $method->invokeArgs($this->mngr, array('No copy'));
|
||||
|
||||
$this->assertSame($topic, $again);
|
||||
}
|
||||
|
||||
public function testOnOpen() {
|
||||
$this->mock->expects($this->once())->method('onOpen');
|
||||
$this->mngr->onOpen($this->conn);
|
||||
}
|
||||
|
||||
public function testOnCall() {
|
||||
$id = uniqid();
|
||||
|
||||
$this->mock->expects($this->once())->method('onCall')->with(
|
||||
$this->conn
|
||||
, $id
|
||||
, $this->isTopic()
|
||||
, array()
|
||||
);
|
||||
|
||||
$this->mngr->onCall($this->conn, $id, 'new topic', array());
|
||||
}
|
||||
|
||||
public function testOnSubscribeCreatesTopicObject() {
|
||||
$this->mock->expects($this->once())->method('onSubscribe')->with(
|
||||
$this->conn, $this->isTopic()
|
||||
);
|
||||
|
||||
$this->mngr->onSubscribe($this->conn, 'new topic');
|
||||
}
|
||||
|
||||
public function testTopicIsInConnection() {
|
||||
$name = 'New Topic';
|
||||
|
||||
$class = new \ReflectionClass('\\Ratchet\\Wamp\\TopicManager');
|
||||
$method = $class->getMethod('getTopic');
|
||||
$method->setAccessible(true);
|
||||
|
||||
$topic = $method->invokeArgs($this->mngr, array($name));
|
||||
|
||||
$this->mngr->onSubscribe($this->conn, $name);
|
||||
|
||||
$this->assertTrue($this->conn->WAMP->topics->contains($topic));
|
||||
}
|
||||
}
|
@ -2,7 +2,6 @@
|
||||
namespace Ratchet\Tests\Wamp;
|
||||
use Ratchet\Wamp\Topic;
|
||||
use Ratchet\Wamp\WampConnection;
|
||||
use Ratchet\Tests\Mock\Connection as MockConnection;
|
||||
|
||||
/**
|
||||
* @covers Ratchet\Wamp\Topic
|
||||
@ -39,12 +38,12 @@ class TopicTest extends \PHPUnit_Framework_TestCase {
|
||||
}
|
||||
|
||||
public function testBroadcast() {
|
||||
$msg = 'Hello World!';
|
||||
$name = 'batman';
|
||||
$msg = 'Hello World!';
|
||||
$name = 'Batman';
|
||||
$protocol = json_encode(array(8, $name, $msg));
|
||||
|
||||
$first = $this->getMock('Ratchet\\Wamp\\WampConnection', array('send'), array(new MockConnection));
|
||||
$second = $this->getMock('Ratchet\\Wamp\\WampConnection', array('send'), array(new MockConnection));
|
||||
$first = $this->getMock('Ratchet\\Wamp\\WampConnection', array('send'), array($this->getMock('\\Ratchet\\ConnectionInterface')));
|
||||
$second = $this->getMock('Ratchet\\Wamp\\WampConnection', array('send'), array($this->getMock('\\Ratchet\\ConnectionInterface')));
|
||||
|
||||
$first->expects($this->once())
|
||||
->method('send')
|
||||
@ -66,7 +65,7 @@ class TopicTest extends \PHPUnit_Framework_TestCase {
|
||||
$second = $this->newConn();
|
||||
$third = $this->newConn();
|
||||
|
||||
$topic = new Topic('joker');
|
||||
$topic = new Topic('Joker');
|
||||
$topic->add($first)->add($second)->add($third);
|
||||
|
||||
$check = array($first, $second, $third);
|
||||
@ -76,7 +75,14 @@ class TopicTest extends \PHPUnit_Framework_TestCase {
|
||||
}
|
||||
}
|
||||
|
||||
public function testToString() {
|
||||
$name = 'Bane';
|
||||
$topic = new Topic($name);
|
||||
|
||||
$this->assertEquals($name, (string)$topic);
|
||||
}
|
||||
|
||||
protected function newConn() {
|
||||
return new WampConnection(new MockConnection);
|
||||
return new WampConnection($this->getMock('\\Ratchet\\ConnectionInterface'));
|
||||
}
|
||||
}
|
27
tests/Ratchet/Tests/Wamp/WampServerTest.php
Normal file
27
tests/Ratchet/Tests/Wamp/WampServerTest.php
Normal file
@ -0,0 +1,27 @@
|
||||
<?php
|
||||
namespace Ratchet\Tests\Wamp;
|
||||
use Ratchet\Wamp\WampServer;
|
||||
|
||||
/**
|
||||
* @covers Ratchet\Wamp\WampServer
|
||||
*/
|
||||
class WampServerTest extends \PHPUnit_Framework_TestCase {
|
||||
private $serv;
|
||||
private $mock;
|
||||
private $conn;
|
||||
|
||||
public function setUp() {
|
||||
$this->mock = $this->getMock('\\Ratchet\\Wamp\\WampServerInterface');
|
||||
$this->serv = new WampServer($this->mock);
|
||||
$this->conn = $this->getMock('\\Ratchet\\ConnectionInterface');
|
||||
}
|
||||
|
||||
public function isWampConn() {
|
||||
return new \PHPUnit_Framework_Constraint_IsInstanceOf('\\Ratchet\\Wamp\\WampConnection');
|
||||
}
|
||||
|
||||
public function testOpen() {
|
||||
$this->mock->expects($this->once())->method('onOpen')->with($this->isWampConn());
|
||||
$this->serv->onOpen($this->conn);
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user