- 1.3-rc2
+ 1.3-rc3
${sebserver-version}
${sebserver-version}
UTF-8
diff --git a/src/main/java/ch/ethz/seb/sebserver/gbl/async/CircuitBreaker.java b/src/main/java/ch/ethz/seb/sebserver/gbl/async/CircuitBreaker.java
index 3f13ea72..2493bb23 100644
--- a/src/main/java/ch/ethz/seb/sebserver/gbl/async/CircuitBreaker.java
+++ b/src/main/java/ch/ethz/seb/sebserver/gbl/async/CircuitBreaker.java
@@ -18,6 +18,7 @@ import org.slf4j.LoggerFactory;
import ch.ethz.seb.sebserver.gbl.Constants;
import ch.ethz.seb.sebserver.gbl.util.Result;
+import ch.ethz.seb.sebserver.gbl.util.Utils;
/** A circuit breaker with three states (CLOSED, HALF_OPEN, OPEN)
*
@@ -70,6 +71,7 @@ public final class CircuitBreaker {
private State state = State.CLOSED;
private final AtomicInteger failingCount = new AtomicInteger(0);
private long lastSuccessTime;
+ private long lastOpenTime;
/** Create new CircuitBreakerSupplier.
*
@@ -99,6 +101,8 @@ public final class CircuitBreaker {
this.maxFailingAttempts = maxFailingAttempts;
this.maxBlockingTime = maxBlockingTime;
this.timeToRecover = timeToRecover;
+ // Initialize with creation time to get expected cool-down phase time if never was successful since
+ this.lastOpenTime = Utils.getMillisecondsNow();
}
public int getMaxFailingAttempts() {
@@ -122,7 +126,7 @@ public final class CircuitBreaker {
}
public synchronized Result protectedRun(final Supplier supplier) {
- final long currentTime = System.currentTimeMillis();
+ final long currentTime = Utils.getMillisecondsNow();
if (log.isDebugEnabled()) {
log.debug("Called on: {} current state is: {} failing count: {}",
@@ -163,7 +167,7 @@ public final class CircuitBreaker {
log.debug("Attempt failed. failing count: {}", this.failingCount);
}
- final long currentBlockingTime = System.currentTimeMillis() - startTime;
+ final long currentBlockingTime = Utils.getMillisecondsNow() - startTime;
final int failing = this.failingCount.incrementAndGet();
if (failing > this.maxFailingAttempts || currentBlockingTime > this.maxBlockingTime) {
// brake thought to HALF_OPEN state and return error
@@ -174,14 +178,14 @@ public final class CircuitBreaker {
this.state = State.HALF_OPEN;
this.failingCount.set(0);
return Result.ofError(new RuntimeException(
- "Set CircuitBeaker to half-open state. Cause: " + result.getError().getMessage(),
+ "Set CircuitBeaker to half-open state. Cause: " + result.getError(),
result.getError()));
} else {
// try again
return protectedRun(supplier);
}
} else {
- this.lastSuccessTime = System.currentTimeMillis();
+ this.lastSuccessTime = Utils.getMillisecondsNow();
return result;
}
}
@@ -202,9 +206,10 @@ public final class CircuitBreaker {
log.debug("Changing state from Half Open to Open and return cached value");
}
+ this.lastOpenTime = Utils.getMillisecondsNow();
this.state = State.OPEN;
return Result.ofError(new RuntimeException(
- "Set CircuitBeaker to open state. Cause: " + result.getError().getMessage(),
+ "Set CircuitBeaker to open state. Cause: " + result.getError(),
result.getError()));
} else {
// on success go to CLOSED state
@@ -228,7 +233,7 @@ public final class CircuitBreaker {
log.debug("Handle Open on: {}", startTime);
}
- if (startTime - this.lastSuccessTime >= this.timeToRecover) {
+ if (startTime - this.lastOpenTime >= this.timeToRecover) {
// if cool-down period is over, go back to HALF_OPEN state and try again
if (log.isDebugEnabled()) {
log.debug("Time to recover reached. Changing state from Open to Half Open");
@@ -247,6 +252,7 @@ public final class CircuitBreaker {
return Result.of(future.get(this.maxBlockingTime, TimeUnit.MILLISECONDS));
} catch (final Exception e) {
future.cancel(false);
+ log.warn("Max blocking timeout exceeded: {}, {}", this.maxBlockingTime, this.state);
return Result.ofError(e);
}
}
diff --git a/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/dao/impl/ExamDAOImpl.java b/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/dao/impl/ExamDAOImpl.java
index f03910fb..f9f1d6bb 100644
--- a/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/dao/impl/ExamDAOImpl.java
+++ b/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/dao/impl/ExamDAOImpl.java
@@ -818,7 +818,8 @@ public class ExamDAOImpl implements ExamDAO {
log.debug("Using short-name: {} for recovering", shortname);
- final QuizData recoveredQuizData = this.lmsAPIService.getLmsAPITemplate(lmsSetup.id)
+ final QuizData recoveredQuizData = this.lmsAPIService
+ .getLmsAPITemplate(lmsSetup.id)
.map(template -> template.getQuizzes(new FilterMap())
.getOrThrow()
.stream()
diff --git a/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/lms/impl/AbstractCourseAccess.java b/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/lms/impl/AbstractCourseAccess.java
index c1bc7ffe..5a5f3a3c 100644
--- a/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/lms/impl/AbstractCourseAccess.java
+++ b/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/lms/impl/AbstractCourseAccess.java
@@ -80,7 +80,7 @@ public abstract class AbstractCourseAccess {
environment.getProperty(
"sebserver.webservice.circuitbreaker.quizzesRequest.blockingTime",
Long.class,
- Constants.MINUTE_IN_MILLIS),
+ Constants.SECOND_IN_MILLIS * 10),
environment.getProperty(
"sebserver.webservice.circuitbreaker.quizzesRequest.timeToRecover",
Long.class,
@@ -94,7 +94,7 @@ public abstract class AbstractCourseAccess {
environment.getProperty(
"sebserver.webservice.circuitbreaker.quizzesRequest.blockingTime",
Long.class,
- Constants.MINUTE_IN_MILLIS),
+ Constants.SECOND_IN_MILLIS * 10),
environment.getProperty(
"sebserver.webservice.circuitbreaker.quizzesRequest.timeToRecover",
Long.class,
@@ -112,7 +112,7 @@ public abstract class AbstractCourseAccess {
environment.getProperty(
"sebserver.webservice.circuitbreaker.chaptersRequest.timeToRecover",
Long.class,
- Constants.MINUTE_IN_MILLIS));
+ Constants.SECOND_IN_MILLIS * 30));
this.accountDetailRequest = asyncService.createCircuitBreaker(
environment.getProperty(
@@ -126,19 +126,28 @@ public abstract class AbstractCourseAccess {
environment.getProperty(
"sebserver.webservice.circuitbreaker.accountDetailRequest.timeToRecover",
Long.class,
- Constants.SECOND_IN_MILLIS * 10));
+ Constants.SECOND_IN_MILLIS * 30));
}
public Result> protectedQuizzesRequest(final FilterMap filterMap) {
- return this.allQuizzesRequest.protectedRun(allQuizzesSupplier(filterMap));
+ return this.allQuizzesRequest.protectedRun(allQuizzesSupplier(filterMap))
+ .onError(error -> log.error(
+ "Failed to run protectedQuizzesRequest: {}",
+ error.getMessage()));
}
public Result> protectedQuizzesRequest(final Set ids) {
- return this.quizzesRequest.protectedRun(quizzesSupplier(ids));
+ return this.quizzesRequest.protectedRun(quizzesSupplier(ids))
+ .onError(error -> log.error(
+ "Failed to run protectedQuizzesRequest: {}",
+ error.getMessage()));
}
public Result protectedQuizRequest(final String id) {
- return this.quizRequest.protectedRun(quizSupplier(id));
+ return this.quizRequest.protectedRun(quizSupplier(id))
+ .onError(error -> log.error(
+ "Failed to run protectedQuizRequest: {}",
+ error.getMessage()));
}
public Result getExamineeAccountDetails(final String examineeSessionId) {
@@ -165,7 +174,10 @@ public abstract class AbstractCourseAccess {
}
public Result getCourseChapters(final String courseId) {
- return this.chaptersRequest.protectedRun(getCourseChaptersSupplier(courseId));
+ return this.chaptersRequest.protectedRun(getCourseChaptersSupplier(courseId))
+ .onError(error -> log.error(
+ "Failed to run getCourseChapters: {}",
+ error.getMessage()));
}
protected abstract Supplier accountDetailsSupplier(final String examineeSessionId);
diff --git a/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/lms/impl/mockup/MockLmsAPITemplateFactory.java b/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/lms/impl/mockup/MockLmsAPITemplateFactory.java
index 2cf628c5..032e7d6a 100644
--- a/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/lms/impl/mockup/MockLmsAPITemplateFactory.java
+++ b/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/lms/impl/mockup/MockLmsAPITemplateFactory.java
@@ -9,8 +9,10 @@
package ch.ethz.seb.sebserver.webservice.servicelayer.lms.impl.mockup;
import org.springframework.context.annotation.Lazy;
+import org.springframework.core.env.Environment;
import org.springframework.stereotype.Service;
+import ch.ethz.seb.sebserver.gbl.async.AsyncService;
import ch.ethz.seb.sebserver.gbl.model.institution.LmsSetup.LmsType;
import ch.ethz.seb.sebserver.gbl.profile.WebServiceProfile;
import ch.ethz.seb.sebserver.gbl.util.Result;
@@ -24,9 +26,17 @@ import ch.ethz.seb.sebserver.webservice.servicelayer.lms.LmsAPITemplateFactory;
@WebServiceProfile
public class MockLmsAPITemplateFactory implements LmsAPITemplateFactory {
+ private final AsyncService asyncService;
private final WebserviceInfo webserviceInfo;
+ private final Environment environment;
- public MockLmsAPITemplateFactory(final WebserviceInfo webserviceInfo) {
+ public MockLmsAPITemplateFactory(
+ final AsyncService asyncService,
+ final Environment environment,
+ final WebserviceInfo webserviceInfo) {
+
+ this.environment = environment;
+ this.asyncService = asyncService;
this.webserviceInfo = webserviceInfo;
}
@@ -38,6 +48,8 @@ public class MockLmsAPITemplateFactory implements LmsAPITemplateFactory {
@Override
public Result create(final APITemplateDataSupplier apiTemplateDataSupplier) {
return Result.tryCatch(() -> new MockupLmsAPITemplate(
+ this.asyncService,
+ this.environment,
apiTemplateDataSupplier,
this.webserviceInfo));
}
diff --git a/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/lms/impl/mockup/MockupLmsAPITemplate.java b/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/lms/impl/mockup/MockupLmsAPITemplate.java
index fd039f43..cb369e82 100644
--- a/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/lms/impl/mockup/MockupLmsAPITemplate.java
+++ b/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/lms/impl/mockup/MockupLmsAPITemplate.java
@@ -12,6 +12,7 @@ import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Set;
+import java.util.function.Supplier;
import java.util.stream.Collectors;
import org.apache.commons.lang3.StringUtils;
@@ -19,9 +20,11 @@ import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import org.springframework.core.env.Environment;
import ch.ethz.seb.sebserver.gbl.Constants;
import ch.ethz.seb.sebserver.gbl.api.APIMessage;
+import ch.ethz.seb.sebserver.gbl.async.AsyncService;
import ch.ethz.seb.sebserver.gbl.client.ClientCredentials;
import ch.ethz.seb.sebserver.gbl.model.Domain.LMS_SETUP;
import ch.ethz.seb.sebserver.gbl.model.exam.Chapters;
@@ -38,6 +41,7 @@ import ch.ethz.seb.sebserver.webservice.servicelayer.dao.FilterMap;
import ch.ethz.seb.sebserver.webservice.servicelayer.lms.APITemplateDataSupplier;
import ch.ethz.seb.sebserver.webservice.servicelayer.lms.LmsAPIService;
import ch.ethz.seb.sebserver.webservice.servicelayer.lms.LmsAPITemplate;
+import ch.ethz.seb.sebserver.webservice.servicelayer.lms.impl.AbstractCourseAccess;
import ch.ethz.seb.sebserver.webservice.servicelayer.lms.impl.NoSEBRestrictionException;
public class MockupLmsAPITemplate implements LmsAPITemplate {
@@ -48,7 +52,11 @@ public class MockupLmsAPITemplate implements LmsAPITemplate {
private final WebserviceInfo webserviceInfo;
private final APITemplateDataSupplier apiTemplateDataSupplier;
+ private final AbstractCourseAccess abstractCourseAccess;
+
MockupLmsAPITemplate(
+ final AsyncService asyncService,
+ final Environment environment,
final APITemplateDataSupplier apiTemplateDataSupplier,
final WebserviceInfo webserviceInfo) {
@@ -56,6 +64,37 @@ public class MockupLmsAPITemplate implements LmsAPITemplate {
this.webserviceInfo = webserviceInfo;
this.mockups = new ArrayList<>();
+ this.abstractCourseAccess = new AbstractCourseAccess(asyncService, environment) {
+
+ @Override
+ protected Supplier accountDetailsSupplier(final String examineeSessionId) {
+ return () -> MockupLmsAPITemplate.this
+ .getExamineeAccountDetails_protected(examineeSessionId)
+ .getOrThrow();
+ }
+
+ @Override
+ protected Supplier> allQuizzesSupplier(final FilterMap filterMap) {
+ return () -> MockupLmsAPITemplate.this.getQuizzes_protected(filterMap).getOrThrow();
+ }
+
+ @Override
+ protected Supplier> quizzesSupplier(final Set ids) {
+ return () -> MockupLmsAPITemplate.this.getQuizzes_protected(ids).getOrThrow();
+ }
+
+ @Override
+ protected Supplier quizSupplier(final String id) {
+ return () -> MockupLmsAPITemplate.this.getQuiz_protected(id).getOrThrow();
+ }
+
+ @Override
+ protected Supplier getCourseChaptersSupplier(final String courseId) {
+ return () -> MockupLmsAPITemplate.this.getCourseChapters_protected(courseId).getOrThrow();
+ }
+
+ };
+
final LmsSetup lmsSetup = this.apiTemplateDataSupplier.getLmsSetup();
final Long lmsSetupId = lmsSetup.id;
final Long institutionId = lmsSetup.getInstitutionId();
@@ -149,6 +188,10 @@ public class MockupLmsAPITemplate implements LmsAPITemplate {
@Override
public Result> getQuizzes(final FilterMap filterMap) {
+ return this.abstractCourseAccess.protectedQuizzesRequest(filterMap);
+ }
+
+ private Result> getQuizzes_protected(final FilterMap filterMap) {
return Result.tryCatch(() -> {
if (!authenticate()) {
throw new IllegalArgumentException("Wrong clientId or secret");
@@ -164,6 +207,10 @@ public class MockupLmsAPITemplate implements LmsAPITemplate {
@Override
public Result getQuiz(final String id) {
+ return this.abstractCourseAccess.protectedQuizRequest(id);
+ }
+
+ private Result getQuiz_protected(final String id) {
return Result.of(this.mockups
.stream()
.filter(q -> id.equals(q.id))
@@ -173,6 +220,11 @@ public class MockupLmsAPITemplate implements LmsAPITemplate {
@Override
public Result> getQuizzes(final Set ids) {
+ return this.abstractCourseAccess.protectedQuizzesRequest(ids);
+ }
+
+ private Result> getQuizzes_protected(final Set ids) {
+
return Result.tryCatch(() -> {
if (!authenticate()) {
throw new IllegalArgumentException("Wrong clientId or secret");
@@ -193,11 +245,19 @@ public class MockupLmsAPITemplate implements LmsAPITemplate {
@Override
public Result getCourseChapters(final String courseId) {
+ return this.abstractCourseAccess.getCourseChapters(courseId);
+ }
+
+ private Result getCourseChapters_protected(final String courseId) {
return Result.ofError(new UnsupportedOperationException());
}
@Override
public Result getExamineeAccountDetails(final String examineeSessionId) {
+ return this.abstractCourseAccess.getExamineeAccountDetails(examineeSessionId);
+ }
+
+ private Result getExamineeAccountDetails_protected(final String examineeSessionId) {
return Result.ofError(new UnsupportedOperationException());
}
diff --git a/src/test/java/ch/ethz/seb/sebserver/ClientHttpRequestFactoryServiceTest.java b/src/test/java/ch/ethz/seb/sebserver/ClientHttpRequestFactoryServiceTest.java
new file mode 100644
index 00000000..d6a7bab2
--- /dev/null
+++ b/src/test/java/ch/ethz/seb/sebserver/ClientHttpRequestFactoryServiceTest.java
@@ -0,0 +1,89 @@
+/*
+ * 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;
+
+import static org.junit.Assert.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.springframework.core.env.Environment;
+import org.springframework.http.client.ClientHttpRequestFactory;
+import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
+
+import ch.ethz.seb.sebserver.gbl.client.ClientCredentialService;
+import ch.ethz.seb.sebserver.gbl.client.ClientCredentials;
+import ch.ethz.seb.sebserver.gbl.client.ProxyData;
+import ch.ethz.seb.sebserver.gbl.util.Result;
+
+public class ClientHttpRequestFactoryServiceTest {
+
+ @Mock
+ Environment environment;
+ @Mock
+ ClientCredentialService clientCredentialService;
+
+ @Before
+ public void initMocks() {
+ MockitoAnnotations.initMocks(this);
+ }
+
+ @Test
+ public void testGetClientHttpRequestFactory() {
+
+ final ClientHttpRequestFactoryService clientHttpRequestFactoryService = new ClientHttpRequestFactoryService(
+ this.environment,
+ this.clientCredentialService,
+ 1, 1, 1);
+
+ final ProxyData proxyData = new ProxyData("testPoxy", 8000, new ClientCredentials("test", "test"));
+
+ Mockito.when(this.environment.getActiveProfiles()).thenReturn(new String[] { "dev-gui", "test" });
+ Mockito.when(this.clientCredentialService.getPlainClientSecret(Mockito.any())).thenReturn(Result.of("test"));
+
+ Result clientHttpRequestFactory = clientHttpRequestFactoryService
+ .getClientHttpRequestFactory();
+
+ assertNotNull(clientHttpRequestFactory);
+ assertFalse(clientHttpRequestFactory.hasError());
+ ClientHttpRequestFactory instance = clientHttpRequestFactory.get();
+ assertTrue(instance instanceof HttpComponentsClientHttpRequestFactory);
+
+ clientHttpRequestFactory = clientHttpRequestFactoryService
+ .getClientHttpRequestFactory(proxyData);
+
+ assertNotNull(clientHttpRequestFactory);
+ assertFalse(clientHttpRequestFactory.hasError());
+ instance = clientHttpRequestFactory.get();
+ assertTrue(instance instanceof HttpComponentsClientHttpRequestFactory);
+
+ Mockito.when(this.environment.getActiveProfiles()).thenReturn(new String[] { "prod-gui", "prod-ws" });
+
+ clientHttpRequestFactory = clientHttpRequestFactoryService
+ .getClientHttpRequestFactory();
+
+ assertNotNull(clientHttpRequestFactory);
+ assertFalse(clientHttpRequestFactory.hasError());
+ instance = clientHttpRequestFactory.get();
+ assertTrue(instance instanceof HttpComponentsClientHttpRequestFactory);
+
+ clientHttpRequestFactory = clientHttpRequestFactoryService
+ .getClientHttpRequestFactory(proxyData);
+
+ assertNotNull(clientHttpRequestFactory);
+ assertFalse(clientHttpRequestFactory.hasError());
+ instance = clientHttpRequestFactory.get();
+ assertTrue(instance instanceof HttpComponentsClientHttpRequestFactory);
+ }
+
+}
diff --git a/src/test/java/ch/ethz/seb/sebserver/gbl/async/CircuitBreakerTest.java b/src/test/java/ch/ethz/seb/sebserver/gbl/async/CircuitBreakerTest.java
index f3a00e40..ee69e441 100644
--- a/src/test/java/ch/ethz/seb/sebserver/gbl/async/CircuitBreakerTest.java
+++ b/src/test/java/ch/ethz/seb/sebserver/gbl/async/CircuitBreakerTest.java
@@ -76,7 +76,7 @@ public class CircuitBreakerTest {
assertEquals(CircuitBreaker.OPEN_STATE_EXCEPTION, result.getError());
// wait time to recover
- Thread.sleep(500);
+ Thread.sleep(1000);
result = circuitBreaker.protectedRun(tester); // 11. call...
assertEquals(State.CLOSED, circuitBreaker.getState());
assertEquals("Hello back again", result.get());
diff --git a/src/test/java/ch/ethz/seb/sebserver/gbl/async/MemoizingCircuitBreakerTest.java b/src/test/java/ch/ethz/seb/sebserver/gbl/async/MemoizingCircuitBreakerTest.java
index ab239a23..6b96f907 100644
--- a/src/test/java/ch/ethz/seb/sebserver/gbl/async/MemoizingCircuitBreakerTest.java
+++ b/src/test/java/ch/ethz/seb/sebserver/gbl/async/MemoizingCircuitBreakerTest.java
@@ -77,7 +77,7 @@ public class MemoizingCircuitBreakerTest {
assertEquals(State.OPEN, circuitBreaker.getState());
// wait time to recover
- Thread.sleep(500);
+ Thread.sleep(1000);
result = circuitBreaker.get(); // 11. call...
assertEquals(State.CLOSED, circuitBreaker.getState());
assertEquals("Hello back again", result.get());
diff --git a/src/test/java/ch/ethz/seb/sebserver/webservice/integration/api/admin/WebserviceInfoTest.java b/src/test/java/ch/ethz/seb/sebserver/webservice/integration/api/admin/WebserviceInfoTest.java
new file mode 100644
index 00000000..72974be5
--- /dev/null
+++ b/src/test/java/ch/ethz/seb/sebserver/webservice/integration/api/admin/WebserviceInfoTest.java
@@ -0,0 +1,69 @@
+/*
+ * 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.webservice.integration.api.admin;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+import java.util.Collection;
+
+import org.junit.Test;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.HttpStatus;
+import org.springframework.test.context.jdbc.Sql;
+
+import com.fasterxml.jackson.core.type.TypeReference;
+
+import ch.ethz.seb.sebserver.gbl.api.API;
+import ch.ethz.seb.sebserver.gbl.model.EntityName;
+
+@Sql(scripts = { "classpath:schema-test.sql", "classpath:data-test.sql" })
+public class WebserviceInfoTest extends AdministrationAPIIntegrationTester {
+
+ @Test
+ public void testGetLogo() throws Exception {
+ String result = new RestAPITestHelper()
+ .withAccessToken(getAdminInstitution1Access())
+ .withPath(API.INFO_ENDPOINT + API.LOGO_PATH_SEGMENT)
+ .withPath("/inst1")
+ .withMethod(HttpMethod.GET)
+ .withExpectedStatus(HttpStatus.OK)
+ .getAsString();
+
+ assertEquals("", result);
+
+ result = new RestAPITestHelper()
+ .withAccessToken(getAdminInstitution1Access())
+ .withPath(API.INFO_ENDPOINT + API.LOGO_PATH_SEGMENT)
+ .withPath("/inst2")
+ .withMethod(HttpMethod.GET)
+ .withExpectedStatus(HttpStatus.OK)
+ .getAsString();
+
+ assertEquals("AAA", result);
+ }
+
+ @Test
+ public void test_getInstitutionInfo() throws Exception {
+
+ final Collection result = new RestAPITestHelper()
+ .withAccessToken(getAdminInstitution1Access())
+ .withPath(API.INFO_ENDPOINT + API.INFO_INST_PATH_SEGMENT)
+ .withMethod(HttpMethod.GET)
+ .withExpectedStatus(HttpStatus.OK)
+ .getAsObject(new TypeReference>() {
+ });
+
+ assertNotNull(result);
+ assertTrue(result.stream().filter(en -> "Institution1".equals(en.name)).findFirst().isPresent());
+ assertTrue(result.stream().filter(en -> "Institution2".equals(en.name)).findFirst().isPresent());
+ assertFalse(result.stream().filter(en -> "Institution3".equals(en.name)).findFirst().isPresent());
+
+ }
+
+}
diff --git a/src/test/resources/data-test.sql b/src/test/resources/data-test.sql
index 93a9b3aa..27e07aed 100644
--- a/src/test/resources/data-test.sql
+++ b/src/test/resources/data-test.sql
@@ -1,6 +1,6 @@
INSERT INTO institution VALUES
(1, 'Institution1', 'inst1', null, null, 1),
- (2, 'Institution2', 'inst2', null, null, 1),
+ (2, 'Institution2', 'inst2', 'AAA', null, 1),
(3, 'Institution3', 'inst3', null, null, 0)
;