diff --git a/tests/Service/Settings/SettingsLoginPersistenceGatewayTest.php b/tests/Service/Settings/SettingsLoginPersistenceGatewayTest.php deleted file mode 100644 index 9f66388..0000000 --- a/tests/Service/Settings/SettingsLoginPersistenceGatewayTest.php +++ /dev/null @@ -1,178 +0,0 @@ -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()); - } -} diff --git a/tests/Service/Settings/SettingsSessionGatewayTest.php b/tests/Service/Settings/SettingsSessionGatewayTest.php deleted file mode 100644 index 3edc9f1..0000000 --- a/tests/Service/Settings/SettingsSessionGatewayTest.php +++ /dev/null @@ -1,98 +0,0 @@ -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)); - } -} diff --git a/tests/Service/Settings/SettingsSessionPolicyGatewayTest.php b/tests/Service/Settings/SettingsSessionPolicyGatewayTest.php new file mode 100644 index 0000000..9894d8e --- /dev/null +++ b/tests/Service/Settings/SettingsSessionPolicyGatewayTest.php @@ -0,0 +1,143 @@ +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)); + } +}