health); self::assertInstanceOf(\Openstatus\Sdk\Namespaces\Monitor::class, $client->monitor); self::assertInstanceOf(\Openstatus\Sdk\Namespaces\StatusReport::class, $client->statusReport); self::assertInstanceOf(\Openstatus\Sdk\Namespaces\StatusPage::class, $client->statusPage); self::assertInstanceOf(\Openstatus\Sdk\Namespaces\Maintenance::class, $client->maintenance); self::assertInstanceOf(\Openstatus\Sdk\Namespaces\Notification::class, $client->notification); } public function testHealthServiceDispatchThroughClient(): void { $http = new MockHttpClient(new Response(200, [], '{"status":1}')); $client = new OpenstatusClient(new ClientOptions(httpClient: $http)); $client->health->v1->healthService->check(new CheckRequest()); $sent = $http->lastRequest; self::assertNotNull($sent); self::assertSame( 'https://api.openstatus.dev/rpc/openstatus.health.v1.HealthService/Check', (string) $sent->getUri(), ); } public function testSendsApiKeyHeaderWhenConfigured(): void { $http = new MockHttpClient(new Response(200, [], '{}')); $client = new OpenstatusClient(new ClientOptions( apiKey: 'os-secret', httpClient: $http, )); $client->health->v1->healthService->check(new CheckRequest()); $sent = $http->lastRequest; self::assertNotNull($sent); self::assertSame('os-secret', $sent->getHeaderLine('x-openstatus-key')); self::assertStringStartsWith('openstatus-php/', $sent->getHeaderLine('User-Agent')); } public function testOmitsApiKeyHeaderWhenAbsent(): void { $previousKey = getenv('OPENSTATUS_API_KEY'); putenv('OPENSTATUS_API_KEY'); try { $http = new MockHttpClient(new Response(200, [], '{}')); $client = new OpenstatusClient(new ClientOptions(httpClient: $http)); $client->health->v1->healthService->check(new CheckRequest()); $sent = $http->lastRequest; self::assertNotNull($sent); self::assertFalse($sent->hasHeader('x-openstatus-key')); } finally { if (is_string($previousKey)) { putenv('OPENSTATUS_API_KEY=' . $previousKey); } } } public function testFallsBackToEnvForApiKey(): void { $previousKey = getenv('OPENSTATUS_API_KEY'); putenv('OPENSTATUS_API_KEY=from-env'); try { $http = new MockHttpClient(new Response(200, [], '{}')); $client = new OpenstatusClient(new ClientOptions(httpClient: $http)); $client->health->v1->healthService->check(new CheckRequest()); $sent = $http->lastRequest; self::assertNotNull($sent); self::assertSame('from-env', $sent->getHeaderLine('x-openstatus-key')); } finally { if (is_string($previousKey)) { putenv('OPENSTATUS_API_KEY=' . $previousKey); } else { putenv('OPENSTATUS_API_KEY'); } } } public function testFallsBackToEnvForBaseUrl(): void { $previousUrl = getenv('OPENSTATUS_API_URL'); putenv('OPENSTATUS_API_URL=https://staging.openstatus.dev'); try { $http = new MockHttpClient(new Response(200, [], '{}')); $client = new OpenstatusClient(new ClientOptions(httpClient: $http)); $client->health->v1->healthService->check(new CheckRequest()); $sent = $http->lastRequest; self::assertNotNull($sent); self::assertStringStartsWith('https://staging.openstatus.dev/', (string) $sent->getUri()); } finally { if (is_string($previousUrl)) { putenv('OPENSTATUS_API_URL=' . $previousUrl); } else { putenv('OPENSTATUS_API_URL'); } } } public function testExplicitBaseUrlOverridesEnv(): void { $previousUrl = getenv('OPENSTATUS_API_URL'); putenv('OPENSTATUS_API_URL=https://env.example'); try { $http = new MockHttpClient(new Response(200, [], '{}')); $client = new OpenstatusClient(new ClientOptions( baseUrl: 'https://explicit.example', httpClient: $http, )); $client->health->v1->healthService->check(new CheckRequest()); $sent = $http->lastRequest; self::assertNotNull($sent); self::assertStringStartsWith('https://explicit.example/', (string) $sent->getUri()); } finally { if (is_string($previousUrl)) { putenv('OPENSTATUS_API_URL=' . $previousUrl); } else { putenv('OPENSTATUS_API_URL'); } } } }