Skip to content

Commit

Permalink
refactor(core): update AsyncHeadersBuilder (wip)
Browse files Browse the repository at this point in the history
Co-authored-by: David Müller <[email protected]>
  • Loading branch information
timonback and sam0r040 committed Apr 12, 2024
1 parent 2a456ff commit ce3b7a6
Show file tree
Hide file tree
Showing 24 changed files with 93 additions and 62 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@
package io.github.springwolf.core.asyncapi.components.headers;

import io.github.springwolf.asyncapi.v3.model.schema.SchemaObject;
import org.apache.commons.lang3.tuple.Pair;

public interface AsyncHeadersBuilder {
SchemaObject buildHeaders(Class<?> payloadType);
SchemaObject buildHeaders(Pair<String, SchemaObject> payloadSchema);
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
package io.github.springwolf.core.asyncapi.components.headers;

import io.github.springwolf.asyncapi.v3.model.schema.SchemaObject;
import org.apache.commons.lang3.tuple.Pair;

import java.util.List;
import java.util.Map;
Expand All @@ -22,7 +23,7 @@ public class AsyncHeadersNotDocumented implements AsyncHeadersBuilder {
}

@Override
public SchemaObject buildHeaders(Class<?> payloadType) {
public SchemaObject buildHeaders(Pair<String, SchemaObject> payloadSchema) {
return NOT_DOCUMENTED;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
package io.github.springwolf.core.asyncapi.components.headers;

import io.github.springwolf.asyncapi.v3.model.schema.SchemaObject;
import org.apache.commons.lang3.tuple.Pair;

import java.util.List;
import java.util.Map;
Expand All @@ -21,7 +22,7 @@ public class AsyncHeadersNotUsed implements AsyncHeadersBuilder {
}

@Override
public SchemaObject buildHeaders(Class<?> payloadType) {
public SchemaObject buildHeaders(Pair<String, SchemaObject> payloadSchema) {
return NOT_USED;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,8 @@ public OperationAction getOperationType() {

private final AsyncApiDocketService asyncApiDocketService = mock(AsyncApiDocketService.class);
private final PayloadClassExtractor payloadClassExtractor = new PayloadClassExtractor(properties);
private final PayloadService payloadService = new PayloadService(payloadClassExtractor, componentsService);
private final PayloadService payloadService =
new PayloadService(payloadClassExtractor, componentsService, properties);

private final List<OperationBindingProcessor> operationBindingProcessors =
List.of(new TestOperationBindingProcessor());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import io.github.springwolf.core.asyncapi.components.headers.AsyncHeadersNotDocumented;
import io.github.springwolf.core.asyncapi.scanners.bindings.BindingFactory;
import io.github.springwolf.core.asyncapi.scanners.common.payload.PayloadClassExtractor;
import io.github.springwolf.core.asyncapi.scanners.common.payload.PayloadService;
import io.github.springwolf.core.configuration.properties.SpringwolfConfigProperties;
import lombok.Data;
import lombok.EqualsAndHashCode;
Expand Down Expand Up @@ -48,6 +49,7 @@
SpringAnnotationClassLevelChannelsScannerIntegrationTest.TestBindingFactory.class,
DefaultComponentsService.class,
SwaggerSchemaUtil.class,
PayloadService.class,
PayloadClassExtractor.class,
DefaultSchemaWalker.class,
SchemaWalkerProvider.class,
Expand All @@ -60,7 +62,7 @@ class SpringAnnotationClassLevelChannelsScannerIntegrationTest {
BindingFactory<TestClassListener> bindingFactory;

@Autowired
PayloadClassExtractor payloadClassExtractor;
PayloadService payloadService;

@Autowired
ComponentsService componentsService;
Expand All @@ -74,7 +76,7 @@ void setUp() {
TestMethodListener.class,
this.bindingFactory,
new AsyncHeadersNotDocumented(),
payloadClassExtractor,
payloadService,
componentsService);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,17 +18,17 @@
import io.github.springwolf.core.asyncapi.components.ComponentsService;
import io.github.springwolf.core.asyncapi.components.headers.AsyncHeadersNotDocumented;
import io.github.springwolf.core.asyncapi.scanners.bindings.BindingFactory;
import io.github.springwolf.core.asyncapi.scanners.common.payload.PayloadClassExtractor;
import io.github.springwolf.core.asyncapi.scanners.common.payload.PayloadService;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.apache.commons.lang3.tuple.Pair;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.List;
import java.util.Map;
import java.util.Optional;

import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.ArgumentMatchers.any;
Expand All @@ -39,7 +39,7 @@

class SpringAnnotationClassLevelChannelsScannerTest {

private final PayloadClassExtractor payloadClassExtractor = mock(PayloadClassExtractor.class);
private final PayloadService payloadService = mock();
private final BindingFactory<TestClassListener> bindingFactory = mock(BindingFactory.class);
private final ComponentsService componentsService = mock(ComponentsService.class);
SpringAnnotationClassLevelChannelsScanner<TestClassListener, TestMethodListener> scanner =
Expand All @@ -48,7 +48,7 @@ class SpringAnnotationClassLevelChannelsScannerTest {
TestMethodListener.class,
bindingFactory,
new AsyncHeadersNotDocumented(),
payloadClassExtractor,
payloadService,
componentsService);

private static final String CHANNEL = "test-channel";
Expand All @@ -68,7 +68,7 @@ void setUp() {
doReturn(defaultChannelBinding).when(bindingFactory).buildChannelBinding(any());
doReturn(defaultMessageBinding).when(bindingFactory).buildMessageBinding(any());

doReturn(Optional.of(String.class)).when(payloadClassExtractor).extractFrom(any());
when(payloadService.extractSchema(any())).thenReturn(Pair.of(String.class.getName(), new SchemaObject()));
doAnswer(invocation -> invocation.<Class<?>>getArgument(0).getSimpleName())
.when(componentsService)
.registerSchema(any(Class.class));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import io.github.springwolf.core.asyncapi.components.headers.AsyncHeadersNotDocumented;
import io.github.springwolf.core.asyncapi.scanners.bindings.BindingFactory;
import io.github.springwolf.core.asyncapi.scanners.common.payload.PayloadClassExtractor;
import io.github.springwolf.core.asyncapi.scanners.common.payload.PayloadService;
import io.github.springwolf.core.configuration.properties.SpringwolfConfigProperties;
import lombok.Data;
import lombok.EqualsAndHashCode;
Expand Down Expand Up @@ -50,6 +51,7 @@
SpringAnnotationMethodLevelChannelsScannerIntegrationTest.TestBindingFactory.class,
DefaultComponentsService.class,
SwaggerSchemaUtil.class,
PayloadService.class,
PayloadClassExtractor.class,
DefaultSchemaWalker.class,
SchemaWalkerProvider.class,
Expand All @@ -61,7 +63,7 @@ class SpringAnnotationMethodLevelChannelsScannerIntegrationTest {
BindingFactory<TestChannelListener> bindingFactory;

@Autowired
PayloadClassExtractor payloadClassExtractor;
PayloadService payloadService;

@Autowired
ComponentsService componentsService;
Expand All @@ -74,7 +76,7 @@ void setUp() {
TestChannelListener.class,
this.bindingFactory,
new AsyncHeadersNotDocumented(),
payloadClassExtractor,
payloadService,
componentsService);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,17 +18,17 @@
import io.github.springwolf.core.asyncapi.components.ComponentsService;
import io.github.springwolf.core.asyncapi.components.headers.AsyncHeadersNotDocumented;
import io.github.springwolf.core.asyncapi.scanners.bindings.BindingFactory;
import io.github.springwolf.core.asyncapi.scanners.common.payload.PayloadClassExtractor;
import io.github.springwolf.core.asyncapi.scanners.common.payload.PayloadService;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.apache.commons.lang3.tuple.Pair;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;

import static org.assertj.core.api.Assertions.assertThat;
Expand All @@ -40,15 +40,11 @@

class SpringAnnotationMethodLevelChannelsScannerTest {

private final PayloadClassExtractor payloadClassExtractor = mock(PayloadClassExtractor.class);
private final PayloadService payloadService = mock();
private final BindingFactory<TestListener> bindingFactory = mock(BindingFactory.class);
private final ComponentsService componentsService = mock(ComponentsService.class);
SpringAnnotationMethodLevelChannelsScanner<TestListener> scanner = new SpringAnnotationMethodLevelChannelsScanner<>(
TestListener.class,
bindingFactory,
new AsyncHeadersNotDocumented(),
payloadClassExtractor,
componentsService);
TestListener.class, bindingFactory, new AsyncHeadersNotDocumented(), payloadService, componentsService);

private static final String CHANNEL = "test-channel";
private static final Map<String, OperationBinding> defaultOperationBinding =
Expand All @@ -67,7 +63,7 @@ void setUp() throws NoSuchMethodException {
doReturn(defaultChannelBinding).when(bindingFactory).buildChannelBinding(any());
doReturn(defaultMessageBinding).when(bindingFactory).buildMessageBinding(any());

doReturn(Optional.of(String.class)).when(payloadClassExtractor).extractFrom(any());
when(payloadService.extractSchema(any())).thenReturn(Pair.of(String.class.getName(), new SchemaObject()));
doAnswer(invocation -> invocation.<Class<?>>getArgument(0).getSimpleName())
.when(componentsService)
.registerSchema(any(Class.class));
Expand All @@ -77,10 +73,12 @@ void setUp() throws NoSuchMethodException {

var stringMethod =
ClassWithMultipleTestListenerAnnotation.class.getDeclaredMethod("methodWithAnnotation", String.class);
doReturn(Optional.of(String.class)).when(payloadClassExtractor).extractFrom(stringMethod);
when(payloadService.extractSchema(stringMethod))
.thenReturn(Pair.of(String.class.getName(), new SchemaObject()));
var simpleFooMethod = ClassWithMultipleTestListenerAnnotation.class.getDeclaredMethod(
"anotherMethodWithAnnotation", SimpleFoo.class);
doReturn(Optional.of(SimpleFoo.class)).when(payloadClassExtractor).extractFrom(simpleFooMethod);
when(payloadService.extractSchema(simpleFooMethod))
.thenReturn(Pair.of(SimpleFoo.class.getName(), new SchemaObject()));
}

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -88,8 +88,12 @@ public void shouldExtractPayloadFromMethod() {
@Test
public void shouldReturnPayloadNotUsed() {
// given
AsyncMessage asyncMessage = mock(AsyncMessage.class);
when(asyncMessage.contentType()).thenReturn("application/json");

AsyncOperation asyncOperation = mock(AsyncOperation.class);
doReturn(Object.class).when(asyncOperation).payloadType();
when(asyncOperation.message()).thenReturn(asyncMessage);

Method method = mock(Method.class);
when(payloadClassExtractor.extractFrom(method)).thenReturn(Optional.empty());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,8 @@ public OperationAction getOperationType() {
private final AsyncApiDocketService asyncApiDocketService = mock(AsyncApiDocketService.class);
private final PayloadClassExtractor payloadClassExtractor = new PayloadClassExtractor(properties);

private final PayloadService payloadService = new PayloadService(payloadClassExtractor, componentsService);
private final PayloadService payloadService =
new PayloadService(payloadClassExtractor, componentsService, properties);

private final List<OperationBindingProcessor> operationBindingProcessors =
List.of(new TestOperationBindingProcessor());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,17 +20,17 @@
import io.github.springwolf.core.asyncapi.components.ComponentsService;
import io.github.springwolf.core.asyncapi.components.headers.AsyncHeadersNotDocumented;
import io.github.springwolf.core.asyncapi.scanners.bindings.BindingFactory;
import io.github.springwolf.core.asyncapi.scanners.common.payload.PayloadClassExtractor;
import io.github.springwolf.core.asyncapi.scanners.common.payload.PayloadService;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.apache.commons.lang3.tuple.Pair;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.List;
import java.util.Map;
import java.util.Optional;

import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.ArgumentMatchers.any;
Expand All @@ -41,7 +41,7 @@

class SpringAnnotationClassLevelOperationsScannerTest {

private final PayloadClassExtractor payloadClassExtractor = mock(PayloadClassExtractor.class);
private final PayloadService payloadService = mock();
private final BindingFactory<TestClassListener> bindingFactory = mock(BindingFactory.class);
private final ComponentsService componentsService = mock(ComponentsService.class);
SpringAnnotationClassLevelOperationsScanner<TestClassListener, TestMethodListener> scanner =
Expand All @@ -50,7 +50,7 @@ class SpringAnnotationClassLevelOperationsScannerTest {
TestMethodListener.class,
bindingFactory,
new AsyncHeadersNotDocumented(),
payloadClassExtractor,
payloadService,
componentsService);

private static final String CHANNEL = "test-channel";
Expand All @@ -70,7 +70,7 @@ void setUp() {
doReturn(defaultChannelBinding).when(bindingFactory).buildChannelBinding(any());
doReturn(defaultMessageBinding).when(bindingFactory).buildMessageBinding(any());

doReturn(Optional.of(String.class)).when(payloadClassExtractor).extractFrom(any());
when(payloadService.extractSchema(any())).thenReturn(Pair.of(String.class.getName(), new SchemaObject()));
doAnswer(invocation -> invocation.<Class<?>>getArgument(0).getSimpleName())
.when(componentsService)
.registerSchema(any(Class.class));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1090,6 +1090,7 @@
},
"name": "io.github.springwolf.examples.kafka.consumers.StringConsumer$StringEnvelope",
"title": "StringEnvelope",
"description": "Payload description using @Schema annotation and @AsyncApiPayload within envelope class",
"bindings": {
"kafka": {
"bindingVersion": "0.5.0"
Expand Down
2 changes: 2 additions & 0 deletions springwolf-plugins/springwolf-amqp-plugin/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ dependencies {
implementation "org.springframework.amqp:spring-amqp"
implementation "org.springframework.amqp:spring-rabbit"

implementation "org.apache.commons:commons-lang3:${commonsLang3Version}"

compileOnly "com.google.code.findbugs:jsr305:${jsr305Version}"
permitUnusedDeclared "com.google.code.findbugs:jsr305:${jsr305Version}"

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

import io.github.springwolf.asyncapi.v3.model.schema.SchemaObject;
import io.github.springwolf.core.asyncapi.components.headers.AsyncHeadersBuilder;
import org.apache.commons.lang3.tuple.Pair;

import java.util.Map;

Expand All @@ -17,7 +18,7 @@ public class AsyncHeadersForAmqpBuilder implements AsyncHeadersBuilder {
}

@Override
public SchemaObject buildHeaders(Class<?> payloadType) {
public SchemaObject buildHeaders(Pair<String, SchemaObject> payloadSchema) {
return headers;
}
}
Loading

0 comments on commit ce3b7a6

Please sign in to comment.