Fix Cloud Events support for Message functions
Ensured Cloud Event completness by adding assertion for required attributes as well as generation of default values for attributes such as ID and SPECVERSION
This commit is contained in:
@@ -56,7 +56,6 @@ public class CloudEventFunctionTests {
|
||||
.setType("org.springframework")
|
||||
.build();
|
||||
|
||||
assertThat(inputMessage.getHeaders().getId()).isEqualTo(UUID.fromString(id));
|
||||
assertThat(CloudEventMessageUtils.isCloudEvent(inputMessage)).isTrue();
|
||||
|
||||
Message<Person> resultMessage = (Message<Person>) function.apply(inputMessage);
|
||||
@@ -87,8 +86,6 @@ public class CloudEventFunctionTests {
|
||||
.setHeader("ce_type", "org.springframework")
|
||||
.build();
|
||||
|
||||
// assertThat(CloudEventMessageUtils.isBinary(inputMessage)).isTrue();
|
||||
|
||||
Message<Person> resultMessage = (Message<Person>) function.apply(inputMessage);
|
||||
|
||||
/*
|
||||
@@ -139,6 +136,44 @@ public class CloudEventFunctionTests {
|
||||
assertThat(CloudEventMessageUtils.getSource(resultMessage)).isEqualTo(URI.create("http://spring.io/application-application"));
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Test
|
||||
public void testStructuredPojoToPojoMessageFunction() throws Exception {
|
||||
String payload = "{\n" +
|
||||
" \"specversion\" : \"1.0\",\n" +
|
||||
" \"type\" : \"org.springframework\",\n" +
|
||||
" \"source\" : \"https://spring.io/\",\n" +
|
||||
" \"id\" : \"A234-1234-1234\",\n" +
|
||||
" \"datacontenttype\" : \"application/json\",\n" +
|
||||
" \"data\" : {\n" +
|
||||
" \"version\" : \"1.0\",\n" +
|
||||
" \"releaseName\" : \"Spring Framework\",\n" +
|
||||
" \"releaseDate\" : \"24-03-2004\"\n" +
|
||||
" }\n" +
|
||||
"}";
|
||||
Function<Object, Object> function = this.lookup("springReleaseAsMessage", TestConfiguration.class);
|
||||
|
||||
Message<String> inputMessage = MessageBuilder
|
||||
.withPayload(payload)
|
||||
.setHeader(MessageHeaders.CONTENT_TYPE, CloudEventMessageUtils.APPLICATION_CLOUDEVENTS_VALUE + "+json")
|
||||
.build();
|
||||
|
||||
assertThat(CloudEventMessageUtils.isCloudEvent(inputMessage)).isFalse();
|
||||
|
||||
Message<SpringReleaseEvent> resultMessage = (Message<SpringReleaseEvent>) function.apply(inputMessage);
|
||||
assertThat(resultMessage.getPayload().getReleaseDate())
|
||||
.isEqualTo(new SimpleDateFormat("dd-MM-yyyy").parse("01-10-2006"));
|
||||
assertThat(resultMessage.getPayload().getVersion()).isEqualTo("2.0");
|
||||
// /*
|
||||
// * Validates that although user only deals with POJO, the framework recognizes
|
||||
// * both on input and output that it is dealing with Cloud Event and generates
|
||||
// * appropriate headers/attributes
|
||||
// */
|
||||
assertThat(CloudEventMessageUtils.isCloudEvent(resultMessage)).isTrue();
|
||||
assertThat(CloudEventMessageUtils.getType(resultMessage)).isEqualTo(SpringReleaseEvent.class.getName());
|
||||
assertThat(CloudEventMessageUtils.getSource(resultMessage)).isEqualTo(URI.create("https://spring.release.event"));
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Test
|
||||
public void testStructuredPojoToPojoDefaultOutputAttributeProviderNoDataContentType() throws Exception {
|
||||
@@ -155,8 +190,8 @@ public class CloudEventFunctionTests {
|
||||
"}";
|
||||
Function<Object, Object> function = this.lookup("springRelease", TestConfiguration.class);
|
||||
|
||||
Message<String> inputMessage = CloudEventMessageBuilder
|
||||
.withData(payload)
|
||||
Message<String> inputMessage = MessageBuilder
|
||||
.withPayload(payload)
|
||||
.setHeader(MessageHeaders.CONTENT_TYPE, CloudEventMessageUtils.APPLICATION_CLOUDEVENTS_VALUE + "+json")
|
||||
.build();
|
||||
assertThat(CloudEventMessageUtils.isCloudEvent(inputMessage)).isFalse();
|
||||
@@ -202,6 +237,18 @@ public class CloudEventFunctionTests {
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@Bean
|
||||
Function<Message<SpringReleaseEvent>, Message<SpringReleaseEvent>> springReleaseAsMessage() {
|
||||
return message -> {
|
||||
SpringReleaseEvent updated = springRelease().apply(message.getPayload());
|
||||
return CloudEventMessageBuilder.withData(updated)
|
||||
.copyHeaders(message.getHeaders())
|
||||
.setSource("https://spring.release.event")
|
||||
.setType(SpringReleaseEvent.class.getName())
|
||||
.build();
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
public static class Person {
|
||||
|
||||
@@ -46,7 +46,7 @@ public class CloudEventMessageUtilsAndBuilderTests {
|
||||
|
||||
Message<String> kafkaMessage = CloudEventMessageBuilder.fromMessage(httpMessage).build(CloudEventMessageUtils.KAFKA_ATTR_PREFIX);
|
||||
attributes = CloudEventMessageUtils.getAttributes(kafkaMessage);
|
||||
assertThat(attributes.size()).isEqualTo(3);
|
||||
assertThat(attributes.size()).isEqualTo(4); // id will be auto injected, so always at least 4 (as tehre are 4 required attributes in CE)
|
||||
assertThat(kafkaMessage.getHeaders().get("ce_source")).isNotNull();
|
||||
assertThat(CloudEventMessageUtils.getSource(kafkaMessage)).isEqualTo(URI.create("https://foo.bar"));
|
||||
assertThat(kafkaMessage.getHeaders().get("ce_type")).isNotNull();
|
||||
@@ -56,7 +56,7 @@ public class CloudEventMessageUtilsAndBuilderTests {
|
||||
|
||||
httpMessage = CloudEventMessageBuilder.fromMessage(kafkaMessage).build(CloudEventMessageUtils.DEFAULT_ATTR_PREFIX);
|
||||
attributes = CloudEventMessageUtils.getAttributes(httpMessage);
|
||||
assertThat(attributes.size()).isEqualTo(3);
|
||||
assertThat(attributes.size()).isEqualTo(4); //
|
||||
assertThat(httpMessage.getHeaders().get("ce-source")).isNotNull();
|
||||
assertThat(CloudEventMessageUtils.getSource(httpMessage)).isEqualTo(URI.create("https://foo.bar"));
|
||||
assertThat(httpMessage.getHeaders().get("ce-type")).isNotNull();
|
||||
|
||||
Reference in New Issue
Block a user