Merge pull request #622 from flightphp/new-request-object

Added ability to generate new requests/responses on duplicate start()
master
n0nag0n 2 days ago committed by GitHub
commit b6ab088888
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -94,6 +94,9 @@ class Engine
/** If the framework has been initialized or not. */
protected bool $initialized = false;
/** If the request has been handled or not. */
protected bool $requestHandled = false;
public function __construct()
{
$this->loader = new Loader();
@ -476,6 +479,19 @@ class Engine
{
$dispatched = false;
$self = $this;
// This behavior is specifically for test suites, and for async platforms like swoole, workerman, etc.
if ($this->requestHandled === false) {
// not doing much here, just setting the requestHandled flag to true
$this->requestHandled = true;
} else {
// deregister the request and response objects and re-register them with new instances
$this->unregister('request');
$this->unregister('response');
$this->register('request', Request::class);
$this->register('response', Response::class);
$this->router()->reset();
}
$request = $this->request();
$response = $this->response();
$router = $this->router();
@ -498,7 +514,6 @@ class Engine
// Route the request
$failedMiddlewareCheck = false;
while ($route = $router->route($request)) {
$params = array_values($route->params);

@ -212,7 +212,7 @@ class Request
}
}
// Check PUT, PATCH, DELETE for application/x-www-form-urlencoded data
} else if (in_array($this->method, [ 'PUT', 'DELETE', 'PATCH' ], true) === true) {
} elseif (in_array($this->method, [ 'PUT', 'DELETE', 'PATCH' ], true) === true) {
$body = $this->getBody();
if ($body !== '') {
$data = [];

@ -175,6 +175,30 @@ class EngineTest extends TestCase
$engine->start();
}
public function testDoubleStart()
{
$engine = new Engine();
$engine->route('/someRoute', function () {
echo 'i ran';
}, true);
$engine->request()->url = '/someRoute';
$engine->start();
$request = $engine->request();
$response = $engine->response();
// This is pretending like this is embodied in a platform like swoole where
// another request comes in while still holding all the same state.
$_SERVER['REQUEST_METHOD'] = 'GET';
$_SERVER['REQUEST_URI'] = '/someRoute';
$engine->start();
$this->assertFalse($request === $engine->request());
$this->assertFalse($response === $engine->response());
$this->expectOutputString('i rani ran');
}
public function testStopWithCode()
{
$engine = new class extends Engine {

@ -0,0 +1,83 @@
<?php
declare(strict_types=1);
namespace tests;
use Flight;
use flight\Engine;
use PHPUnit\Framework\TestCase;
class FlightAsyncTest extends TestCase
{
public static function setUpBeforeClass(): void
{
Flight::setEngine(new Engine());
}
protected function setUp(): void
{
$_SERVER = [];
$_REQUEST = [];
}
protected function tearDown(): void
{
unset($_REQUEST);
unset($_SERVER);
}
// Checks that default components are loaded
public function testSingleRoute()
{
Flight::route('GET /', function () {
echo 'hello world';
});
$this->expectOutputString('hello world');
Flight::start();
}
public function testMultipleRoutes()
{
Flight::route('GET /', function () {
echo 'hello world';
});
Flight::route('GET /test', function () {
echo 'test';
});
$this->expectOutputString('test');
$_SERVER['REQUEST_URI'] = '/test';
Flight::start();
}
public function testMultipleStartsSingleRoute()
{
Flight::route('GET /', function () {
echo 'hello world';
});
$this->expectOutputString('hello worldhello world');
Flight::start();
Flight::start();
}
public function testMultipleStartsMultipleRoutes()
{
Flight::route('GET /', function () {
echo 'hello world';
});
Flight::route('GET /test', function () {
echo 'test';
});
$this->expectOutputString('testhello world');
$_SERVER['REQUEST_URI'] = '/test';
Flight::start();
$_SERVER['REQUEST_URI'] = '/';
Flight::start();
}
}

@ -378,7 +378,7 @@ class FlightTest extends TestCase
public function testKeepThePreviousStateOfOneViewComponentByDefault(): void
{
$this->expectOutputString(<<<'html'
$html = <<<'html'
<div>Hi</div>
<div>Hi</div>
@ -386,7 +386,12 @@ class FlightTest extends TestCase
<input type="number" />
html);
html;
// if windows replace \n with \r\n
$html = str_replace("\n", PHP_EOL, $html);
$this->expectOutputString($html);
Flight::render('myComponent', ['prop' => 'Hi']);
Flight::render('myComponent');

@ -175,7 +175,7 @@ class ViewTest extends TestCase
public function testKeepThePreviousStateOfOneViewComponentByDefault(): void
{
$this->expectOutputString(<<<'html'
$html = <<<'html'
<div>Hi</div>
<div>Hi</div>
@ -183,7 +183,12 @@ class ViewTest extends TestCase
<input type="number" />
html);
html;
// if windows replace \n with \r\n
$html = str_replace("\n", PHP_EOL, $html);
$this->expectOutputString($html);
$this->view->render('myComponent', ['prop' => 'Hi']);
$this->view->render('myComponent');
@ -197,11 +202,16 @@ class ViewTest extends TestCase
$this->view->set('prop', 'bar');
$this->expectOutputString(<<<'html'
$html = <<<'html'
<div>qux</div>
<div>bar</div>
html);
html;
// if windows replace \n with \r\n
$html = str_replace("\n", PHP_EOL, $html);
$this->expectOutputString($html);
$this->view->render('myComponent', ['prop' => 'qux']);
$this->view->render('myComponent');
@ -209,24 +219,29 @@ class ViewTest extends TestCase
public static function renderDataProvider(): array
{
return [
[
<<<'html'
$html1 = <<<'html'
<div>Hi</div>
<div></div>
html,
['myComponent', ['prop' => 'Hi']],
'/^Undefined variable:? \$?prop$/'
],
[
<<<'html'
html;
$html2 = <<<'html'
<input type="number" />
<input type="text" />
html,
html;
$html1 = str_replace("\n", PHP_EOL, $html1);
$html2 = str_replace("\n", PHP_EOL, $html2);
return [
[
$html1,
['myComponent', ['prop' => 'Hi']],
'/^Undefined variable:? \$?prop$/'
],
[
$html2,
['input', ['type' => 'number']],
'/^.*$/'
],

Loading…
Cancel
Save