package no.niths.services.school;
import static org.junit.Assert.assertEquals;
import java.util.ArrayList;
import java.util.List;
import no.niths.common.config.HibernateConfig;
import no.niths.common.config.TestAppConfig;
import no.niths.domain.school.FadderGroup;
import no.niths.domain.school.Student;
import no.niths.services.school.interfaces.FadderGroupService;
import no.niths.services.school.interfaces.StudentService;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { TestAppConfig.class, HibernateConfig.class })
public class FadderGroupServiceTest {
@Autowired
private FadderGroupService fadderService;
@Autowired
private StudentService studService;
@Test
public void testCRUD(){
int size = fadderService.getAll(null).size();
FadderGroup g1 = new FadderGroup();
g1.setGroupNumber(924);
fadderService.create(g1);
assertEquals(size + 1, fadderService.getAll(null).size());
FadderGroup temp = new FadderGroup(924);
assertEquals(1, fadderService.getAll(temp).size());
g1.setGroupNumber(913);
fadderService.update(g1);
assertEquals(0, fadderService.getAll(temp).size());
temp.setGroupNumber(913);
assertEquals(1, fadderService.getAll(temp).size());
assertEquals(g1, fadderService.getById(g1.getId()));
fadderService.hibernateDelete(g1.getId());
assertEquals(size, fadderService.getAll(null).size());
}
@Test
public void testGetStudentsWithoutGroup(){
Student s1 = new Student("ssss1234@sss.com");
Student s2 = new Student("sss2345@sss.com");
Student s3 = new Student("sss3456@sss.com");
studService.create(s1);
studService.create(s2);
studService.create(s3);
FadderGroup g1 = new FadderGroup(981);
g1.getFadderChildren().add(s1);
g1.getFadderChildren().add(s2);
fadderService.create(g1);
List<Student> fetched = fadderService.getStudentsNotInAGroup();
assertEquals(1, fetched.size());
assertEquals(s3, fetched.get(0));
fadderService.hibernateDelete(g1.getId());
studService.hibernateDelete(s1.getId());
studService.hibernateDelete(s2.getId());
studService.hibernateDelete(s3.getId());
}
@Test
public void testLeadersRelationship(){
int studSize = studService.getAll(null).size();
FadderGroup g1 = new FadderGroup();
fadderService.create(g1);
Student s1 = new Student("ssss@sss.com");
Student s2 = new Student("sss2@sss.com");
Student s3 = new Student("sss3@sss.com");
studService.create(s1);
studService.create(s2);
studService.create(s3);
assertEquals(studSize + 3, studService.getAll(null).size());
FadderGroup fetched = fadderService.getById(g1.getId());
fetched.getLeaders().add(s1);
fetched.getLeaders().add(s2);
fetched.getLeaders().add(s3);
fadderService.update(fetched);
fetched = fadderService.getById(g1.getId());
assertEquals(3, fetched.getLeaders().size());
//Remove a leader
fetched.getLeaders().remove(s1);
fadderService.update(fetched);
//Did it get removed?
fetched = fadderService.getById(g1.getId());
assertEquals(2, fetched.getLeaders().size());
//Student should still exist
assertEquals(studSize + 3, studService.getAll(null).size());
//Delete a student
studService.hibernateDelete(s2.getId());
assertEquals(studSize + 2, studService.getAll(null).size());
//Should be removed from faddergroup
fetched = fadderService.getById(g1.getId());
assertEquals(1, fetched.getLeaders().size());
//Delete the faddergroup
fadderService.hibernateDelete(g1.getId());
//Students should still exist
assertEquals(studSize + 2, studService.getAll(null).size());
//Clean
studService.hibernateDelete(s1.getId());
studService.hibernateDelete(s3.getId());
assertEquals(studSize, studService.getAll(null).size());
}
@Test
public void testChildrenRelationship(){
int studSize = studService.getAll(null).size();
FadderGroup g1 = new FadderGroup();
fadderService.create(g1);
Student s1 = new Student("ssss@sss.com");
Student s2 = new Student("sss2@sss.com");
Student s3 = new Student("sss3@sss.com");
studService.create(s1);
studService.create(s2);
studService.create(s3);
assertEquals(studSize + 3, studService.getAll(null).size());
ArrayList<Student> children = new ArrayList<Student>();
children.add(s1);
children.add(s2);
children.add(s3);
FadderGroup fadderGroup = new FadderGroup();
fadderGroup.setId(g1.getId());
fadderGroup.setFadderChildren(children);
fadderService.update(fadderGroup);
FadderGroup fetched = fadderService.getById(g1.getId());
assertEquals(3, fetched.getFadderChildren().size());
//Remove a child
fadderGroup.getFadderChildren().remove(s1);
fadderService.update(fadderGroup);
fetched = fadderService.getById(g1.getId());
assertEquals(2, fetched.getFadderChildren().size());
//Student should still exist
assertEquals(studSize + 3, studService.getAll(null).size());
studService.hibernateDelete(s1.getId());
//Delete a child
studService.hibernateDelete(s2.getId());
assertEquals(studSize + 1, studService.getAll(null).size());
//Should be removed from group
fetched = fadderService.getById(g1.getId());
assertEquals(1, fetched.getFadderChildren().size());
//Delete a group
fadderService.hibernateDelete(g1.getId());
//Student should not be deleted
assertEquals(studSize + 1, studService.getAll(null).size());
studService.hibernateDelete(s3.getId());
assertEquals(studSize, studService.getAll(null).size());
}
}