Browse Source
Merge remote-tracking branch 'origin/chore-betterServerTestCoverage' into pr-betterServerTestCoverage
pr-betterServerTestCoverage
Merge remote-tracking branch 'origin/chore-betterServerTestCoverage' into pr-betterServerTestCoverage
pr-betterServerTestCoverage
Steffen Nitschke
4 years ago
22 changed files with 1103 additions and 212 deletions
-
14Jenkinsfile
-
37fh.fd.ci.server/src/main/java/de/fd/fh/ServerApp.java
-
5fh.fd.ci.server/src/main/java/de/fd/fh/server/access/Access.java
-
31fh.fd.ci.server/src/main/java/de/fd/fh/server/access/AccessContextEventListener.java
-
7fh.fd.ci.server/src/main/java/de/fd/fh/server/access/AccessService.java
-
169fh.fd.ci.server/src/main/java/de/fd/fh/server/access/web/AccessController.java
-
1fh.fd.ci.server/src/main/java/de/fd/fh/server/user/UserId.java
-
17fh.fd.ci.server/src/main/java/de/fd/fh/server/user/UserService.java
-
14fh.fd.ci.server/src/main/java/de/fd/fh/server/user/events/ChangeUserNameEvent.java
-
10fh.fd.ci.server/src/main/java/de/fd/fh/server/user/web/ChangeUserRequest.java
-
149fh.fd.ci.server/src/main/java/de/fd/fh/server/user/web/UserController.java
-
166fh.fd.ci.server/src/test/java/de/fd/fh/ServerAppTest.java
-
86fh.fd.ci.server/src/test/java/de/fd/fh/server/ApiTestUtils.java
-
27fh.fd.ci.server/src/test/java/de/fd/fh/server/access/AccessContextEventListenerTest.java
-
45fh.fd.ci.server/src/test/java/de/fd/fh/server/access/AccessServiceTest.java
-
48fh.fd.ci.server/src/test/java/de/fd/fh/server/access/AccessTest.java
-
18fh.fd.ci.server/src/test/java/de/fd/fh/server/access/AccessTokenTest.java
-
225fh.fd.ci.server/src/test/java/de/fd/fh/server/access/web/AccessControllerTest.java
-
38fh.fd.ci.server/src/test/java/de/fd/fh/server/user/UserServiceTest.java
-
28fh.fd.ci.server/src/test/java/de/fd/fh/server/user/UserTest.java
-
174fh.fd.ci.server/src/test/java/de/fd/fh/server/user/web/UserControllerTest.java
-
2fh.fd.ci.shared/src/main/java/de/fd/fh/shared/network/messages/RegistrateRequest.java
@ -0,0 +1,14 @@ |
|||||
|
package de.fd.fh.server.user.events; |
||||
|
|
||||
|
import de.fd.fh.server.user.UserId; |
||||
|
import lombok.Getter; |
||||
|
import lombok.RequiredArgsConstructor; |
||||
|
|
||||
|
@RequiredArgsConstructor |
||||
|
@Getter |
||||
|
public class ChangeUserNameEvent |
||||
|
{ |
||||
|
private final UserId userId; |
||||
|
|
||||
|
private final String newName; |
||||
|
} |
@ -1,13 +1,15 @@ |
|||||
package de.fd.fh.server.user.web; |
package de.fd.fh.server.user.web; |
||||
|
|
||||
|
import lombok.AllArgsConstructor; |
||||
import lombok.Getter; |
import lombok.Getter; |
||||
import lombok.RequiredArgsConstructor; |
|
||||
|
import lombok.NoArgsConstructor; |
||||
|
|
||||
@RequiredArgsConstructor |
|
||||
|
@NoArgsConstructor |
||||
|
@AllArgsConstructor |
||||
@Getter |
@Getter |
||||
public class ChangeUserRequest |
public class ChangeUserRequest |
||||
{ |
{ |
||||
private final String name; |
|
||||
|
private String name; |
||||
|
|
||||
private final String password; |
|
||||
|
private String password; |
||||
} |
} |
@ -1,89 +1,90 @@ |
|||||
package de.fd.fh.server.user.web; |
package de.fd.fh.server.user.web; |
||||
|
|
||||
|
import com.fasterxml.jackson.core.JsonProcessingException; |
||||
import com.fasterxml.jackson.databind.ObjectMapper; |
import com.fasterxml.jackson.databind.ObjectMapper; |
||||
import de.fd.fh.server.access.AccessToken; |
import de.fd.fh.server.access.AccessToken; |
||||
import de.fd.fh.server.user.User; |
import de.fd.fh.server.user.User; |
||||
import de.fd.fh.server.user.UserId; |
import de.fd.fh.server.user.UserId; |
||||
import de.fd.fh.server.user.UserService; |
import de.fd.fh.server.user.UserService; |
||||
|
import lombok.RequiredArgsConstructor; |
||||
|
import spark.Request; |
||||
|
import spark.Response; |
||||
|
|
||||
import static spark.Spark.get; |
|
||||
import static spark.Spark.post; |
|
||||
|
|
||||
|
@RequiredArgsConstructor |
||||
public class UserController |
public class UserController |
||||
{ |
{ |
||||
private ObjectMapper objectMapper = new ObjectMapper(); |
private ObjectMapper objectMapper = new ObjectMapper(); |
||||
|
|
||||
public UserController(final UserService service) |
|
||||
|
private final UserService service; |
||||
|
|
||||
|
public Response getUser(Request request, Response response) throws JsonProcessingException |
||||
|
{ |
||||
|
final UserId userId = UserId.of(request.params(":user_id")); |
||||
|
final UserRequest user = service.getSmallPlayer(userId); |
||||
|
|
||||
|
if (user == null) |
||||
|
{ |
||||
|
response.status(404); |
||||
|
return response; |
||||
|
} |
||||
|
response.body(objectMapper.writeValueAsString(user)); |
||||
|
return response; |
||||
|
} |
||||
|
|
||||
|
public Response getCompleteUser(Request request, Response response) throws JsonProcessingException |
||||
{ |
{ |
||||
post("/users", |
|
||||
((request, response) -> |
|
||||
{ |
|
||||
final UserId userId = |
|
||||
((AccessToken) request.session() |
|
||||
.attribute("userId")) |
|
||||
.getUserId(); |
|
||||
|
|
||||
final ChangeUserRequest message = objectMapper.readValue(request.body(), |
|
||||
ChangeUserRequest.class); |
|
||||
|
|
||||
final User user = service.changePlayer( |
|
||||
userId, |
|
||||
message); |
|
||||
|
|
||||
if (user == null) |
|
||||
{ |
|
||||
response.status(400); |
|
||||
} |
|
||||
else |
|
||||
{ |
|
||||
response.status(200); |
|
||||
response.type("application/json"); |
|
||||
|
|
||||
return objectMapper.writeValueAsString(user); |
|
||||
} |
|
||||
|
|
||||
return response; |
|
||||
} |
|
||||
)); |
|
||||
|
|
||||
get("/users", |
|
||||
(request, response) -> |
|
||||
{ |
|
||||
final UserId userId = |
|
||||
((AccessToken) request.session() |
|
||||
.attribute("userId")) |
|
||||
.getUserId(); |
|
||||
|
|
||||
final User user = service.getPlayer(userId); |
|
||||
|
|
||||
if (user == null) |
|
||||
{ |
|
||||
response.status(400); |
|
||||
} |
|
||||
else |
|
||||
{ |
|
||||
response.status(200); |
|
||||
response.type("application/json"); |
|
||||
|
|
||||
return objectMapper.writeValueAsString(user); |
|
||||
} |
|
||||
|
|
||||
return response; |
|
||||
} |
|
||||
); |
|
||||
|
|
||||
get("/users/:user_id", |
|
||||
(request, response) -> |
|
||||
{ |
|
||||
final UserId userId = UserId.of(request.params(":user_id")); |
|
||||
final UserRequest user = service.getSmallPlayer(userId); |
|
||||
|
|
||||
if (user == null) |
|
||||
{ |
|
||||
response.status(404); |
|
||||
} |
|
||||
response.body(objectMapper.writeValueAsString(user)); |
|
||||
return response; |
|
||||
}); |
|
||||
|
final UserId userId = |
||||
|
((AccessToken) request.session() |
||||
|
.attribute("userId")) |
||||
|
.getUserId(); |
||||
|
|
||||
|
final User user = service.getPlayer(userId); |
||||
|
|
||||
|
if (user == null) |
||||
|
{ |
||||
|
response.status(404); |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
response.status(200); |
||||
|
response.type("application/json"); |
||||
|
|
||||
|
response.body(objectMapper.writeValueAsString(user)); |
||||
|
|
||||
|
return response; |
||||
|
} |
||||
|
|
||||
|
return response; |
||||
|
} |
||||
|
|
||||
|
public Response updateUser(Request request, Response response) throws java.io.IOException |
||||
|
{ |
||||
|
final UserId userId = |
||||
|
((AccessToken) request.session() |
||||
|
.attribute("userId")) |
||||
|
.getUserId(); |
||||
|
|
||||
|
final ChangeUserRequest message = objectMapper.readValue(request.body(), |
||||
|
ChangeUserRequest.class); |
||||
|
|
||||
|
final User user = service.changePlayer( |
||||
|
userId, |
||||
|
message); |
||||
|
|
||||
|
if (user == null) |
||||
|
{ |
||||
|
response.status(400); |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
response.status(200); |
||||
|
response.type("application/json"); |
||||
|
|
||||
|
response.body(objectMapper.writeValueAsString(user)); |
||||
|
|
||||
|
return response; |
||||
|
} |
||||
|
|
||||
|
return response; |
||||
} |
} |
||||
} |
} |
@ -0,0 +1,166 @@ |
|||||
|
package de.fd.fh; |
||||
|
|
||||
|
import com.fasterxml.jackson.core.JsonProcessingException; |
||||
|
import de.fd.fh.server.ApiTestUtils; |
||||
|
import de.fd.fh.server.access.web.AccessController; |
||||
|
import de.fd.fh.server.user.web.UserController; |
||||
|
import de.fd.fh.shared.Utils; |
||||
|
import org.junit.jupiter.api.AfterAll; |
||||
|
import org.junit.jupiter.api.BeforeAll; |
||||
|
import org.junit.jupiter.api.Test; |
||||
|
import spark.Response; |
||||
|
|
||||
|
import java.io.IOException; |
||||
|
import java.util.HashMap; |
||||
|
import java.util.Map; |
||||
|
|
||||
|
import static org.junit.jupiter.api.Assertions.*; |
||||
|
import static org.mockito.ArgumentMatchers.any; |
||||
|
import static org.mockito.BDDMockito.then; |
||||
|
import static org.mockito.Mockito.mock; |
||||
|
import static org.mockito.Mockito.when; |
||||
|
import static spark.Spark.awaitInitialization; |
||||
|
import static spark.Spark.stop; |
||||
|
|
||||
|
class ServerAppTest |
||||
|
{ |
||||
|
private static UserController userController = mock(UserController.class); |
||||
|
private static AccessController accessController = mock(AccessController.class); |
||||
|
|
||||
|
@BeforeAll |
||||
|
static void before() |
||||
|
{ |
||||
|
ServerApp.initController(accessController, userController); |
||||
|
ServerApp.main(null); |
||||
|
|
||||
|
awaitInitialization(); |
||||
|
} |
||||
|
|
||||
|
@AfterAll |
||||
|
static void after() |
||||
|
{ |
||||
|
stop(); |
||||
|
} |
||||
|
|
||||
|
@Test |
||||
|
void testHalloWorld() |
||||
|
{ |
||||
|
String url = "/hello"; |
||||
|
Map<String, String> headers = new HashMap<>(); |
||||
|
headers.put(Utils.AUTHENTICATION_HEADER, "Bearer testToken"); |
||||
|
|
||||
|
ApiTestUtils.TestResponse<String> res = new ApiTestUtils<String>() |
||||
|
.request("GET", url, null, headers, String.class); |
||||
|
|
||||
|
assertNotNull(res); |
||||
|
assertEquals(200, res.getStatus()); |
||||
|
assertEquals("Hello World", res.getBody()); |
||||
|
} |
||||
|
|
||||
|
@Test |
||||
|
void testRegistrate() throws IOException |
||||
|
{ |
||||
|
when(accessController.registrate(any(), any())).thenReturn("Test"); |
||||
|
|
||||
|
String url = "/accounts/registrate"; |
||||
|
|
||||
|
ApiTestUtils.TestResponse<String> res = new ApiTestUtils<String>() |
||||
|
.request("POST", url, null, null, String.class); |
||||
|
|
||||
|
assertNotNull(res); |
||||
|
assertEquals(200, res.getStatus()); |
||||
|
then(accessController).should().registrate(any(), any()); |
||||
|
} |
||||
|
|
||||
|
@Test |
||||
|
void testLogin() throws JsonProcessingException |
||||
|
{ |
||||
|
when(accessController.login(any(), any())).thenReturn("Test"); |
||||
|
|
||||
|
String url = "/accounts/login"; |
||||
|
|
||||
|
ApiTestUtils.TestResponse<String> res = new ApiTestUtils<String>() |
||||
|
.request("POST", url, null, null, String.class); |
||||
|
|
||||
|
assertNotNull(res); |
||||
|
assertEquals(200, res.getStatus()); |
||||
|
then(accessController).should().login(any(), any()); |
||||
|
} |
||||
|
|
||||
|
@Test |
||||
|
void testLogout() |
||||
|
{ |
||||
|
when(accessController.logout(any(), any())).thenReturn("Test"); |
||||
|
|
||||
|
String url = "/accounts/logout"; |
||||
|
|
||||
|
ApiTestUtils.TestResponse<String> res = new ApiTestUtils<String>() |
||||
|
.request("POST", url, null, null, String.class); |
||||
|
|
||||
|
assertNotNull(res); |
||||
|
assertEquals(200, res.getStatus()); |
||||
|
then(accessController).should().logout(any(), any()); |
||||
|
} |
||||
|
|
||||
|
@Test |
||||
|
void testDeletePlayer() |
||||
|
{ |
||||
|
final Response response = mock(Response.class); |
||||
|
|
||||
|
when(accessController.deletePlayer(any(), any())).thenReturn(response); |
||||
|
|
||||
|
String url = "/accounts/12345"; |
||||
|
|
||||
|
ApiTestUtils.TestResponse<String> res = new ApiTestUtils<String>() |
||||
|
.request("DELETE", url, null, null, String.class); |
||||
|
|
||||
|
assertNotNull(res); |
||||
|
assertEquals(200, res.getStatus()); |
||||
|
then(accessController).should().deletePlayer(any(), any()); |
||||
|
} |
||||
|
|
||||
|
@Test |
||||
|
void updateUser() throws IOException |
||||
|
{ |
||||
|
when(userController.updateUser(any(), any())).thenReturn(mock(Response.class)); |
||||
|
|
||||
|
String url = "/users"; |
||||
|
|
||||
|
ApiTestUtils.TestResponse<String> res = new ApiTestUtils<String>() |
||||
|
.request("POST", url, null, null, String.class); |
||||
|
|
||||
|
assertNotNull(res); |
||||
|
assertEquals(200, res.getStatus()); |
||||
|
then(userController).should().updateUser(any(), any()); |
||||
|
} |
||||
|
|
||||
|
@Test |
||||
|
void getPlayers() throws JsonProcessingException |
||||
|
{ |
||||
|
when(userController.getCompleteUser(any(), any())).thenReturn(mock(Response.class)); |
||||
|
|
||||
|
String url = "/users"; |
||||
|
|
||||
|
ApiTestUtils.TestResponse<String> res = new ApiTestUtils<String>() |
||||
|
.request("GET", url, null, null, String.class); |
||||
|
|
||||
|
assertNotNull(res); |
||||
|
assertEquals(200, res.getStatus()); |
||||
|
then(userController).should().getCompleteUser(any(), any()); |
||||
|
} |
||||
|
|
||||
|
@Test |
||||
|
void getPlayer() throws JsonProcessingException |
||||
|
{ |
||||
|
when(userController.getUser(any(), any())).thenReturn(mock(Response.class)); |
||||
|
|
||||
|
String url = "/users/12345"; |
||||
|
|
||||
|
ApiTestUtils.TestResponse<String> res = new ApiTestUtils<String>() |
||||
|
.request("GET", url, null, null, String.class); |
||||
|
|
||||
|
assertNotNull(res); |
||||
|
assertEquals(200, res.getStatus()); |
||||
|
then(userController).should().getUser(any(), any()); |
||||
|
} |
||||
|
} |
@ -0,0 +1,86 @@ |
|||||
|
package de.fd.fh.server; |
||||
|
|
||||
|
import com.fasterxml.jackson.databind.ObjectMapper; |
||||
|
import lombok.Getter; |
||||
|
import lombok.Setter; |
||||
|
import spark.utils.IOUtils; |
||||
|
|
||||
|
import java.io.IOException; |
||||
|
import java.io.OutputStream; |
||||
|
import java.io.OutputStreamWriter; |
||||
|
import java.net.HttpURLConnection; |
||||
|
import java.net.URL; |
||||
|
import java.nio.charset.StandardCharsets; |
||||
|
import java.util.Map; |
||||
|
|
||||
|
import static org.junit.jupiter.api.Assertions.fail; |
||||
|
|
||||
|
public class ApiTestUtils<T> |
||||
|
{ |
||||
|
public TestResponse<T> request( |
||||
|
final String method, |
||||
|
final String path, |
||||
|
final String requestBody, |
||||
|
final Map<String, String> header, |
||||
|
final Class<T> responseBodyType) |
||||
|
{ |
||||
|
try |
||||
|
{ |
||||
|
URL url = new URL("http://localhost:4567" + path); |
||||
|
final HttpURLConnection connection = (HttpURLConnection) url.openConnection(); |
||||
|
connection.setRequestMethod(method); |
||||
|
connection.setDoOutput(true); |
||||
|
|
||||
|
if (requestBody != null) |
||||
|
{ |
||||
|
final OutputStream outputStream = connection.getOutputStream(); |
||||
|
final OutputStreamWriter outputStreamWriter = |
||||
|
new OutputStreamWriter(outputStream, StandardCharsets.UTF_8); |
||||
|
outputStreamWriter.write(requestBody); |
||||
|
outputStreamWriter.flush(); |
||||
|
outputStreamWriter.close(); |
||||
|
} |
||||
|
|
||||
|
if (header != null) |
||||
|
{ |
||||
|
header.forEach(connection::addRequestProperty); |
||||
|
} |
||||
|
|
||||
|
connection.connect(); |
||||
|
|
||||
|
final String body = IOUtils.toString(connection.getInputStream()); |
||||
|
return new TestResponse<T>(connection.getResponseCode(), body, responseBodyType); |
||||
|
} |
||||
|
catch (final IOException e) |
||||
|
{ |
||||
|
e.printStackTrace(); |
||||
|
fail("Sending request failed: " + e.getMessage()); |
||||
|
return null; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
@Getter |
||||
|
@Setter |
||||
|
public static class TestResponse<T> |
||||
|
{ |
||||
|
|
||||
|
private final String body; |
||||
|
private final int status; |
||||
|
private final Class<T> type; |
||||
|
|
||||
|
public TestResponse( |
||||
|
final int status, |
||||
|
final String body, |
||||
|
final Class<T> type) |
||||
|
{ |
||||
|
this.status = status; |
||||
|
this.body = body; |
||||
|
this.type = type; |
||||
|
} |
||||
|
|
||||
|
public T json() throws IOException |
||||
|
{ |
||||
|
return new ObjectMapper().readValue(body, type); |
||||
|
} |
||||
|
} |
||||
|
} |
@ -0,0 +1,48 @@ |
|||||
|
package de.fd.fh.server.access; |
||||
|
|
||||
|
import org.junit.jupiter.api.Test; |
||||
|
|
||||
|
import static org.junit.jupiter.api.Assertions.*; |
||||
|
|
||||
|
class AccessTest |
||||
|
{ |
||||
|
@Test |
||||
|
void removeTokenTest() |
||||
|
{ |
||||
|
final Access access = new Access(null, null, null, null, new AccessToken(), null); |
||||
|
|
||||
|
access.removeToken(); |
||||
|
|
||||
|
assertNull(access.getToken()); |
||||
|
} |
||||
|
|
||||
|
@Test |
||||
|
void setTokenTest() |
||||
|
{ |
||||
|
final Access access = new Access(); |
||||
|
|
||||
|
access.setToken(new AccessToken()); |
||||
|
|
||||
|
assertNotNull(access.getToken()); |
||||
|
} |
||||
|
|
||||
|
@Test |
||||
|
void updatePasswordTest() |
||||
|
{ |
||||
|
final Access access = new Access(null,null, "TestPassword", null, null, null); |
||||
|
|
||||
|
access.updatePassword("NewTestPassword"); |
||||
|
|
||||
|
assertEquals("NewTestPassword", access.getPassword(), "Should update password."); |
||||
|
} |
||||
|
|
||||
|
@Test |
||||
|
void renameTest() |
||||
|
{ |
||||
|
final Access access = new Access(null, "TestName", null, null, null, null); |
||||
|
|
||||
|
access.rename("NewTestName"); |
||||
|
|
||||
|
assertEquals("NewTestName", access.getName(), "Should update name."); |
||||
|
} |
||||
|
} |
@ -0,0 +1,225 @@ |
|||||
|
package de.fd.fh.server.access.web; |
||||
|
|
||||
|
import com.fasterxml.jackson.core.JsonProcessingException; |
||||
|
import de.fd.fh.server.access.AccessService; |
||||
|
import de.fd.fh.server.access.AccessToken; |
||||
|
import de.fd.fh.server.access.Role; |
||||
|
import de.fd.fh.server.user.UserId; |
||||
|
import de.fd.fh.shared.network.messages.LoginRequest; |
||||
|
import org.junit.jupiter.api.BeforeEach; |
||||
|
import org.junit.jupiter.api.Test; |
||||
|
import org.mockito.ArgumentCaptor; |
||||
|
import org.mockito.Mock; |
||||
|
import org.mockito.MockitoAnnotations; |
||||
|
import spark.Request; |
||||
|
import spark.Response; |
||||
|
import spark.Session; |
||||
|
|
||||
|
import java.io.IOException; |
||||
|
import java.time.LocalDateTime; |
||||
|
|
||||
|
import static org.junit.jupiter.api.Assertions.*; |
||||
|
import static org.mockito.ArgumentMatchers.any; |
||||
|
import static org.mockito.BDDMockito.then; |
||||
|
import static org.mockito.Mockito.verify; |
||||
|
import static org.mockito.Mockito.when; |
||||
|
|
||||
|
class AccessControllerTest |
||||
|
{ |
||||
|
@Mock |
||||
|
Request request; |
||||
|
@Mock |
||||
|
Response response; |
||||
|
@Mock |
||||
|
Session session; |
||||
|
@Mock |
||||
|
AccessService service; |
||||
|
|
||||
|
@BeforeEach |
||||
|
void before() |
||||
|
{ |
||||
|
MockitoAnnotations.openMocks(this); |
||||
|
} |
||||
|
|
||||
|
@Test |
||||
|
void deletePlayerTest() |
||||
|
{ |
||||
|
when(request.params(any())).thenReturn("12345"); |
||||
|
when(request.session()).thenReturn(session); |
||||
|
when(session.attribute(any())).thenReturn(new AccessToken()); |
||||
|
when(service.deleteAccount(any(), any())).thenReturn(true); |
||||
|
|
||||
|
final ArgumentCaptor<Integer> captor = ArgumentCaptor.forClass(Integer.class); |
||||
|
|
||||
|
new AccessController(service).deletePlayer(request, response); |
||||
|
|
||||
|
verify(response).status(captor.capture()); |
||||
|
|
||||
|
then(service).should().deleteAccount(any(), any()); |
||||
|
then(service).shouldHaveNoMoreInteractions(); |
||||
|
|
||||
|
assertEquals(captor.getValue(), Integer.valueOf(200), "Should return Status code 200."); |
||||
|
} |
||||
|
|
||||
|
@Test |
||||
|
void failedDeletePlayerTest() |
||||
|
{ |
||||
|
when(request.params(any())).thenReturn("12345"); |
||||
|
when(request.session()).thenReturn(session); |
||||
|
when(session.attribute(any())).thenReturn(new AccessToken()); |
||||
|
when(service.deleteAccount(any(), any())).thenReturn(false); |
||||
|
|
||||
|
final ArgumentCaptor<Integer> captor = ArgumentCaptor.forClass(Integer.class); |
||||
|
|
||||
|
new AccessController(service).deletePlayer(request, response); |
||||
|
|
||||
|
verify(response).status(captor.capture()); |
||||
|
|
||||
|
then(service).should().deleteAccount(any(), any()); |
||||
|
then(service).shouldHaveNoMoreInteractions(); |
||||
|
|
||||
|
assertEquals(captor.getValue(), Integer.valueOf(400), "Should return Status code 400."); |
||||
|
} |
||||
|
|
||||
|
@Test |
||||
|
void testLogout() |
||||
|
{ |
||||
|
when(request.headers(any())).thenReturn("testHeader"); |
||||
|
when(service.logout(any())).thenReturn(true); |
||||
|
|
||||
|
final ArgumentCaptor<Integer> captor = ArgumentCaptor.forClass(Integer.class); |
||||
|
|
||||
|
new AccessController(service).logout(request, response); |
||||
|
|
||||
|
verify(response).status(captor.capture()); |
||||
|
|
||||
|
then(service).should().logout(any()); |
||||
|
then(service).shouldHaveNoMoreInteractions(); |
||||
|
|
||||
|
assertEquals(captor.getValue(), Integer.valueOf(200), "Should return Status code 200."); |
||||
|
} |
||||
|
|
||||
|
@Test |
||||
|
void failedLogoutTest() |
||||
|
{ |
||||
|
when(request.headers(any())).thenReturn("testHeader"); |
||||
|
when(service.logout(any())).thenReturn(false); |
||||
|
|
||||
|
final ArgumentCaptor<Integer> captor = ArgumentCaptor.forClass(Integer.class); |
||||
|
|
||||
|
new AccessController(service).logout(request, response); |
||||
|
|
||||
|
verify(response).status(captor.capture()); |
||||
|
|
||||
|
then(service).should().logout(any()); |
||||
|
then(service).shouldHaveNoMoreInteractions(); |
||||
|
|
||||
|
assertEquals(captor.getValue(), Integer.valueOf(400), "Should return Status code 400."); |
||||
|
} |
||||
|
|
||||
|
@Test |
||||
|
void loginTest() throws JsonProcessingException |
||||
|
{ |
||||
|
final LoginRequest dummy = new LoginRequest(); |
||||
|
dummy.setName("TestName"); |
||||
|
dummy.setToken("TestToken"); |
||||
|
dummy.setUserId("12345"); |
||||
|
|
||||
|
when(request.headers(any())).thenReturn("testHeader"); |
||||
|
when(service.authorization(any())).thenReturn(dummy); |
||||
|
|
||||
|
final ArgumentCaptor<Integer> statusCaptor = ArgumentCaptor.forClass(Integer.class); |
||||
|
final ArgumentCaptor<String> typeCaptor = ArgumentCaptor.forClass(String.class); |
||||
|
final ArgumentCaptor<String> bodyCaptor = ArgumentCaptor.forClass(String.class); |
||||
|
|
||||
|
new AccessController(service).login(request, response); |
||||
|
|
||||
|
verify(response).status(statusCaptor.capture()); |
||||
|
verify(response).type(typeCaptor.capture()); |
||||
|
verify(response).body(bodyCaptor.capture()); |
||||
|
|
||||
|
then(service).should().authorization(any()); |
||||
|
then(service).shouldHaveNoMoreInteractions(); |
||||
|
|
||||
|
assertEquals(Integer.valueOf(200), statusCaptor.getValue(), "Should return Status code 200."); |
||||
|
assertEquals("application/json", typeCaptor.getValue(), "Should have return type json."); |
||||
|
assertEquals("{\"name\":\"TestName\",\"userId\":\"12345\",\"token\":\"TestToken\"}", |
||||
|
bodyCaptor.getValue(), "Should return correct Body."); |
||||
|
} |
||||
|
|
||||
|
@Test |
||||
|
void failedLoginTest() throws JsonProcessingException |
||||
|
{ |
||||
|
when(request.headers(any())).thenReturn("testHeader"); |
||||
|
when(service.authorization(any())).thenReturn(null); |
||||
|
|
||||
|
final ArgumentCaptor<Integer> statusCaptor = ArgumentCaptor.forClass(Integer.class); |
||||
|
|
||||
|
new AccessController(service).login(request, response); |
||||
|
|
||||
|
verify(response).status(statusCaptor.capture()); |
||||
|
|
||||
|
then(service).should().authorization(any()); |
||||
|
then(service).shouldHaveNoMoreInteractions(); |
||||
|
|
||||
|
assertEquals(Integer.valueOf(401), statusCaptor.getValue(), "Should return Status code 401."); |
||||
|
} |
||||
|
|
||||
|
@Test |
||||
|
void registrateTest() throws IOException |
||||
|
{ |
||||
|
when(request.body()).thenReturn("{\"userName\":\"TestName\",\"password\":\"TestPassword\"}"); |
||||
|
|
||||
|
when(service.createPlayer(any())).thenReturn(true); |
||||
|
|
||||
|
final ArgumentCaptor<Integer> statusCaptor = ArgumentCaptor.forClass(Integer.class); |
||||
|
|
||||
|
new AccessController(service).registrate(request, response); |
||||
|
|
||||
|
verify(response).status(statusCaptor.capture()); |
||||
|
|
||||
|
then(service).should().createPlayer(any()); |
||||
|
then(service).shouldHaveNoMoreInteractions(); |
||||
|
assertEquals(Integer.valueOf(201), statusCaptor.getValue(), "Should return Status code 201."); |
||||
|
} |
||||
|
|
||||
|
@Test |
||||
|
void failedRegistrateTest() throws IOException |
||||
|
{ |
||||
|
when(request.body()).thenReturn("{\"userName\":\"TestName\",\"password\":\"TestPassword\"}"); |
||||
|
|
||||
|
when(service.createPlayer(any())).thenReturn(false); |
||||
|
|
||||
|
final ArgumentCaptor<Integer> statusCaptor = ArgumentCaptor.forClass(Integer.class); |
||||
|
|
||||
|
new AccessController(service).registrate(request, response); |
||||
|
|
||||
|
verify(response).status(statusCaptor.capture()); |
||||
|
|
||||
|
then(service).should().createPlayer(any()); |
||||
|
then(service).shouldHaveNoMoreInteractions(); |
||||
|
assertEquals(Integer.valueOf(400), statusCaptor.getValue(), "Should return Status code 400."); |
||||
|
} |
||||
|
|
||||
|
@Test |
||||
|
void testBefore() |
||||
|
{ |
||||
|
final AccessToken dummy = new AccessToken("TestToken", LocalDateTime.now(), Role.USER, UserId.random()); |
||||
|
|
||||
|
when(request.pathInfo()).thenReturn("/test/path"); |
||||
|
when(request.headers(any())).thenReturn("TestAuthHeader"); |
||||
|
when(request.session()).thenReturn(session); |
||||
|
when(service.before(any(), any())) |
||||
|
.thenReturn(dummy); |
||||
|
|
||||
|
final ArgumentCaptor<AccessToken> captor = ArgumentCaptor.forClass(AccessToken.class); |
||||
|
|
||||
|
new AccessController(service).before(request); |
||||
|
|
||||
|
verify(session).attribute(any(), captor.capture()); |
||||
|
|
||||
|
assertEquals(dummy, captor.getValue(), "Should store Token in Session"); |
||||
|
then(service).should().before(any(), any()); |
||||
|
then(service).shouldHaveNoMoreInteractions(); |
||||
|
} |
||||
|
} |
@ -0,0 +1,28 @@ |
|||||
|
package de.fd.fh.server.user; |
||||
|
|
||||
|
import org.junit.jupiter.api.Test; |
||||
|
|
||||
|
import static org.junit.jupiter.api.Assertions.*; |
||||
|
|
||||
|
class UserTest |
||||
|
{ |
||||
|
@Test |
||||
|
void testRename() |
||||
|
{ |
||||
|
final User user = new User(UserId.random(), "TestName"); |
||||
|
|
||||
|
user.rename("NewTestName"); |
||||
|
|
||||
|
assertEquals("NewTestName", user.getName(), "Should rename user."); |
||||
|
} |
||||
|
|
||||
|
@Test |
||||
|
void failedRenameTest() |
||||
|
{ |
||||
|
final User user = new User(UserId.random(), "TestName"); |
||||
|
|
||||
|
user.rename(null); |
||||
|
|
||||
|
assertEquals("TestName", user.getName(), "Should rename user."); |
||||
|
} |
||||
|
} |
@ -0,0 +1,174 @@ |
|||||
|
package de.fd.fh.server.user.web; |
||||
|
|
||||
|
import com.fasterxml.jackson.core.JsonProcessingException; |
||||
|
import de.fd.fh.server.access.AccessToken; |
||||
|
import de.fd.fh.server.user.User; |
||||
|
import de.fd.fh.server.user.UserId; |
||||
|
import de.fd.fh.server.user.UserService; |
||||
|
import org.junit.jupiter.api.BeforeEach; |
||||
|
import org.junit.jupiter.api.Test; |
||||
|
import org.mockito.ArgumentCaptor; |
||||
|
import org.mockito.Mock; |
||||
|
import org.mockito.MockitoAnnotations; |
||||
|
import spark.Request; |
||||
|
import spark.Response; |
||||
|
import spark.Session; |
||||
|
|
||||
|
import java.io.IOException; |
||||
|
|
||||
|
import static org.junit.jupiter.api.Assertions.*; |
||||
|
import static org.mockito.ArgumentMatchers.any; |
||||
|
import static org.mockito.BDDMockito.then; |
||||
|
import static org.mockito.Mockito.verify; |
||||
|
import static org.mockito.Mockito.when; |
||||
|
|
||||
|
class UserControllerTest |
||||
|
{ |
||||
|
@Mock |
||||
|
Request request; |
||||
|
@Mock |
||||
|
Response response; |
||||
|
@Mock |
||||
|
Session session; |
||||
|
@Mock |
||||
|
UserService service; |
||||
|
|
||||
|
@BeforeEach |
||||
|
void before() |
||||
|
{ |
||||
|
MockitoAnnotations.openMocks(this); |
||||
|
} |
||||
|
|
||||
|
@Test |
||||
|
void getUserTest() throws JsonProcessingException |
||||
|
{ |
||||
|
when(request.params(any())).thenReturn("12345"); |
||||
|
when(service.getSmallPlayer(any())).thenReturn(new UserRequest("12345", "TestName")); |
||||
|
|
||||
|
final ArgumentCaptor<String> captor = ArgumentCaptor.forClass(String.class); |
||||
|
|
||||
|
final Response result = new UserController(service).getUser(request, response); |
||||
|
|
||||
|
verify(response).body(captor.capture()); |
||||
|
|
||||
|
assertEquals(response, result, "Should return the incomming response."); |
||||
|
assertEquals("{\"id\":\"12345\",\"name\":\"TestName\"}", captor.getValue(), |
||||
|
"Should return UserRequest in Body."); |
||||
|
then(service).should().getSmallPlayer(any()); |
||||
|
} |
||||
|
|
||||
|
@Test |
||||
|
void failedGetUserTest() throws JsonProcessingException |
||||
|
{ |
||||
|
when(request.params(any())).thenReturn("12345"); |
||||
|
when(service.getSmallPlayer(any())).thenReturn(null); |
||||
|
|
||||
|
final ArgumentCaptor<Integer> statusCaptor = ArgumentCaptor.forClass(Integer.class); |
||||
|
|
||||
|
final Response result = new UserController(service).getUser(request, response); |
||||
|
|
||||
|
verify(response).status(statusCaptor.capture()); |
||||
|
|
||||
|
assertEquals(response, result, "Should return the incomming response."); |
||||
|
assertEquals(Integer.valueOf(404), statusCaptor.getValue(), "Should return not found status code."); |
||||
|
then(service).should().getSmallPlayer(any()); |
||||
|
then(service).shouldHaveNoMoreInteractions(); |
||||
|
} |
||||
|
|
||||
|
@Test |
||||
|
void getCompleteUserTest() throws JsonProcessingException |
||||
|
{ |
||||
|
when(request.session()).thenReturn(session); |
||||
|
when(session.attribute(any())).thenReturn( |
||||
|
new AccessToken(null, null, null, UserId.of("12345"))); |
||||
|
when(service.getPlayer(any(UserId.class))).thenReturn(User.of("TestName")); |
||||
|
|
||||
|
final ArgumentCaptor<Integer> statusCapture = ArgumentCaptor.forClass(Integer.class); |
||||
|
final ArgumentCaptor<String> bodyCapture = ArgumentCaptor.forClass(String.class); |
||||
|
final ArgumentCaptor<String> typeCapture = ArgumentCaptor.forClass(String.class); |
||||
|
|
||||
|
final Response result = new UserController(service).getCompleteUser(request, response); |
||||
|
|
||||
|
verify(response).status(statusCapture.capture()); |
||||
|
verify(response).type(typeCapture.capture()); |
||||
|
verify(response).body(bodyCapture.capture()); |
||||
|
|
||||
|
assertEquals(response, result, "Should return the incoming Response"); |
||||
|
assertEquals(Integer.valueOf(200), statusCapture.getValue(), "Should return status code 200."); |
||||
|
assertEquals("application/json", typeCapture.getValue(), "Should have content type json."); |
||||
|
assertEquals("{\"id\":null,\"name\":\"TestName\"}", bodyCapture.getValue(), "Should return user as json."); |
||||
|
|
||||
|
then(service).should().getPlayer(any()); |
||||
|
then(service).shouldHaveNoMoreInteractions(); |
||||
|
} |
||||
|
|
||||
|
@Test |
||||
|
void failedGetCompleteUserTest() throws JsonProcessingException |
||||
|
{ |
||||
|
when(request.session()).thenReturn(session); |
||||
|
when(session.attribute(any())).thenReturn( |
||||
|
new AccessToken(null, null, null, UserId.of("12345"))); |
||||
|
when(service.getPlayer(any(UserId.class))).thenReturn(null); |
||||
|
|
||||
|
final ArgumentCaptor<Integer> capture = ArgumentCaptor.forClass(Integer.class); |
||||
|
|
||||
|
final Response result = new UserController(service).getCompleteUser(request, response); |
||||
|
|
||||
|
verify(response).status(capture.capture()); |
||||
|
|
||||
|
assertEquals(response, result, "Should return the incoming Response"); |
||||
|
assertEquals(Integer.valueOf(404), capture.getValue(), "Should return status code 200."); |
||||
|
then(service).should().getPlayer(any()); |
||||
|
then(service).shouldHaveNoMoreInteractions(); |
||||
|
} |
||||
|
|
||||
|
@Test |
||||
|
void updateUserTest() throws IOException |
||||
|
{ |
||||
|
when(request.session()).thenReturn(session); |
||||
|
when(session.attribute(any())).thenReturn( |
||||
|
new AccessToken(null, null, null, UserId.of("12345"))); |
||||
|
when(request.body()).thenReturn("{\"name\":\"TestName\",\"password\":\"TestPassword\"}"); |
||||
|
when(service.changePlayer(any(), any())).thenReturn(new User(UserId.of("12345"), "TestName")); |
||||
|
|
||||
|
final ArgumentCaptor<Integer> statusCapture = ArgumentCaptor.forClass(Integer.class); |
||||
|
final ArgumentCaptor<String> bodyCapture = ArgumentCaptor.forClass(String.class); |
||||
|
final ArgumentCaptor<String> typeCapture = ArgumentCaptor.forClass(String.class); |
||||
|
|
||||
|
final Response result = new UserController(service).updateUser(request, response); |
||||
|
|
||||
|
verify(response).status(statusCapture.capture()); |
||||
|
verify(response).type(typeCapture.capture()); |
||||
|
verify(response).body(bodyCapture.capture()); |
||||
|
|
||||
|
assertEquals(response, result, "Should return the incoming Response"); |
||||
|
assertEquals(Integer.valueOf(200), statusCapture.getValue(), "Should return status code 200."); |
||||
|
assertEquals("application/json", typeCapture.getValue(), "Should have content type json."); |
||||
|
assertEquals("{\"id\":{\"identifier\":\"12345\"},\"name\":\"TestName\"}", bodyCapture.getValue(), "Should return user as json."); |
||||
|
|
||||
|
then(service).should().changePlayer(any(), any()); |
||||
|
then(service).shouldHaveNoMoreInteractions(); |
||||
|
} |
||||
|
|
||||
|
@Test |
||||
|
void failedUpdateUserTest() throws IOException |
||||
|
{ |
||||
|
when(request.session()).thenReturn(session); |
||||
|
when(session.attribute(any())).thenReturn( |
||||
|
new AccessToken(null, null, null, UserId.of("12345"))); |
||||
|
when(request.body()).thenReturn("{\"name\":\"TestName\",\"password\":\"TestPassword\"}"); |
||||
|
when(service.changePlayer(any(), any())).thenReturn(null); |
||||
|
|
||||
|
final ArgumentCaptor<Integer> statusCapture = ArgumentCaptor.forClass(Integer.class); |
||||
|
|
||||
|
final Response result = new UserController(service).updateUser(request, response); |
||||
|
|
||||
|
verify(response).status(statusCapture.capture()); |
||||
|
|
||||
|
assertEquals(response, result, "Should return the incoming Response"); |
||||
|
assertEquals(Integer.valueOf(400), statusCapture.getValue(), "Should return status code 400."); |
||||
|
|
||||
|
then(service).should().changePlayer(any(), any()); |
||||
|
then(service).shouldHaveNoMoreInteractions(); |
||||
|
} |
||||
|
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue