createMock(SettingsCryptoGatewayInterface::class); return new HelpdeskTokenRepository($crypto); } public function testFindValidTokenReturnsNullForZeroTenantId(): void { $repo = $this->createRepository(); $this->assertNull($repo->findValidToken(0)); } public function testFindValidTokenReturnsNullForNegativeTenantId(): void { $repo = $this->createRepository(); $this->assertNull($repo->findValidToken(-1)); } public function testStoreTokenReturnsFalseForZeroTenantId(): void { $repo = $this->createRepository(); $this->assertFalse($repo->storeToken(0, 'token', new \DateTimeImmutable('+1 hour'))); } public function testStoreTokenReturnsFalseForNegativeTenantId(): void { $repo = $this->createRepository(); $this->assertFalse($repo->storeToken(-5, 'token', new \DateTimeImmutable('+1 hour'))); } public function testStoreTokenReturnsFalseForEmptyAccessToken(): void { $repo = $this->createRepository(); $this->assertFalse($repo->storeToken(1, '', new \DateTimeImmutable('+1 hour'))); } public function testStoreTokenReturnsFalseWhenEncryptionFails(): void { $crypto = $this->createMock(SettingsCryptoGatewayInterface::class); $crypto->method('encryptString')->willThrowException(new \RuntimeException('encryption failed')); $repo = $this->createRepository($crypto); $this->assertFalse($repo->storeToken(1, 'valid-token', new \DateTimeImmutable('+1 hour'))); } }