Skip to content

Commit 24f378b

Browse files
committed
build(test): Fix some sonar issues, add unit test and fix some bugs
1 parent 42b47fa commit 24f378b

22 files changed

+810
-12
lines changed

main.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ allprojects {
2525
property "sonar.junit.reportPaths", "build/test-results/test"
2626
property "sonar.java-coveragePlugin", "jacoco"
2727
property "sonar.coverage.jacoco.xmlReportPaths", "${rootDir}/build/reports/jacoco/generateMergedReport/generateMergedReport.xml"
28-
property "sonar.exclusions", ".github/**,samples/**/*"
28+
property "sonar.exclusions", ".github/**,samples/**/*,**/mybroker/**/*"
2929
property 'sonar.coverage.exclusions', 'samples/**/*'
3030
}
3131
}

starters/async-commons-starter/src/main/java/org/reactivecommons/async/starter/config/health/ReactiveCommonsHealthIndicator.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
@Log4j2
1414
@AllArgsConstructor
1515
public class ReactiveCommonsHealthIndicator extends AbstractReactiveHealthIndicator {
16+
public static final String DOMAIN = "domain";
17+
public static final String VERSION = "version";
1618
private final ConnectionManager manager;
1719

1820
@Override
@@ -26,8 +28,8 @@ protected Mono<Health> doHealthCheck(Health.Builder builder) {
2628
}
2729

2830
private Health.Builder reduceHealth(Health.Builder builder, Health status) {
29-
String domain = status.getDetails().get("domain").toString();
30-
if (!status.getStatus().equals(Status.DOWN)) {
31+
String domain = status.getDetails().get(DOMAIN).toString();
32+
if (status.getStatus().equals(Status.DOWN)) {
3133
log.error("Broker of domain {} is down", domain);
3234
return builder.down().withDetail(domain, status.getDetails());
3335
}

starters/async-commons-starter/src/main/java/org/reactivecommons/async/starter/props/GenericAsyncPropsDomainProperties.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import lombok.Getter;
44
import lombok.Setter;
5+
import lombok.SneakyThrows;
56

67
import java.util.HashMap;
78
import java.util.Map;
@@ -38,8 +39,9 @@ public AsyncPropsDomainPropertiesBuilder<T, P, X> withDomain(String domain, T pr
3839
return this;
3940
}
4041

42+
@SneakyThrows
4143
public X build() {
42-
return returnType.cast(new GenericAsyncPropsDomainProperties<>(domains));
44+
return returnType.getDeclaredConstructor(Map.class).newInstance(domains);
4345
}
4446
}
4547
}
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,34 @@
11
package org.reactivecommons.async.starter.senders;
22

33
import io.cloudevents.CloudEvent;
4-
import lombok.AllArgsConstructor;
4+
import lombok.RequiredArgsConstructor;
55
import org.reactivecommons.api.domain.DomainEvent;
66
import org.reactivecommons.api.domain.DomainEventBus;
7+
import org.reactivecommons.async.starter.exceptions.InvalidConfigurationException;
78
import org.reactivestreams.Publisher;
9+
import reactor.core.publisher.Mono;
810

911
import java.util.concurrent.ConcurrentMap;
1012

1113
import static org.reactivecommons.async.api.HandlerRegistry.DEFAULT_DOMAIN;
1214

13-
@AllArgsConstructor
15+
@RequiredArgsConstructor
1416
public class GenericDomainEventBus implements DomainEventBus {
1517
private final ConcurrentMap<String, DomainEventBus> domainEventBuses;
1618

19+
1720
@Override
1821
public <T> Publisher<Void> emit(DomainEvent<T> event) {
1922
return emit(DEFAULT_DOMAIN, event);
2023
}
2124

2225
@Override
2326
public <T> Publisher<Void> emit(String domain, DomainEvent<T> event) {
24-
return domainEventBuses.get(domain).emit(event);
27+
DomainEventBus domainEventBus = domainEventBuses.get(domain);
28+
if (domainEventBus == null) {
29+
return Mono.error(() -> new InvalidConfigurationException("Domain not found: " + domain));
30+
}
31+
return domainEventBus.emit(event);
2532
}
2633

2734
@Override
@@ -31,6 +38,10 @@ public Publisher<Void> emit(CloudEvent event) {
3138

3239
@Override
3340
public Publisher<Void> emit(String domain, CloudEvent event) {
34-
return domainEventBuses.get(domain).emit(event);
41+
DomainEventBus domainEventBus = domainEventBuses.get(domain);
42+
if (domainEventBus == null) {
43+
return Mono.error(() -> new InvalidConfigurationException("Domain not found: " + domain));
44+
}
45+
return domainEventBus.emit(event);
3546
}
3647
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package org.reactivecommons.async.starter.config;
2+
3+
4+
import org.junit.jupiter.api.Test;
5+
import org.mockito.Spy;
6+
import org.reactivecommons.async.starter.impl.mybroker.MyBrokerConfig;
7+
import org.springframework.beans.factory.annotation.Autowired;
8+
import org.springframework.boot.test.context.SpringBootTest;
9+
import org.springframework.context.ApplicationContext;
10+
11+
import static org.junit.jupiter.api.Assertions.assertNotNull;
12+
13+
@SpringBootTest(classes = {
14+
MyBrokerConfig.class,
15+
ReactiveCommonsConfig.class
16+
})
17+
class ReactiveCommonsConfigTest {
18+
@Spy
19+
@Autowired
20+
private ApplicationContext context;
21+
22+
@Test
23+
void shouldCreateConnectionManager() {
24+
// Arrange
25+
// Act
26+
ConnectionManager manager = context.getBean(ConnectionManager.class);
27+
// Assert
28+
assertNotNull(manager);
29+
}
30+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
package org.reactivecommons.async.starter.config.health;
2+
3+
import org.junit.jupiter.api.BeforeEach;
4+
import org.junit.jupiter.api.Test;
5+
import org.junit.jupiter.api.extension.ExtendWith;
6+
import org.mockito.Mock;
7+
import org.mockito.junit.jupiter.MockitoExtension;
8+
import org.reactivecommons.async.starter.broker.BrokerProvider;
9+
import org.reactivecommons.async.starter.config.ConnectionManager;
10+
import org.springframework.boot.actuate.health.Health;
11+
import reactor.core.publisher.Mono;
12+
import reactor.test.StepVerifier;
13+
14+
import static org.mockito.Mockito.when;
15+
import static org.reactivecommons.async.api.HandlerRegistry.DEFAULT_DOMAIN;
16+
import static org.reactivecommons.async.starter.config.health.ReactiveCommonsHealthIndicator.DOMAIN;
17+
import static org.reactivecommons.async.starter.config.health.ReactiveCommonsHealthIndicator.VERSION;
18+
19+
@ExtendWith(MockitoExtension.class)
20+
class ReactiveCommonsHealthIndicatorTest {
21+
public static final String OTHER = "other";
22+
@Mock
23+
private BrokerProvider<?> brokerProvider;
24+
@Mock
25+
private BrokerProvider<?> brokerProvider2;
26+
private ReactiveCommonsHealthIndicator healthIndicator;
27+
28+
@BeforeEach
29+
void setUp() {
30+
ConnectionManager connectionManager = new ConnectionManager();
31+
connectionManager.addDomain(DEFAULT_DOMAIN, brokerProvider);
32+
connectionManager.addDomain(OTHER, brokerProvider2);
33+
ReactiveCommonsHealthConfig healthConfig = new ReactiveCommonsHealthConfig();
34+
healthIndicator = healthConfig.reactiveCommonsHealthIndicator(connectionManager);
35+
}
36+
37+
@Test
38+
void shouldBeUp() {
39+
// Arrange
40+
when(brokerProvider.healthCheck()).thenReturn(Mono.just(Health.up()
41+
.withDetail(DOMAIN, DEFAULT_DOMAIN)
42+
.withDetail(VERSION, "123")
43+
.build()));
44+
when(brokerProvider2.healthCheck()).thenReturn(Mono.just(Health.up()
45+
.withDetail(DOMAIN, OTHER)
46+
.withDetail(VERSION, "1234")
47+
.build()));
48+
// Act
49+
Mono<Health> flow = healthIndicator.health();
50+
// Assert
51+
StepVerifier.create(flow)
52+
.expectNextMatches(health -> health.getStatus().toString().equals("UP"))
53+
.verifyComplete();
54+
}
55+
56+
@Test
57+
void shouldBeDown() {
58+
// Arrange
59+
when(brokerProvider.healthCheck()).thenReturn(Mono.just(Health.up()
60+
.withDetail(DOMAIN, DEFAULT_DOMAIN)
61+
.withDetail(VERSION, "123")
62+
.build()));
63+
when(brokerProvider2.healthCheck()).thenReturn(Mono.just(Health.down()
64+
.withDetail(DOMAIN, OTHER)
65+
.withDetail(VERSION, "1234")
66+
.build()));
67+
// Act
68+
Mono<Health> flow = healthIndicator.health();
69+
// Assert
70+
StepVerifier.create(flow)
71+
.expectNextMatches(health -> health.getStatus().toString().equals("DOWN"))
72+
.verifyComplete();
73+
}
74+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package org.reactivecommons.async.starter.impl.mybroker;
2+
3+
import org.reactivecommons.async.starter.mybroker.MyBrokerProviderFactory;
4+
import org.reactivecommons.async.starter.mybroker.MyBrokerSecretFiller;
5+
import org.reactivecommons.async.starter.mybroker.props.AsyncMyBrokerPropsDomainProperties;
6+
import org.reactivecommons.async.starter.mybroker.props.MyBrokerAsyncPropsDomain;
7+
import org.reactivecommons.async.starter.mybroker.props.MyBrokerConnProps;
8+
import org.springframework.boot.context.properties.EnableConfigurationProperties;
9+
import org.springframework.context.annotation.Bean;
10+
import org.springframework.context.annotation.Import;
11+
12+
@EnableConfigurationProperties(AsyncMyBrokerPropsDomainProperties.class)
13+
@Import({MyBrokerAsyncPropsDomain.class, MyBrokerProviderFactory.class})
14+
public class MyBrokerConfig {
15+
16+
@Bean
17+
public MyBrokerConnProps defaultMyBrokerConnProps() {
18+
MyBrokerConnProps myBrokerConnProps = new MyBrokerConnProps();
19+
myBrokerConnProps.setHost("localhost");
20+
myBrokerConnProps.setPort("1234");
21+
return myBrokerConnProps;
22+
}
23+
24+
@Bean
25+
public MyBrokerSecretFiller defaultMyBrokerSecretFiller() {
26+
return (domain, props) -> {
27+
};
28+
}
29+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package org.reactivecommons.async.starter.mybroker;
2+
3+
import lombok.AllArgsConstructor;
4+
import org.reactivecommons.api.domain.DomainEventBus;
5+
import org.reactivecommons.async.api.DirectAsyncGateway;
6+
import org.reactivecommons.async.commons.HandlerResolver;
7+
import org.reactivecommons.async.starter.broker.BrokerProvider;
8+
import org.reactivecommons.async.starter.broker.DiscardProvider;
9+
import org.reactivecommons.async.starter.mybroker.props.MyBrokerAsyncProps;
10+
import org.springframework.boot.actuate.health.Health;
11+
import reactor.core.publisher.Mono;
12+
13+
@AllArgsConstructor
14+
public class MyBrokerProvider implements BrokerProvider<MyBrokerAsyncProps> {
15+
private final String domain;
16+
private final MyBrokerAsyncProps props;
17+
private final DiscardProvider discardProvider;
18+
19+
@Override
20+
public MyBrokerAsyncProps getProps() {
21+
return null;
22+
}
23+
24+
@Override
25+
public DomainEventBus getDomainBus() {
26+
return null;
27+
}
28+
29+
@Override
30+
public DirectAsyncGateway getDirectAsyncGateway(HandlerResolver resolver) {
31+
return null;
32+
}
33+
34+
@Override
35+
public void listenDomainEvents(HandlerResolver resolver) {
36+
37+
}
38+
39+
@Override
40+
public void listenNotificationEvents(HandlerResolver resolver) {
41+
42+
}
43+
44+
@Override
45+
public void listenCommands(HandlerResolver resolver) {
46+
47+
}
48+
49+
@Override
50+
public void listenQueries(HandlerResolver resolver) {
51+
52+
}
53+
54+
@Override
55+
public void listenReplies(HandlerResolver resolver) {
56+
57+
}
58+
59+
@Override
60+
public Mono<Health> healthCheck() {
61+
return null;
62+
}
63+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package org.reactivecommons.async.starter.mybroker;
2+
3+
import org.reactivecommons.async.starter.broker.BrokerProvider;
4+
import org.reactivecommons.async.starter.broker.BrokerProviderFactory;
5+
import org.reactivecommons.async.starter.broker.DiscardProvider;
6+
import org.reactivecommons.async.starter.mybroker.props.MyBrokerAsyncProps;
7+
import org.springframework.stereotype.Service;
8+
import reactor.core.publisher.Mono;
9+
10+
@Service("mybroker")
11+
public class MyBrokerProviderFactory implements BrokerProviderFactory<MyBrokerAsyncProps> {
12+
13+
@Override
14+
public String getBrokerType() {
15+
return "mybroker";
16+
}
17+
18+
@Override
19+
public DiscardProvider getDiscardProvider(MyBrokerAsyncProps props) {
20+
return () -> message -> Mono.empty();
21+
}
22+
23+
@Override
24+
public BrokerProvider<MyBrokerAsyncProps> getProvider(String domain, MyBrokerAsyncProps props, DiscardProvider discardProvider) {
25+
return new MyBrokerProvider(domain, props, discardProvider);
26+
}
27+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package org.reactivecommons.async.starter.mybroker;
2+
3+
import org.reactivecommons.async.starter.props.GenericAsyncPropsDomain;
4+
import org.reactivecommons.async.starter.mybroker.props.MyBrokerConnProps;
5+
6+
public interface MyBrokerSecretFiller extends GenericAsyncPropsDomain.SecretFiller<MyBrokerConnProps> {
7+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package org.reactivecommons.async.starter.mybroker.props;
2+
3+
import org.reactivecommons.async.starter.props.GenericAsyncPropsDomainProperties;
4+
import org.springframework.boot.context.properties.ConfigurationProperties;
5+
6+
import java.util.Map;
7+
8+
@ConfigurationProperties(prefix = "my.broker")
9+
public class AsyncMyBrokerPropsDomainProperties
10+
extends GenericAsyncPropsDomainProperties<MyBrokerAsyncProps, MyBrokerConnProps> {
11+
12+
public AsyncMyBrokerPropsDomainProperties() {
13+
}
14+
15+
public AsyncMyBrokerPropsDomainProperties(Map<String, ? extends MyBrokerAsyncProps> m) {
16+
super(m);
17+
}
18+
19+
public static AsyncPropsDomainPropertiesBuilder<MyBrokerAsyncProps, MyBrokerConnProps,
20+
AsyncMyBrokerPropsDomainProperties> builder() {
21+
return GenericAsyncPropsDomainProperties.builder(AsyncMyBrokerPropsDomainProperties.class);
22+
}
23+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package org.reactivecommons.async.starter.mybroker.props;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Builder;
5+
import lombok.Getter;
6+
import lombok.NoArgsConstructor;
7+
import lombok.Setter;
8+
import lombok.experimental.SuperBuilder;
9+
import org.reactivecommons.async.starter.props.GenericAsyncProps;
10+
11+
@Getter
12+
@Setter
13+
@AllArgsConstructor
14+
@NoArgsConstructor
15+
@SuperBuilder
16+
public class MyBrokerAsyncProps extends GenericAsyncProps<MyBrokerConnProps> {
17+
private MyBrokerConnProps connectionProperties;
18+
@Builder.Default
19+
private String brokerType = "mybroker";
20+
private boolean enabled;
21+
private boolean useDiscardNotifierPerDomain;
22+
}

0 commit comments

Comments
 (0)