SEBSERV-10 more integration tests and fixes
This commit is contained in:
parent
e38ba52715
commit
896db25eca
10 changed files with 274 additions and 25 deletions
|
@ -2,7 +2,8 @@ package ch.ethz.seb.sebserver.gbl.api;
|
||||||
|
|
||||||
import javax.annotation.Generated;
|
import javax.annotation.Generated;
|
||||||
|
|
||||||
@Generated(value="org.mybatis.generator.api.MyBatisGenerator",comments="ch.ethz.seb.sebserver.gen.DomainModelNameReferencePlugin",date="2020-07-06T10:44:00.903+02:00")
|
@Generated(value = "org.mybatis.generator.api.MyBatisGenerator",
|
||||||
|
comments = "ch.ethz.seb.sebserver.gen.DomainModelNameReferencePlugin", date = "2020-07-06T10:44:00.903+02:00")
|
||||||
public enum EntityType {
|
public enum EntityType {
|
||||||
CONFIGURATION_ATTRIBUTE,
|
CONFIGURATION_ATTRIBUTE,
|
||||||
CONFIGURATION_VALUE,
|
CONFIGURATION_VALUE,
|
||||||
|
|
|
@ -31,9 +31,9 @@ public class EntityProcessingReport {
|
||||||
@JsonProperty(value = "source", required = true)
|
@JsonProperty(value = "source", required = true)
|
||||||
public final Set<EntityKey> source;
|
public final Set<EntityKey> source;
|
||||||
/** A set of entity-keys for all entities that has been detected as dependency to one or more of the source entities
|
/** A set of entity-keys for all entities that has been detected as dependency to one or more of the source entities
|
||||||
* during the process */
|
* during the process */
|
||||||
@JsonProperty(value = "dependencies", required = true)
|
@JsonProperty(value = "results", required = true)
|
||||||
public final Set<EntityKey> dependencies;
|
public final Set<EntityKey> results;
|
||||||
/** A set of error entries that defines an error if happened. */
|
/** A set of error entries that defines an error if happened. */
|
||||||
@JsonProperty(value = "errors", required = true)
|
@JsonProperty(value = "errors", required = true)
|
||||||
public final Set<ErrorEntry> errors;
|
public final Set<ErrorEntry> errors;
|
||||||
|
@ -41,11 +41,11 @@ public class EntityProcessingReport {
|
||||||
@JsonCreator
|
@JsonCreator
|
||||||
public EntityProcessingReport(
|
public EntityProcessingReport(
|
||||||
@JsonProperty(value = "source", required = true) final Collection<EntityKey> source,
|
@JsonProperty(value = "source", required = true) final Collection<EntityKey> source,
|
||||||
@JsonProperty(value = "dependencies", required = true) final Collection<EntityKey> dependencies,
|
@JsonProperty(value = "results", required = true) final Collection<EntityKey> results,
|
||||||
@JsonProperty(value = "errors", required = true) final Collection<ErrorEntry> errors) {
|
@JsonProperty(value = "errors", required = true) final Collection<ErrorEntry> errors) {
|
||||||
|
|
||||||
this.source = Utils.immutableSetOf(source);
|
this.source = Utils.immutableSetOf(source);
|
||||||
this.dependencies = Utils.immutableSetOf(dependencies);
|
this.results = Utils.immutableSetOf(results);
|
||||||
this.errors = Utils.immutableSetOf(errors);
|
this.errors = Utils.immutableSetOf(errors);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -62,22 +62,25 @@ public class EntityProcessingReport {
|
||||||
return this.source;
|
return this.source;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Set<EntityKey> getDependencies() {
|
public Set<EntityKey> getResults() {
|
||||||
return this.dependencies;
|
return this.results;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Set<ErrorEntry> getErrors() {
|
public Set<ErrorEntry> getErrors() {
|
||||||
return this.errors;
|
return this.errors;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@JsonIgnoreProperties(ignoreUnknown = true)
|
||||||
public static final class ErrorEntry {
|
public static final class ErrorEntry {
|
||||||
|
|
||||||
|
@JsonProperty(value = "entity_key", required = false)
|
||||||
public final EntityKey entityKey;
|
public final EntityKey entityKey;
|
||||||
|
@JsonProperty(value = "error_message", required = true)
|
||||||
public final APIMessage errorMessage;
|
public final APIMessage errorMessage;
|
||||||
|
|
||||||
@JsonCreator
|
@JsonCreator
|
||||||
public ErrorEntry(
|
public ErrorEntry(
|
||||||
@JsonProperty(value = "entity_key", required = true) final EntityKey entityKey,
|
@JsonProperty(value = "entity_key", required = false) final EntityKey entityKey,
|
||||||
@JsonProperty(value = "error_message", required = true) final APIMessage errorMessage) {
|
@JsonProperty(value = "error_message", required = true) final APIMessage errorMessage) {
|
||||||
|
|
||||||
this.entityKey = entityKey;
|
this.entityKey = entityKey;
|
||||||
|
@ -98,8 +101,8 @@ public class EntityProcessingReport {
|
||||||
final StringBuilder builder = new StringBuilder();
|
final StringBuilder builder = new StringBuilder();
|
||||||
builder.append("EntityProcessingReport [source=");
|
builder.append("EntityProcessingReport [source=");
|
||||||
builder.append(this.source);
|
builder.append(this.source);
|
||||||
builder.append(", dependencies=");
|
builder.append(", results=");
|
||||||
builder.append(this.dependencies);
|
builder.append(this.results);
|
||||||
builder.append(", errors=");
|
builder.append(", errors=");
|
||||||
builder.append(this.errors);
|
builder.append(this.errors);
|
||||||
builder.append("]");
|
builder.append("]");
|
||||||
|
|
|
@ -0,0 +1,40 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2020 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.service.remote.webservice.api.useraccount;
|
||||||
|
|
||||||
|
import org.springframework.context.annotation.Lazy;
|
||||||
|
import org.springframework.http.HttpMethod;
|
||||||
|
import org.springframework.http.MediaType;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.core.type.TypeReference;
|
||||||
|
|
||||||
|
import ch.ethz.seb.sebserver.gbl.api.API;
|
||||||
|
import ch.ethz.seb.sebserver.gbl.api.EntityType;
|
||||||
|
import ch.ethz.seb.sebserver.gbl.model.EntityProcessingReport;
|
||||||
|
import ch.ethz.seb.sebserver.gbl.profile.GuiProfile;
|
||||||
|
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestCall;
|
||||||
|
|
||||||
|
@Lazy
|
||||||
|
@Component
|
||||||
|
@GuiProfile
|
||||||
|
public class DeleteUserAccount extends RestCall<EntityProcessingReport> {
|
||||||
|
|
||||||
|
public DeleteUserAccount() {
|
||||||
|
super(new TypeKey<>(
|
||||||
|
CallType.ACTIVATION_DEACTIVATE,
|
||||||
|
EntityType.USER,
|
||||||
|
new TypeReference<EntityProcessingReport>() {
|
||||||
|
}),
|
||||||
|
HttpMethod.DELETE,
|
||||||
|
MediaType.APPLICATION_FORM_URLENCODED,
|
||||||
|
API.USER_ACCOUNT_ENDPOINT + API.MODEL_ID_VAR_PATH_SEGMENT);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -40,7 +40,8 @@ public interface BulkActionSupportDAO<T extends Entity> {
|
||||||
* and the type of this BulkActionSupportDAO.
|
* and the type of this BulkActionSupportDAO.
|
||||||
*
|
*
|
||||||
* @param bulkAction the BulkAction to get keys of dependencies for the concrete type of this BulkActionSupportDAO
|
* @param bulkAction the BulkAction to get keys of dependencies for the concrete type of this BulkActionSupportDAO
|
||||||
* @return Collection of Result. Each Result refers to the EntityKey of processed entity or to an error if happened */
|
* @return Collection of Result. Each Result refers to the EntityKey of processed entity or to an error if
|
||||||
|
* happened */
|
||||||
Set<EntityKey> getDependencies(BulkAction bulkAction);
|
Set<EntityKey> getDependencies(BulkAction bulkAction);
|
||||||
|
|
||||||
/** This processed a given BulkAction for all entities of the concrete type of this BulkActionSupportDAO
|
/** This processed a given BulkAction for all entities of the concrete type of this BulkActionSupportDAO
|
||||||
|
@ -97,7 +98,7 @@ public interface BulkActionSupportDAO<T extends Entity> {
|
||||||
* @return List of Result refer to a given error for all given EntityKey instances */
|
* @return List of Result refer to a given error for all given EntityKey instances */
|
||||||
static List<Result<EntityKey>> handleBulkActionError(final Exception error, final Set<EntityKey> all) {
|
static List<Result<EntityKey>> handleBulkActionError(final Exception error, final Set<EntityKey> all) {
|
||||||
return all.stream()
|
return all.stream()
|
||||||
.map(key -> Result.<EntityKey> ofError(new BulkActionEntityException(key)))
|
.map(key -> Result.<EntityKey> ofError(new BulkActionEntityException(key, error)))
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -19,18 +19,23 @@ import java.util.Map;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.context.ApplicationEventPublisher;
|
import org.springframework.context.ApplicationEventPublisher;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
import com.fasterxml.jackson.core.JsonProcessingException;
|
import com.fasterxml.jackson.core.JsonProcessingException;
|
||||||
|
|
||||||
|
import ch.ethz.seb.sebserver.gbl.api.APIMessage;
|
||||||
import ch.ethz.seb.sebserver.gbl.api.EntityType;
|
import ch.ethz.seb.sebserver.gbl.api.EntityType;
|
||||||
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.model.EntityKey;
|
||||||
import ch.ethz.seb.sebserver.gbl.model.EntityProcessingReport;
|
import ch.ethz.seb.sebserver.gbl.model.EntityProcessingReport;
|
||||||
|
import ch.ethz.seb.sebserver.gbl.model.EntityProcessingReport.ErrorEntry;
|
||||||
import ch.ethz.seb.sebserver.gbl.model.user.UserLogActivityType;
|
import ch.ethz.seb.sebserver.gbl.model.user.UserLogActivityType;
|
||||||
import ch.ethz.seb.sebserver.gbl.profile.WebServiceProfile;
|
import ch.ethz.seb.sebserver.gbl.profile.WebServiceProfile;
|
||||||
import ch.ethz.seb.sebserver.gbl.util.Result;
|
import ch.ethz.seb.sebserver.gbl.util.Result;
|
||||||
|
import ch.ethz.seb.sebserver.webservice.servicelayer.bulkaction.BulkActionEntityException;
|
||||||
import ch.ethz.seb.sebserver.webservice.servicelayer.bulkaction.BulkActionService;
|
import ch.ethz.seb.sebserver.webservice.servicelayer.bulkaction.BulkActionService;
|
||||||
import ch.ethz.seb.sebserver.webservice.servicelayer.bulkaction.BulkActionSupportDAO;
|
import ch.ethz.seb.sebserver.webservice.servicelayer.bulkaction.BulkActionSupportDAO;
|
||||||
import ch.ethz.seb.sebserver.webservice.servicelayer.dao.UserActivityLogDAO;
|
import ch.ethz.seb.sebserver.webservice.servicelayer.dao.UserActivityLogDAO;
|
||||||
|
@ -39,6 +44,8 @@ import ch.ethz.seb.sebserver.webservice.servicelayer.dao.UserActivityLogDAO;
|
||||||
@WebServiceProfile
|
@WebServiceProfile
|
||||||
public class BulkActionServiceImpl implements BulkActionService {
|
public class BulkActionServiceImpl implements BulkActionService {
|
||||||
|
|
||||||
|
private static final Logger log = LoggerFactory.getLogger(BulkActionServiceImpl.class);
|
||||||
|
|
||||||
private final EnumMap<EntityType, EnumSet<EntityType>> directDependancyMap =
|
private final EnumMap<EntityType, EnumSet<EntityType>> directDependancyMap =
|
||||||
new EnumMap<>(EntityType.class);
|
new EnumMap<>(EntityType.class);
|
||||||
|
|
||||||
|
@ -134,15 +141,42 @@ public class BulkActionServiceImpl implements BulkActionService {
|
||||||
|
|
||||||
private Result<EntityProcessingReport> createFullReport(final BulkAction action) {
|
private Result<EntityProcessingReport> createFullReport(final BulkAction action) {
|
||||||
return Result.tryCatch(() -> {
|
return Result.tryCatch(() -> {
|
||||||
|
|
||||||
// TODO
|
|
||||||
return new EntityProcessingReport(
|
return new EntityProcessingReport(
|
||||||
action.sources,
|
action.sources,
|
||||||
Collections.emptyList(),
|
action.result.stream()
|
||||||
Collections.emptyList());
|
.map(result -> result.getOr(null))
|
||||||
|
.filter(Objects::nonNull)
|
||||||
|
.collect(Collectors.toList()),
|
||||||
|
action.result.stream()
|
||||||
|
.filter(Result::hasError)
|
||||||
|
.map(this::createErrorEntry)
|
||||||
|
.collect(Collectors.toList()));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private ErrorEntry createErrorEntry(final Result<EntityKey> bulkActionSingleResult) {
|
||||||
|
if (!bulkActionSingleResult.hasError()) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
final Exception error = bulkActionSingleResult.getError();
|
||||||
|
|
||||||
|
log.error(
|
||||||
|
"Unexpected error on bulk action processing. This error is reported to the caller: {}",
|
||||||
|
error.getMessage());
|
||||||
|
|
||||||
|
if (error instanceof BulkActionEntityException) {
|
||||||
|
return new ErrorEntry(
|
||||||
|
((BulkActionEntityException) error).key,
|
||||||
|
APIMessage.ErrorMessage.UNEXPECTED.of(error, error.getMessage()));
|
||||||
|
|
||||||
|
} else {
|
||||||
|
return new ErrorEntry(
|
||||||
|
null,
|
||||||
|
APIMessage.ErrorMessage.UNEXPECTED.of(error, error.getMessage()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void processUserActivityLog(final BulkAction action) {
|
private void processUserActivityLog(final BulkAction action) {
|
||||||
final UserLogActivityType activityType = action.getActivityType();
|
final UserLogActivityType activityType = action.getActivityType();
|
||||||
|
|
||||||
|
|
|
@ -334,6 +334,13 @@ public class UserDAOImpl implements UserDAO {
|
||||||
|
|
||||||
final List<Long> ids = extractListOfPKs(all);
|
final List<Long> ids = extractListOfPKs(all);
|
||||||
|
|
||||||
|
// first delete assigned user roles
|
||||||
|
this.roleRecordMapper.deleteByExample()
|
||||||
|
.where(RoleRecordDynamicSqlSupport.userId, isIn(ids))
|
||||||
|
.build()
|
||||||
|
.execute();
|
||||||
|
|
||||||
|
// then delete the user account
|
||||||
this.userRecordMapper.deleteByExample()
|
this.userRecordMapper.deleteByExample()
|
||||||
.where(UserRecordDynamicSqlSupport.id, isIn(ids))
|
.where(UserRecordDynamicSqlSupport.id, isIn(ids))
|
||||||
.build()
|
.build()
|
||||||
|
|
|
@ -316,9 +316,9 @@ public abstract class EntityController<T extends Entity, M extends Entity> {
|
||||||
.getOrThrow();
|
.getOrThrow();
|
||||||
}
|
}
|
||||||
|
|
||||||
// ******************
|
// ************************
|
||||||
// * DELETE (delete)
|
// * DELETE (hard-delete)
|
||||||
// ******************
|
// ************************
|
||||||
|
|
||||||
@RequestMapping(
|
@RequestMapping(
|
||||||
path = API.MODEL_ID_VAR_PATH_SEGMENT,
|
path = API.MODEL_ID_VAR_PATH_SEGMENT,
|
||||||
|
|
|
@ -20,6 +20,7 @@ import java.util.LinkedHashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
@ -51,6 +52,7 @@ import ch.ethz.seb.sebserver.gbl.model.Domain.SEB_CLIENT_CONFIGURATION;
|
||||||
import ch.ethz.seb.sebserver.gbl.model.EntityKey;
|
import ch.ethz.seb.sebserver.gbl.model.EntityKey;
|
||||||
import ch.ethz.seb.sebserver.gbl.model.EntityName;
|
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.EntityProcessingReport.ErrorEntry;
|
||||||
import ch.ethz.seb.sebserver.gbl.model.Page;
|
import ch.ethz.seb.sebserver.gbl.model.Page;
|
||||||
import ch.ethz.seb.sebserver.gbl.model.exam.Exam;
|
import ch.ethz.seb.sebserver.gbl.model.exam.Exam;
|
||||||
import ch.ethz.seb.sebserver.gbl.model.exam.Exam.ExamStatus;
|
import ch.ethz.seb.sebserver.gbl.model.exam.Exam.ExamStatus;
|
||||||
|
@ -96,6 +98,7 @@ import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.exam.CheckExamCon
|
||||||
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.exam.DeleteExamConfigMapping;
|
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.exam.DeleteExamConfigMapping;
|
||||||
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.exam.ExportExamConfig;
|
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.exam.ExportExamConfig;
|
||||||
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.exam.GetExam;
|
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.exam.GetExam;
|
||||||
|
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.exam.GetExamConfigMapping;
|
||||||
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.exam.GetExamConfigMappingNames;
|
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.exam.GetExamConfigMappingNames;
|
||||||
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.exam.GetExamConfigMappingsPage;
|
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.exam.GetExamConfigMappingsPage;
|
||||||
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.exam.GetExamNames;
|
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.exam.GetExamNames;
|
||||||
|
@ -166,6 +169,7 @@ import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.session.GetRunnin
|
||||||
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.session.PropagateInstruction;
|
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.session.PropagateInstruction;
|
||||||
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.useraccount.ActivateUserAccount;
|
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.ChangePassword;
|
||||||
|
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.useraccount.DeleteUserAccount;
|
||||||
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.useraccount.GetUserAccount;
|
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.GetUserAccountNames;
|
||||||
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.useraccount.GetUserDependency;
|
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.useraccount.GetUserDependency;
|
||||||
|
@ -2325,7 +2329,166 @@ public class UseCasesIntegrationTest extends GuiIntegrationTest {
|
||||||
+ "EntityKey [modelId=1, entityType=INDICATOR], "
|
+ "EntityKey [modelId=1, entityType=INDICATOR], "
|
||||||
+ "EntityKey [modelId=2, entityType=INDICATOR]]",
|
+ "EntityKey [modelId=2, entityType=INDICATOR]]",
|
||||||
dependencies.toString());
|
dependencies.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@Order(19)
|
||||||
|
// *************************************
|
||||||
|
// Use Case 19: Login as examAdmin2 and delete the user examAdmin2 and all its relational data
|
||||||
|
// - First login as examAdmin2 and check that it is not possible to delete the own account
|
||||||
|
public void testUsecase19_DeleteUserDependencies() throws IOException {
|
||||||
|
final RestServiceImpl restService = createRestServiceForUser(
|
||||||
|
"examAdmin2",
|
||||||
|
"examAdmin2",
|
||||||
|
new GetUserAccountNames(),
|
||||||
|
new DeleteUserAccount(),
|
||||||
|
new GetUserAccount(),
|
||||||
|
new GetExam(),
|
||||||
|
new GetExamConfigMapping(),
|
||||||
|
new GetExamConfigNode());
|
||||||
|
|
||||||
|
final EntityName user = restService.getBuilder(GetUserAccountNames.class)
|
||||||
|
.call()
|
||||||
|
.getOrThrow()
|
||||||
|
.stream()
|
||||||
|
.filter(name -> name.name.startsWith("examAdmin2"))
|
||||||
|
.findFirst()
|
||||||
|
.get();
|
||||||
|
|
||||||
|
// try to delete the own user account should result in error message
|
||||||
|
try {
|
||||||
|
restService.getBuilder(DeleteUserAccount.class)
|
||||||
|
.withURIVariable(API.PARAM_MODEL_ID, user.getModelId())
|
||||||
|
.call()
|
||||||
|
.getOrThrow();
|
||||||
|
fail("Forbidden error message expected here");
|
||||||
|
} catch (final RestCallError e) {
|
||||||
|
final APIMessage apiMessage = e.getErrorMessages().get(0);
|
||||||
|
assertEquals("1001", apiMessage.messageCode);
|
||||||
|
assertEquals("FORBIDDEN", apiMessage.systemMessage);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Now login as institutional admin and delete the user account with all dependencies (exam configs and exams)
|
||||||
|
final RestServiceImpl restServiceAdmin = createRestServiceForUser(
|
||||||
|
"TestInstAdmin",
|
||||||
|
"987654321",
|
||||||
|
new GetUserAccountNames(),
|
||||||
|
new DeleteUserAccount(),
|
||||||
|
new GetUserAccount(),
|
||||||
|
new GetExam(),
|
||||||
|
new GetExamConfigMapping(),
|
||||||
|
new GetExamConfigNode());
|
||||||
|
|
||||||
|
final EntityProcessingReport report = restServiceAdmin.getBuilder(DeleteUserAccount.class)
|
||||||
|
.withURIVariable(API.PARAM_MODEL_ID, user.getModelId())
|
||||||
|
.withQueryParam(API.PARAM_BULK_ACTION_INCLUDES, EntityType.EXAM.name())
|
||||||
|
.withQueryParam(API.PARAM_BULK_ACTION_INCLUDES, EntityType.CONFIGURATION_NODE.name())
|
||||||
|
.call()
|
||||||
|
.getOrThrow();
|
||||||
|
|
||||||
|
assertNotNull(report);
|
||||||
|
final List<EntityKey> dependencies = report.getResults()
|
||||||
|
.stream()
|
||||||
|
.sorted()
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
assertEquals(
|
||||||
|
"[EntityKey [modelId=1, entityType=CLIENT_CONNECTION], "
|
||||||
|
+ "EntityKey [modelId=2, entityType=CLIENT_CONNECTION], "
|
||||||
|
+ "EntityKey [modelId=3, entityType=CLIENT_CONNECTION], "
|
||||||
|
+ "EntityKey [modelId=4, entityType=CLIENT_CONNECTION], "
|
||||||
|
+ "EntityKey [modelId=2, entityType=CONFIGURATION_NODE], "
|
||||||
|
+ "EntityKey [modelId=3, entityType=CONFIGURATION_NODE], "
|
||||||
|
+ "EntityKey [modelId=4, entityType=CONFIGURATION_NODE], "
|
||||||
|
+ "EntityKey [modelId=5, entityType=CONFIGURATION_NODE], "
|
||||||
|
+ "EntityKey [modelId=1, entityType=EXAM], "
|
||||||
|
+ "EntityKey [modelId=3, entityType=EXAM_CONFIGURATION_MAP], "
|
||||||
|
+ "EntityKey [modelId=1, entityType=INDICATOR], "
|
||||||
|
+ "EntityKey [modelId=2, entityType=INDICATOR], "
|
||||||
|
+ "EntityKey [modelId=9, entityType=USER]]",
|
||||||
|
dependencies.toString());
|
||||||
|
|
||||||
|
final Set<ErrorEntry> errors = report.getErrors();
|
||||||
|
assertNotNull(errors);
|
||||||
|
assertTrue(errors.isEmpty());
|
||||||
|
|
||||||
|
// test deletion
|
||||||
|
try {
|
||||||
|
restServiceAdmin.getBuilder(GetUserAccount.class)
|
||||||
|
.withURIVariable(API.PARAM_MODEL_ID, user.getModelId())
|
||||||
|
.call()
|
||||||
|
.getOrThrow();
|
||||||
|
fail("no resource found exception expected here");
|
||||||
|
} catch (final RestCallError e) {
|
||||||
|
final APIMessage apiMessage = e.getErrorMessages().get(0);
|
||||||
|
assertEquals("1002", apiMessage.getMessageCode());
|
||||||
|
assertEquals("resource not found", apiMessage.getSystemMessage());
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
restServiceAdmin.getBuilder(GetExam.class)
|
||||||
|
.withURIVariable(API.PARAM_MODEL_ID, "1")
|
||||||
|
.call()
|
||||||
|
.getOrThrow();
|
||||||
|
fail("no resource found exception expected here");
|
||||||
|
} catch (final RestCallError e) {
|
||||||
|
final APIMessage apiMessage = e.getErrorMessages().get(0);
|
||||||
|
assertEquals("1002", apiMessage.getMessageCode());
|
||||||
|
assertEquals("resource not found", apiMessage.getSystemMessage());
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
restServiceAdmin.getBuilder(GetExamConfigMapping.class)
|
||||||
|
.withURIVariable(API.PARAM_MODEL_ID, "3")
|
||||||
|
.call()
|
||||||
|
.getOrThrow();
|
||||||
|
fail("no resource found exception expected here");
|
||||||
|
} catch (final RestCallError e) {
|
||||||
|
final APIMessage apiMessage = e.getErrorMessages().get(0);
|
||||||
|
assertEquals("1002", apiMessage.getMessageCode());
|
||||||
|
assertEquals("resource not found", apiMessage.getSystemMessage());
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
restServiceAdmin.getBuilder(GetExamConfigNode.class)
|
||||||
|
.withURIVariable(API.PARAM_MODEL_ID, "2")
|
||||||
|
.call()
|
||||||
|
.getOrThrow();
|
||||||
|
fail("no resource found exception expected here");
|
||||||
|
} catch (final RestCallError e) {
|
||||||
|
final APIMessage apiMessage = e.getErrorMessages().get(0);
|
||||||
|
assertEquals("1002", apiMessage.getMessageCode());
|
||||||
|
assertEquals("resource not found", apiMessage.getSystemMessage());
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
restServiceAdmin.getBuilder(GetExamConfigNode.class)
|
||||||
|
.withURIVariable(API.PARAM_MODEL_ID, "3")
|
||||||
|
.call()
|
||||||
|
.getOrThrow();
|
||||||
|
fail("no resource found exception expected here");
|
||||||
|
} catch (final RestCallError e) {
|
||||||
|
final APIMessage apiMessage = e.getErrorMessages().get(0);
|
||||||
|
assertEquals("1002", apiMessage.getMessageCode());
|
||||||
|
assertEquals("resource not found", apiMessage.getSystemMessage());
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
restServiceAdmin.getBuilder(GetExamConfigNode.class)
|
||||||
|
.withURIVariable(API.PARAM_MODEL_ID, "4")
|
||||||
|
.call()
|
||||||
|
.getOrThrow();
|
||||||
|
fail("no resource found exception expected here");
|
||||||
|
} catch (final RestCallError e) {
|
||||||
|
final APIMessage apiMessage = e.getErrorMessages().get(0);
|
||||||
|
assertEquals("1002", apiMessage.getMessageCode());
|
||||||
|
assertEquals("resource not found", apiMessage.getSystemMessage());
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
restServiceAdmin.getBuilder(GetExamConfigNode.class)
|
||||||
|
.withURIVariable(API.PARAM_MODEL_ID, "5")
|
||||||
|
.call()
|
||||||
|
.getOrThrow();
|
||||||
|
fail("no resource found exception expected here");
|
||||||
|
} catch (final RestCallError e) {
|
||||||
|
final APIMessage apiMessage = e.getErrorMessages().get(0);
|
||||||
|
assertEquals("1002", apiMessage.getMessageCode());
|
||||||
|
assertEquals("resource not found", apiMessage.getSystemMessage());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -103,7 +103,7 @@ public class LmsSetupAPITest extends AdministrationAPIIntegrationTester {
|
||||||
assertNotNull(report.source);
|
assertNotNull(report.source);
|
||||||
assertTrue(report.source.size() == 1);
|
assertTrue(report.source.size() == 1);
|
||||||
assertEquals(String.valueOf(lmsSetup.id), report.source.iterator().next().modelId);
|
assertEquals(String.valueOf(lmsSetup.id), report.source.iterator().next().modelId);
|
||||||
assertEquals("[]", report.dependencies.toString());
|
assertEquals("[]", report.results.toString());
|
||||||
assertEquals("[]", report.errors.toString());
|
assertEquals("[]", report.errors.toString());
|
||||||
|
|
||||||
// get
|
// get
|
||||||
|
@ -133,7 +133,7 @@ public class LmsSetupAPITest extends AdministrationAPIIntegrationTester {
|
||||||
assertNotNull(report.source);
|
assertNotNull(report.source);
|
||||||
assertTrue(report.source.size() == 1);
|
assertTrue(report.source.size() == 1);
|
||||||
assertEquals(String.valueOf(lmsSetup.id), report.source.iterator().next().modelId);
|
assertEquals(String.valueOf(lmsSetup.id), report.source.iterator().next().modelId);
|
||||||
assertEquals("[]", report.dependencies.toString());
|
assertEquals("[]", report.results.toString());
|
||||||
assertEquals("[]", report.errors.toString());
|
assertEquals("[]", report.errors.toString());
|
||||||
|
|
||||||
lmsSetup = new RestAPITestHelper()
|
lmsSetup = new RestAPITestHelper()
|
||||||
|
@ -162,7 +162,7 @@ public class LmsSetupAPITest extends AdministrationAPIIntegrationTester {
|
||||||
assertNotNull(report.source);
|
assertNotNull(report.source);
|
||||||
assertTrue(report.source.size() == 1);
|
assertTrue(report.source.size() == 1);
|
||||||
assertEquals(String.valueOf(lmsSetup.id), report.source.iterator().next().modelId);
|
assertEquals(String.valueOf(lmsSetup.id), report.source.iterator().next().modelId);
|
||||||
assertEquals("[]", report.dependencies.toString());
|
assertEquals("[]", report.results.toString());
|
||||||
assertEquals("[]", report.errors.toString());
|
assertEquals("[]", report.errors.toString());
|
||||||
|
|
||||||
// get
|
// get
|
||||||
|
|
|
@ -930,7 +930,7 @@ public class UserAPITest extends AdministrationAPIIntegrationTester {
|
||||||
|
|
||||||
assertNotNull(report);
|
assertNotNull(report);
|
||||||
assertNotNull(report.source);
|
assertNotNull(report.source);
|
||||||
assertTrue(report.dependencies.isEmpty()); // TODO
|
assertTrue(report.results.isEmpty()); // TODO
|
||||||
assertTrue(report.errors.isEmpty());
|
assertTrue(report.errors.isEmpty());
|
||||||
assertTrue(report.source.size() == 1);
|
assertTrue(report.source.size() == 1);
|
||||||
|
|
||||||
|
@ -993,7 +993,7 @@ public class UserAPITest extends AdministrationAPIIntegrationTester {
|
||||||
|
|
||||||
assertNotNull(report);
|
assertNotNull(report);
|
||||||
assertNotNull(report.source);
|
assertNotNull(report.source);
|
||||||
assertTrue(report.dependencies.isEmpty()); // TODO
|
assertTrue(report.results.isEmpty()); // TODO
|
||||||
assertTrue(report.errors.isEmpty());
|
assertTrue(report.errors.isEmpty());
|
||||||
assertTrue(report.source.size() == 1);
|
assertTrue(report.source.size() == 1);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue