Files
framework/tests/RequestTest.php
2026-01-06 12:44:28 +08:00

569 lines
19 KiB
PHP

<?php
namespace think\tests;
use Mockery as m;
use PHPUnit\Framework\TestCase;
use think\App;
use think\Config;
use think\Container;
use think\Env;
use think\Request;
use think\Session;
class RequestTest extends TestCase
{
use InteractsWithApp;
/** @var Request */
protected $request;
protected function setUp(): void
{
$this->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&param2=value2']);
$this->assertEquals('param1=value1&param2=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());
}
}