diff --git a/src/main/java/ch/ethz/seb/sebserver/gbl/client/ClientCredentialServiceImpl.java b/src/main/java/ch/ethz/seb/sebserver/gbl/client/ClientCredentialServiceImpl.java index 79f632a1..caa7b297 100644 --- a/src/main/java/ch/ethz/seb/sebserver/gbl/client/ClientCredentialServiceImpl.java +++ b/src/main/java/ch/ethz/seb/sebserver/gbl/client/ClientCredentialServiceImpl.java @@ -61,7 +61,7 @@ public class ClientCredentialServiceImpl implements ClientCredentialService { @Override public Result getPlainClientSecret(final ClientCredentials credentials) { if (credentials == null || !credentials.hasSecret()) { - return null; + return Result.ofRuntimeError("ClientCredentials has no secret"); } return this.cryptor.decrypt(credentials.secret); diff --git a/src/main/java/ch/ethz/seb/sebserver/gbl/util/Utils.java b/src/main/java/ch/ethz/seb/sebserver/gbl/util/Utils.java index 41ba7cdf..79b150b5 100644 --- a/src/main/java/ch/ethz/seb/sebserver/gbl/util/Utils.java +++ b/src/main/java/ch/ethz/seb/sebserver/gbl/util/Utils.java @@ -658,7 +658,7 @@ public final class Utils { (sb, entry) -> { final String name = entry.getKey(); final List values = entry.getValue(); - if (values == null || values.isEmpty()) { + if (values == null) { return sb; } if (sb.length() > 0) { diff --git a/src/main/java/ch/ethz/seb/sebserver/gui/content/exam/LmsSetupForm.java b/src/main/java/ch/ethz/seb/sebserver/gui/content/exam/LmsSetupForm.java index e01f76ee..f0644b52 100644 --- a/src/main/java/ch/ethz/seb/sebserver/gui/content/exam/LmsSetupForm.java +++ b/src/main/java/ch/ethz/seb/sebserver/gui/content/exam/LmsSetupForm.java @@ -76,6 +76,8 @@ public class LmsSetupForm implements TemplateComposer { new LocTextKey("sebserver.lmssetup.form.secret.lms"); private static final LocTextKey FORM_CLIENTNAME_LMS_TEXT_KEY = new LocTextKey("sebserver.lmssetup.form.clientname.lms"); + private static final LocTextKey FORM_TOKEN_LMS_TEXT_KEY = + new LocTextKey("sebserver.lmssetup.form.accesstoken.lms"); private static final LocTextKey FORM_URL_TEXT_KEY = new LocTextKey("sebserver.lmssetup.form.url"); private static final LocTextKey FORM_TYPE_TEXT_KEY = @@ -227,6 +229,13 @@ public class LmsSetupForm implements TemplateComposer { .asPasswordField() .mandatory(!readonly)) + .addFieldIf( + isEdit, + () -> FormBuilder.text( + Domain.LMS_SETUP.ATTR_LMS_REST_API_TOKEN, + FORM_TOKEN_LMS_TEXT_KEY) + .mandatory(!readonly)) + .addFieldIf( isEdit, () -> FormBuilder.checkbox( diff --git a/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/dao/impl/LmsSetupDAOImpl.java b/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/dao/impl/LmsSetupDAOImpl.java index 8f11855d..f6fd53d9 100644 --- a/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/dao/impl/LmsSetupDAOImpl.java +++ b/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/dao/impl/LmsSetupDAOImpl.java @@ -178,7 +178,7 @@ public class LmsSetupDAOImpl implements LmsSetupDAO { final ClientCredentials proxyCredentials = createProxyClientCredentials(lmsSetup); final LmsSetupRecord newRecord = new LmsSetupRecord( lmsSetup.id, - null, + lmsSetup.institutionId, lmsSetup.name, (lmsSetup.lmsType != null) ? lmsSetup.lmsType.name() : null, lmsSetup.lmsApiUrl, @@ -196,7 +196,7 @@ public class LmsSetupDAOImpl implements LmsSetupDAO { System.currentTimeMillis(), savedRecord.getActive()); - this.lmsSetupRecordMapper.updateByPrimaryKeySelective(newRecord); + this.lmsSetupRecordMapper.updateByPrimaryKey(newRecord); return this.lmsSetupRecordMapper.selectByPrimaryKey(lmsSetup.id); }) .flatMap(this::toDomainModel) diff --git a/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/lms/impl/moodle/MoodleRestTemplateFactory.java b/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/lms/impl/moodle/MoodleRestTemplateFactory.java index 0f388f55..91291d80 100644 --- a/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/lms/impl/moodle/MoodleRestTemplateFactory.java +++ b/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/lms/impl/moodle/MoodleRestTemplateFactory.java @@ -14,16 +14,34 @@ import ch.ethz.seb.sebserver.gbl.model.institution.LmsSetupTestResult; import ch.ethz.seb.sebserver.gbl.util.Result; import ch.ethz.seb.sebserver.webservice.servicelayer.lms.APITemplateDataSupplier; +/** Defines a MoodleAPIRestTemplate factory for moodle */ public interface MoodleRestTemplateFactory { + /** Use this to test the LMSSetup input for MoodleAPIRestTemplate + * + * @return LmsSetupTestResult containing the result of the test */ LmsSetupTestResult test(); + /** Get the LMSSetup data supplier for this factory. + * + * @return APITemplateDataSupplier */ APITemplateDataSupplier getApiTemplateDataSupplier(); + /** Get all known, defined API access token request paths. + * + * @return Set of known and configured API access token paths */ Set getKnownTokenAccessPaths(); + /** Creates a MoodleAPIRestTemplate for the bundled LMSSetup of this factory. + * + * @return Result refer to the MoodleAPIRestTemplate or to an error when happened */ Result createRestTemplate(); + /** Creates a MoodleAPIRestTemplate for the bundled LMSSetup of this factory. + * Uses specified access token request path to request an access token. + * + * @param accessTokenPath access token request path to request an access token + * @return Result refer to the MoodleAPIRestTemplate or to an error when happened */ Result createRestTemplate(final String accessTokenPath); } diff --git a/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/lms/impl/moodle/MoodleRestTemplateFactoryImpl.java b/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/lms/impl/moodle/MoodleRestTemplateFactoryImpl.java index 00c41ade..b086e245 100644 --- a/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/lms/impl/moodle/MoodleRestTemplateFactoryImpl.java +++ b/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/lms/impl/moodle/MoodleRestTemplateFactoryImpl.java @@ -114,15 +114,17 @@ public class MoodleRestTemplateFactoryImpl implements MoodleRestTemplateFactory } if (StringUtils.isBlank(lmsSetup.lmsRestApiToken)) { - if (!credentials.hasClientId()) { - missingAttrs.add(APIMessage.fieldValidationError( - LMS_SETUP.ATTR_LMS_CLIENTNAME, - "lmsSetup:lmsClientname:notNull")); - } - if (!credentials.hasSecret()) { - missingAttrs.add(APIMessage.fieldValidationError( - LMS_SETUP.ATTR_LMS_CLIENTSECRET, - "lmsSetup:lmsClientsecret:notNull")); + if (!credentials.hasAccessToken()) { + if (!credentials.hasClientId()) { + missingAttrs.add(APIMessage.fieldValidationError( + LMS_SETUP.ATTR_LMS_CLIENTNAME, + "lmsSetup:lmsClientname:notNull")); + } + if (!credentials.hasSecret()) { + missingAttrs.add(APIMessage.fieldValidationError( + LMS_SETUP.ATTR_LMS_CLIENTSECRET, + "lmsSetup:lmsClientsecret:notNull")); + } } } @@ -170,14 +172,17 @@ public class MoodleRestTemplateFactoryImpl implements MoodleRestTemplateFactory final CharSequence plainClientId = credentials.clientId; final CharSequence plainClientSecret = this.clientCredentialService .getPlainClientSecret(credentials) - .getOrThrow(); + .getOr(StringUtils.EMPTY); + final CharSequence plainAPIToken = this.clientCredentialService + .getPlainAccessToken(credentials) + .getOr(StringUtils.EMPTY); final MoodleAPIRestTemplateImpl restTemplate = new MoodleAPIRestTemplateImpl( this.jsonMapper, this.apiTemplateDataSupplier, lmsSetup.lmsApiUrl, accessTokenPath, - lmsSetup.lmsRestApiToken, + plainAPIToken, plainClientId, plainClientSecret); @@ -200,6 +205,7 @@ public class MoodleRestTemplateFactoryImpl implements MoodleRestTemplateFactory public static class MoodleAPIRestTemplateImpl extends RestTemplate implements MoodleAPIRestTemplate { + private static final String MOODLE_MOBILE_APP_SERVICE = "moodle_mobile_app"; private static final String REST_API_TEST_FUNCTION = "core_webservice_get_site_info"; final JSONMapper jsonMapper; @@ -208,6 +214,7 @@ public class MoodleRestTemplateFactoryImpl implements MoodleRestTemplateFactory private final String serverURL; private final String tokenPath; + private final CharSequence apiToken; private CharSequence accessToken; private final Map tokenReqURIVars; @@ -218,7 +225,7 @@ public class MoodleRestTemplateFactoryImpl implements MoodleRestTemplateFactory final APITemplateDataSupplier apiTemplateDataSupplier, final String serverURL, final String tokenPath, - final CharSequence accessToken, + final CharSequence apiToken, final CharSequence username, final CharSequence password) { @@ -227,12 +234,13 @@ public class MoodleRestTemplateFactoryImpl implements MoodleRestTemplateFactory this.serverURL = serverURL; this.tokenPath = tokenPath; - this.accessToken = StringUtils.isNotBlank(accessToken) ? accessToken : null; + this.apiToken = apiToken; + this.accessToken = StringUtils.isNotBlank(apiToken) ? apiToken : null; this.tokenReqURIVars = new HashMap<>(); this.tokenReqURIVars.put(URI_VAR_USER_NAME, String.valueOf(username)); this.tokenReqURIVars.put(URI_VAR_PASSWORD, String.valueOf(password)); - this.tokenReqURIVars.put(URI_VAR_SERVICE, "moodle_mobile_app"); + this.tokenReqURIVars.put(URI_VAR_SERVICE, MOODLE_MOBILE_APP_SERVICE); } @@ -336,6 +344,8 @@ public class MoodleRestTemplateFactoryImpl implements MoodleRestTemplateFactory functionReqEntity, String.class); + System.out.println("*************** response: " + response); + final LmsSetup lmsSetup = this.apiTemplateDataSupplier.getLmsSetup(); if (response.getStatusCode() != HttpStatus.OK) { throw new RuntimeException( @@ -362,6 +372,11 @@ public class MoodleRestTemplateFactoryImpl implements MoodleRestTemplateFactory private void requestAccessToken() { + if (StringUtils.isNotBlank(this.apiToken)) { + this.accessToken = this.apiToken; + return; + } + final LmsSetup lmsSetup = this.apiTemplateDataSupplier.getLmsSetup(); try { diff --git a/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/lms/impl/moodle/plugin/MoodlePluginCourseAccess.java b/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/lms/impl/moodle/plugin/MoodlePluginCourseAccess.java index 47475fdb..1e094589 100644 --- a/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/lms/impl/moodle/plugin/MoodlePluginCourseAccess.java +++ b/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/lms/impl/moodle/plugin/MoodlePluginCourseAccess.java @@ -75,13 +75,14 @@ public class MoodlePluginCourseAccess extends AbstractCachedCourseAccess impleme public static final String ATTR_ID = "id"; public static final String ATTR_SHORTNAME = "shortname"; - public static final String PARAM_COURSE_ID = "courseid"; + public static final String PARAM_COURSE_ID_ARRAY = "courseid[]"; public static final String PARAM_SQL_CONDITIONS = "conditions"; public static final String PARAM_PAGE_START = "startneedle"; public static final String PARAM_PAGE_SIZE = "perpage"; public static final String SQL_CONDITION_TEMPLATE = - "(startdate >= %s or timecreated >=%s) and (enddate is null or enddate is 0 or enddate is >= %s)"; + //"(startdate >= %s or timecreated >=%s) and (enddate is null or enddate = 0 or enddate >= %s)"; + "(startdate is null OR startdate = 0 OR startdate >= %s) AND (enddate is null or enddate = 0 OR enddate >= %s)"; private final JSONMapper jsonMapper; private final MoodleRestTemplateFactory restTemplateFactory; @@ -423,10 +424,12 @@ public class MoodlePluginCourseAccess extends AbstractCachedCourseAccess impleme final String sqlCondition = String.format( SQL_CONDITION_TEMPLATE, String.valueOf(cutoffDate), - String.valueOf(cutoffDate), String.valueOf(filterDate)); final String fromElement = String.valueOf(page * size); final LinkedMultiValueMap attributes = new LinkedMultiValueMap<>(); + + // Note: courseid[]=0 means all courses. Moodle don't like empty parameter + attributes.add(PARAM_COURSE_ID_ARRAY, "0"); attributes.add(PARAM_SQL_CONDITIONS, sqlCondition); attributes.add(PARAM_PAGE_START, fromElement); attributes.add(PARAM_PAGE_SIZE, String.valueOf(size)); @@ -526,7 +529,7 @@ public class MoodlePluginCourseAccess extends AbstractCachedCourseAccess impleme } final LinkedMultiValueMap attributes = new LinkedMultiValueMap<>(); - attributes.put(PARAM_COURSE_ID, new ArrayList<>(courseIds)); + attributes.put(PARAM_COURSE_ID_ARRAY, new ArrayList<>(courseIds)); final String coursePageJSON = restTemplate.callMoodleAPIFunction( COURSES_API_FUNCTION_NAME, attributes); @@ -560,7 +563,9 @@ public class MoodlePluginCourseAccess extends AbstractCachedCourseAccess impleme if (templateRequest.hasError()) { return templateRequest; } else { - this.restTemplate = templateRequest.get(); + final MoodleAPIRestTemplate moodleAPIRestTemplate = templateRequest.get(); + moodleAPIRestTemplate.setService(MooldePluginLmsAPITemplateFactory.SEB_SERVER_SERVICE_NAME); + this.restTemplate = moodleAPIRestTemplate; } } diff --git a/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/lms/impl/moodle/plugin/MoodlePluginCourseRestriction.java b/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/lms/impl/moodle/plugin/MoodlePluginCourseRestriction.java index 3adff866..557a8605 100644 --- a/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/lms/impl/moodle/plugin/MoodlePluginCourseRestriction.java +++ b/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/lms/impl/moodle/plugin/MoodlePluginCourseRestriction.java @@ -43,11 +43,14 @@ public class MoodlePluginCourseRestriction implements SEBRestrictionAPI { public static final String RESTRICTION_GET_FUNCTION_NAME = "quizaccess_sebserver_get_restriction"; public static final String RESTRICTION_SET_FUNCTION_NAME = "quizaccess_sebserver_set_restriction"; - public static final String ATTRIBUTE_QUIZ_ID = "quiz_id"; - public static final String ATTRIBUTE_CONFIG_KEYS = "config_keys"; - public static final String ATTRIBUTE_BROWSER_EXAM_KEYS = "browser_exam_keys"; - public static final String ATTRIBUTE_QUIT_URL = "quit_link"; - public static final String ATTRIBUTE_QUIT_SECRET = "quit_secret"; + public static final String ATTRIBUTE_QUIZ_ID = "quizid"; + public static final String ATTRIBUTE_CONFIG_KEYS = "configkeys[]"; + public static final String ATTRIBUTE_BROWSER_EXAM_KEYS = "browserkeys[]"; + public static final String ATTRIBUTE_QUIT_URL = "quitlink"; + public static final String ATTRIBUTE_QUIT_SECRET = "quitsecret"; + + private static final String NO_RESTRICTION_SET_WARNING = "error/SEB Server is not enabled"; + private static final String DELETED_RESTRICTION_WARNING = "You have deleted restriction"; private final JSONMapper jsonMapper; private final MoodleRestTemplateFactory restTemplateFactory; @@ -168,18 +171,20 @@ public class MoodlePluginCourseRestriction implements SEBRestrictionAPI { final LinkedMultiValueMap addQuery = new LinkedMultiValueMap<>(); addQuery.add(ATTRIBUTE_QUIZ_ID, quizId); - final String quitLink = this.examConfigurationValueService.getQuitLink(exam.id); - final String quitSecret = this.examConfigurationValueService.getQuitSecret(exam.id); - final LinkedMultiValueMap queryAttributes = new LinkedMultiValueMap<>(); - queryAttributes.add(ATTRIBUTE_QUIT_URL, quitLink); - queryAttributes.add(ATTRIBUTE_QUIT_SECRET, quitSecret); - restTemplate.callMoodleAPIFunction( + queryAttributes.add(ATTRIBUTE_CONFIG_KEYS, StringUtils.EMPTY); + queryAttributes.add(ATTRIBUTE_BROWSER_EXAM_KEYS, StringUtils.EMPTY); + + final String srJSON = restTemplate.callMoodleAPIFunction( RESTRICTION_SET_FUNCTION_NAME, addQuery, queryAttributes); + if (!srJSON.contains(DELETED_RESTRICTION_WARNING)) { + log.warn("Release SEB restriction seems to failed. Moodle response: {}", srJSON); + } + return exam; }); } @@ -187,6 +192,7 @@ public class MoodlePluginCourseRestriction implements SEBRestrictionAPI { private SEBRestriction restrictionFromJson(final Exam exam, final String srJSON) { try { + // check blank result if (StringUtils.isBlank(srJSON)) { return new SEBRestriction( exam.id, @@ -195,6 +201,20 @@ public class MoodlePluginCourseRestriction implements SEBRestrictionAPI { Collections.emptyMap()); } + // check no restriction set + if (srJSON.contains(NO_RESTRICTION_SET_WARNING)) { + + if (log.isDebugEnabled()) { + log.debug("No restriction set for exam: {}", exam); + } + + return new SEBRestriction( + exam.id, + Collections.emptyList(), + Collections.emptyList(), + Collections.emptyMap()); + } + // fist try to get from multiple data final MoodleQuizRestrictions moodleRestrictions = this.jsonMapper.readValue( srJSON, @@ -262,7 +282,9 @@ public class MoodlePluginCourseRestriction implements SEBRestrictionAPI { if (templateRequest.hasError()) { return templateRequest; } else { - this.restTemplate = templateRequest.get(); + final MoodleAPIRestTemplate moodleAPIRestTemplate = templateRequest.get(); + moodleAPIRestTemplate.setService(MooldePluginLmsAPITemplateFactory.SEB_SERVER_SERVICE_NAME); + this.restTemplate = moodleAPIRestTemplate; } } diff --git a/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/lms/impl/moodle/plugin/MooldePluginLmsAPITemplateFactory.java b/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/lms/impl/moodle/plugin/MooldePluginLmsAPITemplateFactory.java index ab383d6a..a21622e1 100644 --- a/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/lms/impl/moodle/plugin/MooldePluginLmsAPITemplateFactory.java +++ b/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/lms/impl/moodle/plugin/MooldePluginLmsAPITemplateFactory.java @@ -36,6 +36,8 @@ import ch.ethz.seb.sebserver.webservice.servicelayer.lms.impl.moodle.MoodleRestT @WebServiceProfile public class MooldePluginLmsAPITemplateFactory implements LmsAPITemplateFactory { + public static final String SEB_SERVER_SERVICE_NAME = "seb-server-service"; + private final JSONMapper jsonMapper; private final CacheManager cacheManager; private final AsyncService asyncService; diff --git a/src/main/resources/messages.properties b/src/main/resources/messages.properties index a3a18229..04d9518a 100644 --- a/src/main/resources/messages.properties +++ b/src/main/resources/messages.properties @@ -390,6 +390,8 @@ sebserver.lmssetup.form.clientname.lms=LMS Server Username sebserver.lmssetup.form.clientname.lms.tooltip=The client name of the API client access to the LMS

This is usually provided by an LMS administrator that has created a API access account for SEB Server binding within the LMS server. sebserver.lmssetup.form.secret.lms=LMS Server Password sebserver.lmssetup.form.secret.lms.tooltip=The secret or password of the API client access to the LMS

This is usually provided by an LMS administrator that has created a API access account for SEB Server binding within the LMS server. +sebserver.lmssetup.form.accesstoken.lms=Access Token +sebserver.lmssetup.form.accesstoken.lms.tooltip=The Access Token for the LMS API if LMS supports access token sebserver.lmssetup.form.proxy=Proxy sebserver.lmssetup.form.proxy.check=With Proxy sebserver.lmssetup.form.proxy.check.tooltip=Check and give detailed information if the SEB Server runs behind a proxy
and need proxy settings to connect to the internet diff --git a/src/test/java/ch/ethz/seb/sebserver/gbl/async/AsyncBlockingTest.java b/src/test/java/ch/ethz/seb/sebserver/gbl/async/AsyncBlockingTest.java index d2cb9d65..6e0ef5ef 100644 --- a/src/test/java/ch/ethz/seb/sebserver/gbl/async/AsyncBlockingTest.java +++ b/src/test/java/ch/ethz/seb/sebserver/gbl/async/AsyncBlockingTest.java @@ -35,7 +35,6 @@ public class AsyncBlockingTest { final Collection> features = new ArrayList<>(); for (int i = 0; i < TASKS; i++) { final Future runAsync = this.asyncRunner.runAsync(this::doAsync); - //System.out.println("*********** run async: " + i); features.add(runAsync); } assertEquals(TASKS, features.size()); diff --git a/src/test/java/ch/ethz/seb/sebserver/webservice/servicelayer/lms/impl/moodle/MoodleMockupRestTemplateFactory.java b/src/test/java/ch/ethz/seb/sebserver/webservice/servicelayer/lms/impl/moodle/MoodleMockupRestTemplateFactory.java index 2432d65f..03ad74bd 100644 --- a/src/test/java/ch/ethz/seb/sebserver/webservice/servicelayer/lms/impl/moodle/MoodleMockupRestTemplateFactory.java +++ b/src/test/java/ch/ethz/seb/sebserver/webservice/servicelayer/lms/impl/moodle/MoodleMockupRestTemplateFactory.java @@ -248,11 +248,12 @@ public class MoodleMockupRestTemplateFactory implements MoodleRestTemplateFactor private String respondCourses(final MultiValueMap queryAttributes) { try { - final List ids = queryAttributes.get(MoodlePluginCourseAccess.PARAM_COURSE_ID); + final List ids = queryAttributes.get(MoodlePluginCourseAccess.PARAM_COURSE_ID_ARRAY); final String from = queryAttributes.getFirst(MoodlePluginCourseAccess.PARAM_PAGE_START); final String size = queryAttributes.getFirst(MoodlePluginCourseAccess.PARAM_PAGE_SIZE); final List courses; - if (ids != null && !ids.isEmpty()) { + + if (ids != null && !ids.isEmpty() && !ids.get(0).equals("0")) { courses = this.courses.stream().filter(c -> ids.contains(c.id)).collect(Collectors.toList()); } else if (from != null && Integer.valueOf(from) < this.courses.size()) { diff --git a/src/test/java/ch/ethz/seb/sebserver/webservice/servicelayer/lms/impl/moodle/plugin/MoodlePluginCourseAccessTest.java b/src/test/java/ch/ethz/seb/sebserver/webservice/servicelayer/lms/impl/moodle/plugin/MoodlePluginCourseAccessTest.java index da92e96e..db2264de 100644 --- a/src/test/java/ch/ethz/seb/sebserver/webservice/servicelayer/lms/impl/moodle/plugin/MoodlePluginCourseAccessTest.java +++ b/src/test/java/ch/ethz/seb/sebserver/webservice/servicelayer/lms/impl/moodle/plugin/MoodlePluginCourseAccessTest.java @@ -84,8 +84,8 @@ public class MoodlePluginCourseAccessTest { + "callMoodleAPIFunction: quizaccess_sebserver_get_exams, " + "callMoodleAPIFunction: quizaccess_sebserver_get_exams], " + "callLog=[" - + "= -94694400 or timecreated >=-94694400) and (enddate is null or enddate is 0 or enddate is >= -94694400)&startneedle=0&perpage=500,[Content-Type:\"application/x-www-form-urlencoded\"]>, " - + "= -94694400 or timecreated >=-94694400) and (enddate is null or enddate is 0 or enddate is >= -94694400)&startneedle=500&perpage=500,[Content-Type:\"application/x-www-form-urlencoded\"]>]]]", + + "= -94694400) AND (enddate is null or enddate = 0 OR enddate >= -94694400)&startneedle=0&perpage=500,[Content-Type:\"application/x-www-form-urlencoded\"]>, " + + "= -94694400) AND (enddate is null or enddate = 0 OR enddate >= -94694400)&startneedle=500&perpage=500,[Content-Type:\"application/x-www-form-urlencoded\"]>]]]", candidate.toTestString()); final List ids = @@ -152,11 +152,11 @@ public class MoodlePluginCourseAccessTest { + "callMoodleAPIFunction: quizaccess_sebserver_get_exams, " + "callMoodleAPIFunction: quizaccess_sebserver_get_exams], " + "callLog=[" - + "= -94694400 or timecreated >=-94694400) and (enddate is null or enddate is 0 or enddate is >= -94694400)&startneedle=0&perpage=5,[Content-Type:\"application/x-www-form-urlencoded\"]>, " - + "= -94694400 or timecreated >=-94694400) and (enddate is null or enddate is 0 or enddate is >= -94694400)&startneedle=5&perpage=5,[Content-Type:\"application/x-www-form-urlencoded\"]>, " - + "= -94694400 or timecreated >=-94694400) and (enddate is null or enddate is 0 or enddate is >= -94694400)&startneedle=10&perpage=5,[Content-Type:\"application/x-www-form-urlencoded\"]>, " - + "= -94694400 or timecreated >=-94694400) and (enddate is null or enddate is 0 or enddate is >= -94694400)&startneedle=15&perpage=5,[Content-Type:\"application/x-www-form-urlencoded\"]>, " - + "= -94694400 or timecreated >=-94694400) and (enddate is null or enddate is 0 or enddate is >= -94694400)&startneedle=20&perpage=5,[Content-Type:\"application/x-www-form-urlencoded\"]>]]]", + + "= -94694400) AND (enddate is null or enddate = 0 OR enddate >= -94694400)&startneedle=0&perpage=5,[Content-Type:\"application/x-www-form-urlencoded\"]>, " + + "= -94694400) AND (enddate is null or enddate = 0 OR enddate >= -94694400)&startneedle=5&perpage=5,[Content-Type:\"application/x-www-form-urlencoded\"]>, " + + "= -94694400) AND (enddate is null or enddate = 0 OR enddate >= -94694400)&startneedle=10&perpage=5,[Content-Type:\"application/x-www-form-urlencoded\"]>, " + + "= -94694400) AND (enddate is null or enddate = 0 OR enddate >= -94694400)&startneedle=15&perpage=5,[Content-Type:\"application/x-www-form-urlencoded\"]>, " + + "= -94694400) AND (enddate is null or enddate = 0 OR enddate >= -94694400)&startneedle=20&perpage=5,[Content-Type:\"application/x-www-form-urlencoded\"]>]]]", candidate.toTestString()); final List ids =