Skip to content

Commit 05403e5

Browse files
committed
Merge pull request #5 from clue-labs/urls
Add trailing slash to base URL
2 parents 3bc96c8 + 23894a0 commit 05403e5

File tree

3 files changed

+64
-3
lines changed

3 files changed

+64
-3
lines changed

src/Client.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ public function __construct($url, Browser $browser, Parser $parser = null, Loade
3131
// 'follow_redirects' => false
3232
// ));
3333

34-
$this->url = $url;
34+
$this->url = rtrim($url, '/') . '/';
3535
$this->browser = $browser;
3636
$this->parser = $parser;
3737
$this->loader = $loader;
@@ -116,7 +116,7 @@ private function fetchXml($url)
116116

117117
private function fetch($url)
118118
{
119-
return $this->browser->get($this->url . $url)->then(
119+
return $this->browser->get($this->url . ltrim($url, '/'))->then(
120120
function (Response $response) {
121121
return (string)$response->getBody();
122122
},

tests/ClientTest.php

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
<?php
22

33
use Clue\React\ViewVcApi\Client;
4+
use Clue\React\Buzz\Message\Response;
5+
use Clue\React\Buzz\Message\Body;
46

57
class ClientTest extends TestCase
68
{
@@ -10,7 +12,7 @@ class ClientTest extends TestCase
1012

1113
public function setUp()
1214
{
13-
$this->url = 'http://viewvc.example.org/';
15+
$this->url = 'http://viewvc.example.org';
1416
$this->browser = $this->getMockBuilder('Clue\React\Buzz\Browser')->disableOriginalConstructor()->getMock();
1517
$this->client = new Client($this->url, $this->browser);
1618
}
@@ -26,4 +28,24 @@ public function testInvalidFile()
2628
$promise = $this->client->fetchFile('invalid/');
2729
$this->expectPromiseReject($promise);
2830
}
31+
32+
public function testFetchFile()
33+
{
34+
$response = new Response('HTTP/1.0', 200, 'OK', null, new Body('# hello'));
35+
$this->browser->expects($this->once())->method('get')->with($this->equalTo('http://viewvc.example.org/README.md?view=co'))->will($this->returnValue($this->createPromiseResolved($response)));
36+
37+
$promise = $this->client->fetchFile('README.md');
38+
39+
$this->expectPromiseResolveWith('# hello', $promise);
40+
}
41+
42+
public function testFetchFileExcessiveSlashesAreIgnored()
43+
{
44+
$this->browser->expects($this->once())->method('get')->with($this->equalTo('http://viewvc.example.org/README.md?view=co'))->will($this->returnValue($this->createPromiseRejected()));
45+
46+
$client = new Client($this->url . '/', $this->browser);
47+
$promise = $client->fetchFile('/README.md');
48+
49+
$this->expectPromiseReject($promise);
50+
}
2951
}

tests/bootstrap.php

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
<?php
22

3+
use React\Promise\Deferred;
4+
35
require __DIR__ . '/../vendor/autoload.php';
46

57
class TestCase extends PHPUnit_Framework_TestCase
@@ -15,6 +17,18 @@ protected function expectCallableOnce()
1517
return $mock;
1618
}
1719

20+
protected function expectCallableOnceWith($value)
21+
{
22+
$mock = $this->createCallableMock();
23+
24+
$mock
25+
->expects($this->once())
26+
->method('__invoke')
27+
->with($this->equalTo($value));
28+
29+
return $mock;
30+
}
31+
1832
protected function expectCallableNever()
1933
{
2034
$mock = $this->createCallableMock();
@@ -42,6 +56,15 @@ protected function expectPromiseResolve($promise)
4256
return $promise;
4357
}
4458

59+
protected function expectPromiseResolveWith($value, $promise)
60+
{
61+
$this->assertInstanceOf('React\Promise\PromiseInterface', $promise);
62+
63+
$promise->then($this->expectCallableOnceWith($value), $this->expectCallableNever());
64+
65+
return $promise;
66+
}
67+
4568
protected function expectPromiseReject($promise)
4669
{
4770
$this->assertInstanceOf('React\Promise\PromiseInterface', $promise);
@@ -50,6 +73,22 @@ protected function expectPromiseReject($promise)
5073

5174
return $promise;
5275
}
76+
77+
protected function createPromiseResolved($value = null)
78+
{
79+
$deferred = new Deferred();
80+
$deferred->resolve($value);
81+
82+
return $deferred->promise();
83+
}
84+
85+
protected function createPromiseRejected($value = null)
86+
{
87+
$deferred = new Deferred();
88+
$deferred->reject($value);
89+
90+
return $deferred->promise();
91+
}
5392
}
5493

5594
class CallableStub

0 commit comments

Comments
 (0)