package uk.ac.ox.oucs.vle;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.TestContext;
import org.springframework.test.context.TestExecutionListeners;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.support.AbstractTestExecutionListener;
import org.springframework.test.context.support.DependencyInjectionTestExecutionListener;
import org.springframework.test.context.transaction.TransactionalTestExecutionListener;
import org.springframework.transaction.annotation.Transactional;
import uk.ac.ox.oucs.vle.proxy.SakaiProxyTest;
import java.util.Collections;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
import static junit.framework.Assert.assertNotNull;
import static org.junit.Assert.assertEquals;
/**
* Test the splitting of a signup.
*/
@RunWith(SpringJUnit4ClassRunner.class)
@TestExecutionListeners({CourseSignupServiceSignupSplitTest.PreLoad.class, DependencyInjectionTestExecutionListener.class, TransactionalTestExecutionListener.class})
@ContextConfiguration(locations = {"classpath:/course-signup-beans.xml", "classpath:/test-with-h2.xml"})
@Transactional
public class CourseSignupServiceSignupSplitTest extends AbstractTestExecutionListener {
@Autowired
CourseSignupService courseSignupService;
@Autowired
CourseDAOImpl dao;
@Autowired
SakaiProxyTest sakaiProxyTest;
private String signupId;
// The test class could have extended the TestExeceutionListener instead but then it's easy for forget that
// the TestExecutionListener is a seperate instance and you can't access member variables from the test.
public static class PreLoad extends AbstractTestExecutionListener {
@Override
public void beforeTestClass(TestContext testContext) throws Exception {
// Have to get the DAO again as we're not in the test instance.
CourseDAOImpl dao = (CourseDAOImpl) testContext.getApplicationContext().getBean("uk.ac.ox.oucs.vle.CourseDAO");
CourseGroupDAO courseGroupDAO = dao.newCourseGroup("groupId", "title", "dept", null);
courseGroupDAO.getAdministrators().add("adminId");
CourseComponentDAO comp1 = dao.newCourseComponent("compId1");
dao.save(comp1);
CourseComponentDAO comp2 = dao.newCourseComponent("compId2");
dao.save(comp2);
courseGroupDAO.getComponents().add(comp1);
courseGroupDAO.getComponents().add(comp2);
dao.save(courseGroupDAO);
CourseSignupDAO signup = dao.newSignup("userId", "supervisorId", new Date());
signup.setStatus(CourseSignupService.Status.PENDING);
signup.setGroup(courseGroupDAO);
dao.save(signup);
comp1.getSignups().add(signup);
comp2.getSignups().add(signup);
dao.save(comp1);
dao.save(comp2);
}
}
@Before
public void setUp() {
UserProxy courseAdmin = Mockito.mock(UserProxy.class);
Mockito.when(courseAdmin.getId()).thenReturn("adminId");
sakaiProxyTest.setCurrentUser(courseAdmin);
signupId = dao.findSignupForUser("userId", Collections.singleton(CourseSignupService.Status.PENDING)).get(0).getId();
}
@Test
public void testSplit() {
Set<String> newSignupComps = Collections.singleton("compId1");
String newSignupId = courseSignupService.split(this.signupId, newSignupComps);
// We haven't had are arguments modified.
assertEquals(1, newSignupComps.size());
dao.flushAndClear();
CourseSignupDAO originalSignup = dao.findSignupById(this.signupId);
CourseSignupDAO newSignup = dao.findSignupById(newSignupId);
assertNotNull(newSignupId);
// Check stuff got copied across
assertEquals(originalSignup.getUserId(), newSignup.getUserId());
assertEquals(originalSignup.getMessage(), newSignup.getMessage());
assertEquals(originalSignup.getGroup(), newSignup.getGroup());
assertEquals(originalSignup.getStatus(), newSignup.getStatus());
assertEquals(originalSignup.getSupervisorId(), newSignup.getSupervisorId());
// Check components are correct.
assertEquals(1, originalSignup.getComponents().size());
assertEquals(1, newSignup.getComponents().size());
CourseComponentDAO comp1 = dao.findCourseComponent("compId1");
assertEquals(1, comp1.getSignups().size());
CourseComponentDAO comp2 = dao.findCourseComponent("compId2");
assertEquals(1, comp2.getSignups().size());
}
@Test(expected = IllegalArgumentException.class)
public void testSplitAll() {
// We can't leave the oldStatus signup empty of components.
Set all = new HashSet<String>();
all.add("compId1");
all.add("compId2");
courseSignupService.split(this.signupId, all);
}
@Test(expected = IllegalArgumentException.class)
public void testSplitNoComponents() {
courseSignupService.split(this.signupId, Collections.<String>emptySet());
}
@Test(expected = NotFoundException.class)
public void testSplitBadSignup() {
courseSignupService.split("notGoodId", Collections.singleton("something"));
}
@Test(expected = IllegalArgumentException.class)
public void testSplitNotComponent() {
courseSignupService.split(this.signupId, Collections.singleton("compId3"));
}
@Test(expected = PermissionDeniedException.class)
public void testSplitWrongUser() {
UserProxy nonAdmin = Mockito.mock(UserProxy.class);
Mockito.when(nonAdmin.getId()).thenReturn("notAdmin");
sakaiProxyTest.setCurrentUser(nonAdmin);
courseSignupService.split(this.signupId, Collections.singleton("compId1"));
}
}