/**********************************************************************************
* $URL: https://source.sakaiproject.org/svn/edu-services/trunk/cm-service/cm-impl/hibernate-impl/impl/src/test/org/sakaiproject/coursemanagement/test/CourseManagementAdministrationTest.java $
* $Id: CourseManagementAdministrationTest.java 123788 2013-05-07 19:06:04Z matthew@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.test;
import java.sql.Time;
import java.util.Arrays;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import junit.framework.Assert;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.sakaiproject.coursemanagement.api.AcademicSession;
import org.sakaiproject.coursemanagement.api.CanonicalCourse;
import org.sakaiproject.coursemanagement.api.CourseManagementAdministration;
import org.sakaiproject.coursemanagement.api.CourseManagementService;
import org.sakaiproject.coursemanagement.api.CourseOffering;
import org.sakaiproject.coursemanagement.api.Enrollment;
import org.sakaiproject.coursemanagement.api.Meeting;
import org.sakaiproject.coursemanagement.api.Membership;
import org.sakaiproject.coursemanagement.api.Section;
import org.sakaiproject.coursemanagement.api.exception.IdExistsException;
import org.sakaiproject.coursemanagement.api.exception.IdNotFoundException;
import org.sakaiproject.coursemanagement.impl.EnrollmentCmImpl;
public class CourseManagementAdministrationTest extends CourseManagementTestBase {
private static final Log log = LogFactory.getLog(CourseManagementAdministrationTest.class);
private CourseManagementService cm;
private CourseManagementAdministration cmAdmin;
protected void onSetUpBeforeTransaction() throws Exception {
}
protected void onSetUpInTransaction() throws Exception {
cm = (CourseManagementService)applicationContext.getBean("org.sakaiproject.coursemanagement.api.CourseManagementService");
cmAdmin = (CourseManagementAdministration)applicationContext.getBean("org.sakaiproject.coursemanagement.api.CourseManagementAdministration");
}
public void testCreateAcademicSession() throws Exception {
cmAdmin.createAcademicSession("as1", "academic session 1", "an academic session", new Date(), new Date());
Assert.assertTrue(cm.getAcademicSession("as1").getTitle().equals("academic session 1"));
try {
cmAdmin.createAcademicSession("as1", "foo", "foo", null, null);
fail();
} catch (IdExistsException ide) {}
}
public void testCreateCanonicalCourse() throws Exception {
cmAdmin.createCanonicalCourse("cc1", "cc 1", "a canon course");
Assert.assertTrue(cm.getCanonicalCourse("cc1").getTitle().equals("cc 1"));
try {
cmAdmin.createCanonicalCourse("cc1", "another canon course", "another canonical course");
fail();
} catch (IdExistsException ide) {}
}
public void testCreateCourseOffering() throws Exception {
cmAdmin.createAcademicSession("as1", "academic session 1", "an academic session", new Date(), new Date());
cmAdmin.createCanonicalCourse("cc1", "cc 1", "a canon course");
cmAdmin.createCourseOffering("co1", "co 1", "a course offering", "open", "as1","cc1", null, null);
Assert.assertTrue(cm.getCourseOffering("co1").getTitle().equals("co 1"));
try {
cmAdmin.createCourseOffering("co1", "another course", "another course", "open", "as1", "cc1", null, null);
fail();
} catch (IdExistsException ide) {}
}
public void testCreateCourseSet() throws Exception {
cmAdmin.createCourseSet("cs1", "set 1", "a course set", null, null);
Assert.assertTrue(cm.getCourseSet("cs1").getTitle().equals("set 1"));
try {
cmAdmin.createCourseSet("cs1", "another set 1", "another cset", null, null);
fail();
} catch (IdExistsException ide) {}
}
public void testAddCanonicalCourseToCourseSet() throws Exception {
cmAdmin.createCourseSet("cs1", "course set", "course set", null, null);
cmAdmin.createCanonicalCourse("cc1", "canon course 1", "canon course");
cmAdmin.addCanonicalCourseToCourseSet("cs1", "cc1");
CanonicalCourse cc = cm.getCanonicalCourse("cc1");
Assert.assertTrue(cm.getCanonicalCourses("cs1").contains(cc));
}
public void testRemoveCanonicalCourseFromCourseSet() throws Exception {
cmAdmin.createCourseSet("cs1", "course set", "course set", null, null);
cmAdmin.createCanonicalCourse("cc1", "canon course 1", "canon course");
cmAdmin.addCanonicalCourseToCourseSet("cs1", "cc1");
cmAdmin.removeCanonicalCourseFromCourseSet("cs1", "cc1");
CanonicalCourse cc = cm.getCanonicalCourse("cc1");
Assert.assertFalse(cm.getCanonicalCourses("cs1").contains(cc));
}
public void testAddCourseOfferingToCourseSet() throws Exception {
cmAdmin.createCourseSet("cs1", "course set", "course set", null, null);
cmAdmin.createCanonicalCourse("cc1", "cc 1", "a canon course");
cmAdmin.createAcademicSession("as1", "academic session 1", "an academic session", new Date(), new Date());
cmAdmin.createCourseOffering("co1", "course 1", "course", "open", "as1", "cc1", null, null);
cmAdmin.addCourseOfferingToCourseSet("cs1", "co1");
CourseOffering co = cm.getCourseOffering("co1");
Assert.assertTrue(cm.getCourseOfferingsInCourseSet("cs1").contains(co));
}
public void testRemoveCourseOfferingFromCourseSet() throws Exception {
cmAdmin.createCourseSet("cs1", "course set", "course set",null, null);
cmAdmin.createCanonicalCourse("cc1", "cc 1", "a canon course");
cmAdmin.createAcademicSession("as1", "academic session 1", "an academic session", new Date(), new Date());
cmAdmin.createCourseOffering("co1", "course 1", "course", "open", "as1", "cc1", null, null);
cmAdmin.addCourseOfferingToCourseSet("cs1", "co1");
cmAdmin.removeCourseOfferingFromCourseSet("cs1", "co1");
CourseOffering co = cm.getCourseOffering("co1");
Assert.assertFalse(cm.getCourseOfferingsInCourseSet("cs1").contains(co));
}
public void testSetEquivalentCanonicalCourses() throws Exception {
// Create some courses
cmAdmin.createCanonicalCourse("cc1", "cc1", "cc1");
cmAdmin.createCanonicalCourse("cc2", "cc2", "cc2");
cmAdmin.createCanonicalCourse("cc3", "cc3", "cc3");
// Add them to a set
Set<CanonicalCourse> courses = new HashSet<CanonicalCourse>();
courses.add(cm.getCanonicalCourse("cc1"));
courses.add(cm.getCanonicalCourse("cc2"));
courses.add(cm.getCanonicalCourse("cc3"));
// Crosslist them
cmAdmin.setEquivalentCanonicalCourses(courses);
// Ensure that CM sees them as crosslisted
Set<CanonicalCourse> equivalents = cm.getEquivalentCanonicalCourses("cc1");
Assert.assertTrue(equivalents.contains(cm.getCanonicalCourse("cc2")));
Assert.assertTrue(equivalents.contains(cm.getCanonicalCourse("cc3")));
// Ensure that we can remove one of the equivalents
courses.remove(cm.getCanonicalCourse("cc3"));
cmAdmin.setEquivalentCanonicalCourses(courses);
equivalents = cm.getEquivalentCanonicalCourses("cc1");
Assert.assertTrue(equivalents.contains(cm.getCanonicalCourse("cc2")));
Assert.assertFalse(equivalents.contains(cm.getCanonicalCourse("cc3")));
}
public void testRemoveEquivalencyCanonCourse() throws Exception {
// Create some courses
cmAdmin.createCanonicalCourse("cc1", "cc1", "cc1");
cmAdmin.createCanonicalCourse("cc2", "cc2", "cc2");
cmAdmin.createCanonicalCourse("cc3", "cc3", "cc3");
// Add them to a set
Set<CanonicalCourse> courses = new HashSet<CanonicalCourse>();
courses.add(cm.getCanonicalCourse("cc1"));
courses.add(cm.getCanonicalCourse("cc2"));
// Crosslist them
cmAdmin.setEquivalentCanonicalCourses(courses);
// Remove a course that was crosslisted
Assert.assertTrue(cmAdmin.removeEquivalency(cm.getCanonicalCourse("cc1")));
// Remove one that wasn't crosslisted
Assert.assertFalse(cmAdmin.removeEquivalency(cm.getCanonicalCourse("cc3")));
}
public void testSetEquivalentCourseOfferings() throws Exception {
cmAdmin.createAcademicSession("as1", "academic session 1", "an academic session", new Date(), new Date());
cmAdmin.createAcademicSession("as2", "academic session 2", "another academic session", new Date(), new Date());
cmAdmin.createCanonicalCourse("cc1", "cc1", "cc1");
cmAdmin.createCourseOffering("co1", "co1", "co1", "", "as1", "cc1", null, null);
cmAdmin.createCourseOffering("co2", "co2", "co2", "", "as2", "cc1", null, null);
// Add them to a set
Set<CourseOffering> courses = new HashSet<CourseOffering>();
courses.add(cm.getCourseOffering("co1"));
courses.add(cm.getCourseOffering("co2"));
// Crosslist them
cmAdmin.setEquivalentCourseOfferings(courses);
// Ensure that CM sees them as crosslisted
Set<CourseOffering> equivalents = cm.getEquivalentCourseOfferings("co1");
Assert.assertTrue(equivalents.contains(cm.getCourseOffering("co2")));
}
public void testCreateEnrollmentSet() throws Exception {
cmAdmin.createAcademicSession("as1", "academic session 1", "an academic session", new Date(), new Date());
cmAdmin.createCanonicalCourse("cc1", "cc 1", "a canon course");
cmAdmin.createCourseOffering("co1", "course 1", "course", "open", "as1", "cc1", null, null);
cmAdmin.createEnrollmentSet("es1", "enr set 1", "an enr set", "lecture", "3", "co1", null);
Assert.assertTrue(cm.getEnrollmentSet("es1").getTitle().equals("enr set 1"));
try {
cmAdmin.createEnrollmentSet("es1", "enr set 1", "an enr set", "lecture", "3", "co1", null);
fail();
} catch (IdExistsException ide) {}
}
public void testAddEnrollment() throws Exception {
// Create the EnrollmentSet
cmAdmin.createAcademicSession("as1", "academic session 1", "an academic session", new Date(), new Date());
cmAdmin.createCanonicalCourse("cc1", "cc 1", "a canon course");
cmAdmin.createCourseOffering("co1", "course 1", "course", "open", "as1", "cc1", null, null);
cmAdmin.createEnrollmentSet("es1", "enr set 1", "an enr set", "lecture", "3", "co1", null);
// Add an enrollment
cmAdmin.addOrUpdateEnrollment("josh", "es1", "enrolled", "4", "pass/fail");
// Ensure that the enrollment exists
Assert.assertNotNull(cm.findEnrollment("josh", "es1"));
}
public void testUpdateEnrollment() throws Exception {
// Create the EnrollmentSet
cmAdmin.createAcademicSession("as1", "academic session 1", "an academic session", new Date(), new Date());
cmAdmin.createCanonicalCourse("cc1", "cc 1", "a canon course");
cmAdmin.createCourseOffering("co1", "course 1", "course", "open", "as1", "cc1", null, null);
cmAdmin.createEnrollmentSet("es1", "enr set 1", "an enr set", "lecture", "3", "co1", null);
// Add an enrollment
cmAdmin.addOrUpdateEnrollment("josh", "es1", "enrolled", "4", "pass/fail");
// Update the enrollment
cmAdmin.addOrUpdateEnrollment("josh", "es1", "waitlisted", "3", "lettter gradel");
// Ensure that the enrollment has been updated
Assert.assertEquals("waitlisted", cm.findEnrollment("josh", "es1").getEnrollmentStatus());
}
public void testDropEnrollment() throws Exception {
// Create the EnrollmentSet
cmAdmin.createAcademicSession("as1", "academic session 1", "an academic session", new Date(), new Date());
cmAdmin.createCanonicalCourse("cc1", "cc 1", "a canon course");
cmAdmin.createCourseOffering("co1", "course 1", "course", "open", "as1", "cc1", null, null);
cmAdmin.createEnrollmentSet("es1", "enr set 1", "an enr set", "lecture", "3", "co1", null);
// Add an enrollment
cmAdmin.addOrUpdateEnrollment("josh", "es1", "enrolled", "4", "pass/fail");
// Drop the enrollment
cmAdmin.removeEnrollment("josh", "es1");
// Ensure that the enrollment has been dropped
Assert.assertTrue(((Enrollment)cm.getEnrollments("es1").iterator().next()).isDropped());
// Add the same enrollment again
cmAdmin.addOrUpdateEnrollment("josh", "es1", "enrolled", "4", "pass/fail");
// Ensure that the hibernate version has been incremented
Assert.assertNotSame(Integer.valueOf(0), ((EnrollmentCmImpl)cm.getEnrollments("es1").iterator().next()).getVersion());
}
public void testAddCourseSetMembership() throws Exception {
// Create a course set
cmAdmin.createCourseSet("cs1", "cs1", "cs1", null, null);
// Create a membership in the courseSet
cmAdmin.addOrUpdateCourseSetMembership("josh", "student", "cs1", "active");
// Ensure that the membership was added
Assert.assertEquals(1, cm.getCourseSetMemberships("cs1").size());
// Add the same username, this time with a different role
cmAdmin.addOrUpdateCourseSetMembership("josh", "ta", "cs1","active");
// Ensure that the membership was updated, not added
Assert.assertEquals(1, cm.getCourseSetMemberships("cs1").size());
Assert.assertEquals("ta", ((Membership)cm.getCourseSetMemberships("cs1").iterator().next()).getRole());
}
public void testRemoveCourseSetMembers() throws Exception {
// Create a course set
cmAdmin.createCourseSet("cs1", "cs1", "cs1", null, null);
// Create a membership in the courseSet
cmAdmin.addOrUpdateCourseSetMembership("josh", "student", "cs1", "active");
// Remove the membership (should return true)
Assert.assertTrue(cmAdmin.removeCourseSetMembership("josh", "cs1"));
// Try to remove it again (should return false)
Assert.assertFalse(cmAdmin.removeCourseSetMembership("josh", "cs1"));
}
public void testAddCourseOfferingMembership() throws Exception {
// Create a course offering
cmAdmin.createAcademicSession("as1", "academic session 1", "an academic session", new Date(), new Date());
cmAdmin.createCanonicalCourse("cc1", "cc 1", "a canon course");
cmAdmin.createCourseOffering("co1", "course 1", "course", "open", "as1", "cc1", null, null);
// Create a membership in the courseOffering
cmAdmin.addOrUpdateCourseOfferingMembership("josh", "student", "co1", "active");
// Ensure that the membership was added
Assert.assertEquals(1, cm.getCourseOfferingMemberships("co1").size());
// Add the same username, this time with a different role
cmAdmin.addOrUpdateCourseOfferingMembership("josh", "ta", "co1", "active");
// Ensure that the membership was updated, not added
Assert.assertEquals(1, cm.getCourseOfferingMemberships("co1").size());
Assert.assertEquals("ta", ((Membership)cm.getCourseOfferingMemberships("co1").iterator().next()).getRole());
}
public void testRemoveCourseOfferingMembers() throws Exception {
// Create a course offering
cmAdmin.createAcademicSession("as1", "academic session 1", "an academic session", new Date(), new Date());
cmAdmin.createCanonicalCourse("cc1", "cc 1", "a canon course");
cmAdmin.createCourseOffering("co1", "course 1", "course", "open", "as1", "cc1", null, null);
// Create a membership in the courseOffering
cmAdmin.addOrUpdateCourseOfferingMembership("josh", "student", "co1", "active");
// Remove the membership (should return true)
Assert.assertTrue(cmAdmin.removeCourseOfferingMembership("josh", "co1"));
// Try to remove it again (should return false)
Assert.assertFalse(cmAdmin.removeCourseOfferingMembership("josh", "co1"));
}
public void testCreateSection() throws Exception {
// Create a course offering
cmAdmin.createAcademicSession("as1", "academic session 1", "an academic session", new Date(), new Date());
cmAdmin.createCanonicalCourse("cc1", "cc 1", "a canon course");
cmAdmin.createCourseOffering("co1", "course 1", "course", "open", "as1", "cc1", null, null);
cmAdmin.createSection("sec1", "sec 1", "a sec", "lecture", null, "co1", null);
Assert.assertTrue(cm.getSection("sec1").getTitle().equals("sec 1"));
try {
cmAdmin.createSection("sec1", "sec 1", "a sec", "lecture", null, null, null);
fail();
} catch (IdExistsException ide) {}
}
public void testAddSectionMembership() throws Exception {
// Create a course offering
cmAdmin.createAcademicSession("as1", "academic session 1", "an academic session", new Date(), new Date());
cmAdmin.createCanonicalCourse("cc1", "cc 1", "a canon course");
cmAdmin.createCourseOffering("co1", "course 1", "course", "open", "as1", "cc1", null, null);
// Add a section
cmAdmin.createSection("sec1", "sec1", "sec1", "sec1", null, "co1", null);
// Create a membership in the section
cmAdmin.addOrUpdateSectionMembership("josh", "student", "sec1", "active");
// Ensure that the membership was added
Assert.assertEquals(1, cm.getSectionMemberships("sec1").size());
// Add the same username, this time with a different role
cmAdmin.addOrUpdateSectionMembership("josh", "ta", "sec1", "active");
// Ensure that the membership was updated, not added
Assert.assertEquals(1, cm.getSectionMemberships("sec1").size());
Assert.assertEquals("ta", ((Membership)cm.getSectionMemberships("sec1").iterator().next()).getRole());
}
public void testRemoveSectionMembers() throws Exception {
// Create a course offering
cmAdmin.createAcademicSession("as1", "academic session 1", "an academic session", new Date(), new Date());
cmAdmin.createCanonicalCourse("cc1", "cc 1", "a canon course");
cmAdmin.createCourseOffering("co1", "course 1", "course", "open", "as1", "cc1", null, null);
// Add a section
cmAdmin.createSection("sec1", "sec1", "sec1", "sec1", null, "co1", null);
// Create a membership in the section
cmAdmin.addOrUpdateSectionMembership("josh", "student", "sec1", "active");
// Remove the membership (should return true)
Assert.assertTrue(cmAdmin.removeSectionMembership("josh", "sec1"));
// Try to remove it again (should return false)
Assert.assertFalse(cmAdmin.removeSectionMembership("josh", "sec1"));
}
public void testMeetingCascading() throws Exception {
// Create a course offering
cmAdmin.createAcademicSession("as1", "academic session 1", "an academic session", new Date(), new Date());
cmAdmin.createCanonicalCourse("cc1", "cc 1", "a canon course");
cmAdmin.createCourseOffering("co1", "course 1", "course", "open", "as1", "cc1", null, null);
// Add a section
Section section1 = cmAdmin.createSection("sec1", "sec1", "sec1", "sec1", null, "co1", null);
// Add some meetings for the section
Meeting meeting1 = cmAdmin.newSectionMeeting("sec1","a lecture hall", new Time(new Date().getTime()), new Time(new Date().getTime()), "If you're late, I won't let you in.");
section1.getMeetings().add(meeting1);
// Update the section
cmAdmin.updateSection(section1);
// Ensure that the section has the right meetings
Section section2 = cm.getSection("sec1");
Assert.assertEquals(1, section2.getMeetings().size());
Assert.assertEquals("a lecture hall", ((Meeting)section2.getMeetings().iterator().next()).getLocation());
}
public void testRemoveAcademicSession() throws Exception {
cmAdmin.createAcademicSession("foo", "foo", "foo", null, null);
// Ensure that the service can find the new AS
Assert.assertEquals("foo", cm.getAcademicSession("foo").getTitle());
// Remove the AS, and ensure that the service can no longer access it
cmAdmin.removeAcademicSession("foo");
try {
cm.getAcademicSession("foo");
fail();
} catch (IdNotFoundException ide) {}
}
public void testRemoveEnrollmentSet() throws Exception {
cmAdmin.createAcademicSession("as", "as", "as", null, null);
cmAdmin.createCanonicalCourse("cc", "cc", "cc");
cmAdmin.createCourseOffering("co", "co", "co", "co", "as", "cc", null, null);
cmAdmin.createEnrollmentSet("es", "es", "es", "es", "es", "co", null);
cmAdmin.addOrUpdateEnrollment("student1","es","enrolled", "4", "letter grade");
// Remove the ES
cmAdmin.removeEnrollmentSet("es");
// Ensure that the enrollment was deleted as well
Assert.assertEquals(0, cm.getEnrollments("es").size());
// Ensure that the CM service can no longer find the ES
try {
cm.getEnrollmentSet("es");
fail();
} catch (IdNotFoundException ide) {}
}
public void testRemoveSection() throws Exception {
cmAdmin.createAcademicSession("as", "as", "as", null, null);
cmAdmin.createCanonicalCourse("cc", "cc", "cc");
cmAdmin.createCourseOffering("co", "co", "co", "co", "as", "cc", null, null);
cmAdmin.createSection("sec", "sec", "sec", "sec", null, "co", null);
cmAdmin.addOrUpdateSectionMembership("member1", "TA", "sec", "active");
// Remove the section
cmAdmin.removeSection("sec");
// Ensure that the CM service can no longer find the section
try {
cm.getSection("sec");
fail();
} catch (IdNotFoundException ide) {}
// Ensure that the membership was deleted as well
try {
cm.getSectionMemberships("sec");
fail();
} catch (IdNotFoundException ide) {}
}
public void testRemoveCourseOffering() throws Exception {
cmAdmin.createAcademicSession("as", "as", "as", null, null);
cmAdmin.createCanonicalCourse("cc", "cc", "cc");
cmAdmin.createCourseOffering("co", "co", "co", "co", "as", "cc", null, null);
cmAdmin.createEnrollmentSet("es", "es", "es", "es", "3", "co", null);
cmAdmin.createSection("sec", "sec", "sec", "sec", null, "co", "es");
// Remove the CO
cmAdmin.removeCourseOffering("co");
// Ensure that the CM service can no longer find the CO
try {
cm.getCourseOffering("co");
fail();
} catch (IdNotFoundException ide) {}
// Ensure that the ES was deleted as well
try {
cm.getEnrollmentSet("es");
fail();
} catch (IdNotFoundException ide) {}
// Ensure that the section was deleted as well
try {
cm.getSection("sec");
fail();
} catch (IdNotFoundException ide) {}
}
public void testSetCurrentAcademicSessions() throws Exception {
long oneWeekMs = 1000 * 60 * 60 * 24 * 7;
long nowMs = System.currentTimeMillis();
cmAdmin.createAcademicSession("previousTerm", "previous term", "", new Date(nowMs - (oneWeekMs * 2)), new Date(nowMs - oneWeekMs));
cmAdmin.createAcademicSession("nowTerm", "now term", "", new Date(nowMs - oneWeekMs), new Date(nowMs + oneWeekMs));
cmAdmin.createAcademicSession("nextTerm", "next term", "", new Date(nowMs + oneWeekMs), new Date(nowMs + (oneWeekMs * 2)));
List<AcademicSession> academicSessions = cm.getCurrentAcademicSessions();
Assert.assertEquals(0, academicSessions.size());
cmAdmin.setCurrentAcademicSessions(Arrays.asList(new String[] {"previousTerm"}));
academicSessions = cm.getCurrentAcademicSessions();
Assert.assertEquals(1, academicSessions.size());
Assert.assertEquals("previousTerm", academicSessions.get(0).getEid());
cmAdmin.setCurrentAcademicSessions(Arrays.asList(new String[] {"nowTerm", "nextTerm"}));
academicSessions = cm.getCurrentAcademicSessions();
Assert.assertEquals(2, academicSessions.size());
Assert.assertEquals("nextTerm", academicSessions.get(0).getEid());
Assert.assertEquals("nowTerm", academicSessions.get(1).getEid());
}
}