added logic to prevent authors from selecting more than one supervisor idea. also some refactorized submission logic to make better feedback messages when receiving errors while accepting ideas.

This commit is contained in:
Emil Siverhall 2012-08-01 10:47:28 +02:00
parent 5786ce4f40
commit 85aee3cd2a
5 changed files with 257 additions and 96 deletions
src
main/java/se/su/dsv/scipro
test/java/se/su/dsv/scipro/springdata

@ -16,6 +16,7 @@ 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.match.dataobject.SupervisorIdea;
import se.su.dsv.scipro.peer.data.dao.controllers.Pair;
import se.su.dsv.scipro.reusable.AddRemoveStudentsPanel;
import se.su.dsv.scipro.springdata.services.SupervisorIdeaService;
import se.su.dsv.scipro.util.JavascriptEventConfirmation;
@ -65,8 +66,14 @@ public class AcceptIdeaDialogPanel extends Panel {
@Override
public void onSubmit(){
ideaService.partnerAcceptIdea(model.getObject(), loggedInUser);
getSession().info("You have accepted to be a part of the project: "+ model.getObject().getTitle());
Pair<Boolean, String> acceptance = ideaService.validatePartnerAcceptance(loggedInUser);
if(acceptance.head){
ideaService.partnerAcceptIdea(model.getObject(), loggedInUser);
getSession().info("You have accepted to be a part of the project: "+ model.getObject().getTitle());
} else {
getSession().error(acceptance.tail);
}
}
};
EnclosureContainer cont = new EnclosureContainer("unconfirmedContainer", acceptButton);
@ -111,10 +118,12 @@ public class AcceptIdeaDialogPanel extends Panel {
@Override
public void onSubmit() {
if(ideaService.acceptIdea(model.getObject(), loggedInUser, partnerPanel.getStudentSet())){
Pair<Boolean, String> acceptance = ideaService.validateIdeaAcceptance(model.getObject(), loggedInUser, partnerPanel.getStudentSet());
if(acceptance.head){
ideaService.acceptIdea(model.getObject(), loggedInUser, partnerPanel.getStudentSet());
getSession().info("You have successfully accepted this project idea");
} else {
getSession().error("Something went wrong while trying to accept the project idea");
getSession().error(acceptance.tail);
}

@ -22,6 +22,9 @@ public interface SupervisorIdeaRepo extends JpaRepository<SupervisorIdea, Long>,
@Query("select idea from SupervisorIdea idea, Student author join idea.ideaParticipations ideaPart join author.ideaParticipations authorPart where ideaPart = authorPart and author = ? and idea.ideaStatus = ?")
List<SupervisorIdea> findIdeasByAuthorAndStatus(Student author, IdeaStatus status);
@Query("select count(idea) from SupervisorIdea idea, Student author join idea.ideaParticipations ideaPart join author.ideaParticipations authorPart where ideaPart = authorPart and author = ? and idea.ideaStatus = ?")
Long countIdeasByAuthorAndStatus(Student author, IdeaStatus status);
@Query("select idea from SupervisorIdea idea, Student author join idea.ideaParticipations ideaPart join author.ideaParticipations authorPart where ideaPart = authorPart and author = ? and idea.ideaStatus = ? and ideaPart.confirmed = ?")
List<SupervisorIdea> findIdeas(Student author, IdeaStatus status, boolean confirmed);
}

@ -7,7 +7,7 @@ import java.util.SortedSet;
import javax.annotation.Resource;
import org.apache.wicket.model.IModel;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.data.domain.Page;
@ -24,6 +24,7 @@ import se.su.dsv.scipro.match.dataobject.IdeaParticipation;
import se.su.dsv.scipro.match.dataobject.QSupervisorIdea;
import se.su.dsv.scipro.match.dataobject.SupervisorIdea;
import se.su.dsv.scipro.match.dataobject.Watson;
import se.su.dsv.scipro.peer.data.dao.controllers.Pair;
import se.su.dsv.scipro.springdata.repos.SupervisorIdeaRepo;
import se.su.dsv.scipro.springdata.services.ApplicationPeriodService;
import se.su.dsv.scipro.springdata.services.StudentService;
@ -46,7 +47,7 @@ public class SupervisorIdeaServiceImpl extends AbstractQueryService<SupervisorId
private SupervisorService supervisorService;
@Resource
private ApplicationPeriodService applicationPeriodService;
private transient Logger logger = Logger.getLogger(SupervisorIdeaService.class);
private int MAX_PARTNERS = 1;
@Autowired
@ -59,9 +60,7 @@ public class SupervisorIdeaServiceImpl extends AbstractQueryService<SupervisorId
@Override
@Transactional ( readOnly = false )
public void saveSupervisorCreatedIdea(IModel<SupervisorIdea> model, Employee creator, SortedSet<Student> students) {
SupervisorIdea idea = model.getObject();
public void saveSupervisorCreatedIdea(SupervisorIdea idea, Employee creator, SortedSet<Student> students) {
if(!students.isEmpty()) {
for(Student s : students) {
@ -84,91 +83,133 @@ public class SupervisorIdeaServiceImpl extends AbstractQueryService<SupervisorId
@Override
@Transactional ( readOnly = false )
public void deleteWaitingIdea(IModel<SupervisorIdea> model) {
SupervisorIdea idea = supervisorIdeaRepo.findOne(model.getObject().getId());
if(!idea.getIdeaStatus().equals(IdeaStatus.WAITING)) //Should not be deleted if IdeaStatus is anything else than waiting.
public void deleteWaitingIdea(SupervisorIdea idea) {
SupervisorIdea reloadedIdea = supervisorIdeaRepo.findOne(idea.getId());
if(!reloadedIdea.getIdeaStatus().equals(IdeaStatus.WAITING)) //Should not be deleted if IdeaStatus is anything else than waiting.
return;
else
supervisorIdeaRepo.delete(idea);
supervisorIdeaRepo.delete(reloadedIdea);
}
@Override
@Transactional ( readOnly = false )
public boolean acceptIdea(IModel<SupervisorIdea> model, User mainAuthor,
public void acceptIdea(SupervisorIdea idea, User mainAuthor,
SortedSet<Student> studentSet) {
if(studentSet.size()> MAX_PARTNERS){
return false; //You may not add more than a specified number of partners.
} else {
SupervisorIdea idea = supervisorIdeaRepo.findOne(model.getObject().getId());
if(idea.getProjectClass().getCode().equals(ProjectClass.BACHELOR) && studentSet.isEmpty()){
return false; //You need to select a partner if the idea is on bachelor level.
}
SupervisorIdea reloadedIdea = supervisorIdeaRepo.findOne(idea.getId());
Student author = studentService.findByUser(mainAuthor);
if(studentSet.contains(author)) {
return false; //You may not select yourself as partner.
}
IdeaParticipation mainParticipation = new IdeaParticipation();
mainParticipation.setStudent(author);
mainParticipation.setSupervisorIdea(idea);
mainParticipation.setConfirmed(true);
author.addIdeaParticipation(mainParticipation);
for(Student s : studentSet) {
s = studentService.findOne(s.getId()); //Needed for lazy loading to work.
IdeaParticipation ip = new IdeaParticipation();
ip.setStudent(s);
ip.setSupervisorIdea(idea);
ip.setSupervisorIdea(reloadedIdea);
ip.setConfirmed(false);
s.addIdeaParticipation(ip);
}
idea.setIdeaStatus(IdeaStatus.TAKEN);
idea.setApplicationPeriod(applicationPeriodService.getCurrentPeriod(new Date(), idea.getProjectClass()));
return true;
}
IdeaParticipation mainParticipation = new IdeaParticipation();
mainParticipation.setStudent(author);
mainParticipation.setSupervisorIdea(reloadedIdea);
mainParticipation.setConfirmed(true);
author.addIdeaParticipation(mainParticipation);
reloadedIdea.setIdeaStatus(IdeaStatus.TAKEN);
reloadedIdea.setApplicationPeriod(applicationPeriodService.getCurrentPeriod(new Date(), reloadedIdea.getProjectClass()));
}
@Override
public Pair<Boolean, String> validateIdeaAcceptance(SupervisorIdea idea,
User mainAuthor, SortedSet<Student> students) {
if(students.size()> MAX_PARTNERS){
logger.error("Accepting user: "+mainAuthor.getEmailAddress()+ " Error: More than "+MAX_PARTNERS+" partner(s) added to project idea.");
return new Pair<Boolean, String>(false, "You may not add more than "+MAX_PARTNERS+" partner to the project idea"); //You may not add more than a specified number of partners.
}
SupervisorIdea reloadedIdea = supervisorIdeaRepo.findOne(idea.getId());
if(reloadedIdea.getProjectClass().getCode().equals(ProjectClass.BACHELOR) && students.isEmpty()){
logger.error("Accepting user: " + mainAuthor.getEmailAddress() + " Error: No partner selected on bachelor level thesis.");
return new Pair<Boolean, String>(false, "You need to select a partner when the idea is on bachelor level"); //You need to select a partner if the idea is on bachelor level.
}
Student author = studentService.findByUser(mainAuthor);
if(students.contains(author)) {
logger.error("Accepting user: " + mainAuthor.getEmailAddress() + " Error: Accepting user selected as his/her own partner.");
return new Pair<Boolean, String>(false, "You may not select yourself as partner"); //You may not select yourself as partner.
}
if(alreadyParticipatingOnIdea(author)) {
logger.error("Accepting user: " + mainAuthor.getEmailAddress() + " Error: Author already attached to a taken project idea.");
return new Pair<Boolean, String>(false, "You may only be part of one taken idea at once"); //You may only be part of one taken idea at once.
}
for(Student s : students) {
if(alreadyParticipatingOnIdea(s)) {
logger.error("Accepting user: " + mainAuthor.getEmailAddress() + " Error: Co-author already attached to a taken project idea.");
return new Pair<Boolean, String>(false, "Your project partner is already part of another project idea");
}
}
return new Pair<Boolean, String>(true, "Validation successful");
}
@Override
public Pair<Boolean, String> validatePartnerAcceptance(User user) {
Student author = studentService.findByUser(user);
if(partnerAlreadyParticipatingOnIdea(author)){
logger.error("Accepting user: " + user.getEmailAddress() + " Error: May not accept to be a partner if already participating in another idea.");
return new Pair<Boolean, String>(false, "You may not accept to be a partner if already participating in another idea");
}
return new Pair<Boolean, String>(true,"Validation passed");
}
@Override
@Transactional (readOnly = false)
public void partnerAcceptIdea(IModel<SupervisorIdea> model, User loggedInUser) {
SupervisorIdea idea = supervisorIdeaRepo.findOne(model.getObject().getId());
public void partnerAcceptIdea(SupervisorIdea idea, User loggedInUser) {
SupervisorIdea reloadedIdea = supervisorIdeaRepo.findOne(idea.getId());
Student author = studentService.findByUser(loggedInUser);
for (IdeaParticipation ip : idea.getIdeaParticipations())
for (IdeaParticipation ip : reloadedIdea.getIdeaParticipations()) {
if(ip.getStudent().equals(author))
ip.setConfirmed(true);
if(idea.getApplicationPeriod()==null) {
idea.setApplicationPeriod(applicationPeriodService.getCurrentPeriod(new Date(), idea.getProjectClass()));
}
if(reloadedIdea.getApplicationPeriod()==null) {
reloadedIdea.setApplicationPeriod(applicationPeriodService.getCurrentPeriod(new Date(), reloadedIdea.getProjectClass()));
}
}
@Override
@Transactional ( readOnly = false )
public void declineIdea(IModel<SupervisorIdea> model) {
SupervisorIdea idea = supervisorIdeaRepo.findOne(model.getObject().getId());
public void declineIdea(SupervisorIdea idea) {
SupervisorIdea reloadedIdea = supervisorIdeaRepo.findOne(idea.getId());
//Remove participations
for (IdeaParticipation ip : idea.getIdeaParticipations()) {
for (IdeaParticipation ip : reloadedIdea.getIdeaParticipations()) {
Student s = ip.getStudent();
s.removeIdeaParticipation(ip);
}
//Erase watson boxes
idea.setWatson(new Watson());
reloadedIdea.setWatson(new Watson());
//Remove application period association
idea.setApplicationPeriod(null);
reloadedIdea.setApplicationPeriod(null);
//Change status back to waiting
idea.setIdeaStatus(IdeaStatus.WAITING);
reloadedIdea.setIdeaStatus(IdeaStatus.WAITING);
}
@Override
@Transactional ( readOnly = false )
public void updateIdea(IModel<SupervisorIdea> model) {
SupervisorIdea idea = supervisorIdeaRepo.findOne(model.getObject().getId());
if(model.getObject().getWatson().getWhat()!=null)
idea.getWatson().setWhat(model.getObject().getWatson().getWhat());
if(model.getObject().getWatson().getWhy()!=null)
idea.getWatson().setWhy(model.getObject().getWatson().getWhy());
if(model.getObject().getWatson().getTheoryHow()!=null)
idea.getWatson().setTheoryHow(model.getObject().getWatson().getTheoryHow());
if(model.getObject().getWatson().getPracticalHow()!=null)
idea.getWatson().setPracticalHow(model.getObject().getWatson().getPracticalHow());
public void updateIdea(SupervisorIdea idea) {
SupervisorIdea reloadedIdea = supervisorIdeaRepo.findOne(idea.getId());
if(idea.getWatson().getWhat()!=null)
reloadedIdea.getWatson().setWhat(idea.getWatson().getWhat());
if(idea.getWatson().getWhy()!=null)
reloadedIdea.getWatson().setWhy(idea.getWatson().getWhy());
if(idea.getWatson().getTheoryHow()!=null)
reloadedIdea.getWatson().setTheoryHow(idea.getWatson().getTheoryHow());
if(idea.getWatson().getPracticalHow()!=null)
reloadedIdea.getWatson().setPracticalHow(idea.getWatson().getPracticalHow());
}
@Override
@ -187,8 +228,8 @@ public class SupervisorIdeaServiceImpl extends AbstractQueryService<SupervisorId
// Only editable if idea status is waiting and the current user is the creator
@Override
public boolean isIdeaEditable(IModel<SupervisorIdea> model, User currentUser) {
return model.getObject().getIdeaStatus().equals(IdeaStatus.WAITING)&&model.getObject().getCreator().getUser().equals(currentUser);
public boolean isIdeaEditable(SupervisorIdea idea, User currentUser) {
return idea.getIdeaStatus().equals(IdeaStatus.WAITING)&&idea.getCreator().getUser().equals(currentUser);
}
@ -228,6 +269,21 @@ public class SupervisorIdeaServiceImpl extends AbstractQueryService<SupervisorId
return ideas;
}
@Override
public Long countByStatus(IdeaStatus status) {
return supervisorIdeaRepo.count(byStatus(status));
}
@Override
public Long countIdeas(IdeaStatus status, Employee supervisor, ProjectClass pc) {
return supervisorIdeaRepo.count(byStatus(status).and(bySupervisor(supervisor)).and(byLevel(pc)));
}
@Override
public Long countByAuthorAndStatus(Student author, IdeaStatus status) {
return supervisorIdeaRepo.countIdeasByAuthorAndStatus(author, status);
}
private Predicate predicateFromParams(FilterParams params) {
return levelFilter(params.getLevels()).and(bySupervisor(params.getSupervisor()));
}
@ -286,14 +342,19 @@ public class SupervisorIdeaServiceImpl extends AbstractQueryService<SupervisorId
return QSupervisorIdea.supervisorIdea.ideaStatus.eq(status);
}
@Override
public Long countByStatus(IdeaStatus status) {
return supervisorIdeaRepo.count(byStatus(status));
private boolean alreadyParticipatingOnIdea(Student author) {
Long ideas = countByAuthorAndStatus(author, IdeaStatus.TAKEN);
if(ideas==0)
return false;
else
return true;
}
@Override
public Long countIdeas(IdeaStatus status, Employee supervisor, ProjectClass pc) {
return supervisorIdeaRepo.count(byStatus(status).and(bySupervisor(supervisor)).and(byLevel(pc)));
private boolean partnerAlreadyParticipatingOnIdea(Student author) {
Long ideas = countByAuthorAndStatus(author, IdeaStatus.TAKEN);
if(ideas==1)
return false;
else
return true;
}
}

@ -5,7 +5,6 @@ import java.util.Collection;
import java.util.List;
import java.util.SortedSet;
import org.apache.wicket.model.IModel;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
@ -15,6 +14,7 @@ import se.su.dsv.scipro.data.dataobjects.Student;
import se.su.dsv.scipro.data.dataobjects.User;
import se.su.dsv.scipro.match.dataobject.Idea.IdeaStatus;
import se.su.dsv.scipro.match.dataobject.SupervisorIdea;
import se.su.dsv.scipro.peer.data.dao.controllers.Pair;
public interface SupervisorIdeaService extends GenericService<SupervisorIdea, Long>, QueryService<SupervisorIdea, Long> {
@ -25,19 +25,23 @@ public interface SupervisorIdeaService extends GenericService<SupervisorIdea, Lo
List<SupervisorIdea> findByStatusAndAuthor(IdeaStatus status, Student author);
List<SupervisorIdea> findIdeas(IdeaStatus status, Student author, boolean confirmed);
Long countByAuthorAndStatus(Student author, IdeaStatus status);
Long countByStatus(IdeaStatus status);
Long countIdeas(IdeaStatus status, Employee supervisor, ProjectClass pc);
void saveSupervisorCreatedIdea(IModel<SupervisorIdea> model, Employee creator, SortedSet<Student> students);
void deleteWaitingIdea(IModel<SupervisorIdea> model);
void partnerAcceptIdea(IModel<SupervisorIdea> model, User loggedInUser);
void declineIdea(IModel<SupervisorIdea> model);
void updateIdea(IModel<SupervisorIdea> model);
void saveSupervisorCreatedIdea(SupervisorIdea idea, Employee creator, SortedSet<Student> students);
void acceptIdea(SupervisorIdea idea, User mainAuthor, SortedSet<Student> sortedSet);
void deleteWaitingIdea(SupervisorIdea idea);
void partnerAcceptIdea(SupervisorIdea idea, User loggedInUser);
void declineIdea(SupervisorIdea idea);
void updateIdea(SupervisorIdea idea);
boolean acceptIdea(IModel<SupervisorIdea> model, User mainAuthor, SortedSet<Student> sortedSet);
boolean hasTakenIdeas(User authorUser, boolean confirmed);
boolean isIdeaEditable(IModel<SupervisorIdea> model, User currentUser);
boolean isIdeaEditable(SupervisorIdea idea, User currentUser);
Pair<Boolean, String> validateIdeaAcceptance(SupervisorIdea idea, User loggedInUser, SortedSet<Student> students);
Pair<Boolean, String> validatePartnerAcceptance(User loggedInUser);
public static class FilterParams implements Serializable {
private static final long serialVersionUID = 4981420721152104292L;
@ -61,4 +65,6 @@ public interface SupervisorIdeaService extends GenericService<SupervisorIdea, Lo
}
}
}

@ -6,12 +6,11 @@ import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.SortedSet;
import java.util.TreeSet;
import junit.framework.Assert;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@ -36,6 +35,7 @@ import se.su.dsv.scipro.match.dataobject.Keyword;
import se.su.dsv.scipro.match.dataobject.KeywordType;
import se.su.dsv.scipro.match.dataobject.SupervisorIdea;
import se.su.dsv.scipro.match.facade.ApplicationPeriodFacade;
import se.su.dsv.scipro.peer.data.dao.controllers.Pair;
import se.su.dsv.scipro.springdata.services.ProjectClassService;
import se.su.dsv.scipro.springdata.services.RoleService;
import se.su.dsv.scipro.springdata.services.SupervisorIdeaService;
@ -64,8 +64,8 @@ public class TestSupervisorIdea {
private KeywordDao keywordDao;
private ProjectClass bachelor, master;
private User authorUser1, authorUser2, supervisorUser, supervisorUser2, unconfirmedUser;
private Student author1, author2, unconfirmedAuthor;
private User authorUser1, authorUser2, authorUser3, supervisorUser, supervisorUser2;
private Student author1, author2, author3;
private Employee supervisor, supervisor2;
private SupervisorIdea waitingBachelorIdea, waitingMasterIdea, takenBachelorIdea, completedMasterIdea, waitingBachelor2, waitingMaster2, waitingBachelor3;
private ApplicationPeriod bachelorPeriod, masterPeriod;
@ -88,13 +88,13 @@ public class TestSupervisorIdea {
supervisorUser2 = newUser();
authorUser1 = newUser();
authorUser2 = newUser();
unconfirmedUser = newUser();
authorUser3 = newUser();
supervisor = newEmployee(supervisorUser);
supervisor2 = newEmployee(supervisorUser2);
author1 = newStudent(authorUser1);
author2 = newStudent(authorUser2);
unconfirmedAuthor = newStudent(unconfirmedUser);
author3 = newStudent(authorUser3);
KeywordType type = new KeywordType("test type");
type = keywordTypeDao.save(type);
@ -189,8 +189,12 @@ public class TestSupervisorIdea {
@Rollback
public void testSaveSupervisorCreatedIdea() {
Assert.assertEquals(new Long(5), ideaService.countByStatus(IdeaStatus.WAITING));
IModel<SupervisorIdea> model = newIdeaModel(bachelor);
ideaService.saveSupervisorCreatedIdea(model, supervisor, new TreeSet<Student>());
SupervisorIdea idea = new SupervisorIdea();
idea.setProjectClass(bachelor);
idea.setTitle("Title");
idea.setDescription("Description");
idea.setRequirements("Reqs");
ideaService.saveSupervisorCreatedIdea(idea, supervisor, new TreeSet<Student>());
Assert.assertEquals(new Long(6), ideaService.countByStatus(IdeaStatus.WAITING));
}
@ -200,14 +204,14 @@ public class TestSupervisorIdea {
@Transactional
@Rollback
public void testIfIdeaIsEditable() {
boolean shouldBeTrue = ideaService.isIdeaEditable(Model.of(waitingBachelorIdea), supervisorUser);
boolean shouldBeTrue = ideaService.isIdeaEditable(waitingBachelorIdea, supervisorUser);
Assert.assertTrue("Not true", shouldBeTrue);
boolean shouldBeFalse = ideaService.isIdeaEditable(Model.of(takenBachelorIdea), supervisorUser);
boolean shouldBeFalse = ideaService.isIdeaEditable(takenBachelorIdea, supervisorUser);
Assert.assertFalse("Not false", shouldBeFalse);
waitingBachelorIdea.setCreator(supervisor2);
boolean shouldAlsoBeFalse = ideaService.isIdeaEditable(Model.of(waitingBachelorIdea), supervisorUser);
boolean shouldAlsoBeFalse = ideaService.isIdeaEditable(waitingBachelorIdea, supervisorUser);
Assert.assertFalse("Not false", shouldAlsoBeFalse);
}
@ -219,12 +223,12 @@ public class TestSupervisorIdea {
List<SupervisorIdea> ideaList = constructList(ideas);
Assert.assertEquals(7, ideaList.size());
ideaService.deleteWaitingIdea(Model.of(takenBachelorIdea)); //Should not be deleted.
ideaService.deleteWaitingIdea(takenBachelorIdea); //Should not be deleted.
ideas = ideaService.findAll();
ideaList = constructList(ideas);
Assert.assertEquals(7, ideaList.size());
ideaService.deleteWaitingIdea(Model.of(waitingBachelorIdea)); //Should be deleted.
ideaService.deleteWaitingIdea(waitingBachelorIdea); //Should be deleted.
ideas = ideaService.findAll();
ideaList = constructList(ideas);
Assert.assertEquals(6, ideaList.size());
@ -319,6 +323,93 @@ public class TestSupervisorIdea {
Assert.assertEquals(Arrays.asList(new SupervisorIdea[]{waitingBachelorIdea, waitingMasterIdea}), ideas);
}
@Test
@Transactional
@Rollback
public void testCountIdeasByAuthorAndStatus() {
Long numberOfWaitingIdeas = ideaService.countByAuthorAndStatus(author1, IdeaStatus.TAKEN);
Assert.assertTrue(numberOfWaitingIdeas==0);
IdeaParticipation participation = new IdeaParticipation();
participation.setStudent(author1);
participation.setSupervisorIdea(takenBachelorIdea);
participation.setConfirmed(true);
author1.addIdeaParticipation(participation);
numberOfWaitingIdeas = ideaService.countByAuthorAndStatus(author1, IdeaStatus.TAKEN);
Assert.assertTrue(numberOfWaitingIdeas==1);
}
@Test
@Transactional
@Rollback
public void testIdeaAcceptance() {
Pair<Boolean, String> acceptance = ideaService.validateIdeaAcceptance(waitingBachelorIdea, authorUser1, new TreeSet<Student>());
Assert.assertFalse("Not false", acceptance.head); //Should not be able to accept a bachelor idea without partner.
SortedSet<Student> partnerSet = new TreeSet<Student>();
partnerSet.add(author2);
partnerSet.add(author3);
acceptance = ideaService.validateIdeaAcceptance(waitingBachelorIdea, authorUser1, partnerSet);
Assert.assertFalse("Not false", acceptance.head); //Should not be able to accept a bachelor idea with more than one partner.
partnerSet.add(author1);
partnerSet.remove(author2);
partnerSet.remove(author3);
acceptance = ideaService.validateIdeaAcceptance(waitingBachelorIdea, authorUser1, partnerSet);
Assert.assertFalse("Not false", acceptance.head); //Should not be able to accept a bachelor idea with himself as partner.
partnerSet.remove(author1);
partnerSet.add(author2);
acceptance = ideaService.validateIdeaAcceptance(waitingBachelorIdea, authorUser1, partnerSet);
Assert.assertTrue("Not true", acceptance.head); //Everything ok, should be able to accept a bachelor with one partner.
if(acceptance.head)
ideaService.acceptIdea(waitingBachelorIdea, authorUser1, partnerSet);
partnerSet.remove(author2);
partnerSet.add(author3);
acceptance = ideaService.validateIdeaAcceptance(waitingBachelor2, authorUser1, partnerSet);
Assert.assertFalse("Not false", acceptance.head); //Should not be able to accept more than one idea.
partnerSet.remove(author3);
partnerSet.add(author2);
acceptance = ideaService.validateIdeaAcceptance(waitingBachelor2, authorUser3, partnerSet);
Assert.assertFalse("Not false", acceptance.head); //Should not be able to accept when the partner have a taken idea.
}
@Test
@Transactional
@Rollback
public void testPartnerAcceptIdea() {
SortedSet<Student> studentSet = new TreeSet<Student>();
studentSet.add(author1);
studentSet.add(author2);
SupervisorIdea idea = new SupervisorIdea();
idea.setProjectClass(bachelor);
idea.setTitle("Title");
idea.setDescription("Description");
idea.setRequirements("Reqs");
ideaService.saveSupervisorCreatedIdea(idea, supervisor, studentSet);
Assert.assertNull(idea.getApplicationPeriod());
for(IdeaParticipation ip : author1.getIdeaParticipations())
Assert.assertFalse(ip.isConfirmed());
for(IdeaParticipation ip : author2.getIdeaParticipations())
Assert.assertFalse(ip.isConfirmed());
ideaService.partnerAcceptIdea(idea, authorUser1);
Assert.assertNotNull(idea.getApplicationPeriod());
}
// HELPER METHODS
private SupervisorIdea newIdea(ProjectClass pc, ApplicationPeriod ap, Employee supervisor, IdeaStatus ideaStatus) {
SupervisorIdea idea = new SupervisorIdea();
@ -332,15 +423,6 @@ public class TestSupervisorIdea {
return ideaService.save(idea);
}
private IModel<SupervisorIdea> newIdeaModel(ProjectClass pc) {
IModel<SupervisorIdea> model = new Model<SupervisorIdea>(new SupervisorIdea());
model.getObject().setDescription("Model description");
model.getObject().setRequirements("Model reqs");
model.getObject().setTitle("Model title");
model.getObject().setProjectClass(pc);
model.getObject().setKeywords(newKeywordSet());
return model;
}
private Set<Keyword> newKeywordSet() {
Set<Keyword> set = new HashSet<Keyword>();