buildMonitorService(); $svc->listMonitors(new M\ListMonitorsRequest()); $sent = $http->lastRequest; self::assertNotNull($sent); self::assertSame( 'https://api.openstatus.dev/rpc/openstatus.monitor.v1.MonitorService/ListMonitors', (string) $sent->getUri(), ); } public function testMonitorServiceCreateHttpMonitorDispatch(): void { [$http, $svc] = $this->buildMonitorService(); $svc->createHTTPMonitor(new M\CreateHTTPMonitorRequest()); $sent = $http->lastRequest; self::assertNotNull($sent); self::assertStringEndsWith( '/rpc/openstatus.monitor.v1.MonitorService/CreateHTTPMonitor', (string) $sent->getUri(), ); } public function testStatusReportServiceDispatchesToCorrectRpc(): void { $http = new MockHttpClient(new Response(200, [], '{}')); $svc = new StatusReportServiceClient($this->makeTransport($http)); $svc->listStatusReports(new SR\ListStatusReportsRequest()); $sent = $http->lastRequest; self::assertNotNull($sent); self::assertSame( 'https://api.openstatus.dev/rpc/openstatus.status_report.v1.StatusReportService/ListStatusReports', (string) $sent->getUri(), ); } public function testStatusPageServiceDispatchesToCorrectRpc(): void { $http = new MockHttpClient(new Response(200, [], '{}')); $svc = new StatusPageServiceClient($this->makeTransport($http)); $svc->listStatusPages(new SP\ListStatusPagesRequest()); $sent = $http->lastRequest; self::assertNotNull($sent); self::assertSame( 'https://api.openstatus.dev/rpc/openstatus.status_page.v1.StatusPageService/ListStatusPages', (string) $sent->getUri(), ); } public function testStatusPageAddMonitorComponentDispatch(): void { $http = new MockHttpClient(new Response(200, [], '{}')); $svc = new StatusPageServiceClient($this->makeTransport($http)); $svc->addMonitorComponent(new SP\AddMonitorComponentRequest()); $sent = $http->lastRequest; self::assertNotNull($sent); self::assertStringEndsWith( '/rpc/openstatus.status_page.v1.StatusPageService/AddMonitorComponent', (string) $sent->getUri(), ); } public function testMaintenanceServiceDispatchesToCorrectRpc(): void { $http = new MockHttpClient(new Response(200, [], '{}')); $svc = new MaintenanceServiceClient($this->makeTransport($http)); $svc->listMaintenances(new Mt\ListMaintenancesRequest()); $sent = $http->lastRequest; self::assertNotNull($sent); self::assertSame( 'https://api.openstatus.dev/rpc/openstatus.maintenance.v1.MaintenanceService/ListMaintenances', (string) $sent->getUri(), ); } public function testNotificationServiceDispatchesToCorrectRpc(): void { $http = new MockHttpClient(new Response(200, [], '{}')); $svc = new NotificationServiceClient($this->makeTransport($http)); $svc->listNotifications(new N\ListNotificationsRequest()); $sent = $http->lastRequest; self::assertNotNull($sent); self::assertSame( 'https://api.openstatus.dev/rpc/openstatus.notification.v1.NotificationService/ListNotifications', (string) $sent->getUri(), ); } public function testNotificationSendTestDispatch(): void { $http = new MockHttpClient(new Response(200, [], '{}')); $svc = new NotificationServiceClient($this->makeTransport($http)); $svc->sendTestNotification(new N\SendTestNotificationRequest()); $sent = $http->lastRequest; self::assertNotNull($sent); self::assertStringEndsWith( '/rpc/openstatus.notification.v1.NotificationService/SendTestNotification', (string) $sent->getUri(), ); } public function testServicesPassThroughPerCallHeaders(): void { [$http, $svc] = $this->buildMonitorService(); $svc->listMonitors(new M\ListMonitorsRequest(), ['x-trace-id' => 'abc']); $sent = $http->lastRequest; self::assertNotNull($sent); self::assertSame('abc', $sent->getHeaderLine('x-trace-id')); } /** * @return array{MockHttpClient, MonitorServiceClient} */ private function buildMonitorService(): array { $http = new MockHttpClient(new Response(200, [], '{}')); $svc = new MonitorServiceClient($this->makeTransport($http)); return [$http, $svc]; } private function makeTransport(MockHttpClient $http): JsonTransport { $factory = new HttpFactory(); return new JsonTransport( http: $http, requestFactory: $factory, streamFactory: $factory, baseUrl: 'https://api.openstatus.dev', defaultHeaders: ['Content-Type' => 'application/json'], ); } }