package no.niths.infrastructure.school;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
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.Committee;
import no.niths.domain.school.Course;
import no.niths.domain.school.Role;
import no.niths.domain.school.Student;
import no.niths.infrastructure.school.interfaces.CommitteeRepositorty;
import no.niths.infrastructure.school.interfaces.CourseRepository;
import no.niths.infrastructure.school.interfaces.StudentRepository;
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;
import org.springframework.test.context.transaction.TransactionConfiguration;
import org.springframework.transaction.annotation.Transactional;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { TestAppConfig.class, HibernateConfig.class })
@Transactional
@TransactionConfiguration(transactionManager = "transactionManager",defaultRollback=true)
public class StudentRepositoryTest {
@Autowired
private StudentRepository studentRepo;
@Autowired
private CourseRepository courseRepo;
@Autowired
private CommitteeRepositorty comRepo;
/**
* Testing of basic CRUD functions
*/
@Test
public void testCRUD() {
int size = studentRepo.getAll(null).size();
Student stud = new Student("John", "Doe");
stud.setEmail("mail@mail.com");
studentRepo.create(stud);
assertEquals(stud, studentRepo.getById(stud.getId()));
assertEquals(size + 1, studentRepo.getAll(null).size());
stud.setFirstName("Jane");
studentRepo.update(stud);
assertEquals("Jane", studentRepo.getById(stud.getId()).getFirstName());
studentRepo.delete(stud.getId());
// assertEquals(null, studentRepo.getById(stud.getId()));
assertEquals(size, studentRepo.getAll(null).size());
}
/**
* Tests the course association
*/
@Test
public void testStudentWithCourses() {
int cSize = courseRepo.getAll(null).size();
int comSize = comRepo.getAll(null).size();
Course c1 = new Course("PROG", "casd1");
Course c2 = new Course("DESIGN", "cdda2");
courseRepo.create(c1);
courseRepo.create(c2);
// Courses should be persisted
assertEquals(cSize + 2, courseRepo.getAll(null).size());
Student stud = new Student("John", "Doe");
stud.setEmail("mail@mail.com");
stud.getCourses().add(c1);
stud.getCourses().add(c2);
studentRepo.create(stud);
assertEquals(stud, studentRepo.getById(stud.getId()));
// Test if student has courses
assertEquals(2, studentRepo.getById(stud.getId()).getCourses().size());
studentRepo.getById(stud.getId()).getCourses().remove(1);
assertEquals(1, studentRepo.getById(stud.getId()).getCourses().size());
assertEquals(cSize + 2, courseRepo.getAll(null).size());
Committee c = new Committee("Utvalg", "desc");
comRepo.create(c);
assertEquals(comSize + 1, comRepo.getAll(null).size());
stud = studentRepo.getById(stud.getId());
stud.getCommittees().add(c);
studentRepo.update(stud);
assertEquals(1, studentRepo.getById(stud.getId()).getCommittees()
.size());
}
@Test
public void testGetAllStudentsWithParameter_shouldReturnListOfStudentsMatching() {
int size = studentRepo.getAll(null).size();
createStudentHelper();
assertEquals(size + 4, studentRepo.getAll(null).size());
Student toFind = new Student("John", "Doe");
assertEquals(2, studentRepo.getAll(toFind).size());
toFind = new Student("Jane", "Doe");
assertEquals(1, studentRepo.getAll(toFind).size());
toFind = new Student("XXX", "Doe");
assertEquals(0, studentRepo.getAll(toFind).size());
}
@Test
public void testGetStudentsWithNamedCourse(){
int size = studentRepo.getAll(null).size();
List<Student> students =createStudentHelper();
assertEquals(size + 4, studentRepo.getAll(null).size());
String name ="prog";
Course c = new Course(name, "ProgProg");
courseRepo.create(c);
ArrayList<Course> cs = new ArrayList<Course>();
cs.add(c);
for (int i = 0; i < students.size()-1; i++) {
students.get(i).setCourses(cs);
studentRepo.update(students.get(i));
}
students.clear();
students = studentRepo.getStudentsWithNamedCourse(name);
assertEquals(3, students.size());
}
private ArrayList<Student>createStudentHelper(){
ArrayList<Student> students = new ArrayList<Student>();
String [] firstName = {"John","John","Jane","Foo"};
String [] lastName = {"Doe","Doe","Doe","Bar"};
for (int i = 0; i < lastName.length; i++) {
Student s1 = new Student(firstName[i],lastName[i]);
s1.setEmail("mail" + i + "@mail.com");
studentRepo.create(s1);
students.add(s1);
}
return students;
}
@Test
public void testAddRoles(){
Student s1 = new Student("John","Doe");
s1.setEmail("mailai@mail.com");
studentRepo.create(s1);
s1.getRoles().clear();
s1.getRoles().add(new Role("ROLE_AMDIN"));
s1.getRoles().add(new Role("ROLE_AMDINS"));
studentRepo.update(s1);
s1 = studentRepo.getById(s1.getId());
assertNotNull(s1);
assertEquals(2, s1.getRoles().size());
}
}