Skip to content

Commit bc6216f

Browse files
authored
Feature/enable tests api layer (#3)
* Enable tests on the API layer. Fixing the first set of issues after the build pipeline migration. * Fix all the broken tests in the API layer. * Update build script to include the xml code coverage results.
1 parent 215e460 commit bc6216f

File tree

92 files changed

+984
-1012
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

92 files changed

+984
-1012
lines changed

.github/workflows/component-build.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ jobs:
2424
path: |
2525
**/build/classes/**
2626
**/build/libs/*.jar
27-
**/build/jacoco/*.exec
27+
**/build/reports/jacoco/test/*.xml
2828
- name: Upload test results
2929
uses: actions/upload-artifact@v4
3030
with:

fintrack-api/build.gradle.kts

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,32 @@
11
plugins {
22
id("io.micronaut.application")
3-
id("io.freefair.lombok")
43
}
5-
//mainClassName = "com.jongsoft.finance.Application"
64

5+
application {
6+
mainClass.set("com.jongsoft.finance.Application")
7+
}
78

8-
//jar {
9-
// manifest {
10-
// attributes('Main-Class': 'com.jongsoft.finance.Application')
11-
// }
12-
//}
9+
micronaut {
10+
runtime("jetty")
11+
testRuntime("junit5")
12+
}
1313

1414
dependencies {
15-
annotationProcessor("io.micronaut.openapi:micronaut-openapi")
15+
annotationProcessor(mn.micronaut.openapi.asProvider())
16+
annotationProcessor(mn.micronaut.http.validation)
17+
annotationProcessor(mn.micronaut.validation.processor)
18+
annotationProcessor(mn.micronaut.inject.java)
1619

1720
implementation(libs.camunda)
1821
implementation(mn.swagger.annotations)
22+
23+
implementation(mn.micronaut.validation)
1924
implementation(mn.micronaut.security.annotations)
2025
implementation(mn.micronaut.security.jwt)
2126
implementation(mn.micronaut.http.server.jetty)
27+
implementation(mn.micronaut.http.validation)
2228

23-
implementation(mn.micronaut.hibernate.validator)
24-
25-
implementation("at.favre.lib:bcrypt:0.9.0")
29+
implementation(libs.bcrypt)
2630
implementation(libs.bouncy)
2731
implementation(libs.bcpkix)
2832
implementation(libs.otp)
@@ -36,6 +40,7 @@ dependencies {
3640

3741
// Investigate if this can be swapped for micronaut serde
3842
implementation(mn.micronaut.jackson.databind)
43+
implementation(mn.micronaut.serde.jackson)
3944

4045
implementation(project(":core"))
4146
implementation(project(":domain"))

fintrack-api/src/main/java/com/jongsoft/finance/factory/EventBusFactory.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,14 @@
44
import io.micronaut.context.annotation.Context;
55
import io.micronaut.context.annotation.Factory;
66
import io.micronaut.context.event.ApplicationEventPublisher;
7-
import lombok.extern.slf4j.Slf4j;
7+
import org.slf4j.Logger;
8+
import org.slf4j.LoggerFactory;
89

9-
@Slf4j
1010
@Factory
1111
public class EventBusFactory {
1212

13+
private final Logger log = LoggerFactory.getLogger(EventBusFactory.class);
14+
1315
@Context
1416
public EventBus eventBus(ApplicationEventPublisher eventPublisher) {
1517
log.info("Staring the event bus");

fintrack-api/src/main/java/com/jongsoft/finance/filter/AuthenticationFilter.java

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,23 +11,27 @@
1111
import io.micronaut.http.filter.ServerFilterChain;
1212
import io.micronaut.http.filter.ServerFilterPhase;
1313
import io.micronaut.serde.ObjectMapper;
14-
import jakarta.inject.Inject;
15-
import lombok.RequiredArgsConstructor;
16-
import lombok.extern.slf4j.Slf4j;
1714
import org.reactivestreams.Publisher;
15+
import org.slf4j.Logger;
16+
import org.slf4j.LoggerFactory;
1817

1918
import java.security.Principal;
2019
import java.time.Duration;
2120
import java.time.Instant;
2221

23-
@Slf4j
2422
@Filter("/**")
25-
@RequiredArgsConstructor(onConstructor_ = @Inject)
2623
public class AuthenticationFilter implements HttpServerFilter {
2724

25+
private final Logger log = LoggerFactory.getLogger(AuthenticationFilter.class);
26+
2827
private final ApplicationEventPublisher<InternalAuthenticationEvent> eventPublisher;
2928
private final ObjectMapper objectMapper;
3029

30+
public AuthenticationFilter(ApplicationEventPublisher<InternalAuthenticationEvent> eventPublisher, ObjectMapper objectMapper) {
31+
this.eventPublisher = eventPublisher;
32+
this.objectMapper = objectMapper;
33+
}
34+
3135
@Override
3236
public int getOrder() {
3337
return ServerFilterPhase.SECURITY.after();

fintrack-api/src/main/java/com/jongsoft/finance/filter/CurrencyHeaderFilter.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,17 @@
66
import io.micronaut.http.annotation.Filter;
77
import io.micronaut.http.filter.HttpServerFilter;
88
import io.micronaut.http.filter.ServerFilterChain;
9-
import jakarta.inject.Inject;
10-
import lombok.RequiredArgsConstructor;
119
import org.reactivestreams.Publisher;
1210

1311
@Filter("/**")
14-
@RequiredArgsConstructor(onConstructor_ = @Inject)
1512
public class CurrencyHeaderFilter implements HttpServerFilter {
1613

1714
private final CurrencyProvider currencyProvider;
1815

16+
public CurrencyHeaderFilter(CurrencyProvider currencyProvider) {
17+
this.currencyProvider = currencyProvider;
18+
}
19+
1920
@Override
2021
public Publisher<MutableHttpResponse<?>> doFilter(final HttpRequest<?> request, final ServerFilterChain chain) {
2122
var requestedCurrency = request.getHeaders().get("X-Accept-Currency", String.class);

fintrack-api/src/main/java/com/jongsoft/finance/filter/LocaleHeaderFilter.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,17 @@
55
import io.micronaut.http.annotation.Filter;
66
import io.micronaut.http.filter.HttpServerFilter;
77
import io.micronaut.http.filter.ServerFilterChain;
8-
import lombok.extern.slf4j.Slf4j;
98
import org.reactivestreams.Publisher;
9+
import org.slf4j.Logger;
10+
import org.slf4j.LoggerFactory;
1011

1112
import java.util.Locale;
1213

13-
@Slf4j
1414
@Filter("/**")
1515
public class LocaleHeaderFilter implements HttpServerFilter {
1616

17+
private final Logger log = LoggerFactory.getLogger(LocaleHeaderFilter.class);
18+
1719
@Override
1820
public Publisher<MutableHttpResponse<?>> doFilter(HttpRequest<?> request, ServerFilterChain chain) {
1921
log.debug("Filtering for locale {}", request.getHeaders().get("Accept-Language"));

fintrack-api/src/main/java/com/jongsoft/finance/filter/StatusExceptionHandler.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,15 @@
99
import io.micronaut.http.hateoas.Link;
1010
import io.micronaut.http.server.exceptions.ExceptionHandler;
1111
import jakarta.inject.Singleton;
12-
import lombok.extern.slf4j.Slf4j;
12+
import org.slf4j.Logger;
13+
import org.slf4j.LoggerFactory;
1314

14-
@Slf4j
1515
@Produces
1616
@Singleton
1717
public class StatusExceptionHandler implements ExceptionHandler<StatusException, HttpResponse<JsonError>> {
1818

19+
private final Logger log = LoggerFactory.getLogger(StatusExceptionHandler.class);
20+
1921
@Override
2022
public HttpResponse<JsonError> handle(HttpRequest request, StatusException exception) {
2123
if (exception.getStatusCode() != 404) {

fintrack-api/src/main/java/com/jongsoft/finance/rest/StaticResource.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,17 +13,18 @@
1313
import io.micronaut.security.rules.SecurityRule;
1414
import io.swagger.v3.oas.annotations.Operation;
1515
import jakarta.inject.Inject;
16-
import lombok.extern.slf4j.Slf4j;
16+
import org.slf4j.Logger;
17+
import org.slf4j.LoggerFactory;
1718

1819
import java.io.IOException;
1920
import java.net.URI;
2021
import java.net.URISyntaxException;
2122
import java.net.URL;
2223

23-
@Slf4j
2424
@Controller
2525
@Secured(SecurityRule.IS_ANONYMOUS)
2626
public class StaticResource {
27+
private final Logger log = LoggerFactory.getLogger(StaticResource.class);
2728

2829
@Inject
2930
ResourceResolver res;
@@ -42,7 +43,7 @@ public HttpResponse<?> favicon() {
4243
@Operation(hidden = true)
4344
@Get("/ui/{path:([^\\.]+)$}")
4445
@Produces(MediaType.TEXT_HTML)
45-
public HttpResponse<?> refresh() {
46+
public HttpResponse<?> refresh(@PathVariable String path) {
4647
return resource("index.html");
4748
}
4849

fintrack-api/src/main/java/com/jongsoft/finance/rest/account/AccountEditRequest.java

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,7 @@
33
import com.jongsoft.finance.schedule.Periodicity;
44
import io.micronaut.serde.annotation.Serdeable;
55
import jakarta.validation.constraints.*;
6-
import lombok.Builder;
76

8-
@Builder
97
@Serdeable
108
class AccountEditRequest {
119

@@ -34,6 +32,18 @@ class AccountEditRequest {
3432
@NotNull
3533
private String type;
3634

35+
public AccountEditRequest(String name, String description,String currency, String iban, String bic, String number, double interest, Periodicity interestPeriodicity, String type) {
36+
this.name = name;
37+
this.description = description;
38+
this.currency = currency;
39+
this.iban = iban;
40+
this.bic = bic;
41+
this.number = number;
42+
this.interest = interest;
43+
this.interestPeriodicity = interestPeriodicity;
44+
this.type = type;
45+
}
46+
3747
public String getName() {
3848
return name;
3949
}

fintrack-api/src/main/java/com/jongsoft/finance/rest/account/AccountEditResource.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,22 +17,22 @@
1717
import io.swagger.v3.oas.annotations.media.Schema;
1818
import io.swagger.v3.oas.annotations.responses.ApiResponse;
1919
import io.swagger.v3.oas.annotations.tags.Tag;
20-
import jakarta.inject.Inject;
2120
import jakarta.validation.Valid;
2221
import jakarta.validation.constraints.Positive;
23-
import lombok.RequiredArgsConstructor;
2422

2523
import java.math.BigDecimal;
2624

2725
@Controller("/api/accounts/{accountId}")
2826
@Tag(name = "Account information")
2927
@Secured(SecurityRule.IS_AUTHENTICATED)
30-
@RequiredArgsConstructor(onConstructor_ = @Inject)
3128
public class AccountEditResource {
3229

33-
private final CurrentUserProvider currentUserProvider;
3430
private final AccountProvider accountProvider;
3531

32+
public AccountEditResource(AccountProvider accountProvider) {
33+
this.accountProvider = accountProvider;
34+
}
35+
3636
@Get
3737
@Operation(
3838
summary = "Get Account",
@@ -155,9 +155,9 @@ AccountResponse createSavingGoal(
155155
accountProvider.lookup(accountId)
156156
.ifPresent(account ->
157157
account.createSavingGoal(
158-
request.getName(),
159-
request.getGoal(),
160-
request.getTargetDate()))
158+
request.name(),
159+
request.goal(),
160+
request.targetDate()))
161161
.elseThrow(() -> StatusException.notFound("No account found for id " + accountId));
162162

163163
return accountProvider.lookup(accountId)
@@ -181,7 +181,7 @@ AccountResponse adjustSavingGoal(
181181
account.getSavingGoals()
182182
.filter(goal -> goal.getId() == savingId)
183183
.head()
184-
.adjustGoal(request.getGoal(), request.getTargetDate()))
184+
.adjustGoal(request.goal(), request.targetDate()))
185185
.elseThrow(() -> StatusException.notFound("No account found for id " + accountId));
186186

187187
return accountProvider.lookup(accountId)

0 commit comments

Comments
 (0)