Skip to content

Commit 151b8f7

Browse files
committed
tests: CachedClient test refactored
1 parent ec5a8ae commit 151b8f7

1 file changed

Lines changed: 104 additions & 103 deletions

File tree

tests/Github/Http/CachedClient.phpt

Lines changed: 104 additions & 103 deletions
Original file line numberDiff line numberDiff line change
@@ -9,34 +9,59 @@
99

1010
require __DIR__ . '/../../bootstrap.php';
1111

12+
use Milo\Github\Http;
1213

13-
class MockClient implements Milo\Github\Http\IClient
14+
15+
class MockClient implements Http\IClient
1416
{
1517
/** @var callable */
1618
public $onRequest;
1719

18-
public function request(Milo\Github\Http\Request $request)
20+
/** @var int */
21+
public $requestCount = 0;
22+
23+
24+
public function request(Http\Request $request)
25+
{
26+
$response = call_user_func($this->onRequest, $request);
27+
$this->requestCount++;
28+
return $response;
29+
}
30+
31+
public function onRequest($foo)
1932
{
20-
return call_user_func($this->onRequest, $request);
33+
trigger_error('Inner onRequest called: ' . var_export($foo, TRUE), E_USER_NOTICE);
34+
}
35+
36+
public function onResponse($foo)
37+
{
38+
trigger_error('Inner onResponse called: ' . var_export($foo, TRUE), E_USER_NOTICE);
2139
}
2240

23-
public function onRequest($foo) { trigger_error('Inner onRequest called: ' . var_export($foo, TRUE), E_USER_NOTICE); }
24-
public function onResponse($foo) { trigger_error('Inner onResponse called: ' . var_export($foo, TRUE), E_USER_NOTICE); }
2541
}
2642

2743

2844
class MockCache implements Milo\Github\Storages\ICache
2945
{
3046
private $cache = [];
3147

32-
public function save($key, $value) { return $this->cache[$key] = $value; }
33-
public function load($key) { return isset($this->cache[$key]) ? $this->cache[$key] : NULL; }
48+
public function save($key, $value) {
49+
return $this->cache[$key] = $value;
50+
}
51+
52+
public function load($key)
53+
{
54+
return isset($this->cache[$key])
55+
? $this->cache[$key]
56+
: NULL;
57+
}
58+
3459
}
3560

3661

3762
class CachingTestCase extends Tester\TestCase
3863
{
39-
/** @var Milo\Github\Http\CachedClient */
64+
/** @var Http\CachedClient */
4065
private $client;
4166

4267
/** @var MockClient */
@@ -47,11 +72,17 @@ class CachingTestCase extends Tester\TestCase
4772
{
4873
$cache = new MockCache;
4974
$this->innerClient = new MockClient;
50-
$this->client = new Milo\Github\Http\CachedClient($cache, $this->innerClient);
75+
$this->client = new Http\CachedClient($cache, $this->innerClient);
76+
77+
$this->innerClient->onRequest = function (Http\Request $request) {
78+
return $request->hasHeader('If-None-Match')
79+
? new Http\Response(304, [], "inner-304-{$request->getContent()}")
80+
: new Http\Response(200, ['ETag' => '"inner"'], "inner-200-{$request->getContent()}");
81+
};
5182
}
5283

5384

54-
public function testBasics()
85+
public function testSetOnRequestOnResponseCallbacks()
5586
{
5687
Assert::same($this->innerClient, $this->client->getInnerClient());
5788

@@ -64,194 +95,164 @@ class CachingTestCase extends Tester\TestCase
6495
]);
6596

6697
$onResponseCalled = FALSE;
67-
$this->innerClient->onRequest = function () {
68-
return new Milo\Github\Http\Response(200, [], '');
69-
};
7098
Assert::error(function() use (& $onResponseCalled) {
71-
$this->client->onResponse(function() use (& $onResponseCalled) { $onResponseCalled = TRUE; });
99+
$this->client->onResponse(function() use (& $onResponseCalled) {
100+
$onResponseCalled = TRUE;
101+
});
72102
}, E_USER_NOTICE, 'Inner onResponse called: NULL');
73-
$this->client->request(
74-
new Milo\Github\Http\Request('', '')
75-
);
103+
104+
$this->client->request(new Http\Request('', ''));
76105
Assert::true($onResponseCalled);
106+
107+
Assert::same(1, $this->innerClient->requestCount);
77108
}
78109

79110

80111
public function testNoCaching()
81112
{
82-
$this->innerClient->onRequest = function (Milo\Github\Http\Request $request) {
113+
$this->innerClient->onRequest = function (Http\Request $request) {
83114
Assert::false($request->hasHeader('ETag'));
84115
Assert::false($request->hasHeader('If-Modified-Since'));
85116

86-
return new Milo\Github\Http\Response(200, [], "response-{$request->getContent()}");
117+
return new Http\Response(200, [], "response-{$request->getContent()}");
87118
};
88119

89-
$response = $this->client->request(
90-
new Milo\Github\Http\Request('', '', [], '1')
91-
);
120+
$response = $this->client->request(new Http\Request('', '', [], '1'));
92121
Assert::same('response-1', $response->getContent());
122+
Assert::same(1, $this->innerClient->requestCount);
93123

94-
$response = $this->client->request(
95-
new Milo\Github\Http\Request('', '', [], '2')
96-
);
124+
$response = $this->client->request(new Http\Request('', '', [], '2'));
97125
Assert::same('response-2', $response->getContent());
126+
Assert::same(2, $this->innerClient->requestCount);
98127
}
99128

100129

101130
public function testETagCaching()
102131
{
103-
$this->innerClient->onRequest = function (Milo\Github\Http\Request $request) {
132+
$this->innerClient->onRequest = function (Http\Request $request) {
104133
Assert::false($request->hasHeader('If-None-Match'));
105134
Assert::false($request->hasHeader('If-Modified-Since'));
106135

107-
return new Milo\Github\Http\Response(200, ['ETag' => 'e-tag'], "response-{$request->getContent()}");
136+
return new Http\Response(200, ['ETag' => 'e-tag'], "response-{$request->getContent()}");
108137
};
109138

110-
$response = $this->client->request(
111-
new Milo\Github\Http\Request('', '', [], '1')
112-
);
139+
$response = $this->client->request(new Http\Request('', '', [], '1'));
113140
Assert::same('response-1', $response->getContent());
141+
Assert::same(1, $this->innerClient->requestCount);
142+
114143

115-
$this->innerClient->onRequest = function (Milo\Github\Http\Request $request) {
144+
$this->innerClient->onRequest = function (Http\Request $request) {
116145
Assert::same('e-tag', $request->getHeader('If-None-Match'));
117146
Assert::false($request->hasHeader('If-Modified-Since'));
118147

119-
return new Milo\Github\Http\Response(304, [], "response-{$request->getContent()}");
148+
return new Http\Response(304, [], "response-{$request->getContent()}");
120149
};
121-
122-
$response = $this->client->request(
123-
new Milo\Github\Http\Request('', '', [], '2')
124-
);
150+
$response = $this->client->request(new Http\Request('', '', [], '2'));
125151
Assert::same('response-1', $response->getContent());
126-
127152
Assert::type('Milo\Github\Http\Response', $response->getPrevious());
128153
Assert::same(304, $response->getPrevious()->getCode());
154+
Assert::same(2, $this->innerClient->requestCount);
129155
}
130156

131157

132158
public function testIfModifiedCaching()
133159
{
134-
$this->innerClient->onRequest = function (Milo\Github\Http\Request $request) {
160+
$this->innerClient->onRequest = function (Http\Request $request) {
135161
Assert::false($request->hasHeader('If-None-Match'));
136162
Assert::false($request->hasHeader('If-Modified-Since'));
137163

138-
return new Milo\Github\Http\Response(200, ['Last-Modified' => 'today'], "response-{$request->getContent()}");
164+
return new Http\Response(200, ['Last-Modified' => 'today'], "response-{$request->getContent()}");
139165
};
140166

141-
$response = $this->client->request(
142-
new Milo\Github\Http\Request('', '', [], '1')
143-
);
167+
$response = $this->client->request(new Http\Request('', '', [], '1'));
144168
Assert::same('response-1', $response->getContent());
169+
Assert::same(1, $this->innerClient->requestCount);
170+
145171

146-
$this->innerClient->onRequest = function (Milo\Github\Http\Request $request) {
172+
$this->innerClient->onRequest = function (Http\Request $request) {
147173
Assert::false($request->hasHeader('ETag'));
148174
Assert::same('today', $request->getHeader('If-Modified-Since'));
149175

150-
return new Milo\Github\Http\Response(304, [], "response-{$request->getContent()}");
176+
return new Http\Response(304, [], "response-{$request->getContent()}");
151177
};
152178

153-
$response = $this->client->request(
154-
new Milo\Github\Http\Request('', '', [], '2')
155-
);
179+
$response = $this->client->request(new Http\Request('', '', [], '2'));
156180
Assert::same('response-1', $response->getContent());
157-
158181
Assert::type('Milo\Github\Http\Response', $response->getPrevious());
159182
Assert::same(304, $response->getPrevious()->getCode());
183+
Assert::same(2, $this->innerClient->requestCount);
160184
}
161185

162186

163187
public function testRepeatedRequest()
164188
{
165-
$this->innerClient->onRequest = function (Milo\Github\Http\Request $request) {
166-
if ($request->hasHeader('If-None-Match')) {
167-
return new Milo\Github\Http\Response(304, [], 'inner-304');
168-
}
169-
170-
return new Milo\Github\Http\Response(200, ['ETag' => '"test"'], 'inner-200');
171-
};
172-
173-
$request = new Milo\Github\Http\Request('', '');
189+
$request = new Http\Request('', '', [], 'same');
174190

175191
# Empty cache
176192
$response = $this->client->request($request);
177-
Assert::same('inner-200', $response->getContent());
193+
Assert::same('inner-200-same', $response->getContent());
178194
Assert::null($response->getPrevious());
195+
Assert::same(1, $this->innerClient->requestCount);
179196

180197
# From cache
181198
$response = $this->client->request($request);
182-
Assert::same('inner-200', $response->getContent());
199+
Assert::same('inner-200-same', $response->getContent());
183200
Assert::type('Milo\Github\Http\Response', $response->getPrevious());
184-
Assert::same('inner-304', $response->getPrevious()->getContent());
201+
Assert::same('inner-304-same', $response->getPrevious()->getContent());
202+
Assert::same(2, $this->innerClient->requestCount);
185203

186204
# Again
187205
$response = $this->client->request($request);
188-
Assert::same('inner-200', $response->getContent());
206+
Assert::same('inner-200-same', $response->getContent());
189207
Assert::type('Milo\Github\Http\Response', $response->getPrevious());
190-
Assert::same('inner-304', $response->getPrevious()->getContent());
208+
Assert::same('inner-304-same', $response->getPrevious()->getContent());
209+
Assert::same(3, $this->innerClient->requestCount);
191210
}
192211

193212

194213
public function testForbidRecheckDisabled()
195214
{
196-
$client = new Milo\Github\Http\CachedClient(new MockCache, $this->innerClient);
197-
198-
$count = 0;
199-
$this->innerClient->onRequest = function (Milo\Github\Http\Request $request) use (& $count) {
200-
$count++;
201-
return $request->hasHeader('If-None-Match')
202-
? new Milo\Github\Http\Response(304, [], 'inner-304')
203-
: new Milo\Github\Http\Response(200, ['ETag' => '"test"'], 'inner-200');
204-
};
215+
$request = new Http\Request('', '', [], 'disabled');
205216

206-
$request = new Milo\Github\Http\Request('', '');
207-
208-
$response = $client->request($request);
209-
Assert::same(1, $count);
210-
Assert::same('inner-200', $response->getContent());
217+
$response = $this->client->request($request);
218+
Assert::same('inner-200-disabled', $response->getContent());
211219
Assert::null($response->getPrevious());
220+
Assert::same(1, $this->innerClient->requestCount);
212221

213-
$response = $client->request($request);
214-
Assert::same(2, $count);
215-
Assert::same('inner-200', $response->getContent());
222+
$response = $this->client->request($request);
223+
Assert::same('inner-200-disabled', $response->getContent());
216224
Assert::type('Milo\Github\Http\Response', $response->getPrevious());
217-
Assert::same('inner-304', $response->getPrevious()->getContent());
225+
Assert::same('inner-304-disabled', $response->getPrevious()->getContent());
226+
Assert::same(2, $this->innerClient->requestCount);
218227

219-
$response = $client->request($request);
220-
Assert::same(3, $count);
221-
Assert::same('inner-200', $response->getContent());
228+
$response = $this->client->request($request);
229+
Assert::same('inner-200-disabled', $response->getContent());
222230
Assert::type('Milo\Github\Http\Response', $response->getPrevious());
223-
Assert::same('inner-304', $response->getPrevious()->getContent());
231+
Assert::same('inner-304-disabled', $response->getPrevious()->getContent());
232+
Assert::same(3, $this->innerClient->requestCount);
224233
}
225234

226235

227236
public function testForbidRecheckEnabled()
228237
{
229-
$client = new Milo\Github\Http\CachedClient(new MockCache, $this->innerClient, TRUE);
230-
231-
$count = 0;
232-
$this->innerClient->onRequest = function (Milo\Github\Http\Request $request) use (& $count) {
233-
$count++;
234-
return $request->hasHeader('If-None-Match')
235-
? new Milo\Github\Http\Response(304, [], 'inner-304')
236-
: new Milo\Github\Http\Response(200, ['ETag' => '"test"'], 'inner-200');
237-
};
238+
$this->client = new Http\CachedClient(new MockCache, $this->innerClient, TRUE);
238239

239-
$request = new Milo\Github\Http\Request('', '');
240+
$request = new Http\Request('', '', [], 'enabled');
240241

241-
$response = $client->request($request);
242-
Assert::same(1, $count);
243-
Assert::same('inner-200', $response->getContent());
242+
$response = $this->client->request($request);
243+
Assert::same('inner-200-enabled', $response->getContent());
244244
Assert::null($response->getPrevious());
245+
Assert::same(1, $this->innerClient->requestCount);
245246

246-
$response = $client->request($request);
247-
Assert::same(1, $count);
248-
Assert::same('inner-200', $response->getContent());
247+
$response = $this->client->request($request);
248+
Assert::same('inner-200-enabled', $response->getContent());
249249
Assert::null($response->getPrevious());
250+
Assert::same(1, $this->innerClient->requestCount);
250251

251-
$response = $client->request($request);
252-
Assert::same(1, $count);
253-
Assert::same('inner-200', $response->getContent());
252+
$response = $this->client->request($request);
253+
Assert::same('inner-200-enabled', $response->getContent());
254254
Assert::null($response->getPrevious());
255+
Assert::same(1, $this->innerClient->requestCount);
255256
}
256257

257258
}

0 commit comments

Comments
 (0)