Skip to content

Commit a4e883c

Browse files
committed
web layer test coverage 100%
1 parent 8efcce8 commit a4e883c

20 files changed

Lines changed: 780 additions & 12 deletions

web/src/main/java/hu/bsstudio/speed/StartTimerHandler.java renamed to web/src/main/java/hu/bsstudio/speed/StartSpeedTimerHandler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
import reactor.core.publisher.Mono;
1010

1111
@RequiredArgsConstructor
12-
public class StartTimerHandler implements HandlerFunction<ServerResponse> {
12+
public class StartSpeedTimerHandler implements HandlerFunction<ServerResponse> {
1313

1414
private final SpeedTimerService service;
1515

web/src/main/java/hu/bsstudio/speed/StopTimerHandler.java renamed to web/src/main/java/hu/bsstudio/speed/StopSpeedTimerHandler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
import reactor.core.publisher.Mono;
1010

1111
@RequiredArgsConstructor
12-
public class StopTimerHandler implements HandlerFunction<ServerResponse> {
12+
public class StopSpeedTimerHandler implements HandlerFunction<ServerResponse> {
1313

1414
private final SpeedTimerService service;
1515

web/src/main/java/hu/bsstudio/speed/configuration/SpeedRaceRouterConfiguration.java

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
import hu.bsstudio.security.RobonAuthFilter;
66
import hu.bsstudio.speed.SpeedRaceLapHandler;
77
import hu.bsstudio.speed.SpeedRaceResultHandler;
8-
import hu.bsstudio.speed.StartTimerHandler;
9-
import hu.bsstudio.speed.StopTimerHandler;
8+
import hu.bsstudio.speed.StartSpeedTimerHandler;
9+
import hu.bsstudio.speed.StopSpeedTimerHandler;
1010
import org.springframework.beans.factory.annotation.Autowired;
1111
import org.springframework.context.annotation.Bean;
1212
import org.springframework.context.annotation.Configuration;
@@ -27,27 +27,27 @@ public class SpeedRaceRouterConfiguration {
2727
private SpeedRaceService speedRaceService;
2828

2929
@Bean
30-
public RouterFunction<ServerResponse> speedRaceRouterFunction(final StartTimerHandler startTimerHandler,
31-
final StopTimerHandler stopTimerHandler,
30+
public RouterFunction<ServerResponse> speedRaceRouterFunction(final StartSpeedTimerHandler startSpeedTimerHandler,
31+
final StopSpeedTimerHandler stopSpeedTimerHandler,
3232
final SpeedRaceLapHandler speedRaceLapHandler,
3333
final SpeedRaceResultHandler speedRaceResultHandler) {
3434
return RouterFunctions.route()
3535
.filter(robonAuthFilter)
36-
.POST("/api/speed/timer/start", startTimerHandler)
37-
.POST("/api/speed/timer/stop", stopTimerHandler)
36+
.POST("/api/speed/timer/start", startSpeedTimerHandler)
37+
.POST("/api/speed/timer/stop", stopSpeedTimerHandler)
3838
.POST("/api/speed/lap", speedRaceLapHandler)
3939
.POST("/api/speed/result", speedRaceResultHandler)
4040
.build();
4141
}
4242

4343
@Bean
44-
public StartTimerHandler startTimerHandler() {
45-
return new StartTimerHandler(speedTimerService);
44+
public StartSpeedTimerHandler startSpeedTimerHandler() {
45+
return new StartSpeedTimerHandler(speedTimerService);
4646
}
4747

4848
@Bean
49-
public StopTimerHandler stopTimerHandler() {
50-
return new StopTimerHandler(speedTimerService);
49+
public StopSpeedTimerHandler stopSpeedTimerHandler() {
50+
return new StopSpeedTimerHandler(speedTimerService);
5151
}
5252

5353
@Bean
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package hu.bsstudio.safetycar;
2+
3+
import static org.mockito.Mockito.when;
4+
import static org.mockito.MockitoAnnotations.initMocks;
5+
6+
import hu.bsstudio.safetycar.model.SafetyCarFollowInformation;
7+
import hu.bsstudio.team.model.DetailedTeam;
8+
import org.junit.jupiter.api.BeforeEach;
9+
import org.junit.jupiter.api.Test;
10+
import org.mockito.Mock;
11+
import org.springframework.test.web.reactive.server.WebTestClient;
12+
import org.springframework.web.reactive.function.server.RouterFunctions;
13+
import reactor.core.publisher.Mono;
14+
15+
final class SafetyCarFollowHandlerTest {
16+
17+
@Mock
18+
private SafetyCarService mockService;
19+
20+
private WebTestClient webTestClient;
21+
22+
@BeforeEach
23+
void setUp() {
24+
initMocks(this);
25+
final var underTest = new SafetyCarFollowHandler(mockService);
26+
final var routerFunction = RouterFunctions.route()
27+
.POST("/test", underTest).build();
28+
this.webTestClient = WebTestClient.bindToRouterFunction(routerFunction).build();
29+
}
30+
31+
@Test
32+
void shouldReturnDetailedTeamWithOkStatus() {
33+
final var safetyCarFollowInformation = new SafetyCarFollowInformation(0, true);
34+
final var detailedTeam = DetailedTeam.builder().build();
35+
when(mockService.safetyCarWasFollowed(safetyCarFollowInformation))
36+
.thenReturn(Mono.just(detailedTeam));
37+
38+
webTestClient.post().uri("/test").bodyValue(safetyCarFollowInformation).exchange()
39+
.expectStatus().isOk()
40+
.expectBody(DetailedTeam.class).isEqualTo(detailedTeam);
41+
}
42+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package hu.bsstudio.safetycar;
2+
3+
import static org.mockito.Mockito.when;
4+
import static org.mockito.MockitoAnnotations.initMocks;
5+
6+
import hu.bsstudio.safetycar.model.SafetyCarOvertakeInformation;
7+
import hu.bsstudio.team.model.DetailedTeam;
8+
import org.junit.jupiter.api.BeforeEach;
9+
import org.junit.jupiter.api.Test;
10+
import org.mockito.Mock;
11+
import org.springframework.test.web.reactive.server.WebTestClient;
12+
import org.springframework.web.reactive.function.server.RouterFunctions;
13+
import reactor.core.publisher.Mono;
14+
15+
final class SafetyCarOvertakeHandlerTest {
16+
17+
@Mock
18+
private SafetyCarService mockService;
19+
20+
private WebTestClient webTestClient;
21+
22+
@BeforeEach
23+
void setUp() {
24+
initMocks(this);
25+
final var underTest = new SafetyCarOvertakeHandler(mockService);
26+
final var routerFunction = RouterFunctions.route()
27+
.POST("/test", underTest).build();
28+
this.webTestClient = WebTestClient.bindToRouterFunction(routerFunction).build();
29+
}
30+
31+
@Test
32+
void shouldReturnDetailedTeamWithOkStatus() {
33+
final var safetyCarOvertakeInformation = new SafetyCarOvertakeInformation(0, 0);
34+
final var detailedTeam = DetailedTeam.builder().build();
35+
when(mockService.safetyCarWasOvertaken(safetyCarOvertakeInformation))
36+
.thenReturn(Mono.just(detailedTeam));
37+
38+
webTestClient.post().uri("/test").bodyValue(safetyCarOvertakeInformation).exchange()
39+
.expectStatus().isOk()
40+
.expectBody(DetailedTeam.class).isEqualTo(detailedTeam);
41+
}
42+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package hu.bsstudio.scores;
2+
3+
import static org.mockito.Mockito.when;
4+
import static org.mockito.MockitoAnnotations.initMocks;
5+
6+
import hu.bsstudio.scores.audience.AudienceScoreService;
7+
import hu.bsstudio.scores.audience.model.AudienceScoredTeam;
8+
import hu.bsstudio.team.model.DetailedTeam;
9+
import java.util.List;
10+
import org.junit.jupiter.api.BeforeEach;
11+
import org.junit.jupiter.api.Test;
12+
import org.mockito.Mock;
13+
import org.springframework.core.ParameterizedTypeReference;
14+
import org.springframework.test.web.reactive.server.WebTestClient;
15+
import org.springframework.web.reactive.function.server.RouterFunctions;
16+
import reactor.core.publisher.Mono;
17+
18+
final class AudienceScoreHandlerTest {
19+
20+
@Mock
21+
private AudienceScoreService mockService;
22+
23+
private WebTestClient webTestClient;
24+
25+
@BeforeEach
26+
void setUp() {
27+
initMocks(this);
28+
final var underTest = new AudienceScoreHandler(mockService);
29+
final var routerFunction = RouterFunctions.route()
30+
.POST("/test", underTest).build();
31+
this.webTestClient = WebTestClient.bindToRouterFunction(routerFunction).build();
32+
}
33+
34+
@Test
35+
void shouldReturnDetailedTeamWithOkStatus() {
36+
final var audienceScoredTeam = new AudienceScoredTeam(0, 0, 0);
37+
final var detailedTeam = DetailedTeam.builder().build();
38+
when(mockService.updateAudienceScore(audienceScoredTeam))
39+
.thenReturn(Mono.just(detailedTeam));
40+
41+
webTestClient.post().uri("/test").bodyValue(List.of(audienceScoredTeam)).exchange()
42+
.expectStatus().isOk()
43+
.expectBody(new ParameterizedTypeReference<List<DetailedTeam>>() {}).isEqualTo(List.of(detailedTeam));
44+
}
45+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package hu.bsstudio.scores;
2+
3+
import static org.mockito.Mockito.when;
4+
import static org.mockito.MockitoAnnotations.initMocks;
5+
6+
import hu.bsstudio.scores.endresult.EndResultService;
7+
import hu.bsstudio.scores.endresult.model.EndResultedTeam;
8+
import hu.bsstudio.team.model.DetailedTeam;
9+
import java.util.List;
10+
import org.junit.jupiter.api.BeforeEach;
11+
import org.junit.jupiter.api.Test;
12+
import org.mockito.Mock;
13+
import org.springframework.core.ParameterizedTypeReference;
14+
import org.springframework.test.web.reactive.server.WebTestClient;
15+
import org.springframework.web.reactive.function.server.RouterFunctions;
16+
import reactor.core.publisher.Mono;
17+
18+
final class EndResultHandlerTest {
19+
20+
@Mock
21+
private EndResultService mockService;
22+
23+
private WebTestClient webTestClient;
24+
25+
@BeforeEach
26+
void setUp() {
27+
initMocks(this);
28+
final var underTest = new EndResultHandler(mockService);
29+
final var routerFunction = RouterFunctions.route()
30+
.POST("/test", underTest).build();
31+
this.webTestClient = WebTestClient.bindToRouterFunction(routerFunction).build();
32+
}
33+
34+
@Test
35+
void shouldReturnDetailedTeamWithOkStatus() {
36+
final var endResultedTeam = new EndResultedTeam(0, 0, 0, 0);
37+
final var detailedTeam = DetailedTeam.builder().build();
38+
when(mockService.updateEndResult(endResultedTeam))
39+
.thenReturn(Mono.just(detailedTeam));
40+
41+
webTestClient.post().uri("/test").bodyValue(endResultedTeam).exchange()
42+
.expectStatus().isOk()
43+
.expectBody(new ParameterizedTypeReference<List<DetailedTeam>>() {}).isEqualTo(List.of(detailedTeam));
44+
}
45+
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package hu.bsstudio.scores;
2+
3+
import static org.mockito.Mockito.when;
4+
import static org.mockito.MockitoAnnotations.initMocks;
5+
6+
import hu.bsstudio.scores.qualification.QualificationScoreService;
7+
import hu.bsstudio.scores.qualification.model.QualifiedTeam;
8+
import hu.bsstudio.team.model.DetailedTeam;
9+
import java.util.List;
10+
import org.junit.jupiter.api.BeforeEach;
11+
import org.junit.jupiter.api.Test;
12+
import org.mockito.Mock;
13+
import org.springframework.core.ParameterizedTypeReference;
14+
import org.springframework.test.web.reactive.server.WebTestClient;
15+
import org.springframework.web.reactive.function.server.RouterFunctions;
16+
import reactor.core.publisher.Mono;
17+
18+
final class QualificationScoreHandlerTest {
19+
20+
@Mock
21+
private QualificationScoreService mockService;
22+
23+
private WebTestClient webTestClient;
24+
25+
@BeforeEach
26+
void setUp() {
27+
initMocks(this);
28+
final var underTest = new QualificationScoreHandler(mockService);
29+
final var routerFunction = RouterFunctions.route()
30+
.POST("/test", underTest).build();
31+
this.webTestClient = WebTestClient.bindToRouterFunction(routerFunction).build();
32+
}
33+
34+
@Test
35+
void shouldReturnDetailedTeamWithOkStatus() {
36+
final var qualifiedTeam = new QualifiedTeam(0, 0);
37+
final var detailedTeam = DetailedTeam.builder().build();
38+
when(mockService.updateQualificationScore(qualifiedTeam))
39+
.thenReturn(Mono.just(detailedTeam));
40+
41+
webTestClient.post().uri("/test").bodyValue(qualifiedTeam).exchange()
42+
.expectStatus().isOk()
43+
.expectBody(new ParameterizedTypeReference<List<DetailedTeam>>() {
44+
}).isEqualTo(List.of(detailedTeam));
45+
}
46+
}
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
package hu.bsstudio.security;
2+
3+
import static org.hamcrest.MatcherAssert.assertThat;
4+
import static org.hamcrest.Matchers.equalTo;
5+
import static org.hamcrest.Matchers.is;
6+
import static org.mockito.Mockito.when;
7+
import static org.mockito.MockitoAnnotations.initMocks;
8+
9+
import java.util.Collections;
10+
import java.util.List;
11+
import org.junit.jupiter.api.BeforeEach;
12+
import org.junit.jupiter.api.Test;
13+
import org.mockito.Mock;
14+
import org.springframework.http.HttpStatus;
15+
import org.springframework.web.reactive.function.server.HandlerFunction;
16+
import org.springframework.web.reactive.function.server.ServerRequest;
17+
import org.springframework.web.reactive.function.server.ServerResponse;
18+
import reactor.core.publisher.Mono;
19+
import reactor.test.StepVerifier;
20+
21+
final class RobonAuthFilterTest {
22+
23+
private static final String APPLICATION_SECRET_HEADER = "RobonAuth-Api-Key";
24+
private static final String APPLICATION_SECRET = "applicationSecret";
25+
private static final String OTHER_APPLICATION_SECRET = "otherApplicationSecret";
26+
27+
@Mock
28+
private ServerRequest request;
29+
@Mock
30+
private HandlerFunction<ServerResponse> handlerFunction;
31+
@Mock
32+
private ServerResponse mockResponse;
33+
@Mock
34+
private ServerRequest.Headers headers;
35+
36+
private RobonAuthFilter underTest;
37+
38+
@BeforeEach
39+
void setUp() {
40+
initMocks(this);
41+
this.underTest = new RobonAuthFilter(APPLICATION_SECRET);
42+
}
43+
44+
@Test
45+
void shouldReturnUnauthorizedWhenApplicationSecretIsNotPresent() {
46+
when(request.headers()).thenReturn(headers);
47+
when(headers.header(APPLICATION_SECRET_HEADER)).thenReturn(Collections.emptyList());
48+
49+
final var response = underTest.filter(request, handlerFunction);
50+
51+
StepVerifier.create(response)
52+
.assertNext(serverResponse -> assertThat(serverResponse.statusCode(), is(equalTo(HttpStatus.UNAUTHORIZED))))
53+
.verifyComplete();
54+
}
55+
56+
@Test
57+
void shouldReturnUnauthorizedWhenApplicationSecretIsNotMatching() {
58+
when(request.headers()).thenReturn(headers);
59+
when(headers.header(APPLICATION_SECRET_HEADER)).thenReturn(List.of(OTHER_APPLICATION_SECRET));
60+
61+
final var response = underTest.filter(request, handlerFunction);
62+
63+
StepVerifier.create(response)
64+
.assertNext(serverResponse -> assertThat(serverResponse.statusCode(), is(equalTo(HttpStatus.UNAUTHORIZED))))
65+
.verifyComplete();
66+
}
67+
68+
@Test
69+
void shouldReturnRequestWhenUserIsAuthenticated() {
70+
when(request.headers()).thenReturn(headers);
71+
when(headers.header(APPLICATION_SECRET_HEADER)).thenReturn(List.of(APPLICATION_SECRET));
72+
when(handlerFunction.handle(request)).thenReturn(Mono.just(mockResponse));
73+
74+
final var response = underTest.filter(request, handlerFunction);
75+
76+
StepVerifier.create(response)
77+
.expectNext(mockResponse)
78+
.verifyComplete();
79+
}
80+
}

0 commit comments

Comments
 (0)