/** * OLAT - Online Learning and Training<br> * http://www.olat.org * <p> * Licensed under the Apache License, Version 2.0 (the "License"); <br> * you may not use this file except in compliance with the License.<br> * You may obtain a copy of the License at * <p> * http://www.apache.org/licenses/LICENSE-2.0 * <p> * Unless required by applicable law or agreed to in writing,<br> * software distributed under the License is distributed on an "AS IS" BASIS, <br> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> * See the License for the specific language governing permissions and <br> * limitations under the License. * <p> * Copyright (c) since 2004 at Multimedia- & E-Learning Services (MELS),<br> * University of Zurich, Switzerland. * <hr> * <a href="http://www.openolat.org"> * OpenOLAT - Online Learning and Training</a><br> * This file has been modified by the OpenOLAT community. Changes are licensed * under the Apache 2.0 license as the original file. * <p> */ package org.olat.restapi; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import java.io.File; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.UriBuilder; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.client.methods.HttpPut; import org.apache.http.entity.ContentType; import org.apache.http.entity.mime.HttpMultipartMode; import org.apache.http.entity.mime.MultipartEntityBuilder; import org.apache.http.message.BasicNameValuePair; import org.apache.http.util.EntityUtils; import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.olat.core.commons.modules.bc.vfs.OlatRootFolderImpl; import org.olat.core.gui.components.tree.TreeNode; import org.olat.core.util.vfs.VFSLeaf; import org.olat.course.CourseFactory; import org.olat.course.ICourse; import org.olat.course.nodes.BCCourseNode; import org.olat.course.nodes.COCourseNode; import org.olat.course.nodes.CourseNode; import org.olat.course.nodes.ENCourseNode; import org.olat.course.nodes.FOCourseNode; import org.olat.course.nodes.IQSURVCourseNode; import org.olat.course.nodes.IQTESTCourseNode; import org.olat.course.nodes.MSCourseNode; import org.olat.course.nodes.SPCourseNode; import org.olat.course.nodes.STCourseNode; import org.olat.course.nodes.TACourseNode; import org.olat.course.nodes.TUCourseNode; import org.olat.course.tree.CourseEditorTreeModel; import org.olat.course.tree.CourseEditorTreeNode; import org.olat.ims.qti.process.AssessmentInstance; import org.olat.repository.RepositoryEntry; import org.olat.repository.RepositoryManager; import org.olat.restapi.support.vo.CourseNodeVO; import org.olat.restapi.support.vo.CourseVO; import org.olat.restapi.support.vo.GroupVO; import org.olat.restapi.support.vo.RepositoryEntryVO; import org.olat.restapi.support.vo.elements.SurveyConfigVO; import org.olat.restapi.support.vo.elements.TaskConfigVO; import org.olat.restapi.support.vo.elements.TestConfigVO; import org.olat.test.OlatJerseyTestCase; public class CoursesElementsTest extends OlatJerseyTestCase { private RestConnection conn; @Before public void startup() { conn = new RestConnection(); } @After public void tearDown() throws Exception { try { if(conn != null) { conn.shutdown(); } } catch (Exception e) { e.printStackTrace(); throw e; } } @Test public void testCreateCoursePost() throws IOException, URISyntaxException{ assertTrue(conn.login("administrator", "openolat")); //create an empty course URI uri = getCoursesUri().queryParam("shortTitle", "course3").queryParam("title", "course3 long name").build(); HttpPut method = conn.createPut(uri, MediaType.APPLICATION_JSON, true); HttpResponse response = conn.execute(method); assertEquals(200, response.getStatusLine().getStatusCode()); CourseVO course = conn.parse(response, CourseVO.class); assertNotNull(course); assertNotNull(course.getKey()); assertNotNull(course.getEditorRootNodeId()); //create an structure node URI newStructureUri = getElementsUri(course).path("structure").build(); HttpPost newStructureMethod = conn.createPost(newStructureUri, MediaType.APPLICATION_JSON); HttpEntity newStructureEnttiy = MultipartEntityBuilder.create() .setMode(HttpMultipartMode.BROWSER_COMPATIBLE) .addTextBody("parentNodeId", course.getEditorRootNodeId()) .addTextBody("position", "0") .addTextBody("shortTitle", "Structure-0") .addTextBody("longTitle", "Structure-long-0") .addTextBody("objectives", "Structure-objectives-0") .build(); newStructureMethod.setEntity(newStructureEnttiy); HttpResponse newStructureResponse = conn.execute(newStructureMethod); int newStructureCode = newStructureResponse.getStatusLine().getStatusCode(); assertTrue(newStructureCode == 200 || newStructureCode == 201); CourseNodeVO structureNode = conn.parse(newStructureResponse, CourseNodeVO.class); assertNotNull(structureNode); assertNotNull(structureNode.getId()); assertEquals(structureNode.getShortTitle(), "Structure-0"); assertEquals(structureNode.getLongTitle(), "Structure-long-0"); assertEquals(structureNode.getLearningObjectives(), "Structure-objectives-0"); assertEquals(structureNode.getParentId(), course.getEditorRootNodeId()); //create single page URL pageUrl = CoursesElementsTest.class.getResource("singlepage.html"); assertNotNull(pageUrl); File page = new File(pageUrl.toURI()); URI newPageUri = getElementsUri(course).path("singlepage").build(); HttpPost newPageMethod = conn.createPost(newPageUri, MediaType.APPLICATION_JSON); HttpEntity entity = MultipartEntityBuilder.create() .setMode(HttpMultipartMode.BROWSER_COMPATIBLE) .addBinaryBody("file", page, ContentType.APPLICATION_OCTET_STREAM, page.getName()) .addTextBody("filename", page.getName()) .addTextBody("parentNodeId", course.getEditorRootNodeId()) .addTextBody("position", "1") .addTextBody("shortTitle","Single-Page-0") .addTextBody("longTitle", "Single-Page-long-0") .addTextBody("objectives", "Single-Page-objectives-0") .build(); newPageMethod.setEntity(entity); HttpResponse newPageCode = conn.execute(newPageMethod); assertTrue(newPageCode.getStatusLine().getStatusCode() == 200 || newPageCode.getStatusLine().getStatusCode() == 201); CourseNodeVO pageNode = conn.parse(newPageCode, CourseNodeVO.class); assertNotNull(pageNode); assertNotNull(pageNode.getId()); assertEquals(pageNode.getShortTitle(), "Single-Page-0"); assertEquals(pageNode.getLongTitle(), "Single-Page-long-0"); assertEquals(pageNode.getLearningObjectives(), "Single-Page-objectives-0"); assertEquals(structureNode.getParentId(), course.getEditorRootNodeId()); //create a folder node URI newFolderUri = getElementsUri(course).path("folder").build(); HttpPost newFolderMethod = conn.createPost(newFolderUri, MediaType.APPLICATION_JSON); String rule = "hasLanguage(\"de\")"; conn.addEntity(newFolderMethod, new BasicNameValuePair("parentNodeId", course.getEditorRootNodeId()), new BasicNameValuePair("position", "2"), new BasicNameValuePair("shortTitle", "Folder-0"), new BasicNameValuePair("longTitle", "Folder-long-0"), new BasicNameValuePair("objectives", "Folder-objectives-0"), new BasicNameValuePair("visibilityExpertRules", rule), new BasicNameValuePair("downloadExpertRules", rule), new BasicNameValuePair("uploadExpertRules", rule)); HttpResponse newFolderCode = conn.execute(newFolderMethod); assertTrue(newFolderCode.getStatusLine().getStatusCode() == 200 || newFolderCode.getStatusLine().getStatusCode() == 201); CourseNodeVO folderNode = conn.parse(newFolderCode, CourseNodeVO.class); assertNotNull(folderNode); assertNotNull(folderNode.getId()); assertEquals(folderNode.getShortTitle(), "Folder-0"); assertEquals(folderNode.getLongTitle(), "Folder-long-0"); assertEquals(folderNode.getLearningObjectives(), "Folder-objectives-0"); assertEquals(folderNode.getParentId(), course.getEditorRootNodeId()); //create a forum node URI newForumUri = getElementsUri(course).path("forum").build(); HttpPost newForumMethod = conn.createPost(newForumUri, MediaType.APPLICATION_JSON); conn.addEntity(newForumMethod, new BasicNameValuePair("parentNodeId", course.getEditorRootNodeId()), new BasicNameValuePair("position", "3"), new BasicNameValuePair("shortTitle", "Forum-0"), new BasicNameValuePair("longTitle", "Forum-long-0"), new BasicNameValuePair("objectives", "Forum-objectives-0")); HttpResponse newForumCode = conn.execute(newForumMethod); assertTrue(newForumCode.getStatusLine().getStatusCode() == 200 || newForumCode.getStatusLine().getStatusCode() == 201); CourseNodeVO forumNode = conn.parse(newForumCode, CourseNodeVO.class); assertNotNull(forumNode); assertNotNull(forumNode.getId()); assertEquals(forumNode.getShortTitle(), "Forum-0"); assertEquals(forumNode.getLongTitle(), "Forum-long-0"); assertEquals(forumNode.getLearningObjectives(), "Forum-objectives-0"); assertEquals(forumNode.getParentId(), course.getEditorRootNodeId()); //create a task node URI newTaskUri = getElementsUri(course).path("task").build(); HttpPost newTaskMethod = conn.createPost(newTaskUri, MediaType.APPLICATION_JSON); conn.addEntity(newTaskMethod, new BasicNameValuePair("parentNodeId", course.getEditorRootNodeId()), new BasicNameValuePair("position", "4"), new BasicNameValuePair("shortTitle", "Task-0"), new BasicNameValuePair("longTitle", "Task-long-0"), new BasicNameValuePair("objectives", "Task-objectives-0"), new BasicNameValuePair("points", "25"), new BasicNameValuePair("text", "A very difficult test")); HttpResponse newTaskCode = conn.execute(newTaskMethod); assertTrue(newTaskCode.getStatusLine().getStatusCode() == 200 || newTaskCode.getStatusLine().getStatusCode() == 201); CourseNodeVO taskNode = conn.parse(newTaskCode, CourseNodeVO.class); assertNotNull(taskNode); assertNotNull(taskNode.getId()); assertEquals(taskNode.getShortTitle(), "Task-0"); assertEquals(taskNode.getLongTitle(), "Task-long-0"); assertEquals(taskNode.getLearningObjectives(), "Task-objectives-0"); assertEquals(taskNode.getParentId(), course.getEditorRootNodeId()); //create a test node URI newTestUri = getElementsUri(course).path("test").build(); HttpPost newTestMethod = conn.createPost(newTestUri, MediaType.APPLICATION_JSON); conn.addEntity(newTestMethod, new BasicNameValuePair("parentNodeId", course.getEditorRootNodeId()), new BasicNameValuePair("testResourceableId", course.getEditorRootNodeId()), new BasicNameValuePair("position", "5"), new BasicNameValuePair("shortTitle", "Test-0"), new BasicNameValuePair("longTitle", "Test-long-0"), new BasicNameValuePair("objectives", "Test-objectives-0")); HttpResponse newTestCode = conn.execute(newTestMethod); assertTrue(newTestCode.getStatusLine().getStatusCode() == 404);//must bind a real test EntityUtils.consume(newTestCode.getEntity()); /* assertTrue(newTestCode == 200 || newTestCode == 201); String newTestBody = newTestMethod.getResponseBodyAsString(); CourseNodeVO testNode = parse(newTestBody, CourseNodeVO.class); assertNotNull(testNode); assertNotNull(testNode.getId()); assertEquals(testNode.getShortTitle(), "Test-0"); assertEquals(testNode.getParentId(), course.getEditorRootNodeId()); */ //create an assessment node URI newAssessmentUri = getElementsUri(course).path("assessment").build(); HttpPost newAssessmentMethod = conn.createPost(newAssessmentUri, MediaType.APPLICATION_JSON); conn.addEntity(newAssessmentMethod, new BasicNameValuePair("parentNodeId", course.getEditorRootNodeId()), new BasicNameValuePair("position", "5"), new BasicNameValuePair("shortTitle", "Assessment-0"), new BasicNameValuePair("longTitle", "Assessment-long-0"), new BasicNameValuePair("objectives", "Assessment-objectives-0")); HttpResponse newAssessmentCode = conn.execute(newAssessmentMethod); assertTrue(newAssessmentCode.getStatusLine().getStatusCode() == 200 || newAssessmentCode.getStatusLine().getStatusCode() == 201); CourseNodeVO assessmentNode = conn.parse(newAssessmentCode, CourseNodeVO.class); assertNotNull(assessmentNode); assertNotNull(assessmentNode.getId()); assertEquals(assessmentNode.getShortTitle(), "Assessment-0"); assertEquals(assessmentNode.getLongTitle(), "Assessment-long-0"); assertEquals(assessmentNode.getLearningObjectives(), "Assessment-objectives-0"); assertEquals(assessmentNode.getParentId(), course.getEditorRootNodeId()); //create an contact node URI newContactUri = getElementsUri(course).path("contact").build(); HttpPost newContactMethod = conn.createPost(newContactUri, MediaType.APPLICATION_JSON); conn.addEntity(newContactMethod, new BasicNameValuePair("parentNodeId", course.getEditorRootNodeId()), new BasicNameValuePair("position", "6"), new BasicNameValuePair("shortTitle", "Contact-0"), new BasicNameValuePair("longTitle", "Contact-long-0"), new BasicNameValuePair("objectives", "Contact-objectives-0")); HttpResponse newContactCode = conn.execute(newContactMethod); assertEquals(200, newContactCode.getStatusLine().getStatusCode()); CourseNodeVO contactNode = conn.parse(newContactCode, CourseNodeVO.class); assertNotNull(contactNode); assertNotNull(contactNode.getId()); assertEquals(contactNode.getShortTitle(), "Contact-0"); assertEquals(contactNode.getLongTitle(), "Contact-long-0"); assertEquals(contactNode.getLearningObjectives(), "Contact-objectives-0"); assertEquals(contactNode.getParentId(), course.getEditorRootNodeId()); } @Test public void testCreateCoursePut() throws IOException, URISyntaxException{ assertTrue(conn.login("administrator", "openolat")); //create an empty course URI uri = getCoursesUri().queryParam("shortTitle", "course3").queryParam("title", "course3 long name").build(); HttpPut method = conn.createPut(uri, MediaType.APPLICATION_JSON, true); HttpResponse response = conn.execute(method); assertEquals(200, response.getStatusLine().getStatusCode()); CourseVO course = conn.parse(response, CourseVO.class); assertNotNull(course); assertNotNull(course.getKey()); assertNotNull(course.getEditorRootNodeId()); try { ICourse savedCourse = CourseFactory.loadCourse(course.getKey()); assertNotNull(savedCourse); } catch (Exception e) { assertTrue(false); } //create a learning group GroupVO groupVo = new GroupVO(); groupVo.setName("hello"); groupVo.setDescription("hello description"); groupVo.setMinParticipants(new Integer(-1)); groupVo.setMaxParticipants(new Integer(-1)); URI newGroupUri = getCoursesUri().path(course.getKey().toString()).path("groups").build(); HttpPut newGrpMethod = conn.createPut(newGroupUri, MediaType.APPLICATION_JSON, true); conn.addJsonEntity(newGrpMethod, groupVo); HttpResponse newGrpCode = conn.execute(newGrpMethod); assertEquals(200, newGrpCode.getStatusLine().getStatusCode()); GroupVO group = conn.parse(newGrpCode, GroupVO.class); assertNotNull(group); assertNotNull(group.getKey()); //create an structure node URI newStructureUri = getElementsUri(course).path("structure") .queryParam("parentNodeId", course.getEditorRootNodeId()) .queryParam("position", "0").queryParam("shortTitle", "Structure-0") .queryParam("longTitle", "Structure-long-0") .queryParam("objectives", "Structure-objectives-0").build(); HttpPut newStructureMethod = conn.createPut(newStructureUri, MediaType.APPLICATION_JSON, true); HttpResponse newStructureCode = conn.execute(newStructureMethod); assertTrue(newStructureCode.getStatusLine().getStatusCode() == 200 || newStructureCode.getStatusLine().getStatusCode() == 201); CourseNodeVO structureNode = conn.parse(newStructureCode, CourseNodeVO.class); assertNotNull(structureNode); assertNotNull(structureNode.getId()); assertEquals(structureNode.getShortTitle(), "Structure-0"); assertEquals(structureNode.getLongTitle(), "Structure-long-0"); assertEquals(structureNode.getLearningObjectives(), "Structure-objectives-0"); assertEquals(structureNode.getParentId(), course.getEditorRootNodeId()); //create single page URL pageUrl = RepositoryEntriesTest.class.getResource("singlepage.html"); assertNotNull(pageUrl); File page = new File(pageUrl.toURI()); URI newPageUri = getElementsUri(course).path("singlepage").build(); HttpPut newPageMethod = conn.createPut(newPageUri, MediaType.APPLICATION_JSON, true); HttpEntity newPageEntity = MultipartEntityBuilder.create() .setMode(HttpMultipartMode.BROWSER_COMPATIBLE) .addBinaryBody("file", page, ContentType.APPLICATION_OCTET_STREAM, page.getName()) .addTextBody("filename", page.getName()) .addTextBody("parentNodeId",course.getEditorRootNodeId()) .addTextBody("position", "1") .addTextBody("shortTitle", "Single-Page-0") .addTextBody("longTitle", "Single-Page-long-0") .addTextBody("objectives", "Single-Page-objectives-0") .build(); newPageMethod.setEntity(newPageEntity); HttpResponse newPageCode = conn.execute(newPageMethod); assertTrue(newPageCode.getStatusLine().getStatusCode() == 200 || newPageCode.getStatusLine().getStatusCode() == 201); CourseNodeVO pageNode = conn.parse(newPageCode, CourseNodeVO.class); assertNotNull(pageNode); assertNotNull(pageNode.getId()); assertEquals(pageNode.getShortTitle(), "Single-Page-0"); assertEquals(pageNode.getLongTitle(), "Single-Page-long-0"); assertEquals(pageNode.getLearningObjectives(), "Single-Page-objectives-0"); assertEquals(structureNode.getParentId(), course.getEditorRootNodeId()); //create a folder node URI newFolderUri = getElementsUri(course).path("folder") .queryParam("parentNodeId", course.getEditorRootNodeId()) .queryParam("position", "2").queryParam("shortTitle", "Folder-0") .queryParam("longTitle", "Folder-long-0") .queryParam("objectives", "Folder-objectives-0").build(); HttpPut newFolderMethod = conn.createPut(newFolderUri, MediaType.APPLICATION_JSON, true); HttpResponse newFolderCode = conn.execute(newFolderMethod); assertTrue(newFolderCode.getStatusLine().getStatusCode() == 200 || newFolderCode.getStatusLine().getStatusCode() == 201); CourseNodeVO folderNode = conn.parse(newFolderCode, CourseNodeVO.class); assertNotNull(folderNode); assertNotNull(folderNode.getId()); assertEquals(folderNode.getShortTitle(), "Folder-0"); assertEquals(folderNode.getLongTitle(), "Folder-long-0"); assertEquals(folderNode.getLearningObjectives(), "Folder-objectives-0"); assertEquals(folderNode.getParentId(), course.getEditorRootNodeId()); //create a forum node URI newForumUri = getElementsUri(course).path("forum") .queryParam("parentNodeId", course.getEditorRootNodeId()) .queryParam("position", "3").queryParam("shortTitle", "Forum-0") .queryParam("longTitle", "Forum-long-0") .queryParam("objectives", "Forum-objectives-0").build(); HttpPut newForumMethod = conn.createPut(newForumUri, MediaType.APPLICATION_JSON, true); HttpResponse newForumCode = conn.execute(newForumMethod); assertTrue(newForumCode.getStatusLine().getStatusCode() == 200 || newForumCode.getStatusLine().getStatusCode() == 201); CourseNodeVO forumNode = conn.parse(newForumCode, CourseNodeVO.class); assertNotNull(forumNode); assertNotNull(forumNode.getId()); assertEquals(forumNode.getShortTitle(), "Forum-0"); assertEquals(forumNode.getLongTitle(), "Forum-long-0"); assertEquals(forumNode.getLearningObjectives(), "Forum-objectives-0"); assertEquals(forumNode.getParentId(), course.getEditorRootNodeId()); //create a task node URI newTaskUri = getElementsUri(course).path("task") .queryParam("parentNodeId", course.getEditorRootNodeId()) .queryParam("position", "4").queryParam("shortTitle", "Task-0") .queryParam("longTitle", "Task-long-0") .queryParam("objectives", "Task-objectives-0") .queryParam("points", "25").queryParam("text", "A very difficult test").build(); HttpPut newTaskMethod = conn.createPut(newTaskUri, MediaType.APPLICATION_JSON, true); HttpResponse newTaskCode = conn.execute(newTaskMethod); assertTrue(newTaskCode.getStatusLine().getStatusCode() == 200 || newTaskCode.getStatusLine().getStatusCode() == 201); CourseNodeVO taskNode = conn.parse(newTaskCode, CourseNodeVO.class); assertNotNull(taskNode); assertNotNull(taskNode.getId()); assertEquals(taskNode.getShortTitle(), "Task-0"); assertEquals(taskNode.getLongTitle(), "Task-long-0"); assertEquals(taskNode.getLearningObjectives(), "Task-objectives-0"); assertEquals(taskNode.getParentId(), course.getEditorRootNodeId()); //add task configuration URI taskConfigUri = getElementsUri(course).path("task/"+taskNode.getId()+"/configuration") .queryParam("enableAssignment", Boolean.FALSE) .queryParam("enableScoring", Boolean.TRUE) .queryParam("grantScoring", Boolean.TRUE) .queryParam("scoreMin", new Float(1.5)) .queryParam("scoreMax", 10) .build(); HttpPut taskConfigMethod = conn.createPut(taskConfigUri, MediaType.APPLICATION_JSON, true); HttpResponse taskConfigCode = conn.execute(taskConfigMethod); assertTrue(taskConfigCode.getStatusLine().getStatusCode() == 200 || taskConfigCode.getStatusLine().getStatusCode() == 201); EntityUtils.consume(taskConfigCode.getEntity()); HttpGet getTaskConfig = conn.createGet(taskConfigUri, MediaType.APPLICATION_JSON, true); taskConfigCode = conn.execute(getTaskConfig); assertTrue(taskConfigCode.getStatusLine().getStatusCode() == 200 || taskConfigCode.getStatusLine().getStatusCode() == 201); TaskConfigVO taskConfig = conn.parse(taskConfigCode, TaskConfigVO.class); assertNotNull(taskConfig); assertTrue(!taskConfig.getIsAssignmentEnabled());//default is true assertTrue(taskConfig.getIsScoringEnabled() & taskConfig.getIsScoringGranted()); assertTrue(taskConfig.getMinScore().floatValue() == 1.5); assertTrue(taskConfig.getMaxScore().floatValue() == 10); //create an assessment node URI newAssessmentUri = getElementsUri(course).path("assessment") .queryParam("parentNodeId", course.getEditorRootNodeId()) .queryParam("position", "5").queryParam("shortTitle", "Assessment-0") .queryParam("longTitle", "Assessment-long-0") .queryParam("objectives", "Assessment-objectives-0").build(); HttpPut newAssessmentMethod = conn.createPut(newAssessmentUri, MediaType.APPLICATION_JSON, true); HttpResponse newAssessmentCode = conn.execute(newAssessmentMethod); assertTrue(newAssessmentCode.getStatusLine().getStatusCode() == 200 || newAssessmentCode.getStatusLine().getStatusCode() == 201); CourseNodeVO assessmentNode = conn.parse(newAssessmentCode, CourseNodeVO.class); assertNotNull(assessmentNode); assertNotNull(assessmentNode.getId()); assertEquals(assessmentNode.getShortTitle(), "Assessment-0"); assertEquals(assessmentNode.getLongTitle(), "Assessment-long-0"); assertEquals(assessmentNode.getLearningObjectives(), "Assessment-objectives-0"); assertEquals(assessmentNode.getParentId(), course.getEditorRootNodeId()); //create an contact node URI newContactUri = getElementsUri(course).path("contact") .queryParam("parentNodeId", course.getEditorRootNodeId()) .queryParam("position", "6").queryParam("shortTitle", "Contact-0") .queryParam("longTitle", "Contact-long-0") .queryParam("objectives", "Contact-objectives-0").build(); HttpPut newContactMethod = conn.createPut(newContactUri, MediaType.APPLICATION_JSON, true); HttpResponse newContactCode = conn.execute(newContactMethod); assertEquals(200, newContactCode.getStatusLine().getStatusCode()); CourseNodeVO contactNode = conn.parse(newContactCode, CourseNodeVO.class); assertNotNull(contactNode); assertNotNull(contactNode.getId()); assertEquals(contactNode.getShortTitle(), "Contact-0"); assertEquals(contactNode.getLongTitle(), "Contact-long-0"); assertEquals(contactNode.getLearningObjectives(), "Contact-objectives-0"); assertEquals(contactNode.getParentId(), course.getEditorRootNodeId()); //try to create an invalid enrollment node URI newENUri = getElementsUri(course).path("enrollment") .queryParam("parentNodeId", course.getEditorRootNodeId()) .queryParam("position", "7").queryParam("shortTitle", "Enrollment-0") .queryParam("longTitle", "Enrollment-long-0") .queryParam("objectives", "Enrollment-objectives-0").build(); HttpPut newENMethod = conn.createPut(newENUri, MediaType.APPLICATION_JSON, true); HttpResponse newENCode = conn.execute(newENMethod); assertEquals(406, newENCode.getStatusLine().getStatusCode()); EntityUtils.consume(newENCode.getEntity()); //create an enrollment node newENUri = getElementsUri(course).path("enrollment") .queryParam("parentNodeId", course.getEditorRootNodeId()) .queryParam("position", "7") .queryParam("shortTitle", "Enrollment-0") .queryParam("longTitle", "Enrollment-long-0") .queryParam("objectives", "Enrollment-objectives-0") .queryParam("groups",group.getKey().toString()) .queryParam("cancelEnabled","true").build(); newENMethod = conn.createPut(newENUri, MediaType.APPLICATION_JSON, true); newENCode = conn.execute(newENMethod); assertEquals(200, newENCode.getStatusLine().getStatusCode()); CourseNodeVO enNode = conn.parse(newENCode, CourseNodeVO.class); assertNotNull(enNode); assertNotNull(enNode.getId()); assertEquals(enNode.getShortTitle(), "Enrollment-0"); assertEquals(enNode.getLongTitle(), "Enrollment-long-0"); assertEquals(enNode.getLearningObjectives(), "Enrollment-objectives-0"); assertEquals(enNode.getParentId(), course.getEditorRootNodeId()); //create a test node URL qtiDemoUrl = CoursesElementsTest.class.getResource("qti-demo.zip"); assertNotNull(qtiDemoUrl); File qtiFile = new File(qtiDemoUrl.toURI()); Assert.assertEquals(7518, qtiFile.length()); URI repoEntriesUri = UriBuilder.fromUri(getContextURI()).path("repo/entries").build(); HttpPut qtiRepoMethod = conn.createPut(repoEntriesUri, MediaType.APPLICATION_JSON, true); HttpEntity entity = MultipartEntityBuilder.create() .setMode(HttpMultipartMode.BROWSER_COMPATIBLE) .addBinaryBody("file", qtiFile, ContentType.APPLICATION_OCTET_STREAM, qtiFile.getName()) .addTextBody("filename", "qti-demo.zip") .addTextBody("resourcename", "QTI demo") .addTextBody("displayname", "QTI demo") .build(); qtiRepoMethod.setEntity(entity); HttpResponse qtiRepoCode = conn.execute(qtiRepoMethod); int qtiHttpCode = qtiRepoCode.getStatusLine().getStatusCode(); assertTrue(qtiHttpCode == 200 || qtiHttpCode == 201); RepositoryEntryVO newTestVO = conn.parse(qtiRepoCode, RepositoryEntryVO.class); assertNotNull(newTestVO); Long key = newTestVO.getKey(); RepositoryEntry re = RepositoryManager.getInstance().lookupRepositoryEntry(key); assertNotNull(re); assertNotNull(re.getOlatResource()); assertEquals("QTI demo", re.getDisplayname()); URI newTestUri = getElementsUri(course).path("test") .queryParam("parentNodeId", course.getEditorRootNodeId()) .queryParam("position", "8").queryParam("shortTitle", "Test-0") .queryParam("longTitle", "Test-long-0") .queryParam("objectives", "Test-objectives-0") .queryParam("testResourceableId", key).build(); HttpPut newTestMethod = conn.createPut(newTestUri, MediaType.APPLICATION_JSON, true); HttpResponse newTestCode = conn.execute(newTestMethod); assertTrue(newTestCode.getStatusLine().getStatusCode() == 200 || newTestCode.getStatusLine().getStatusCode() == 201); CourseNodeVO testNode = conn.parse(newTestCode, CourseNodeVO.class); assertNotNull(testNode); assertNotNull(testNode.getId()); assertEquals(testNode.getShortTitle(), "Test-0"); assertEquals(testNode.getParentId(), course.getEditorRootNodeId()); // configure test node URI testConfigUri = getElementsUri(course).path("test/"+testNode.getId()+"/configuration") .queryParam("allowCancel", Boolean.TRUE) .queryParam("allowNavigation", Boolean.TRUE) .queryParam("allowSuspend", Boolean.TRUE) .queryParam("numAttempts", 10) .queryParam("sequencePresentation", AssessmentInstance.QMD_ENTRY_SEQUENCE_ITEM) .queryParam("showNavigation", Boolean.TRUE) .queryParam("showQuestionTitle", Boolean.TRUE) .queryParam("showResultsAfterFinish", Boolean.TRUE) .queryParam("showResultsDependendOnDate", Boolean.TRUE) .queryParam("showResultsOnHomepage", key) .queryParam("showScoreInfo", Boolean.TRUE) .queryParam("showScoreProgress", Boolean.TRUE) .queryParam("showSectionsOnly", Boolean.TRUE) .queryParam("summaryPresentation", AssessmentInstance.QMD_ENTRY_SUMMARY_DETAILED) .queryParam("startDate", new Long(1280444400))//new Date(1280444400)) .queryParam("endDate", new Long(1293667200))//new Date(1293667200)) .build(); HttpPut testConfigMethod = conn.createPut(testConfigUri, MediaType.APPLICATION_JSON, true); HttpResponse testConfigCode = conn.execute(testConfigMethod); assertTrue(testConfigCode.getStatusLine().getStatusCode() == 200 || testConfigCode.getStatusLine().getStatusCode() == 201); EntityUtils.consume(testConfigCode.getEntity()); HttpGet getTestConfig = conn.createGet(testConfigUri, MediaType.APPLICATION_JSON, true); testConfigCode = conn.execute(getTestConfig); assertTrue(testConfigCode.getStatusLine().getStatusCode() == 200 || testConfigCode.getStatusLine().getStatusCode() == 201); TestConfigVO testConfig = conn.parse(testConfigCode, TestConfigVO.class); assertTrue(testConfig.getNumAttempts() == 10); assertTrue(testConfig.getAllowCancel()); assertTrue(testConfig.getSummeryPresentation().equals(AssessmentInstance.QMD_ENTRY_SUMMARY_DETAILED)); //create a survey node URL newSurveyUrl = CoursesElementsTest.class.getResource("questionnaire-demo.zip"); assertNotNull(newSurveyUrl); File surveyFile = new File(newSurveyUrl.toURI()); URI repoEntriesUri2 = UriBuilder.fromUri(getContextURI()).path("repo").path("entries").build(); HttpPut surveyRepoMethod = conn.createPut(repoEntriesUri2, MediaType.APPLICATION_JSON, true); HttpEntity surveyEntity = MultipartEntityBuilder.create() .setMode(HttpMultipartMode.BROWSER_COMPATIBLE) .addBinaryBody("file", surveyFile, ContentType.APPLICATION_OCTET_STREAM, surveyFile.getName()) .addTextBody("filename", "questionnaire-demo.zip") .addTextBody("resourcename", "Questionnaire demo") .addTextBody("displayname", "Questionnaire demo") .build(); surveyRepoMethod.setEntity(surveyEntity); HttpResponse surveyRepoCode = conn.execute(surveyRepoMethod); assertTrue(surveyRepoCode.getStatusLine().getStatusCode() == 200 || surveyRepoCode.getStatusLine().getStatusCode() == 201); RepositoryEntryVO newSurveyVO = conn.parse(surveyRepoCode, RepositoryEntryVO.class); assertNotNull(newSurveyVO); Long surveyKey = newSurveyVO.getKey(); RepositoryEntry surveyRE = RepositoryManager.getInstance().lookupRepositoryEntry(surveyKey); assertNotNull(surveyRE); assertNotNull(surveyRE.getOlatResource()); assertEquals("Questionnaire demo", surveyRE.getDisplayname()); URI newSurveyUri = getElementsUri(course).path("survey") .queryParam("parentNodeId", course.getEditorRootNodeId()) .queryParam("position", "9").queryParam("shortTitle", "Survey-0") .queryParam("longTitle", "Survey-long-0") .queryParam("objectives", "Survey-objectives-0") .queryParam("surveyResourceableId", surveyKey).build(); HttpPut newSurveyMethod = conn.createPut(newSurveyUri, MediaType.APPLICATION_JSON, true); HttpResponse newSurveyCode = conn.execute(newSurveyMethod); assertTrue(newSurveyCode.getStatusLine().getStatusCode() == 200 || newSurveyCode.getStatusLine().getStatusCode() == 201); CourseNodeVO surveyNode = conn.parse(newSurveyCode, CourseNodeVO.class); assertNotNull(surveyNode); assertNotNull(surveyNode.getId()); assertEquals(surveyNode.getShortTitle(), "Survey-0"); assertEquals(surveyNode.getParentId(), course.getEditorRootNodeId()); //configure survey node URI surveykConfigUri = getElementsUri(course).path("survey/"+surveyNode.getId()+"/configuration") .queryParam("allowCancel", Boolean.TRUE) .queryParam("allowNavigation", Boolean.TRUE) .queryParam("allowSuspend", Boolean.TRUE) .queryParam("sequencePresentation", AssessmentInstance.QMD_ENTRY_SEQUENCE_ITEM) .queryParam("showNavigation", Boolean.TRUE) .queryParam("showQuestionTitle", Boolean.TRUE) .queryParam("showSectionsOnly", Boolean.TRUE) .build(); HttpPut surveyConfigMethod = conn.createPut(surveykConfigUri, MediaType.APPLICATION_JSON, true); HttpResponse surveyConfigCode = conn.execute(surveyConfigMethod); assertTrue(surveyConfigCode.getStatusLine().getStatusCode() == 200 || surveyConfigCode.getStatusLine().getStatusCode() == 201); EntityUtils.consume(surveyConfigCode.getEntity()); HttpGet getSurveyConfig = conn.createGet(surveykConfigUri, MediaType.APPLICATION_JSON, true); surveyConfigCode = conn.execute(getSurveyConfig); assertTrue(surveyConfigCode.getStatusLine().getStatusCode() == 200 || surveyConfigCode.getStatusLine().getStatusCode() == 201); SurveyConfigVO surveyConfig = conn.parse(surveyConfigCode, SurveyConfigVO.class); assertNotNull(surveyConfig); assertTrue(surveyConfig.getAllowCancel()); //create an external page node URI newTUUri = getElementsUri(course).path("externalpage") .queryParam("parentNodeId", course.getEditorRootNodeId()) .queryParam("position", "10") .queryParam("shortTitle", "ExternalPage-0") .queryParam("longTitle", "ExternalPage-long-0") .queryParam("objectives", "ExternalPage-objectives-0") .queryParam("url","http://www.olat.org").build(); HttpPut newTUMethod = conn.createPut(newTUUri, MediaType.APPLICATION_JSON, true); HttpResponse newTUCode = conn.execute(newTUMethod); assertEquals(200, newTUCode.getStatusLine().getStatusCode()); CourseNodeVO tuNode = conn.parse(newTUCode, CourseNodeVO.class); assertNotNull(tuNode); assertNotNull(tuNode.getId()); assertEquals(tuNode.getShortTitle(), "ExternalPage-0"); assertEquals(tuNode.getLongTitle(), "ExternalPage-long-0"); assertEquals(tuNode.getLearningObjectives(), "ExternalPage-objectives-0"); assertEquals(tuNode.getParentId(), course.getEditorRootNodeId()); //summary check ICourse realCourse = CourseFactory.loadCourse(course.getKey()); TreeNode realRoot = realCourse.getEditorTreeModel().getRootNode(); assertEquals(11, realRoot.getChildCount()); //structure CourseEditorTreeNode child = (CourseEditorTreeNode)realRoot.getChildAt(0); CourseNode childNode = child.getCourseNode(); assertTrue(childNode instanceof STCourseNode); //single page child = (CourseEditorTreeNode)realRoot.getChildAt(1); childNode = child.getCourseNode(); assertTrue(childNode instanceof SPCourseNode); //folder child = (CourseEditorTreeNode)realRoot.getChildAt(2); childNode = child.getCourseNode(); assertTrue(childNode instanceof BCCourseNode); //forum child = (CourseEditorTreeNode)realRoot.getChildAt(3); childNode = child.getCourseNode(); assertTrue(childNode instanceof FOCourseNode); //task child = (CourseEditorTreeNode)realRoot.getChildAt(4); childNode = child.getCourseNode(); assertTrue(childNode instanceof TACourseNode); //assessment child = (CourseEditorTreeNode)realRoot.getChildAt(5); childNode = child.getCourseNode(); assertTrue(childNode instanceof MSCourseNode); //contact child = (CourseEditorTreeNode)realRoot.getChildAt(6); childNode = child.getCourseNode(); assertTrue(childNode instanceof COCourseNode); //enrollment child = (CourseEditorTreeNode)realRoot.getChildAt(7); childNode = child.getCourseNode(); assertTrue(childNode instanceof ENCourseNode); //test child = (CourseEditorTreeNode) realRoot.getChildAt(8); childNode = child.getCourseNode(); assertTrue(childNode instanceof IQTESTCourseNode); //survey child = (CourseEditorTreeNode) realRoot.getChildAt(9); childNode = child.getCourseNode(); assertTrue(childNode instanceof IQSURVCourseNode); //external page child = (CourseEditorTreeNode) realRoot.getChildAt(10); childNode = child.getCourseNode(); assertTrue(childNode instanceof TUCourseNode); //attach file to task child = (CourseEditorTreeNode)realRoot.getChildAt(4); childNode = child.getCourseNode(); URI attachTaskFileUri = getElementsUri(course).path("task").path(childNode.getIdent()).path("file") .queryParam("filename", "singlepage.html").build(); HttpPut taskFileMethod = conn.createPut(attachTaskFileUri, MediaType.APPLICATION_JSON, true); conn.addMultipart(taskFileMethod, page.getName(), page); HttpResponse taskFileCode = conn.execute(taskFileMethod); assertEquals(200, taskFileCode.getStatusLine().getStatusCode()); String taskFolderPath = TACourseNode.getTaskFolderPathRelToFolderRoot(realCourse, childNode); OlatRootFolderImpl taskFolder = new OlatRootFolderImpl(taskFolderPath, null); VFSLeaf singleFile = (VFSLeaf) taskFolder.resolve("/" + "singlepage.html"); assertNotNull(singleFile); } @Test //fxdiff FXOLAT-122: course management public void testUpdateRootNodeCoursePost() throws IOException, URISyntaxException { assertTrue(conn.login("administrator", "openolat")); //create an empty course URI uri = getCoursesUri().queryParam("shortTitle", "course4").queryParam("title", "course4 long name").build(); HttpPut method = conn.createPut(uri, MediaType.APPLICATION_JSON, true); HttpResponse response = conn.execute(method); assertEquals(200, response.getStatusLine().getStatusCode()); CourseVO course = conn.parse(response, CourseVO.class); assertNotNull(course); assertNotNull(course.getKey()); assertNotNull(course.getEditorRootNodeId()); //update the root node URI rootUri = getElementsUri(course).path("structure").path(course.getEditorRootNodeId()).build(); HttpPost updateMethod = conn.createPost(rootUri, MediaType.APPLICATION_JSON); HttpEntity entity = MultipartEntityBuilder.create() .setMode(HttpMultipartMode.BROWSER_COMPATIBLE) .addTextBody("shortTitle", "Structure-0b") .addTextBody("longTitle", "Structure-long-0b") .addTextBody("objectives", "Structure-objectives-0b") .build(); updateMethod.setEntity(entity); HttpResponse newStructureResponse = conn.execute(updateMethod); int newStructureCode = newStructureResponse.getStatusLine().getStatusCode(); assertTrue(newStructureCode == 200 || newStructureCode == 201); //check the response CourseNodeVO structureNode = conn.parse(newStructureResponse, CourseNodeVO.class); assertNotNull(structureNode); assertNotNull(structureNode.getId()); assertEquals(structureNode.getShortTitle(), "Structure-0b"); assertEquals(structureNode.getLongTitle(), "Structure-long-0b"); assertEquals(structureNode.getLearningObjectives(), "Structure-objectives-0b"); assertEquals(structureNode.getId(), course.getEditorRootNodeId()); //check the real node ICourse realCourse = CourseFactory.loadCourse(course.getKey()); CourseEditorTreeModel editorTreeModel = realCourse.getEditorTreeModel(); CourseEditorTreeNode rootNode = (CourseEditorTreeNode)editorTreeModel.getRootNode(); assertNotNull(rootNode); assertNotNull(rootNode.getIdent()); assertNotNull(rootNode.getCourseNode()); assertEquals(rootNode.getCourseNode().getShortTitle(), "Structure-0b"); assertEquals(rootNode.getCourseNode().getLongTitle(), "Structure-long-0b"); assertEquals(rootNode.getCourseNode().getLearningObjectives(), "Structure-objectives-0b"); } @Test //fxdiff FXOLAT-122: course management public void testUpdateRootNodeCoursePostWithFile() throws IOException, URISyntaxException { assertTrue(conn.login("administrator", "openolat")); //create an empty course URI uri = getCoursesUri().queryParam("shortTitle", "course5").queryParam("title", "course5 long name").build(); HttpPut method = conn.createPut(uri, MediaType.APPLICATION_JSON, true); HttpResponse response = conn.execute(method); assertEquals(200, response.getStatusLine().getStatusCode()); CourseVO course = conn.parse(response, CourseVO.class); assertNotNull(course); assertNotNull(course.getKey()); assertNotNull(course.getEditorRootNodeId()); //the page URL pageUrl = RepositoryEntriesTest.class.getResource("singlepage.html"); assertNotNull(pageUrl); File page = new File(pageUrl.toURI()); //update the root node URI rootUri = getElementsUri(course).path("structure").path(course.getEditorRootNodeId()).build(); HttpPost newStructureMethod = conn.createPost(rootUri, MediaType.APPLICATION_JSON); HttpEntity entity = MultipartEntityBuilder.create() .setMode(HttpMultipartMode.BROWSER_COMPATIBLE) .addBinaryBody("file", page, ContentType.APPLICATION_OCTET_STREAM, page.getName()) .addTextBody("filename", page.getName()) .addTextBody("parentNodeId", course.getEditorRootNodeId()) .addTextBody("position", "1") .addTextBody("shortTitle", "Structure-0-with-file") .addTextBody("longTitle", "Structure-long-0-with-file") .addTextBody("objectives", "Structure-objectives-0-with-file") .addTextBody("displayType", "file") .build(); newStructureMethod.setEntity(entity); HttpResponse newStructureCode = conn.execute(newStructureMethod); assertTrue(newStructureCode.getStatusLine().getStatusCode() == 200 || newStructureCode.getStatusLine().getStatusCode() == 201); //check the response CourseNodeVO structureNode = conn.parse(newStructureCode, CourseNodeVO.class); assertNotNull(structureNode); assertNotNull(structureNode.getId()); assertEquals(structureNode.getShortTitle(), "Structure-0-with-file"); assertEquals(structureNode.getLongTitle(), "Structure-long-0-with-file"); assertEquals(structureNode.getLearningObjectives(), "Structure-objectives-0-with-file"); assertEquals(structureNode.getId(), course.getEditorRootNodeId()); //check the real node ICourse realCourse = CourseFactory.loadCourse(course.getKey()); CourseEditorTreeModel editorTreeModel = realCourse.getEditorTreeModel(); CourseEditorTreeNode rootNode = (CourseEditorTreeNode)editorTreeModel.getRootNode(); assertNotNull(rootNode); assertNotNull(rootNode.getIdent()); assertNotNull(rootNode.getCourseNode()); assertEquals(rootNode.getCourseNode().getShortTitle(), "Structure-0-with-file"); assertEquals(rootNode.getCourseNode().getLongTitle(), "Structure-long-0-with-file"); assertEquals(rootNode.getCourseNode().getLearningObjectives(), "Structure-objectives-0-with-file"); } private UriBuilder getCoursesUri() { return UriBuilder.fromUri(getContextURI()).path("repo").path("courses"); } private UriBuilder getElementsUri(CourseVO course) { return getCoursesUri().path(course.getKey().toString()).path("elements"); } }