NEW: Refactor to provide unit tests for session check.

This commit is contained in:
Frank Mullenger 2019-03-20 09:38:58 +13:00
parent 2674beb94a
commit 578c73e6ce
5 changed files with 160 additions and 37 deletions

View File

@ -22,3 +22,11 @@ SilverStripe\Core\Injector\Injector:
class: SilverStripe\EnvironmentCheck\Checks\SolrIndexCheck
URLCheck:
class: SilverStripe\EnvironmentCheck\Checks\URLCheck
EnvCheckClient:
factory: 'SilverStripe\EnvironmentCheck\Services\ClientFactory'
constructor:
timeout: 10.0
SilverStripe\EnvironmentCheck\Checks\SessionCheck:
dependencies:
client: '%$EnvCheckClient'

View File

@ -2,10 +2,7 @@
namespace SilverStripe\EnvironmentCheck\Checks;
use SilverStripe\Control\Director;
use SilverStripe\Control\Controller;
use Psr\Http\Message\ResponseInterface;
use SilverStripe\Core\Config\Configurable;
use SilverStripe\EnvironmentCheck\Traits\Fetcher;
use SilverStripe\EnvironmentCheck\EnvironmentCheck;
@ -17,16 +14,8 @@ use SilverStripe\EnvironmentCheck\EnvironmentCheck;
*/
class SessionCheck implements EnvironmentCheck
{
use Configurable;
use Fetcher;
/**
* URL to check
*
* @var string
*/
protected $url;
/**
* Set up check with URL
*
@ -35,11 +24,7 @@ class SessionCheck implements EnvironmentCheck
*/
public function __construct($url = '')
{
$this->url = $url;
$this->clientConfig = [
'base_uri' => Director::absoluteBaseURL(),
'timeout' => 10.0,
];
$this->setURL($url);
}
/**
@ -49,9 +34,9 @@ class SessionCheck implements EnvironmentCheck
*/
public function check()
{
$response = $this->fetchResponse($this->url);
$response = $this->client->get($this->getURL());
$cookie = $this->getCookie($response);
$fullURL = Controller::join_links(Director::absoluteBaseURL(), $this->url);
$fullURL = $this->getURL();
if ($cookie) {
return [

View File

@ -0,0 +1,49 @@
<?php
namespace SilverStripe\EnvironmentCheck\Services;
use GuzzleHttp\Client as GuzzleClient;
use SilverStripe\Core\Injector\Factory;
use SilverStripe\Core\Config\Configurable;
/**
* Factory class for creating HTTP client which are injected into some env check classes. Inject via YAML,
* arguments for Guzzle client can be supplied using "constructor" property or set as default_config.
*
* @see SilverStripe\EnvironmentCheck\Traits\Fetcher
*/
class ClientFactory implements Factory
{
use Configurable;
/**
* Default config for Guzzle client.
*
* @var array
*/
private static $default_config = [];
/**
* Wrapper to create a Guzzle client.
*
* {@inheritdoc}
*/
public function create($service, array $params = [])
{
return new GuzzleClient($this->getConfig($params));
}
/**
* Merge config provided from yaml with default config
*
* @param array $overrides
* @return array
*/
public function getConfig(array $overrides)
{
return array_merge(
$this->config()->get('default_config'),
$overrides
);
}
}

View File

@ -2,45 +2,50 @@
namespace SilverStripe\EnvironmentCheck\Traits;
use GuzzleHttp\Client;
use Psr\Http\Message\ResponseInterface;
use SilverStripe\Control\Director;
/**
* Simple helper for fetching responses using Guzzle client.
* Simple helper for env checks which require HTTP clients.
*
* @package environmentcheck
*/
trait Fetcher
{
/**
* Configuration for the Guzzle client
* Client for making requests, set vi Injector.
*
* @var array
* @see SilverStripe\EnvironmentCheck\Services
*
* @var GuzzleHttp\Client
*/
protected $clientConfig = [];
public $client = null;
/**
* Merges configuration arrays and returns the result
* Absolute URL for requests.
*
* @param array $extraConfig
* @return array
* @var string
*/
private function getClientConfig(array $extraConfig = [])
protected $url;
/**
* Set URL for requests.
*
* @param string $url Relative URL
* @return self
*/
public function setURL($url)
{
return array_merge($this->clientConfig, $extraConfig);
$this->url = Director::absoluteURL($url);
return $this;
}
/**
* Fetch a response for a URL using Guzzle client.
* Getter for URL
*
* @param string $url
* @param array|null $extraConfig Extra configuration
* @return ResponseInterface
* @return string
*/
public function fetchResponse(string $url, array $extraConfig = [])
public function getURL()
{
$config = $this->getClientConfig($extraConfig);
$client = new Client($config);
return $client->get($url);
return $this->url;
}
}

View File

@ -0,0 +1,76 @@
<?php
namespace SilverStripe\EnvironmentCheck\Tests\Checks;
use GuzzleHttp\Client;
use GuzzleHttp\HandlerStack;
use GuzzleHttp\Psr7\Response;
use SilverStripe\Dev\SapphireTest;
use GuzzleHttp\Handler\MockHandler;
use SilverStripe\EnvironmentCheck\EnvironmentCheck;
use SilverStripe\EnvironmentCheck\Checks\SessionCheck;
/**
* Test session checks.
*/
class SessionCheckTest extends SapphireTest
{
/**
* @var SilverStripe\EnvironmentCheck\Checks\SessionCheck
*/
public $sessionCheck = null;
/**
* Create a session check for use by tests.
*
* @return void
*/
protected function setUp()
{
parent::setUp();
$this->sessionCheck = new SessionCheck('/');
}
/**
* Env check reports error when session cookies are being set.
*
* @return void
*/
public function testSessionSet()
{
// Create a mock and queue two responses.
$mock = new MockHandler([
new Response(200, ['Set-Cookie' => 'PHPSESSID:foo']),
new Response(200, ['Set-Cookie' => 'SECSESSID:bar'])
]);
$handler = HandlerStack::create($mock);
$client = new Client(['handler' => $handler]);
$this->sessionCheck->client = $client;
// Check for PHPSESSID
$this->assertContains(EnvironmentCheck::ERROR, $this->sessionCheck->check());
// Check for SECSESSID
$this->assertContains(EnvironmentCheck::ERROR, $this->sessionCheck->check());
}
/**
* Env check responds OK when no session cookies are set in response.
*
* @return void
*/
public function testSessionNotSet()
{
// Create a mock and queue two responses.
$mock = new MockHandler([
new Response(200)
]);
$handler = HandlerStack::create($mock);
$client = new Client(['handler' => $handler]);
$this->sessionCheck->client = $client;
$this->assertContains(EnvironmentCheck::OK, $this->sessionCheck->check());
}
}