prepareApp(); $this->request = new Request(); } protected function tearDown(): void { m::close(); } public function testConstructor() { $request = new Request(); $this->assertInstanceOf(Request::class, $request); } public function testMake() { $request = Request::__make($this->app); $this->assertInstanceOf(Request::class, $request); } public function testGetMethod() { $_SERVER['REQUEST_METHOD'] = 'GET'; $this->assertEquals('GET', $this->request->method()); $this->assertTrue($this->request->isGet()); $this->assertFalse($this->request->isPost()); } public function testPostMethod() { $request = new Request(); $request->withServer(['REQUEST_METHOD' => 'POST']); $this->assertEquals('POST', $request->method()); $this->assertTrue($request->isPost()); $this->assertFalse($request->isGet()); } public function testPutMethod() { $request = new Request(); $request->withServer(['REQUEST_METHOD' => 'PUT']); $this->assertEquals('PUT', $request->method()); $this->assertTrue($request->isPut()); $this->assertFalse($request->isGet()); } public function testDeleteMethod() { $request = new Request(); $request->withServer(['REQUEST_METHOD' => 'DELETE']); $this->assertEquals('DELETE', $request->method()); $this->assertTrue($request->isDelete()); $this->assertFalse($request->isGet()); } public function testHeadMethod() { $request = new Request(); $request->withServer(['REQUEST_METHOD' => 'HEAD']); $this->assertEquals('HEAD', $request->method()); $this->assertTrue($request->isHead()); $this->assertFalse($request->isGet()); } public function testPatchMethod() { $request = new Request(); $request->withServer(['REQUEST_METHOD' => 'PATCH']); $this->assertEquals('PATCH', $request->method()); $this->assertTrue($request->isPatch()); $this->assertFalse($request->isGet()); } public function testOptionsMethod() { $request = new Request(); $request->withServer(['REQUEST_METHOD' => 'OPTIONS']); $this->assertEquals('OPTIONS', $request->method()); $this->assertTrue($request->isOptions()); $this->assertFalse($request->isGet()); } public function testGetParameter() { $request = new Request(); $request->withGet(['test' => 'value']); $this->assertEquals('value', $request->get('test')); $this->assertEquals('default', $request->get('missing', 'default')); $this->assertEquals(['test' => 'value'], $request->get()); } public function testPostParameter() { $request = new Request(); $request->withPost(['test' => 'value']); $this->assertEquals('value', $request->post('test')); $this->assertEquals('default', $request->post('missing', 'default')); $this->assertEquals(['test' => 'value'], $request->post()); } public function testParamMethod() { $request = new Request(); $request->withGet(['get_param' => 'get_value']) ->withPost(['post_param' => 'post_value']) ->withServer(['REQUEST_METHOD' => 'POST']); $this->assertEquals('get_value', $request->param('get_param')); $this->assertEquals('post_value', $request->param('post_param')); $this->assertEquals('default', $request->param('missing', 'default')); } public function testHasMethod() { $request = new Request(); $request->withGet(['test' => 'value']) ->withPost(['post_test' => 'post_value']) ->withServer(['REQUEST_METHOD' => 'POST']); $this->assertTrue($request->has('test')); $this->assertTrue($request->has('post_test')); $this->assertFalse($request->has('missing')); } public function testOnlyMethod() { $request = new Request(); $request->withGet(['param1' => 'value1', 'param2' => 'value2', 'param3' => 'value3']); $result = $request->only(['param1', 'param3']); $this->assertEquals(['param1' => 'value1', 'param3' => 'value3'], $result); } public function testExceptMethod() { $request = new Request(); $request->withGet(['param1' => 'value1', 'param2' => 'value2', 'param3' => 'value3']); $result = $request->except(['param2']); $this->assertEquals(['param1' => 'value1', 'param3' => 'value3'], $result); } public function testHeader() { $request = new Request(); $request->withHeader(['content-type' => 'application/json', 'authorization' => 'Bearer token123']); $this->assertEquals('application/json', $request->header('content-type')); $this->assertEquals('Bearer token123', $request->header('authorization')); $this->assertEquals('default', $request->header('missing', 'default')); } public function testServer() { $request = new Request(); $request->withServer(['HTTP_HOST' => 'example.com', 'REQUEST_URI' => '/test']); $this->assertEquals('example.com', $request->server('HTTP_HOST')); $this->assertEquals('/test', $request->server('REQUEST_URI')); $this->assertEquals('default', $request->server('missing', 'default')); } public function testCookie() { $request = new Request(); $request->withCookie(['test_cookie' => 'cookie_value']); $this->assertEquals('cookie_value', $request->cookie('test_cookie')); $this->assertEquals('default', $request->cookie('missing', 'default')); } public function testIsAjax() { $request = new Request(); $request->withServer(['HTTP_X_REQUESTED_WITH' => 'XMLHttpRequest']); $this->assertTrue($request->isAjax()); $request2 = new Request(); $this->assertFalse($request2->isAjax()); } public function testIsPjax() { $request = new Request(); $request->withServer(['HTTP_X_PJAX' => 'true']); $this->assertTrue($request->isPjax()); $request2 = new Request(); $this->assertFalse($request2->isPjax()); } public function testIsJson() { $request = new Request(); $request->withServer(['HTTP_ACCEPT' => 'application/json']); $this->assertTrue($request->isJson()); $request2 = new Request(); $request2->withServer(['HTTP_ACCEPT' => 'text/html']); $this->assertFalse($request2->isJson()); } public function testIsSsl() { $request = new Request(); $request->withServer(['HTTPS' => 'on']); $this->assertTrue($request->isSsl()); $request2 = new Request(); $request2->withServer(['HTTPS' => 'off']); $this->assertFalse($request2->isSsl()); $request3 = new Request(); $request3->withServer(['REQUEST_SCHEME' => 'https']); $this->assertTrue($request3->isSsl()); } public function testScheme() { $request = new Request(); $request->withServer(['HTTPS' => 'on']); $this->assertEquals('https', $request->scheme()); $request2 = new Request(); $request2->withServer(['HTTPS' => 'off']); $this->assertEquals('http', $request2->scheme()); } public function testHost() { $request = new Request(); $request->withServer(['HTTP_HOST' => 'example.com:8080']); $this->assertEquals('example.com:8080', $request->host()); $request2 = new Request(); $request2->withServer(['HTTP_HOST' => 'sub.example.com']); $this->assertEquals('sub.example.com', $request2->host()); } public function testPort() { $request = new Request(); $request->withServer(['SERVER_PORT' => '8080']); $this->assertEquals(8080, $request->port()); $request2 = new Request(); $request2->withServer(['SERVER_PORT' => '80']); $this->assertEquals(80, $request2->port()); } public function testDomain() { $request = new Request(); $request->withServer(['HTTP_HOST' => 'www.example.com', 'HTTPS' => 'on']); $this->assertEquals('https://www.example.com', $request->domain()); $request2 = new Request(); $request2->withServer(['HTTP_HOST' => 'www.example.com', 'HTTPS' => 'off']); $this->assertEquals('http://www.example.com', $request2->domain()); } public function testSubDomain() { $request = new Request(); $request->withServer(['HTTP_HOST' => 'sub.example.com']); $this->assertEquals('sub', $request->subDomain()); $request2 = new Request(); $request2->withServer(['HTTP_HOST' => 'www.sub.example.com']); $this->assertEquals('www.sub', $request2->subDomain()); $request3 = new Request(); $request3->withServer(['HTTP_HOST' => 'example.com']); $this->assertEquals('', $request3->subDomain()); } public function testRootDomain() { $request = new Request(); $request->withServer(['HTTP_HOST' => 'www.example.com']); $this->assertEquals('example.com', $request->rootDomain()); $request2 = new Request(); $request2->withServer(['HTTP_HOST' => 'sub.example.co.uk']); $this->assertEquals('example.co.uk', $request2->rootDomain()); } public function testPathinfo() { $request = new Request(); $request->withServer(['PATH_INFO' => '/user/profile']); $this->assertEquals('user/profile', $request->pathinfo()); $request2 = new Request(); $request2->withServer(['REQUEST_URI' => '/app.php/user/profile?id=1', 'SCRIPT_NAME' => '/app.php']); $this->assertEquals('app.php/user/profile', $request2->pathinfo()); } public function testUrl() { $request = new Request(); $request->withServer(['HTTP_HOST' => 'example.com', 'REQUEST_URI' => '/path/to/resource?param=value']); $result = $request->url(); $this->assertStringContainsString('/path/to/resource', $result); } public function testBaseUrl() { $request = new Request(); $request->withServer(['SCRIPT_NAME' => '/app/index.php', 'REQUEST_URI' => '/app/user/profile']); $this->assertEquals('/app/user/profile', $request->baseUrl()); } public function testRoot() { $request = new Request(); $request->withServer(['SCRIPT_NAME' => '/app/public/index.php']); $this->assertEquals('', $request->root()); } public function testQuery() { $request = new Request(); $request->withServer(['QUERY_STRING' => 'param1=value1¶m2=value2']); $this->assertEquals('param1=value1¶m2=value2', $request->query()); } public function testIp() { $request = new Request(); $request->withServer(['REMOTE_ADDR' => '192.168.1.100']); $this->assertEquals('192.168.1.100', $request->ip()); // Test with proxy - need to configure proxy IPs first $request2 = new Request(); $request2->withServer(['REMOTE_ADDR' => '192.168.1.100']) ->withHeader(['x-forwarded-for' => '203.0.113.1, 192.168.1.100']); // Without proper proxy configuration, it returns REMOTE_ADDR $this->assertEquals('192.168.1.100', $request2->ip()); } public function testIsValidIP() { $this->assertTrue($this->request->isValidIP('192.168.1.1')); $this->assertTrue($this->request->isValidIP('2001:db8::1')); $this->assertFalse($this->request->isValidIP('invalid.ip')); $this->assertFalse($this->request->isValidIP('999.999.999.999')); } public function testTime() { $request = new Request(); $request->withServer(['REQUEST_TIME_FLOAT' => 1234567890.123]); $this->assertEquals(1234567890.123, $request->time(true)); $request2 = new Request(); $request2->withServer(['REQUEST_TIME' => 1234567890]); $this->assertEquals(1234567890, $request2->time()); } public function testType() { $request = new Request(); $request->withHeader(['content-type' => 'application/json']); // Type method may return empty if not configured properly $type = $request->type(); $this->assertIsString($type); $request2 = new Request(); $request2->withHeader(['content-type' => 'text/html; charset=utf-8']); $type2 = $request2->type(); $this->assertIsString($type2); } public function testContentType() { $request = new Request(); $request->withHeader(['content-type' => 'application/json; charset=utf-8']); $this->assertEquals('application/json', $request->contentType()); } public function testArrayAccess() { $request = new Request(); $request->withGet(['test' => 'value']); $this->assertTrue(isset($request['test'])); $this->assertEquals('value', $request['test']); // offsetSet is empty in Request class, so setting values has no effect $request['new'] = 'new_value'; $this->assertNull($request['new']); // offsetUnset is also empty, so unset has no effect unset($request['test']); $this->assertTrue(isset($request['test'])); } public function testWithMethods() { $request = new Request(); $newRequest = $request->withGet(['key' => 'value']); $this->assertEquals('value', $newRequest->get('key')); $newRequest = $request->withPost(['post_key' => 'post_value']); $this->assertEquals('post_value', $newRequest->post('post_key')); $newRequest = $request->withHeader(['Content-Type' => 'application/json']); $this->assertEquals('application/json', $newRequest->header('content-type')); $newRequest = $request->withServer(['HTTP_HOST' => 'test.com']); $this->assertEquals('test.com', $newRequest->server('HTTP_HOST')); $newRequest = $request->withCookie(['session' => 'abc123']); $this->assertEquals('abc123', $newRequest->cookie('session')); } public function testFilter() { $request = new Request(); $request->withGet(['email' => ' test@example.com ', 'number' => '123.45']); $this->assertEquals('test@example.com', $request->get('email', '', 'trim')); $this->assertEquals(123, $request->get('number', 0, 'intval')); $this->assertEquals(123.45, $request->get('number', 0, 'floatval')); } public function testParam() { $request = new Request(); $request->withGet(['test' => 'get_value']) ->withPost(['test' => 'post_value']); // Test basic param access $this->assertEquals('get_value', $request->param('test')); } public function testRoute() { $request = new Request(); $request->setRoute(['controller' => 'User', 'action' => 'profile']); $this->assertEquals('User', $request->route('controller')); $this->assertEquals('profile', $request->route('action')); $this->assertEquals(['controller' => 'User', 'action' => 'profile'], $request->route()); } public function testControllerAndAction() { $request = new Request(); $request->setController('User'); $request->setAction('profile'); $this->assertEquals('User', $request->controller()); $this->assertEquals('profile', $request->action()); } public function testMiddlewareProperty() { $request = new Request(); $request->withMiddleware(['auth', 'throttle']); $this->assertEquals(['auth', 'throttle'], $request->middleware()); } public function testSecureKey() { $key = $this->request->secureKey(); $this->assertIsString($key); $this->assertGreaterThan(0, strlen($key)); } public function testTokenGeneration() { // Test secure key generation $key = $this->request->secureKey(); $this->assertIsString($key); $this->assertGreaterThan(0, strlen($key)); } public function testIsCli() { // In test context, this returns true $this->assertTrue($this->request->isCli()); } public function testIsCgi() { // isCgi() checks PHP_SAPI, not server variables // In CLI test environment, this will return false $request = new Request(); $this->assertFalse($request->isCgi()); // Test the method returns boolean $this->assertIsBool($request->isCgi()); } public function testProtocol() { $request = new Request(); $request->withServer(['SERVER_PROTOCOL' => 'HTTP/1.1']); $this->assertEquals('HTTP/1.1', $request->protocol()); $request2 = new Request(); $request2->withServer(['SERVER_PROTOCOL' => 'HTTP/2.0']); $this->assertEquals('HTTP/2.0', $request2->protocol()); } public function testRemotePort() { $request = new Request(); $request->withServer(['REMOTE_PORT' => '12345']); $this->assertEquals(12345, $request->remotePort()); } public function testAll() { $request = new Request(); $request->withGet(['get_param' => 'get_value']) ->withPost(['post_param' => 'post_value']) ->withServer(['REQUEST_METHOD' => 'POST']); $all = $request->all(); $this->assertIsArray($all); $this->assertArrayHasKey('get_param', $all); // POST params might not appear in all() depending on implementation $this->assertEquals('get_value', $all['get_param']); } public function testExt() { $request = new Request(); $request->withServer(['PATH_INFO' => '/user/profile.json']); $this->assertEquals('json', $request->ext()); $request2 = new Request(); $request2->withServer(['PATH_INFO' => '/user/profile.xml']); $this->assertEquals('xml', $request2->ext()); $request3 = new Request(); $request3->withServer(['PATH_INFO' => '/user/profile']); $this->assertEquals('', $request3->ext()); } }