Skip to content

Commit 3890c24

Browse files
committed
Merge pull request #11 from Textalk/mockclasses
Added mock classes for better testing.
2 parents 4c62a62 + 6f112ad commit 3890c24

File tree

6 files changed

+78
-14
lines changed

6 files changed

+78
-14
lines changed

lib/Connection.php

+8-2
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
* You can let the Connection-class hold named instances by using Connection::getInstance('name')
1313
* with different contexts (or even different backend URLs).
1414
*/
15-
class Connection {
15+
class Connection implements ConnectionInterface {
1616
//
1717
// Static
1818
//
@@ -73,7 +73,7 @@ public function call($method, $params = null) {
7373

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

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

7878
return $request->result;
7979
}
@@ -125,6 +125,12 @@ public function getSession() {
125125
return $this->context['session'];
126126
}
127127

128+
public function getUri() {
129+
$backend_uri = $this->backend;
130+
if (!empty($this->context)) $backend_uri .= '?' . http_build_query($this->context);
131+
return $backend_uri;
132+
}
133+
128134
//
129135
// Magic methods
130136
//

lib/ConnectionInterface.php

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<?php
2+
3+
namespace Textalk\WebshopClient;
4+
5+
/**
6+
* Interface for API Connections.
7+
*/
8+
interface ConnectionInterface {
9+
public function getApiClass($class);
10+
public function getApiInstance($class, $uid);
11+
public function getUri();
12+
}

lib/Exception.php

+6-7
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@
22

33
namespace Textalk\WebshopClient;
44

5-
use Tivoka\Client\Request;
6-
75
class Exception extends \Exception {
86
protected static $class_by_code = array(
97
-32700 => 'ParseError',
@@ -21,8 +19,8 @@ class Exception extends \Exception {
2119
*
2220
* @return Exception Generic or specific subclass
2321
*/
24-
public static function factory(\Tivoka\Client\Connection\WebSocket $connection,
25-
Request $request) {
22+
public static function factory(\Textalk\WebshopClient\ConnectionInterface $connection,
23+
\Tivoka\Client\Request $request) {
2624
if (array_key_exists($request->error, self::$class_by_code)) {
2725
$exception_class
2826
= 'Textalk\\WebshopClient\\Exception\\' . self::$class_by_code[$request->error];
@@ -50,15 +48,16 @@ public function getRpcMessage() { return $this->request->errorMessage; }
5048
// Protected
5149
//
5250

53-
protected $request; ///< Tivoka\Client\Request The request that failed
54-
protected $connection; ///< Tivoka\Client\Connection\WebSocket The connection that was used
51+
protected $connection; ///< Textalk\WebshopClient\ConnectionInterface The connection that was used.
52+
protected $request; ///< Tivoka\Client\Request The request that failed.
5553

5654
/**
5755
* Construct a new Exception.
5856
*
5957
* This can't be protected since it extends Exception, but it shouldn't be used. Use factory.
6058
*/
61-
public function __construct(\Tivoka\Client\Connection\WebSocket $connection, Request $request) {
59+
public function __construct(\Textalk\WebshopClient\ConnectionInterface $connection,
60+
\Tivoka\Client\Request $request) {
6261
$this->request = $request;
6362
$this->connection = $connection;
6463

lib/Mock/ConnectionMock.php

+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
<?php
2+
3+
namespace Textalk\WebshopClient\Mock;
4+
5+
/**
6+
* A mock connection to be used when testing.
7+
*/
8+
class ConnectionMock implements \Textalk\WebshopClient\ConnectionInterface {
9+
10+
public $classes = array(); // Array of ApiClassMock instances
11+
public $instances = array(); // Array of ApiInstanceMock instance
12+
13+
public function getApiClass($class) {
14+
if (isset($this->classes[$class])) return $this->classes[$class];
15+
throw new Exception("Unexpected class: $class");
16+
}
17+
18+
public function getApiInstance($class, $uid) {
19+
if (isset($this->instances[$class][$uid])) return $this->classes[$class][$uid];
20+
throw new Exception("Unexpected instance. Class: $class UID: $uid");
21+
}
22+
23+
public function getUri() { return 'mock://mock'; }
24+
25+
public function __get($key) {
26+
if (isset($this->classes[$key])) return $this->classes[$key];
27+
throw new Exception("Unexpected get: $key");
28+
}
29+
}

lib/Mock/RequestMock.php

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<?php
2+
3+
namespace Textalk\WebshopClient\Mock;
4+
5+
/**
6+
* A mock Tivoka client request class.
7+
*/
8+
class RequestMock extends \Tivoka\Client\Request {
9+
10+
public $target = null;
11+
12+
/**
13+
* Mock sending data to target.
14+
* @param mixed $target Remote end-point definition
15+
*/
16+
public function sendTo($target) {
17+
$this->target = $target;
18+
}
19+
20+
}

tests/ExceptionTest.php

+3-5
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,13 @@
88

99
class ExceptionTest extends PHPUnit_Framework_TestCase {
1010
public function testUnspecifiedExceptionCode() {
11-
$connection = Client::connect('wss://shop.textalk.se/backend/jsonrpc/v1/');
12-
$request = $connection->sendRequest('Foo', 'bar');
13-
11+
$request = new Textalk\WebshopClient\Mock\RequestMock('Test.testMethod');
1412
$request->error = 424242;
1513
try {
16-
throw Exception::factory($connection, $request);
14+
throw Exception::factory(new Textalk\WebshopClient\Mock\ConnectionMock, $request);
1715
}
1816
catch (Textalk\WebshopClient\Exception $e) {
19-
$this->assertInstanceOf('Textalk\WebshopClient\\Exception', $e);
17+
$this->assertInstanceOf('Textalk\WebshopClient\Exception', $e);
2018
}
2119

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

0 commit comments

Comments
 (0)