Skip to content

Commit d09f494

Browse files
committed
Include actual tests in the project
1 parent ca7c01e commit d09f494

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

54 files changed

+1217
-7
lines changed

.github/workflows/main.yml

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -29,15 +29,21 @@ jobs:
2929
submodules: recursive
3030

3131
- name: Install Mezzio Sample
32-
run: composer update --no-dev --prefer-dist --no-interaction
33-
working-directory: framework-tests
32+
run: composer create-project mezzio/mezzio-skeleton --prefer-dist --no-interaction framework-tests
33+
34+
- name: Copy The Tests/Site
35+
run: cp -rf src-test/{src,templates,test,tests,codeception.yml} framework-tests/
3436

37+
- name: Copy The Config
38+
run: cp -f src-test/config/routes.php framework-tests/config/
3539

36-
- name: Validate composer.json and composer.lock
37-
run: composer validate
40+
- name: Remove The Default
41+
run: composer remove mezzio/mezzio-fastroute
42+
working-directory: framework-tests
3843

39-
- name: Install dependencies
40-
run: composer update --prefer-dist --no-progress --no-interaction --no-suggest
44+
- name: Install The Dependencies
45+
run: composer require -n mezzio/mezzio-laminasrouter mezzio/mezzio-laminasviewrenderer:^2 mezzio/mezzio-session-ext -n
46+
working-directory: framework-tests
4147

4248
- name: Run test suite
43-
run: php vendor/bin/codecept run functional -c framework-tests
49+
run: php -d register_argc_argv=On vendor/bin/codecept run functional -c framework-tests

src-test/codeception.yml

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
actor: Tester
2+
bootstrap: _bootstrap.php
3+
paths:
4+
tests: tests
5+
log: tests/_output
6+
data: tests/_data
7+
support: tests/_support
8+
envs: tests/_envs
9+
output: tests/_output
10+
settings:
11+
colors: true
12+
memory_limit: 1024M
13+
modules:
14+
config:
15+
Db:
16+
dsn: ''
17+
user: ''
18+
password: ''
19+
dump: tests/_data/dump.sql

src-test/config/routes.php

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
use Mezzio\Application;
6+
use Mezzio\MiddlewareFactory;
7+
use Psr\Container\ContainerInterface;
8+
9+
/**
10+
* Setup routes with a single request method:
11+
*
12+
* $app->get('/', App\Handler\HomePageHandler::class, 'home');
13+
* $app->post('/album', App\Handler\AlbumCreateHandler::class, 'album.create');
14+
* $app->put('/album/:id', App\Handler\AlbumUpdateHandler::class, 'album.put');
15+
* $app->patch('/album/:id', App\Handler\AlbumUpdateHandler::class, 'album.patch');
16+
* $app->delete('/album/:id', App\Handler\AlbumDeleteHandler::class, 'album.delete');
17+
*
18+
* Or with multiple request methods:
19+
*
20+
* $app->route('/contact', App\Handler\ContactHandler::class, ['GET', 'POST', ...], 'contact');
21+
*
22+
* Or handling all request methods:
23+
*
24+
* $app->route('/contact', App\Handler\ContactHandler::class)->setName('contact');
25+
*
26+
* or:
27+
*
28+
* $app->route(
29+
* '/contact',
30+
* App\Handler\ContactHandler::class,
31+
* Mezzio\Router\Route::HTTP_METHOD_ANY,
32+
* 'contact'
33+
* );
34+
*/
35+
return function (Application $app, MiddlewareFactory $factory, ContainerInterface $container) : void {
36+
$app->get('/', App\Handler\HomePageHandler::class, 'home');
37+
$app->get('/api/ping', App\Handler\PingHandler::class, 'api.ping');
38+
$app->route('/rest', App\Handler\RestHandler::class, ['GET', 'POST', 'PUT', 'DELETE'], 'rest');
39+
40+
$app->get('/session/:action', [
41+
Mezzio\Session\SessionMiddleware::class,
42+
App\Handler\SessionHandler::class,
43+
], 'session.test');
44+
};
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace App;
6+
7+
/**
8+
* The configuration provider for the App module
9+
*
10+
* @see https://docs.laminas.dev/laminas-component-installer/
11+
*/
12+
class ConfigProvider
13+
{
14+
/**
15+
* Returns the configuration array
16+
*
17+
* To add a bit of a structure, each section is defined in a separate
18+
* method which returns an array with its configuration.
19+
*
20+
*/
21+
public function __invoke() : array
22+
{
23+
return [
24+
'dependencies' => $this->getDependencies(),
25+
'templates' => $this->getTemplates(),
26+
];
27+
}
28+
29+
/**
30+
* Returns the container dependencies
31+
*/
32+
public function getDependencies() : array
33+
{
34+
return [
35+
'invokables' => [
36+
Handler\PingHandler::class => Handler\PingHandler::class,
37+
Handler\RestHandler::class => Handler\RestHandler::class,
38+
Handler\SessionHandler::class => Handler\SessionHandler::class,
39+
],
40+
'factories' => [
41+
Handler\HomePageHandler::class => Handler\HomePageHandlerFactory::class,
42+
],
43+
];
44+
}
45+
46+
/**
47+
* Returns the templates configuration
48+
*/
49+
public function getTemplates() : array
50+
{
51+
return [
52+
'paths' => [
53+
'app' => ['templates/app'],
54+
'error' => ['templates/error'],
55+
'layout' => ['templates/layout'],
56+
],
57+
];
58+
}
59+
}
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace App\Handler;
6+
7+
use Laminas\Diactoros\Response\HtmlResponse;
8+
use Laminas\Diactoros\Response\JsonResponse;
9+
use Mezzio\LaminasView\LaminasViewRenderer;
10+
use Mezzio\Plates\PlatesRenderer;
11+
use Mezzio\Router;
12+
use Mezzio\Template\TemplateRendererInterface;
13+
use Mezzio\Twig\TwigRenderer;
14+
use Psr\Http\Message\ResponseInterface;
15+
use Psr\Http\Message\ServerRequestInterface;
16+
use Psr\Http\Server\RequestHandlerInterface;
17+
18+
class HomePageHandler implements RequestHandlerInterface
19+
{
20+
/** @var string */
21+
private $containerName;
22+
23+
/** @var Router\RouterInterface */
24+
private $router;
25+
26+
/** @var null|TemplateRendererInterface */
27+
private $template;
28+
29+
public function __construct(
30+
string $containerName,
31+
Router\RouterInterface $router,
32+
?TemplateRendererInterface $template = null
33+
) {
34+
$this->containerName = $containerName;
35+
$this->router = $router;
36+
$this->template = $template;
37+
}
38+
39+
public function handle(ServerRequestInterface $request) : ResponseInterface
40+
{
41+
if ($this->template === null) {
42+
return new JsonResponse([
43+
'welcome' => 'Congratulations! You have installed the mezzio skeleton application.',
44+
'docsUrl' => 'https://docs.mezzio.dev/mezzio/',
45+
]);
46+
}
47+
48+
$data = [];
49+
50+
switch ($this->containerName) {
51+
case 'Aura\Di\Container':
52+
$data['containerName'] = 'Aura.Di';
53+
$data['containerDocs'] = 'http://auraphp.com/packages/2.x/Di.html';
54+
break;
55+
case 'Pimple\Container':
56+
$data['containerName'] = 'Pimple';
57+
$data['containerDocs'] = 'https://pimple.symfony.com/';
58+
break;
59+
case 'Laminas\ServiceManager\ServiceManager':
60+
$data['containerName'] = 'Laminas Servicemanager';
61+
$data['containerDocs'] = 'https://docs.laminas.dev/laminas-servicemanager/';
62+
break;
63+
case 'Auryn\Injector':
64+
$data['containerName'] = 'Auryn';
65+
$data['containerDocs'] = 'https://github.com/rdlowrey/Auryn';
66+
break;
67+
case 'Symfony\Component\DependencyInjection\ContainerBuilder':
68+
$data['containerName'] = 'Symfony DI Container';
69+
$data['containerDocs'] = 'https://symfony.com/doc/current/service_container.html';
70+
break;
71+
case 'Zend\DI\Config\ContainerWrapper':
72+
case 'DI\Container':
73+
$data['containerName'] = 'PHP-DI';
74+
$data['containerDocs'] = 'http://php-di.org';
75+
break;
76+
}
77+
78+
if ($this->router instanceof Router\AuraRouter) {
79+
$data['routerName'] = 'Aura.Router';
80+
$data['routerDocs'] = 'http://auraphp.com/packages/2.x/Router.html';
81+
} elseif ($this->router instanceof Router\FastRouteRouter) {
82+
$data['routerName'] = 'FastRoute';
83+
$data['routerDocs'] = 'https://github.com/nikic/FastRoute';
84+
} elseif ($this->router instanceof Router\LaminasRouter) {
85+
$data['routerName'] = 'Laminas Router';
86+
$data['routerDocs'] = 'https://docs.laminas.dev/laminas-router/';
87+
}
88+
89+
if ($this->template instanceof PlatesRenderer) {
90+
$data['templateName'] = 'Plates';
91+
$data['templateDocs'] = 'http://platesphp.com/';
92+
} elseif ($this->template instanceof TwigRenderer) {
93+
$data['templateName'] = 'Twig';
94+
$data['templateDocs'] = 'http://twig.sensiolabs.org/documentation';
95+
} elseif ($this->template instanceof LaminasViewRenderer) {
96+
$data['templateName'] = 'Laminas View';
97+
$data['templateDocs'] = 'https://docs.laminas.dev/laminas-view/';
98+
}
99+
100+
return new HtmlResponse($this->template->render('app::home-page', $data));
101+
}
102+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace App\Handler;
6+
7+
use Mezzio\Router\RouterInterface;
8+
use Mezzio\Template\TemplateRendererInterface;
9+
use Psr\Container\ContainerInterface;
10+
use Psr\Http\Server\RequestHandlerInterface;
11+
12+
use function get_class;
13+
14+
class HomePageHandlerFactory
15+
{
16+
public function __invoke(ContainerInterface $container) : RequestHandlerInterface
17+
{
18+
$router = $container->get(RouterInterface::class);
19+
$template = $container->has(TemplateRendererInterface::class)
20+
? $container->get(TemplateRendererInterface::class)
21+
: ($container->has(\Zend\Expressive\Template\TemplateRendererInterface::class)
22+
? $container->get(\Zend\Expressive\Template\TemplateRendererInterface::class)
23+
: null);
24+
25+
return new HomePageHandler(get_class($container), $router, $template);
26+
}
27+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace App\Handler;
6+
7+
use Laminas\Diactoros\Response\JsonResponse;
8+
use Psr\Http\Message\ResponseInterface;
9+
use Psr\Http\Message\ServerRequestInterface;
10+
use Psr\Http\Server\RequestHandlerInterface;
11+
12+
use function time;
13+
14+
class PingHandler implements RequestHandlerInterface
15+
{
16+
public function handle(ServerRequestInterface $request) : ResponseInterface
17+
{
18+
return new JsonResponse(['ack' => time()]);
19+
}
20+
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace App\Handler;
6+
7+
use Laminas\Diactoros\Response\JsonResponse;
8+
use Laminas\Diactoros\UploadedFile;
9+
use Psr\Http\Message\ResponseInterface;
10+
use Psr\Http\Message\ServerRequestInterface;
11+
use Psr\Http\Server\RequestHandlerInterface;
12+
use Codeception\Util\ReflectionHelper;
13+
14+
class RestHandler implements RequestHandlerInterface
15+
{
16+
public function handle(ServerRequestInterface $request) : ResponseInterface
17+
{
18+
$tokenHeader = $request->getHeader('X-Auth-Token');
19+
if (count($tokenHeader) > 0) {
20+
$tokenHeaderValue = $tokenHeader[0];
21+
} else {
22+
$tokenHeaderValue = null;
23+
}
24+
$data = array(
25+
'requestMethod' => $request->getMethod(),
26+
'requestUri' => $request->getRequestTarget(),
27+
'queryParams' => $request->getQueryParams(),
28+
'formParams' => $request->getParsedBody(),
29+
'rawBody' => (string)$request->getBody(),
30+
'headers' => $request->getHeaders(),
31+
'X-Auth-Token' => $tokenHeaderValue,
32+
'files' => $this->filesToArray($request->getUploadedFiles()),
33+
);
34+
return new JsonResponse($data);
35+
}
36+
37+
private function filesToArray(array $files)
38+
{
39+
$result = [];
40+
foreach ($files as $fieldName => $uploadedFile) {
41+
/**
42+
* @var $uploadedFile UploadedFile|array
43+
*/
44+
if (is_array($uploadedFile)) {
45+
$result[$fieldName] = $this->filesToArray($uploadedFile);
46+
} else {
47+
$result[$fieldName] = [
48+
'name' => $uploadedFile->getClientFilename(),
49+
'tmp_name' => ReflectionHelper::readPrivateProperty($uploadedFile, 'file'),
50+
'size' => $uploadedFile->getSize(),
51+
'type' => $uploadedFile->getClientMediaType(),
52+
'error' => $uploadedFile->getError(),
53+
];
54+
}
55+
}
56+
return $result;
57+
}
58+
}

0 commit comments

Comments
 (0)