package no.niths.application.rest.school;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThat;
import java.util.GregorianCalendar;
import javax.validation.ConstraintViolationException;
import no.niths.application.rest.battlestation.interfaces.LoanController;
import no.niths.application.rest.exception.ObjectNotFoundException;
import no.niths.application.rest.school.interfaces.CommitteeController;
import no.niths.application.rest.school.interfaces.CourseController;
import no.niths.application.rest.school.interfaces.FeedController;
import no.niths.application.rest.school.interfaces.LockerController;
import no.niths.application.rest.school.interfaces.StudentController;
import no.niths.common.config.HibernateConfig;
import no.niths.common.config.TestAppConfig;
import no.niths.domain.battlestation.Loan;
import no.niths.domain.school.Committee;
import no.niths.domain.school.Course;
import no.niths.domain.school.Feed;
import no.niths.domain.school.Locker;
import no.niths.domain.school.Student;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mock.web.MockHttpServletResponse;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { TestAppConfig.class, HibernateConfig.class })
public class StudentControllerTest {
private MockHttpServletResponse res;
private Student student1;
private Student student2;
public static final String EMAIL = "epost@nith.no";
@Autowired
private StudentController studController;
@Autowired
private CourseController courseController;
@Autowired
private CommitteeController committeeController;
@Autowired
private FeedController feedController;
@Autowired
private LoanController loanController;
@Autowired
private LockerController lockerController;
@Before
public void setUp() {
res = new MockHttpServletResponse();
student1 = new Student("foo@bar.com");
student2 = new Student("baz@qux.com");
studController.create(student1, res);
studController.create(student2, res);
}
@After
public void tearDown() {
studController.delete(student1.getId());
studController.delete(student2.getId());
}
@Test(expected= ConstraintViolationException.class)
public void testInsertNullObject_shallThrowException() {
Student s = new Student();
studController.create(s, res);
}
@Test
public void testCreateAndDeleteWithExistingIds(){
int size = 0;
try {
size = studController.getAll(null).size();
} catch (ObjectNotFoundException e) {
//size = 0
}
Student s = new Student("mail@mail.com");
studController.create(s, res);
assertEquals(size + 1, studController.getAll(null).size());
studController.delete(s.getId());
int currentSize = 0;
try {
currentSize = studController.getAll(null).size();
} catch (ObjectNotFoundException e) {
//size = 0
}
assertEquals(size, currentSize);
}
@Test(expected = ObjectNotFoundException.class)
public void testDeleteWithUnvalidId(){
studController.delete(new Long(9391));
}
@Test
public void testGetMethods(){
int size = 0;
try {
size = studController.getAll(null).size();
} catch (ObjectNotFoundException e) {
//size = 0
}
Student s1 = new Student("mail1@mail.com");
Student s2 = new Student("mail2@mail.com");
Student s3 = new Student("mail3@mail.com");
studController.create(s1, res);
studController.create(s2, res);
studController.create(s3, res);
assertEquals(size + 3, studController.getAll(null).size());
assertEquals(s1, studController.getById(s1.getId()));
assertEquals(1, studController.getAll(s1).size());
s1.setEmail("xxx@mail.com");
assertEquals("mail1@mail.com", studController.getById(s1.getId()).getEmail());
studController.update(s1);
assertEquals("xxx@mail.com", studController.getById(s1.getId()).getEmail());
studController.delete(s1.getId());
studController.delete(s2.getId());
studController.delete(s3.getId());
}
@Test
public void testCreateAndDeleteOfCourses() {
Student student = new Student(EMAIL);
studController.create(student, res);
assertThat(student, is(equalTo(studController.getById(student.getId()))));
Course course = new Course("Programmering", "Litt av hvert");
Course otherCourse = new Course("Spillprogrammering", "Mye rart");
courseController.create(course, res);
courseController.create(otherCourse, res);
studController.addCourse(student.getId(), course.getId());
studController.addCourse(student.getId(), otherCourse.getId());
assertThat(2, is(equalTo(studController.getById(student.getId()).getCourses().size())));
studController.removeCourse(student.getId(), course.getId());
assertThat(1, is(equalTo(studController.getById(student.getId()).getCourses().size())));
assertThat(courseController.getById(otherCourse.getId()).getId(), is(equalTo(studController.getById(student.getId()).getCourses().get(0).getId())));
studController.delete(student.getId());
courseController.delete(course.getId());
courseController.delete(otherCourse.getId());
}
@Test
public void testCreateAndDeleteOfCommittees() {
Student student = new Student(EMAIL);
studController.create(student, res);
assertThat(student, is(equalTo(studController.getById(student.getId()))));
Committee committee = new Committee("UFF", "Utvalg for Fantastiske fritidssysseler");
Committee otherCommittee = new Committee("KIT", "Kvinner og IT");
committeeController.create(committee, res);
committeeController.create(otherCommittee, res);
studController.addCommittee(student.getId(), committee.getId());
studController.addCommittee(student.getId(), otherCommittee.getId());
assertThat(2, is(equalTo(studController.getById(student.getId()).getCommittees().size())));
studController.removeCommittee(student.getId(), committee.getId());
assertThat(1, is(equalTo(studController.getById(student.getId()).getCommittees().size())));
assertThat(committeeController.getById(otherCommittee.getId()).getId(), is(equalTo(studController.getById(student.getId()).getCommittees().get(0).getId())));
studController.delete(student.getId());
committeeController.delete(committee.getId());
committeeController.delete(otherCommittee.getId());
}
@Test
public void testCreateAndDeleteOfFeeds() {
Student student = new Student(EMAIL);
studController.create(student, res);
assertThat(student, is(equalTo(studController.getById(student.getId()))));
Feed feed = new Feed("Husk at kroa er åpen");
Feed otherFeed = new Feed("Minglekveld");
feedController.create(feed, res);
feedController.create(otherFeed, res);
studController.addFeed(student.getId(), feed.getId());
studController.addFeed(student.getId(), otherFeed.getId());
assertThat(2, is(equalTo(studController.getById(student.getId()).getFeeds().size())));
studController.removeFeed(student.getId(), feed.getId());
assertThat(1, is(equalTo(studController.getById(student.getId()).getFeeds().size())));
assertThat(feedController.getById(otherFeed.getId()).getId(), is(equalTo(studController.getById(student.getId()).getFeeds().get(0).getId())));
studController.delete(student.getId());
feedController.delete(feed.getId());
feedController.delete(otherFeed.getId());
}
@Test
public void testCreateAndDeleteOfLoans() {
Student student = new Student(EMAIL);
studController.create(student, res);
assertThat(student, is(equalTo(studController.getById(student.getId()))));
Loan loan = new Loan(new GregorianCalendar(), new GregorianCalendar());
Loan otherLoan = new Loan(new GregorianCalendar());
loanController.create(loan, res);
loanController.create(otherLoan, res);
studController.addLoan(student.getId(), loan.getId());
studController.addLoan(student.getId(), otherLoan.getId());
assertThat(2, is(equalTo(studController.getById(student.getId()).getLoans().size())));
System.err.println(loan.getId());
studController.removeLoan(student.getId(), loan.getId());
assertThat(1, is(equalTo(studController.getById(student.getId()).getLoans().size())));
assertThat(loanController.getById(otherLoan.getId()).getId(), is(equalTo(studController.getById(student.getId()).getLoans().get(0).getId())));
studController.delete(student.getId());
loanController.delete(loan.getId());
loanController.delete(otherLoan.getId());
}
@Test
public void testGetStudentWithRoles(){
//TODO: make test here!
}
// XXX: Should this and similar methods be moved to the service layer?
@Test
public void testFlipLockerToStudent() {
Locker locker = new Locker("001");
lockerController.create(locker, res);
studController.addLocker(student1.getId(), locker.getId());
assertEquals(
student1,
lockerController.getById(locker.getId()).getOwner());
studController.removeLocker(student1.getId(), locker.getId());
assertEquals(
null,
lockerController.getById(locker.getId()).getOwner());
lockerController.delete(locker.getId());
}
}