/**********************************************************************************
* $URL: https://source.sakaiproject.org/svn/edu-services/trunk/cm-service/cm-impl/integration-test/src/test/org/sakaiproject/coursemanagement/impl/CmIntegrationTest.java $
* $Id: CmIntegrationTest.java 105077 2012-02-24 22:54:29Z ottenhoff@longsight.com $
***********************************************************************************
*
* Copyright (c) 2006, 2007, 2008 The Sakai Foundation
*
* Licensed under the Educational Community License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.opensource.org/licenses/ECL-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
**********************************************************************************/
package org.sakaiproject.coursemanagement.impl;
import java.util.HashSet;
import java.util.Set;
import junit.extensions.TestSetup;
import junit.framework.Assert;
import junit.framework.Test;
import junit.framework.TestSuite;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.sakaiproject.authz.api.AuthzGroup;
import org.sakaiproject.authz.api.AuthzGroupService;
import org.sakaiproject.authz.api.Member;
import org.sakaiproject.coursemanagement.api.CourseManagementAdministration;
import org.sakaiproject.site.api.Site;
import org.sakaiproject.site.api.SiteService;
import org.sakaiproject.test.SakaiTestBase;
import org.sakaiproject.tool.api.Session;
import org.sakaiproject.tool.api.SessionManager;
import org.sakaiproject.user.api.UserDirectoryService;
/**
* Integration tests for the CM services. The CmGroupProvider must be registered
* with the component manager for these tests to pass.
*
* @author <a href="mailto:jholtzman@berkeley.edu">Josh Holtzman</a>
*
*/
public class CmIntegrationTest extends SakaiTestBase {
private static final Log log = LogFactory.getLog(CmIntegrationTest.class);
private AuthzGroupService authzGroupService;
private SiteService siteService;
private CourseManagementAdministration cmAdmin;
private UserDirectoryService uds;
private SessionManager sessionManager;
private Site site;
public static Test suite() {
TestSetup setup = new TestSetup(new TestSuite(CmIntegrationTest.class)) {
protected void setUp() throws Exception {
log.debug("starting setup");
oneTimeSetup();
log.debug("finished setup");
}
protected void tearDown() throws Exception {
oneTimeTearDown();
}
};
return setup;
}
public void setUp() throws Exception {
log.debug("Setting up a CmIntegrationTest test");
// Connect to the required services
authzGroupService = (AuthzGroupService)getService(AuthzGroupService.class.getName());
siteService = (SiteService)getService(SiteService.class.getName());
cmAdmin = (CourseManagementAdministration)getService(CourseManagementAdministration.class.getName());
uds = (UserDirectoryService)getService(UserDirectoryService.class.getName());
// Log in
sessionManager = (SessionManager)getService(SessionManager.class.getName());
Session session = sessionManager.getCurrentSession();
session.setUserId("admin");
// Create some Sakai users (who will be added to the site by the CMGroupProvider)
uds.addUser("cm-student1", "cm-student1", "cm-student", "CM-one", "cm-student1@foo.bar", "cm-student1", null, null);
uds.addUser("cm-student2", "cm-student2", "cm-student", "CM-two", "cm-student2@foo.bar", "cm-student2", null, null);
uds.addUser("cm-instructor1", "cm-instructor1", "cm-instructor", "CM-one", "cm-instructor1@foo.bar", "cm-instructor1", null, null);
uds.addUser("cm-instructor2", "cm-instructor2", "cm-instructor", "CM-two", "cm-instructor2@foo.bar", "cm-instructor2", null, null);
// Create CM objects
cmAdmin.createAcademicSession("CM-AS1","CM-AS1", "CM-AS1", null, null);
cmAdmin.createCanonicalCourse("CM-CC1", "CM-CC1", "CM-CC1");
cmAdmin.createCourseOffering("CM-CO1", "CM-CO1", "CM-CO1", "open", "CM-AS1", "CM-CC1", null, null);
Set instructors = new HashSet();
instructors.add("cm-instructor1");
cmAdmin.createEnrollmentSet("CM-ES1", "CM-ES1", "CM-ES1", "lecture", "3", "CM-CO1", instructors);
cmAdmin.createSection("CM-SEC1", "CM-SEC1", "CM-SEC1", "lecture", null, "CM-CO1", "CM-ES1");
// Create some CM memberships, etc
cmAdmin.addOrUpdateCourseOfferingMembership("cm-instructor2", "Just helping out with guest lectures", "CM-CO1","active");
cmAdmin.addOrUpdateEnrollment("cm-student1", "CM-ES1", "wait", "4", "letter grade");
// Create a site
site = siteService.addSite("CM1", "course");
site.setTitle("CM Integration Test Site");
site.setProviderGroupId("CM-SEC1");
siteService.save(site);
// This (or something similar) is needed to trigger the authz provider update, I think
String siteRef = site.getReference();
AuthzGroup azg = authzGroupService.getAuthzGroup(siteRef);
// Ensure that the azg has the correct provider id
Assert.assertEquals("CM-SEC1", azg.getProviderGroupId());
azg.addMember("cm-student2", "Student", true, false);
authzGroupService.save(azg);
// Now we have all of our users as members of the site: student1 is enrolled,
// student2 was manually added, instructor1 is an official instructor, and
// instructor2 has a membership in the course offering.
}
public void tearDown() throws Exception {
log.debug("Tearing down an AuthzIntegrationTest test");
// Remove the objects created for testing
uds.removeUser(uds.editUser("cm-student1"));
uds.removeUser(uds.editUser("cm-student2"));
uds.removeUser(uds.editUser("cm-instructor1"));
uds.removeUser(uds.editUser("cm-instructor2"));
cmAdmin.removeSection("CM-SEC1");
cmAdmin.removeEnrollmentSet("CM-ES1");
cmAdmin.removeCourseOffering("CM-CO1");
cmAdmin.removeCanonicalCourse("CM-CC1");
cmAdmin.removeAcademicSession("CM-AS1");
siteService.removeSite(site);
}
public void testCmGroupProvider() throws Exception {
// Our official instructors, enrollments and CM memberships should be expressed as sakai members
Site site = siteService.getSite("CM1");
// Of course, our manually added member should be here
Member manualMember = site.getMember("cm-student2");
Assert.assertNotNull(manualMember);
Assert.assertEquals("Student", manualMember.getRole().getId());
// Our CM-defined student should be here, too
Member student = site.getMember("cm-student1");
Assert.assertNotNull(student);
Assert.assertEquals("Student", student.getRole().getId());
}
public void testCmAdminAuthz() throws Exception {
sessionManager.getCurrentSession().invalidate();
sessionManager.getCurrentSession().setUserId("cm-student1");
try {
cmAdmin.createCanonicalCourse("CM-CC2", "CM-CC2", "CM-CC2");
fail();
} catch (Exception e) {
log.debug("Trying to create a course as a student threw exception ", e);
}
sessionManager.getCurrentSession().invalidate();
sessionManager.getCurrentSession().setUserId("admin");
}
}