/* * Copyright 2013-2017 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.cloudfoundry.reactor.client.v2.serviceinstances; import org.cloudfoundry.client.v2.Metadata; import org.cloudfoundry.client.v2.jobs.JobEntity; import org.cloudfoundry.client.v2.routes.RouteEntity; import org.cloudfoundry.client.v2.routes.RouteResource; import org.cloudfoundry.client.v2.servicebindings.ServiceBindingEntity; import org.cloudfoundry.client.v2.servicebindings.ServiceBindingResource; import org.cloudfoundry.client.v2.serviceinstances.BindServiceInstanceRouteRequest; import org.cloudfoundry.client.v2.serviceinstances.BindServiceInstanceRouteResponse; import org.cloudfoundry.client.v2.serviceinstances.CreateServiceInstanceRequest; import org.cloudfoundry.client.v2.serviceinstances.CreateServiceInstanceResponse; import org.cloudfoundry.client.v2.serviceinstances.DeleteServiceInstanceRequest; import org.cloudfoundry.client.v2.serviceinstances.DeleteServiceInstanceResponse; import org.cloudfoundry.client.v2.serviceinstances.GetServiceInstancePermissionsRequest; import org.cloudfoundry.client.v2.serviceinstances.GetServiceInstancePermissionsResponse; import org.cloudfoundry.client.v2.serviceinstances.GetServiceInstanceRequest; import org.cloudfoundry.client.v2.serviceinstances.GetServiceInstanceResponse; import org.cloudfoundry.client.v2.serviceinstances.LastOperation; import org.cloudfoundry.client.v2.serviceinstances.ListServiceInstanceRoutesRequest; import org.cloudfoundry.client.v2.serviceinstances.ListServiceInstanceRoutesResponse; import org.cloudfoundry.client.v2.serviceinstances.ListServiceInstanceServiceBindingsRequest; import org.cloudfoundry.client.v2.serviceinstances.ListServiceInstanceServiceBindingsResponse; import org.cloudfoundry.client.v2.serviceinstances.ListServiceInstanceServiceKeysRequest; import org.cloudfoundry.client.v2.serviceinstances.ListServiceInstanceServiceKeysResponse; import org.cloudfoundry.client.v2.serviceinstances.ListServiceInstancesRequest; import org.cloudfoundry.client.v2.serviceinstances.ListServiceInstancesResponse; import org.cloudfoundry.client.v2.serviceinstances.ServiceInstanceEntity; import org.cloudfoundry.client.v2.serviceinstances.ServiceInstanceResource; import org.cloudfoundry.client.v2.serviceinstances.UnbindServiceInstanceRouteRequest; import org.cloudfoundry.client.v2.serviceinstances.UpdateServiceInstanceRequest; import org.cloudfoundry.client.v2.serviceinstances.UpdateServiceInstanceResponse; import org.cloudfoundry.client.v2.servicekeys.ServiceKeyEntity; import org.cloudfoundry.client.v2.servicekeys.ServiceKeyResource; import org.cloudfoundry.reactor.InteractionContext; import org.cloudfoundry.reactor.TestRequest; import org.cloudfoundry.reactor.TestResponse; import org.cloudfoundry.reactor.client.AbstractClientApiTest; import org.junit.Test; import reactor.test.StepVerifier; import java.time.Duration; import java.util.Collections; import static io.netty.handler.codec.http.HttpMethod.DELETE; import static io.netty.handler.codec.http.HttpMethod.GET; import static io.netty.handler.codec.http.HttpMethod.POST; import static io.netty.handler.codec.http.HttpMethod.PUT; import static io.netty.handler.codec.http.HttpResponseStatus.ACCEPTED; import static io.netty.handler.codec.http.HttpResponseStatus.CREATED; import static io.netty.handler.codec.http.HttpResponseStatus.NO_CONTENT; import static io.netty.handler.codec.http.HttpResponseStatus.OK; public final class ReactorServiceInstancesTest extends AbstractClientApiTest { private final ReactorServiceInstances serviceInstances = new ReactorServiceInstances(CONNECTION_CONTEXT, this.root, TOKEN_PROVIDER); @Test public void bindRoute() { mockRequest(InteractionContext.builder() .request(TestRequest.builder() .method(PUT).path("/v2/service_instances/test-service-instance-id/routes/route-id") .payload("fixtures/client/v2/service_instances/PUT_{id}_routes_request.json") .build()) .response(TestResponse.builder() .status(CREATED) .payload("fixtures/client/v2/service_instances/PUT_{id}_routes_response.json") .build()) .build()); this.serviceInstances .bindRoute(BindServiceInstanceRouteRequest.builder() .serviceInstanceId("test-service-instance-id") .routeId("route-id") .parameter("the_service_broker", "wants this object") .build()) .as(StepVerifier::create) .expectNext(BindServiceInstanceRouteResponse.builder() .metadata(Metadata.builder() .createdAt("2015-12-22T18:27:58Z") .id("e7e5b08e-c530-4c1c-b420-fa0b09b3770d") .url("/v2/service_instances/e7e5b08e-c530-4c1c-b420-fa0b09b3770d") .build()) .entity(ServiceInstanceEntity.builder() .name("name-160") .credential("creds-key-89", "creds-val-89") .servicePlanId("957307f5-6811-4eba-8667-ffee5a704a4a") .spaceId("36b01ada-ef02-4ff5-9f78-cd9e704211d2") .type("managed_service_instance") .tags(Collections.emptyList()) .spaceUrl("/v2/spaces/36b01ada-ef02-4ff5-9f78-cd9e704211d2") .servicePlanUrl("/v2/service_plans/957307f5-6811-4eba-8667-ffee5a704a4a") .serviceBindingsUrl("/v2/service_instances/e7e5b08e-c530-4c1c-b420-fa0b09b3770d/service_bindings") .serviceKeysUrl("/v2/service_instances/e7e5b08e-c530-4c1c-b420-fa0b09b3770d/service_keys") .routesUrl("/v2/service_instances/e7e5b08e-c530-4c1c-b420-fa0b09b3770d/routes") .build()) .build()) .expectComplete() .verify(Duration.ofSeconds(5)); } @Test public void create() { mockRequest(InteractionContext.builder() .request(TestRequest.builder() .method(POST).path("/v2/service_instances?accepts_incomplete=true") .payload("fixtures/client/v2/service_instances/POST_request.json") .build()) .response(TestResponse.builder() .status(CREATED) .payload("fixtures/client/v2/service_instances/POST_response.json") .build()) .build()); this.serviceInstances .create(CreateServiceInstanceRequest.builder() .acceptsIncomplete(true) .name("my-service-instance") .servicePlanId("2048a369-d2d3-48cf-bcfd-eaf9032fa0ab") .spaceId("86b29f7e-721d-4eb8-b34f-3b1d1eccdf23") .parameter("the_service_broker", "wants this object") .tag("accounting") .tag("mongodb") .build()) .as(StepVerifier::create) .expectNext(CreateServiceInstanceResponse.builder() .metadata(Metadata.builder() .createdAt("2015-07-27T22:43:08Z") .id("8b2b3c5e-c1ba-41d0-ac87-08c776cfc25a") .url("/v2/service_instances/8b2b3c5e-c1ba-41d0-ac87-08c776cfc25a") .build()) .entity(ServiceInstanceEntity.builder() .name("my-service-instance") .credential("creds-key-356", "creds-val-356") .servicePlanId("2048a369-d2d3-48cf-bcfd-eaf9032fa0ab") .spaceId("86b29f7e-721d-4eb8-b34f-3b1d1eccdf23") .type("managed_service_instance") .lastOperation(LastOperation.builder() .createdAt("2015-07-27T22:43:08Z") .updatedAt("2015-07-27T22:43:08Z") .description("") .state("in progress") .type("create") .build()) .tag("accounting") .tag("mongodb") .spaceUrl("/v2/spaces/86b29f7e-721d-4eb8-b34f-3b1d1eccdf23") .servicePlanUrl("/v2/service_plans/2048a369-d2d3-48cf-bcfd-eaf9032fa0ab") .serviceBindingsUrl("/v2/service_instances/8b2b3c5e-c1ba-41d0-ac87-08c776cfc25a/service_bindings") .serviceKeysUrl("/v2/service_instances/8b2b3c5e-c1ba-41d0-ac87-08c776cfc25a/service_keys") .build()) .build()) .expectComplete() .verify(Duration.ofSeconds(5)); } @Test public void delete() { mockRequest(InteractionContext.builder() .request(TestRequest.builder() .method(DELETE).path("/v2/service_instances/test-service-instance-id?accepts_incomplete=true&purge=true") .build()) .response(TestResponse.builder() .status(NO_CONTENT) .build()) .build()); this.serviceInstances .delete(DeleteServiceInstanceRequest.builder() .serviceInstanceId("test-service-instance-id") .acceptsIncomplete(true) .purge(true) .build()) .as(StepVerifier::create) .expectComplete() .verify(Duration.ofSeconds(5)); } @Test public void deleteAcceptsIncomplete() { mockRequest(InteractionContext.builder() .request(TestRequest.builder() .method(DELETE).path("/v2/service_instances/test-service-instance-id?accepts_incomplete=true") .build()) .response(TestResponse.builder() .status(ACCEPTED) .payload("fixtures/client/v2/service_instances/DELETE_{id}_accepts_incomplete_response.json") .build()) .build()); this.serviceInstances .delete(DeleteServiceInstanceRequest.builder() .serviceInstanceId("test-service-instance-id") .acceptsIncomplete(true) .build()) .as(StepVerifier::create) .expectNext(DeleteServiceInstanceResponse.builder() .metadata(Metadata.builder() .id("2e20eccf-6828-4c56-81cb-28c0e295ce19") .url("/v2/service_instances/2e20eccf-6828-4c56-81cb-28c0e295ce19") .createdAt("2017-02-27T12:30:29Z") .updatedAt("2017-02-27T12:30:29Z") .build()) .entity(ServiceInstanceEntity.builder() .name("test-service") .servicePlanId("07c64d77-4df5-4974-a4b2-3bc58cafcf0d") .spaceId("840d3266-8547-40fe-986e-ffc20eaba235") .dashboardUrl("http://test-dashboard-host/2e20eccf-6828-4c56-81cb-28c0e295ce19") .type("managed_service_instance") .lastOperation(LastOperation.builder() .type("delete") .state("in progress") .description("") .updatedAt("2017-02-27T12:30:59Z") .createdAt("2017-02-27T12:30:59Z") .build()) .spaceUrl("/v2/spaces/840d3266-8547-40fe-986e-ffc20eaba235") .servicePlanUrl("/v2/service_plans/07c64d77-4df5-4974-a4b2-3bc58cafcf0d") .serviceBindingsUrl("/v2/service_instances/2e20eccf-6828-4c56-81cb-28c0e295ce19/service_bindings") .serviceKeysUrl("/v2/service_instances/2e20eccf-6828-4c56-81cb-28c0e295ce19/service_keys") .routesUrl("/v2/service_instances/2e20eccf-6828-4c56-81cb-28c0e295ce19/routes") .build()) .build()) .expectComplete() .verify(Duration.ofSeconds(5)); } @Test public void deleteAsync() { mockRequest(InteractionContext.builder() .request(TestRequest.builder() .method(DELETE).path("/v2/service_instances/test-service-instance-id?async=true&purge=true") .build()) .response(TestResponse.builder() .status(ACCEPTED) .payload("fixtures/client/v2/service_instances/DELETE_{id}_async_response.json") .build()) .build()); this.serviceInstances .delete(DeleteServiceInstanceRequest.builder() .async(true) .serviceInstanceId("test-service-instance-id") .purge(true) .build()) .as(StepVerifier::create) .expectNext(DeleteServiceInstanceResponse.builder() .metadata(Metadata.builder() .id("2d9707ba-6f0b-4aef-a3de-fe9bdcf0c9d1") .createdAt("2016-02-02T17:16:31Z") .url("/v2/jobs/2d9707ba-6f0b-4aef-a3de-fe9bdcf0c9d1") .build()) .entity(JobEntity.builder() .id("2d9707ba-6f0b-4aef-a3de-fe9bdcf0c9d1") .status("queued") .build()) .build()) .expectComplete() .verify(Duration.ofSeconds(5)); } @Test public void get() { mockRequest(InteractionContext.builder() .request(TestRequest.builder() .method(GET).path("/v2/service_instances/test-service-instance-id") .build()) .response(TestResponse.builder() .status(OK) .payload("fixtures/client/v2/service_instances/GET_{id}_response.json") .build()) .build()); this.serviceInstances .get(GetServiceInstanceRequest.builder() .serviceInstanceId("test-service-instance-id") .build()) .as(StepVerifier::create) .expectNext(GetServiceInstanceResponse.builder() .metadata(Metadata.builder() .id("24ec15f9-f6c7-434a-8893-51baab8408d8") .url("/v2/service_instances/24ec15f9-f6c7-434a-8893-51baab8408d8") .createdAt("2015-07-27T22:43:08Z") .build()) .entity(ServiceInstanceEntity.builder() .name("name-133") .credential("creds-key-72", "creds-val-72") .servicePlanId("2b53255a-8b40-4671-803d-21d3f5d4183a") .spaceId("83b3e705-49fd-4c40-8adf-f5e34f622a19") .type("managed_service_instance") .lastOperation(LastOperation.builder() .type("create") .state("succeeded") .description("service broker-provided description") .updatedAt("2015-07-27T22:43:08Z") .createdAt("2015-07-27T22:43:08Z") .build()) .tag("accounting") .tag("mongodb") .spaceUrl("/v2/spaces/83b3e705-49fd-4c40-8adf-f5e34f622a19") .servicePlanUrl("/v2/service_plans/2b53255a-8b40-4671-803d-21d3f5d4183a") .serviceBindingsUrl ("/v2/service_instances/24ec15f9-f6c7-434a-8893-51baab8408d8/service_bindings") .serviceKeysUrl ("/v2/service_instances/24ec15f9-f6c7-434a-8893-51baab8408d8/service_keys") .build()) .build()) .expectComplete() .verify(Duration.ofSeconds(5)); } @Test public void getPermissions() { mockRequest(InteractionContext.builder() .request(TestRequest.builder() .method(GET).path("/v2/service_instances/test-service-instance-id/permissions") .build()) .response(TestResponse.builder() .status(OK) .payload("fixtures/client/v2/service_instances/GET_{id}_permissions_response.json") .build()) .build()); this.serviceInstances .getPermissions(GetServiceInstancePermissionsRequest.builder() .serviceInstanceId("test-service-instance-id") .build()) .as(StepVerifier::create) .expectNext(GetServiceInstancePermissionsResponse.builder() .manage(true) .build()) .expectComplete() .verify(Duration.ofSeconds(5)); } @Test public void list() { mockRequest(InteractionContext.builder() .request(TestRequest.builder() .method(GET).path("/v2/service_instances?q=name:test-name&page=-1") .build()) .response(TestResponse.builder() .status(OK) .payload("fixtures/client/v2/service_instances/GET_response.json") .build()) .build()); this.serviceInstances .list(ListServiceInstancesRequest.builder() .name("test-name") .page(-1) .build()) .as(StepVerifier::create) .expectNext(ListServiceInstancesResponse.builder() .totalResults(1) .totalPages(1) .resource(ServiceInstanceResource.builder() .metadata(Metadata.builder() .id("24ec15f9-f6c7-434a-8893-51baab8408d8") .url("/v2/service_instances/24ec15f9-f6c7-434a-8893-51baab8408d8") .createdAt("2015-07-27T22:43:08Z") .build()) .entity(ServiceInstanceEntity.builder() .name("name-133") .credential("creds-key-72", "creds-val-72") .servicePlanId("2b53255a-8b40-4671-803d-21d3f5d4183a") .spaceId("83b3e705-49fd-4c40-8adf-f5e34f622a19") .type("managed_service_instance") .lastOperation(LastOperation.builder() .type("create") .state("succeeded") .description("service broker-provided description") .updatedAt("2015-07-27T22:43:08Z") .createdAt("2015-07-27T22:43:08Z") .build()) .tag("accounting") .tag("mongodb") .spaceUrl("/v2/spaces/83b3e705-49fd-4c40-8adf-f5e34f622a19") .servicePlanUrl("/v2/service_plans/2b53255a-8b40-4671-803d-21d3f5d4183a") .serviceBindingsUrl ("/v2/service_instances/24ec15f9-f6c7-434a-8893-51baab8408d8/service_bindings") .serviceKeysUrl ("/v2/service_instances/24ec15f9-f6c7-434a-8893-51baab8408d8/service_keys") .build()) .build()) .build()) .expectComplete() .verify(Duration.ofSeconds(5)); } @Test public void listRoutes() { mockRequest(InteractionContext.builder() .request(TestRequest.builder() .method(GET).path("/v2/service_instances/26fae4d0-df82-42f3-ac67-da5873e3a277/routes") .build()) .response(TestResponse.builder() .status(OK) .payload("fixtures/client/v2/service_instances/GET_{id}_routes_response.json") .build()) .build()); this.serviceInstances .listRoutes(ListServiceInstanceRoutesRequest.builder() .serviceInstanceId("26fae4d0-df82-42f3-ac67-da5873e3a277") .build()) .as(StepVerifier::create) .expectNext(ListServiceInstanceRoutesResponse.builder() .totalResults(1) .totalPages(1) .resource(RouteResource.builder() .metadata(Metadata.builder() .createdAt("2016-06-08T16:41:30Z") .id("674b6eac-4a22-4a9d-bee2-b61299a57bf4") .updatedAt("2016-06-08T16:41:26Z") .url("/v2/routes/674b6eac-4a22-4a9d-bee2-b61299a57bf4") .build()) .entity(RouteEntity.builder() .applicationsUrl("/v2/routes/674b6eac-4a22-4a9d-bee2-b61299a57bf4/apps") .domainId("8580604f-60e0-4903-a73f-f2e5e6660a68") .domainUrl("/v2/private_domains/8580604f-60e0-4903-a73f-f2e5e6660a68") .host("host-17") .path("") .routeMappingsUrl("/v2/routes/674b6eac-4a22-4a9d-bee2-b61299a57bf4/route_mappings") .serviceInstanceId("26fae4d0-df82-42f3-ac67-da5873e3a277") .serviceInstanceUrl("/v2/service_instances/26fae4d0-df82-42f3-ac67-da5873e3a277") .spaceId("276011c4-0550-4a01-82d5-7e9c95feb9ae") .spaceUrl("/v2/spaces/276011c4-0550-4a01-82d5-7e9c95feb9ae") .build()) .build()) .build()) .expectComplete() .verify(Duration.ofSeconds(5)); } @Test public void listServiceBindings() { mockRequest(InteractionContext.builder() .request(TestRequest.builder() .method(GET).path("/v2/service_instances/test-service-instance-id/service_bindings?q=app_guid:test-application-id&page=-1") .build()) .response(TestResponse.builder() .status(OK) .payload("fixtures/client/v2/service_instances/GET_{id}_service_bindings_response.json") .build()) .build()); this.serviceInstances .listServiceBindings(ListServiceInstanceServiceBindingsRequest.builder() .serviceInstanceId("test-service-instance-id") .applicationId("test-application-id") .page(-1) .build()) .as(StepVerifier::create) .expectNext(ListServiceInstanceServiceBindingsResponse.builder() .totalResults(1) .totalPages(1) .resource(ServiceBindingResource.builder() .metadata(Metadata.builder() .createdAt("2015-07-27T22:43:09Z") .id("05f3ec3c-8d97-4bd8-bf86-e44cc835a154") .url("/v2/service_bindings/05f3ec3c-8d97-4bd8-bf86-e44cc835a154") .build()) .entity(ServiceBindingEntity.builder() .applicationId("8a50163b-a39d-4f44-aece-dc5a956da848") .serviceInstanceId("a5a0567e-edbf-4da9-ae90-dce24af308a1") .bindingOptions(Collections.emptyMap()) .credential("creds-key-85", "creds-val-85") .gatewayName("") .applicationUrl("/v2/apps/8a50163b-a39d-4f44-aece-dc5a956da848") .serviceInstanceUrl("/v2/service_instances/a5a0567e-edbf-4da9-ae90-dce24af308a1") .build()) .build()) .build()) .expectComplete() .verify(Duration.ofSeconds(5)); } @Test public void listServiceKeys() { mockRequest(InteractionContext.builder() .request(TestRequest.builder() .method(GET).path("/v2/service_instances/test-service-instance-id/service_keys?page=-1") .build()) .response(TestResponse.builder() .status(OK) .payload("fixtures/client/v2/service_instances/GET_{id}_service_keys_response.json") .build()) .build()); this.serviceInstances .listServiceKeys(ListServiceInstanceServiceKeysRequest.builder() .serviceInstanceId("test-service-instance-id") .page(-1) .build()) .as(StepVerifier::create) .expectNext(ListServiceInstanceServiceKeysResponse.builder() .totalResults(1) .totalPages(1) .resource(ServiceKeyResource.builder() .metadata(Metadata.builder() .id("03ddc0ba-f792-4762-b4e4-dc08b307dc4f") .url("/v2/service_keys/03ddc0ba-f792-4762-b4e4-dc08b307dc4f") .createdAt("2016-05-04T04:49:09Z") .build()) .entity(ServiceKeyEntity.builder() .name("a-service-key") .serviceInstanceId("28120eae-4a44-42da-a3db-2a34aea8dcaa") .credential("creds-key-68", "creds-val-68") .serviceInstanceUrl("/v2/service_instances/28120eae-4a44-42da-a3db-2a34aea8dcaa") .build()) .build()) .build()) .expectComplete() .verify(Duration.ofSeconds(5)); } @Test public void unbindRoute() { mockRequest(InteractionContext.builder() .request(TestRequest.builder() .method(DELETE).path("/v2/service_instances/8fe97ac9-d53a-4858-b6a4-53c20f1fe409/routes/3bbd74b5-516d-409e-a107-19eaf9b2da18") .build()) .response(TestResponse.builder() .status(NO_CONTENT) .build()) .build()); this.serviceInstances .unbindRoute(UnbindServiceInstanceRouteRequest.builder() .routeId("3bbd74b5-516d-409e-a107-19eaf9b2da18") .serviceInstanceId("8fe97ac9-d53a-4858-b6a4-53c20f1fe409") .build()) .as(StepVerifier::create) .expectComplete() .verify(Duration.ofSeconds(5)); } @Test public void update() { mockRequest(InteractionContext.builder() .request(TestRequest.builder() .method(PUT).path("/v2/service_instances/test-service-instance-id?accepts_incomplete=true") .payload("fixtures/client/v2/service_instances/PUT_{id}_request.json") .build()) .response(TestResponse.builder() .status(CREATED) .payload("fixtures/client/v2/service_instances/PUT_{id}_response.json") .build()) .build()); this.serviceInstances .update(UpdateServiceInstanceRequest.builder() .acceptsIncomplete(true) .serviceInstanceId("test-service-instance-id") .servicePlanId("5b5e984f-bbf6-477b-9d3a-b6d5df941b50") .parameter("the_service_broker", "wants this object") .tags(Collections.emptyList()) .build()) .as(StepVerifier::create) .expectNext(UpdateServiceInstanceResponse.builder() .metadata(Metadata.builder() .createdAt("2015-07-27T22:43:08Z") .id("2a80a0f7-cb9c-414a-8a6b-7cc3f811ad41") .url("/v2/service_instances/2a80a0f7-cb9c-414a-8a6b-7cc3f811ad41") .build()) .entity(ServiceInstanceEntity.builder() .name("name-139") .credential("creds-key-75", "creds-val-75") .servicePlanId("b07ff29a-78b8-486f-87a8-3f695368b83d") .spaceId("04219ffa-a817-459f-bbd7-c161bdca541b") .type("managed_service_instance") .tags(Collections.emptyList()) .lastOperation(LastOperation.builder() .createdAt("2015-07-27T22:43:08Z") .updatedAt("2015-07-27T22:43:08Z") .description("") .state("in progress") .type("update") .build()) .spaceUrl("/v2/spaces/04219ffa-a817-459f-bbd7-c161bdca541b") .servicePlanUrl("/v2/service_plans/b07ff29a-78b8-486f-87a8-3f695368b83d") .serviceBindingsUrl("/v2/service_instances/2a80a0f7-cb9c-414a-8a6b-7cc3f811ad41/service_bindings") .serviceKeysUrl("/v2/service_instances/2a80a0f7-cb9c-414a-8a6b-7cc3f811ad41/service_keys") .build()) .build()) .expectComplete() .verify(Duration.ofSeconds(5)); } }