uk.ac.ox.oucs.vle.TestCourseDAO.java Source code

Java tutorial

Introduction

Here is the source code for uk.ac.ox.oucs.vle.TestCourseDAO.java

Source

/*
 * #%L
 * Course Signup Implementation
 * %%
 * Copyright (C) 2010 - 2013 University of Oxford
 * %%
 * 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://opensource.org/licenses/ecl2
 * 
 * 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.
 * #L%
 */
package uk.ac.ox.oucs.vle;

import org.hibernate.SessionFactory;
import org.springframework.test.AbstractTransactionalSpringContextTests;

import java.text.SimpleDateFormat;
import java.util.*;

import static uk.ac.ox.oucs.vle.CourseSignupService.*;

public class TestCourseDAO extends AbstractTransactionalSpringContextTests {

    private CourseDAOImpl courseDao;
    private SessionFactory sessionFactory;

    public void onSetUp() throws Exception {
        super.onSetUp();
        courseDao = (CourseDAOImpl) getApplicationContext().getBean("uk.ac.ox.oucs.vle.CourseDAO");
        sessionFactory = (SessionFactory) getApplicationContext()
                .getBean("org.sakaiproject.springframework.orm.hibernate.GlobalSessionFactory");
    }

    public void onTearDown() throws Exception {
        super.onTearDown();
    }

    protected String[] getConfigPaths() {
        return new String[] { "/course-dao.xml", "/test-with-h2.xml" };
    }

    public void testUpdatingAdministrators() {
        CourseGroupDAO dao;
        dao = courseDao.newCourseGroup("id", "Title", "Department", "Subunit");
        dao.setSource("source");
        dao.getAdministrators().clear();
        dao.getAdministrators().add("1234");
        dao.getAdministrators().add("5678");
        courseDao.save(dao);

        CourseGroupDAO dao2;
        dao2 = courseDao.newCourseGroup("id2", "Title", "Department", "Subunit");
        dao2.setSource("source");
        dao2.getAdministrators().clear();
        dao2.getAdministrators().add("1234");
        dao2.getAdministrators().add("5678");
        courseDao.save(dao2);

        courseDao.flushAndClear();

        dao = courseDao.findCourseGroupById("id");
        assertFalse(dao.getAdministrators().isEmpty());

        dao2 = courseDao.findCourseGroupById("id2");
        dao2.getAdministrators().clear();
        dao2.getAdministrators().add("abcd");
        courseDao.save(dao2);

        courseDao.flushAndClear();

        dao2 = courseDao.findCourseGroupById("id2");

        assertFalse(dao2.getAdministrators().isEmpty());

    }

    /**
     * This checks that when you delete a component without a signup only that component gets deleted.
     * This came about through WL-2645.
     */

    public void testDeletingComponent() {
        // Create a dummp group and add the component.
        CourseGroupDAO newCourseGroup = courseDao.newCourseGroup("id", "Title", "Department", "Subunit");
        newCourseGroup.setSource("source");
        courseDao.save(newCourseGroup);

        // Create a dummy component.
        CourseComponentDAO newCourseComponent1 = courseDao.newCourseComponent("test1");
        newCourseComponent1.getGroups().add(newCourseGroup);
        newCourseComponent1.setSource("source");
        courseDao.save(newCourseComponent1);

        // Create a dummy component that is flagged to be deleted.
        CourseComponentDAO newCourseComponent2 = courseDao.newCourseComponent("test2");
        newCourseComponent2.getGroups().add(newCourseGroup);
        newCourseComponent2.setSource("source");
        newCourseComponent2.setDeleted(true);
        courseDao.save(newCourseComponent2);

        // Now create a signup linked to the group and the first component.
        CourseSignupDAO newSignup = courseDao.newSignup("userId", "supervisorId", new Date());
        newSignup.setGroup(newCourseGroup);
        newSignup.getComponents().add(newCourseComponent1);
        courseDao.save(newSignup);

        // Now attempt to delete the second component.
        try {
            courseDao.deleteSelectedCourseComponents("source");
        } catch (RuntimeException re) {
            // Fail the test if we get an exception.
            throw re;
        }
    }

    public void testSharedComponent() {

        // First course group.
        CourseGroupDAO newCourseGroup1 = courseDao.newCourseGroup("id1", "Title", "Department", "Subunit");
        newCourseGroup1.setSource("source");
        courseDao.save(newCourseGroup1);

        // Second course group.
        CourseGroupDAO newCourseGroup2 = courseDao.newCourseGroup("id2", "Title", "Department", "Subunit");
        newCourseGroup2.setSource("source");
        courseDao.save(newCourseGroup2);

        // Create a component.
        CourseComponentDAO newCourseComponent = courseDao.newCourseComponent("test");
        newCourseComponent.setSource("source");
        newCourseComponent.getGroups().add(newCourseGroup1);
        newCourseComponent.getGroups().add(newCourseGroup2);
        courseDao.save(newCourseComponent);

        sessionFactory.getCurrentSession().flush();
        sessionFactory.getCurrentSession().clear();

        // Check the groups both have the component
        CourseGroupDAO daoA = courseDao.findCourseGroupById("id1");
        assertEquals(1, daoA.getComponents().size());

        CourseGroupDAO daoB = courseDao.findCourseGroupById("id2");
        assertEquals(1, daoB.getComponents().size());

        // Check the components both have groups
        CourseComponentDAO daoC = courseDao.findCourseComponent("test");
        assertEquals(2, daoC.getGroups().size());
    }

    public void testComponentFilter() {
        CourseGroupDAO group = courseDao.newCourseGroup("id1", "Title", "Department", "Subunit");
        courseDao.save(group);
        CourseComponentDAO oldComponent = courseDao.newCourseComponent("old");
        oldComponent.setBaseDate(createDate(2009, 1, 1));
        oldComponent.getGroups().add(group);
        courseDao.save(oldComponent);
        CourseComponentDAO newComponent = courseDao.newCourseComponent("new");
        newComponent.setBaseDate(createDate(2020, 1, 1));
        newComponent.getGroups().add(group);
        courseDao.save(newComponent);
        // We only show a few years of previous courses.
        CourseComponentDAO veryOldComponent = courseDao.newCourseComponent("very-old");
        veryOldComponent.setBaseDate(createDate(2000, 1, 1));
        veryOldComponent.getGroups().add(group);
        courseDao.save(veryOldComponent);

        sessionFactory.getCurrentSession().flush();
        sessionFactory.getCurrentSession().clear();

        List<CourseComponentDAO> returned;
        // Check we can find all of them
        returned = courseDao.findCourseComponents("id1", Range.ALL, createDate(2010, 1, 1));
        assertNotNull(returned);
        assertEquals(3, returned.size());

        // Check we can just get the newer ones.
        returned = courseDao.findCourseComponents("id1", Range.UPCOMING, createDate(2010, 1, 1));
        assertNotNull(returned);
        assertEquals(1, returned.size());

        // Check we can just get the older ones.
        returned = courseDao.findCourseComponents("id1", Range.PREVIOUS, createDate(2010, 1, 1));
        assertNotNull(returned);
        assertEquals(1, returned.size());

    }

    public void testSharedComponentDeleteGroup() {

        // First course group.
        CourseGroupDAO newCourseGroup1 = courseDao.newCourseGroup("id1", "Title", "Department", "Subunit");
        newCourseGroup1.setSource("source");
        courseDao.save(newCourseGroup1);

        // Second course group.
        CourseGroupDAO newCourseGroup2 = courseDao.newCourseGroup("id2", "Title", "Department", "Subunit");
        newCourseGroup2.setSource("source");
        newCourseGroup2.setDeleted(true);
        courseDao.save(newCourseGroup2);

        // Create a component.
        CourseComponentDAO newCourseComponent = courseDao.newCourseComponent("test");
        newCourseComponent.setSource("source");
        newCourseComponent.getGroups().add(newCourseGroup1);
        newCourseComponent.getGroups().add(newCourseGroup2);
        courseDao.save(newCourseComponent);

        sessionFactory.getCurrentSession().flush();
        sessionFactory.getCurrentSession().clear();

        // Check the groups both have the component
        CourseGroupDAO daoA = courseDao.findCourseGroupById("id1");
        assertEquals(1, daoA.getComponents().size());

        CourseGroupDAO daoB = courseDao.findCourseGroupById("id2");
        assertEquals(1, daoB.getComponents().size());

        // Check the components both have groups
        CourseComponentDAO daoC = courseDao.findCourseComponent("test");
        assertEquals(2, daoC.getGroups().size());

        // Now test deletion
        courseDao.deleteSelectedCourseGroups("source");
        sessionFactory.getCurrentSession().flush();
        sessionFactory.getCurrentSession().clear();

        daoA = courseDao.findCourseGroupById("id1");
        assertNotNull(daoA);
        assertEquals(1, daoA.getComponents().size());

        daoB = courseDao.findCourseGroupById("id2");
        assertNull(daoB);

        daoC = courseDao.findCourseComponent("test");
        assertEquals(1, daoC.getGroups().size());
    }

    public void testSharedComponentDeleteComponent() {

        // First course group.
        CourseGroupDAO newCourseGroup1 = courseDao.newCourseGroup("id1", "Title", "Department", "Subunit");
        newCourseGroup1.setSource("source");
        courseDao.save(newCourseGroup1);

        // Second course group.
        CourseGroupDAO newCourseGroup2 = courseDao.newCourseGroup("id2", "Title", "Department", "Subunit");
        newCourseGroup2.setSource("source");
        courseDao.save(newCourseGroup2);

        // Create a component.
        CourseComponentDAO newCourseComponent1 = courseDao.newCourseComponent("test1");
        newCourseComponent1.setSource("source");
        newCourseComponent1.getGroups().add(newCourseGroup1);
        newCourseComponent1.getGroups().add(newCourseGroup2);
        courseDao.save(newCourseComponent1);

        // and another
        CourseComponentDAO newCourseComponent2 = courseDao.newCourseComponent("test2");
        newCourseComponent2.setSource("source");
        newCourseComponent2.setDeleted(true);
        newCourseComponent2.getGroups().add(newCourseGroup1);
        newCourseComponent2.getGroups().add(newCourseGroup2);
        courseDao.save(newCourseComponent2);

        sessionFactory.getCurrentSession().flush();
        sessionFactory.getCurrentSession().clear();

        // Check the groups both have the component
        CourseGroupDAO daoA = courseDao.findCourseGroupById("id1");
        assertEquals(2, daoA.getComponents().size());

        CourseGroupDAO daoB = courseDao.findCourseGroupById("id2");
        assertEquals(2, daoB.getComponents().size());

        // Check the components both have groups
        CourseComponentDAO daoC = courseDao.findCourseComponent("test1");
        assertEquals(2, daoC.getGroups().size());

        CourseComponentDAO daoD = courseDao.findCourseComponent("test2");
        assertEquals(2, daoD.getGroups().size());

        // Now test deletion
        courseDao.deleteSelectedCourseComponents("source");
        sessionFactory.getCurrentSession().flush();
        sessionFactory.getCurrentSession().clear();

        daoA = courseDao.findCourseGroupById("id1");
        assertNotNull(daoA);
        assertEquals(1, daoA.getComponents().size());

        daoB = courseDao.findCourseGroupById("id2");
        assertNotNull(daoB);
        assertEquals(1, daoB.getComponents().size());

        daoC = courseDao.findCourseComponent("test1");
        assertNotNull(daoC);
        assertEquals(2, daoC.getGroups().size());

        daoD = courseDao.findCourseComponent("test2");
        assertNull(daoD);
    }

    public void testCourseCategory() {

        CourseCategoryDAO cat1 = new CourseCategoryDAO(CourseGroup.CategoryType.RM, "C1", "Category 1");
        CourseCategoryDAO cat2 = new CourseCategoryDAO(CourseGroup.CategoryType.RM, "C2", "Category 2");
        CourseCategoryDAO cat3 = new CourseCategoryDAO(CourseGroup.CategoryType.RM, "C3", "Category 3");

        courseDao.save(cat1);
        courseDao.save(cat2);
        courseDao.save(cat3);

        // First course group.
        CourseGroupDAO newCourseGroup1 = courseDao.newCourseGroup("id1", "Title", "Department", "Subunit");
        newCourseGroup1.setSource("source");

        newCourseGroup1.getCategories().add(cat1);
        newCourseGroup1.getCategories().add(cat2);

        courseDao.save(newCourseGroup1);

        // Second course group.
        CourseGroupDAO newCourseGroup2 = courseDao.newCourseGroup("id2", "Title", "Department", "Subunit");
        newCourseGroup2.setSource("source");
        newCourseGroup2.setDeleted(true);

        newCourseGroup2.getCategories().add(cat1);
        newCourseGroup2.getCategories().add(cat2);
        newCourseGroup2.getCategories().add(cat3);

        courseDao.save(newCourseGroup2);

        sessionFactory.getCurrentSession().flush();
        sessionFactory.getCurrentSession().clear();

        // Check all is as it should be
        CourseGroupDAO daoA = courseDao.findCourseGroupById("id1");
        assertEquals(2, daoA.getCategories().size());

        CourseGroupDAO daoB = courseDao.findCourseGroupById("id2");
        assertEquals(3, daoB.getCategories().size());

        // now delete a group
        courseDao.deleteSelectedCourseGroups("source");
        sessionFactory.getCurrentSession().flush();
        sessionFactory.getCurrentSession().clear();

        // and the checks
        CourseGroupDAO gA = courseDao.findCourseGroupById("id1");
        assertEquals(2, gA.getCategories().size());

        CourseGroupDAO gB = courseDao.findCourseGroupById("id2");
        assertNull(gB);

    }

    public void testCourseComponentSession() {

        SimpleDateFormat format = new SimpleDateFormat("EEEE dd MMMM yyyy, HH:mm:ss");
        Calendar cal = Calendar.getInstance();
        cal.set(Calendar.HOUR_OF_DAY, 10);
        Date start = cal.getTime();
        cal.add(Calendar.HOUR_OF_DAY, 2);
        Date end = cal.getTime();

        CourseComponentSessionDAO ss1 = new CourseComponentSessionDAO("1", start, format.format(start), end,
                format.format(end), "location 1");
        CourseComponentSessionDAO ss2 = new CourseComponentSessionDAO("2", start, format.format(start), end,
                format.format(end), "location 2");
        CourseComponentSessionDAO ss3 = new CourseComponentSessionDAO("3", start, format.format(start), end,
                format.format(end), "location 3");

        // Create a component.
        CourseComponentDAO courseComponent = courseDao.newCourseComponent("test");
        courseComponent.setSource("source");
        courseComponent.getComponentSessions().add(ss1);
        courseDao.save(courseComponent);

        sessionFactory.getCurrentSession().flush();
        sessionFactory.getCurrentSession().clear();

        // Check all is as it should be
        courseComponent = courseDao.findCourseComponent("test");
        Iterator<CourseComponentSessionDAO> sessionsIt = courseComponent.getComponentSessions().iterator();
        assertTrue("Expected at least one session", sessionsIt.hasNext());
        assertEquals("location 1", sessionsIt.next().getLocation());
        assertFalse("Should be no more than one session", sessionsIt.hasNext());

        // now add a session
        courseComponent.getComponentSessions().add(ss2);
        courseDao.save(courseComponent);

        sessionFactory.getCurrentSession().flush();
        sessionFactory.getCurrentSession().clear();

        // and check
        courseComponent = courseDao.findCourseComponent("test");
        assertEquals(2, courseComponent.getComponentSessions().size());

        // change the sessions
        courseComponent.getComponentSessions().clear();
        courseComponent.getComponentSessions().add(ss3);
        courseDao.save(courseComponent);

        sessionFactory.getCurrentSession().flush();
        sessionFactory.getCurrentSession().clear();

        // and check
        courseComponent = courseDao.findCourseComponent("test");
        assertEquals(1, courseComponent.getComponentSessions().size());
    }

    private final Date END_MIC_2010 = createDate(2010, 12, 4);

    public void testAvailableCourses() {
        // Create the course group
        CourseGroupDAO group1 = courseDao.newCourseGroup("course-1", "title", "dept", "subunit");
        courseDao.save(group1);
        // Create the course component
        CourseComponentDAO comp1 = courseDao.newCourseComponent("comp1");
        comp1.setCloses(createDate(2012, 12, 4)); // END_MIC_2012
        comp1.getGroups().add(group1);
        courseDao.save(comp1);
        // Create the course component
        CourseComponentDAO comp2 = courseDao.newCourseComponent("comp2");
        comp2.setCloses(createDate(2011, 12, 4)); // END_MIC_2011
        comp2.getGroups().add(group1);
        courseDao.save(comp2);
        // Create the out of range course component
        CourseComponentDAO comp3 = courseDao.newCourseComponent("comp3");
        comp3.setCloses(createDate(2009, 12, 4)); // END_MIC_2009
        comp3.getGroups().add(group1);
        courseDao.save(comp3);

        sessionFactory.getCurrentSession().flush();
        sessionFactory.getCurrentSession().clear();

        CourseGroupDAO course = courseDao.findUpcomingComponents("course-1", END_MIC_2010);
        assertNotNull(course);
        assertNotNull(course.getComponents());
        // Although we have 3 components in the DB because we preloaded based on the close date this gives
        // us just 2.
        assertEquals(2, course.getComponents().size());
    }

    public void testCoursesInDept() {
        CourseGroupDAO wrongDept = courseDao.newCourseGroup("wrong-dept", "Wrong Department", "4B03", null);
        wrongDept.setVisibility("PB");
        courseDao.save(wrongDept);
        CourseComponentDAO wrongDeptComp = courseDao.newCourseComponent("wrong-dept-comp");
        wrongDeptComp.setBaseDate(createDate(2012, 12, 4));
        wrongDeptComp.getGroups().add(wrongDept);
        courseDao.save(wrongDeptComp);

        CourseGroupDAO tooOld = courseDao.newCourseGroup("too-old", "Too Old", "3C05", null);
        tooOld.setVisibility("PB");
        courseDao.save(tooOld);
        CourseComponentDAO tooOldComp = courseDao.newCourseComponent("too-old-comp");
        tooOldComp.setBaseDate(createDate(2009, 1, 1));
        tooOldComp.getGroups().add(tooOld);
        courseDao.save(tooOldComp);

        CourseGroupDAO justRight = courseDao.newCourseGroup("just-right", "Just Right", "3C05", null);
        justRight.setVisibility("PB");
        courseDao.save(justRight);
        CourseComponentDAO justRightComp = courseDao.newCourseComponent("just-right-comp");
        justRightComp.setBaseDate(createDate(2011, 12, 2));
        justRightComp.getGroups().add(justRight);
        courseDao.save(justRightComp);

        sessionFactory.getCurrentSession().flush();
        sessionFactory.getCurrentSession().clear();

        List<CourseGroupDAO> groups = courseDao.findCourseGroupByDept("3C05", Range.UPCOMING, END_MIC_2010, false);
        assertEquals(1, groups.size());
    }

    public void testFindCourseGroupById() {
        // This test was to try and reproduce problems I was having with the findCourseGroupById getting confused
        // between the column aliases in the SQL and the aliases in the result set. I couldn't reproduce the error
        // in a test but it's worth leaving the test in to check it doesn't get any worse.
        CourseCategoryDAO category = new CourseCategoryDAO(CourseGroup.CategoryType.RDF, "C1", "Test");
        courseDao.save(category);
        // Create a course
        CourseGroupDAO aCourse = courseDao.newCourseGroup("groupId", "Title", "dept", "subunit");
        aCourse.getCategories().add(category);
        courseDao.save(aCourse);
        // Create a component
        // Create a component in the future
        CourseComponentDAO newComponent = courseDao.newCourseComponent("newComponentId");
        newComponent.getGroups().add(aCourse);
        courseDao.save(newComponent);

        sessionFactory.getCurrentSession().flush();
        sessionFactory.getCurrentSession().clear();

        assertNotNull(courseDao.findCourseComponents("groupId", Range.ALL, new Date()));
    }

    public void testCountSignups() {

        // Create some dates
        Date now = createDate(2010, 3, 1);
        Date beforeNow = createDate(2009, 3, 1);
        Date afterNow = createDate(2011, 3, 1);

        // First check for non-existant course
        assertEquals(0,
                courseDao.countSignupByCourse("groupId", Collections.singleton(Status.ACCEPTED), now).intValue());

        // Create a course
        CourseGroupDAO aCourse = courseDao.newCourseGroup("groupId", "Title", "dept", "subunit");
        courseDao.save(aCourse);

        // Create a component in the past
        CourseComponentDAO oldComponent = courseDao.newCourseComponent("oldComponentId");
        oldComponent.setStarts(beforeNow);
        oldComponent.getGroups().add(aCourse);
        courseDao.save(oldComponent);

        // Create a signup to the old component
        CourseSignupDAO oldSignup = courseDao.newSignup("aUserId", "aSupervisorId", new Date());
        oldSignup.setGroup(aCourse);
        oldSignup.setStatus(Status.ACCEPTED);
        courseDao.save(oldSignup);
        oldComponent.getSignups().add(oldSignup);
        courseDao.save(oldComponent);

        assertEquals(0,
                courseDao.countSignupByCourse("groupId", Collections.singleton(Status.ACCEPTED), now).intValue());

        // Create a component in the future
        CourseComponentDAO newComponent = courseDao.newCourseComponent("newComponentId");
        newComponent.setStarts(afterNow);
        newComponent.getGroups().add(aCourse);
        courseDao.save(newComponent);

        assertEquals(0,
                courseDao.countSignupByCourse("groupId", Collections.singleton(Status.ACCEPTED), now).intValue());

        // Create a signup for the future component
        CourseSignupDAO newSignup = courseDao.newSignup("aUserId", "aSupervisorId", new Date());
        newSignup.setGroup(aCourse);
        newSignup.setStatus(Status.ACCEPTED);
        courseDao.save(newSignup);
        newComponent.getSignups().add(newSignup);
        courseDao.save(newComponent);

        assertEquals(1,
                courseDao.countSignupByCourse("groupId", Collections.singleton(Status.ACCEPTED), now).intValue());

    }

    public void testFindComponentSignups() {
        CourseGroupDAO groupA = courseDao.newCourseGroup("groupA", "Title Group A", "dept", "subunit");
        courseDao.save(groupA);
        CourseGroupDAO groupB = courseDao.newCourseGroup("groupB", "Title Group A", "dept", "subunit");
        courseDao.save(groupB);

        CourseSignupDAO signupW = courseDao.newSignup("userW", null, new Date());
        signupW.setStatus(Status.ACCEPTED);
        signupW.setGroup(groupA);
        courseDao.save(signupW);
        CourseSignupDAO signupX = courseDao.newSignup("userX", null, new Date());
        signupX.setStatus(Status.APPROVED);
        signupX.setGroup(groupA);
        courseDao.save(signupX);
        CourseSignupDAO signupY = courseDao.newSignup("userY", null, new Date());
        signupY.setStatus(Status.PENDING);
        signupY.setGroup(groupB);
        courseDao.save(signupY);
        CourseSignupDAO signupZ = courseDao.newSignup("userZ", null, new Date());
        signupZ.setStatus(Status.ACCEPTED);
        signupZ.setGroup(groupB);
        courseDao.save(signupZ);

        CourseComponentDAO component1 = courseDao.newCourseComponent("component1");
        component1.setStarts(createDate(2015, 12, 1));
        component1.getGroups().add(groupA);
        component1.getSignups().add(signupW);
        component1.getSignups().add(signupX);
        courseDao.save(component1);
        CourseComponentDAO component2 = courseDao.newCourseComponent("component2");
        component2.setStarts(createDate(2016, 12, 1));
        component2.getGroups().add(groupB);
        component2.getSignups().add(signupY);
        component2.getSignups().add(signupZ);
        courseDao.save(component2);

        courseDao.flushAndClear();

        List<Map> signups;
        signups = courseDao.findComponentSignups(null, null, null);

        assertEquals(4, signups.size());
        // Check ordering, same component first, then groupId.
        assertEquals("userZ", ((CourseSignupDAO) signups.get(0).get("signup")).getUserId());
        assertEquals("component2", ((CourseComponentDAO) signups.get(0).get("this")).getPresentationId());
        assertEquals("userY", ((CourseSignupDAO) signups.get(1).get("signup")).getUserId());
        assertEquals("component2", ((CourseComponentDAO) signups.get(1).get("this")).getPresentationId());
        assertEquals("userX", ((CourseSignupDAO) signups.get(2).get("signup")).getUserId());
        assertEquals("component1", ((CourseComponentDAO) signups.get(2).get("this")).getPresentationId());
        assertEquals("userW", ((CourseSignupDAO) signups.get(3).get("signup")).getUserId());
        assertEquals("component1", ((CourseComponentDAO) signups.get(2).get("this")).getPresentationId());

        signups = courseDao.findComponentSignups(null, Collections.singleton(Status.PENDING), null);
        assertEquals(1, signups.size());

        signups = courseDao.findComponentSignups("component1", null, null);
        assertEquals(2, signups.size());
        Collection<String> component1UserIds = Arrays.asList(new String[] { "userW", "userX" });
        for (Map signup : signups) {
            String signupId = ((CourseSignupDAO) signup.get("signup")).getUserId();
            if (!component1UserIds.contains(signupId)) {
                fail("Incorrect signup found: " + signupId);
            }
        }

        signups = courseDao.findComponentSignups(null, Collections.singleton(Status.ACCEPTED), 2016);
        assertEquals(1, signups.size());
        assertEquals("userZ", ((CourseSignupDAO) signups.get(0).get("signup")).getUserId());

    }

    //   public void testAdminCourseGroups() {
    //      List<CourseGroupDAO> groups = courseDao.findAdminCourseGroups("d86d9720-eba4-40eb-bda3-91b3145729da");
    //      assertEquals(3, groups.size());
    //      groups = courseDao.findAdminCourseGroups("c10cdf4b-7c10-423c-8319-2d477051a94e");
    //      assertEquals(1, groups.size());
    //   }
    //
    //   public void testFindSignupByCourse() {
    //      List<CourseSignupDAO> signups = courseDao.findSignupByCourse("d86d9720-eba4-40eb-bda3-91b3145729da", "course-1", null);
    //      assertEquals(1,signups.size());
    //   }

    private static Date createDate(int year, int month, int day) {
        Calendar cal = Calendar.getInstance();
        cal.set(year, month, day);
        return new Date(cal.getTimeInMillis());
    }
}