Unit Tests, automated test keys...
This commit is contained in:
parent
a8291aaa16
commit
11f879ba2c
9 changed files with 176 additions and 3 deletions
|
@ -291,6 +291,7 @@ public class APIMessage implements Serializable {
|
||||||
public final APIMessage apiMessage;
|
public final APIMessage apiMessage;
|
||||||
|
|
||||||
public FieldValidationException(final String fieldName, final String defaultMessage) {
|
public FieldValidationException(final String fieldName, final String defaultMessage) {
|
||||||
|
super(defaultMessage);
|
||||||
this.apiMessage = APIMessage.fieldValidationError(fieldName, defaultMessage);
|
this.apiMessage = APIMessage.fieldValidationError(fieldName, defaultMessage);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -109,6 +109,7 @@ public class ClientCredentialServiceImpl implements ClientCredentialService {
|
||||||
|
|
||||||
if (sequence instanceof CharBuffer) {
|
if (sequence instanceof CharBuffer) {
|
||||||
((CharBuffer) sequence).clear();
|
((CharBuffer) sequence).clear();
|
||||||
|
((CharBuffer) sequence).put(new char[((CharBuffer) sequence).capacity()]);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -58,4 +58,14 @@ public final class ClientCredentials {
|
||||||
public String accessTokenAsString() {
|
public String accessTokenAsString() {
|
||||||
return hasAccessToken() ? this.accessToken.toString() : null;
|
return hasAccessToken() ? this.accessToken.toString() : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
final StringBuilder builder = new StringBuilder();
|
||||||
|
builder.append("ClientCredentials [clientId=");
|
||||||
|
builder.append(this.clientId);
|
||||||
|
builder.append("]");
|
||||||
|
return builder.toString();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -30,6 +30,7 @@ import ch.ethz.seb.sebserver.gui.service.i18n.PolyglotPageService;
|
||||||
import ch.ethz.seb.sebserver.gui.service.page.PageService;
|
import ch.ethz.seb.sebserver.gui.service.page.PageService;
|
||||||
import ch.ethz.seb.sebserver.gui.widget.Selection;
|
import ch.ethz.seb.sebserver.gui.widget.Selection;
|
||||||
import ch.ethz.seb.sebserver.gui.widget.Selection.Type;
|
import ch.ethz.seb.sebserver.gui.widget.Selection.Type;
|
||||||
|
import ch.ethz.seb.sebserver.gui.widget.WidgetFactory;
|
||||||
|
|
||||||
public final class SelectionFieldBuilder extends FieldBuilder<String> {
|
public final class SelectionFieldBuilder extends FieldBuilder<String> {
|
||||||
|
|
||||||
|
@ -110,6 +111,9 @@ public final class SelectionFieldBuilder extends FieldBuilder<String> {
|
||||||
|
|
||||||
label.setLayoutData(gridData);
|
label.setLayoutData(gridData);
|
||||||
label.setText((this.value != null) ? this.value : Constants.EMPTY_NOTE);
|
label.setText((this.value != null) ? this.value : Constants.EMPTY_NOTE);
|
||||||
|
if (this.label != null) {
|
||||||
|
WidgetFactory.setTestId(label, this.label.name);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
final Collection<String> keys = Arrays.asList(StringUtils.split(this.value, Constants.LIST_SEPARATOR));
|
final Collection<String> keys = Arrays.asList(StringUtils.split(this.value, Constants.LIST_SEPARATOR));
|
||||||
this.itemsSupplier.get()
|
this.itemsSupplier.get()
|
||||||
|
@ -156,6 +160,10 @@ public final class SelectionFieldBuilder extends FieldBuilder<String> {
|
||||||
label, this.tooltip);
|
label, this.tooltip);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (this.label != null) {
|
||||||
|
WidgetFactory.setTestId(label, this.label.name + "_" + valueKey);
|
||||||
|
}
|
||||||
|
|
||||||
return label;
|
return label;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -65,6 +65,7 @@ public class FileUploadSelection extends Composite {
|
||||||
final I18nSupport i18nSupport,
|
final I18nSupport i18nSupport,
|
||||||
final Collection<String> supportedFiles,
|
final Collection<String> supportedFiles,
|
||||||
final boolean readonly,
|
final boolean readonly,
|
||||||
|
final String testKey,
|
||||||
final LocTextKey ariaLabel) {
|
final LocTextKey ariaLabel) {
|
||||||
|
|
||||||
super(parent, SWT.NONE);
|
super(parent, SWT.NONE);
|
||||||
|
@ -85,6 +86,9 @@ public class FileUploadSelection extends Composite {
|
||||||
if (ariaLabel != null) {
|
if (ariaLabel != null) {
|
||||||
WidgetFactory.setARIALabel(this.fileName, i18nSupport.getText(ariaLabel));
|
WidgetFactory.setARIALabel(this.fileName, i18nSupport.getText(ariaLabel));
|
||||||
}
|
}
|
||||||
|
if (testKey != null) {
|
||||||
|
WidgetFactory.setTestId(this.fileName, testKey);
|
||||||
|
}
|
||||||
this.fileUpload = null;
|
this.fileUpload = null;
|
||||||
this.uploadHandler = null;
|
this.uploadHandler = null;
|
||||||
this.inputReceiver = null;
|
this.inputReceiver = null;
|
||||||
|
@ -96,6 +100,9 @@ public class FileUploadSelection extends Composite {
|
||||||
if (ariaLabel != null) {
|
if (ariaLabel != null) {
|
||||||
WidgetFactory.setARIALabel(this.fileUpload, i18nSupport.getText(ariaLabel));
|
WidgetFactory.setARIALabel(this.fileUpload, i18nSupport.getText(ariaLabel));
|
||||||
}
|
}
|
||||||
|
if (testKey != null) {
|
||||||
|
WidgetFactory.setTestId(this.fileUpload, testKey);
|
||||||
|
}
|
||||||
WidgetFactory.setARIARole(this.fileUpload, AriaRole.button);
|
WidgetFactory.setARIARole(this.fileUpload, AriaRole.button);
|
||||||
|
|
||||||
this.fileUpload.setToolTipText(Utils.formatLineBreaks(this.i18nSupport.getText(PLEASE_SELECT_TEXT)));
|
this.fileUpload.setToolTipText(Utils.formatLineBreaks(this.i18nSupport.getText(PLEASE_SELECT_TEXT)));
|
||||||
|
|
|
@ -17,6 +17,7 @@ import java.util.List;
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
import java.util.function.Supplier;
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.eclipse.rap.rwt.RWT;
|
import org.eclipse.rap.rwt.RWT;
|
||||||
import org.eclipse.rap.rwt.client.service.JavaScriptExecutor;
|
import org.eclipse.rap.rwt.client.service.JavaScriptExecutor;
|
||||||
import org.eclipse.rap.rwt.widgets.WidgetUtil;
|
import org.eclipse.rap.rwt.widgets.WidgetUtil;
|
||||||
|
@ -966,6 +967,7 @@ public class WidgetFactory {
|
||||||
this.i18nSupport,
|
this.i18nSupport,
|
||||||
supportedFiles,
|
supportedFiles,
|
||||||
readonly,
|
readonly,
|
||||||
|
(label != null) ? label.name : null,
|
||||||
label);
|
label);
|
||||||
|
|
||||||
if (supportedFiles != null) {
|
if (supportedFiles != null) {
|
||||||
|
@ -990,6 +992,10 @@ public class WidgetFactory {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void setAttribute(final Widget widget, final String name, final String value) {
|
public static void setAttribute(final Widget widget, final String name, final String value) {
|
||||||
|
if (StringUtils.isBlank(name) || StringUtils.isBlank(value)) {
|
||||||
|
log.warn("Missing name or value for HTML attribute: name {} value {}", name, value);
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (!widget.isDisposed()) {
|
if (!widget.isDisposed()) {
|
||||||
final String $el = widget instanceof Text ? "$input" : "$el";
|
final String $el = widget instanceof Text ? "$input" : "$el";
|
||||||
final String id = WidgetUtil.getId(widget);
|
final String id = WidgetUtil.getId(widget);
|
||||||
|
|
|
@ -12,18 +12,21 @@ import static org.junit.Assert.*;
|
||||||
import static org.mockito.Mockito.mock;
|
import static org.mockito.Mockito.mock;
|
||||||
import static org.mockito.Mockito.when;
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
|
import java.nio.CharBuffer;
|
||||||
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.springframework.core.env.Environment;
|
import org.springframework.core.env.Environment;
|
||||||
|
|
||||||
import ch.ethz.seb.sebserver.gbl.util.Cryptor;
|
import ch.ethz.seb.sebserver.gbl.util.Cryptor;
|
||||||
import ch.ethz.seb.sebserver.gbl.util.Result;
|
import ch.ethz.seb.sebserver.gbl.util.Result;
|
||||||
|
import ch.ethz.seb.sebserver.gbl.util.Utils;
|
||||||
|
|
||||||
public class ClientCredentialServiceImplTest {
|
public class ClientCredentialServiceImplTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testGeneratedClientCredentials() {
|
public void testGeneratedClientCredentials() {
|
||||||
final Environment envMock = mock(Environment.class);
|
final Environment envMock = mock(Environment.class);
|
||||||
when(envMock.getRequiredProperty("sebserver.webservice.internalSecret"))
|
when(envMock.getProperty("sebserver.webservice.internalSecret"))
|
||||||
.thenReturn("secret1");
|
.thenReturn("secret1");
|
||||||
|
|
||||||
final Cryptor cryptor = new Cryptor(envMock);
|
final Cryptor cryptor = new Cryptor(envMock);
|
||||||
|
@ -38,4 +41,41 @@ public class ClientCredentialServiceImplTest {
|
||||||
assertNull(clientCredentials.accessToken);
|
assertNull(clientCredentials.accessToken);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testAccessToken() {
|
||||||
|
final Environment envMock = mock(Environment.class);
|
||||||
|
when(envMock.getProperty("sebserver.webservice.internalSecret"))
|
||||||
|
.thenReturn("secret1");
|
||||||
|
|
||||||
|
final Cryptor cryptor = new Cryptor(envMock);
|
||||||
|
final ClientCredentialServiceImpl service = new ClientCredentialServiceImpl(cryptor);
|
||||||
|
|
||||||
|
final ClientCredentials cc = service
|
||||||
|
.encryptClientCredentials("", "", "")
|
||||||
|
.getOrThrow();
|
||||||
|
|
||||||
|
assertNotNull(cc);
|
||||||
|
assertNull(cc.accessToken);
|
||||||
|
assertNull(cc.secret);
|
||||||
|
assertEquals("", cc.clientId);
|
||||||
|
|
||||||
|
final ClientCredentials cc2 = service
|
||||||
|
.encryptClientCredentials("c1", "password", "token")
|
||||||
|
.getOrThrow();
|
||||||
|
|
||||||
|
assertNotNull(cc2);
|
||||||
|
assertNotNull(cc2.accessToken);
|
||||||
|
assertNotNull(cc2.secret);
|
||||||
|
assertTrue(cc2.accessToken.length() > "token".length());
|
||||||
|
assertTrue(cc2.secret.length() > "password".length());
|
||||||
|
assertEquals("c1", cc2.clientId);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testClearChars() {
|
||||||
|
final CharBuffer charBuffer = Utils.toCharBuffer(Utils.toByteBuffer("password"));
|
||||||
|
ClientCredentialServiceImpl.clearChars(charBuffer);
|
||||||
|
assertEquals("", String.valueOf(charBuffer));
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,25 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2022 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.gbl.client;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
public class ProxyDataTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCreation() {
|
||||||
|
final ProxyData proxyData = new ProxyData("proxyName", 8080, new ClientCredentials("user1", "password"));
|
||||||
|
assertEquals(
|
||||||
|
"ProxyData [proxyName=proxyName, proxyPort=8080, clientCredentials=ClientCredentials [clientId=user1]]",
|
||||||
|
proxyData.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -8,8 +8,7 @@
|
||||||
|
|
||||||
package ch.ethz.seb.sebserver.webservice.servicelayer.session.impl.proctoring;
|
package ch.ethz.seb.sebserver.webservice.servicelayer.session.impl.proctoring;
|
||||||
|
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.*;
|
||||||
import static org.junit.Assert.assertNotNull;
|
|
||||||
|
|
||||||
import java.security.InvalidKeyException;
|
import java.security.InvalidKeyException;
|
||||||
import java.security.NoSuchAlgorithmException;
|
import java.security.NoSuchAlgorithmException;
|
||||||
|
@ -17,13 +16,66 @@ import java.security.NoSuchAlgorithmException;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.mockito.Mockito;
|
import org.mockito.Mockito;
|
||||||
|
|
||||||
|
import ch.ethz.seb.sebserver.ClientHttpRequestFactoryService;
|
||||||
import ch.ethz.seb.sebserver.gbl.api.JSONMapper;
|
import ch.ethz.seb.sebserver.gbl.api.JSONMapper;
|
||||||
import ch.ethz.seb.sebserver.gbl.model.exam.ProctoringRoomConnection;
|
import ch.ethz.seb.sebserver.gbl.model.exam.ProctoringRoomConnection;
|
||||||
|
import ch.ethz.seb.sebserver.gbl.model.exam.ProctoringServiceSettings;
|
||||||
|
import ch.ethz.seb.sebserver.gbl.model.exam.ProctoringServiceSettings.ProctoringServerType;
|
||||||
|
import ch.ethz.seb.sebserver.gbl.model.user.UserInfo;
|
||||||
import ch.ethz.seb.sebserver.gbl.util.Cryptor;
|
import ch.ethz.seb.sebserver.gbl.util.Cryptor;
|
||||||
import ch.ethz.seb.sebserver.gbl.util.Result;
|
import ch.ethz.seb.sebserver.gbl.util.Result;
|
||||||
|
import ch.ethz.seb.sebserver.webservice.servicelayer.authorization.AuthorizationService;
|
||||||
|
import ch.ethz.seb.sebserver.webservice.servicelayer.authorization.UserService;
|
||||||
|
import ch.ethz.seb.sebserver.webservice.servicelayer.authorization.impl.SEBServerUser;
|
||||||
|
import ch.ethz.seb.sebserver.webservice.servicelayer.session.ExamSessionService;
|
||||||
|
|
||||||
public class ExamJITSIProctoringServiceTest {
|
public class ExamJITSIProctoringServiceTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testType() {
|
||||||
|
final JitsiProctoringService jitsiProctoringService = getMockup();
|
||||||
|
assertEquals(ProctoringServerType.JITSI_MEET, jitsiProctoringService.getType());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testTestExamProctoring() {
|
||||||
|
final JitsiProctoringService jitsiProctoringService = getMockup();
|
||||||
|
|
||||||
|
final ProctoringServiceSettings proctoringServiceSettings = new ProctoringServiceSettings(
|
||||||
|
1L, true, ProctoringServerType.JITSI_MEET, "URL?",
|
||||||
|
null, null, null, null, null, null, null, null);
|
||||||
|
|
||||||
|
final Result<Boolean> testExamProctoring = jitsiProctoringService
|
||||||
|
.testExamProctoring(proctoringServiceSettings);
|
||||||
|
assertNotNull(testExamProctoring);
|
||||||
|
assertTrue(testExamProctoring.hasError());
|
||||||
|
final Exception error = testExamProctoring.getError();
|
||||||
|
assertEquals("proctoringSettings:serverURL:invalidURL", error.getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGetProctorRoomConnection() {
|
||||||
|
final JitsiProctoringService jitsiProctoringService = getMockup();
|
||||||
|
|
||||||
|
final ProctoringServiceSettings proctoringServiceSettings = new ProctoringServiceSettings(
|
||||||
|
1L, true, ProctoringServerType.JITSI_MEET, "http://jitsi.ch",
|
||||||
|
2, null, true, "key", "secret", null, null, false);
|
||||||
|
|
||||||
|
final Result<ProctoringRoomConnection> proctorRoomConnection = jitsiProctoringService
|
||||||
|
.getProctorRoomConnection(proctoringServiceSettings, "TestRoom", "Test-User");
|
||||||
|
assertNotNull(proctorRoomConnection);
|
||||||
|
if (proctorRoomConnection.hasError()) {
|
||||||
|
proctorRoomConnection.getError().printStackTrace();
|
||||||
|
}
|
||||||
|
assertFalse(proctorRoomConnection.hasError());
|
||||||
|
final ProctoringRoomConnection proctoringRoomConnection = proctorRoomConnection.get();
|
||||||
|
assertNotNull(proctoringRoomConnection);
|
||||||
|
assertEquals(
|
||||||
|
"SEBProctoringConnectionData [proctoringServerType=JITSI_MEET, serverHost=jitsi.ch, serverURL=http://jitsi.ch, roomName=TestRoom, subject=Test-User]",
|
||||||
|
proctoringRoomConnection.toString());
|
||||||
|
assertNotNull(proctoringRoomConnection.accessToken);
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testTokenPayload() throws InvalidKeyException, NoSuchAlgorithmException {
|
public void testTokenPayload() throws InvalidKeyException, NoSuchAlgorithmException {
|
||||||
final Cryptor cryptorMock = Mockito.mock(Cryptor.class);
|
final Cryptor cryptorMock = Mockito.mock(Cryptor.class);
|
||||||
|
@ -88,4 +140,27 @@ public class ExamJITSIProctoringServiceTest {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private JitsiProctoringService getMockup() {
|
||||||
|
final UserService userService = Mockito.mock(UserService.class);
|
||||||
|
Mockito.when(userService.getCurrentUser()).thenReturn(new SEBServerUser(1L,
|
||||||
|
new UserInfo("1", 1L, null, "proctor-user", null, null, null, null, null, null, null), ""));
|
||||||
|
|
||||||
|
final AuthorizationService authorizationService = Mockito.mock(AuthorizationService.class);
|
||||||
|
Mockito.when(authorizationService.getUserService()).thenReturn(userService);
|
||||||
|
final ExamSessionService examSessionService = Mockito.mock(ExamSessionService.class);
|
||||||
|
final Cryptor cryptor = Mockito.mock(Cryptor.class);
|
||||||
|
Mockito.when(cryptor.decrypt(Mockito.any())).thenReturn(Result.of("pwd"));
|
||||||
|
|
||||||
|
final ClientHttpRequestFactoryService clientHttpRequestFactoryService =
|
||||||
|
Mockito.mock(ClientHttpRequestFactoryService.class);
|
||||||
|
final JSONMapper jsonMapper = new JSONMapper();
|
||||||
|
|
||||||
|
return new JitsiProctoringService(
|
||||||
|
authorizationService,
|
||||||
|
examSessionService,
|
||||||
|
cryptor,
|
||||||
|
clientHttpRequestFactoryService,
|
||||||
|
jsonMapper);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue