Browse Source

Initial test for redirection handling

master
J. King 4 years ago
parent
commit
d20058c447
  1. 2
      lib/HttpClient/HttpClient.php
  2. 67
      tests/cases/HttpClientTest.php

2
lib/HttpClient/HttpClient.php

@ -54,8 +54,8 @@ class HttpClient implements RequestFactoryInterface, ClientInterface {
$request = $request->withUri($url); $request = $request->withUri($url);
if ($code === 303 && !in_array($request->getMethod(), ["GET", "HEAD"])) { if ($code === 303 && !in_array($request->getMethod(), ["GET", "HEAD"])) {
$request = $request->withMethod("GET"); $request = $request->withMethod("GET");
continue 2;
} }
continue 2;
} }
} }
return $response; return $response;

67
tests/cases/HttpClientTest.php

@ -6,14 +6,20 @@
declare(strict_types=1); declare(strict_types=1);
namespace MensBeam\Lax\TestCase; namespace MensBeam\Lax\TestCase;
use MensBeam\Lax\Url;
use MensBeam\Lax\HttpClient\HttpClient;
use MensBeam\Lax\HttpClient\Exception; use MensBeam\Lax\HttpClient\Exception;
use \Psr\Http\Message\RequestInterface;
use \Psr\Http\Message\ResponseInterface;
use \Psr\Http\Message\RequestFactoryInterface;
use \Psr\Http\Client\ClientInterface;
/** /** @covers MensBeam\Lax\HttpClient\HttpClient */
* @covers MensBeam\Lax\HttpClient\HttpClient
* @covers MensBeam\Lax\HttpClient\Exception
*/
class ParserTest extends \PHPUnit\Framework\TestCase { class ParserTest extends \PHPUnit\Framework\TestCase {
/** @dataProvider provideCodes */ /**
* @dataProvider provideCodes
* @covers MensBeam\Lax\HttpClient\Exception
*/
public function testCreateExceptions(string $symbol, int $exp): void { public function testCreateExceptions(string $symbol, int $exp): void {
$exp = new Exception("httpStatus".$exp); $exp = new Exception("httpStatus".$exp);
$act = new Exception($symbol); $act = new Exception($symbol);
@ -58,4 +64,55 @@ class ParserTest extends \PHPUnit\Framework\TestCase {
} }
yield "httpStatus000401" => ["httpStatus000401", 401]; yield "httpStatus000401" => ["httpStatus000401", 401];
} }
/** @dataProvider provideRedirections */
public function testHandleRedirections(array $responses, int $max, ?\Throwable $exc): void {
assert(sizeof($responses) > 0, "Test must have at least one response");
$client = \Phake::mock(ClientInterface::class);
$factory = \Phake::mock(RequestFactoryInterface::class);
$req = \Phake::mock(RequestInterface::class);
$res = \Phake::mock(ResponseInterface::class);
$c = new HttpClient($client, $factory);
$c->maxRedirects = $max;
\Phake::when($client)->sendRequest->thenReturn($res);
\Phake::when($factory)->createRequest->thenReturn($req);
\Phake::when($req)->withUri->thenReturn($req);
$mockCode = \Phake::when($res)->getStatusCode;
$mockLoc = \Phake::when($res)->getHeader("Location");
$mockUrl = \Phake::when($req)->getUri;
foreach ($responses as $url => [$code, $loc]) {
$mockUrl->thenReturn(new Url($url));
$mockCode = $mockCode->thenReturn($code);
$mockLoc = $mockLoc->thenReturn((array) $loc);
}
try {
if ($exc) {
$this->expectExceptionObject($exc);
$c->sendRequest($req);
} else {
$this->assertSame($res, $c->sendRequest($req));
}
} finally {
$redir = -1;
foreach ($responses as $url => [$code, $loc]) {
if ($redir++ >= $max) {
break;
}
\Phake::verify($client)->sendRequest($this->identicalTo($req));
}
}
}
public function provideRedirections(): iterable {
$err = new Exception("tooManyRedirects");
return [
[[
'http://example.com/' => [200, null],
], 0, null],
[[
'http://example.com/' => [302, "/index.html"],
'http://example.com/index.html' => [200, null],
], 0, $err],
];
}
} }
Loading…
Cancel
Save