diff --git a/springwolf-core/src/main/java/io/github/springwolf/core/asyncapi/scanners/common/payload/PayloadService.java b/springwolf-core/src/main/java/io/github/springwolf/core/asyncapi/scanners/common/payload/PayloadService.java index 13f567282..39decfe81 100644 --- a/springwolf-core/src/main/java/io/github/springwolf/core/asyncapi/scanners/common/payload/PayloadService.java +++ b/springwolf-core/src/main/java/io/github/springwolf/core/asyncapi/scanners/common/payload/PayloadService.java @@ -44,7 +44,7 @@ public NamedSchemaObject extractSchema(AsyncOperation operationData, Method meth return payloadType.map((type) -> buildSchema(contentType, type)).orElseGet(this::useUnusedPayload); } - public NamedSchemaObject buildSchema(Class payloadType) { + private NamedSchemaObject buildSchema(Class payloadType) { String contentType = properties.getDocket().getDefaultContentType(); return buildSchema(contentType, payloadType); @@ -59,6 +59,12 @@ private NamedSchemaObject buildSchema(String contentType, Class payloadType) return new NamedSchemaObject(componentsSchemaName, schema); } + public String extractSchemaForName(Class payloadType) { + String contentType = properties.getDocket().getDefaultContentType(); + + return this.componentsService.registerSchema(payloadType, contentType); + } + private NamedSchemaObject useUnusedPayload() { this.componentsService.registerSchema(PAYLOAD_NOT_USED.schema()); return PAYLOAD_NOT_USED; diff --git a/springwolf-core/src/test/java/io/github/springwolf/core/asyncapi/scanners/common/payload/PayloadServiceTest.java b/springwolf-core/src/test/java/io/github/springwolf/core/asyncapi/scanners/common/payload/PayloadServiceTest.java index 42b5299f1..ba79d0c29 100644 --- a/springwolf-core/src/test/java/io/github/springwolf/core/asyncapi/scanners/common/payload/PayloadServiceTest.java +++ b/springwolf-core/src/test/java/io/github/springwolf/core/asyncapi/scanners/common/payload/PayloadServiceTest.java @@ -5,6 +5,7 @@ import io.github.springwolf.core.asyncapi.annotations.AsyncMessage; import io.github.springwolf.core.asyncapi.annotations.AsyncOperation; import io.github.springwolf.core.asyncapi.components.ComponentsService; +import io.github.springwolf.core.configuration.properties.SpringwolfConfigProperties; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; @@ -20,6 +21,7 @@ import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; @ExtendWith(MockitoExtension.class) @@ -31,6 +33,12 @@ class PayloadServiceTest { @Mock private ComponentsService componentsService; + @Mock + private SpringwolfConfigProperties.ConfigDocket docket; + + @Mock + private SpringwolfConfigProperties properties; + @InjectMocks private PayloadService payloadService; @@ -59,7 +67,7 @@ public void shouldUsePayloadFromAsyncOperationAnnotation() { } @Test - public void shouldExtractPayloadFromMethod() { + public void shouldExtractPayloadFromMethodWithAnnotation() { // given AsyncMessage asyncMessage = mock(AsyncMessage.class); when(asyncMessage.contentType()).thenReturn("application/json"); @@ -85,6 +93,29 @@ public void shouldExtractPayloadFromMethod() { assertThat(result.schema()).isEqualTo(schemaObject); } + @Test + public void shouldExtractPayloadFromMethod() { + // given + when(properties.getDocket()).thenReturn(docket); + when(docket.getDefaultContentType()).thenReturn("application/json"); + + Method method = mock(Method.class); + when(payloadClassExtractor.extractFrom(method)).thenReturn(Optional.of(String.class)); + + String schemaName = "my-schema-name"; + when(componentsService.registerSchema(any(), any())).thenReturn(schemaName); + + SchemaObject schemaObject = SchemaObject.builder().build(); + when(componentsService.resolveSchema(schemaName)).thenReturn(schemaObject); + + // when + var result = payloadService.extractSchema(method); + + // then + assertThat(result.name()).isEqualTo(schemaName); + assertThat(result.schema()).isEqualTo(schemaObject); + } + @Test public void shouldReturnPayloadNotUsed() { // given @@ -107,4 +138,21 @@ public void shouldReturnPayloadNotUsed() { assertThat(result.schema().getDescription()).isEqualTo("No payload specified"); verify(componentsService).registerSchema(PAYLOAD_NOT_USED.schema()); } + + @Test + public void shouldExtractSchemaForInteger() { + // given + when(properties.getDocket()).thenReturn(docket); + when(docket.getDefaultContentType()).thenReturn("application/json"); + + String schemaName = "my-schema-name"; + when(componentsService.registerSchema(any(), any())).thenReturn(schemaName); + + // when + var result = payloadService.extractSchemaForName(Integer.class); + + // then + assertThat(result).isEqualTo(schemaName); + verifyNoMoreInteractions(componentsService); + } } diff --git a/springwolf-plugins/springwolf-cloud-stream-plugin/src/main/java/io/github/springwolf/plugins/cloudstream/asyncapi/scanners/channels/CloudStreamFunctionChannelsScanner.java b/springwolf-plugins/springwolf-cloud-stream-plugin/src/main/java/io/github/springwolf/plugins/cloudstream/asyncapi/scanners/channels/CloudStreamFunctionChannelsScanner.java index 299b7ed5d..b52678904 100644 --- a/springwolf-plugins/springwolf-cloud-stream-plugin/src/main/java/io/github/springwolf/plugins/cloudstream/asyncapi/scanners/channels/CloudStreamFunctionChannelsScanner.java +++ b/springwolf-plugins/springwolf-cloud-stream-plugin/src/main/java/io/github/springwolf/plugins/cloudstream/asyncapi/scanners/channels/CloudStreamFunctionChannelsScanner.java @@ -84,7 +84,7 @@ private Map.Entry toChannelEntry(FunctionalChannelBeanDat private ChannelObject buildChannel(FunctionalChannelBeanData beanData) { Class payloadType = beanData.payloadType(); - String modelName = payloadService.buildSchema(payloadType).name(); + String modelName = payloadService.extractSchemaForName(payloadType); String headerModelName = componentsService.registerSchema(AsyncHeadersNotDocumented.NOT_DOCUMENTED); var messagePayload = MessagePayload.of(MultiFormatSchema.builder() diff --git a/springwolf-plugins/springwolf-cloud-stream-plugin/src/main/java/io/github/springwolf/plugins/cloudstream/asyncapi/scanners/operations/CloudStreamFunctionOperationsScanner.java b/springwolf-plugins/springwolf-cloud-stream-plugin/src/main/java/io/github/springwolf/plugins/cloudstream/asyncapi/scanners/operations/CloudStreamFunctionOperationsScanner.java index ecd1517c3..40c3dde59 100644 --- a/springwolf-plugins/springwolf-cloud-stream-plugin/src/main/java/io/github/springwolf/plugins/cloudstream/asyncapi/scanners/operations/CloudStreamFunctionOperationsScanner.java +++ b/springwolf-plugins/springwolf-cloud-stream-plugin/src/main/java/io/github/springwolf/plugins/cloudstream/asyncapi/scanners/operations/CloudStreamFunctionOperationsScanner.java @@ -80,7 +80,7 @@ private Map.Entry toOperationEntry(FunctionalChannelBeanData private Operation buildOperation(FunctionalChannelBeanData beanData, String channelName) { Class payloadType = beanData.payloadType(); - String modelName = payloadService.buildSchema(payloadType).name(); + String modelName = payloadService.extractSchemaForName(payloadType); String headerModelName = componentsService.registerSchema(AsyncHeadersNotDocumented.NOT_DOCUMENTED); MessageObject message = MessageObject.builder()