package dst.ass1.doc.tests;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;

import java.util.List;

import org.bson.Document;
import org.junit.ClassRule;
import org.junit.Rule;
import org.junit.Test;

import dst.ass1.doc.DocumentTestData;
import dst.ass1.doc.EmbeddedMongo;
import dst.ass1.doc.IDocumentQuery;
import dst.ass1.doc.MongoService;
import dst.ass1.jpa.util.Constants;

public class Ass1_4_2aTest {

    @ClassRule
    public static EmbeddedMongo embeddedMongo = new EmbeddedMongo();

    @Rule
    public MongoService mongo = new MongoService(new DocumentTestData());

    @SuppressWarnings("unchecked")
    @Test
    public void findByMaterialId_returnsCorrectDocument() {
        IDocumentQuery documentQuery = mongo.getDocumentQuery();

        Document material = documentQuery.findByMaterialId(2L);
        assertEquals(2L, material.getLong(Constants.I_MATERIAL), 0);
        assertEquals("quiz", material.getString(Constants.M_MATERIAL_TYPE));
        assertEquals("text", material.getString("quiz_type"));

        List<Document> questions = (List<Document>) material.get("questions");
        assertNotNull(questions);
        assertEquals(7, questions.size());
        assertEquals("How exactly does the rabies pathogen work?", questions.get(3).get("text"));
        assertEquals(10, questions.get(3).get("points"));
    }

    @Test
    public void findByMaterialId_withInvalidId_returnsNull() throws Exception {
        Document material = mongo.getDocumentQuery().findByMaterialId(1337L);
        assertNull(material);
    }

}
