diff --git a/resources/db_update_scripts/current.sql b/resources/db_update_scripts/current.sql index e69de29bb2..bdae56b464 100644 --- a/resources/db_update_scripts/current.sql +++ b/resources/db_update_scripts/current.sql @@ -0,0 +1,12 @@ +CREATE TABLE IF NOT EXISTS `CheckList_userLastOpenDate` ( + `CheckList_id` bigint(20) NOT NULL, + `userLastOpenDate` datetime DEFAULT NULL, + `userLastOpenDate_KEY` bigint(20) NOT NULL, + PRIMARY KEY (`CheckList_id`,`userLastOpenDate_KEY`), + KEY `FKF7E07AB26D025A9` (`userLastOpenDate_KEY`), + KEY `FKF7E07AB21F327355` (`CheckList_id`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; + +ALTER TABLE `CheckList_userLastOpenDate` + ADD CONSTRAINT `FKF7E07AB21F327355` FOREIGN KEY (`CheckList_id`) REFERENCES `checklist` (`id`), + ADD CONSTRAINT `FKF7E07AB26D025A9` FOREIGN KEY (`userLastOpenDate_KEY`) REFERENCES `user` (`id`); \ No newline at end of file diff --git a/src/main/java/se/su/dsv/scipro/checklists/panels/AnswerDialogPanel.java b/src/main/java/se/su/dsv/scipro/checklists/panels/AnswerDialogPanel.java index 4c16810918..f90f0114c8 100644 --- a/src/main/java/se/su/dsv/scipro/checklists/panels/AnswerDialogPanel.java +++ b/src/main/java/se/su/dsv/scipro/checklists/panels/AnswerDialogPanel.java @@ -7,23 +7,23 @@ import org.apache.wicket.model.Model; import org.apache.wicket.model.PropertyModel; import org.apache.wicket.spring.injection.annot.SpringBean; import org.odlabs.wiquery.ui.dialog.Dialog; - -import se.su.dsv.scipro.checklists.panels.AnswerDialogPanel.AnswerDialog; +import se.su.dsv.scipro.SciProSession; import se.su.dsv.scipro.data.dao.interfaces.CheckListAnswerDao; import se.su.dsv.scipro.data.dao.interfaces.CheckListQuestionDao; import se.su.dsv.scipro.data.dataobjects.CheckListAnswer; import se.su.dsv.scipro.data.dataobjects.CheckListQuestion; import se.su.dsv.scipro.data.dataobjects.User; import se.su.dsv.scipro.data.enums.CheckListQuestionAnswer; +import se.su.dsv.scipro.springdata.services.ChecklistService; public class AnswerDialogPanel extends Panel { private static final long serialVersionUID = 1L; private AnswerDialog dialog; - public AnswerDialogPanel(String id, User currentUser) { + public AnswerDialogPanel(String id, User currentUser, Long checklistId) { super(id); - dialog = new AnswerDialog("answerDialog", currentUser); + dialog = new AnswerDialog("answerDialog", currentUser, checklistId); add(dialog); } @@ -32,35 +32,42 @@ public class AnswerDialogPanel extends Panel { private static final long serialVersionUID = 1L; @SpringBean private CheckListAnswerDao checkListAnswerDao; - + private Long checklistId; + + @SpringBean private CheckListQuestionDao checkListQuestionDao; private final User currentUser; - public AnswerDialog(String id, User currentUser) { + public AnswerDialog(String id, User currentUser, Long checklistId) { super(id); + this.checklistId = checklistId; this.currentUser = currentUser; setModal(true); setAutoOpen(false); setWidth(400); setHeight(400); - add(new AnswerForm("answerForm")); + add(new AnswerForm("answerForm", checklistId)); } public void dialogContent(CheckListQuestion clq) { setTitle(clq.getQuestion()); - replace(new AnswerForm("answerForm", clq)); + replace(new AnswerForm("answerForm", clq, checklistId)); } private class AnswerForm extends Form<Void> { + + @SpringBean + private ChecklistService checklistService; + private static final long serialVersionUID = 1L; private TrafficLightPanel trafficLights; private CheckListQuestion clq; private CheckListAnswer answer; private TextArea<String> commentArea; private String comment; - - public AnswerForm(String id, CheckListQuestion clq) { + + public AnswerForm(String id, CheckListQuestion clq, Long checklistId) { super(id); setMultiPart(true); answer = clq.getAnswerFromUser(currentUser); @@ -81,7 +88,7 @@ public class AnswerDialogPanel extends Panel { add(commentArea); } - public AnswerForm(String id) { + public AnswerForm(String id, Long checklistId) { super(id); add(new TrafficLightPanel("trafficLights")); add(new TextArea<String>("commentArea")); @@ -96,6 +103,7 @@ public class AnswerDialogPanel extends Panel { clq = checkListQuestionDao.reLoad(clq); clq.addAnswer(checkListAnswerDao.save(clAnswer)); clq = checkListQuestionDao.save(clq); + checklistService.updateUserLastOpenDate(checklistService.findOne(checklistId), SciProSession.get().getUser()); setResponsePage(getPage()); } } diff --git a/src/main/java/se/su/dsv/scipro/checklists/panels/ListCheckListPanel.java b/src/main/java/se/su/dsv/scipro/checklists/panels/ListCheckListPanel.java index b29ec7b834..b6b57cd8a4 100644 --- a/src/main/java/se/su/dsv/scipro/checklists/panels/ListCheckListPanel.java +++ b/src/main/java/se/su/dsv/scipro/checklists/panels/ListCheckListPanel.java @@ -1,7 +1,5 @@ package se.su.dsv.scipro.checklists.panels; -import java.util.List; - import org.apache.wicket.PageParameters; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.markup.html.AjaxLink; @@ -16,27 +14,21 @@ import org.apache.wicket.model.IModel; import org.apache.wicket.model.LoadableDetachableModel; import org.apache.wicket.model.Model; import org.apache.wicket.spring.injection.annot.SpringBean; - import se.su.dsv.scipro.SciProSession; import se.su.dsv.scipro.data.controllers.CheckListController; -import se.su.dsv.scipro.data.dao.interfaces.CheckListDao; -import se.su.dsv.scipro.data.dao.interfaces.ChecklistCategoryDao; -import se.su.dsv.scipro.data.dao.interfaces.ProjectDao; -import se.su.dsv.scipro.data.dao.interfaces.ProjectScheduleEventDao; -import se.su.dsv.scipro.data.dao.interfaces.RoleDao; -import se.su.dsv.scipro.data.dataobjects.CheckList; -import se.su.dsv.scipro.data.dataobjects.CheckListAnswer; -import se.su.dsv.scipro.data.dataobjects.CheckListQuestion; -import se.su.dsv.scipro.data.dataobjects.Project; -import se.su.dsv.scipro.data.dataobjects.ProjectScheduleEvent; +import se.su.dsv.scipro.data.dao.interfaces.*; +import se.su.dsv.scipro.data.dataobjects.*; import se.su.dsv.scipro.data.enums.CheckListQuestionAnswer; import se.su.dsv.scipro.data.enums.CheckListRole; import se.su.dsv.scipro.icons.ImageObject; import se.su.dsv.scipro.project.pages.ProjectViewCheckListPage; +import se.su.dsv.scipro.springdata.services.ChecklistService; import se.su.dsv.scipro.supervisor.pages.SupervisorChecklistPage; import se.su.dsv.scipro.supervisor.pages.SupervisorViewCheckListPage; import se.su.dsv.scipro.util.JavascriptEventConfirmation; +import java.util.List; + /** * @author Fredrik Norberg fnorbe@dsv.su.se * @@ -53,6 +45,8 @@ public class ListCheckListPanel extends Panel { private RoleDao roleDao; @SpringBean private ProjectScheduleEventDao pseDao; + @SpringBean + private ChecklistService checklistService; @SpringBean CheckListController checkListController; @@ -91,7 +85,18 @@ public class ListCheckListPanel extends Panel { private static final long serialVersionUID = 1L; @Override protected void populateItem(final ListItem<CheckList> item) { - Label listName = new Label("listName", item.getModel().getObject().getName()); + + + Label listName; + + if (checklistService.hasChangedSinceUserLastOpenDate(item.getModelObject(), SciProSession.get().getUser())){ + listName = new Label("listName", item.getModel().getObject().getName() + " *NEW ANSWER*"); + } else { + listName = new Label("listName", item.getModel().getObject().getName()); + } + + + final CheckList cl = item.getModelObject(); final PageParameters pp = new PageParameters(); pp.put("checklist", cl.getId()); diff --git a/src/main/java/se/su/dsv/scipro/checklists/panels/ViewCheckListPanel.java b/src/main/java/se/su/dsv/scipro/checklists/panels/ViewCheckListPanel.java index ff214e944d..0abbe7aa96 100644 --- a/src/main/java/se/su/dsv/scipro/checklists/panels/ViewCheckListPanel.java +++ b/src/main/java/se/su/dsv/scipro/checklists/panels/ViewCheckListPanel.java @@ -1,14 +1,8 @@ package se.su.dsv.scipro.checklists.panels; -import java.io.Serializable; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; - import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.markup.html.AjaxLink; import org.apache.wicket.behavior.AttributeAppender; -import org.apache.wicket.behavior.SimpleAttributeModifier; import org.apache.wicket.extensions.markup.html.basic.SmartLinkLabel; import org.apache.wicket.markup.ComponentTag; import org.apache.wicket.markup.html.WebMarkupContainer; @@ -23,28 +17,27 @@ import org.apache.wicket.model.LoadableDetachableModel; import org.apache.wicket.model.Model; import org.apache.wicket.model.PropertyModel; import org.apache.wicket.spring.injection.annot.SpringBean; - import se.su.dsv.scipro.SciProSession; import se.su.dsv.scipro.components.SciProTooltipBehavior; import se.su.dsv.scipro.data.dao.interfaces.CheckListDao; import se.su.dsv.scipro.data.dao.interfaces.ProjectDao; -import se.su.dsv.scipro.data.dataobjects.CheckList; -import se.su.dsv.scipro.data.dataobjects.CheckListAnswer; -import se.su.dsv.scipro.data.dataobjects.CheckListQuestion; -import se.su.dsv.scipro.data.dataobjects.FileDescription; -import se.su.dsv.scipro.data.dataobjects.Member; -import se.su.dsv.scipro.data.dataobjects.Project; -import se.su.dsv.scipro.data.dataobjects.ProjectScheduleEvent; -import se.su.dsv.scipro.data.dataobjects.User; +import se.su.dsv.scipro.data.dataobjects.*; import se.su.dsv.scipro.data.enums.CheckListQuestionAnswer; import se.su.dsv.scipro.data.enums.CheckListRole; import se.su.dsv.scipro.repository.FileRepository; +import se.su.dsv.scipro.springdata.services.ChecklistService; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; public class ViewCheckListPanel extends Panel { private static final long serialVersionUID = 1L; private AnswerDialogPanel answerDialog; + private Long checklistId; @SpringBean private CheckListDao checkListDao; @@ -54,12 +47,17 @@ public class ViewCheckListPanel extends Panel { @SpringBean private ProjectDao projectDao; - + + @SpringBean + private ChecklistService checklistService; + private Project project; private CheckList checkList; public ViewCheckListPanel(final String id, final Long checkListId) { super(id); + this.checklistId = checkListId; + checklistService.updateUserLastOpenDate(checklistService.findOne(checkListId), SciProSession.get().getUser()); LoadableDetachableModel<CheckListModel> checkListModel = new LoadableDetachableModel<CheckListModel>() { @@ -86,7 +84,7 @@ public class ViewCheckListPanel extends Panel { } private void initComponents(final IModel<CheckListModel> checkListModel) { - answerDialog = new AnswerDialogPanel("answerDialog", getCurrentUser()); + answerDialog = new AnswerDialogPanel("answerDialog", getCurrentUser(), checklistId); add(answerDialog); ListView<CheckListQuestion> checkListQuestions = diff --git a/src/main/java/se/su/dsv/scipro/data/dataobjects/CheckList.java b/src/main/java/se/su/dsv/scipro/data/dataobjects/CheckList.java index ed80e1002f..9d14b383f9 100644 --- a/src/main/java/se/su/dsv/scipro/data/dataobjects/CheckList.java +++ b/src/main/java/se/su/dsv/scipro/data/dataobjects/CheckList.java @@ -4,8 +4,7 @@ import org.hibernate.annotations.Cache; import org.hibernate.annotations.CacheConcurrencyStrategy; import javax.persistence.*; -import java.util.ArrayList; -import java.util.List; +import java.util.*; /** * @@ -39,7 +38,18 @@ public class CheckList extends DomainObject { @ManyToMany private List<ChecklistCategory> categories = new ArrayList<ChecklistCategory>(); - + + @ElementCollection(fetch=FetchType.EAGER) + private Map<User, Date> userLastOpenDate = new HashMap<User, Date>(); + + public Map<User, Date> getUserLastOpenDate() { + return userLastOpenDate; + } + + public void setUserLastOpenDate(Map<User, Date> userLastOpenDate) { + this.userLastOpenDate = userLastOpenDate; + } + public CheckList() { } diff --git a/src/main/java/se/su/dsv/scipro/springdata/repos/ChecklistRepo.java b/src/main/java/se/su/dsv/scipro/springdata/repos/ChecklistRepo.java new file mode 100644 index 0000000000..91aed3c6c8 --- /dev/null +++ b/src/main/java/se/su/dsv/scipro/springdata/repos/ChecklistRepo.java @@ -0,0 +1,17 @@ +package se.su.dsv.scipro.springdata.repos; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.querydsl.QueryDslPredicateExecutor; +import org.springframework.transaction.annotation.Transactional; +import se.su.dsv.scipro.data.dataobjects.CheckList; + +/** + * @author: fred-fri + * date: 2012 03 26 + */ +@Transactional(readOnly = true) +public interface ChecklistRepo extends JpaRepository<CheckList, Long>, QueryDslPredicateExecutor<CheckList> { + + //nothing here yet + +} diff --git a/src/main/java/se/su/dsv/scipro/springdata/serviceimpls/ChecklistServiceImpl.java b/src/main/java/se/su/dsv/scipro/springdata/serviceimpls/ChecklistServiceImpl.java new file mode 100644 index 0000000000..5f2cc18db3 --- /dev/null +++ b/src/main/java/se/su/dsv/scipro/springdata/serviceimpls/ChecklistServiceImpl.java @@ -0,0 +1,57 @@ +package se.su.dsv.scipro.springdata.serviceimpls; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import se.su.dsv.scipro.data.dataobjects.CheckList; +import se.su.dsv.scipro.data.dataobjects.CheckListAnswer; +import se.su.dsv.scipro.data.dataobjects.CheckListQuestion; +import se.su.dsv.scipro.data.dataobjects.User; +import se.su.dsv.scipro.springdata.repos.ChecklistRepo; +import se.su.dsv.scipro.springdata.services.ChecklistService; + +import javax.annotation.Resource; +import java.util.Date; + +/** + * @author: fred-fri + * date: 2012 03 26 + */ +@Service ( "checklistService" ) +@Transactional ( readOnly = true ) +public class ChecklistServiceImpl extends AbstractQueryService<CheckList, Long> implements ChecklistService { + + @Resource + private ChecklistRepo checklistRepo; + + @Autowired + public ChecklistServiceImpl( + @Qualifier("checklistRepo") + ChecklistRepo checklistRepo) { + super(checklistRepo, checklistRepo); + System.out.println("BLA BLA"); + } + + @Override + @Transactional ( readOnly = false ) + public CheckList updateUserLastOpenDate(CheckList checklist, User user) { + checklist.getUserLastOpenDate().put(user, new Date()); + return checklistRepo.save(checklist); + } + + @Override + public boolean hasChangedSinceUserLastOpenDate(CheckList checklist, User user) { + if (checklist.getUserLastOpenDate().get(user)==null){ + checklist = updateUserLastOpenDate(checklist, user); + } + for (CheckListQuestion clq : checklist.getQuestions()){ + for (CheckListAnswer cla : clq.getAnswers()){ + if (cla.getLastModified().after(checklist.getUserLastOpenDate().get(user))){ + return true; + } + } + } + return false; + } +} diff --git a/src/main/java/se/su/dsv/scipro/springdata/services/ChecklistService.java b/src/main/java/se/su/dsv/scipro/springdata/services/ChecklistService.java new file mode 100644 index 0000000000..8f2735248b --- /dev/null +++ b/src/main/java/se/su/dsv/scipro/springdata/services/ChecklistService.java @@ -0,0 +1,17 @@ +package se.su.dsv.scipro.springdata.services; + +import se.su.dsv.scipro.data.dataobjects.CheckList; +import se.su.dsv.scipro.data.dataobjects.User; + +/** + * @author: fred-fri + * date: 2012 03 26 + */ +//@Component +public interface ChecklistService extends CrudService<CheckList, Long>, QueryService<CheckList, Long> { + + public CheckList updateUserLastOpenDate(CheckList checklist, User user); + + public boolean hasChangedSinceUserLastOpenDate(CheckList checklist, User user); + +} diff --git a/src/main/java/se/su/dsv/scipro/supervisor/pages/SupervisorChecklistPage.html b/src/main/java/se/su/dsv/scipro/supervisor/pages/SupervisorChecklistPage.html index 5eda478c7d..1b5c2d7390 100644 --- a/src/main/java/se/su/dsv/scipro/supervisor/pages/SupervisorChecklistPage.html +++ b/src/main/java/se/su/dsv/scipro/supervisor/pages/SupervisorChecklistPage.html @@ -3,9 +3,9 @@ xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd"> <body> <wicket:extend> - <div class="span-10 colborder"> + <div class="span-13 colborder"> <h5 class="peer-title">Checklists added to project</h5> - <div class="span-10 last"> + <div class="span-13 last"> <div wicket:id="listCheckListPanel"></div> </div> </div> diff --git a/src/test/java/se/su/dsv/scipro/springdata/TestChecklist.java b/src/test/java/se/su/dsv/scipro/springdata/TestChecklist.java new file mode 100644 index 0000000000..7a84c42be0 --- /dev/null +++ b/src/test/java/se/su/dsv/scipro/springdata/TestChecklist.java @@ -0,0 +1,208 @@ +package se.su.dsv.scipro.springdata; + + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.annotation.Rollback; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.transaction.annotation.Transactional; +import se.su.dsv.scipro.data.dao.interfaces.CheckListAnswerDao; +import se.su.dsv.scipro.data.dao.interfaces.CheckListQuestionDao; +import se.su.dsv.scipro.data.dao.interfaces.ProjectDao; +import se.su.dsv.scipro.data.dataobjects.*; +import se.su.dsv.scipro.data.enums.CheckListQuestionAnswer; +import se.su.dsv.scipro.match.facade.ApplicationPeriodFacade; +import se.su.dsv.scipro.springdata.services.*; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(inheritLocations = false, locations = { + "classpath:test-applicationContext.xml" +}) +public class TestChecklist { + + @Autowired + private UserService userService; + @Autowired + private ProjectIdeaService projectIdeaService; + @Autowired + private ProjectClassService projectClassService; + @Autowired + private RoleService roleService; + @Autowired + private ApplicationPeriodFacade applicationPeriodFacade; + @Autowired + private MatchService matchService; + + @Autowired + private ProjectDao projectDao; + @Autowired + private ChecklistService checklistService; + @Autowired + private CheckListQuestionDao checkListQuestionDao; + @Autowired + private CheckListAnswerDao checkListAnswerDao; + + private User employee1; + private Employee employee1Role; + private ProjectClass bachelor; + private Project project; + + private List<CheckList> checkLists; + private CheckList checkList; + + private List<CheckListQuestion> checkListQuestions; + private CheckListQuestion checkListQuestion; + + private List<CheckListAnswer> checkListAnswers; + private CheckListAnswer checkListAnswer; + + @Before + public void startTransaction() throws Exception { + + employee1 = new User(); + employee1 = userService.save(employee1); + + employee1Role = new Employee(); + employee1Role.setUser(employee1); + employee1Role = (Employee) roleService.save(employee1Role); + + bachelor = new ProjectClass(ProjectClass.BACHELOR, "Bachelor", "Bachelor degree thesis project"); + bachelor = projectClassService.save(bachelor); + + project = new Project(); + project.setHeadSupervisor(employee1Role); + project.setTitle("project"); + project.setProjectClass(bachelor); + project = projectDao.save(project); + + checkListAnswers = new ArrayList<CheckListAnswer>(); + checkListAnswer = new CheckListAnswer(); + checkListAnswer.setAnswer(CheckListQuestionAnswer.GREEN); + checkListAnswer.setUser(employee1); + checkListAnswer = checkListAnswerDao.save(checkListAnswer); + checkListAnswers.add(checkListAnswer); + + checkListQuestions = new ArrayList<CheckListQuestion>(); + checkListQuestion = new CheckListQuestion(); + checkListQuestion.setQuestion("question?"); + checkListQuestion.setQuestionNumber(1); + checkListQuestion.setAnswers(checkListAnswers); + checkListQuestion = checkListQuestionDao.save(checkListQuestion); + checkListQuestions.add(checkListQuestion); + + checkLists = new ArrayList<CheckList>(); + checkList = new CheckList(); + checkList.setName("checklist"); + checkList.setProject(project); + checkList.setQuestions(checkListQuestions); + checkList = checklistService.save(checkList); + } + + @Test + @Transactional + @Rollback + public void testStuff() { + Assert.assertTrue( + checkList.getQuestions()!=null + && !checkList.getQuestions().isEmpty() + && checkList.getQuestions().get(0)!=null + && checkList.getQuestions().get(0).getAnswers() != null + && !checkList.getQuestions().get(0).getAnswers().isEmpty() + && checkList.getQuestions().get(0).getAnswers().get(0) != null + && checkList.getQuestions().get(0).getAnswers().get(0).getAnswer() != null + && checkList.getQuestions().get(0).getAnswers().get(0).getAnswer().equals(CheckListQuestionAnswer.GREEN) + && checkList.getUserLastOpenDate().get(employee1) == null + ); + } + + /** + * If we run method with user, getUserLastOpenUpdate for user should no longer be null. + */ + @Test + @Transactional + @Rollback + public void testhasChangedSinceUserLastOpenDate1() { + checklistService.hasChangedSinceUserLastOpenDate(checkList, employee1); + Assert.assertNotSame(null, checkList.getUserLastOpenDate().get(employee1)); + } + + /** + * If we run method, the date should get updated. + */ + @Test + @Transactional + @Rollback + public void testupdateUserLastOpenDate2() { + + checkList = checklistService.updateUserLastOpenDate(checkList, employee1); + Date oldDate = checkList.getUserLastOpenDate().get(employee1); + + try { + Thread.sleep(10); + } catch (InterruptedException e) { + e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. + } + + checkList = checklistService.updateUserLastOpenDate(checkList, employee1); + Date newDate = checkList.getUserLastOpenDate().get(employee1); + + Assert.assertTrue(oldDate.before(newDate)); + } + + /** + * User has not yet opened the checklist with the new functionality. We have no way of knowing + * when the user last opened the checklist, so method should return false. + */ + @Test + @Transactional + @Rollback + public void testhasChangedSinceUserLastOpenDate2() { + Assert.assertFalse(checklistService.hasChangedSinceUserLastOpenDate(checkList, employee1)); + } + + /** + * We run the update method. Since the updated date will be newer than the lastModified of + * the checklistanswer, the method should return false. + */ + @Test + @Transactional + @Rollback + public void testhasChangedSinceUserLastOpenDate3() { + checkList = checklistService.updateUserLastOpenDate(checkList, employee1); + Assert.assertFalse(checklistService.hasChangedSinceUserLastOpenDate(checkList, employee1)); + } + + /** + * We run the update method to get a date. Then we set an answers lastModified to a later date. + * The method should return true, since this would mean changes have been made after the user + * last opened the checklist. + */ + @Test + @Transactional + @Rollback + public void testhasChangedSinceUserLastOpenDate4() { + + checkList = checklistService.updateUserLastOpenDate(checkList, employee1); + + try { + Thread.sleep(10); + } catch (InterruptedException e) { + e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. + } + + checkListAnswer.setLastModified(new Date()); + checkListAnswerDao.save(checkListAnswer); + + Assert.assertTrue(checklistService.hasChangedSinceUserLastOpenDate(checkList, employee1)); + + } + +}