package dst.ass1.jpa.tests;

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

import java.util.List;

import javax.persistence.EntityManager;

import org.junit.Test;

import dst.ass1.jpa.dao.ICoursePlatformDAO;
import dst.ass1.jpa.dao.IMaterialServerDAO;
import dst.ass1.jpa.dao.impl.DAOFactory;
import dst.ass1.jpa.model.ICoursePlatform;
import dst.ass1.jpa.model.IMaterialServer;

/**
 * Tests the association between ICoursePlatform and IMaterialServer.
 */
public class Ass1_1_1_09Test extends Ass1_TestBase {

    @Test
    public void testCoursePlatformMaterialServerAssociation() {
        EntityManager em = orm.createEntityManager();
        DAOFactory daoFactory = new DAOFactory(em);

        IMaterialServerDAO materialServerDAO = daoFactory.createMaterialServerDAO();
        ICoursePlatformDAO coursePlatformDAO = daoFactory.createCoursePlatformDAO();

        List<IMaterialServer> materialServers = materialServerDAO.findAll();

        assertNotNull(materialServers);
        assertEquals(3, materialServers.size());

        IMaterialServer materialServer1 = materialServerDAO.findById(testData.materialServer1Id);
        IMaterialServer materialServer2 = materialServerDAO.findById(testData.materialServer2Id);
        IMaterialServer materialServer3 = materialServerDAO.findById(testData.materialServer3Id);

        assertEquals(testData.materialServer1Id, materialServer1.getId());
        assertEquals(testData.materialServer2Id, materialServer2.getId());
        assertEquals(testData.materialServer3Id, materialServer3.getId());

        List<ICoursePlatform> coursePlatforms = coursePlatformDAO.findAll();

        assertNotNull(coursePlatforms);
        assertEquals(2, coursePlatforms.size());

        ICoursePlatform coursePlatform1 = coursePlatformDAO.findById(testData.coursePlatform1Id);
        ICoursePlatform coursePlatform2 = coursePlatformDAO.findById(testData.coursePlatform2Id);

        assertEquals(testData.coursePlatform1Id, coursePlatform1.getId());
        assertNotNull(coursePlatform1.getMaterialServers());
        assertThat(coursePlatform1.getMaterialServers().size(), is(2));
        List<Long> materialServerIds1 = map(coursePlatform1.getMaterialServers(), IMaterialServer::getId);
        assertThat(materialServerIds1, hasItems(testData.materialServer1Id, testData.materialServer2Id));

        assertEquals(testData.coursePlatform2Id, coursePlatform2.getId());
        assertNotNull(coursePlatform2.getMaterialServers());
        assertThat(coursePlatform2.getMaterialServers().size(), is(1));
        List<Long> materialServerIds2 = map(coursePlatform2.getMaterialServers(), IMaterialServer::getId);
        assertThat(materialServerIds2, hasItems(testData.materialServer3Id));
    }

}
