569 lines
19 KiB
PHP
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¶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());
|
|
}
|
|
} |