integration tests for GUI and code cleanup
This commit is contained in:
parent
1e7b6f807f
commit
360f6d6755
15 changed files with 369 additions and 67 deletions
|
@ -30,7 +30,6 @@ import com.fasterxml.jackson.databind.node.ObjectNode;
|
||||||
|
|
||||||
import ch.ethz.seb.sebserver.gbl.Constants;
|
import ch.ethz.seb.sebserver.gbl.Constants;
|
||||||
import ch.ethz.seb.sebserver.gbl.api.JSONMapper;
|
import ch.ethz.seb.sebserver.gbl.api.JSONMapper;
|
||||||
import ch.ethz.seb.sebserver.gbl.model.EntityKey;
|
|
||||||
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.FormBinding;
|
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.FormBinding;
|
||||||
import ch.ethz.seb.sebserver.gui.widget.ImageUpload;
|
import ch.ethz.seb.sebserver.gui.widget.ImageUpload;
|
||||||
import ch.ethz.seb.sebserver.gui.widget.MultiSelection;
|
import ch.ethz.seb.sebserver.gui.widget.MultiSelection;
|
||||||
|
@ -47,17 +46,9 @@ public final class Form implements FormBinding {
|
||||||
private final Map<String, List<Form>> subLists = new LinkedHashMap<>();
|
private final Map<String, List<Form>> subLists = new LinkedHashMap<>();
|
||||||
private final Map<String, Set<String>> groups = new LinkedHashMap<>();
|
private final Map<String, Set<String>> groups = new LinkedHashMap<>();
|
||||||
|
|
||||||
private final EntityKey entityKey;
|
Form(final JSONMapper jsonMapper) {
|
||||||
|
|
||||||
Form(final JSONMapper jsonMapper, final EntityKey entityKey) {
|
|
||||||
this.jsonMapper = jsonMapper;
|
this.jsonMapper = jsonMapper;
|
||||||
this.objectRoot = this.jsonMapper.createObjectNode();
|
this.objectRoot = this.jsonMapper.createObjectNode();
|
||||||
this.entityKey = entityKey;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public EntityKey entityKey() {
|
|
||||||
return this.entityKey;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -26,7 +26,6 @@ import org.slf4j.LoggerFactory;
|
||||||
import ch.ethz.seb.sebserver.gbl.Constants;
|
import ch.ethz.seb.sebserver.gbl.Constants;
|
||||||
import ch.ethz.seb.sebserver.gbl.api.JSONMapper;
|
import ch.ethz.seb.sebserver.gbl.api.JSONMapper;
|
||||||
import ch.ethz.seb.sebserver.gbl.model.Entity;
|
import ch.ethz.seb.sebserver.gbl.model.Entity;
|
||||||
import ch.ethz.seb.sebserver.gbl.model.EntityKey;
|
|
||||||
import ch.ethz.seb.sebserver.gbl.util.Tuple;
|
import ch.ethz.seb.sebserver.gbl.util.Tuple;
|
||||||
import ch.ethz.seb.sebserver.gui.service.i18n.PolyglotPageService;
|
import ch.ethz.seb.sebserver.gui.service.i18n.PolyglotPageService;
|
||||||
import ch.ethz.seb.sebserver.gui.service.page.PageContext;
|
import ch.ethz.seb.sebserver.gui.service.page.PageContext;
|
||||||
|
@ -50,7 +49,6 @@ public class FormBuilder {
|
||||||
private boolean emptyCellSeparation = true;
|
private boolean emptyCellSeparation = true;
|
||||||
|
|
||||||
FormBuilder(
|
FormBuilder(
|
||||||
final EntityKey entityKey,
|
|
||||||
final JSONMapper jsonMapper,
|
final JSONMapper jsonMapper,
|
||||||
final WidgetFactory widgetFactory,
|
final WidgetFactory widgetFactory,
|
||||||
final PolyglotPageService polyglotPageService,
|
final PolyglotPageService polyglotPageService,
|
||||||
|
@ -60,7 +58,7 @@ public class FormBuilder {
|
||||||
this.widgetFactory = widgetFactory;
|
this.widgetFactory = widgetFactory;
|
||||||
this.polyglotPageService = polyglotPageService;
|
this.polyglotPageService = polyglotPageService;
|
||||||
this.pageContext = pageContext;
|
this.pageContext = pageContext;
|
||||||
this.form = new Form(jsonMapper, entityKey);
|
this.form = new Form(jsonMapper);
|
||||||
|
|
||||||
this.formParent = new Composite(pageContext.getParent(), SWT.NONE);
|
this.formParent = new Composite(pageContext.getParent(), SWT.NONE);
|
||||||
final GridLayout layout = new GridLayout(rows, true);
|
final GridLayout layout = new GridLayout(rows, true);
|
||||||
|
|
|
@ -97,7 +97,7 @@ public class FormHandle<T extends Entity> {
|
||||||
|
|
||||||
fieldAccessor.setError(this.i18nSupport.getText(new LocTextKey(
|
fieldAccessor.setError(this.i18nSupport.getText(new LocTextKey(
|
||||||
FIELD_VALIDATION_LOCTEXT_PREFIX + valError.errorType,
|
FIELD_VALIDATION_LOCTEXT_PREFIX + valError.errorType,
|
||||||
(Object[]) valError.attributes)));
|
(Object[]) valError.getAttributes())));
|
||||||
}
|
}
|
||||||
|
|
||||||
public FormHandle<T> process(final Consumer<Form> consumer) {
|
public FormHandle<T> process(final Consumer<Form> consumer) {
|
||||||
|
|
|
@ -12,7 +12,6 @@ import org.springframework.context.annotation.Lazy;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
import ch.ethz.seb.sebserver.gbl.api.JSONMapper;
|
import ch.ethz.seb.sebserver.gbl.api.JSONMapper;
|
||||||
import ch.ethz.seb.sebserver.gbl.model.EntityKey;
|
|
||||||
import ch.ethz.seb.sebserver.gbl.profile.GuiProfile;
|
import ch.ethz.seb.sebserver.gbl.profile.GuiProfile;
|
||||||
import ch.ethz.seb.sebserver.gui.service.i18n.PolyglotPageService;
|
import ch.ethz.seb.sebserver.gui.service.i18n.PolyglotPageService;
|
||||||
import ch.ethz.seb.sebserver.gui.service.page.PageContext;
|
import ch.ethz.seb.sebserver.gui.service.page.PageContext;
|
||||||
|
@ -42,21 +41,6 @@ public class PageFormService {
|
||||||
final int rows) {
|
final int rows) {
|
||||||
|
|
||||||
return new FormBuilder(
|
return new FormBuilder(
|
||||||
pageContext.getEntityKey(),
|
|
||||||
this.jsonMapper,
|
|
||||||
this.widgetFactory,
|
|
||||||
this.polyglotPageService,
|
|
||||||
pageContext,
|
|
||||||
rows);
|
|
||||||
}
|
|
||||||
|
|
||||||
public FormBuilder getBuilder(
|
|
||||||
final EntityKey entityKey,
|
|
||||||
final PageContext pageContext,
|
|
||||||
final int rows) {
|
|
||||||
|
|
||||||
return new FormBuilder(
|
|
||||||
entityKey,
|
|
||||||
this.jsonMapper,
|
this.jsonMapper,
|
||||||
this.widgetFactory,
|
this.widgetFactory,
|
||||||
this.polyglotPageService,
|
this.polyglotPageService,
|
||||||
|
|
|
@ -8,7 +8,10 @@
|
||||||
|
|
||||||
package ch.ethz.seb.sebserver.gui.service.page;
|
package ch.ethz.seb.sebserver.gui.service.page;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
|
||||||
import ch.ethz.seb.sebserver.gbl.api.APIMessage;
|
import ch.ethz.seb.sebserver.gbl.api.APIMessage;
|
||||||
|
import ch.ethz.seb.sebserver.gbl.util.Utils;
|
||||||
|
|
||||||
public class FieldValidationError {
|
public class FieldValidationError {
|
||||||
|
|
||||||
|
@ -16,7 +19,7 @@ public class FieldValidationError {
|
||||||
public final String domainName;
|
public final String domainName;
|
||||||
public final String fieldName;
|
public final String fieldName;
|
||||||
public final String errorType;
|
public final String errorType;
|
||||||
public final String[] attributes;
|
public final Collection<String> attributes;
|
||||||
|
|
||||||
public FieldValidationError(final APIMessage apiMessage) {
|
public FieldValidationError(final APIMessage apiMessage) {
|
||||||
this(
|
this(
|
||||||
|
@ -29,11 +32,19 @@ public class FieldValidationError {
|
||||||
final String[] attributes) {
|
final String[] attributes) {
|
||||||
|
|
||||||
this.messageCode = messageCode;
|
this.messageCode = messageCode;
|
||||||
this.attributes = attributes;
|
this.attributes = Utils.immutableCollectionOf(attributes);
|
||||||
|
|
||||||
this.domainName = (attributes != null && attributes.length > 0) ? attributes[0] : null;
|
this.domainName = (attributes != null && attributes.length > 0) ? attributes[0] : null;
|
||||||
this.fieldName = (attributes != null && attributes.length > 1) ? attributes[1] : null;
|
this.fieldName = (attributes != null && attributes.length > 1) ? attributes[1] : null;
|
||||||
this.errorType = (attributes != null && attributes.length > 2) ? attributes[2] : null;
|
this.errorType = (attributes != null && attributes.length > 2) ? attributes[2] : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String[] getAttributes() {
|
||||||
|
if (this.attributes == null) {
|
||||||
|
return new String[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.attributes.toArray(new String[this.attributes.size()]);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,12 +8,8 @@
|
||||||
|
|
||||||
package ch.ethz.seb.sebserver.gui.service.remote.webservice.api;
|
package ch.ethz.seb.sebserver.gui.service.remote.webservice.api;
|
||||||
|
|
||||||
import ch.ethz.seb.sebserver.gbl.model.EntityKey;
|
|
||||||
|
|
||||||
public interface FormBinding {
|
public interface FormBinding {
|
||||||
|
|
||||||
EntityKey entityKey();
|
|
||||||
|
|
||||||
String getFormAsJson();
|
String getFormAsJson();
|
||||||
|
|
||||||
String getFormUrlEncoded();
|
String getFormUrlEncoded();
|
||||||
|
|
|
@ -28,11 +28,9 @@ import org.springframework.web.client.RestClientResponseException;
|
||||||
import com.fasterxml.jackson.core.JsonProcessingException;
|
import com.fasterxml.jackson.core.JsonProcessingException;
|
||||||
import com.fasterxml.jackson.core.type.TypeReference;
|
import com.fasterxml.jackson.core.type.TypeReference;
|
||||||
|
|
||||||
import ch.ethz.seb.sebserver.gbl.api.API;
|
|
||||||
import ch.ethz.seb.sebserver.gbl.api.APIMessage;
|
import ch.ethz.seb.sebserver.gbl.api.APIMessage;
|
||||||
import ch.ethz.seb.sebserver.gbl.api.JSONMapper;
|
import ch.ethz.seb.sebserver.gbl.api.JSONMapper;
|
||||||
import ch.ethz.seb.sebserver.gbl.model.Entity;
|
import ch.ethz.seb.sebserver.gbl.model.Entity;
|
||||||
import ch.ethz.seb.sebserver.gbl.model.EntityKey;
|
|
||||||
import ch.ethz.seb.sebserver.gbl.model.Page;
|
import ch.ethz.seb.sebserver.gbl.model.Page;
|
||||||
import ch.ethz.seb.sebserver.gbl.util.Result;
|
import ch.ethz.seb.sebserver.gbl.util.Result;
|
||||||
import ch.ethz.seb.sebserver.webservice.servicelayer.PaginationService.SortOrder;
|
import ch.ethz.seb.sebserver.webservice.servicelayer.PaginationService.SortOrder;
|
||||||
|
@ -72,7 +70,7 @@ public abstract class RestCall<T> {
|
||||||
log.debug("Call webservice API on {} for {}", this.path, builder);
|
log.debug("Call webservice API on {} for {}", this.path, builder);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
final ResponseEntity<String> responseEntity = RestCall.this.restService
|
final ResponseEntity<String> responseEntity = this.restService
|
||||||
.getWebserviceAPIRestTemplate()
|
.getWebserviceAPIRestTemplate()
|
||||||
.exchange(
|
.exchange(
|
||||||
builder.buildURI(),
|
builder.buildURI(),
|
||||||
|
@ -211,10 +209,8 @@ public abstract class RestCall<T> {
|
||||||
}
|
}
|
||||||
|
|
||||||
public RestCallBuilder withFormBinding(final FormBinding formBinding) {
|
public RestCallBuilder withFormBinding(final FormBinding formBinding) {
|
||||||
final EntityKey entityKey = formBinding.entityKey();
|
if (RestCall.this.httpMethod == HttpMethod.PUT) {
|
||||||
if (entityKey != null) {
|
return withBody(formBinding.getFormAsJson());
|
||||||
return withURIVariable(API.PARAM_MODEL_ID, formBinding.entityKey().modelId)
|
|
||||||
.withBody(formBinding.getFormAsJson());
|
|
||||||
} else {
|
} else {
|
||||||
this.body = formBinding.getFormUrlEncoded();
|
this.body = formBinding.getFormUrlEncoded();
|
||||||
return this;
|
return this;
|
||||||
|
|
|
@ -9,13 +9,9 @@
|
||||||
package ch.ethz.seb.sebserver.gui.service.remote.webservice.api;
|
package ch.ethz.seb.sebserver.gui.service.remote.webservice.api;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
import org.slf4j.Logger;
|
|
||||||
import org.slf4j.LoggerFactory;
|
|
||||||
import org.springframework.context.annotation.Lazy;
|
import org.springframework.context.annotation.Lazy;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.web.client.RestTemplate;
|
import org.springframework.web.client.RestTemplate;
|
||||||
|
@ -23,8 +19,6 @@ import org.springframework.web.util.UriComponentsBuilder;
|
||||||
|
|
||||||
import ch.ethz.seb.sebserver.gbl.api.JSONMapper;
|
import ch.ethz.seb.sebserver.gbl.api.JSONMapper;
|
||||||
import ch.ethz.seb.sebserver.gbl.profile.GuiProfile;
|
import ch.ethz.seb.sebserver.gbl.profile.GuiProfile;
|
||||||
import ch.ethz.seb.sebserver.gbl.util.Tuple;
|
|
||||||
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.institution.GetInstitutionNames;
|
|
||||||
import ch.ethz.seb.sebserver.gui.service.remote.webservice.auth.AuthorizationContextHolder;
|
import ch.ethz.seb.sebserver.gui.service.remote.webservice.auth.AuthorizationContextHolder;
|
||||||
import ch.ethz.seb.sebserver.gui.service.remote.webservice.auth.WebserviceURIService;
|
import ch.ethz.seb.sebserver.gui.service.remote.webservice.auth.WebserviceURIService;
|
||||||
|
|
||||||
|
@ -33,8 +27,6 @@ import ch.ethz.seb.sebserver.gui.service.remote.webservice.auth.WebserviceURISer
|
||||||
@GuiProfile
|
@GuiProfile
|
||||||
public class RestService {
|
public class RestService {
|
||||||
|
|
||||||
private static final Logger log = LoggerFactory.getLogger(RestService.class);
|
|
||||||
|
|
||||||
private final AuthorizationContextHolder authorizationContextHolder;
|
private final AuthorizationContextHolder authorizationContextHolder;
|
||||||
private final WebserviceURIService webserviceURIBuilderSupplier;
|
private final WebserviceURIService webserviceURIBuilderSupplier;
|
||||||
private final Map<String, RestCall<?>> calls;
|
private final Map<String, RestCall<?>> calls;
|
||||||
|
@ -80,19 +72,4 @@ public class RestService {
|
||||||
return restCall.newBuilder();
|
return restCall.newBuilder();
|
||||||
}
|
}
|
||||||
|
|
||||||
public final List<Tuple<String>> getInstitutionSelection() {
|
|
||||||
try {
|
|
||||||
return getBuilder(GetInstitutionNames.class)
|
|
||||||
.call()
|
|
||||||
.map(list -> list
|
|
||||||
.stream()
|
|
||||||
.map(entityName -> new Tuple<>(entityName.modelId, entityName.name))
|
|
||||||
.collect(Collectors.toList()))
|
|
||||||
.getOrThrow();
|
|
||||||
} catch (final Exception e) {
|
|
||||||
log.error("Failed to get selection resource for Institution selection", e);
|
|
||||||
return Collections.emptyList();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -98,6 +98,7 @@ public class OAuth2AuthorizationContextHolder implements AuthorizationContextHol
|
||||||
this.guiClientSecret,
|
this.guiClientSecret,
|
||||||
this.webserviceURIService,
|
this.webserviceURIService,
|
||||||
this.clientHttpRequestFactory);
|
this.clientHttpRequestFactory);
|
||||||
|
|
||||||
session.setAttribute(CONTEXT_HOLDER_ATTRIBUTE, context);
|
session.setAttribute(CONTEXT_HOLDER_ATTRIBUTE, context);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -8,6 +8,9 @@
|
||||||
|
|
||||||
package ch.ethz.seb.sebserver.gbl.model.institution;
|
package ch.ethz.seb.sebserver.gbl.model.institution;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
import static org.junit.Assert.assertTrue;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
@ -21,10 +24,13 @@ public class InstitutionTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void test() throws JsonParseException, JsonMappingException, IOException {
|
public void test() throws JsonParseException, JsonMappingException, IOException {
|
||||||
final String testJson = "{\"id\":\"1\",\"name\":\"ETH Zürichrgerg\",\"urlSuffix\":\"\"}";
|
final String testJson = "{\"id\":\"1\",\"name\":\"ETH Zürich\",\"urlSuffix\":\"\"}";
|
||||||
|
|
||||||
final JSONMapper mapper = new JSONMapper();
|
final JSONMapper mapper = new JSONMapper();
|
||||||
final Institution inst = mapper.readValue(testJson, Institution.class);
|
final Institution inst = mapper.readValue(testJson, Institution.class);
|
||||||
|
assertTrue(inst.id != null);
|
||||||
|
assertTrue(inst.id.longValue() == 1);
|
||||||
|
assertEquals("ETH Zürich", inst.name);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,53 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019 ETH Zürich, Educational Development and Technology (LET)
|
||||||
|
*
|
||||||
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package ch.ethz.seb.sebserver.gui.form;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
public class FormBuilderTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testFormBuilder() {
|
||||||
|
|
||||||
|
// final PolyglotPageService polyglotPageService = Mockito.mock(PolyglotPageService.class);
|
||||||
|
// final ServerPushService serverPushService = Mockito.mock(ServerPushService.class);
|
||||||
|
// final WidgetFactory WidgetFactory = new WidgetFactory(polyglotPageService, serverPushService);
|
||||||
|
//
|
||||||
|
// final PageFormService pageFormService = new PageFormService(
|
||||||
|
// new JSONMapper(),
|
||||||
|
// WidgetFactory,
|
||||||
|
// polyglotPageService);
|
||||||
|
//
|
||||||
|
// final PageContext formContext = Mockito.mock(PageContext.class);
|
||||||
|
// final SaveInstitution rest = Mockito.mock(SaveInstitution.class);
|
||||||
|
//
|
||||||
|
// final Composite content = Mockito.mock(Composite.class);
|
||||||
|
//
|
||||||
|
// final FormHandle<Institution> formHandle = pageFormService.getBuilder(
|
||||||
|
// formContext.copyOf(content), 4)
|
||||||
|
// .readonly(formContext.isReadonly())
|
||||||
|
// .putStaticValue(Domain.INSTITUTION.ATTR_ID, "1")
|
||||||
|
// .addField(FormBuilder.text(
|
||||||
|
// Domain.INSTITUTION.ATTR_NAME,
|
||||||
|
// "sebserver.institution.form.name",
|
||||||
|
// "Test Institution"))
|
||||||
|
// .addField(FormBuilder.text(
|
||||||
|
// Domain.INSTITUTION.ATTR_URL_SUFFIX,
|
||||||
|
// "sebserver.institution.form.urlSuffix",
|
||||||
|
// "inst"))
|
||||||
|
// .addField(FormBuilder.imageUpload(
|
||||||
|
// Domain.INSTITUTION.ATTR_LOGO_IMAGE,
|
||||||
|
// "sebserver.institution.form.logoImage",
|
||||||
|
// ""))
|
||||||
|
// .buildFor(rest);
|
||||||
|
//
|
||||||
|
// assertNotNull(formHandle);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,68 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019 ETH Zürich, Educational Development and Technology (LET)
|
||||||
|
*
|
||||||
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package ch.ethz.seb.sebserver.gui.integration;
|
||||||
|
|
||||||
|
import static org.junit.Assert.*;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import ch.ethz.seb.sebserver.gbl.api.EntityType;
|
||||||
|
import ch.ethz.seb.sebserver.gbl.authorization.PrivilegeType;
|
||||||
|
import ch.ethz.seb.sebserver.gbl.model.user.UserInfo;
|
||||||
|
import ch.ethz.seb.sebserver.gui.service.remote.webservice.auth.CurrentUser;
|
||||||
|
import ch.ethz.seb.sebserver.gui.service.remote.webservice.auth.OAuth2AuthorizationContextHolder;
|
||||||
|
|
||||||
|
public class CurrentUserTest extends GuiIntegrationTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCurrentUserLoginAndGet() {
|
||||||
|
final OAuth2AuthorizationContextHolder authorizationContextHolder = getAuthorizationContextHolder();
|
||||||
|
|
||||||
|
final CurrentUser currentUser = new CurrentUser(authorizationContextHolder);
|
||||||
|
|
||||||
|
// no user is logged in for now
|
||||||
|
assertNull(currentUser.get());
|
||||||
|
|
||||||
|
// login as SEB Administrator
|
||||||
|
authorizationContextHolder.getAuthorizationContext().login("admin", "admin");
|
||||||
|
final UserInfo userInfo = currentUser.getOrHandleError(error -> {
|
||||||
|
fail("expecting no error here");
|
||||||
|
return null;
|
||||||
|
});
|
||||||
|
assertNotNull(userInfo);
|
||||||
|
assertEquals("user1", userInfo.uuid);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCurrentUserPrivileges() {
|
||||||
|
final OAuth2AuthorizationContextHolder authorizationContextHolder = getAuthorizationContextHolder();
|
||||||
|
|
||||||
|
final CurrentUser currentUser = new CurrentUser(authorizationContextHolder);
|
||||||
|
// login as SEB Administrator
|
||||||
|
authorizationContextHolder.getAuthorizationContext().login("admin", "admin");
|
||||||
|
|
||||||
|
assertTrue(currentUser.hasBasePrivilege(PrivilegeType.READ_ONLY, EntityType.INSTITUTION));
|
||||||
|
assertTrue(currentUser.hasPrivilege(PrivilegeType.WRITE, currentUser.get()));
|
||||||
|
assertTrue(currentUser.hasBasePrivilege(PrivilegeType.WRITE, EntityType.INSTITUTION));
|
||||||
|
assertTrue(currentUser.hasInstitutionalPrivilege(PrivilegeType.MODIFY, EntityType.INSTITUTION));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCurrentUserLogin() {
|
||||||
|
final OAuth2AuthorizationContextHolder authorizationContextHolder = login("admin", "admin");
|
||||||
|
final CurrentUser currentUser = new CurrentUser(authorizationContextHolder);
|
||||||
|
final UserInfo userInfo = currentUser.getOrHandleError(error -> {
|
||||||
|
fail("expecting no error here");
|
||||||
|
return null;
|
||||||
|
});
|
||||||
|
assertNotNull(userInfo);
|
||||||
|
assertEquals("user1", userInfo.uuid);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,121 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019 ETH Zürich, Educational Development and Technology (LET)
|
||||||
|
*
|
||||||
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package ch.ethz.seb.sebserver.gui.integration;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertNotNull;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.net.HttpURLConnection;
|
||||||
|
|
||||||
|
import javax.servlet.http.HttpSession;
|
||||||
|
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
import org.mockito.Mockito;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
|
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
|
||||||
|
import org.springframework.boot.test.context.SpringBootTest;
|
||||||
|
import org.springframework.http.client.SimpleClientHttpRequestFactory;
|
||||||
|
import org.springframework.security.web.FilterChainProxy;
|
||||||
|
import org.springframework.test.context.ActiveProfiles;
|
||||||
|
import org.springframework.test.context.junit4.SpringRunner;
|
||||||
|
import org.springframework.test.web.servlet.MockMvc;
|
||||||
|
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
|
||||||
|
import org.springframework.web.context.WebApplicationContext;
|
||||||
|
|
||||||
|
import ch.ethz.seb.sebserver.SEBServer;
|
||||||
|
import ch.ethz.seb.sebserver.gbl.api.JSONMapper;
|
||||||
|
import ch.ethz.seb.sebserver.gui.service.remote.webservice.auth.OAuth2AuthorizationContextHolder;
|
||||||
|
import ch.ethz.seb.sebserver.gui.service.remote.webservice.auth.SEBServerAuthorizationContext;
|
||||||
|
import ch.ethz.seb.sebserver.gui.service.remote.webservice.auth.WebserviceURIService;
|
||||||
|
|
||||||
|
@RunWith(SpringRunner.class)
|
||||||
|
@SpringBootTest(
|
||||||
|
classes = SEBServer.class,
|
||||||
|
webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
|
||||||
|
@ActiveProfiles("test")
|
||||||
|
@AutoConfigureMockMvc
|
||||||
|
public abstract class GuiIntegrationTest {
|
||||||
|
|
||||||
|
@Value("${sebserver.webservice.api.admin.clientId}")
|
||||||
|
protected String clientId;
|
||||||
|
@Value("${sebserver.webservice.api.admin.clientSecret}")
|
||||||
|
protected String clientSecret;
|
||||||
|
@Value("${sebserver.webservice.api.admin.endpoint}")
|
||||||
|
protected String endpoint;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
protected WebApplicationContext wac;
|
||||||
|
@Autowired
|
||||||
|
protected JSONMapper jsonMapper;
|
||||||
|
@Autowired
|
||||||
|
protected FilterChainProxy springSecurityFilterChain;
|
||||||
|
|
||||||
|
protected MockMvc mockMvc;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setup() {
|
||||||
|
this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac)
|
||||||
|
.addFilter(this.springSecurityFilterChain).build();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected OAuth2AuthorizationContextHolder getAuthorizationContextHolder() {
|
||||||
|
|
||||||
|
final HttpSession sessionMock = Mockito.mock(HttpSession.class);
|
||||||
|
final WebserviceURIService webserviceURIService = new WebserviceURIService(
|
||||||
|
"http", "localhost", "8080", this.endpoint);
|
||||||
|
|
||||||
|
return new OAuth2AuthorizationContextHolder(
|
||||||
|
this.clientId,
|
||||||
|
this.clientSecret,
|
||||||
|
webserviceURIService,
|
||||||
|
new SimpleClientHttpRequestFactory() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void prepareConnection(
|
||||||
|
final HttpURLConnection connection,
|
||||||
|
final String httpMethod) throws IOException {
|
||||||
|
|
||||||
|
super.prepareConnection(connection, httpMethod);
|
||||||
|
connection.setInstanceFollowRedirects(false);
|
||||||
|
}
|
||||||
|
}) {
|
||||||
|
|
||||||
|
private SEBServerAuthorizationContext authContext = null;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SEBServerAuthorizationContext getAuthorizationContext() {
|
||||||
|
if (this.authContext == null) {
|
||||||
|
this.authContext = super.getAuthorizationContext(sessionMock);
|
||||||
|
}
|
||||||
|
return this.authContext;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
protected SEBServerAuthorizationContext getAuthorizationContext() {
|
||||||
|
final SEBServerAuthorizationContext authorizationContext =
|
||||||
|
getAuthorizationContextHolder().getAuthorizationContext();
|
||||||
|
assertNotNull(authorizationContext);
|
||||||
|
return authorizationContext;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
protected OAuth2AuthorizationContextHolder login(final String name, final String pwd) {
|
||||||
|
final OAuth2AuthorizationContextHolder authorizationContextHolder = getAuthorizationContextHolder();
|
||||||
|
final SEBServerAuthorizationContext authorizationContext = authorizationContextHolder.getAuthorizationContext();
|
||||||
|
if (authorizationContext.isLoggedIn()) {
|
||||||
|
throw new IllegalStateException("another user is already logged in");
|
||||||
|
}
|
||||||
|
authorizationContext.login(name, pwd);
|
||||||
|
return authorizationContextHolder;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,63 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019 ETH Zürich, Educational Development and Technology (LET)
|
||||||
|
*
|
||||||
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package ch.ethz.seb.sebserver.gui.integration;
|
||||||
|
|
||||||
|
import static org.junit.Assert.*;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collection;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.springframework.http.HttpMethod;
|
||||||
|
import org.springframework.http.MediaType;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.core.type.TypeReference;
|
||||||
|
|
||||||
|
import ch.ethz.seb.sebserver.gbl.api.API;
|
||||||
|
import ch.ethz.seb.sebserver.gbl.api.JSONMapper;
|
||||||
|
import ch.ethz.seb.sebserver.gbl.model.institution.Institution;
|
||||||
|
import ch.ethz.seb.sebserver.gbl.util.Result;
|
||||||
|
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestCall;
|
||||||
|
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestService;
|
||||||
|
import ch.ethz.seb.sebserver.gui.service.remote.webservice.auth.OAuth2AuthorizationContextHolder;
|
||||||
|
|
||||||
|
public class RestServiceTest extends GuiIntegrationTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testRestServiceInit() {
|
||||||
|
final OAuth2AuthorizationContextHolder authorizationContextHolder = login("admin", "admin");
|
||||||
|
final Collection<RestCall<?>> calls = new ArrayList<>();
|
||||||
|
calls.add(new RestServiceTest.GetInstitution());
|
||||||
|
|
||||||
|
final RestService restService = new RestService(authorizationContextHolder, new JSONMapper(), calls);
|
||||||
|
|
||||||
|
final Result<Institution> call = restService.getBuilder(RestServiceTest.GetInstitution.class)
|
||||||
|
.withURIVariable(API.PARAM_MODEL_ID, "2")
|
||||||
|
.call();
|
||||||
|
|
||||||
|
assertNotNull(call);
|
||||||
|
assertFalse(call.hasError());
|
||||||
|
final Institution institution = call.get();
|
||||||
|
assertEquals("Institution2", institution.name);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class GetInstitution extends RestCall<Institution> {
|
||||||
|
|
||||||
|
public GetInstitution() {
|
||||||
|
super(
|
||||||
|
new TypeReference<Institution>() {
|
||||||
|
},
|
||||||
|
HttpMethod.GET,
|
||||||
|
MediaType.APPLICATION_FORM_URLENCODED,
|
||||||
|
API.INSTITUTION_ENDPOINT + API.MODEL_ID_VAR_PATH_SEGMENT);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,37 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019 ETH Zürich, Educational Development and Technology (LET)
|
||||||
|
*
|
||||||
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package ch.ethz.seb.sebserver.gui.integration;
|
||||||
|
|
||||||
|
import static org.junit.Assert.*;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import ch.ethz.seb.sebserver.gbl.model.user.UserInfo;
|
||||||
|
import ch.ethz.seb.sebserver.gbl.util.Result;
|
||||||
|
import ch.ethz.seb.sebserver.gui.service.remote.webservice.auth.SEBServerAuthorizationContext;
|
||||||
|
|
||||||
|
public class SEBServerAuthorizationContextTest extends GuiIntegrationTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testLoginLogoutAsSEBAdmin() {
|
||||||
|
|
||||||
|
final SEBServerAuthorizationContext authorizationContext = getAuthorizationContext();
|
||||||
|
|
||||||
|
assertTrue(authorizationContext.login("admin", "admin"));
|
||||||
|
assertTrue(authorizationContext.isLoggedIn());
|
||||||
|
final Result<UserInfo> loggedInUser = authorizationContext.getLoggedInUser();
|
||||||
|
assertFalse(loggedInUser.hasError());
|
||||||
|
final UserInfo userInfo = loggedInUser.get();
|
||||||
|
assertEquals("user1", userInfo.uuid);
|
||||||
|
|
||||||
|
assertTrue(authorizationContext.logout());
|
||||||
|
assertFalse(authorizationContext.isLoggedIn());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in a new issue