Kraftigt förbättrade unit-test av riktiga wicket-sidor

Change-Id: I8300b43ddfdfa0a7cb46d676746ee7e9e8edd820
This commit is contained in:
mpeters 2011-07-08 13:03:52 +02:00
parent f8c26537ad
commit 4924108096
2 changed files with 446 additions and 17 deletions
src/test/java/se/su/dsv/scipro/wicket

@ -0,0 +1,91 @@
package se.su.dsv.scipro.wicket;
import java.lang.reflect.Field;
import org.apache.wicket.Request;
import se.su.dsv.scipro.SciProSession;
import se.su.dsv.scipro.data.dataobjects.Project;
import se.su.dsv.scipro.data.dataobjects.User;
import se.su.dsv.scipro.security.auth.roles.Employee;
import se.su.dsv.scipro.security.auth.roles.IRole;
import se.su.dsv.scipro.security.auth.roles.Roles;
import se.su.dsv.scipro.security.auth.roles.Student;
import se.su.dsv.scipro.security.auth.roles.SysAdmin;
/**
*
* @author Martin Peters - mpeters@dsv.su.se
*
*/
public class MockSciProSession extends SciProSession {
private static final long serialVersionUID = 1L;
public static MockSciProSession currentSession = null;
private IRole currentRole = new Student();
public Project mockActiveProject = null;
public User mockUser = null;
public MockSciProSession(Request request) {
super(request);
}
/**
* Set if the user is logged in or not
* @param loggedIn
*/
public void setLoggedIn(boolean loggedIn){
try {
Field field = SciProSession.class.getDeclaredField("loggedIn");
field.setAccessible(true);
field.set(this, loggedIn);
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
@Override
public boolean authorizedForRole(Roles role) {
return currentRole.authorizedForRole(role);
}
@Override
public boolean hasActualRole(Roles role){
return currentRole.isActualRole(role);
}
public void setLoggedinAsStudent(){
currentRole = new Student();
}
public void setLoggedInAsSysAdmin(){
currentRole = new SysAdmin();
}
public void setLoggedInAsEmployee(){
currentRole = new Employee();
}
@Override
public Project getActiveProject(){
return mockActiveProject;
}
@Override
public void setActiveProject(Project project){
mockActiveProject = project;
}
@Override
public User getUser(){
return mockUser;
}
@Override
public void setUser(User user){
mockUser = user;
}
}

@ -1,61 +1,200 @@
package se.su.dsv.scipro.wicket;
import java.util.ArrayList;
import java.util.List;
import junit.framework.Assert;
import org.apache.wicket.PageParameters;
import org.apache.wicket.Request;
import org.apache.wicket.Response;
import org.apache.wicket.Session;
import org.apache.wicket.spring.injection.annot.SpringComponentInjector;
import org.apache.wicket.spring.test.ApplicationContextMock;
import org.apache.wicket.util.tester.WicketTester;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import org.springframework.orm.jpa.EntityManagerFactoryInfo;
import org.springframework.orm.jpa.LocalEntityManagerFactoryBean;
import se.su.dsv.scipro.HomePage;
import se.su.dsv.scipro.SciProApplication;
import se.su.dsv.scipro.admin.pages.SystemMaintenancePage;
import se.su.dsv.scipro.basepages.errorpages.AccessDeniedPage;
import se.su.dsv.scipro.data.controllers.FinalSeminarUploadController;
import se.su.dsv.scipro.data.dao.interfaces.BoardMessageDao;
import se.su.dsv.scipro.data.dao.interfaces.CommentDao;
import se.su.dsv.scipro.data.dao.interfaces.CommentThreadDao;
import se.su.dsv.scipro.data.dao.interfaces.EventDao;
import se.su.dsv.scipro.data.dao.interfaces.FileDescriptionDao;
import se.su.dsv.scipro.data.dao.interfaces.FinalSeminarActiveParticipationDao;
import se.su.dsv.scipro.data.dao.interfaces.FinalSeminarDao;
import se.su.dsv.scipro.data.dao.interfaces.FinalSeminarOppositionDao;
import se.su.dsv.scipro.data.dao.interfaces.GeneralSystemSettingsDao;
import se.su.dsv.scipro.data.dao.interfaces.GroupEventDao;
import se.su.dsv.scipro.data.dao.interfaces.HandInActivityDao;
import se.su.dsv.scipro.data.dao.interfaces.MessageBoardDao;
import se.su.dsv.scipro.data.dao.interfaces.ProjectClassDao;
import se.su.dsv.scipro.data.dao.interfaces.ProjectClassSettingsDao;
import se.su.dsv.scipro.data.dao.interfaces.ProjectDao;
import se.su.dsv.scipro.data.dao.interfaces.ProjectEventDao;
import se.su.dsv.scipro.data.dao.interfaces.ProjectScheduleDao;
import se.su.dsv.scipro.data.dao.interfaces.RoleDao;
import se.su.dsv.scipro.data.dao.interfaces.ScheduleTemplateDao;
import se.su.dsv.scipro.data.dao.interfaces.StringResourceDao;
import se.su.dsv.scipro.data.dao.interfaces.UserDao;
import se.su.dsv.scipro.data.dao.interfaces.UserSettingsDao;
import se.su.dsv.scipro.data.dao.interfaces.WorkerDataDao;
import se.su.dsv.scipro.data.dataobjects.CommentThread;
import se.su.dsv.scipro.data.dataobjects.Employee;
import se.su.dsv.scipro.data.dataobjects.GeneralSystemSettings;
import se.su.dsv.scipro.data.dataobjects.Project;
import se.su.dsv.scipro.data.dataobjects.ProjectClass;
import se.su.dsv.scipro.data.dataobjects.Student;
import se.su.dsv.scipro.data.dataobjects.User;
import se.su.dsv.scipro.data.dataobjects.interfaces.Commentable;
import se.su.dsv.scipro.loginlogout.pages.LoginPage;
import se.su.dsv.scipro.loginlogout.pages.LogoutPage;
import se.su.dsv.scipro.peer.data.dao.controllers.PeerPortalController;
import se.su.dsv.scipro.peer.data.dao.interfaces.PeerRequestDao;
import se.su.dsv.scipro.peer.data.dao.interfaces.PeerReviewDao;
import se.su.dsv.scipro.peer.data.dao.interfaces.ReviewRatingDao;
import se.su.dsv.scipro.peer.data.dao.interfaces.ReviewTemplateDao;
import se.su.dsv.scipro.peer.data.dataobjects.PeerRequest;
import se.su.dsv.scipro.peer.data.dataobjects.PeerReview;
import se.su.dsv.scipro.peer.pages.PeerRequestSubmissionPage;
import se.su.dsv.scipro.peer.pages.ProjectPeerPortalPage;
import se.su.dsv.scipro.peer.pages.ProjectPeerReviewPage;
import se.su.dsv.scipro.peer.pages.ProjectPeerStatsPage;
import se.su.dsv.scipro.peer.pages.SupervisorPeerPortalPage;
import se.su.dsv.scipro.peer.pages.SupervisorPeerReviewPage;
import se.su.dsv.scipro.peer.pages.SupervisorPeerStatsPage;
import se.su.dsv.scipro.project.pages.FinalSeminarProjectListPage;
import se.su.dsv.scipro.project.pages.NoActiveProjectPage;
import se.su.dsv.scipro.project.pages.ProjectFilePage;
import se.su.dsv.scipro.project.pages.ProjectOppositionPage;
import se.su.dsv.scipro.project.pages.ProjectSchedulePlannerPage;
import se.su.dsv.scipro.project.pages.ProjectStartPage;
import se.su.dsv.scipro.repository.FileRepository;
import se.su.dsv.scipro.repository.util.RepositoryManager;
import se.su.dsv.scipro.supervisor.pages.SupervisorFinalSeminarListingPage;
import se.su.dsv.scipro.supervisor.pages.SupervisorProjectDetailsPage;
import se.su.dsv.scipro.supervisor.pages.SupervisorScheduleTemplatesPage;
import se.su.dsv.scipro.supervisor.pages.SupervisorStartPage;
/**
* @author Richard Wilkinson - richard.wilkinson@jweekend.com
*
* @author Martin Peters - mpeters@dsv.su.se
*
*/
public class TestWicketPages {
protected WicketTester tester;
@Mock EventDao eventDao;
@Mock UserDao userDao;
@Mock RoleDao roleDao;
@Mock ProjectDao projectDao;
@Mock ProjectClassDao projectClassDao;
@Mock UserSettingsDao userSettingsDao;
@Mock FinalSeminarDao finalSeminarDao;
@Mock FinalSeminarOppositionDao finalSeminarOppositionDao;
@Mock PeerReviewDao peerReviewDao;
@Mock PeerRequestDao peerRequestDao;
@Mock ProjectEventDao projectEventDao;
@Mock BoardMessageDao boardMessageDao;
@Mock MessageBoardDao messageBoardDao;
@Mock CommentThreadDao commentThreadDao;
@Mock ProjectScheduleDao projectScheduleDao;
@Mock FileDescriptionDao fileDescriptionDao;
@Mock FileRepository fileRepository;
@Mock WorkerDataDao workerDataDao;
@Mock ReviewRatingDao reviewRatingDao;
@Mock PeerPortalController peerPortalController;
@Mock CommentDao commentDao;
@Mock ReviewTemplateDao reviewTemplateDao;
@Mock FinalSeminarActiveParticipationDao finalSeminarActiveParticipationDao;
@Mock FinalSeminarUploadController finalSeminarUploadController;
@Mock GeneralSystemSettingsDao generalSystemSettingsDao;
@Mock ProjectClassSettingsDao projectClassSettingsDao;
@Mock GroupEventDao groupEventDao;
@Mock HandInActivityDao handInActivityDao;
@Mock ScheduleTemplateDao scheduleTemplateDao;
@Mock RepositoryManager repositoryManager;
@Mock StringResourceDao stringResourceDao;
EntityManagerFactoryInfo emf = Mockito.mock(LocalEntityManagerFactoryBean.class);
/*
* Peer-stuff
*/
User requester;
Student requesterRole;
User reviewer;
Student reviewerRole;
User supervisor;
Employee supervisorRole;
User activeUser;
Project activeProject;
Project requestingProject;
Project reviewingProject;
ProjectClass bachelor;
@Before
public void setup()
{
final ApplicationContextMock acm = new ApplicationContextMock();
EventDao eventDao = Mockito.mock(EventDao.class);
UserDao userDao = Mockito.mock(UserDao.class);
RoleDao roleDao = Mockito.mock(RoleDao.class);
ProjectDao projectDao = Mockito.mock(ProjectDao.class);
UserSettingsDao userSettingsDao = Mockito.mock(UserSettingsDao.class);
EntityManagerFactoryInfo emf = Mockito.mock(LocalEntityManagerFactoryBean.class);
RepositoryManager repositoryManager = Mockito.mock(RepositoryManager.class);
StringResourceDao stringResourceDao = Mockito.mock(StringResourceDao.class);
MockitoAnnotations.initMocks(this);
Mockito.when(projectDao.reLoad( Mockito.any(Project.class) )).thenAnswer(new Answer<Project>() {
@Override
public Project answer(InvocationOnMock invocation) throws Throwable {
return (Project) invocation.getArguments()[0];
}
});
acm.putBean("eventDao", eventDao);
acm.putBean("userDao", userDao);
acm.putBean("roleDao", roleDao);
acm.putBean("projectDao", projectDao);
acm.putBean("projectClassDao", projectClassDao);
acm.putBean("userSettingsDao", userSettingsDao);
acm.putBean("repositoryManager", repositoryManager);
acm.putBean("stringResourceDao", stringResourceDao);
acm.putBean("entityManagerFactory", emf);
acm.putBean("finalSeminarDao", finalSeminarDao);
acm.putBean("finalSeminarOppositionDao", finalSeminarOppositionDao);
acm.putBean("peerReviewDao", peerReviewDao);
acm.putBean("peerRequestDao", peerRequestDao);
acm.putBean("projectEventDao", projectEventDao);
acm.putBean("boardMessageDao", boardMessageDao);
acm.putBean("messageBoardDao", messageBoardDao);
acm.putBean("commentThreadDao", commentThreadDao);
acm.putBean("projectScheduleDao", projectScheduleDao);
acm.putBean("fileDescriptionDao", fileDescriptionDao);
acm.putBean("fileRepository", fileRepository);
acm.putBean("workerDataDao", workerDataDao);
acm.putBean("reviewRatingDao", reviewRatingDao);
acm.putBean("peerPortalController", peerPortalController);
acm.putBean("commentDao", commentDao);
acm.putBean("reviewTemplateDao", reviewTemplateDao);
acm.putBean("finalSeminarActiveParticipationDao", finalSeminarActiveParticipationDao);
acm.putBean("finalSeminarUploadController", finalSeminarUploadController);
acm.putBean("generalSystemSettingsDao", generalSystemSettingsDao);
acm.putBean("projectClassSettingsDao", projectClassSettingsDao);
acm.putBean("groupEventDao", groupEventDao);
acm.putBean("handInActivityDao", handInActivityDao);
acm.putBean("scheduleTemplateDao", scheduleTemplateDao);
tester = new WicketTester(new SciProApplication(){
/* (non-Javadoc)
@ -65,43 +204,242 @@ public class TestWicketPages {
protected SpringComponentInjector getSpringInjector() {
return new SpringComponentInjector(this, acm, true);
}
@Override
public Session newSession(Request request, Response response) {
if(MockSciProSession.currentSession == null){
//Default session is a student-session
MockSciProSession.currentSession = new MockSciProSession(request);
}
return MockSciProSession.currentSession;
}
});
/*
* Initialize peer-stuff
*/
requestingProject = new Project();
reviewingProject = new Project();
activeProject = new Project();
bachelor = new ProjectClass(ProjectClass.BACHELOR, "Bachelor", null);
activeProject.setProjectClass(bachelor);
requestingProject.setProjectClass(bachelor);
reviewingProject.setProjectClass(bachelor);
PeerReview review = new PeerReview();
review.setProject(reviewingProject);
review.setAborted(false);
review.setDeleted(false);
PeerRequest request = new PeerRequest();
request.setProject(requestingProject);
review.setPeerRequest(request);
requester = new User();
requesterRole = new Student();
requesterRole.setUser(requester);
request.setRequester(requesterRole);
reviewer = new User();
reviewerRole = new Student();
reviewerRole.setUser(reviewer);
review.setReviewer(reviewerRole);
supervisor = new User();
supervisorRole = new Employee();
supervisorRole.setUser(supervisor);
requestingProject.setHeadSupervisor(supervisorRole);
reviewingProject.setHeadSupervisor(supervisorRole);
/*
* End of peer-stuff
*/
activeUser = new User();
activeUser.setFirstName("Hugo");
Mockito.when(projectDao.load(Mockito.eq(1L))).thenReturn(activeProject);
Mockito.when(projectDao.isPartOf(activeUser, activeProject)).thenReturn(true);
Mockito.when(peerReviewDao.load(Mockito.eq(1L))).thenReturn(review);
Mockito.when(commentThreadDao.getCommentThread(Mockito.any(Commentable.class))).thenReturn(new CommentThread());
MockSciProSession.currentSession.setActiveProject(activeProject);
MockSciProSession.currentSession.setUser(activeUser);
}
/*
* Common pages
*/
@Test
public void testStartPage() {
public void testStartPage() throws Exception {
tester.startPage(HomePage.class);
tester.assertRenderedPage(LoginPage.class);
MockSciProSession.currentSession.setLoggedIn(true);
tester.startPage(HomePage.class);
tester.assertRenderedPage(HomePage.class);
}
@Test
public void testLogoutPage() {
tester.startPage(LogoutPage.class);
tester.assertRenderedPage(LogoutPage.class);
}
@Test
public void testLoginPage() {
tester.startPage(LoginPage.class);
tester.assertRenderedPage(LoginPage.class);
}
/*
* Project/author/student pages
*/
@Test
public void testProjectStartPage() {
tester.startPage(ProjectStartPage.class);
tester.assertRenderedPage(NoActiveProjectPage.class);
tester.startPage(ProjectStartPage.class);
tester.assertRenderedPage(ProjectStartPage.class);
}
@Test
public void testfinalSeminarPages(){
tester.startPage(FinalSeminarProjectListPage.class);
tester.assertRenderedPage(FinalSeminarProjectListPage.class);
Mockito.when(generalSystemSettingsDao.getGeneralSystemSettingsInstance()).thenReturn(new GeneralSystemSettings());
Mockito.when(projectClassDao.getProjectClass(Mockito.anyString())).thenReturn(new ProjectClass());
tester.startPage(ProjectOppositionPage.class);
tester.assertRenderedPage(ProjectOppositionPage.class);
}
@Test
public void testProjectSchedulePage() {
MockSciProSession.currentSession.setLoggedInAsSysAdmin();
tester.startPage(ProjectSchedulePlannerPage.class);
tester.assertRenderedPage(ProjectSchedulePlannerPage.class);
}
@Test
public void testProjectFilePage() {
tester.startPage(ProjectFilePage.class);
PageParameters pp = new PageParameters();
pp.add(Project.PP_PROJECT_ID, "1" );
Mockito.when(fileRepository.getProjectRootPath(1L)).thenReturn("/test/path/only");
tester.startPage(ProjectFilePage.class,pp);
tester.assertRenderedPage(ProjectFilePage.class);
}
@Test
public void testStudentPeerPages() {
PageParameters pp = new PageParameters();
pp.add(PeerReview.PP_PEER_REVIEW_ID, "1" );
MockSciProSession.currentSession.setUser(reviewer);
//TODO Remove this block when peer review functionality is enabled
MockSciProSession.currentSession.setLoggedinAsStudent();
tester.startPage(ProjectPeerReviewPage.class, pp);
tester.assertRenderedPage(AccessDeniedPage.class);
MockSciProSession.currentSession.setLoggedInAsSysAdmin();
tester.startPage(ProjectPeerReviewPage.class, pp);
tester.assertRenderedPage(ProjectPeerReviewPage.class);
Assert.assertNotNull(MockSciProSession.currentSession.getActiveProject().getProjectClass().getProjectClassSettings());
tester.startPage(ProjectPeerPortalPage.class);
tester.assertRenderedPage(ProjectPeerPortalPage.class);
activeProject.getProjectParticipants().add(reviewerRole);
tester.startPage(PeerRequestSubmissionPage.class);
tester.assertRenderedPage(PeerRequestSubmissionPage.class);
tester.startPage(ProjectPeerStatsPage.class);
tester.assertRenderedPage(ProjectPeerStatsPage.class);
MockSciProSession.currentSession.setUser(activeUser);
}
/*
* Supervisor pages
*/
@Test
public void testSupervisorPeerPages() {
Assert.assertNotNull(MockSciProSession.currentSession.getUser());
List<ProjectClass> resultList = new ArrayList<ProjectClass>();
resultList.add(bachelor);
Mockito.when(projectClassDao.findAll()).thenReturn(resultList);
Mockito.when(projectClassDao.getProjectClass(ProjectClass.BACHELOR)).thenReturn(bachelor);
MockSciProSession.currentSession.setLoggedinAsStudent();
tester.startPage(SupervisorPeerPortalPage.class);
tester.assertRenderedPage(AccessDeniedPage.class);
MockSciProSession.currentSession.setLoggedInAsEmployee();
tester.startPage(SupervisorPeerPortalPage.class);
tester.assertRenderedPage(AccessDeniedPage.class);
//TODO Fix these so proper behavior is ensured once peer functionality is enabled
MockSciProSession.currentSession.setLoggedInAsSysAdmin();
tester.startPage(SupervisorPeerPortalPage.class);
tester.assertRenderedPage(SupervisorPeerPortalPage.class);
tester.startPage(SupervisorPeerStatsPage.class);
tester.assertRenderedPage(SupervisorPeerStatsPage.class);
PageParameters pp = new PageParameters();
pp.add(PeerReview.PP_PEER_REVIEW_ID, "1" );
tester.startPage(SupervisorPeerReviewPage.class,pp);
tester.assertRenderedPage(SupervisorPeerReviewPage.class);
}
@Test
public void testSystemSettingsPage() {
tester.startPage(SystemMaintenancePage.class);
public void testSupervisorStartPage(){
MockSciProSession.currentSession.setLoggedInAsEmployee();
tester.startPage(SupervisorStartPage.class);
tester.assertRenderedPage(SupervisorStartPage.class);
}
@Test
public void testSupervisorFinalSeminarPage(){
tester.startPage(SupervisorFinalSeminarListingPage.class);
tester.assertRenderedPage(SupervisorFinalSeminarListingPage.class);
}
@Test
public void testSupervisorProjectDetailsPage(){
//TODO Hidden, remove this line when pages below are published
MockSciProSession.currentSession.setLoggedInAsSysAdmin();
tester.startPage(SupervisorProjectDetailsPage.class);
tester.assertRenderedPage(SupervisorProjectDetailsPage.class);
}
@Test
public void testSupervisorScheduleTemplatesPage(){
tester.startPage(SupervisorScheduleTemplatesPage.class);
tester.assertRenderedPage(SupervisorScheduleTemplatesPage.class);
}
/*
* Admin pages
*/
@Test
public void testSystemSettingsPage() {
MockSciProSession.currentSession.setLoggedInAsSysAdmin();
tester.startPage(SystemMaintenancePage.class);
tester.assertRenderedPage(SystemMaintenancePage.class);
}
}