@@ -2,22 +2,13 @@
|
||||
|
||||
namespace Tests\App\Controllers\Api;
|
||||
|
||||
use App\Controllers\Api\SessionTimeoutController;
|
||||
use CodeIgniter\HTTP\ResponseInterface;
|
||||
use App\Controllers\View\SessionTimeoutController;
|
||||
use CodeIgniter\HTTP\IncomingRequest;
|
||||
use CodeIgniter\HTTP\URI;
|
||||
use CodeIgniter\HTTP\UserAgent;
|
||||
use CodeIgniter\Test\CIUnitTestCase;
|
||||
|
||||
class TestableSessionTimeoutController extends SessionTimeoutController
|
||||
{
|
||||
protected function success($data = null, string $message = 'Success', int $code = ResponseInterface::HTTP_OK)
|
||||
{
|
||||
return ['data' => $data, 'message' => $message, 'code' => $code];
|
||||
}
|
||||
|
||||
protected function error(string $message = 'An error occurred', int $code = ResponseInterface::HTTP_BAD_REQUEST, ?array $errors = null)
|
||||
{
|
||||
return ['message' => $message, 'code' => $code, 'errors' => $errors];
|
||||
}
|
||||
}
|
||||
use Config\App;
|
||||
use Config\Services;
|
||||
|
||||
class SessionTimeoutControllerTest extends CIUnitTestCase
|
||||
{
|
||||
@@ -25,37 +16,65 @@ class SessionTimeoutControllerTest extends CIUnitTestCase
|
||||
{
|
||||
parent::tearDown();
|
||||
session()->destroy();
|
||||
Services::resetSingle('response');
|
||||
}
|
||||
|
||||
public function testGetTimeoutConfigIncludesKeys()
|
||||
public function testGetTimeoutConfigIncludesThirtyMinuteSettings(): void
|
||||
{
|
||||
$controller = new TestableSessionTimeoutController();
|
||||
$response = $controller->getTimeoutConfig();
|
||||
$this->expectOutputRegex('/^\s*$/');
|
||||
|
||||
$this->assertSame(ResponseInterface::HTTP_OK, $response['code']);
|
||||
$this->assertArrayHasKey('timeout', $response['data']);
|
||||
$this->assertArrayHasKey('check_url', $response['data']);
|
||||
$response = $this->controller()->getTimeoutConfig();
|
||||
$body = json_decode((string) $response->getBody(), true);
|
||||
|
||||
$this->assertTrue($body['success']);
|
||||
$this->assertSame(1800, $body['timeout']);
|
||||
$this->assertSame(300, $body['warning_time']);
|
||||
$this->assertStringContainsString('session/check-timeout', $body['check_url']);
|
||||
$this->assertStringContainsString('session/ping-activity', $body['keep_alive_url']);
|
||||
}
|
||||
|
||||
public function testCheckTimeoutReturnsActiveWhenFresh()
|
||||
public function testCheckTimeoutReturnsActiveWhenFresh(): void
|
||||
{
|
||||
session()->set('last_activity', time());
|
||||
$controller = new TestableSessionTimeoutController();
|
||||
$response = $controller->checkTimeout();
|
||||
|
||||
$this->assertSame(ResponseInterface::HTTP_OK, $response['code']);
|
||||
$this->assertSame('Session active', $response['message']);
|
||||
$this->assertSame('active', $response['data']['status']);
|
||||
$response = $this->controller()->checkTimeout();
|
||||
$body = json_decode((string) $response->getBody(), true);
|
||||
|
||||
$this->assertSame('active', $body['status']);
|
||||
$this->assertGreaterThan(0, $body['time_remaining']);
|
||||
}
|
||||
|
||||
public function testPingActivityRefreshesSession()
|
||||
public function testCheckTimeoutExpiresAfterThirtyMinutesOfInactivity(): void
|
||||
{
|
||||
$controller = new TestableSessionTimeoutController();
|
||||
session()->set('last_activity', time());
|
||||
session()->set('last_activity', time() - 1800);
|
||||
|
||||
$response = $controller->pingActivity();
|
||||
$this->assertSame(ResponseInterface::HTTP_OK, $response['code']);
|
||||
$this->assertSame('Session activity refreshed', $response['message']);
|
||||
$this->assertSame('active', $response['data']['status']);
|
||||
$response = $this->controller()->checkTimeout();
|
||||
$body = json_decode((string) $response->getBody(), true);
|
||||
|
||||
$this->assertSame('expired', $body['status']);
|
||||
$this->assertStringContainsString('login', $body['redirect']);
|
||||
}
|
||||
|
||||
public function testPingActivityRefreshesSession(): void
|
||||
{
|
||||
session()->set('last_activity', time() - 60);
|
||||
|
||||
$response = $this->controller()->pingActivity();
|
||||
$body = json_decode((string) $response->getBody(), true);
|
||||
|
||||
$this->assertSame('active', $body['status']);
|
||||
$this->assertSame(1800, $body['time_remaining']);
|
||||
$this->assertGreaterThanOrEqual(time() - 1, session()->get('last_activity'));
|
||||
}
|
||||
|
||||
private function controller(): SessionTimeoutController
|
||||
{
|
||||
Services::resetSingle('response');
|
||||
|
||||
$controller = new SessionTimeoutController();
|
||||
$request = new IncomingRequest(config(App::class), new URI('https://example.test/session/check-timeout'), 'php://input', new UserAgent());
|
||||
$controller->initController($request, Services::response(), Services::logger());
|
||||
|
||||
return $controller;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user