Skip to content

Commit

Permalink
Improved coverage
Browse files Browse the repository at this point in the history
+ dedicated tests for generics
+ typo fix
  • Loading branch information
dakujem committed Nov 7, 2020
1 parent c41a7fb commit 2e97598
Show file tree
Hide file tree
Showing 6 changed files with 254 additions and 43 deletions.
2 changes: 1 addition & 1 deletion src/Factory/AuthFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,7 @@ public static function defaultDecoderFactory(string $secret): callable
if (!class_exists(JWT::class)) {
throw new LogicException(
'Firebase JWT is not installed. ' .
'Require require firebase/php-jwt package (`composer require firebase/php-jwt:"^5.0"`).'
'Requires firebase/php-jwt package (`composer require firebase/php-jwt:"^5.0"`).'
);
}
return fn(): FirebaseJwtDecoder => new FirebaseJwtDecoder($secret);
Expand Down
14 changes: 14 additions & 0 deletions tests/FactoryTest.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ use Dakujem\Middleware\Factory\AuthFactory;
use Dakujem\Middleware\Factory\AuthWizard;
use Dakujem\Middleware\GenericMiddleware;
use Dakujem\Middleware\TokenMiddleware;
use LogicException;
use Slim\Psr7\Factory\ResponseFactory;
use Tester\Assert;
use Tester\TestCase;
Expand Down Expand Up @@ -40,6 +41,19 @@ class _FactoryTest extends TestCase
Assert::type(GenericMiddleware::class, AuthWizard::assertTokens($rf));
Assert::type(GenericMiddleware::class, AuthWizard::inspectTokens($rf, fn() => null));
}

public function testThrows()
{
// no secret key for decoding
Assert::throws(fn() => AuthWizard::factory(null, new ResponseFactory())
->decodeTokens(), LogicException::class);

// no response factory for 401 responses
Assert::throws(fn() => AuthWizard::factory('a secret key what', null)
->assertTokens(), LogicException::class);
Assert::throws(fn() => AuthWizard::factory('a secret key what', null)
->inspectTokens(fn() => null), LogicException::class);
}
}

// run the test
Expand Down
94 changes: 94 additions & 0 deletions tests/GenericHandlerTest.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
<?php

declare(strict_types=1);

namespace Dakujem\Middleware\Test;

require_once __DIR__ . '/bootstrap.php';

use Dakujem\Middleware\Factory\AuthWizard;
use Dakujem\Middleware\GenericHandler;
use Dakujem\Middleware\TokenManipulators;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
use Slim\Psr7\Factory\RequestFactory;
use Slim\Psr7\Factory\ResponseFactory;
use Tester\Assert;
use Tester\TestCase;
use TypeError;

/**
* Test of GenericHandler class and associated helper.
*
* @see GenericHandler
*
* @author Andrej Rypak (dakujem) <[email protected]>
*/
class _GenericHandlerTest extends TestCase
{
public function testInterface()
{
$check = false;
$testee = new GenericHandler(function ($request) use (&$check) {
$check = true;

// assert correct arguments
Assert::type(ServerRequestInterface::class, $request);

return (new ResponseFactory())->createResponse();
});
Assert::type(RequestHandlerInterface::class, $testee);

Assert::false($check);
/** @noinspection PhpParamsInspection */
$testee->handle((new RequestFactory())->createRequest('GET', '/'));
Assert::true($check);
}

public function testHandlerDirectCall()
{
$check = false;
$testee = new GenericHandler(function ($request) use (&$check) {
$check = true;

// assert correct arguments
Assert::type(ServerRequestInterface::class, $request);

return (new ResponseFactory())->createResponse();
});

Assert::false($check);
/** @noinspection PhpParamsInspection */
$testee((new RequestFactory())->createRequest('GET', '/'));
Assert::true($check);
}

public function testHandlerWrapper()
{
$check = false;
$testee = TokenManipulators::callableToHandler(function () use (&$check) {
$check = true;
return (new ResponseFactory())->createResponse();
});
Assert::type(GenericHandler::class, $testee);
Assert::type(RequestHandlerInterface::class, $testee);

Assert::false($check);
/** @noinspection PhpParamsInspection */
$testee->handle((new RequestFactory())->createRequest('GET', '/'));
Assert::true($check);
}

/** @noinspection PhpParamsInspection */
public function testHandlerMustReturnAResponse()
{
$req = (new RequestFactory())->createRequest('GET', '/');
Assert::throws(fn() => (new GenericHandler(fn() => null))->handle($req), TypeError::class);
Assert::throws(fn() => (new GenericHandler(fn() => 42))->handle($req), TypeError::class);
Assert::throws(fn() => (new GenericHandler(fn() => 'hello world'))->handle($req), TypeError::class);
Assert::throws(fn() => (new GenericHandler(fn() => new AuthWizard()))->handle($req), TypeError::class);
}
}

// run the test
(new _GenericHandlerTest)->run();
118 changes: 118 additions & 0 deletions tests/GenericMiddlewareTest.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
<?php

declare(strict_types=1);

namespace Dakujem\Middleware\Test;

require_once __DIR__ . '/bootstrap.php';

use Dakujem\Middleware\Factory\AuthWizard;
use Dakujem\Middleware\GenericHandler;
use Dakujem\Middleware\GenericMiddleware;
use Dakujem\Middleware\TokenManipulators;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\MiddlewareInterface;
use Psr\Http\Server\RequestHandlerInterface;
use Slim\Psr7\Factory\RequestFactory;
use Slim\Psr7\Factory\ResponseFactory;
use Tester\Assert;
use Tester\TestCase;
use TypeError;

/**
* Test of GenericMiddleware class and associated helper.
*
* @see GenericMiddleware
*
* @author Andrej Rypak (dakujem) <[email protected]>
*/
class _GenericMiddlewareTest extends TestCase
{
public function testInterface()
{
$check = false;
$testee = new GenericMiddleware(function ($request, $next) use (&$check) {
$check = true;

// assert correct arguments
Assert::type(ServerRequestInterface::class, $request);
Assert::type(RequestHandlerInterface::class, $next);

return $next->handle($request);
});
Assert::type(MiddlewareInterface::class, $testee);

Assert::false($check);
/** @noinspection PhpParamsInspection */
$testee->process(
(new RequestFactory())->createRequest('GET', '/'),
new GenericHandler(fn() => (new ResponseFactory())->createResponse())
);
Assert::true($check);
}

public function testDirectCall()
{
$check = false;
$testee = new GenericMiddleware(function ($request, $next) use (&$check) {
$check = true;

// assert correct arguments
Assert::type(ServerRequestInterface::class, $request);
Assert::type(RequestHandlerInterface::class, $next);

return $next->handle($request);
});

Assert::false($check);
/** @noinspection PhpParamsInspection */
$testee(
(new RequestFactory())->createRequest('GET', '/'),
new GenericHandler(fn() => (new ResponseFactory())->createResponse())
);
Assert::true($check);

$check = false;
Assert::false($check);
/** @noinspection PhpParamsInspection */
$testee(
(new RequestFactory())->createRequest('GET', '/'),
fn() => (new ResponseFactory())->createResponse() // assert the handler is created on the fly
);
Assert::true($check);
}

public function testWrapper()
{
$check = false;
$testee = TokenManipulators::callableToMiddleware(function ($request, $next) use (&$check) {
$check = true;
return $next->handle($request);
});
Assert::type(GenericMiddleware::class, $testee);
Assert::type(MiddlewareInterface::class, $testee);

Assert::false($check);
/** @noinspection PhpParamsInspection */
$testee->process(
(new RequestFactory())->createRequest('GET', '/'),
new GenericHandler(fn() => (new ResponseFactory())->createResponse())
);
Assert::true($check);
}

/** @noinspection PhpParamsInspection */
public function testMiddlewareMustReturnAResponse()
{
$req = (new RequestFactory())->createRequest('GET', '/');
$next = new GenericHandler(fn() => (new ResponseFactory())->createResponse());
Assert::throws(fn() => (new GenericMiddleware(fn() => null))->process($req, $next), TypeError::class);
Assert::throws(fn() => (new GenericMiddleware(fn() => 42))->process($req, $next), TypeError::class);
Assert::throws(fn() => (new GenericMiddleware(fn() => 'hello world'))->process($req, $next), TypeError::class);
Assert::throws(fn() => (new GenericMiddleware(fn() => new AuthWizard()))
->process($req, $next), TypeError::class);
}
}

// run the test
(new _GenericMiddlewareTest)->run();
42 changes: 0 additions & 42 deletions tests/ManipulatorsTest.phpt

This file was deleted.

27 changes: 27 additions & 0 deletions tests/NoLibTest.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
<?php

declare(strict_types=1);

namespace Dakujem\Middleware\Test;

require_once __DIR__ . '/../vendor/nette/tester/src/bootstrap.php';
require_once __DIR__ . '/../src/Factory/AuthFactory.php';

use Dakujem\Middleware\Factory\AuthFactory;
use Dakujem\Middleware\FirebaseJwtDecoder;
use LogicException;
use Tester\Assert;

/**
* Test the behaviour when the peer lib is not installed.
*
* @see FirebaseJwtDecoder
*
* @author Andrej Rypak (dakujem) <[email protected]>
*/

Assert::throws(
fn() => AuthFactory::defaultDecoderFactory('doesntmatter'),
LogicException::class,
'Firebase JWT is not installed. Requires firebase/php-jwt package (`composer require firebase/php-jwt:"^5.0"`).'
);

0 comments on commit 2e97598

Please sign in to comment.