createMock(FirewallStore::class); $store->expects(self::once())->method('ensureIndexes')->willReturn(array_fill(0, 7, 'index')); $tester = new CommandTester(new FirewallSetupCommand($store)); self::assertSame(Command::SUCCESS, $tester->execute([])); self::assertStringContainsString('7 indexes verified', $tester->getDisplay()); } #[TestDox('Maintenance reports cleanup counts for schedulers')] public function testMaintenance(): void { $firewall = $this->createMock(FirewallService::class); $firewall->expects(self::once())->method('cleanup')->willReturn([ 'expiredRules' => 2, 'oldLogs' => 3, 'expiredBruteForceClaims' => 4, ]); $tester = new CommandTester(new FirewallMaintenanceCommand($firewall)); self::assertSame(Command::SUCCESS, $tester->execute([])); self::assertStringContainsString('2 expired rules, 3 old logs', $tester->getDisplay()); self::assertStringContainsString('4 expired', $tester->getDisplay()); self::assertStringContainsString('claims removed', $tester->getDisplay()); } #[TestDox('Maintenance returns failure to its scheduler')] public function testMaintenanceFailure(): void { $firewall = $this->createStub(FirewallService::class); $firewall->method('cleanup')->willThrowException(new \RuntimeException('database unavailable')); $tester = new CommandTester(new FirewallMaintenanceCommand($firewall)); self::assertSame(Command::FAILURE, $tester->execute([])); self::assertStringContainsString('database unavailable', $tester->getDisplay()); } }