phpOMS/tests/Message/Http/HttpRequestTest.php
2022-09-28 16:41:17 +02:00

556 lines
18 KiB
PHP

<?php
/**
* Karaka
*
* PHP Version 8.1
*
* @package tests
* @copyright Dennis Eichhorn
* @license OMS License 1.0
* @version 1.0.0
* @link https://karaka.app
*/
declare(strict_types=1);
namespace phpOMS\tests\Message\Http;
use phpOMS\Localization\ISO639x1Enum;
use phpOMS\Localization\Localization;
use phpOMS\Message\Http\BrowserType;
use phpOMS\Message\Http\HttpRequest;
use phpOMS\Message\Http\OSType;
use phpOMS\Message\Http\RequestMethod;
use phpOMS\Message\Http\Rest;
use phpOMS\Router\RouteVerb;
use phpOMS\System\MimeType;
use phpOMS\Uri\HttpUri;
/**
* @testdox phpOMS\tests\Message\Http\HttpRequestTest: HttpRequest wrapper for http requests
*
* @internal
*/
final class HttpRequestTest extends \PHPUnit\Framework\TestCase
{
/**
* @testdox The request has the expected default values after initialization
* @covers phpOMS\Message\Http\HttpRequest<extended>
* @group framework
*/
public function testDefault() : void
{
$request = new HttpRequest();
$_SERVER['HTTP_USER_AGENT'] = OSType::UNKNOWN . BrowserType::UNKNOWN;
self::assertEquals('en', $request->getLanguage());
self::assertFalse($request->isMobile());
self::assertEquals(BrowserType::UNKNOWN, $request->getBrowser());
self::assertEquals(OSType::UNKNOWN, $request->getOS());
self::assertEquals('127.0.0.1', $request->getOrigin());
self::assertFalse(HttpRequest::isHttps());
self::assertEquals([], $request->getHash());
self::assertEmpty($request->getBody());
self::assertEmpty($request->getFiles());
self::assertEquals(RouteVerb::GET, $request->getRouteVerb());
self::assertEquals(RequestMethod::GET, $request->getMethod());
self::assertInstanceOf('\phpOMS\Message\Http\HttpHeader', $request->header);
self::assertInstanceOf('\phpOMS\Message\Http\HttpRequest', HttpRequest::createFromSuperglobals());
self::assertEquals('', $request->__toString());
self::assertFalse($request->hasData('key'));
self::assertNull($request->getData('key'));
self::assertEquals('en', $request->getRequestLanguage());
self::assertEquals('en_US', $request->getLocale());
}
/**
* @testdox The OS can be set and returned
* @covers phpOMS\Message\Http\HttpRequest<extended>
* @group framework
*/
public function testOSInputOutput() : void
{
$request = new HttpRequest(new HttpUri('http://www.google.com/test/path'), $l11n = new Localization());
$request->setOS(OSType::WINDOWS_XP);
self::assertEquals(OSType::WINDOWS_XP, $request->getOS());
}
/**
* @testdox The browser can be set and returned
* @covers phpOMS\Message\Http\HttpRequest<extended>
* @group framework
*/
public function testBrowserTypeInputOutput() : void
{
$request = new HttpRequest(new HttpUri('http://www.google.com/test/path'), $l11n = new Localization());
$request->setOS(OSType::WINDOWS_XP);
self::assertEquals(OSType::WINDOWS_XP, $request->getOS());
$request->setBrowser(BrowserType::EDGE);
self::assertEquals(BrowserType::EDGE, $request->getBrowser());
self::assertEquals(['browser' => BrowserType::EDGE, 'os' => OSType::WINDOWS_XP], $request->getRequestInfo());
}
/**
* @testdox The request method can be set and returned
* @covers phpOMS\Message\Http\HttpRequest<extended>
* @group framework
*/
public function testRequestMethodInputOutput() : void
{
$request = new HttpRequest(new HttpUri('http://www.google.com/test/path'), $l11n = new Localization());
$request->setMethod(RequestMethod::PUT);
self::assertEquals(RequestMethod::PUT, $request->getMethod());
self::assertEquals(RouteVerb::PUT, $request->getRouteVerb());
}
/**
* @testdox The request referer can be returned
* @covers phpOMS\Message\Http\HttpRequest<extended>
* @group framework
*/
public function testRequestRefererOutput() : void
{
$request = new HttpRequest(new HttpUri(''), $l11n = new Localization());
self::assertEquals('', $request->getReferer());
}
/**
* @testdox The route verb gets correctly inferred from the request method
* @covers phpOMS\Message\Http\HttpRequest<extended>
* @group framework
*/
public function testRequestMethodToRouteVerb() : void
{
$request = new HttpRequest(new HttpUri('http://www.google.com/test/path'), $l11n = new Localization());
$request->setMethod(RequestMethod::PUT);
self::assertEquals(RouteVerb::PUT, $request->getRouteVerb());
$request->setMethod(RequestMethod::DELETE);
self::assertEquals(RouteVerb::DELETE, $request->getRouteVerb());
$request->setMethod(RequestMethod::POST);
self::assertEquals(RouteVerb::SET, $request->getRouteVerb());
}
/**
* @testdox The request is correctly constructed
* @covers phpOMS\Message\Http\HttpRequest<extended>
* @group framework
*/
public function testConstructInputOutput() : void
{
$request = new HttpRequest(new HttpUri('http://www.google.com/test/path'), $l11n = new Localization());
self::assertEquals('http://www.google.com/test/path', $request->__toString());
}
/**
* @testdox The request langauge can be returned
* @covers phpOMS\Message\Http\HttpRequest<extended>
* @group framework
*/
public function testLangaugeOutput() : void
{
$request = new HttpRequest(new HttpUri('http://www.google.com/test/path'), $l11n = new Localization());
$request->header->l11n = new Localization();
$request->header->l11n->setLanguage(ISO639x1Enum::_DE);
self::assertEquals(ISO639x1Enum::_DE, $request->getLanguage());
}
/**
* @testdox The url hashes for the different paths get correctly generated
* @covers phpOMS\Message\Http\HttpRequest<extended>
* @group framework
*/
public function testHashingInputOutput() : void
{
$request = new HttpRequest(new HttpUri('http://www.google.com/test/path'), $l11n = new Localization());
$request->createRequestHashs(0);
self::assertEquals([
'da39a3ee5e6b4b0d3255bfef95601890afd80709',
'a94a8fe5ccb19ba61c4c0873d391e987982fbbd3',
'328413d996ab9b79af9d4098af3a65b885c4ca64',
], $request->getHash());
self::assertEquals($l11n, $request->header->l11n);
}
/**
* @testdox Request data can be forcefully overwritten
* @covers phpOMS\Message\Http\HttpRequest<extended>
* @group framework
*/
public function testOverwrite() : void
{
$request = new HttpRequest(new HttpUri('http://www.google.com/test/path'), $l11n = new Localization());
self::assertTrue($request->setData('key', 'value'));
self::assertTrue($request->setData('key', 'value2', true));
self::assertEquals('value2', $request->getData('key'));
}
/**
* @testdox Request data is not overwritten by default
* @covers phpOMS\Message\Http\HttpRequest<extended>
* @group framework
*/
public function testInvalidOverwrite() : void
{
$request = new HttpRequest(new HttpUri('http://www.google.com/test/path'), $l11n = new Localization());
self::assertTrue($request->setData('key', 'value'));
self::assertFalse($request->setData('key', 'value2'));
self::assertEquals('value', $request->getData('key'));
}
/**
* @testdox The uri can be changed and returned
* @covers phpOMS\Message\Http\HttpRequest<extended>
* @group framework
*/
public function testUriInputOutput() : void
{
$request = new HttpRequest(new HttpUri('http://www.google.com/test/path'), $l11n = new Localization());
$request->setUri(new HttpUri('http://www.google.com/test/path2'));
self::assertEquals('http://www.google.com/test/path2', $request->__toString());
}
/**
* @testdox Json data can be read from the request
* @covers phpOMS\Message\Http\HttpRequest<extended>
* @group framework
*/
public function testDataJsonRead() : void
{
$request = new HttpRequest(new HttpUri(''));
$data = [
1, 2, 3,
'a' => 'b',
'b' => [4, 5],
];
$request->setData('abc', \json_encode($data));
self::assertEquals($data, $request->getDataJson('abc'));
}
/**
* @testdox None-existing json data reads return empty data
* @covers phpOMS\Message\Http\HttpRequest<extended>
* @group framework
*/
public function testEmptyDataJsonRead() : void
{
$request = new HttpRequest(new HttpUri(''));
self::assertEquals([], $request->getDataJson('def'));
}
/**
* @testdox Invalid json data returns empty data
* @covers phpOMS\Message\Http\HttpRequest<extended>
* @group framework
*/
public function testInvalidDataJsonRead() : void
{
$request = new HttpRequest(new HttpUri(''));
$data = [
1, 2, 3,
'a' => 'b',
'b' => [4, 5],
];
$request->setData('abc', \json_encode($data) . ',');
self::assertEquals([], $request->getDataJson('abc'));
}
/**
* @testdox List data can be read from the request
* @covers phpOMS\Message\Http\HttpRequest<extended>
* @group framework
*/
public function testDataList() : void
{
$request = new HttpRequest(new HttpUri(''));
$data = [
1, 2, 3,
'a', 'b',
];
$request->setData('abc', \implode(',', $data));
self::assertEquals($data, $request->getDataList('abc'));
}
/**
* @testdox None-existing list data reads return empty data
* @covers phpOMS\Message\Http\HttpRequest<extended>
* @group framework
*/
public function testEmptyDataList() : void
{
$request = new HttpRequest(new HttpUri(''));
self::assertEquals([], $request->getDataList('def'));
}
/**
* @testdox Request data can be read with pattern matching
* @covers phpOMS\Message\Http\HttpRequest<extended>
* @group framework
*/
public function testDataLike() : void
{
$request = new HttpRequest(new HttpUri(''));
$data = 'this is a test';
$request->setData('abcde', $data);
self::assertEquals(['abcde' => $data], $request->getLike('.*'));
self::assertEquals(['abcde' => $data], $request->getLike('[a-z]*'));
}
/**
* @testdox In case of no pattern matches empty data is returned
* @covers phpOMS\Message\Http\HttpRequest<extended>
* @group framework
*/
public function testInvalidDataLikeMatch() : void
{
$request = new HttpRequest(new HttpUri(''));
$data = 'this is a test';
$request->setData('abcde', $data);
self::assertEquals([], $request->getLike('[a-z]*\d'));
self::assertEquals([], $request->getLike('abcdef'));
}
/**
* @testdox A request with a path can be correctly casted to a string
* @covers phpOMS\Message\Http\HttpRequest<extended>
* @group framework
*/
public function testToString() : void
{
$request = new HttpRequest(new HttpUri('http://www.google.com/test/path'));
self::assertEquals('http://www.google.com/test/path', $request->__toString());
}
/**
* @testdox A request with a path and manually added data can be correctly casted to a string
* @covers phpOMS\Message\Http\HttpRequest<extended>
* @group framework
*/
public function testToStringData() : void
{
$request = new HttpRequest(new HttpUri('http://www.google.com/test/path'));
$request->setData('test', 'data');
$request->setData('test2', 3);
self::assertEquals('http://www.google.com/test/path?test=data&test2=3', $request->__toString());
}
/**
* @testdox A request with a path, query parameters and manually added data can be correctly casted to a string
* @covers phpOMS\Message\Http\HttpRequest<extended>
* @group framework
*/
public function testToStringGetData() : void
{
$request = new HttpRequest(new HttpUri('http://www.google.com/test/path?test=var'));
self::assertEquals('http://www.google.com/test/path?test=var', $request->__toString());
$request->setData('test', 'data');
$request->setData('test2', 3);
self::assertEquals('http://www.google.com/test/path?test=var&test=data&test2=3', $request->__toString());
}
/**
* @testdox A rest request can be made from a request and the result can be read
* @covers phpOMS\Message\Http\HttpRequest<extended>
* @group framework
*/
public function testRestRequest() : void
{
$request = new HttpRequest(new HttpUri('https://raw.githubusercontent.com/Karaka-Management/Karaka/develop/LICENSE.txt'));
$request->setMethod(RequestMethod::GET);
self::assertEquals(
\file_get_contents(__DIR__ . '/../../../LICENSE.txt'),
$request->rest()->getBody()
);
}
/**
* @testdox A request can be made with post data
* @covers phpOMS\Message\Http\HttpRequest<extended>
* @group framework
*/
public function testPostData() : void
{
$request = new HttpRequest(new HttpUri('http://localhost:1234' . $GLOBALS['frameworkpath'] . 'tests/Message/Http/HttpRequestPost.php'));
$request->setMethod(RequestMethod::POST);
$request->header->set('Content-Type', MimeType::M_POST);
$request->setData('testKey', 'testValue');
self::assertEquals(
\json_encode($request->getData()),
Rest::request($request)->getBody()
);
}
/**
* @testdox A request can be made with json data
* @covers phpOMS\Message\Http\HttpRequest<extended>
* @group framework
*/
public function testJsonData() : void
{
$request = new HttpRequest(new HttpUri('http://localhost:1234' . $GLOBALS['frameworkpath'] . 'tests/Message/Http/HttpRequestPost.php'));
$request->setMethod(RequestMethod::POST);
$request->header->set('Content-Type', MimeType::M_JSON);
$request->setData('testKey', 'testValue');
self::assertEquals(
\json_encode($request->getData()),
Rest::request($request)->getBody()
);
}
/**
* @testdox A request can be made with multipart data
* @covers phpOMS\Message\Http\HttpRequest<extended>
* @group framework
*/
public function testMultipartData() : void
{
$request = new HttpRequest(new HttpUri('http://localhost:1234' . $GLOBALS['frameworkpath'] . 'tests/Message/Http/HttpRequestPost.php'));
$request->setMethod(RequestMethod::POST);
$request->header->set('Content-Type', MimeType::M_MULT);
$request->setData('testKey', 'testValue');
self::assertEquals(
\json_encode($request->getData()),
Rest::request($request)->getBody()
);
}
/**
* @testdox If no language can be identified en is returned
* @covers phpOMS\Message\Http\HttpRequest<extended>
* @group framework
*/
public function testLanguage() : void
{
$request = new HttpRequest(new HttpUri('http://localhost:1234' . $GLOBALS['frameworkpath'] . 'tests/Message/Http/HttpRequestLanguage.php'));
$request->setMethod(RequestMethod::GET);
self::assertEquals(
'en',
Rest::request($request)->getBody()
);
}
/**
* @testdox If no locale can be identified en_US is returned
* @covers phpOMS\Message\Http\HttpRequest<extended>
* @group framework
*/
public function testLocale() : void
{
$request = new HttpRequest(new HttpUri('http://localhost:1234' . $GLOBALS['frameworkpath'] . 'tests/Message/Http/HttpRequestLocale.php'));
$request->setMethod(RequestMethod::GET);
self::assertEquals(
'en_US',
Rest::request($request)->getBody()
);
}
/**
* @testdox A none-mobile request is recognized as none-mobile
* @covers phpOMS\Message\Http\HttpRequest<extended>
* @group framework
*/
public function testMobile() : void
{
$request = new HttpRequest(new HttpUri('http://localhost:1234' . $GLOBALS['frameworkpath'] . 'tests/Message/Http/HttpRequestMobile.php'));
$request->setMethod(RequestMethod::GET);
self::assertEquals(
(string) false,
Rest::request($request)->getBody()
);
}
/**
* @testdox If the OS type is unknown a unknwon OS type is returned
* @covers phpOMS\Message\Http\HttpRequest<extended>
* @group framework
*/
public function testOS() : void
{
$request = new HttpRequest(new HttpUri('http://localhost:1234' . $GLOBALS['frameworkpath'] . 'tests/Message/Http/HttpRequestOS.php'));
$request->setMethod(RequestMethod::GET);
self::assertEquals(
OSType::UNKNOWN,
Rest::request($request)->getBody()
);
}
/**
* @testdox If the browser type is unknown a unknwon browser type is returned
* @covers phpOMS\Message\Http\HttpRequest<extended>
* @group framework
*/
public function testBrowser() : void
{
$request = new HttpRequest(new HttpUri('http://localhost:1234' . $GLOBALS['frameworkpath'] . 'tests/Message/Http/HttpRequestBrowser.php'));
$request->setMethod(RequestMethod::GET);
self::assertEquals(
BrowserType::UNKNOWN,
Rest::request($request)->getBody()
);
}
/**
* @testdox A invalid https port throws a OutOfRangeException
* @covers phpOMS\Message\Http\HttpRequest<extended>
* @group framework
*/
public function testInvalidHttpsPort() : void
{
$this->expectException(\OutOfRangeException::class);
$request = new HttpRequest(new HttpUri('http://www.google.com/test/path'));
$request->isHttps(-1);
}
/**
* @testdox A Invalid route verb throws a Exception
* @covers phpOMS\Message\Http\HttpRequest<extended>
* @group framework
*/
public function testInvalidRouteVerb() : void
{
$this->expectException(\Exception::class);
$request = new HttpRequest(new HttpUri('http://www.google.com/test/path'));
$request->setMethod('failure');
$request->getRouteVerb();
}
}