package dst.ass1.jpa.tests;

import static org.hamcrest.core.IsCollectionContaining.hasItems;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThat;

import java.util.List;

import javax.persistence.EntityTransaction;
import javax.persistence.Query;

import org.junit.Test;

import dst.ass1.jpa.model.ILecturer;
import dst.ass1.jpa.model.ILesson;
import dst.ass1.jpa.util.Constants;

public class Ass1_2_1cTest extends Ass1_TestBase {

    @SuppressWarnings("unchecked")
    @Test
    public void namedQuery_returnsCorrectResult() {
        Query query = em.createNamedQuery(Constants.Q_MOST_ACTIVE_LECTURER);

        List<ILecturer> result = (List<ILecturer>) query.getResultList();
        assertEquals(1, result.size());
        assertEquals(testData.lecturer2Id, result.get(0).getId());
    }

    @SuppressWarnings("unchecked")
    @Test
    public void namedQuery_withAdditionalAssociation_returnsCorrectResult() throws Exception {
        ILesson lesson2 = daoFactory.createLessonDAO().findById(testData.lesson2Id);
        ILecturer lecturer1 = daoFactory.createLecturerDAO().findById(testData.lecturer1Id);
        ILecturer lecturer2 = daoFactory.createLecturerDAO().findById(testData.lecturer2Id);

        EntityTransaction tx = em.getTransaction();
        tx.begin();
        lesson2.addLecturer(lecturer1);
        lecturer1.addLesson(lesson2);
        em.persist(lesson2);
        em.persist(lecturer1);
        em.flush();
        tx.commit();

        Query query = em.createNamedQuery(Constants.Q_MOST_ACTIVE_LECTURER);

        List<ILecturer> result = (List<ILecturer>) query.getResultList();
        assertEquals(2, result.size());
        assertThat(result, hasItems(lecturer1, lecturer2));
    }

    @SuppressWarnings("unchecked")
    @Test
    public void namedQuery_onEmptyDatabase_returnsEmptyResult() {
        db.truncateTables();

        Query query = em.createNamedQuery(Constants.Q_MOST_ACTIVE_LECTURER);

        List<ILecturer> result = (List<ILecturer>) query.getResultList();
        assertEquals(0, result.size());
    }
}
