Skip to content

Commit

Permalink
Merge pull request #11 from Textalk/mockclasses
Browse files Browse the repository at this point in the history
Added mock classes for better testing.
  • Loading branch information
swedieman committed Feb 10, 2015
2 parents 4c62a62 + 6f112ad commit 3890c24
Show file tree
Hide file tree
Showing 6 changed files with 78 additions and 14 deletions.
10 changes: 8 additions & 2 deletions lib/Connection.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
* You can let the Connection-class hold named instances by using Connection::getInstance('name')
* with different contexts (or even different backend URLs).
*/
class Connection {
class Connection implements ConnectionInterface {
//
// Static
//
Expand Down Expand Up @@ -73,7 +73,7 @@ public function call($method, $params = null) {

$request = $this->connection->sendRequest($method, $params);

if ($request->error) throw Exception::factory($this->connection, $request);
if ($request->error) throw Exception::factory($this, $request);

return $request->result;
}
Expand Down Expand Up @@ -125,6 +125,12 @@ public function getSession() {
return $this->context['session'];
}

public function getUri() {
$backend_uri = $this->backend;
if (!empty($this->context)) $backend_uri .= '?' . http_build_query($this->context);
return $backend_uri;
}

//
// Magic methods
//
Expand Down
12 changes: 12 additions & 0 deletions lib/ConnectionInterface.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<?php

namespace Textalk\WebshopClient;

/**
* Interface for API Connections.
*/
interface ConnectionInterface {
public function getApiClass($class);
public function getApiInstance($class, $uid);
public function getUri();
}
13 changes: 6 additions & 7 deletions lib/Exception.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@

namespace Textalk\WebshopClient;

use Tivoka\Client\Request;

class Exception extends \Exception {
protected static $class_by_code = array(
-32700 => 'ParseError',
Expand All @@ -21,8 +19,8 @@ class Exception extends \Exception {
*
* @return Exception Generic or specific subclass
*/
public static function factory(\Tivoka\Client\Connection\WebSocket $connection,
Request $request) {
public static function factory(\Textalk\WebshopClient\ConnectionInterface $connection,
\Tivoka\Client\Request $request) {
if (array_key_exists($request->error, self::$class_by_code)) {
$exception_class
= 'Textalk\\WebshopClient\\Exception\\' . self::$class_by_code[$request->error];
Expand Down Expand Up @@ -50,15 +48,16 @@ public function getRpcMessage() { return $this->request->errorMessage; }
// Protected
//

protected $request; ///< Tivoka\Client\Request The request that failed
protected $connection; ///< Tivoka\Client\Connection\WebSocket The connection that was used
protected $connection; ///< Textalk\WebshopClient\ConnectionInterface The connection that was used.
protected $request; ///< Tivoka\Client\Request The request that failed.

/**
* Construct a new Exception.
*
* This can't be protected since it extends Exception, but it shouldn't be used. Use factory.
*/
public function __construct(\Tivoka\Client\Connection\WebSocket $connection, Request $request) {
public function __construct(\Textalk\WebshopClient\ConnectionInterface $connection,
\Tivoka\Client\Request $request) {
$this->request = $request;
$this->connection = $connection;

Expand Down
29 changes: 29 additions & 0 deletions lib/Mock/ConnectionMock.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
<?php

namespace Textalk\WebshopClient\Mock;

/**
* A mock connection to be used when testing.
*/
class ConnectionMock implements \Textalk\WebshopClient\ConnectionInterface {

public $classes = array(); // Array of ApiClassMock instances
public $instances = array(); // Array of ApiInstanceMock instance

public function getApiClass($class) {
if (isset($this->classes[$class])) return $this->classes[$class];
throw new Exception("Unexpected class: $class");
}

public function getApiInstance($class, $uid) {
if (isset($this->instances[$class][$uid])) return $this->classes[$class][$uid];
throw new Exception("Unexpected instance. Class: $class UID: $uid");
}

public function getUri() { return 'mock://mock'; }

public function __get($key) {
if (isset($this->classes[$key])) return $this->classes[$key];
throw new Exception("Unexpected get: $key");
}
}
20 changes: 20 additions & 0 deletions lib/Mock/RequestMock.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<?php

namespace Textalk\WebshopClient\Mock;

/**
* A mock Tivoka client request class.
*/
class RequestMock extends \Tivoka\Client\Request {

public $target = null;

/**
* Mock sending data to target.
* @param mixed $target Remote end-point definition
*/
public function sendTo($target) {
$this->target = $target;
}

}
8 changes: 3 additions & 5 deletions tests/ExceptionTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,13 @@

class ExceptionTest extends PHPUnit_Framework_TestCase {
public function testUnspecifiedExceptionCode() {
$connection = Client::connect('wss://shop.textalk.se/backend/jsonrpc/v1/');
$request = $connection->sendRequest('Foo', 'bar');

$request = new Textalk\WebshopClient\Mock\RequestMock('Test.testMethod');
$request->error = 424242;
try {
throw Exception::factory($connection, $request);
throw Exception::factory(new Textalk\WebshopClient\Mock\ConnectionMock, $request);
}
catch (Textalk\WebshopClient\Exception $e) {
$this->assertInstanceOf('Textalk\WebshopClient\\Exception', $e);
$this->assertInstanceOf('Textalk\WebshopClient\Exception', $e);
}

$this->assertNotNull($e, 'A Textalk\WebshopClient\Exception should be thrown.');
Expand Down

0 comments on commit 3890c24

Please sign in to comment.