more tests
This commit is contained in:
parent
e4b31a392c
commit
c885ef85b9
3 changed files with 185 additions and 8 deletions
|
@ -11,6 +11,7 @@ package ch.ethz.seb.sebserver.gbl.model.user;
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.EnumSet;
|
import java.util.EnumSet;
|
||||||
|
import java.util.HashSet;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
@ -291,4 +292,50 @@ public final class UserInfo implements UserAccount, Activatable, Serializable {
|
||||||
userInfo.roles);
|
userInfo.roles);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Use this to create a copy of a given UserInfo by overriding available arguments.
|
||||||
|
*
|
||||||
|
* @param userInfo UserInfo instance to copy
|
||||||
|
* @param name new name or null if the name of given userInfo should be taken
|
||||||
|
* @param username new username or null if the username of given userInfo should be taken
|
||||||
|
* @param email new email or null if the email of given userInfo should be taken
|
||||||
|
* @param language new language or null if the language of given userInfo should be taken
|
||||||
|
* @param timeZone new timeZone or null if the timeZone of given userInfo should be taken
|
||||||
|
* @param roles new timeZone or null if the roles of given userInfo should be taken
|
||||||
|
* @return copied UserInfo instance with the given attributes */
|
||||||
|
public static final UserInfo of(
|
||||||
|
final UserInfo userInfo,
|
||||||
|
final String name,
|
||||||
|
final String username,
|
||||||
|
final String email,
|
||||||
|
final Locale language,
|
||||||
|
final DateTimeZone timeZone,
|
||||||
|
final String... roles) {
|
||||||
|
|
||||||
|
return new UserInfo(
|
||||||
|
userInfo.getUuid(),
|
||||||
|
userInfo.getInstitutionId(),
|
||||||
|
(name != null) ? name : userInfo.getName(),
|
||||||
|
(username != null) ? username : userInfo.getUsername(),
|
||||||
|
(email != null) ? email : userInfo.getEmail(),
|
||||||
|
userInfo.getActive(),
|
||||||
|
(language != null) ? language : userInfo.getLanguage(),
|
||||||
|
(timeZone != null) ? timeZone : userInfo.getTimeZone(),
|
||||||
|
(roles != null) ? new HashSet<>(Arrays.asList(roles)) : userInfo.roles);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static final UserInfo withName(final UserInfo userInfo, final String name) {
|
||||||
|
return of(userInfo, name, null, null, null, null, (String[]) null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static final UserInfo withUserName(final UserInfo userInfo, final String username) {
|
||||||
|
return of(userInfo, null, username, null, null, null, (String[]) null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static final UserInfo withEMail(final UserInfo userInfo, final String email) {
|
||||||
|
return of(userInfo, null, null, email, null, null, (String[]) null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static final UserInfo withRoles(final UserInfo userInfo, final String... roles) {
|
||||||
|
return of(userInfo, null, null, null, null, null, roles);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -159,10 +159,18 @@ public abstract class RestCall<T> {
|
||||||
final RestCallError restCallError =
|
final RestCallError restCallError =
|
||||||
new RestCallError("Response Entity: " + responseEntity.toString());
|
new RestCallError("Response Entity: " + responseEntity.toString());
|
||||||
|
|
||||||
restCallError.errors.addAll(RestCall.this.jsonMapper.readValue(
|
try {
|
||||||
responseEntity.getBody(),
|
restCallError.errors.addAll(RestCall.this.jsonMapper.readValue(
|
||||||
new TypeReference<List<APIMessage>>() {
|
responseEntity.getBody(),
|
||||||
}));
|
new TypeReference<List<APIMessage>>() {
|
||||||
|
}));
|
||||||
|
} catch (final JsonParseException jpe) {
|
||||||
|
if (responseEntity.getStatusCode() == HttpStatus.UNAUTHORIZED) {
|
||||||
|
restCallError.errors.add(APIMessage.ErrorMessage.UNAUTHORIZED.of(responseEntity.getBody()));
|
||||||
|
} else {
|
||||||
|
restCallError.errors.add(APIMessage.ErrorMessage.GENERIC.of(responseEntity.getBody()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
log.debug(
|
log.debug(
|
||||||
"Webservice answered with well defined error- or validation-failure-response: ",
|
"Webservice answered with well defined error- or validation-failure-response: ",
|
||||||
|
|
|
@ -10,6 +10,8 @@ package ch.ethz.seb.sebserver.gui.integration;
|
||||||
|
|
||||||
import static org.junit.Assert.*;
|
import static org.junit.Assert.*;
|
||||||
|
|
||||||
|
import java.util.LinkedHashSet;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
|
|
||||||
import org.joda.time.DateTimeZone;
|
import org.joda.time.DateTimeZone;
|
||||||
|
@ -21,18 +23,25 @@ import org.springframework.test.context.jdbc.Sql;
|
||||||
|
|
||||||
import ch.ethz.seb.sebserver.gbl.api.API;
|
import ch.ethz.seb.sebserver.gbl.api.API;
|
||||||
import ch.ethz.seb.sebserver.gbl.model.Domain;
|
import ch.ethz.seb.sebserver.gbl.model.Domain;
|
||||||
|
import ch.ethz.seb.sebserver.gbl.model.EntityName;
|
||||||
import ch.ethz.seb.sebserver.gbl.model.EntityProcessingReport;
|
import ch.ethz.seb.sebserver.gbl.model.EntityProcessingReport;
|
||||||
import ch.ethz.seb.sebserver.gbl.model.institution.Institution;
|
import ch.ethz.seb.sebserver.gbl.model.institution.Institution;
|
||||||
import ch.ethz.seb.sebserver.gbl.model.user.PasswordChange;
|
import ch.ethz.seb.sebserver.gbl.model.user.PasswordChange;
|
||||||
import ch.ethz.seb.sebserver.gbl.model.user.UserInfo;
|
import ch.ethz.seb.sebserver.gbl.model.user.UserInfo;
|
||||||
import ch.ethz.seb.sebserver.gbl.model.user.UserRole;
|
import ch.ethz.seb.sebserver.gbl.model.user.UserRole;
|
||||||
import ch.ethz.seb.sebserver.gbl.util.Result;
|
import ch.ethz.seb.sebserver.gbl.util.Result;
|
||||||
|
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestCallError;
|
||||||
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestServiceImpl;
|
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestServiceImpl;
|
||||||
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.institution.ActivateInstitution;
|
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.institution.ActivateInstitution;
|
||||||
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.institution.GetInstitution;
|
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.institution.GetInstitution;
|
||||||
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.institution.GetInstitutionNames;
|
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.institution.GetInstitutionNames;
|
||||||
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.institution.NewInstitution;
|
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.institution.NewInstitution;
|
||||||
|
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.useraccount.ActivateUserAccount;
|
||||||
|
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.useraccount.ChangePassword;
|
||||||
|
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.useraccount.GetUserAccount;
|
||||||
|
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.useraccount.GetUserAccountNames;
|
||||||
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.useraccount.NewUserAccount;
|
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.useraccount.NewUserAccount;
|
||||||
|
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.useraccount.SaveUserAccount;
|
||||||
|
|
||||||
public class UseCasesIntegrationTest extends GuiIntegrationTest {
|
public class UseCasesIntegrationTest extends GuiIntegrationTest {
|
||||||
|
|
||||||
|
@ -95,14 +104,15 @@ public class UseCasesIntegrationTest extends GuiIntegrationTest {
|
||||||
// *************************************
|
// *************************************
|
||||||
// Use Case 2: SEB Administrator creates a new Institutional Administrator user for the
|
// Use Case 2: SEB Administrator creates a new Institutional Administrator user for the
|
||||||
// newly created institution and activate this user
|
// newly created institution and activate this user
|
||||||
|
|
||||||
public void testUsecase2() {
|
public void testUsecase2() {
|
||||||
final RestServiceImpl restService = createRestServiceForUser(
|
final RestServiceImpl restService = createRestServiceForUser(
|
||||||
"admin",
|
"admin",
|
||||||
"admin",
|
"admin",
|
||||||
new GetInstitution(),
|
new GetInstitution(),
|
||||||
new GetInstitutionNames(),
|
new GetInstitutionNames(),
|
||||||
new NewUserAccount());
|
new NewUserAccount(),
|
||||||
|
new ActivateUserAccount(),
|
||||||
|
new GetUserAccount());
|
||||||
|
|
||||||
final String instId = restService.getBuilder(GetInstitutionNames.class)
|
final String instId = restService.getBuilder(GetInstitutionNames.class)
|
||||||
.call()
|
.call()
|
||||||
|
@ -114,7 +124,7 @@ public class UseCasesIntegrationTest extends GuiIntegrationTest {
|
||||||
|
|
||||||
assertNotNull(instId);
|
assertNotNull(instId);
|
||||||
|
|
||||||
final Result<UserInfo> result = restService.getBuilder(NewUserAccount.class)
|
Result<UserInfo> result = restService.getBuilder(NewUserAccount.class)
|
||||||
.withFormParam(Domain.USER.ATTR_INSTITUTION_ID, instId)
|
.withFormParam(Domain.USER.ATTR_INSTITUTION_ID, instId)
|
||||||
.withFormParam(Domain.USER.ATTR_NAME, "TestInstAdmin")
|
.withFormParam(Domain.USER.ATTR_NAME, "TestInstAdmin")
|
||||||
.withFormParam(Domain.USER.ATTR_USERNAME, "TestInstAdmin")
|
.withFormParam(Domain.USER.ATTR_USERNAME, "TestInstAdmin")
|
||||||
|
@ -127,9 +137,121 @@ public class UseCasesIntegrationTest extends GuiIntegrationTest {
|
||||||
.call();
|
.call();
|
||||||
|
|
||||||
assertFalse(result.hasError());
|
assertFalse(result.hasError());
|
||||||
final UserInfo userInfo = result.get();
|
UserInfo userInfo = result.get();
|
||||||
assertNotNull(userInfo);
|
assertNotNull(userInfo);
|
||||||
|
assertEquals("TestInstAdmin", userInfo.name);
|
||||||
|
assertEquals("TestInstAdmin", userInfo.username);
|
||||||
|
assertEquals("test@test.ch", userInfo.email);
|
||||||
|
assertEquals("[INSTITUTIONAL_ADMIN]", String.valueOf(userInfo.getRoles()));
|
||||||
|
assertEquals(Locale.ENGLISH, userInfo.language);
|
||||||
|
assertEquals(DateTimeZone.UTC, userInfo.timeZone);
|
||||||
|
assertFalse(userInfo.isActive());
|
||||||
|
|
||||||
|
final Result<EntityProcessingReport> activation = restService.getBuilder(ActivateUserAccount.class)
|
||||||
|
.withURIVariable(API.PARAM_MODEL_ID, String.valueOf(userInfo.uuid))
|
||||||
|
.call();
|
||||||
|
|
||||||
|
assertFalse(activation.hasError());
|
||||||
|
final EntityProcessingReport entityProcessingReport = activation.get();
|
||||||
|
assertTrue(entityProcessingReport.getErrors().isEmpty());
|
||||||
|
|
||||||
|
result = restService.getBuilder(GetUserAccount.class)
|
||||||
|
.withURIVariable(API.PARAM_MODEL_ID, String.valueOf(userInfo.uuid))
|
||||||
|
.call();
|
||||||
|
|
||||||
|
assertFalse(result.hasError());
|
||||||
|
userInfo = result.get();
|
||||||
|
assertTrue(userInfo.isActive());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@Order(3)
|
||||||
|
// *************************************
|
||||||
|
// Use Case 3: Login with the new TestInstAdmin and check that only its institution is available
|
||||||
|
// check also that it is not possible to change to SEB Administrator role
|
||||||
|
// check also this it is possible to change the password and after that a new login is needed
|
||||||
|
// check also that property changes are possible. E.g: email
|
||||||
|
public void testUsecase3() {
|
||||||
|
final RestServiceImpl restService = createRestServiceForUser(
|
||||||
|
"TestInstAdmin",
|
||||||
|
"12345678",
|
||||||
|
new GetInstitutionNames(),
|
||||||
|
new SaveUserAccount(),
|
||||||
|
new ChangePassword(),
|
||||||
|
new GetUserAccount(),
|
||||||
|
new GetUserAccountNames());
|
||||||
|
|
||||||
|
final List<EntityName> institutions = restService.getBuilder(GetInstitutionNames.class)
|
||||||
|
.call()
|
||||||
|
.getOrThrow();
|
||||||
|
|
||||||
|
assertTrue(institutions.size() == 1);
|
||||||
|
assertEquals("Test Institution", institutions.get(0).name);
|
||||||
|
|
||||||
|
final List<EntityName> userNames = restService.getBuilder(GetUserAccountNames.class)
|
||||||
|
.call()
|
||||||
|
.getOrThrow();
|
||||||
|
|
||||||
|
assertTrue(userNames.size() == 1);
|
||||||
|
assertEquals("TestInstAdmin", userNames.get(0).name);
|
||||||
|
|
||||||
|
final String userId = userNames.get(0).modelId;
|
||||||
|
|
||||||
|
UserInfo userInfo = restService.getBuilder(GetUserAccount.class)
|
||||||
|
.withURIVariable(API.PARAM_MODEL_ID, userId)
|
||||||
|
.call()
|
||||||
|
.getOrThrow();
|
||||||
|
|
||||||
|
// change email (should work properly)
|
||||||
|
assertEquals("test@test.ch", userInfo.email);
|
||||||
|
userInfo = UserInfo.withEMail(userInfo, "newMail@test.ch");
|
||||||
|
userInfo = restService.getBuilder(SaveUserAccount.class)
|
||||||
|
.withBody(userInfo)
|
||||||
|
.call()
|
||||||
|
.getOrThrow();
|
||||||
|
|
||||||
|
assertEquals("newMail@test.ch", userInfo.email);
|
||||||
|
|
||||||
|
// adding new role that is lower should work (example Exam Admin)
|
||||||
|
userInfo = UserInfo.withRoles(userInfo, UserRole.INSTITUTIONAL_ADMIN.name(), UserRole.EXAM_ADMIN.name());
|
||||||
|
userInfo = restService.getBuilder(SaveUserAccount.class)
|
||||||
|
.withBody(userInfo)
|
||||||
|
.call()
|
||||||
|
.getOrThrow();
|
||||||
|
|
||||||
|
assertEquals(
|
||||||
|
"[EXAM_ADMIN, INSTITUTIONAL_ADMIN]",
|
||||||
|
String.valueOf(new LinkedHashSet<>(userInfo.getRoles())));
|
||||||
|
|
||||||
|
// adding new role that is higher shouldn't work
|
||||||
|
userInfo = UserInfo.withRoles(userInfo, UserRole.INSTITUTIONAL_ADMIN.name(), UserRole.SEB_SERVER_ADMIN.name());
|
||||||
|
final Result<UserInfo> call = restService.getBuilder(SaveUserAccount.class)
|
||||||
|
.withBody(userInfo)
|
||||||
|
.call();
|
||||||
|
|
||||||
|
assertTrue(call.hasError());
|
||||||
|
assertEquals("Unexpected error while rest call", call.getError().getMessage());
|
||||||
|
RestCallError error = (RestCallError) call.getError();
|
||||||
|
assertEquals(
|
||||||
|
"[APIMessage [messageCode=1100, systemMessage=Unexpected intenral server-side error, details=No edit right grant for user: TestInstAdmin, attributes=[]]]",
|
||||||
|
String.valueOf(error.getErrorMessages()));
|
||||||
|
|
||||||
|
// change password
|
||||||
|
final Result<UserInfo> passwordChange = restService.getBuilder(ChangePassword.class)
|
||||||
|
.withBody(new PasswordChange(userId, "12345678", "987654321", "987654321"))
|
||||||
|
.call();
|
||||||
|
|
||||||
|
assertFalse(passwordChange.hasError());
|
||||||
|
userInfo = passwordChange.get();
|
||||||
|
|
||||||
|
// is the login still valid (should not)
|
||||||
|
final Result<List<EntityName>> instNames = restService.getBuilder(GetInstitutionNames.class)
|
||||||
|
.call();
|
||||||
|
assertTrue(instNames.hasError());
|
||||||
|
error = (RestCallError) instNames.getError();
|
||||||
|
assertEquals(
|
||||||
|
"UNAUTHORIZED",
|
||||||
|
String.valueOf(error.getErrorMessages().get(0).getSystemMessage()));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue