mirror of https://github.com/dapr/java-sdk.git
				
				
				
			Allows override of content-type in pubsub publish. (#492)
This commit is contained in:
		
							parent
							
								
									99c3794a62
								
							
						
					
					
						commit
						ce7ecb9965
					
				|  | @ -0,0 +1,79 @@ | |||
| /* | ||||
|  * Copyright (c) Microsoft Corporation and Dapr Contributors. | ||||
|  * Licensed under the MIT License. | ||||
|  */ | ||||
| 
 | ||||
| package io.dapr.examples.pubsub.http; | ||||
| 
 | ||||
| import io.dapr.client.DaprClient; | ||||
| import io.dapr.client.DaprClientBuilder; | ||||
| import io.dapr.client.domain.CloudEvent; | ||||
| import io.dapr.client.domain.Metadata; | ||||
| import io.dapr.client.domain.PublishEventRequestBuilder; | ||||
| 
 | ||||
| import java.util.UUID; | ||||
| 
 | ||||
| import static java.util.Collections.singletonMap; | ||||
| 
 | ||||
| /** | ||||
|  * Message publisher. | ||||
|  * 1. Build and install jars: | ||||
|  * mvn clean install | ||||
|  * 2. cd [repo root]/examples | ||||
|  * 3. Run the program: | ||||
|  * dapr run --components-path ./components/pubsub --app-id publisher -- \ | ||||
|  *   java -jar target/dapr-java-sdk-examples-exec.jar io.dapr.examples.pubsub.http.CloudEventPublisher | ||||
|  */ | ||||
| public class CloudEventPublisher { | ||||
| 
 | ||||
|   //Number of messages to be sent. | ||||
|   private static final int NUM_MESSAGES = 10; | ||||
| 
 | ||||
|   //Time-to-live for messages published. | ||||
|   private static final String MESSAGE_TTL_IN_SECONDS = "1000"; | ||||
| 
 | ||||
|   //The title of the topic to be used for publishing | ||||
|   private static final String TOPIC_NAME = "testingtopic"; | ||||
| 
 | ||||
|   //The name of the pubsub | ||||
|   private static final String PUBSUB_NAME = "messagebus"; | ||||
| 
 | ||||
|   /** | ||||
|    * This is the entry point of the publisher app example. | ||||
|    * @param args Args, unused. | ||||
|    * @throws Exception A startup Exception. | ||||
|    */ | ||||
|   public static void main(String[] args) throws Exception { | ||||
|     //Creating the DaprClient: Using the default builder client produces an HTTP Dapr Client | ||||
|     try (DaprClient client = new DaprClientBuilder().build()) { | ||||
|       for (int i = 0; i < NUM_MESSAGES; i++) { | ||||
|         CloudEvent cloudEvent = new CloudEvent(); | ||||
|         cloudEvent.setId(UUID.randomUUID().toString()); | ||||
|         cloudEvent.setType("example"); | ||||
|         cloudEvent.setSpecversion("1"); | ||||
|         cloudEvent.setDatacontenttype("text/plain"); | ||||
|         cloudEvent.setData(String.format("This is message #%d", i)); | ||||
| 
 | ||||
|         //Publishing messages | ||||
|         client.publishEvent( | ||||
|             new PublishEventRequestBuilder(PUBSUB_NAME, TOPIC_NAME, cloudEvent) | ||||
|                 .withContentType(CloudEvent.CONTENT_TYPE) | ||||
|                 .withMetadata(singletonMap(Metadata.TTL_IN_SECONDS, MESSAGE_TTL_IN_SECONDS)) | ||||
|                 .build()).block(); | ||||
|         System.out.println("Published cloud event with message: " + cloudEvent.getData()); | ||||
| 
 | ||||
|         try { | ||||
|           Thread.sleep((long) (1000 * Math.random())); | ||||
|         } catch (InterruptedException e) { | ||||
|           e.printStackTrace(); | ||||
|           Thread.currentThread().interrupt(); | ||||
|           return; | ||||
|         } | ||||
|       } | ||||
| 
 | ||||
|       // This is an example, so for simplicity we are just exiting here. | ||||
|       // Normally a dapr app would be a web service and not exit main. | ||||
|       System.out.println("Done."); | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | @ -40,7 +40,6 @@ public class Publisher { | |||
|    * @throws Exception A startup Exception. | ||||
|    */ | ||||
|   public static void main(String[] args) throws Exception { | ||||
|     //Creating the DaprClient: Using the default builder client produces an HTTP Dapr Client | ||||
|     try (DaprClient client = new DaprClientBuilder().build()) { | ||||
|       for (int i = 0; i < NUM_MESSAGES; i++) { | ||||
|         String message = String.format("This is message #%d", i); | ||||
|  |  | |||
|  | @ -96,14 +96,15 @@ dapr run --components-path ./components/pubsub --app-id subscriber --app-port 30 | |||
| 
 | ||||
| The other component is the publisher. It is a simple java application with a main method that uses the Dapr HTTP Client to publish 10 messages to an specific topic. | ||||
| 
 | ||||
| In the `Publisher.java` file, you will find the `Publisher` class, containing the main method. The main method declares a Dapr Client using the `DaprClientBuilder` class. Notice that this builder gets two serializer implementations in the constructor: One is for Dapr's sent and recieved objects, and second is for objects to be persisted. The client publishes messages using `publishEvent` method. The Dapr client is also within a try-with-resource block to properly close the client at the end. See the code snippet below:   | ||||
| In the `Publisher.java` file, you will find the `Publisher` class, containing the main method. The main method declares a Dapr Client using the `DaprClientBuilder` class. Notice that this builder gets two serializer implementations in the constructor: One is for Dapr's sent and recieved objects, and second is for objects to be persisted. The client publishes messages using `publishEvent` method. The Dapr client is also within a try-with-resource block to properly close the client at the end. See the code snippet below: | ||||
| Dapr sidecar will automatically wrap the payload received into a CloudEvent object, which will later on parsed by the subscriber. | ||||
| ```java | ||||
| public class Publisher { | ||||
|     private static final int NUM_MESSAGES = 10; | ||||
|     private static final String TOPIC_NAME = "testingtopic"; | ||||
|     private static final String PUBSUB_NAME = "messagebus"; | ||||
|   private static final int NUM_MESSAGES = 10; | ||||
|   private static final String TOPIC_NAME = "testingtopic"; | ||||
|   private static final String PUBSUB_NAME = "messagebus"; | ||||
| 
 | ||||
| ///... | ||||
|   ///... | ||||
|   public static void main(String[] args) throws Exception { | ||||
|       //Creating the DaprClient: Using the default builder client produces an HTTP Dapr Client | ||||
|       try (DaprClient client = new DaprClientBuilder().build()) { | ||||
|  | @ -114,28 +115,41 @@ public class Publisher { | |||
|           System.out.println("Published message: " + message); | ||||
|           //... | ||||
|         } | ||||
|         ///... | ||||
|       } | ||||
|   } | ||||
| ///... | ||||
| } | ||||
| ``` | ||||
| 
 | ||||
| This example also pushes a non-string content event, the follow code in same `Publisher` main method publishes a bite: | ||||
| The `CloudEventPublisher.java` file shows how the same can be accomplished if the application must send a CloudEvent object instead of relying on Dapr's automatic CloudEvent "wrapping". | ||||
| In this case, the app MUST override the content-type parameter via `withContentType()`, so Dapr sidecar knows that the payload is already a CloudEvent object. | ||||
| 
 | ||||
| ```java | ||||
| public class Publisher { | ||||
| ///... | ||||
|     public static void main(String[] args) throws Exception { | ||||
| ///... | ||||
|     //Publishing a single bite: Example of non-string based content published | ||||
|     client.publishEvent( | ||||
|         TOPIC_NAME, | ||||
|         new byte[] { 1 }, | ||||
|         Collections.singletonMap("content-type", "application/octet-stream")).block(); | ||||
|     System.out.println("Published one byte."); | ||||
|     System.out.println("Done."); | ||||
|   ///... | ||||
|   public static void main(String[] args) throws Exception { | ||||
|     //Creating the DaprClient: Using the default builder client produces an HTTP Dapr Client | ||||
|     try (DaprClient client = new DaprClientBuilder().build()) { | ||||
|       for (int i = 0; i < NUM_MESSAGES; i++) { | ||||
|         CloudEvent cloudEvent = new CloudEvent(); | ||||
|         cloudEvent.setId(UUID.randomUUID().toString()); | ||||
|         cloudEvent.setType("example"); | ||||
|         cloudEvent.setSpecversion("1"); | ||||
|         cloudEvent.setDatacontenttype("text/plain"); | ||||
|         cloudEvent.setData(String.format("This is message #%d", i)); | ||||
| 
 | ||||
|         //Publishing messages | ||||
|         client.publishEvent( | ||||
|             new PublishEventRequestBuilder(PUBSUB_NAME, TOPIC_NAME, cloudEvent) | ||||
|                 .withContentType(CloudEvent.CONTENT_TYPE) | ||||
|                 .withMetadata(singletonMap(Metadata.TTL_IN_SECONDS, MESSAGE_TTL_IN_SECONDS)) | ||||
|                 .build()).block(); | ||||
|         System.out.println("Published cloud event with message: " + cloudEvent.getData()); | ||||
|         //... | ||||
|       } | ||||
|       //... | ||||
|     } | ||||
|   } | ||||
| ///... | ||||
| } | ||||
| ``` | ||||
| 
 | ||||
|  |  | |||
|  | @ -12,6 +12,7 @@ import io.dapr.client.DaprClientBuilder; | |||
| import io.dapr.client.domain.CloudEvent; | ||||
| import io.dapr.client.domain.HttpExtension; | ||||
| import io.dapr.client.domain.Metadata; | ||||
| import io.dapr.client.domain.PublishEventRequestBuilder; | ||||
| import io.dapr.it.BaseIT; | ||||
| import io.dapr.it.DaprRun; | ||||
| import io.dapr.serializer.DaprObjectSerializer; | ||||
|  | @ -26,6 +27,7 @@ import java.util.ArrayList; | |||
| import java.util.Arrays; | ||||
| import java.util.Collection; | ||||
| import java.util.Collections; | ||||
| import java.util.LinkedHashMap; | ||||
| import java.util.List; | ||||
| 
 | ||||
| import static io.dapr.it.Retry.callWithRetry; | ||||
|  | @ -158,6 +160,12 @@ public class PubSubIT extends BaseIT { | |||
|         System.out.println(String.format("Published message: '%s' to topic '%s' pubsub_name '%s'", message, ANOTHER_TOPIC_NAME, PUBSUB_NAME)); | ||||
|       } | ||||
| 
 | ||||
|       //Publishing an object. | ||||
|       MyObject object = new MyObject(); | ||||
|       object.setId("123"); | ||||
|       client.publishEvent(PUBSUB_NAME, TOPIC_NAME, object).block(); | ||||
|       System.out.println("Published one object."); | ||||
| 
 | ||||
|       //Publishing a single byte: Example of non-string based content published | ||||
|       client.publishEvent( | ||||
|           PUBSUB_NAME, | ||||
|  | @ -165,17 +173,32 @@ public class PubSubIT extends BaseIT { | |||
|           new byte[]{1}).block(); | ||||
|       System.out.println("Published one byte."); | ||||
| 
 | ||||
|       CloudEvent cloudEvent = new CloudEvent(); | ||||
|       cloudEvent.setId("1234"); | ||||
|       cloudEvent.setData("message from cloudevent"); | ||||
|       cloudEvent.setSource("test"); | ||||
|       cloudEvent.setSpecversion("1"); | ||||
|       cloudEvent.setType("myevent"); | ||||
|       cloudEvent.setDatacontenttype("text/plain"); | ||||
| 
 | ||||
|       //Publishing a cloud event. | ||||
|       client.publishEvent(new PublishEventRequestBuilder(PUBSUB_NAME, TOPIC_NAME, cloudEvent) | ||||
|           .withContentType("application/cloudevents+json") | ||||
|           .build()).block(); | ||||
|       System.out.println("Published one cloud event."); | ||||
| 
 | ||||
|       Thread.sleep(3000); | ||||
| 
 | ||||
|       callWithRetry(() -> { | ||||
|         System.out.println("Checking results for topic " + TOPIC_NAME); | ||||
|         // Validate text payload. | ||||
|         final List<CloudEvent> messages = client.invokeMethod( | ||||
|             daprRun.getAppName(), | ||||
|             "messages/testingtopic", | ||||
|             null, | ||||
|             HttpExtension.GET, | ||||
|             CLOUD_EVENT_LIST_TYPE_REF).block(); | ||||
|         assertEquals(11, messages.size()); | ||||
|         assertEquals(13, messages.size()); | ||||
|         for (int i = 0; i < NUM_MESSAGES; i++) { | ||||
|           final int messageId = i; | ||||
|           assertTrue(messages | ||||
|  | @ -186,6 +209,16 @@ public class PubSubIT extends BaseIT { | |||
|               .count() == 1); | ||||
|         } | ||||
| 
 | ||||
|         // Validate object payload. | ||||
|         assertTrue(messages | ||||
|             .stream() | ||||
|             .filter(m -> m.getData() != null) | ||||
|             .filter(m -> m.getData() instanceof LinkedHashMap) | ||||
|             .map(m -> (LinkedHashMap)m.getData()) | ||||
|             .filter(m -> "123".equals(m.get("id"))) | ||||
|             .count() == 1); | ||||
| 
 | ||||
|         // Validate byte payload. | ||||
|         assertTrue(messages | ||||
|             .stream() | ||||
|             .filter(m -> m.getData() != null) | ||||
|  | @ -193,6 +226,13 @@ public class PubSubIT extends BaseIT { | |||
|             .filter(m -> "AQ==".equals(m)) | ||||
|             .count() == 1); | ||||
| 
 | ||||
|         // Validate cloudevent payload. | ||||
|         assertTrue(messages | ||||
|             .stream() | ||||
|             .filter(m -> m.getData() != null) | ||||
|             .map(m -> m.getData()) | ||||
|             .filter(m -> "message from cloudevent".equals(m)) | ||||
|             .count() == 1); | ||||
|       }, 2000); | ||||
| 
 | ||||
|       callWithRetry(() -> { | ||||
|  | @ -330,4 +370,16 @@ public class PubSubIT extends BaseIT { | |||
| 
 | ||||
|     daprRun.stop(); | ||||
|   } | ||||
| 
 | ||||
|   public static class MyObject { | ||||
|     private String id; | ||||
| 
 | ||||
|     public String getId() { | ||||
|       return this.id; | ||||
|     } | ||||
| 
 | ||||
|     public void setId(String id) { | ||||
|       this.id = id; | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  |  | |||
|  | @ -40,7 +40,6 @@ import io.grpc.ForwardingClientCall; | |||
| import io.grpc.Metadata; | ||||
| import io.grpc.MethodDescriptor; | ||||
| import io.grpc.stub.StreamObserver; | ||||
| import okhttp3.HttpUrl; | ||||
| import reactor.core.publisher.Mono; | ||||
| import reactor.core.publisher.MonoSink; | ||||
| import reactor.util.context.Context; | ||||
|  | @ -48,10 +47,8 @@ import reactor.util.context.Context; | |||
| import java.io.Closeable; | ||||
| import java.io.IOException; | ||||
| import java.util.Collections; | ||||
| import java.util.HashMap; | ||||
| import java.util.List; | ||||
| import java.util.Map; | ||||
| import java.util.Optional; | ||||
| import java.util.concurrent.ExecutionException; | ||||
| import java.util.function.Consumer; | ||||
| import java.util.stream.Collectors; | ||||
|  | @ -143,7 +140,15 @@ public class DaprClientGrpc extends AbstractDaprClient { | |||
|           .setTopic(topic) | ||||
|           .setPubsubName(pubsubName) | ||||
|           .setData(ByteString.copyFrom(objectSerializer.serialize(data))); | ||||
|       envelopeBuilder.setDataContentType(objectSerializer.getContentType()); | ||||
| 
 | ||||
|       // Content-type can be overwritten on a per-request basis. | ||||
|       // It allows CloudEvents to be handled differently, for example. | ||||
|       String contentType = request.getContentType(); | ||||
|       if (contentType == null || contentType.isEmpty()) { | ||||
|         contentType = objectSerializer.getContentType(); | ||||
|       } | ||||
|       envelopeBuilder.setDataContentType(contentType); | ||||
| 
 | ||||
|       Map<String, String> metadata = request.getMetadata(); | ||||
|       if (metadata != null) { | ||||
|         envelopeBuilder.putAllMetadata(metadata); | ||||
|  |  | |||
|  | @ -137,7 +137,13 @@ public class DaprClientHttp extends AbstractDaprClient { | |||
|       } | ||||
| 
 | ||||
|       byte[] serializedEvent = objectSerializer.serialize(data); | ||||
|       Map<String, String> headers = Collections.singletonMap("content-type", objectSerializer.getContentType()); | ||||
|       // Content-type can be overwritten on a per-request basis. | ||||
|       // It allows CloudEvents to be handled differently, for example. | ||||
|       String contentType = request.getContentType(); | ||||
|       if (contentType == null || contentType.isEmpty()) { | ||||
|         contentType = objectSerializer.getContentType(); | ||||
|       } | ||||
|       Map<String, String> headers = Collections.singletonMap("content-type", contentType); | ||||
| 
 | ||||
|       String[] pathSegments = new String[]{ DaprHttp.API_VERSION, "publish", pubsubName, topic }; | ||||
| 
 | ||||
|  |  | |||
|  | @ -10,7 +10,6 @@ import com.fasterxml.jackson.annotation.JsonProperty; | |||
| import com.fasterxml.jackson.databind.DeserializationFeature; | ||||
| import com.fasterxml.jackson.databind.ObjectMapper; | ||||
| 
 | ||||
| import javax.annotation.PropertyKey; | ||||
| import java.io.IOException; | ||||
| import java.util.Arrays; | ||||
| import java.util.Objects; | ||||
|  | @ -20,6 +19,11 @@ import java.util.Objects; | |||
|  */ | ||||
| public final class CloudEvent { | ||||
| 
 | ||||
|   /** | ||||
|    * Mime type used for CloudEvent. | ||||
|    */ | ||||
|   public static final String CONTENT_TYPE = "application/cloudevents+json"; | ||||
| 
 | ||||
|   /** | ||||
|    * Shared Json serializer/deserializer as per Jackson's documentation. | ||||
|    */ | ||||
|  |  | |||
|  | @ -18,6 +18,8 @@ public class PublishEventRequest { | |||
| 
 | ||||
|   private Object data; | ||||
| 
 | ||||
|   private String contentType; | ||||
| 
 | ||||
|   private Map<String, String> metadata; | ||||
| 
 | ||||
|   public String getPubsubName() { | ||||
|  | @ -44,6 +46,14 @@ public class PublishEventRequest { | |||
|     this.data = data; | ||||
|   } | ||||
| 
 | ||||
|   public String getContentType() { | ||||
|     return this.contentType; | ||||
|   } | ||||
| 
 | ||||
|   void setContentType(String contentType) { | ||||
|     this.contentType = contentType; | ||||
|   } | ||||
| 
 | ||||
|   public Map<String, String> getMetadata() { | ||||
|     return metadata; | ||||
|   } | ||||
|  |  | |||
|  | @ -20,6 +20,8 @@ public class PublishEventRequestBuilder { | |||
| 
 | ||||
|   private final Object data; | ||||
| 
 | ||||
|   private String contentType; | ||||
| 
 | ||||
|   private Map<String, String> metadata = new HashMap<>(); | ||||
| 
 | ||||
|   /** | ||||
|  | @ -34,6 +36,11 @@ public class PublishEventRequestBuilder { | |||
|     this.data = data; | ||||
|   } | ||||
| 
 | ||||
|   public PublishEventRequestBuilder withContentType(String contentType) { | ||||
|     this.contentType = contentType; | ||||
|     return this; | ||||
|   } | ||||
| 
 | ||||
|   public PublishEventRequestBuilder withMetadata(Map<String, String> metadata) { | ||||
|     this.metadata = metadata == null ? null : Collections.unmodifiableMap(metadata); | ||||
|     return this; | ||||
|  | @ -48,6 +55,7 @@ public class PublishEventRequestBuilder { | |||
|     request.setPubsubName(this.pubsubName); | ||||
|     request.setTopic(this.topic); | ||||
|     request.setData(this.data); | ||||
|     request.setContentType(this.contentType); | ||||
|     request.setMetadata(this.metadata); | ||||
|     return request; | ||||
|   } | ||||
|  |  | |||
|  | @ -17,6 +17,8 @@ import io.dapr.client.domain.GetBulkStateRequestBuilder; | |||
| import io.dapr.client.domain.GetStateRequest; | ||||
| import io.dapr.client.domain.GetStateRequestBuilder; | ||||
| import io.dapr.client.domain.HttpExtension; | ||||
| import io.dapr.client.domain.PublishEventRequest; | ||||
| import io.dapr.client.domain.PublishEventRequestBuilder; | ||||
| import io.dapr.client.domain.State; | ||||
| import io.dapr.client.domain.StateOptions; | ||||
| import io.dapr.client.domain.TransactionalStateOperation; | ||||
|  | @ -35,6 +37,7 @@ import org.junit.Before; | |||
| import org.junit.Test; | ||||
| import org.mockito.ArgumentCaptor; | ||||
| import org.mockito.ArgumentMatcher; | ||||
| import org.mockito.ArgumentMatchers; | ||||
| import org.mockito.stubbing.Answer; | ||||
| import reactor.core.publisher.Mono; | ||||
| 
 | ||||
|  | @ -212,13 +215,49 @@ public class DaprClientGrpcTest { | |||
|       observer.onNext(Empty.getDefaultInstance()); | ||||
|       observer.onCompleted(); | ||||
|       return null; | ||||
|     }).when(daprStub).publishEvent(any(DaprProtos.PublishEventRequest.class), any()); | ||||
|     }).when(daprStub).publishEvent(ArgumentMatchers.argThat(publishEventRequest -> { | ||||
|       if (!"application/json".equals(publishEventRequest.getDataContentType())) { | ||||
|         return false; | ||||
|       } | ||||
| 
 | ||||
|       if (!"{\"id\":1,\"value\":\"Event\"}".equals(new String(publishEventRequest.getData().toByteArray())) && | ||||
|           !"{\"value\":\"Event\",\"id\":1}".equals(new String(publishEventRequest.getData().toByteArray()))) { | ||||
|         return false; | ||||
|       } | ||||
|       return true; | ||||
|     }), any()); | ||||
| 
 | ||||
|     MyObject event = new MyObject(1, "Event"); | ||||
|     Mono<Void> result = client.publishEvent("pubsubname", "topic", event); | ||||
|     result.block(); | ||||
|   } | ||||
| 
 | ||||
|   @Test | ||||
|   public void publishEventContentTypeOverrideTest() { | ||||
|     doAnswer((Answer<Void>) invocation -> { | ||||
|       StreamObserver<Empty> observer = (StreamObserver<Empty>) invocation.getArguments()[1]; | ||||
|       observer.onNext(Empty.getDefaultInstance()); | ||||
|       observer.onCompleted(); | ||||
|       return null; | ||||
|     }).when(daprStub).publishEvent(ArgumentMatchers.argThat(publishEventRequest -> { | ||||
|       if (!"text/plain".equals(publishEventRequest.getDataContentType())) { | ||||
|         return false; | ||||
|       } | ||||
| 
 | ||||
|       if (!"\"hello\"".equals(new String(publishEventRequest.getData().toByteArray()))) { | ||||
|         return false; | ||||
|       } | ||||
|       return true; | ||||
|     }), any()); | ||||
| 
 | ||||
| 
 | ||||
|     Mono<Void> result = client.publishEvent( | ||||
|         new PublishEventRequestBuilder("pubsubname", "topic", "hello") | ||||
|             .withContentType("text/plain") | ||||
|             .build()); | ||||
|     result.block(); | ||||
|   } | ||||
| 
 | ||||
|   @Test | ||||
|   public void invokeBindingIllegalArgumentExceptionTest() { | ||||
|     assertThrows(IllegalArgumentException.class, () -> { | ||||
|  |  | |||
|  | @ -9,6 +9,7 @@ import io.dapr.client.domain.DeleteStateRequestBuilder; | |||
| import io.dapr.client.domain.GetBulkStateRequestBuilder; | ||||
| import io.dapr.client.domain.GetStateRequestBuilder; | ||||
| import io.dapr.client.domain.HttpExtension; | ||||
| import io.dapr.client.domain.PublishEventRequestBuilder; | ||||
| import io.dapr.client.domain.State; | ||||
| import io.dapr.client.domain.StateOptions; | ||||
| import io.dapr.client.domain.TransactionalStateOperation; | ||||
|  | @ -101,8 +102,8 @@ public class DaprClientHttpTest { | |||
|   @Test | ||||
|   public void publishEventInvokation() { | ||||
|     mockInterceptor.addRule() | ||||
|       .post("http://127.0.0.1:3000/v1.0/publish/mypubsubname/A") | ||||
|       .respond(EXPECTED_RESULT); | ||||
|         .post("http://127.0.0.1:3000/v1.0/publish/mypubsubname/A") | ||||
|         .respond(EXPECTED_RESULT); | ||||
|     String event = "{ \"message\": \"This is a test\" }"; | ||||
|     daprHttp = new DaprHttp(Properties.SIDECAR_IP.get(), 3000, okHttpClient); | ||||
|     DaprClientHttp daprClientHttp = new DaprClientHttp(daprHttp); | ||||
|  | @ -113,14 +114,30 @@ public class DaprClientHttpTest { | |||
|   @Test | ||||
|   public void publishEvent() { | ||||
|     mockInterceptor.addRule() | ||||
|       .post("http://127.0.0.1:3000/v1.0/publish/mypubsubname/A") | ||||
|       .respond(EXPECTED_RESULT); | ||||
|         .post("http://127.0.0.1:3000/v1.0/publish/mypubsubname/A") | ||||
|         .header("content-type", "application/json") | ||||
|         .respond(EXPECTED_RESULT); | ||||
|     String event = "{ \"message\": \"This is a test\" }"; | ||||
| 
 | ||||
|     Mono<Void> mono = daprClientHttp.publishEvent("mypubsubname","A", event); | ||||
|     assertNull(mono.block()); | ||||
|   } | ||||
| 
 | ||||
|   @Test | ||||
|   public void publishEventContentTypeOverride() { | ||||
|     mockInterceptor.addRule() | ||||
|         .post("http://127.0.0.1:3000/v1.0/publish/mypubsubname/A") | ||||
|         .header("content-type", "text/plain") | ||||
|         .respond(EXPECTED_RESULT); | ||||
|     String event = "{ \"message\": \"This is a test\" }"; | ||||
| 
 | ||||
|     Mono<Void> mono = daprClientHttp.publishEvent( | ||||
|         new PublishEventRequestBuilder("mypubsubname","A", event) | ||||
|             .withContentType("text/plain") | ||||
|             .build()); | ||||
|     assertNull(mono.block()); | ||||
|   } | ||||
| 
 | ||||
|   @Test | ||||
|   public void publishEventIfTopicIsNullOrEmpty() { | ||||
|     String event = "{ \"message\": \"This is a test\" }"; | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue