From 3ce6863f2fb6ddf68ee351b755fc9a020bcf0af2 Mon Sep 17 00:00:00 2001 From: salaboy Date: Fri, 30 Jan 2026 20:02:47 +0000 Subject: [PATCH 1/3] push removing unnecesary var (#1634) Signed-off-by: salaboy --- dapr-spring/pom.xml | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/dapr-spring/pom.xml b/dapr-spring/pom.xml index 4f34d39710..f3559a4563 100644 --- a/dapr-spring/pom.xml +++ b/dapr-spring/pom.xml @@ -31,8 +31,6 @@ 11 11 11 - - 1.17.0-SNAPSHOT @@ -40,27 +38,27 @@ io.dapr.spring dapr-spring-data - ${dapr.spring.version} + ${project.version} io.dapr.spring dapr-spring-messaging - ${dapr.spring.version} + ${project.version} io.dapr.spring dapr-spring-workflows - ${dapr.spring.version} + ${project.version} io.dapr.spring dapr-spring-boot-autoconfigure - ${dapr.spring.version} + ${project.version} io.dapr.spring dapr-spring-boot-tests - ${dapr.spring.version} + ${project.version} From a47a62a53adc5184cb9b3b2b96f94e0c3cef7dbe Mon Sep 17 00:00:00 2001 From: artur-ciocanu Date: Mon, 2 Feb 2026 10:29:53 +0200 Subject: [PATCH 2/3] Replace old log based waits with DaprWait strategy. (#1635) * Replace old log based waits with DaprWait strategy. Signed-off-by: Artur Ciocanu * Revert ConsumerAppIT to make tests pass. Signed-off-by: Artur Ciocanu * Revert ConsumerAppIT so there are no changes. Signed-off-by: Artur Ciocanu * Disable the IT test for failing CI. Signed-off-by: Artur Ciocanu --------- Signed-off-by: Artur Ciocanu --- .../dapr/it/spring/messaging/DaprSpringMessagingIT.java | 7 +++---- .../io/dapr/it/testcontainers/actors/DaprActorsIT.java | 8 ++------ .../testcontainers/pubsub/outbox/DaprPubSubOutboxIT.java | 5 ++--- .../dapr/springboot/examples/producer/ProducerAppIT.java | 9 +++------ 4 files changed, 10 insertions(+), 19 deletions(-) diff --git a/sdk-tests/src/test/java/io/dapr/it/spring/messaging/DaprSpringMessagingIT.java b/sdk-tests/src/test/java/io/dapr/it/spring/messaging/DaprSpringMessagingIT.java index 106519f8d2..26dc6b5db3 100644 --- a/sdk-tests/src/test/java/io/dapr/it/spring/messaging/DaprSpringMessagingIT.java +++ b/sdk-tests/src/test/java/io/dapr/it/spring/messaging/DaprSpringMessagingIT.java @@ -19,6 +19,7 @@ import io.dapr.testcontainers.Component; import io.dapr.testcontainers.DaprContainer; import io.dapr.testcontainers.DaprLogLevel; +import io.dapr.testcontainers.wait.strategy.DaprWait; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Tag; @@ -30,7 +31,6 @@ import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.boot.testcontainers.service.connection.ServiceConnection; import org.testcontainers.containers.Network; -import org.testcontainers.containers.wait.strategy.Wait; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; @@ -54,10 +54,10 @@ public class DaprSpringMessagingIT { private static final Logger logger = LoggerFactory.getLogger(DaprSpringMessagingIT.class); + private static final String PUBSUB_NAME = "pubsub"; private static final String TOPIC = "mockTopic"; private static final Network DAPR_NETWORK = Network.newNetwork(); private static final int APP_PORT = 8080; - private static final String SUBSCRIPTION_MESSAGE_PATTERN = ".*app is subscribed to the following topics.*"; @Container @ServiceConnection @@ -84,8 +84,7 @@ public static void beforeAll(){ @BeforeEach public void beforeEach() { - // Ensure the subscriptions are registered - Wait.forLogMessage(SUBSCRIPTION_MESSAGE_PATTERN, 1).waitUntilReady(DAPR_CONTAINER); + DaprWait.forSubscription(PUBSUB_NAME, TOPIC).waitUntilReady(DAPR_CONTAINER); } @Test diff --git a/sdk-tests/src/test/java/io/dapr/it/testcontainers/actors/DaprActorsIT.java b/sdk-tests/src/test/java/io/dapr/it/testcontainers/actors/DaprActorsIT.java index f0ff24d8f0..96b7e512ec 100644 --- a/sdk-tests/src/test/java/io/dapr/it/testcontainers/actors/DaprActorsIT.java +++ b/sdk-tests/src/test/java/io/dapr/it/testcontainers/actors/DaprActorsIT.java @@ -23,11 +23,11 @@ import io.dapr.testcontainers.internal.DaprContainerFactory; import io.dapr.testcontainers.internal.DaprSidecarContainer; import io.dapr.testcontainers.internal.spring.DaprSpringBootTest; +import io.dapr.testcontainers.wait.strategy.DaprWait; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.testcontainers.containers.wait.strategy.Wait; import java.util.Map; import java.util.UUID; @@ -38,8 +38,6 @@ @Tag("testcontainers") public class DaprActorsIT { - private static final String ACTORS_MESSAGE_PATTERN = ".*Actor runtime started.*"; - @DaprSidecarContainer private static final DaprContainer DAPR_CONTAINER = DaprContainerFactory.createForSpringBootTest("actor-dapr-app") .withComponent(new Component("kvstore", "state.in-memory", "v1", @@ -57,9 +55,7 @@ public class DaprActorsIT { public void setUp() { org.testcontainers.Testcontainers.exposeHostPorts(DAPR_CONTAINER.getAppPort()); daprActorRuntime.registerActor(TestActorImpl.class); - - // Wait for actor runtime to start. - Wait.forLogMessage(ACTORS_MESSAGE_PATTERN, 1).waitUntilReady(DAPR_CONTAINER); + DaprWait.forActors().waitUntilReady(DAPR_CONTAINER); } @Test diff --git a/sdk-tests/src/test/java/io/dapr/it/testcontainers/pubsub/outbox/DaprPubSubOutboxIT.java b/sdk-tests/src/test/java/io/dapr/it/testcontainers/pubsub/outbox/DaprPubSubOutboxIT.java index 2aef82f14c..d4139bcf91 100644 --- a/sdk-tests/src/test/java/io/dapr/it/testcontainers/pubsub/outbox/DaprPubSubOutboxIT.java +++ b/sdk-tests/src/test/java/io/dapr/it/testcontainers/pubsub/outbox/DaprPubSubOutboxIT.java @@ -21,6 +21,7 @@ import io.dapr.testcontainers.Component; import io.dapr.testcontainers.DaprContainer; import io.dapr.testcontainers.DaprLogLevel; +import io.dapr.testcontainers.wait.strategy.DaprWait; import org.assertj.core.api.Assertions; import org.awaitility.Awaitility; import org.junit.jupiter.api.BeforeAll; @@ -35,7 +36,6 @@ import org.springframework.test.context.DynamicPropertyRegistry; import org.springframework.test.context.DynamicPropertySource; import org.testcontainers.containers.Network; -import org.testcontainers.containers.wait.strategy.Wait; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; @@ -62,7 +62,6 @@ public class DaprPubSubOutboxIT { private static final Network DAPR_NETWORK = Network.newNetwork(); private static final Random RANDOM = new Random(); private static final int PORT = RANDOM.nextInt(1000) + 8000; - private static final String APP_FOUND_MESSAGE_PATTERN = ".*application discovered on port.*"; private static final String PUBSUB_APP_ID = "pubsub-dapr-app"; private static final String PUBSUB_NAME = "pubsub"; @@ -107,7 +106,7 @@ public static void beforeAll(){ @BeforeEach public void beforeEach() { - Wait.forLogMessage(APP_FOUND_MESSAGE_PATTERN, 1).waitUntilReady(DAPR_CONTAINER); + DaprWait.forSubscription(PUBSUB_NAME, TOPIC_PRODUCT_CREATED).waitUntilReady(DAPR_CONTAINER); } @Test diff --git a/spring-boot-examples/producer-app/src/test/java/io/dapr/springboot/examples/producer/ProducerAppIT.java b/spring-boot-examples/producer-app/src/test/java/io/dapr/springboot/examples/producer/ProducerAppIT.java index a0c561b931..195fd032b5 100644 --- a/spring-boot-examples/producer-app/src/test/java/io/dapr/springboot/examples/producer/ProducerAppIT.java +++ b/spring-boot-examples/producer-app/src/test/java/io/dapr/springboot/examples/producer/ProducerAppIT.java @@ -19,6 +19,7 @@ import io.dapr.springboot.examples.producer.workflow.CustomerWorkflow; import io.dapr.springboot.examples.producer.workflow.RegisterCustomerActivity; import io.dapr.testcontainers.DaprContainer; +import io.dapr.testcontainers.wait.strategy.DaprWait; import io.restassured.RestAssured; import io.restassured.http.ContentType; import org.junit.jupiter.api.AfterEach; @@ -26,7 +27,6 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import org.testcontainers.containers.wait.strategy.Wait; import java.io.IOException; import java.time.Duration; @@ -43,8 +43,6 @@ webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT) class ProducerAppIT { - private static final String SUBSCRIPTION_MESSAGE_PATTERN = ".*app is subscribed to the following topics.*"; - @Autowired private TestSubscriberRestController controller; @@ -62,10 +60,9 @@ class ProducerAppIT { @BeforeEach void setUp() { RestAssured.baseURI = "http://localhost:" + 8080; - org.testcontainers.Testcontainers.exposeHostPorts(8080); - // Ensure the subscriptions are registered - Wait.forLogMessage(SUBSCRIPTION_MESSAGE_PATTERN, 1).waitUntilReady(daprContainer); + org.testcontainers.Testcontainers.exposeHostPorts(8080); + DaprWait.forSubscription("pubsub", "topic").waitUntilReady(daprContainer); } @AfterEach From 528451ff220b8ff49dbab7312e84c24782b9dfc1 Mon Sep 17 00:00:00 2001 From: Paul Lindner Date: Mon, 2 Feb 2026 00:59:38 -0800 Subject: [PATCH 3/3] Add PATCH to HttpMethods enum for service invocation (#1623) * Add PATCH to HttpMethods enum for service invocation Adds PATCH to the HttpMethods enum to enable using DaprClient.invokeMethod() with PATCH requests through HTTPEndpoints. This is commonly required for partial updates when calling external REST APIs via Dapr service invocation. Fixes #1622 Signed-off-by: Paul Lindner * Add test for PATCH HTTP method Signed-off-by: Paul Lindner --------- Signed-off-by: Paul Lindner Co-authored-by: salaboy --- .../main/java/io/dapr/client/DaprHttp.java | 3 +- .../java/io/dapr/client/DaprHttpTest.java | 30 +++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/sdk/src/main/java/io/dapr/client/DaprHttp.java b/sdk/src/main/java/io/dapr/client/DaprHttp.java index 489fd40491..0dc395834c 100644 --- a/sdk/src/main/java/io/dapr/client/DaprHttp.java +++ b/sdk/src/main/java/io/dapr/client/DaprHttp.java @@ -85,7 +85,8 @@ public enum HttpMethods { HEAD, CONNECT, OPTIONS, - TRACE + TRACE, + PATCH } public static class Response { diff --git a/sdk/src/test/java/io/dapr/client/DaprHttpTest.java b/sdk/src/test/java/io/dapr/client/DaprHttpTest.java index ad6753479a..739957ea85 100644 --- a/sdk/src/test/java/io/dapr/client/DaprHttpTest.java +++ b/sdk/src/test/java/io/dapr/client/DaprHttpTest.java @@ -273,6 +273,36 @@ public void invokeDeleteMethod() throws IOException { assertEquals("http://" + sidecarIp + ":3500/v1.0/state", request.uri().toString()); } + @Test + public void invokePatchMethod() throws IOException { + byte[] content = serializer.serialize(EXPECTED_RESULT); + MockHttpResponse mockHttpResponse = new MockHttpResponse(content, HTTP_OK); + CompletableFuture> mockResponse = CompletableFuture.completedFuture(mockHttpResponse); + ArgumentCaptor requestCaptor = ArgumentCaptor.forClass(HttpRequest.class); + + when(httpClient.sendAsync(any(), any())).thenReturn(mockResponse); + + DaprHttp daprHttp = new DaprHttp(sidecarIp, 3500, daprTokenApi, READ_TIMEOUT, httpClient); + Mono mono = daprHttp.invokeApi( + "PATCH", + "v1.0/state".split("/"), + null, + "", + null, + Context.empty() + ); + DaprHttp.Response response = mono.block(); + String body = serializer.deserialize(response.getBody(), String.class); + + verify(httpClient).sendAsync(requestCaptor.capture(), any()); + + HttpRequest request = requestCaptor.getValue(); + + assertEquals(EXPECTED_RESULT, body); + assertEquals("PATCH", request.method()); + assertEquals("http://" + sidecarIp + ":3500/v1.0/state", request.uri().toString()); + } + @Test public void invokeHeadMethod() { MockHttpResponse mockHttpResponse = new MockHttpResponse(HTTP_OK);