1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134:
<?php
namespace League\OAuth2\Client\Test\Tool;
use Eloquent\Phony\Phpunit\Phony;
use GuzzleHttp\ClientInterface;
use GuzzleHttp\Exception\BadResponseException;
use League\OAuth2\Client\Tool\ProviderRedirectTrait;
use PHPUnit\Framework\TestCase;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\RequestInterface;
class ProviderRedirectTraitTest extends TestCase
{
use ProviderRedirectTrait;
public function getHttpClient()
{
return $this->httpClient;
}
public function setHttpClient(ClientInterface $httpClient)
{
$this->httpClient = $httpClient;
return $this;
}
public function testRedirectLimitDefault()
{
$this->assertEquals(2, $this->getRedirectLimit());
}
public function testSetRedirectLimit()
{
$redirectLimit = rand(3, 5);
$this->setRedirectLimit($redirectLimit);
$this->assertEquals($redirectLimit, $this->getRedirectLimit());
}
public function testSetRedirectLimitThrowsExceptionWhenNonNumericProvided()
{
$redirectLimit = 'florp';
$this->setRedirectLimit($redirectLimit);
}
public function testSetRedirectLimitThrowsExceptionWhenZeroProvided()
{
$redirectLimit = 0;
$this->setRedirectLimit($redirectLimit);
}
public function testSetRedirectLimitThrowsExceptionWhenNegativeIntegerProvided()
{
$redirectLimit = -10;
$this->setRedirectLimit($redirectLimit);
}
public function testClientLimitsRedirectResponse()
{
$redirectLimit = rand(3, 5);
$status = rand(301,399);
$redirectUrl = uniqid();
$request = Phony::mock(RequestInterface::class);
$request->withUri->returns($request);
$response = Phony::mock(ResponseInterface::class);
$response->hasHeader->with('Location')->returns(true);
$response->getHeader->with('Location')->returns([$redirectUrl]);
$response->getStatusCode->returns($status);
$client = Phony::mock(ClientInterface::class);
$client->send->times($redirectLimit)->returns($response->get());
$this->setHttpClient($client->get())->setRedirectLimit($redirectLimit);
$finalResponse = $this->getResponse($request->get());
$this->assertInstanceOf(ResponseInterface::class, $finalResponse);
}
public function testClientLimitsRedirectLoopWhenRedirectNotDetected()
{
$redirectLimit = rand(3, 5);
$status = 200;
$request = Phony::mock(RequestInterface::class);
$request->withUri->returns($request);
$response = Phony::mock(ResponseInterface::class);
$response->hasHeader->with('Location')->returns(true);
$response->getStatusCode->returns($status);
$client = Phony::mock(ClientInterface::class);
$client->send->once()->returns($response->get());
$this->setHttpClient($client->get())->setRedirectLimit($redirectLimit);
$finalResponse = $this->getResponse($request->get());
$this->assertInstanceOf(ResponseInterface::class, $finalResponse);
}
public function testClientErrorReturnsResponse()
{
$status = rand(400, 500);
$result = ['foo' => 'bar'];
$request = Phony::mock(RequestInterface::class);
$request->withUri->returns($request);
$response = Phony::mock(ResponseInterface::class);
$response->getStatusCode->returns($status);
$exception = new BadResponseException('test exception', $request->get(), $response->get());
$client = Phony::mock(ClientInterface::class);
$client->send->throws($exception);
$this->setHttpClient($client->get());
$finalResponse = $this->getResponse($request->get());
$this->assertInstanceOf(ResponseInterface::class, $finalResponse);
}
}