2048, 'private_key_type' => OPENSSL_KEYTYPE_RSA]); $csr = openssl_csr_new(['commonName' => $cn, 'organizationName' => 'Clusev Test'], $pk); return openssl_csr_sign($csr, null, $pk, $days); } public function test_cert_info_extracts_subject_and_expiry(): void { $info = (new CertService)->certInfo($this->makeCert('svc.example.com', 30)); $this->assertSame('svc.example.com', $info['subject']); $this->assertNotNull($info['expiresAt']); $this->assertGreaterThanOrEqual(28, $info['daysLeft']); // ~30 days out $this->assertLessThanOrEqual(30, $info['daysLeft']); } public function test_status_maps_days_left_to_the_triad(): void { $svc = new CertService; $this->assertSame('expired', $svc->status(-1)); $this->assertSame('critical', $svc->status(3)); $this->assertSame('warning', $svc->status(20)); $this->assertSame('ok', $svc->status(60)); $this->assertSame('unknown', $svc->status(null)); } public function test_check_returns_an_error_for_an_unreachable_endpoint(): void { // 127.0.0.1:1 is refused immediately → a fast, network-free failure. $res = (new CertService)->check('127.0.0.1', 1, 1); $this->assertFalse($res['ok']); $this->assertArrayHasKey('error', $res); } }