Consolidate settings session policy tests

This commit is contained in:
2026-03-19 19:45:16 +01:00
parent bc72fa50a6
commit 5c7a1148ac
3 changed files with 143 additions and 276 deletions

View File

@@ -1,178 +0,0 @@
<?php
namespace MintyPHP\Tests\Service\Settings;
use MintyPHP\Service\Settings\SettingsLoginPersistenceGateway;
use MintyPHP\Service\Settings\SettingsMetadataGateway;
use PHPUnit\Framework\TestCase;
class SettingsLoginPersistenceGatewayTest extends TestCase
{
// ---------------------------------------------------------------
// isMicrosoftAutoRememberDefault
// ---------------------------------------------------------------
public function testAutoRememberDefaultReturnsFalseWhenNotSet(): void
{
$metadata = $this->createMock(SettingsMetadataGateway::class);
$metadata->method('getValue')->willReturn(null);
$gateway = new SettingsLoginPersistenceGateway($metadata);
$this->assertFalse($gateway->isMicrosoftAutoRememberDefault());
}
public function testAutoRememberDefaultReturnsFalseForZero(): void
{
$metadata = $this->createMock(SettingsMetadataGateway::class);
$metadata->method('getValue')->willReturn('0');
$gateway = new SettingsLoginPersistenceGateway($metadata);
$this->assertFalse($gateway->isMicrosoftAutoRememberDefault());
}
public function testAutoRememberDefaultReturnsTrueForOne(): void
{
$metadata = $this->createMock(SettingsMetadataGateway::class);
$metadata->method('getValue')->willReturn('1');
$gateway = new SettingsLoginPersistenceGateway($metadata);
$this->assertTrue($gateway->isMicrosoftAutoRememberDefault());
}
public function testAutoRememberDefaultReturnsFalseForEmptyString(): void
{
$metadata = $this->createMock(SettingsMetadataGateway::class);
$metadata->method('getValue')->willReturn('');
$gateway = new SettingsLoginPersistenceGateway($metadata);
$this->assertFalse($gateway->isMicrosoftAutoRememberDefault());
}
public function testSetAutoRememberDefaultPersistsValue(): void
{
$metadata = $this->createMock(SettingsMetadataGateway::class);
$metadata->expects($this->once())
->method('set')
->with('microsoft_auto_remember_default', '1', $this->anything())
->willReturn(true);
$gateway = new SettingsLoginPersistenceGateway($metadata);
$this->assertTrue($gateway->setMicrosoftAutoRememberDefault(true));
}
public function testSetAutoRememberDefaultPersistsFalseAsZero(): void
{
$metadata = $this->createMock(SettingsMetadataGateway::class);
$metadata->expects($this->once())
->method('set')
->with('microsoft_auto_remember_default', '0', $this->anything())
->willReturn(true);
$gateway = new SettingsLoginPersistenceGateway($metadata);
$this->assertTrue($gateway->setMicrosoftAutoRememberDefault(false));
}
// ---------------------------------------------------------------
// getRememberTokenLifetimeDays
// ---------------------------------------------------------------
public function testLifetimeDaysReturnsFallbackWhenNotSet(): void
{
$metadata = $this->createMock(SettingsMetadataGateway::class);
$metadata->method('getInt')->willReturn(null);
$gateway = new SettingsLoginPersistenceGateway($metadata);
$this->assertSame(30, $gateway->getRememberTokenLifetimeDays());
}
public function testLifetimeDaysReturnsConfiguredValue(): void
{
$metadata = $this->createMock(SettingsMetadataGateway::class);
$metadata->method('getInt')->willReturn(7);
$gateway = new SettingsLoginPersistenceGateway($metadata);
$this->assertSame(7, $gateway->getRememberTokenLifetimeDays());
}
public function testLifetimeDaysReturnsFallbackForZero(): void
{
$metadata = $this->createMock(SettingsMetadataGateway::class);
$metadata->method('getInt')->willReturn(0);
$gateway = new SettingsLoginPersistenceGateway($metadata);
$this->assertSame(30, $gateway->getRememberTokenLifetimeDays());
}
public function testLifetimeDaysReturnsFallbackForValueAboveMax(): void
{
$metadata = $this->createMock(SettingsMetadataGateway::class);
$metadata->method('getInt')->willReturn(500);
$gateway = new SettingsLoginPersistenceGateway($metadata);
$this->assertSame(30, $gateway->getRememberTokenLifetimeDays());
}
public function testSetLifetimeDaysAcceptsValidRange(): void
{
$metadata = $this->createMock(SettingsMetadataGateway::class);
$metadata->expects($this->once())
->method('set')
->with('remember_token_lifetime_days', '14', $this->anything())
->willReturn(true);
$gateway = new SettingsLoginPersistenceGateway($metadata);
$this->assertTrue($gateway->setRememberTokenLifetimeDays(14));
}
public function testSetLifetimeDaysRejectsZero(): void
{
$metadata = $this->createMock(SettingsMetadataGateway::class);
$metadata->expects($this->never())->method('set');
$gateway = new SettingsLoginPersistenceGateway($metadata);
$this->assertFalse($gateway->setRememberTokenLifetimeDays(0));
}
public function testSetLifetimeDaysRejectsAboveMax(): void
{
$metadata = $this->createMock(SettingsMetadataGateway::class);
$metadata->expects($this->never())->method('set');
$gateway = new SettingsLoginPersistenceGateway($metadata);
$this->assertFalse($gateway->setRememberTokenLifetimeDays(400));
}
public function testSetLifetimeDaysNullFallsBackToDefault(): void
{
$metadata = $this->createMock(SettingsMetadataGateway::class);
$metadata->expects($this->once())
->method('set')
->with('remember_token_lifetime_days', '30', $this->anything())
->willReturn(true);
$gateway = new SettingsLoginPersistenceGateway($metadata);
$this->assertTrue($gateway->setRememberTokenLifetimeDays(null));
}
// ---------------------------------------------------------------
// getRememberTokenLifetimeSeconds
// ---------------------------------------------------------------
public function testLifetimeSecondsComputesCorrectly(): void
{
$metadata = $this->createMock(SettingsMetadataGateway::class);
$metadata->method('getInt')->willReturn(7);
$gateway = new SettingsLoginPersistenceGateway($metadata);
$this->assertSame(7 * 86400, $gateway->getRememberTokenLifetimeSeconds());
}
public function testLifetimeSecondsFallbackIs30Days(): void
{
$metadata = $this->createMock(SettingsMetadataGateway::class);
$metadata->method('getInt')->willReturn(null);
$gateway = new SettingsLoginPersistenceGateway($metadata);
$this->assertSame(30 * 86400, $gateway->getRememberTokenLifetimeSeconds());
}
}

View File

@@ -1,98 +0,0 @@
<?php
namespace MintyPHP\Tests\Service\Settings;
use MintyPHP\Repository\Settings\SettingRepositoryInterface;
use MintyPHP\Service\Settings\SettingsMetadataGateway;
use MintyPHP\Service\Settings\SettingsSessionGateway;
use PHPUnit\Framework\TestCase;
class SettingsSessionGatewayTest extends TestCase
{
public function testGetSessionIdleTimeoutMinutesReturnsFallbackWhenNotSet(): void
{
$gateway = $this->createGateway(null);
$this->assertSame(30, $gateway->getSessionIdleTimeoutMinutes());
}
public function testGetSessionAbsoluteTimeoutHoursReturnsFallbackWhenNotSet(): void
{
$gateway = $this->createGateway(null);
$this->assertSame(8, $gateway->getSessionAbsoluteTimeoutHours());
}
public function testGetSessionIdleTimeoutMinutesReturnsStoredValue(): void
{
$gateway = $this->createGateway('15', 'session_idle_timeout_minutes');
$this->assertSame(15, $gateway->getSessionIdleTimeoutMinutes());
}
public function testGetSessionAbsoluteTimeoutHoursReturnsStoredValue(): void
{
$gateway = $this->createGateway('12', 'session_absolute_timeout_hours');
$this->assertSame(12, $gateway->getSessionAbsoluteTimeoutHours());
}
public function testGetSessionIdleTimeoutMinutesReturnsFallbackForOutOfBoundsValue(): void
{
$gateway = $this->createGateway('2', 'session_idle_timeout_minutes');
$this->assertSame(30, $gateway->getSessionIdleTimeoutMinutes());
}
public function testGetSessionAbsoluteTimeoutHoursReturnsFallbackForOutOfBoundsValue(): void
{
$gateway = $this->createGateway('100', 'session_absolute_timeout_hours');
$this->assertSame(8, $gateway->getSessionAbsoluteTimeoutHours());
}
public function testSetSessionIdleTimeoutMinutesRejectsBelowMinimum(): void
{
$settings = $this->createMock(SettingRepositoryInterface::class);
$settings->expects($this->never())->method('set');
$gateway = new SettingsSessionGateway(new SettingsMetadataGateway($settings));
$this->assertFalse($gateway->setSessionIdleTimeoutMinutes(2));
}
public function testSetSessionIdleTimeoutMinutesRejectsAboveMaximum(): void
{
$settings = $this->createMock(SettingRepositoryInterface::class);
$settings->expects($this->never())->method('set');
$gateway = new SettingsSessionGateway(new SettingsMetadataGateway($settings));
$this->assertFalse($gateway->setSessionIdleTimeoutMinutes(2000));
}
public function testSetSessionAbsoluteTimeoutHoursRejectsZero(): void
{
$settings = $this->createMock(SettingRepositoryInterface::class);
$settings->expects($this->never())->method('set');
$gateway = new SettingsSessionGateway(new SettingsMetadataGateway($settings));
$this->assertFalse($gateway->setSessionAbsoluteTimeoutHours(0));
}
public function testGetSessionIdleTimeoutSecondsConvertsCorrectly(): void
{
$gateway = $this->createGateway('15', 'session_idle_timeout_minutes');
$this->assertSame(900, $gateway->getSessionIdleTimeoutSeconds());
}
public function testGetSessionAbsoluteTimeoutSecondsConvertsCorrectly(): void
{
$gateway = $this->createGateway('4', 'session_absolute_timeout_hours');
$this->assertSame(14400, $gateway->getSessionAbsoluteTimeoutSeconds());
}
private function createGateway(?string $returnValue, string $forKey = ''): SettingsSessionGateway
{
$settings = $this->createMock(SettingRepositoryInterface::class);
$settings->method('getValue')->willReturnCallback(
static function (string $key) use ($returnValue, $forKey): ?string {
if ($forKey !== '' && $key === $forKey) {
return $returnValue;
}
return $returnValue !== null && $forKey === '' ? $returnValue : null;
}
);
return new SettingsSessionGateway(new SettingsMetadataGateway($settings));
}
}

View File

@@ -0,0 +1,143 @@
<?php
namespace MintyPHP\Tests\Service\Settings;
use MintyPHP\Repository\Settings\SettingRepositoryInterface;
use MintyPHP\Service\Settings\SettingsLoginPersistenceGateway;
use MintyPHP\Service\Settings\SettingsMetadataGateway;
use MintyPHP\Service\Settings\SettingsSessionGateway;
use PHPUnit\Framework\TestCase;
final class SettingsSessionPolicyGatewayTest extends TestCase
{
public function testSessionTimeoutsUseFallbacksWhenMissing(): void
{
$gateway = $this->newSessionGateway(null, null);
self::assertSame(30, $gateway->getSessionIdleTimeoutMinutes());
self::assertSame(8, $gateway->getSessionAbsoluteTimeoutHours());
}
public function testSessionTimeoutsUseStoredValuesWhenValid(): void
{
$gateway = $this->newSessionGateway('15', '12');
self::assertSame(15, $gateway->getSessionIdleTimeoutMinutes());
self::assertSame(12, $gateway->getSessionAbsoluteTimeoutHours());
self::assertSame(900, $gateway->getSessionIdleTimeoutSeconds());
self::assertSame(43200, $gateway->getSessionAbsoluteTimeoutSeconds());
}
public function testSessionTimeoutsFallbackWhenOutOfBounds(): void
{
$gateway = $this->newSessionGateway('2', '100');
self::assertSame(30, $gateway->getSessionIdleTimeoutMinutes());
self::assertSame(8, $gateway->getSessionAbsoluteTimeoutHours());
}
public function testSessionSettersRejectInvalidValues(): void
{
$settings = $this->createMock(SettingRepositoryInterface::class);
$settings->expects($this->never())->method('set');
$gateway = new SettingsSessionGateway(new SettingsMetadataGateway($settings));
self::assertFalse($gateway->setSessionIdleTimeoutMinutes(2));
self::assertFalse($gateway->setSessionIdleTimeoutMinutes(2000));
self::assertFalse($gateway->setSessionAbsoluteTimeoutHours(0));
}
public function testAutoRememberDefaultUsesExpectedBooleanNormalization(): void
{
$metadata = $this->createMock(SettingsMetadataGateway::class);
$metadata->method('getValue')->willReturnMap([
['microsoft_auto_remember_default', null],
['microsoft_auto_remember_default', '1'],
]);
$gateway = new SettingsLoginPersistenceGateway($metadata);
self::assertFalse($gateway->isMicrosoftAutoRememberDefault());
$metadataTrue = $this->createMock(SettingsMetadataGateway::class);
$metadataTrue->method('getValue')->with('microsoft_auto_remember_default')->willReturn('1');
$gatewayTrue = new SettingsLoginPersistenceGateway($metadataTrue);
self::assertTrue($gatewayTrue->isMicrosoftAutoRememberDefault());
}
public function testAutoRememberSetterPersistsBooleanFlag(): void
{
$metadata = $this->createMock(SettingsMetadataGateway::class);
$metadata->expects($this->exactly(2))
->method('set')
->willReturnCallback(static function (string $key, ?string $value): bool {
return $key === 'microsoft_auto_remember_default'
&& in_array($value, ['0', '1'], true);
});
$gateway = new SettingsLoginPersistenceGateway($metadata);
self::assertTrue($gateway->setMicrosoftAutoRememberDefault(true));
self::assertTrue($gateway->setMicrosoftAutoRememberDefault(false));
}
public function testRememberTokenLifetimeUsesFallbackWhenMissingOrInvalid(): void
{
$metadataMissing = $this->createMock(SettingsMetadataGateway::class);
$metadataMissing->method('getInt')->with('remember_token_lifetime_days')->willReturn(null);
$gatewayMissing = new SettingsLoginPersistenceGateway($metadataMissing);
self::assertSame(30, $gatewayMissing->getRememberTokenLifetimeDays());
self::assertSame(30 * 86400, $gatewayMissing->getRememberTokenLifetimeSeconds());
$metadataInvalid = $this->createMock(SettingsMetadataGateway::class);
$metadataInvalid->method('getInt')->with('remember_token_lifetime_days')->willReturn(500);
$gatewayInvalid = new SettingsLoginPersistenceGateway($metadataInvalid);
self::assertSame(30, $gatewayInvalid->getRememberTokenLifetimeDays());
}
public function testRememberTokenLifetimeAcceptsValidRangeAndComputesSeconds(): void
{
$metadata = $this->createMock(SettingsMetadataGateway::class);
$metadata->method('getInt')->with('remember_token_lifetime_days')->willReturn(7);
$metadata->expects($this->once())
->method('set')
->with('remember_token_lifetime_days', '14', $this->anything())
->willReturn(true);
$gateway = new SettingsLoginPersistenceGateway($metadata);
self::assertSame(7, $gateway->getRememberTokenLifetimeDays());
self::assertSame(7 * 86400, $gateway->getRememberTokenLifetimeSeconds());
self::assertTrue($gateway->setRememberTokenLifetimeDays(14));
}
public function testRememberTokenLifetimeRejectsInvalidRangeAndNullUsesDefault(): void
{
$rejectingMetadata = $this->createMock(SettingsMetadataGateway::class);
$rejectingMetadata->expects($this->never())->method('set');
$rejectingGateway = new SettingsLoginPersistenceGateway($rejectingMetadata);
self::assertFalse($rejectingGateway->setRememberTokenLifetimeDays(0));
self::assertFalse($rejectingGateway->setRememberTokenLifetimeDays(400));
$defaultingMetadata = $this->createMock(SettingsMetadataGateway::class);
$defaultingMetadata->expects($this->once())
->method('set')
->with('remember_token_lifetime_days', '30', $this->anything())
->willReturn(true);
$defaultingGateway = new SettingsLoginPersistenceGateway($defaultingMetadata);
self::assertTrue($defaultingGateway->setRememberTokenLifetimeDays(null));
}
private function newSessionGateway(?string $idle, ?string $absolute): SettingsSessionGateway
{
$settings = $this->createMock(SettingRepositoryInterface::class);
$settings->method('getValue')->willReturnCallback(
static function (string $key) use ($idle, $absolute): ?string {
return match ($key) {
'session_idle_timeout_minutes' => $idle,
'session_absolute_timeout_hours' => $absolute,
default => null,
};
}
);
return new SettingsSessionGateway(new SettingsMetadataGateway($settings));
}
}