Merge pull request #533 from flightphp/easier-access-to-request-headers

request header shortcut and lots of unit test fixes for phpcs
pull/534/head
fadrian06 1 year ago committed by GitHub
commit a3541a1f7a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -57,13 +57,13 @@ use flight\net\Route;
* @method void redirect(string $url, int $code = 303) Redirects the current request to another URL.
* @method void json(mixed $data, int $code = 200, bool $encode = true, string $charset = 'utf-8', int $option = 0)
* Sends a JSON response.
* @method void jsonp(mixed $data, string $param = 'jsonp', int $code = 200,
* bool $encode = true, string $charset = 'utf-8', int $option = 0) Sends a JSONP response.
* @method void jsonp(mixed $data, string $param = 'jsonp', int $code = 200, bool $encode = true, string $charset = 'utf-8', int $option = 0) Sends a JSONP response.
*
* # HTTP caching
* @method void etag($id, string $type = 'strong') Handles ETag HTTP caching.
* @method void lastModified(int $time) Handles last modified HTTP caching.
*/
// phpcs:ignoreFile Generic.Files.LineLength.TooLong, PSR2.Methods.MethodDeclaration.Underscore
class Engine
{
/**

@ -56,10 +56,8 @@ use flight\net\Route;
* @method static Request request() Returns Request instance.
* @method static Response response() Returns Response instance.
* @method static void redirect($url, $code = 303) Redirects to another URL.
* @method static void json($data, $code = 200, $encode = true, $charset = "utf8",
* $encodeOption = 0, $encodeDepth = 512) Sends a JSON response.
* @method static void jsonp($data, $param = 'jsonp', $code = 200, $encode = true,
* $charset = "utf8", $encodeOption = 0, $encodeDepth = 512) Sends a JSONP response.
* @method static void json($data, $code = 200, $encode = true, $charset = "utf8", $encodeOption = 0, $encodeDepth = 512) Sends a JSON response.
* @method static void jsonp($data, $param = 'jsonp', $code = 200, $encode = true, $charset = "utf8", $encodeOption = 0, $encodeDepth = 512) Sends a JSONP response.
* @method static void error($exception) Sends an HTTP 500 response.
* @method static void notFound() Sends an HTTP 404 response.
*
@ -67,7 +65,8 @@ use flight\net\Route;
* @method static void etag($id, $type = 'strong') Performs ETag HTTP caching.
* @method static void lastModified($time) Performs last modified HTTP caching.
*/
class Flight
// phpcs:ignoreFile Generic.Files.LineLength.TooLong, PSR1.Classes.ClassDeclaration.MissingNamespace
class Flight
{
/**
* Framework engine.

@ -20,12 +20,14 @@ class Dispatcher
{
/**
* Mapped events.
*
* @var array<string, callable>
*/
protected array $events = [];
/**
* Method filters.
*
* @var array<string, array<'before'|'after', array<int, callable>>>
*/
protected array $filters = [];

@ -20,30 +20,36 @@ class Loader
{
/**
* Registered classes.
*
* @var array<string, array{class-string|Closure(): object, array<int, mixed>, ?callable}> $classes
*/
protected array $classes = [];
/**
* Class instances.
*
* @var array<string, object>
*/
protected array $instances = [];
/**
* Autoload directories.
*
* @var array<int, string>
*/
protected static array $dirs = [];
/**
* Registers a class.
* @template T of object
*
* @param string $name Registry name
* @param class-string<T>|Closure(): T $class Class name or function to instantiate class
* @param array<int, mixed> $params Class initialization parameters
* @param ?callable(T $instance): void $callback $callback Function to call after object instantiation
*
* @template T of object
*
* @return void
*/
public function register(string $name, $class, array $params = [], ?callable $callback = null): void
{
@ -116,11 +122,12 @@ class Loader
/**
* Gets a new instance of a class.
* @template T of object
*
* @param class-string<T>|Closure(): class-string<T> $class Class name or callback function to instantiate class
* @param array<int, string> $params Class initialization parameters
*
* @template T of object
*
* @throws Exception
*
* @return T Class instance
@ -135,6 +142,8 @@ class Loader
}
/**
* Gets a registered callable
*
* @param string $name Registry name
*
* @return mixed Class information or null if not registered

@ -9,19 +9,6 @@ use PDOStatement;
class PdoWrapper extends PDO
{
/**
* How you create the connection for the database
*
* @param string $dsn - Ex: 'mysql:host=localhost;port=3306;dbname=testdb;charset=utf8mb4'
* @param string $username - Ex: 'root'
* @param string $password - Ex: 'password'
* @param array<int,mixed> $options - PDO options you can pass in
*/
public function __construct(string $dsn, ?string $username = null, ?string $password = null, array $options = [])
{
parent::__construct($dsn, $username, $password, $options);
}
/**
* Use this for INSERTS, UPDATES, or if you plan on using a SELECT in a while loop
*
@ -35,6 +22,7 @@ class PdoWrapper extends PDO
*
* @param string $sql - Ex: "SELECT * FROM table WHERE something = ?"
* @param array<int|string,mixed> $params - Ex: [ $something ]
*
* @return PDOStatement
*/
public function runQuery(string $sql, array $params = []): PDOStatement
@ -54,6 +42,7 @@ class PdoWrapper extends PDO
*
* @param string $sql - Ex: "SELECT id FROM table WHERE something = ?"
* @param array<int|string,mixed> $params - Ex: [ $something ]
*
* @return mixed
*/
public function fetchField(string $sql, array $params = [])
@ -69,6 +58,7 @@ class PdoWrapper extends PDO
*
* @param string $sql - Ex: "SELECT * FROM table WHERE something = ?"
* @param array<int|string,mixed> $params - Ex: [ $something ]
*
* @return array<string,mixed>
*/
public function fetchRow(string $sql, array $params = []): array
@ -88,6 +78,7 @@ class PdoWrapper extends PDO
*
* @param string $sql - Ex: "SELECT * FROM table WHERE something = ?"
* @param array<int|string,mixed> $params - Ex: [ $something ]
*
* @return array<int,array<string,mixed>>
*/
public function fetchAll(string $sql, array $params = []): array
@ -109,48 +100,42 @@ class PdoWrapper extends PDO
*
* @param string $sql the sql statement
* @param array<int|string,mixed> $params the params for the sql statement
*
* @return array<string,string|array<int|string,mixed>>
*/
protected function processInStatementSql(string $sql, array $params = []): array
{
/* Handle "IN(?)". This is to be used with a comma delimited string, but can also be used with an array.
Remove the spaces in variations of "IN ( ? )" where the space after IN is optional, and any number of
spaces before and after the question mark is optional.
Then loop through each "IN(?)" in the query and replace the single question mark with the correct
number of question marks. */
$sql = preg_replace('/IN\s*\(\s*\?\s*\)/i', 'IN(?)', $sql);
$current_index = 0;
while (($current_index = strpos($sql, 'IN(?)', $current_index)) !== false) {
$preceeding_count = substr_count($sql, '?', 0, $current_index - 1);
$param = $params[$preceeding_count];
$question_marks = '?';
// If param is a string, explode it and replace the question mark with the correct number of question marks
if (is_string($param) || is_array($param)) {
$params_to_use = $param;
if (is_string($param)) {
$params_to_use = explode(',', $param);
}
// Replace "IN(?)" with "IN(?,?,?)"
$sql = preg_replace('/IN\s*\(\s*\?\s*\)/i', 'IN(?)', $sql);
foreach ($params_to_use as $key => $value) {
if (is_string($value)) {
$params_to_use[$key] = trim($value);
}
}
$current_index = 0;
while (($current_index = strpos($sql, 'IN(?)', $current_index)) !== false) {
$preceeding_count = substr_count($sql, '?', 0, $current_index - 1);
// Replace the single question mark with the appropriate number of question marks.
$question_marks = join(',', array_fill(0, count($params_to_use), '?'));
$sql = substr_replace($sql, $question_marks, $current_index + 3, 1);
$param = $params[$preceeding_count];
$question_marks = '?';
// Insert the new params into the params array.
array_splice($params, $preceeding_count, 1, $params_to_use);
if (is_string($param) || is_array($param)) {
$params_to_use = $param;
if (is_string($param)) {
$params_to_use = explode(',', $param);
}
// Increment by the length of the question marks and accounting for the length of "IN()"
$current_index += strlen($question_marks) + 4;
foreach ($params_to_use as $key => $value) {
if (is_string($value)) {
$params_to_use[$key] = trim($value);
}
}
$question_marks = join(',', array_fill(0, count($params_to_use), '?'));
$sql = substr_replace($sql, $question_marks, $current_index + 3, 1);
array_splice($params, $preceeding_count, 1, $params_to_use);
}
return [ 'sql' => $sql, 'params' => $params ];
$current_index += strlen($question_marks) + 4;
}
return [ 'sql' => $sql, 'params' => $params ];
}
}

@ -155,7 +155,7 @@ class Request
'scheme' => self::getScheme(),
'user_agent' => self::getVar('HTTP_USER_AGENT'),
'type' => self::getVar('CONTENT_TYPE'),
'length' => (int) self::getVar('CONTENT_LENGTH', 0),
'length' => intval(self::getVar('CONTENT_LENGTH', 0)),
'query' => new Collection($_GET),
'data' => new Collection($_POST),
'cookies' => new Collection($_COOKIE),
@ -174,7 +174,8 @@ class Request
* Initialize request properties.
*
* @param array<string, mixed> $properties Array of request properties
* @return $this
*
* @return self
*/
public function init(array $properties = []): self
{
@ -298,6 +299,38 @@ class Request
return $_SERVER[$var] ?? $default;
}
/**
* This will pull a header from the request.
*
* @param string $header Header name. Can be caps, lowercase, or mixed.
* @param string $default Default value if the header does not exist
*
* @return string
*/
public static function getHeader(string $header, $default = ''): string
{
$header = 'HTTP_' . strtoupper(str_replace('-', '_', $header));
return self::getVar($header, $default);
}
/**
* Gets all the request headers
*
* @return array<string, string|int>
*/
public static function getHeaders(): array
{
$headers = [];
foreach ($_SERVER as $key => $value) {
if (0 === strpos($key, 'HTTP_')) {
// converts headers like HTTP_CUSTOM_HEADER to Custom-Header
$key = str_replace(' ', '-', ucwords(str_replace('_', ' ', strtolower(substr($key, 5)))));
$headers[$key] = $value;
}
}
return $headers;
}
/**
* Parse query parameters from a URL.
*
@ -317,7 +350,11 @@ class Request
return $params;
}
/** @return 'http'|'https' */
/**
* Gets the URL Scheme
*
* @return string 'http'|'https'
*/
public static function getScheme(): string
{
if (

@ -22,7 +22,9 @@ class Response
public bool $content_length = true;
/**
* @var array<int, ?string> HTTP status codes
* HTTP status codes
*
* @var array<int, ?string> $codes
*/
public static array $codes = [
100 => 'Continue',
@ -100,7 +102,9 @@ class Response
protected int $status = 200;
/**
* @var array<string, int|string|array<int, string>> HTTP headers
* HTTP response headers
*
* @var array<string,int|string|array<int,string>> $headers
*/
protected array $headers = [];
@ -161,6 +165,7 @@ class Response
/**
* Returns the headers from the response.
*
* @return array<string, int|string|array<int, string>>
*/
public function headers(): array
@ -289,7 +294,9 @@ class Response
* the same type. By default it will replace, but if you pass in false as the
* second argument you can force multiple headers of the same type.
* @param int $response_code The response code to send
* @return $this
*
* @return self
*
* @codeCoverageIgnore
*/
public function setRealHeader(string $header_string, bool $replace = true, int $response_code = 0): self

@ -20,17 +20,23 @@ class Route
public string $pattern;
/**
* @var mixed Callback function
* Callback function
*
* @var mixed
*/
public $callback;
/**
* @var array<int, string> HTTP methods
* HTTP methods
*
* @var array<int, string>
*/
public array $methods = [];
/**
* @var array<int, ?string> Route parameters
* Route parameters
*
* @var array<int, ?string>
*/
public array $params = [];
@ -55,7 +61,9 @@ class Route
public string $alias = '';
/**
* @var array<int,callable|object> The middleware to be applied to the route
* The middleware to be applied to the route
*
* @var array<int,callable|object>
*/
public array $middleware = [];
@ -95,13 +103,13 @@ class Route
$last_char = substr($this->pattern, -1);
// Get splat
if ('*' === $last_char) {
if ($last_char === '*') {
$n = 0;
$len = \strlen($url);
$count = substr_count($this->pattern, '/');
for ($i = 0; $i < $len; $i++) {
if ('/' === $url[$i]) {
if ($url[$i] === '/') {
$n++;
}
if ($n === $count) {
@ -109,7 +117,7 @@ class Route
}
}
$this->splat = (string) substr($url, $i + 1);
$this->splat = strval(substr($url, $i + 1));
}
// Build the regex for matching
@ -202,8 +210,9 @@ class Route
/**
* Sets the route middleware
*
* @param array<int, callable>|callable $middleware
* @return $this
* @param array<int,callable>|callable $middleware
*
* @return self
*/
public function addMiddleware($middleware): self
{

@ -21,8 +21,11 @@ class Router
* Case sensitive matching.
*/
public bool $case_sensitive = false;
/**
* @var array<int,Route> Mapped routes.
* Mapped routes.
*
* @var array<int,Route> $routes
*/
protected array $routes = [];

@ -20,7 +20,11 @@ class View
/** File extension. */
public string $extension = '.php';
/** @var array<string, mixed> View variables. */
/**
* View variables.
*
* @var array<string, mixed> $vars
*/
protected array $vars = [];
/** Template file. */
@ -51,7 +55,8 @@ class View
*
* @param string|iterable<string, mixed> $key
* @param mixed $value Value
* @return $this
*
* @return self
*/
public function set($key, $value = null): self
{

@ -22,6 +22,7 @@ class Collection implements ArrayAccess, Iterator, Countable, JsonSerializable
{
/**
* Collection data.
*
* @var array<string, mixed>
*/
private array $data;

@ -1,7 +1,8 @@
<?php
declare(strict_types=1);
// This file is only here so that the PHP8 attribute for doesn't throw an error in files
// phpcs:ignoreFile PSR1.Classes.ClassDeclaration.MissingNamespace
class ReturnTypeWillChange
{
}

@ -29,8 +29,14 @@
<exclude name="Generic.Commenting.DocComment.SpacingBeforeShort" />
<exclude name="Generic.Commenting.DocComment.ContentAfterOpen" />
<exclude name="Generic.Functions.OpeningFunctionBraceBsdAllman.BraceOnSameLine" />
<exclude name="Generic.PHP.DisallowRequestSuperglobal.Found" />
<exclude name="Generic.Commenting.DocComment.ContentBeforeClose" />
<exclude name="Generic.ControlStructures.DisallowYodaConditions.Found" />
<exclude name="Generic.Strings.UnnecessaryStringConcat.Found" />
<exclude name="Generic.CodeAnalysis.AssignmentInCondition.FoundInWhileCondition" />
</rule>
<file>flight/</file>
<file>tests/</file>
<exclude-pattern>tests/views/*</exclude-pattern>
<ignore>tests/views/</ignore>
</ruleset>

@ -2,7 +2,10 @@
declare(strict_types=1);
namespace tests;
use flight\Engine;
use tests\classes\User;
use PHPUnit\Framework\TestCase;
class AutoloadTest extends TestCase
@ -18,7 +21,7 @@ class AutoloadTest extends TestCase
// Autoload a class
public function testAutoload()
{
$this->app->register('user', 'User');
$this->app->register('user', User::class);
$loaders = spl_autoload_functions();

@ -2,6 +2,8 @@
declare(strict_types=1);
namespace tests;
use flight\util\Collection;
use PHPUnit\Framework\TestCase;

@ -2,7 +2,11 @@
declare(strict_types=1);
namespace tests;
use Exception;
use flight\core\Dispatcher;
use tests\classes\Hello;
use PHPUnit\Framework\TestCase;
class DispatcherTest extends TestCase
@ -88,7 +92,7 @@ class DispatcherTest extends TestCase
// Map a static function
public function testStaticFunctionMapping()
{
$this->dispatcher->set('map2', 'Hello::sayHi');
$this->dispatcher->set('map2', 'tests\classes\Hello::sayHi');
$result = $this->dispatcher->run('map2');
@ -110,7 +114,7 @@ class DispatcherTest extends TestCase
// Map a static class method
public function testStaticClassMethodMapping()
{
$this->dispatcher->set('map4', ['Hello', 'sayBye']);
$this->dispatcher->set('map4', ['\tests\classes\Hello', 'sayBye']);
$result = $this->dispatcher->run('map4');

@ -2,10 +2,14 @@
declare(strict_types=1);
namespace tests;
use Exception;
use flight\Engine;
use flight\net\Response;
use PHPUnit\Framework\TestCase;
// phpcs:ignoreFile PSR2.Methods.MethodDeclaration.Underscore
class EngineTest extends TestCase
{
public function setUp(): void

@ -2,6 +2,8 @@
declare(strict_types=1);
namespace tests;
use flight\Engine;
use PHPUnit\Framework\TestCase;

@ -2,11 +2,16 @@
declare(strict_types=1);
namespace tests;
use Exception;
use Flight;
use flight\Engine;
use flight\net\Request;
use flight\net\Response;
use flight\net\Router;
use flight\template\View;
use tests\classes\User;
use PHPUnit\Framework\TestCase;
class FlightTest extends TestCase
@ -67,7 +72,7 @@ class FlightTest extends TestCase
{
Flight::path(__DIR__ . '/classes');
Flight::register('user', 'User');
Flight::register('user', User::class);
$user = Flight::user();
$loaders = spl_autoload_functions();

@ -2,8 +2,13 @@
declare(strict_types=1);
namespace tests;
use flight\core\Loader;
use tests\classes\Factory;
use tests\classes\User;
use PHPUnit\Framework\TestCase;
use tests\classes\TesterClass;
class LoaderTest extends TestCase
{
@ -18,7 +23,7 @@ class LoaderTest extends TestCase
// Autoload a class
public function testAutoload()
{
$this->loader->register('tests', 'User');
$this->loader->register('tests', User::class);
$test = $this->loader->load('tests');
@ -29,7 +34,7 @@ class LoaderTest extends TestCase
// Register a class
public function testRegister()
{
$this->loader->register('a', 'User');
$this->loader->register('a', User::class);
$user = $this->loader->load('a');
@ -41,7 +46,7 @@ class LoaderTest extends TestCase
// Register a class with constructor parameters
public function testRegisterWithConstructor()
{
$this->loader->register('b', 'User', ['Bob']);
$this->loader->register('b', User::class, ['Bob']);
$user = $this->loader->load('b');
@ -53,7 +58,7 @@ class LoaderTest extends TestCase
// Register a class with initialization
public function testRegisterWithInitialization()
{
$this->loader->register('c', 'User', ['Bob'], function ($user) {
$this->loader->register('c', User::class, ['Bob'], function ($user) {
$user->name = 'Fred';
});
@ -67,7 +72,7 @@ class LoaderTest extends TestCase
// Get a non-shared instance of a class
public function testSharedInstance()
{
$this->loader->register('d', 'User');
$this->loader->register('d', User::class);
$user1 = $this->loader->load('d');
$user2 = $this->loader->load('d');
@ -80,7 +85,7 @@ class LoaderTest extends TestCase
// Gets an object from a factory method
public function testRegisterUsingCallable()
{
$this->loader->register('e', ['Factory', 'create']);
$this->loader->register('e', ['\tests\classes\Factory', 'create']);
$obj = $this->loader->load('e');
@ -114,9 +119,9 @@ class LoaderTest extends TestCase
public function testUnregisterClass()
{
$this->loader->register('g', 'User');
$this->loader->register('g', User::class);
$current_class = $this->loader->get('g');
$this->assertEquals([ 'User', [], null ], $current_class);
$this->assertEquals([ User::class, [], null ], $current_class);
$this->loader->unregister('g');
$unregistered_class_result = $this->loader->get('g');
$this->assertNull($unregistered_class_result);
@ -124,7 +129,7 @@ class LoaderTest extends TestCase
public function testNewInstance6Params()
{
$TesterClass = $this->loader->newInstance('TesterClass', ['Bob','Fred', 'Joe', 'Jane', 'Sally', 'Suzie']);
$TesterClass = $this->loader->newInstance(TesterClass::class, ['Bob','Fred', 'Joe', 'Jane', 'Sally', 'Suzie']);
$this->assertEquals('Bob', $TesterClass->param1);
$this->assertEquals('Fred', $TesterClass->param2);
$this->assertEquals('Joe', $TesterClass->param3);

@ -2,7 +2,11 @@
declare(strict_types=1);
namespace tests;
use Exception;
use flight\Engine;
use tests\classes\Hello;
use PHPUnit\Framework\TestCase;
class MapTest extends TestCase
@ -53,7 +57,7 @@ class MapTest extends TestCase
// Map a static class method
public function testStaticClassMethodMapping()
{
$this->app->map('map4', ['Hello', 'sayBye']);
$this->app->map('map4', [Hello::class, 'sayBye']);
$result = $this->app->map4();

@ -2,7 +2,10 @@
declare(strict_types=1);
namespace tests;
use flight\database\PdoWrapper;
use PDOStatement;
use PHPUnit\Framework\TestCase;
class PdoWrapperTest extends TestCase
@ -95,7 +98,7 @@ class PdoWrapperTest extends TestCase
public function testFetchAllWithInInt()
{
$rows = $this->pdo_wrapper->fetchAll('SELECT id FROM test WHERE id IN(?)', [ [1,2 ]]);
$rows = $this->pdo_wrapper->fetchAll('SELECT id FROM test WHERE id IN(? )', [ [1,2 ]]);
$this->assertEquals(2, count($rows));
}
@ -107,7 +110,7 @@ class PdoWrapperTest extends TestCase
public function testFetchAllWithInStringCommas()
{
$rows = $this->pdo_wrapper->fetchAll('SELECT id FROM test WHERE id > ? AND name IN(?)', [ 0, 'one,two' ]);
$rows = $this->pdo_wrapper->fetchAll('SELECT id FROM test WHERE id > ? AND name IN( ?) ', [ 0, 'one,two' ]);
$this->assertEquals(2, count($rows));
}
}

@ -2,6 +2,8 @@
declare(strict_types=1);
namespace tests;
use flight\Engine;
use PHPUnit\Framework\TestCase;

@ -2,7 +2,10 @@
declare(strict_types=1);
namespace tests;
use flight\Engine;
use tests\classes\User;
use PHPUnit\Framework\TestCase;
class RegisterTest extends TestCase
@ -17,7 +20,7 @@ class RegisterTest extends TestCase
// Register a class
public function testRegister()
{
$this->app->register('reg1', 'User');
$this->app->register('reg1', User::class);
$user = $this->app->reg1();
@ -29,7 +32,7 @@ class RegisterTest extends TestCase
// Register a class with constructor parameters
public function testRegisterWithConstructor()
{
$this->app->register('reg2', 'User', ['Bob']);
$this->app->register('reg2', User::class, ['Bob']);
$user = $this->app->reg2();
@ -41,7 +44,7 @@ class RegisterTest extends TestCase
// Register a class with initialization
public function testRegisterWithInitialization()
{
$this->app->register('reg3', 'User', ['Bob'], function ($user) {
$this->app->register('reg3', User::class, ['Bob'], function ($user) {
$user->name = 'Fred';
});
@ -55,7 +58,7 @@ class RegisterTest extends TestCase
// Get a non-shared instance of a class
public function testSharedInstance()
{
$this->app->register('reg4', 'User');
$this->app->register('reg4', User::class);
$user1 = $this->app->reg4();
$user2 = $this->app->reg4();
@ -68,7 +71,7 @@ class RegisterTest extends TestCase
// Map method takes precedence over register
public function testMapOverridesRegister()
{
$this->app->register('reg5', 'User');
$this->app->register('reg5', User::class);
$user = $this->app->reg5();

@ -2,6 +2,8 @@
declare(strict_types=1);
namespace tests;
use flight\Engine;
use PHPUnit\Framework\TestCase;

@ -2,6 +2,8 @@
declare(strict_types=1);
namespace tests;
use flight\net\Request;
use flight\util\Collection;
use PHPUnit\Framework\TestCase;
@ -194,4 +196,53 @@ class RequestTest extends TestCase
$this->assertEquals([ 'foo' => 'bar' ], $request->data->getData());
$this->assertEquals('{"foo":"bar"}', $request->getBody());
}
public function testGetHeader()
{
$_SERVER['HTTP_X_CUSTOM_HEADER'] = 'custom header value';
$request = new Request();
$this->assertEquals('custom header value', $request->getHeader('X-Custom-Header'));
// or the headers that are already in $_SERVER
$this->assertEquals('XMLHttpRequest', $request->getHeader('X-REqUesTed-WiTH'));
$this->assertEquals('32.32.32.32', $request->getHeader('X-Forwarded-For'));
// default values
$this->assertEquals('default value', $request->getHeader('X-Non-Existent-Header', 'default value'));
}
public function testGetHeaders()
{
$_SERVER = [];
$_SERVER['HTTP_X_CUSTOM_HEADER'] = 'custom header value';
$request = new Request();
$this->assertEquals(['X-Custom-Header' => 'custom header value'], $request->getHeaders());
}
public function testGetHeadersWithEmptyServer()
{
$_SERVER = [];
$request = new Request();
$this->assertEquals([], $request->getHeaders());
}
public function testGetHeadersWithEmptyHeader()
{
$_SERVER = [];
$_SERVER['HTTP_X_CUSTOM_HEADER'] = '';
$request = new Request();
$this->assertEquals(['X-Custom-Header' => ''], $request->getHeaders());
}
public function testGetHeadersWithMultipleHeaders()
{
$_SERVER = [];
$_SERVER['HTTP_X_CUSTOM_HEADER'] = 'custom header value';
$_SERVER['HTTP_X_CUSTOM_HEADER2'] = 'custom header value 2';
$request = new Request();
$this->assertEquals([
'X-Custom-Header' => 'custom header value',
'X-Custom-Header2' => 'custom header value 2'
], $request->getHeaders());
}
}

@ -2,9 +2,10 @@
declare(strict_types=1);
use flight\net\Request;
namespace tests;
use Exception;
use flight\net\Response;
use flight\util\Collection;
use PHPUnit\Framework\TestCase;
class ResponseTest extends TestCase

@ -2,6 +2,8 @@
declare(strict_types=1);
namespace tests;
use flight\core\Dispatcher;
use flight\net\Request;
use flight\net\Router;

@ -2,6 +2,8 @@
declare(strict_types=1);
namespace tests;
use flight\Engine;
use PHPUnit\Framework\TestCase;

@ -2,6 +2,9 @@
declare(strict_types=1);
namespace tests;
use Exception;
use flight\template\View;
use PHPUnit\Framework\TestCase;

@ -2,6 +2,8 @@
declare(strict_types=1);
namespace tests\classes;
class Factory
{
// Cannot be instantiated

@ -2,6 +2,8 @@
declare(strict_types=1);
namespace tests\classes;
class Hello
{
public function sayHi(): string

@ -2,6 +2,8 @@
declare(strict_types=1);
namespace tests\classes;
class TesterClass
{
public $param1;

@ -2,6 +2,8 @@
declare(strict_types=1);
namespace tests\classes;
class User
{
public string $name;

Loading…
Cancel
Save