Skip to content

Commit 81f7208

Browse files
committed
Micronaut: Add Transfer operation impl
1 parent dd2b573 commit 81f7208

File tree

8 files changed

+61
-3
lines changed

8 files changed

+61
-3
lines changed

micronaut-app/build.gradle

+2
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ dependencies {
3232
testImplementation("org.testcontainers:junit-jupiter")
3333
testImplementation("org.testcontainers:postgresql")
3434
testImplementation("org.testcontainers:testcontainers")
35+
testImplementation project(":common-wiremock")
36+
testImplementation("com.github.tomakehurst:wiremock:2.27.2")
3537
implementation("io.micronaut:micronaut-validation")
3638
}
3739

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package bitxon.micronaut.client.exchange;
2+
3+
import bitxon.api.thirdparty.exchange.model.ExchangeRate;
4+
import io.micronaut.http.annotation.Get;
5+
import io.micronaut.http.annotation.QueryValue;
6+
import io.micronaut.http.client.annotation.Client;
7+
8+
@Client("exchange-client")
9+
public interface ExchangeClient {
10+
11+
@Get("/exchanges{?currency}")
12+
ExchangeRate getExchangeRate(@QueryValue String currency);
13+
}

micronaut-app/src/main/java/bitxon/micronaut/controller/AccountController.java

+4-2
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
import bitxon.api.model.Account;
1212
import bitxon.api.model.MoneyTransfer;
13+
import bitxon.micronaut.client.exchange.ExchangeClient;
1314
import bitxon.micronaut.db.AccountDao;
1415
import bitxon.micronaut.mapper.AccountMapper;
1516
import io.micronaut.core.annotation.Nullable;
@@ -34,6 +35,7 @@ public class AccountController {
3435

3536
private final AccountDao dao;
3637
private final AccountMapper mapper;
38+
private final ExchangeClient exchangeClient;
3739

3840
@Get
3941
@ReadOnly
@@ -72,8 +74,8 @@ public void create(@Body @Valid MoneyTransfer transfer,
7274
var recipient = dao.findById(transfer.getRecipientId())
7375
.orElseThrow(() -> new RuntimeException("Recipient not found"));
7476

75-
var exchangeRateValue = 1.0d;
76-
//exchangeClient.getExchangeRate(sender.getCurrency()).getRates().getOrDefault(recipient.getCurrency(), 1.0);
77+
var exchangeRateValue = exchangeClient.getExchangeRate(sender.getCurrency())
78+
.getRates().getOrDefault(recipient.getCurrency(), 1.0);
7779

7880
sender.setMoneyAmount(sender.getMoneyAmount() - transfer.getMoneyAmount());
7981
dao.save(sender);

micronaut-app/src/main/resources/application.yml

+5
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,11 @@ micronaut:
33
name: micronaut-app
44
server:
55
port: 8080
6+
http:
7+
services:
8+
exchange-client:
9+
url: "http://localhost:8888"
10+
read-timeout: 1m
611
endpoints:
712
all:
813
port: 8081

micronaut-app/src/test/java/bitxon/micronaut/AbstractMicronautTest.java

+26-1
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,34 @@
11
package bitxon.micronaut;
22

3+
import java.util.Map;
4+
5+
import com.github.tomakehurst.wiremock.WireMockServer;
6+
import com.github.tomakehurst.wiremock.client.WireMock;
7+
import com.github.tomakehurst.wiremock.core.WireMockConfiguration;
38
import io.micronaut.http.client.HttpClient;
49
import io.micronaut.http.client.annotation.Client;
510
import io.micronaut.runtime.EmbeddedApplication;
611
import io.micronaut.test.extensions.junit5.annotation.MicronautTest;
12+
import io.micronaut.test.support.TestPropertyProvider;
713
import jakarta.inject.Inject;
14+
import org.junit.jupiter.api.TestInstance;
815
import org.testcontainers.junit.jupiter.Testcontainers;
916

1017
@Testcontainers
1118
@MicronautTest // default environments is 'test'
12-
class AbstractMicronautTest {
19+
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
20+
class AbstractMicronautTest implements TestPropertyProvider {
21+
22+
private static final WireMockServer WIREMOCK;
23+
24+
static {
25+
WIREMOCK = new WireMockServer(WireMockConfiguration.options()
26+
.usingFilesUnderClasspath("stubs") // Loading stubs from common-wiremock
27+
.dynamicPort()
28+
);
29+
WIREMOCK.start();
30+
WireMock.configureFor(WIREMOCK.port());
31+
}
1332

1433
@Inject
1534
private EmbeddedApplication<?> application;
@@ -21,4 +40,10 @@ protected HttpClient client() {
2140
return client;
2241
}
2342

43+
@Override
44+
public Map<String, String> getProperties() {
45+
return Map.of(
46+
"micronaut.http.services.exchange-client.url", WIREMOCK.baseUrl()
47+
);
48+
}
2449
}

micronaut-app/src/test/java/bitxon/micronaut/MoneyTransferMicronautTest.java

+3
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,16 @@
77

88
import bitxon.api.model.Account;
99
import bitxon.api.model.MoneyTransfer;
10+
import com.github.tomakehurst.wiremock.client.WireMock;
1011
import io.micronaut.http.HttpRequest;
1112
import io.micronaut.http.HttpResponse;
1213
import io.micronaut.http.HttpStatus;
1314
import io.micronaut.http.client.exceptions.HttpClientResponseException;
15+
import io.micronaut.test.extensions.junit5.annotation.MicronautTest;
1416
import org.junit.jupiter.api.Test;
1517

1618

19+
@MicronautTest(rebuildContext = true)
1720
class MoneyTransferMicronautTest extends AbstractMicronautTest {
1821

1922
@Test

micronaut-app/src/test/resources/application-test.yml

+7
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,10 @@
1+
micronaut:
2+
http:
3+
services:
4+
exchange-client:
5+
url: 'will-be-replaced-in-test'
6+
read-timeout: 1m
7+
18
datasources:
29
default:
310
url: jdbc:tc:postgresql:14.4:///postgres?TC_INITSCRIPT=file:src/test/resources/sql/db-test-data.sql

spring-app/src/main/resources/application.yml

+1
Original file line numberDiff line numberDiff line change
@@ -20,3 +20,4 @@ logging:
2020
level:
2121
root: INFO
2222
bitxon.dropwizard: DEBUG
23+
org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver: ERROR

0 commit comments

Comments
 (0)