/**
* 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.assertNull;
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 java.util.Locale;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.UriBuilder;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpDelete;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPut;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.olat.basesecurity.BaseSecurityManager;
import org.olat.core.commons.modules.bc.vfs.OlatNamedContainerImpl;
import org.olat.core.commons.persistence.DBFactory;
import org.olat.core.id.Identity;
import org.olat.core.util.vfs.VFSContainer;
import org.olat.core.util.vfs.VFSItem;
import org.olat.course.CourseFactory;
import org.olat.course.ICourse;
import org.olat.course.nodes.BCCourseNode;
import org.olat.course.nodes.CourseNode;
import org.olat.course.nodes.CourseNodeConfiguration;
import org.olat.course.nodes.CourseNodeFactory;
import org.olat.repository.RepositoryEntry;
import org.olat.restapi.repository.course.CoursesWebService;
import org.olat.restapi.support.vo.FolderVO;
import org.olat.restapi.support.vo.FolderVOes;
import org.olat.test.JunitTestHelper;
import org.olat.test.OlatJerseyTestCase;
public class CoursesFoldersTest extends OlatJerseyTestCase {
private static ICourse course1;
private static CourseNode bcNode;
private static Identity admin, user;
private RestConnection conn;
@Before
public void setUp() throws Exception {
super.setUp();
conn = new RestConnection();
admin = BaseSecurityManager.getInstance().findIdentityByName("administrator");
user = JunitTestHelper.createAndPersistIdentityAsUser("rest-cf-one");
course1 = CoursesWebService.createEmptyCourse(admin, "course1", "course1 long name", null);
DBFactory.getInstance().intermediateCommit();
//create a folder
CourseNodeConfiguration newNodeConfig = CourseNodeFactory.getInstance().getCourseNodeConfiguration("bc");
bcNode = newNodeConfig.getInstance();
bcNode.setShortTitle("Folder");
bcNode.setLearningObjectives("Folder objectives");
bcNode.setNoAccessExplanation("You don't have access");
course1.getEditorTreeModel().addCourseNode(bcNode, course1.getRunStructure().getRootNode());
CourseFactory.publishCourse(course1, RepositoryEntry.ACC_USERS, false, admin, Locale.ENGLISH);
DBFactory.getInstance().intermediateCommit();
}
@After
public void tearDown() throws Exception {
try {
if(conn != null) {
conn.shutdown();
}
} catch (Exception e) {
e.printStackTrace();
throw e;
}
}
@Test
public void testGetFolderInfo() throws IOException, URISyntaxException {
boolean loggedIN = conn.login("administrator", "openolat");
assertTrue(loggedIN);
URI uri = UriBuilder.fromUri(getNodeURI()).build();
HttpGet get = conn.createGet(uri, MediaType.APPLICATION_JSON, true);
HttpResponse response = conn.execute(get);
assertEquals(200, response.getStatusLine().getStatusCode());
FolderVO folder = conn.parse(response, FolderVO.class);
assertNotNull(folder);
}
/**
* Check that the permission check are not to restrictive
* @throws IOException
* @throws URISyntaxException
*/
@Test
public void testGetFolderInfoByUser() throws IOException, URISyntaxException {
boolean loggedIN = conn.login(user.getName(), "A6B7C8");
assertTrue(loggedIN);
URI uri = UriBuilder.fromUri(getNodeURI()).build();
HttpGet get = conn.createGet(uri, MediaType.APPLICATION_JSON, true);
HttpResponse response = conn.execute(get);
assertEquals(200, response.getStatusLine().getStatusCode());
FolderVO folder = conn.parse(response, FolderVO.class);
assertNotNull(folder);
}
@Test
public void testGetFoldersInfo() throws IOException, URISyntaxException {
boolean loggedIN = conn.login("administrator", "openolat");
assertTrue(loggedIN);
URI uri = UriBuilder.fromUri(getNodesURI()).build();
HttpGet get = conn.createGet(uri, MediaType.APPLICATION_JSON, true);
HttpResponse response = conn.execute(get);
assertEquals(200, response.getStatusLine().getStatusCode());
FolderVOes folders = conn.parse(response, FolderVOes.class);
assertNotNull(folders);
assertEquals(1, folders.getTotalCount());
assertNotNull(folders.getFolders());
assertEquals(1, folders.getFolders().length);
}
@Test
public void testUploadFile() throws IOException, URISyntaxException {
assertTrue(conn.login("administrator", "openolat"));
URI uri = UriBuilder.fromUri(getNodeURI()).path("files").build();
//create single page
URL fileUrl = CoursesFoldersTest.class.getResource("singlepage.html");
assertNotNull(fileUrl);
File file = new File(fileUrl.toURI());
HttpPut method = conn.createPut(uri, MediaType.APPLICATION_JSON, true);
conn.addMultipart(method, file.getName(), file);
HttpResponse response = conn.execute(method);
assertEquals(200, response.getStatusLine().getStatusCode());
OlatNamedContainerImpl folder = BCCourseNode.getNodeFolderContainer((BCCourseNode)bcNode, course1.getCourseEnvironment());
VFSItem item = folder.resolve(file.getName());
assertNotNull(item);
}
@Test
public void testCreateFolder() throws IOException, URISyntaxException {
assertTrue(conn.login("administrator", "openolat"));
URI uri = UriBuilder.fromUri(getNodeURI()).path("files").path("RootFolder").build();
HttpPut method = conn.createPut(uri, MediaType.APPLICATION_JSON, true);
HttpResponse response = conn.execute(method);
assertEquals(200, response.getStatusLine().getStatusCode());
OlatNamedContainerImpl folder = BCCourseNode.getNodeFolderContainer((BCCourseNode)bcNode, course1.getCourseEnvironment());
VFSItem item = folder.resolve("RootFolder");
assertNotNull(item);
assertTrue(item instanceof VFSContainer);
}
@Test
public void testCreateFolders() throws IOException, URISyntaxException {
assertTrue(conn.login("administrator", "openolat"));
URI uri = UriBuilder.fromUri(getNodeURI()).path("files").path("NewFolder1").path("NewFolder2").build();
HttpPut method = conn.createPut(uri, MediaType.APPLICATION_JSON, true);
HttpResponse response = conn.execute(method);
assertEquals(200, response.getStatusLine().getStatusCode());
OlatNamedContainerImpl folder = BCCourseNode.getNodeFolderContainer((BCCourseNode)bcNode, course1.getCourseEnvironment());
VFSItem item = folder.resolve("NewFolder1");
assertNotNull(item);
assertTrue(item instanceof VFSContainer);
VFSContainer newFolder1 = (VFSContainer)item;
VFSItem item2 = newFolder1.resolve("NewFolder2");
assertNotNull(item2);
assertTrue(item2 instanceof VFSContainer);
}
@Test
public void deleteFolder() throws IOException, URISyntaxException {
//add some folders
OlatNamedContainerImpl folder = BCCourseNode.getNodeFolderContainer((BCCourseNode)bcNode, course1.getCourseEnvironment());
VFSItem item = folder.resolve("FolderToDelete");
if(item == null) {
folder.createChildContainer("FolderToDelete");
}
assertTrue(conn.login("administrator", "openolat"));
URI uri = UriBuilder.fromUri(getNodeURI()).path("files").path("FolderToDelete").build();
HttpDelete method = conn.createDelete(uri, MediaType.APPLICATION_JSON);
HttpResponse response = conn.execute(method);
assertEquals(200, response.getStatusLine().getStatusCode());
VFSItem deletedItem = folder.resolve("FolderToDelete");
assertNull(deletedItem);
}
private URI getNodeURI() {
return UriBuilder.fromUri(getContextURI()).path("repo").path("courses").path(course1.getResourceableId().toString())
.path("elements").path("folder").path(bcNode.getIdent()).build();
}
private URI getNodesURI() {
return UriBuilder.fromUri(getContextURI()).path("repo").path("courses").path(course1.getResourceableId().toString())
.path("elements").path("folder").build();
}
}