Skip to content
Merged
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
4 changes: 2 additions & 2 deletions src/App/Adapters/WebAppAdapter.php
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
use Quantum\App\Exceptions\BaseException;
use Quantum\App\Stages\InitDebuggerStage;
use Quantum\Middleware\MiddlewareManager;
use Quantum\App\Stages\LoadModulesStage;
use Quantum\App\Stages\LoadHelpersStage;
use Quantum\Di\Exceptions\DiException;
use Quantum\App\Stages\InitHttpStage;
Expand Down Expand Up @@ -59,6 +60,7 @@ public function __construct(AppContext $context)
new SetupErrorHandlerStage(),
new InitHttpStage(),
new InitDebuggerStage(),
new LoadModulesStage(),
]);

$pipeline->run($this->context);
Expand All @@ -75,8 +77,6 @@ public function start(): ?int
return ExitCode::SUCCESS;
}

$this->loadModules();

$matchedRoute = $this->resolveRoute();

if ($matchedRoute === null) {
Expand Down
56 changes: 56 additions & 0 deletions src/App/Stages/LoadModulesStage.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
<?php

declare(strict_types=1);

/**
* Quantum PHP Framework
*
* An open source software development framework for PHP
*
* @package Quantum
* @author Arman Ag. <arman.ag@softberg.org>
* @copyright Copyright (c) 2018 Softberg LLC (https://softberg.org)
* @link http://quantum.softberg.org/
* @since 3.0.0
*/

namespace Quantum\App\Stages;

use Quantum\Module\Exceptions\ModuleException;
use Quantum\Router\Exceptions\RouteException;
use Quantum\App\Contracts\BootStageInterface;
use Quantum\Di\Exceptions\DiException;
use Quantum\Router\RouteCollection;
use Quantum\Router\RouteBuilder;
use Quantum\Module\ModuleLoader;
use Quantum\App\AppContext;
use ReflectionException;
use Quantum\Di\Di;

/**
* Class LoadModulesStage
* @package Quantum\App
*/
class LoadModulesStage implements BootStageInterface
{
/**
* @throws ModuleException|RouteException|DiException|ReflectionException
*/
public function process(AppContext $context): void
{
if (!Di::isRegistered(ModuleLoader::class)) {
Di::register(ModuleLoader::class);
}

$moduleLoader = Di::get(ModuleLoader::class);

$collection = (new RouteBuilder())->build(
$moduleLoader->loadModulesRoutes(),
$moduleLoader->getModuleConfigs()
);

if (!Di::has(RouteCollection::class)) {
Di::set(RouteCollection::class, $collection);
}
}
}
25 changes: 1 addition & 24 deletions src/App/Traits/WebAppTrait.php
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@

namespace Quantum\App\Traits;

use Quantum\Module\Exceptions\ModuleException;
use Quantum\Config\Exceptions\ConfigException;
use Quantum\Loader\Exceptions\LoaderException;
use Quantum\Router\Exceptions\RouteException;
Expand All @@ -26,8 +25,6 @@
use Quantum\Di\Exceptions\DiException;
use Quantum\ResourceCache\ViewCache;
use Quantum\Router\RouteCollection;
use Quantum\Router\RouteBuilder;
use Quantum\Module\ModuleLoader;
use Quantum\Router\MatchedRoute;
use Quantum\Router\RouteFinder;
use Quantum\Debugger\Debugger;
Expand All @@ -44,26 +41,7 @@
trait WebAppTrait
{
/**
* @throws ModuleException|RouteException|DiException|ReflectionException
*/
private function loadModules(): void
{
if (!Di::isRegistered(ModuleLoader::class)) {
Di::register(ModuleLoader::class);
}

$moduleLoader = Di::get(ModuleLoader::class);

$collection = (new RouteBuilder())->build(
$moduleLoader->loadModulesRoutes(),
$moduleLoader->getModuleConfigs()
);

Di::set(RouteCollection::class, $collection);
}

/**
* @throws RouteException|BaseException|DiException|ReflectionException
* @throws RouteException|BaseException
*/
private function resolveRoute(): ?MatchedRoute
{
Expand Down Expand Up @@ -156,6 +134,5 @@ private function cleanupRequestContext(): void
{
request()->setMatchedRoute(null);
request()->flush();
Comment thread
armanist marked this conversation as resolved.
response()->flush();
}
}
14 changes: 8 additions & 6 deletions src/Console/Commands/OpenApiCommand.php
Original file line number Diff line number Diff line change
Expand Up @@ -99,14 +99,16 @@ public function exec(): void

$moduleLoader = Di::get(ModuleLoader::class);

$builder = new RouteBuilder();
if (!Di::has(RouteCollection::class)) {
$builder = new RouteBuilder();

$routeCollection = $builder->build(
$moduleLoader->loadModulesRoutes(),
$moduleLoader->getModuleConfigs()
);
$routeCollection = $builder->build(
$moduleLoader->loadModulesRoutes(),
$moduleLoader->getModuleConfigs()
);

Di::set(RouteCollection::class, $routeCollection);
Di::set(RouteCollection::class, $routeCollection);
}

$module = $this->getArgument('module');

Expand Down
16 changes: 10 additions & 6 deletions src/Console/Commands/RouteListCommand.php
Original file line number Diff line number Diff line change
Expand Up @@ -65,13 +65,17 @@ public function exec(): void

$moduleLoader = Di::get(ModuleLoader::class);

$builder = new RouteBuilder();
$routeCollection = $builder->build(
$moduleLoader->loadModulesRoutes(),
$moduleLoader->getModuleConfigs()
);
if (!Di::has(RouteCollection::class)) {
$builder = new RouteBuilder();
$routeCollection = $builder->build(
$moduleLoader->loadModulesRoutes(),
$moduleLoader->getModuleConfigs()
);

Di::set(RouteCollection::class, $routeCollection);
}

Di::set(RouteCollection::class, $routeCollection);
$routeCollection = Di::get(RouteCollection::class);

$routes = $routeCollection->all();

Expand Down
13 changes: 2 additions & 11 deletions tests/Unit/App/Adapters/WebAppAdapterTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -34,9 +34,6 @@ public function testWebAppAdapterStartSuccessfully(): void
$this->assertEquals(0, $result);
$this->assertNull(request()->getMatchedRoute());
$this->assertNull(request()->getUri());
$this->assertSame([], response()->all());
$this->assertSame([], response()->allHeaders());
$this->assertSame(200, response()->getStatusCode());
}

public function testWebAppAdapterStartFails(): void
Expand All @@ -50,9 +47,6 @@ public function testWebAppAdapterStartFails(): void
$this->assertSame(0, $result);
$this->assertNull(request()->getMatchedRoute());
$this->assertNull(request()->getUri());
$this->assertSame([], response()->all());
$this->assertSame([], response()->allHeaders());
$this->assertSame(200, response()->getStatusCode());
}

public function testWebAppAdapterHandlesPageNotFoundGracefully(): void
Expand All @@ -66,9 +60,6 @@ public function testWebAppAdapterHandlesPageNotFoundGracefully(): void
$this->assertSame(0, $result);
$this->assertNull(request()->getMatchedRoute());
$this->assertNull(request()->getUri());
$this->assertSame([], response()->all());
$this->assertSame([], response()->allHeaders());
$this->assertSame(200, response()->getStatusCode());
}

public function testWebAppAdapterCleansUpOnException(): void
Expand Down Expand Up @@ -98,8 +89,8 @@ public function send(): void

$this->assertNull(request()->getMatchedRoute());
$this->assertNull(request()->getUri());
$this->assertSame([], response()->all());
$this->assertSame([], response()->allHeaders());
$this->assertSame(['foo' => 'bar'], response()->all());
$this->assertSame('1', response()->getHeader('X-Test'));
$this->assertSame(200, response()->getStatusCode());
}
}
46 changes: 46 additions & 0 deletions tests/Unit/Console/Commands/OpenApiCommandTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,10 @@
use Symfony\Component\Console\Tester\CommandTester;
use Quantum\Console\Commands\OpenApiCommand;
use Quantum\Tests\Unit\AppTestCase;
use Quantum\Router\RouteCollection;
use Quantum\Storage\FileSystem;
use ReflectionMethod;
use Quantum\Di\Di;

class OpenApiCommandTest extends AppTestCase
{
Expand Down Expand Up @@ -80,6 +82,50 @@ public function testExecShowsErrorWhenModuleIsMissing(): void
}
}

public function testExecSkipsRouteBuildWhenCollectionAlreadyBound(): void
{
if (!Di::has(RouteCollection::class)) {
Di::set(RouteCollection::class, new RouteCollection());
}

$openApiAssets = assets_dir() . DS . 'OpenApiUi';
$indexCssPath = $openApiAssets . DS . 'index.css';
$assetsDirCreatedByTest = false;
$indexCssExisted = false;
$indexCssBackup = '';

if (!$this->fs->isDirectory($openApiAssets)) {
mkdir($openApiAssets, 0777, true);
$assetsDirCreatedByTest = true;
}

if ($this->fs->exists($indexCssPath)) {
$indexCssExisted = true;
$indexCssBackup = (string) $this->fs->get($indexCssPath);
}

$this->fs->put($indexCssPath, '/* stub */');

try {
$tester = new CommandTester($this->command);
$tester->execute([
'module' => 'MissingModule',
]);

$this->assertStringContainsString('The module `MissingModule` not found', $tester->getDisplay());
} finally {
if ($indexCssExisted) {
$this->fs->put($indexCssPath, $indexCssBackup);
} elseif ($this->fs->exists($indexCssPath)) {
$this->fs->remove($indexCssPath);
}

if ($assetsDirCreatedByTest && $this->fs->isDirectory($openApiAssets)) {
@rmdir($openApiAssets);
}
}
}

public function testOpenapiRoutesContainsModuleSpecPath(): void
{
$method = new ReflectionMethod($this->command, 'openapiRoutes');
Expand Down
16 changes: 16 additions & 0 deletions tests/Unit/Console/Commands/RouteListCommandTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
use Symfony\Component\Console\Tester\CommandTester;
use Quantum\Console\Commands\RouteListCommand;
use Quantum\Tests\Unit\AppTestCase;
use Quantum\Router\RouteCollection;
use Quantum\Di\Di;

class RouteListCommandTest extends AppTestCase
{
Expand Down Expand Up @@ -51,4 +53,18 @@ public function testExecShowsErrorForUnknownModuleFilter(): void

$this->assertStringContainsString('The module is not found', $tester->getDisplay());
}

public function testExecUsesPreBoundRouteCollection(): void
{
if (!Di::has(RouteCollection::class)) {
Di::set(RouteCollection::class, new RouteCollection());
}

$tester = new CommandTester($this->command);
$tester->execute([]);

$output = $tester->getDisplay();
$this->assertStringContainsString('Routes', $output);
$this->assertStringContainsString('MODULE', $output);
}
}
13 changes: 2 additions & 11 deletions tests/Unit/Http/Helpers/HttpHelperTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@
use Quantum\Router\Route;
use Quantum\Http\Response;
use Quantum\Http\Request;
use Quantum\Di\Di;

class HttpHelperTest extends AppTestCase
{
Expand All @@ -25,11 +24,6 @@ public function setUp(): void
$this->response = response();
}

public function tearDown(): void
{
request()->flush();
}

public function testRequestHelperReturnsDiInstance(): void
{
$this->assertInstanceOf(Request::class, request());
Expand All @@ -55,8 +49,6 @@ public function testBaseUrlWithModulePrefix(): void
{
config()->set('app.base_url', null);

$routeCollection = new RouteCollection();

$route = new Route(
['GET'],
'/signin',
Expand All @@ -65,10 +57,9 @@ public function testBaseUrlWithModulePrefix(): void
);
$route->module('admin')->prefix('admin');

$routeCollection->add($route);
$routeCollection = new RouteCollection();

// Register route collection in DI
Di::set(RouteCollection::class, $routeCollection);
$routeCollection->add($route);

// Create route finder and find the route
$router = new RouteFinder($routeCollection);
Expand Down
11 changes: 0 additions & 11 deletions tests/Unit/Http/RequestTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,17 +10,6 @@

class RequestTest extends AppTestCase
{
public function setUp(): void
{
parent::setUp();

}

public function tearDown(): void
{
request()->flush();
}

public function testSetGetMethod(): void
{
$request = request();
Expand Down
10 changes: 0 additions & 10 deletions tests/Unit/Http/Traits/Request/HttpRequestBodyTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,16 +6,6 @@

class HttpRequestBodyTest extends AppTestCase
{
public function setUp(): void
{
parent::setUp();
}

public function tearDown(): void
{
request()->flush();
}

public function testRequestSetHasGetDelete(): void
{
$request = request();
Expand Down
Loading
Loading