package edu.lmu.cs.headmaster.ws.dao;
import java.util.ArrayList;
import java.util.List;
import org.hibernate.LazyInitializationException;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import edu.lmu.cs.headmaster.ws.domain.Event;
import edu.lmu.cs.headmaster.ws.domain.GPA;
import edu.lmu.cs.headmaster.ws.domain.Major;
import edu.lmu.cs.headmaster.ws.domain.Student;
import edu.lmu.cs.headmaster.ws.types.Term;
import edu.lmu.cs.headmaster.ws.util.ApplicationContextTest;
public class StudentDaoTest extends ApplicationContextTest {
private StudentDao studentDao;
@Before
public void getRequiredBeans() {
studentDao = (StudentDao)applicationContext.getBean("studentDao");
}
@Test
public void testGetStudentById() {
// Grab a test fixture student.
Student student = studentDao.getStudentById(1000000L);
Assert.assertEquals(Long.valueOf(1000000L), student.getId());
Assert.assertEquals("Berners-Lee", student.getLastName());
Assert.assertEquals("Tim", student.getFirstName());
Assert.assertTrue(student.isActive());
Assert.assertEquals(Integer.valueOf(2016), student.getExpectedGraduationYear());
// The text fixture data has some empty values.
Assert.assertNull(student.getMiddleName());
Assert.assertNull(student.getEntryYear());
Assert.assertEquals(0, student.getMajors().size());
Assert.assertEquals(0, student.getMinors().size());
Assert.assertEquals(0, student.getRecord().getGrades().size());
// Grant and event data do not come along for the ride.
try {
student.getGrants().size();
// If this doesn't bork, something is wrong.
Assert.fail("getGrants should not succeed, but did.");
} catch(LazyInitializationException lazyInitializationException) {
// This is what should happen; carry on.
}
try {
student.getAttendance().size();
// If this doesn't bork, something is wrong.
Assert.fail("getAttendance should not succeed, but did.");
} catch(LazyInitializationException lazyInitializationException) {
// This is what should happen; carry on.
}
}
@Test
public void testGetStudentByIdGrades() {
// One of the test fixture students has grades.
List<GPA> grades = studentDao.getStudentById(1000002L).getRecord().getGrades();
Assert.assertEquals(2, grades.size());
// We expect grades to be sorted by year then term.
Assert.assertEquals(Term.FALL, grades.get(0).getTerm());
Assert.assertEquals(2015, grades.get(0).getYear());
Assert.assertEquals(3.8, grades.get(0).getGpa(), 0.0);
Assert.assertEquals(Term.SPRING, grades.get(1).getTerm());
Assert.assertEquals(2016, grades.get(1).getYear());
Assert.assertEquals(3.5, grades.get(1).getGpa(), 0.0);
}
@Test
public void testGetStudentByIdMajorsAndMinors() {
// One of the test fixture students has majors and minors.
Student student = studentDao.getStudentById(1000002L);
Assert.assertEquals(2, student.getMajors().size());
Assert.assertEquals(1, student.getMinors().size());
// Majors and minors are manually ordered.
Assert.assertEquals("Computer Science", student.getMajors().get(0).getDiscipline());
Assert.assertEquals("Mathematics", student.getMajors().get(1).getDiscipline());
Assert.assertEquals("Music", student.getMinors().get(0));
}
@Test
public void testGetStudentByGpaWithOnlyMaximum() {
List<Student> students = studentDao.getStudents(null, null, null, null, null,
null, 3.0, null, null, null, null, 0, 10);
Assert.assertEquals(2, students.size());
Assert.assertEquals(Long.valueOf(1000005), students.get(0).getId());
Assert.assertEquals(Long.valueOf(1000006), students.get(1).getId());
}
@Test
public void testGetStudentByGpaWithOnlyMinimum() {
List<Student> students = studentDao.getStudents(null, null, null, null, null,
3.0, null, null, null, null, null, 0, 10);
Assert.assertEquals(3, students.size());
Assert.assertEquals(Long.valueOf(1000007), students.get(0).getId());
Assert.assertEquals(Long.valueOf(1000008), students.get(1).getId());
Assert.assertEquals(Long.valueOf(1000009), students.get(2).getId());
}
@Test
public void testGetStudentByGpaBothMinimumAndMaximum() {
List<Student> students = studentDao.getStudents(null, null, null, null, null,
3.39, 3.91, null, null, null, null, 0, 10);
Assert.assertEquals(2, students.size());
Assert.assertEquals(Long.valueOf(1000008), students.get(0).getId());
Assert.assertEquals(Long.valueOf(1000009), students.get(1).getId());
}
@Test
public void testGetStudentByTermGpaMinimumOnly() {
List<Student> students = studentDao.getStudents(null, null, null, null, null,
null, null, 3.0, null, Term.FALL, 2012, 0, 10);
Assert.assertEquals(3, students.size());
Assert.assertEquals("Turd", students.get(0).getFirstName());
Assert.assertEquals("Trevor", students.get(1).getFirstName());
Assert.assertEquals("Nestor", students.get(2).getFirstName());
}
@Test
public void testGetStudentByTermGpaMaximumOnly() {
List<Student> students = studentDao.getStudents(null, null, null, null, null,
null, null, null, 3.9, Term.FALL, 2012, 0, 10);
Assert.assertEquals(2, students.size());
Assert.assertEquals("Turd", students.get(0).getFirstName());
Assert.assertEquals("Trevor", students.get(1).getFirstName());
}
@Test
public void testGetStudentsByTermGpaMaxAndMin() {
List<Student> students = studentDao.getStudents(null, null, null, null, null,
null, null, 3.7, 3.7, Term.FALL, 2012, 0, 10);
Assert.assertEquals(1, students.size());
Assert.assertEquals("McBean", students.get(0).getLastName());
}
@Test
public void testGetStudentsByTermGpaAndTransfer() {
List<Student> students = studentDao.getStudents(null, null, true, null, null,
null, null, 3.7, 4.0, Term.FALL, 2012, 0, 10);
Assert.assertEquals(2, students.size());
Assert.assertEquals("Ferguson", students.get(0).getLastName());
Assert.assertEquals("McBean", students.get(1).getLastName());
students = studentDao.getStudents(null, null, true, null, null,
null, null, 4.0, 4.0, Term.FALL, 2012, 0, 10);
Assert.assertEquals(0, students.size());
}
@Test
public void testGetStudentsByCumulativeGpaAndTransfer() {
List<Student> students = studentDao.getStudents(null, null, true, null, null,
3.5, 4.0, null, null, null, null, 0, 10);
Assert.assertEquals(2, students.size());
Assert.assertEquals(Long.valueOf(1000008), students.get(0).getId());
Assert.assertEquals(Long.valueOf(1000009), students.get(1).getId());
students = studentDao.getStudents(null, null, true, null, null,
4.0, null, null, null, null, null, 0, 10);
Assert.assertEquals(0, students.size());
}
@Test
public void testGetStudentsByLastName() {
// When without commas and not all-digits, the student query is hits on
// "last name starts with query," case insensitive.
List<Student> students = studentDao.getStudents("cer", null, null, null, null,
null, null, null, null, null, null, 0, 10);
Assert.assertEquals(1, students.size());
Assert.assertEquals(Long.valueOf(1000001L), students.get(0).getId());
students = studentDao.getStudents("k", null, null, null, null,
null, null, null, null, null, null, 0, 10);
Assert.assertEquals(2, students.size());
// Search results are sorted by last name, first name.
Assert.assertEquals(Long.valueOf(1000004L), students.get(0).getId());
Assert.assertEquals(Long.valueOf(1000002L), students.get(1).getId());
}
@Test
public void testGetActiveStudents() {
List<Student> students = studentDao.getStudents(null, Boolean.TRUE, null, null, null,
null, null, null, null, null, null, 0, 10);
Assert.assertEquals(8, students.size());
// Search results are sorted by last name, first name.
Assert.assertEquals(Long.valueOf(1000000L), students.get(0).getId());
Assert.assertEquals(Long.valueOf(1000005L), students.get(1).getId());
Assert.assertEquals(Long.valueOf(1000004L), students.get(2).getId());
Assert.assertEquals(Long.valueOf(1000002L), students.get(3).getId());
Assert.assertEquals(Long.valueOf(1000006L), students.get(4).getId());
Assert.assertEquals(Long.valueOf(1000007L), students.get(5).getId());
Assert.assertEquals(Long.valueOf(1000008L), students.get(6).getId());
Assert.assertEquals(Long.valueOf(1000009L), students.get(7).getId());
}
@Test
public void testGetInactiveStudents() {
List<Student> students = studentDao.getStudents(null, Boolean.FALSE, null, null, null,
null, null, null, null, null, null, 0, 10);
Assert.assertEquals(2, students.size());
// Search results are sorted by last name, first name.
Assert.assertEquals(Long.valueOf(1000001L), students.get(0).getId());
Assert.assertEquals(Long.valueOf(1000003L), students.get(1).getId());
}
@Test
public void testGetTransferStudents() {
List<Student> students = studentDao.getStudents(null, null, Boolean.TRUE, null, null,
null, null, null, null, null, null, 0, 10);
Assert.assertEquals(7, students.size());
// Search results are sorted by last name, first name.
Assert.assertEquals(Long.valueOf(1000000L), students.get(0).getId());
Assert.assertEquals(Long.valueOf(1000005L), students.get(1).getId());
Assert.assertEquals(Long.valueOf(1000004L), students.get(2).getId());
Assert.assertEquals(Long.valueOf(1000002L), students.get(3).getId());
Assert.assertEquals(Long.valueOf(1000006L), students.get(4).getId());
Assert.assertEquals(Long.valueOf(1000008L), students.get(5).getId());
Assert.assertEquals(Long.valueOf(1000009L), students.get(6).getId());
}
@Test
public void testGetNotTransferStudents() {
List<Student> students = studentDao.getStudents(null, null, Boolean.FALSE, null, null,
null, null, null, null, null, null, 0, 10);
Assert.assertEquals(3, students.size());
// Search results are sorted by last name, first name.
Assert.assertEquals(Long.valueOf(1000001L), students.get(0).getId());
Assert.assertEquals(Long.valueOf(1000007L), students.get(1).getId());
Assert.assertEquals(Long.valueOf(1000003L), students.get(2).getId());
}
@Test
public void testGetStudentsBySpecificExpectedGraduationYear() {
List<Student> students = studentDao.getStudents(null, null, null, 2015, 2015,
null, null, null, null, null, null, 0, 10);
Assert.assertEquals(2, students.size());
// Search results are sorted by last name, first name.
Assert.assertEquals(Long.valueOf(1000001L), students.get(0).getId());
Assert.assertEquals(Long.valueOf(1000002L), students.get(1).getId());
}
// TODO Many more ways to test getStudents...
@Test
public void testGetStudentAttendanceById() {
// Verify that the text fixture event attendance comes out correctly.
for (long l = 1000000L; l < 1000003L; l++) {
List<Event> events = studentDao.getStudentAttendanceById(l);
Assert.assertEquals(1, events.size());
Assert.assertEquals(Long.valueOf(1000000L), events.get(0).getId());
Assert.assertEquals("Summit", events.get(0).getTitle());
Assert.assertEquals("The big one", events.get(0).getDescription());
}
}
@Test
public void testGetStudentAttendanceByIdForStudentWithNoEvents() {
// We get a non-null but empty list for a student without events.
List<Event> events = studentDao.getStudentAttendanceById(1000003L);
Assert.assertNotNull(events);
Assert.assertEquals(0, events.size());
}
@Test
public void testGetStudentAttendanceByIdForNonexistentStudent() {
// We expect null attendance when the student does not exist.
Assert.assertNull(studentDao.getStudentAttendanceById(2000000L));
}
@Test
public void testGetMatchingCollegesOrSchools() {
// "en" should match both science and engineering.
List<String> results = studentDao.getMatchingCollegesOrSchools("en", 0, 50);
Assert.assertEquals(2, results.size());
Assert.assertEquals("Engineering", results.get(0));
Assert.assertEquals("Science", results.get(1));
// "sc" should match only science.
results = studentDao.getMatchingCollegesOrSchools("sc", 0, 50);
Assert.assertEquals(1, results.size());
Assert.assertEquals("Science", results.get(0));
// "eer" should match only engineering.
results = studentDao.getMatchingCollegesOrSchools("eer", 0, 50);
Assert.assertEquals(1, results.size());
Assert.assertEquals("Engineering", results.get(0));
// "zatoichi" should match nothing.
results = studentDao.getMatchingCollegesOrSchools("zatoichi", 0, 50);
Assert.assertEquals(0, results.size());
}
@Test
public void testGetMatchingDegrees() {
// "b" should match both BA and BS.
List<String> results = studentDao.getMatchingDegrees("b", 0, 50);
Assert.assertEquals(2, results.size());
Assert.assertEquals("BA", results.get(0));
Assert.assertEquals("BS", results.get(1));
// "s" should match only BS.
results = studentDao.getMatchingDegrees("s", 0, 50);
Assert.assertEquals(1, results.size());
Assert.assertEquals("BS", results.get(0));
// "a" should match only BA.
results = studentDao.getMatchingDegrees("a", 0, 50);
Assert.assertEquals(1, results.size());
Assert.assertEquals("BA", results.get(0));
// "bazinga" should match nothing.
results = studentDao.getMatchingDegrees("bazinga", 0, 50);
Assert.assertEquals(0, results.size());
}
@Test
public void testGetMatchingDisciplines() {
// "ic" should match both Mathematics and Music.
List<String> results = studentDao.getMatchingDisciplines("ic", 0, 50);
Assert.assertEquals(2, results.size());
Assert.assertEquals("Mathematics", results.get(0));
Assert.assertEquals("Music", results.get(1));
// "comp" should match only Computer Science.
results = studentDao.getMatchingDisciplines("comp", 0, 50);
Assert.assertEquals(1, results.size());
Assert.assertEquals("Computer Science", results.get(0));
// "us" should match only Music.
results = studentDao.getMatchingDisciplines("us", 0, 50);
Assert.assertEquals(1, results.size());
Assert.assertEquals("Music", results.get(0));
// "cucaracha" should match nothing.
results = studentDao.getMatchingDisciplines("cucaracha", 0, 50);
Assert.assertEquals(0, results.size());
}
@Test
public void testCreateOrUpdateStudentGrades() {
// Build the grade list.
List<GPA> grades = new ArrayList<GPA>();
// We leave the correctness of the GET to other unit tests.
GPA gpa = new GPA();
gpa.setTerm(Term.SPRING);
gpa.setYear(2017);
gpa.setGpa(2.75);
grades.add(gpa);
gpa = new GPA();
gpa.setTerm(Term.SUMMER);
gpa.setYear(2015);
gpa.setGpa(2.0);
grades.add(gpa);
Student student = studentDao.getStudentById(1000000L);
student.getRecord().setGrades(grades);
studentDao.createOrUpdateStudent(student);
// We check that the grades were indeed saved.
grades = studentDao.getStudentById(1000000L).getRecord().getGrades();
Assert.assertEquals(2, grades.size());
Assert.assertEquals(Term.SUMMER, grades.get(0).getTerm());
Assert.assertEquals(2015, grades.get(0).getYear());
Assert.assertEquals(2.0, grades.get(0).getGpa(), 0.0);
Assert.assertEquals(Term.SPRING, grades.get(1).getTerm());
Assert.assertEquals(2017, grades.get(1).getYear());
Assert.assertEquals(2.75, grades.get(1).getGpa(), 0.0);
}
@Test
public void testCreatOrUpdateStudentFoodPreference() {
Student student = studentDao.getStudentById(1000000L);
List<String> foodPreference = new ArrayList<String>();
foodPreference.add("vegetarian");
foodPreference.add("glutenfree");
student.setFoodPreference(foodPreference);
studentDao.createOrUpdateStudent(student);
student = studentDao.getStudentById(1000000L);
Assert.assertEquals(foodPreference.get(0), student.getFoodPreference().get(0));
Assert.assertEquals(foodPreference.get(1), student.getFoodPreference().get(1));
}
@Test
public void testCreateOrUpdateStudentAddMajorsAndMinors() {
// Grab a test fixture student.
Student student = studentDao.getStudentById(1000001L);
// Add a major and some minors.
Major major = new Major();
major.setCollegeOrSchool("Science");
major.setDegree("BS");
major.setDiscipline("Biology");
student.getMajors().add(major);
student.getMinors().add("Physics");
student.getMinors().add("Chemistry");
studentDao.createOrUpdateStudent(student);
// Now re-grab and check.
student = studentDao.getStudentById(1000001L);
Assert.assertEquals(1, student.getMajors().size());
Assert.assertEquals(2, student.getMinors().size());
Assert.assertEquals("Biology", student.getMajors().get(0).getDiscipline());
Assert.assertEquals("Physics", student.getMinors().get(0));
Assert.assertEquals("Chemistry", student.getMinors().get(1));
}
}