package dst.ass1.jpa.tests;

import static org.hamcrest.CoreMatchers.hasItems;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertThat;

import java.util.Collection;

import javax.persistence.EntityTransaction;

import org.junit.Before;
import org.junit.Test;

import dst.ass1.jpa.dao.ICourseDAO;
import dst.ass1.jpa.dao.ILessonDAO;
import dst.ass1.jpa.dao.IMaterialServerDAO;
import dst.ass1.jpa.model.ICourse;
import dst.ass1.jpa.model.ILesson;
import dst.ass1.jpa.model.IMaterialServer;

public class Ass1_2_3a_02Test extends Ass1_TestBase {

    private ILessonDAO lessonDAO;
    private ICourseDAO courseDAO;
    private IMaterialServerDAO materialServerDAO;

    @Before
    public void setUpDatabase() throws Exception {
        lessonDAO = daoFactory.createLessonDAO();
        courseDAO = daoFactory.createCourseDAO();
        materialServerDAO = daoFactory.createMaterialServerDAO();

        ILesson lesson1 = lessonDAO.findById(testData.lesson1Id);
        ILesson lesson2 = lessonDAO.findById(testData.lesson2Id);
        ICourse course2 = courseDAO.findById(testData.course2Id);

        EntityTransaction tx = em.getTransaction();
        tx.begin();
        lesson1.setCourse(course2);
        lesson2.setCourse(course2);
        em.persist(lesson1);
        em.persist(lesson2);
        em.flush();
        tx.commit();
    }

    @Test
    public void testMaterialServersForCourse() {
        ICourse course = courseDAO.findById(testData.course1Id);
        Collection<IMaterialServer> materialServers = materialServerDAO.findMaterialServersForCourse(course);
        assertNotNull(materialServers);

        assertThat(map(materialServers, e -> e.getId()), hasItems(
                testData.materialServer2Id,
                testData.materialServer3Id
        ));
    }

    @Test
    public void testMaterialServersForCourse2() {
        ICourse course = courseDAO.findById(testData.course2Id);
        Collection<IMaterialServer> materialServers = materialServerDAO.findMaterialServersForCourse(course);
        assertNotNull(materialServers);

        assertThat(map(materialServers, e -> e.getId()), hasItems(
                testData.materialServer1Id
        ));
    }
}
