| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569 |
- <?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());
- }
- }
|