Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 14 additions & 16 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ jobs:

strategy:
matrix:
php: [8.0]
php: [8.2]

steps:
- name: Checkout code
Expand All @@ -20,24 +20,22 @@ jobs:
php-version: ${{ matrix.php }}
coverage: none

- name: Checkout Mezzio Sample
uses: actions/checkout@v2
with:
repository: Naktibalda/codeception-mezzio-tests
path: framework-tests
ref: '5.0'
submodules: recursive

- name: Install Mezzio Sample
run: composer update --no-dev --prefer-dist --no-interaction
working-directory: framework-tests
run: composer create-project mezzio/mezzio-skeleton --prefer-dist --no-interaction framework-tests

- name: Copy The Tests/Site
run: cp -rf src-test/{src,templates,test,tests,codeception.yml} framework-tests/

- name: Validate composer.json and composer.lock
run: composer validate
- name: Copy The Config
run: cp -f src-test/config/routes.php framework-tests/config/

- name: Install dependencies
run: composer update --prefer-dist --no-progress --no-interaction --no-suggest
- name: Remove The Default
run: composer remove mezzio/mezzio-fastroute
working-directory: framework-tests

- name: Install The Dependencies
run: composer require -n mezzio/mezzio-laminasrouter mezzio/mezzio-laminasviewrenderer:^2 mezzio/mezzio-session-ext -n
working-directory: framework-tests

- name: Run test suite
run: php vendor/bin/codecept run functional -c framework-tests
run: php -d register_argc_argv=On vendor/bin/codecept run functional -c framework-tests
4 changes: 2 additions & 2 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,9 @@
"php": "^8.0",
"codeception/lib-innerbrowser": "^3.0 | ^4.0",
"codeception/codeception": "^5.0.8",
"container-interop/container-interop": "^1.2",
"laminas/laminas-diactoros": "^2.0 || ^3.0",
"mezzio/mezzio": "^3.0"
"mezzio/mezzio": "^3.0",
"psr/container": "^1|^2"
},
"require-dev": {
"codeception/module-rest": "^3.3"
Expand Down
19 changes: 19 additions & 0 deletions src-test/codeception.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
actor: Tester
bootstrap: _bootstrap.php
paths:
tests: tests
log: tests/_output
data: tests/_data
support: tests/_support
envs: tests/_envs
output: tests/_output
settings:
colors: true
memory_limit: 1024M
modules:
config:
Db:
dsn: ''
user: ''
password: ''
dump: tests/_data/dump.sql
44 changes: 44 additions & 0 deletions src-test/config/routes.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
<?php

declare(strict_types=1);

use Mezzio\Application;
use Mezzio\MiddlewareFactory;
use Psr\Container\ContainerInterface;

/**
* Setup routes with a single request method:
*
* $app->get('/', App\Handler\HomePageHandler::class, 'home');
* $app->post('/album', App\Handler\AlbumCreateHandler::class, 'album.create');
* $app->put('/album/:id', App\Handler\AlbumUpdateHandler::class, 'album.put');
* $app->patch('/album/:id', App\Handler\AlbumUpdateHandler::class, 'album.patch');
* $app->delete('/album/:id', App\Handler\AlbumDeleteHandler::class, 'album.delete');
*
* Or with multiple request methods:
*
* $app->route('/contact', App\Handler\ContactHandler::class, ['GET', 'POST', ...], 'contact');
*
* Or handling all request methods:
*
* $app->route('/contact', App\Handler\ContactHandler::class)->setName('contact');
*
* or:
*
* $app->route(
* '/contact',
* App\Handler\ContactHandler::class,
* Mezzio\Router\Route::HTTP_METHOD_ANY,
* 'contact'
* );
*/
return function (Application $app, MiddlewareFactory $factory, ContainerInterface $container) : void {
$app->get('/', App\Handler\HomePageHandler::class, 'home');
$app->get('/api/ping', App\Handler\PingHandler::class, 'api.ping');
$app->route('/rest', App\Handler\RestHandler::class, ['GET', 'POST', 'PUT', 'DELETE'], 'rest');

$app->get('/session/:action', [
Mezzio\Session\SessionMiddleware::class,
App\Handler\SessionHandler::class,
], 'session.test');
};
59 changes: 59 additions & 0 deletions src-test/src/App/ConfigProvider.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
<?php

declare(strict_types=1);

namespace App;

/**
* The configuration provider for the App module
*
* @see https://docs.laminas.dev/laminas-component-installer/
*/
class ConfigProvider
{
/**
* Returns the configuration array
*
* To add a bit of a structure, each section is defined in a separate
* method which returns an array with its configuration.
*
*/
public function __invoke() : array
{
return [
'dependencies' => $this->getDependencies(),
'templates' => $this->getTemplates(),
];
}

/**
* Returns the container dependencies
*/
public function getDependencies() : array
{
return [
'invokables' => [
Handler\PingHandler::class => Handler\PingHandler::class,
Handler\RestHandler::class => Handler\RestHandler::class,
Handler\SessionHandler::class => Handler\SessionHandler::class,
],
'factories' => [
Handler\HomePageHandler::class => Handler\HomePageHandlerFactory::class,
],
];
}

/**
* Returns the templates configuration
*/
public function getTemplates() : array
{
return [
'paths' => [
'app' => ['templates/app'],
'error' => ['templates/error'],
'layout' => ['templates/layout'],
],
];
}
}
102 changes: 102 additions & 0 deletions src-test/src/App/Handler/HomePageHandler.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
<?php

declare(strict_types=1);

namespace App\Handler;

use Laminas\Diactoros\Response\HtmlResponse;
use Laminas\Diactoros\Response\JsonResponse;
use Mezzio\LaminasView\LaminasViewRenderer;
use Mezzio\Plates\PlatesRenderer;
use Mezzio\Router;
use Mezzio\Template\TemplateRendererInterface;
use Mezzio\Twig\TwigRenderer;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;

class HomePageHandler implements RequestHandlerInterface
{
/** @var string */
private $containerName;

/** @var Router\RouterInterface */
private $router;

/** @var null|TemplateRendererInterface */
private $template;

public function __construct(
string $containerName,
Router\RouterInterface $router,
?TemplateRendererInterface $template = null
) {
$this->containerName = $containerName;
$this->router = $router;
$this->template = $template;
}

public function handle(ServerRequestInterface $request) : ResponseInterface
{
if ($this->template === null) {
return new JsonResponse([
'welcome' => 'Congratulations! You have installed the mezzio skeleton application.',
'docsUrl' => 'https://docs.mezzio.dev/mezzio/',
]);
}

$data = [];

switch ($this->containerName) {
case 'Aura\Di\Container':
$data['containerName'] = 'Aura.Di';
$data['containerDocs'] = 'http://auraphp.com/packages/2.x/Di.html';
break;
case 'Pimple\Container':
$data['containerName'] = 'Pimple';
$data['containerDocs'] = 'https://pimple.symfony.com/';
break;
case 'Laminas\ServiceManager\ServiceManager':
$data['containerName'] = 'Laminas Servicemanager';
$data['containerDocs'] = 'https://docs.laminas.dev/laminas-servicemanager/';
break;
case 'Auryn\Injector':
$data['containerName'] = 'Auryn';
$data['containerDocs'] = 'https://github.com/rdlowrey/Auryn';
break;
case 'Symfony\Component\DependencyInjection\ContainerBuilder':
$data['containerName'] = 'Symfony DI Container';
$data['containerDocs'] = 'https://symfony.com/doc/current/service_container.html';
break;
case 'Zend\DI\Config\ContainerWrapper':
case 'DI\Container':
$data['containerName'] = 'PHP-DI';
$data['containerDocs'] = 'http://php-di.org';
break;
}

if ($this->router instanceof Router\AuraRouter) {
$data['routerName'] = 'Aura.Router';
$data['routerDocs'] = 'http://auraphp.com/packages/2.x/Router.html';
} elseif ($this->router instanceof Router\FastRouteRouter) {
$data['routerName'] = 'FastRoute';
$data['routerDocs'] = 'https://github.com/nikic/FastRoute';
} elseif ($this->router instanceof Router\LaminasRouter) {
$data['routerName'] = 'Laminas Router';
$data['routerDocs'] = 'https://docs.laminas.dev/laminas-router/';
}

if ($this->template instanceof PlatesRenderer) {
$data['templateName'] = 'Plates';
$data['templateDocs'] = 'http://platesphp.com/';
} elseif ($this->template instanceof TwigRenderer) {
$data['templateName'] = 'Twig';
$data['templateDocs'] = 'http://twig.sensiolabs.org/documentation';
} elseif ($this->template instanceof LaminasViewRenderer) {
$data['templateName'] = 'Laminas View';
$data['templateDocs'] = 'https://docs.laminas.dev/laminas-view/';
}

return new HtmlResponse($this->template->render('app::home-page', $data));
}
}
27 changes: 27 additions & 0 deletions src-test/src/App/Handler/HomePageHandlerFactory.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
<?php

declare(strict_types=1);

namespace App\Handler;

use Mezzio\Router\RouterInterface;
use Mezzio\Template\TemplateRendererInterface;
use Psr\Container\ContainerInterface;
use Psr\Http\Server\RequestHandlerInterface;

use function get_class;

class HomePageHandlerFactory
{
public function __invoke(ContainerInterface $container) : RequestHandlerInterface
{
$router = $container->get(RouterInterface::class);
$template = $container->has(TemplateRendererInterface::class)
? $container->get(TemplateRendererInterface::class)
: ($container->has(\Zend\Expressive\Template\TemplateRendererInterface::class)
? $container->get(\Zend\Expressive\Template\TemplateRendererInterface::class)
: null);

return new HomePageHandler(get_class($container), $router, $template);
}
}
20 changes: 20 additions & 0 deletions src-test/src/App/Handler/PingHandler.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<?php

declare(strict_types=1);

namespace App\Handler;

use Laminas\Diactoros\Response\JsonResponse;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;

use function time;

class PingHandler implements RequestHandlerInterface
{
public function handle(ServerRequestInterface $request) : ResponseInterface
{
return new JsonResponse(['ack' => time()]);
}
}
58 changes: 58 additions & 0 deletions src-test/src/App/Handler/RestHandler.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
<?php

declare(strict_types=1);

namespace App\Handler;

use Laminas\Diactoros\Response\JsonResponse;
use Laminas\Diactoros\UploadedFile;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
use Codeception\Util\ReflectionHelper;

class RestHandler implements RequestHandlerInterface
{
public function handle(ServerRequestInterface $request) : ResponseInterface
{
$tokenHeader = $request->getHeader('X-Auth-Token');
if (count($tokenHeader) > 0) {
$tokenHeaderValue = $tokenHeader[0];
} else {
$tokenHeaderValue = null;
}
$data = array(
'requestMethod' => $request->getMethod(),
'requestUri' => $request->getRequestTarget(),
'queryParams' => $request->getQueryParams(),
'formParams' => $request->getParsedBody(),
'rawBody' => (string)$request->getBody(),
'headers' => $request->getHeaders(),
'X-Auth-Token' => $tokenHeaderValue,
'files' => $this->filesToArray($request->getUploadedFiles()),
);
return new JsonResponse($data);
}

private function filesToArray(array $files)
{
$result = [];
foreach ($files as $fieldName => $uploadedFile) {
/**
* @var $uploadedFile UploadedFile|array
*/
if (is_array($uploadedFile)) {
$result[$fieldName] = $this->filesToArray($uploadedFile);
} else {
$result[$fieldName] = [
'name' => $uploadedFile->getClientFilename(),
'tmp_name' => ReflectionHelper::readPrivateProperty($uploadedFile, 'file'),
'size' => $uploadedFile->getSize(),
'type' => $uploadedFile->getClientMediaType(),
'error' => $uploadedFile->getError(),
];
}
}
return $result;
}
}
Loading
Loading