You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

251 lines
6.9 KiB

<?php
namespace Concat\Http\Middleware\Test;
use Concat\Http\Middleware\Logger;
use GuzzleHttp\Client;
use GuzzleHttp\Exception\RequestException;
use GuzzleHttp\HandlerStack;
use GuzzleHttp\Handler\MockHandler;
use GuzzleHttp\Promise\RejectedPromise;
use Psr\Http\Message\ResponseInterface;
use Psr\Log\LogLevel;
use Psr\Log\LoggerInterface;
use \Mockery as m;
class LoggerTest extends \PHPUnit_Framework_TestCase
{
public function tearDown()
{
m::close();
}
private function createClient($middleware, array $responses = [])
{
$handler = new MockHandler($responses);
$stack = HandlerStack::create();
if (is_array($middleware)) {
foreach ($middleware as $m) {
$stack->push($m);
}
} else {
$stack->push($middleware);
}
$stack->setHandler($handler);
return new Client(['handler' => $stack]);
}
private function createMockResponse($code)
{
$response = m::mock(ResponseInterface::class);
$response->shouldReceive('getStatusCode')->andReturn($code);
return $response;
}
private function logBehaviour($logger, $count, $level, $code, $message = "")
{
$logger->shouldReceive('log')->times($count)->with(
$level,
$message ?: "~^.+ ua - \[.+\] \"GET / HTTP/1\.1\" $code .+$~",
m::type('array')
);
}
/**
* @expectedException InvalidArgumentException
*/
public function testInvalidFormatter()
{
$logger = new Logger(m::mock(LoggerInterface::class));
$logger->setFormatter(false);
}
/**
* @expectedException InvalidArgumentException
*/
public function testInvalidLogger()
{
$logger = new Logger(false);
}
public function testLogDefaults()
{
$logger = m::mock(LoggerInterface::class);
$this->logBehaviour($logger, 1, LogLevel::INFO, 200);
$middleware = new Logger($logger);
$response = $this->createMockResponse(200);
$response->shouldReceive('getHeaderLine')->andReturn("length");
$client = $this->createClient($middleware, [$response]);
$client->get("/", [
'headers' => [
'user-agent' => 'ua',
]
]);
}
public function testRequestLogging()
{
$logger = m::mock(LoggerInterface::class);
$this->logBehaviour($logger, 1, LogLevel::INFO, "NULL");
$this->logBehaviour($logger, 1, LogLevel::INFO, 200);
$middleware = new Logger($logger);
$middleware->setRequestLoggingEnabled(true);
$response = $this->createMockResponse(200);
$response->shouldReceive('getHeaderLine')->andReturn("length");
$client = $this->createClient($middleware, [$response]);
$client->get("/", [
'headers' => [
'user-agent' => 'ua',
]
]);
}
public function testClosureFormatter()
{
$logger = m::mock(LoggerInterface::class);
$this->logBehaviour($logger, 1, LogLevel::INFO, 200, "custom");
$middleware = new Logger($logger, function () {
return "custom";
});
$response = $this->createMockResponse(200);
$response->shouldReceive('getHeaderLine')->andReturn("length");
$client = $this->createClient($middleware, [$response]);
$client->get("/", [
'headers' => [
'user-agent' => 'ua',
]
]);
}
public function testClosureLogger()
{
$middleware = new Logger(function ($level, $message, $context) {
$this->assertEquals($level, LogLevel::INFO);
$this->assertInternalType('string', $message);
$this->assertInternalType('array', $context);
});
$response = $this->createMockResponse(200);
$response->shouldReceive('getHeaderLine')->andReturn("length");
$client = $this->createClient($middleware, [$response]);
$client->get("/", [
'headers' => [
'user-agent' => 'ua',
]
]);
}
public function logLevelProvider()
{
return [
// Test explicit level
[200, "level", "level"],
// Test callback level
[200, function () { return "level"; }, "level"],
// Test default level
[200, null, LogLevel::INFO],
// Test default error level
[400, null, LogLevel::NOTICE]
];
}
/**
* @dataProvider logLevelProvider
*/
public function testLogLevel($code, $level, $expected)
{
$logger = m::mock(LoggerInterface::class);
$this->logBehaviour($logger, 1, $expected, $code);
$middleware = new Logger($logger);
//
if ($level) {
$middleware->setLogLevel($level);
}
$response = $this->createMockResponse($code);
$response->shouldReceive('getHeaderLine')->andReturn("length");
$client = $this->createClient($middleware, [$response]);
$client->get("/", [
'headers' => [ 'user-agent' => 'ua'],
'http_errors' => false,
]);
}
/**
* @expectedException GuzzleHttp\Exception\RequestException
*/
public function testFailureLog()
{
$logger = m::mock(LoggerInterface::class);
$this->logBehaviour($logger, 1, LogLevel::INFO, "NULL");
$middleware = new Logger($logger);
$response = $this->createMockResponse(400);
$rejection = function($handler) {
return function ($request, $options) {
$exception = new RequestException("", $request);
return new RejectedPromise($exception);
};
};
// Push a rejection middleware to test onRejected
$middleware = [
$middleware,
$rejection
];
$client = $this->createClient($middleware, [$response]);
$client->get("/", ['headers' => [ 'user-agent' => 'ua']]);
}
/**
* @expectedException GuzzleHttp\Exception\RequestException
*/
public function testFailureDoesNotLogTwice()
{
$logger = m::mock(LoggerInterface::class);
$this->logBehaviour($logger, 1, LogLevel::INFO, "NULL");
$middleware = new Logger($logger);
$middleware->setRequestLoggingEnabled(true);
$response = $this->createMockResponse(400);
$rejection = function($handler) {
return function ($request, $options) {
$exception = new RequestException("", $request);
return new RejectedPromise($exception);
};
};
// Push a rejection middleware to test onRejected
$middleware = [
$middleware,
$rejection
];
$client = $this->createClient($middleware, [$response]);
$client->get("/", ['headers' => [ 'user-agent' => 'ua']]);
}
}