package no.difi.datahotel.logic; import no.difi.datahotel.BaseTest; import no.difi.datahotel.model.FieldLight; import no.difi.datahotel.model.Metadata; import no.difi.datahotel.util.CSVReader; import no.difi.datahotel.util.Filesystem; import no.difi.datahotel.util.MetadataLogger; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import org.mockito.Mockito; import java.io.File; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import static no.difi.datahotel.util.Filesystem.FILE_DATASET; import static no.difi.datahotel.util.Filesystem.FOLDER_SLAVE; import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.*; public class IndexBeanTest extends BaseTest { private Metadata metadata; private IndexBean indexBean; private FieldBean fieldBean; private SearchBean searchBean; private MetadataLogger logger; @Before public void before() throws Exception { fieldBean = new FieldBean(); logger = Mockito.mock(MetadataLogger.class); indexBean = new IndexBean(); indexBean.setFielBean(fieldBean); searchBean = new SearchBean(); metadata = new Metadata(); metadata.setLocation("difi/miljo/kalkulator"); metadata.setUpdated(System.currentTimeMillis()); metadata.setLogger(logger); } @Test public void testIndex() throws Exception { fieldBean.update(metadata); indexBean.update(metadata); searchBean.update(metadata); verify(logger).info("Reading fields."); verify(logger).info("Building index."); } @Test public void testNoSource() { metadata.setLocation("difi/miljo/no-exists"); metadata.setLogger(logger); indexBean.update(metadata); searchBean.update(metadata); // TODO Verify logger. } @Test public void testNoIndex() { metadata.setLocation("no/dataset/here"); metadata.setLogger(logger); assertEquals(0, searchBean.find(metadata, "kings", null, 1).getEntries().size()); // TODO Verify logger. } @Test public void testSearch() throws Exception { testIndex(); assertEquals(0, searchBean.find(metadata, "9908:*", null, 1).getEntries().size()); assertEquals(2, searchBean.find(metadata, "Energi", null, 1).getEntries().size()); assertEquals(0, searchBean.find(metadata, "km", null, 1).getEntries().size()); assertEquals(1, searchBean.find(metadata, "tog", null, 1).getEntries().size()); assertEquals(1, searchBean.find(metadata, "ark", null, 1).getEntries().size()); assertEquals(2, searchBean.find(metadata, "BUSS", null, 1).getEntries().size()); assertEquals(2, searchBean.find(metadata, "BU*", null, 1).getEntries().size()); assertEquals(0, searchBean.find(metadata, "Energi", null, 2).getEntries().size()); assertEquals(0, searchBean.find(metadata, "km", null, 2).getEntries().size()); assertEquals(0, searchBean.find(metadata, "tog", null, 2).getEntries().size()); assertEquals(0, searchBean.find(metadata, "ark", null, 2).getEntries().size()); assertEquals(0, searchBean.find(metadata, "BUSS", null, 2).getEntries().size()); } @Test @Ignore public void testEnhetsregisteret() throws Exception { metadata.setLocation("brreg/enhetsregisteret"); indexBean.update(metadata); searchBean.update(metadata); Map<String, String> query; query = new HashMap<String, String>(); query.put("organisasjonsform", "BA"); assertEquals(1, searchBean.find(metadata, null, query, 1).getEntries().size()); query = new HashMap<String, String>(); query.put("organisasjonsform", "DA"); assertEquals(15, searchBean.find(metadata, null, query, 1).getEntries().size()); query = new HashMap<String, String>(); query.put("organisasjonsform", "AS"); assertEquals(84, searchBean.find(metadata, null, query, 1).getEntries().size()); } @Test public void testElmaParticipants() throws Exception { metadata.setLocation("difi/participants"); fieldBean.update(metadata); indexBean.update(metadata); searchBean.update(metadata); Map<String, String> query; query = new HashMap<String, String>(); query.put("EHF_INVOICE", "Ja"); assertEquals(52, searchBean.find(metadata, "oslo kommune", query, 1).getEntries().size()); query = new HashMap<String, String>(); query.put("EHF_INVOICE", "\"Ja\""); assertEquals(52, searchBean.find(metadata, "oslo kommune", query, 1).getEntries().size()); query = new HashMap<String, String>(); query.put("EHF_INVOICE", "J*"); assertEquals(52, searchBean.find(metadata, "oslo kommune", query, 1).getEntries().size()); query = new HashMap<String, String>(); query.put("EHF_INVOICE", "J*"); assertEquals(52, searchBean.find(metadata, "oslo k*une", query, 1).getEntries().size()); query = new HashMap<String, String>(); query.put("EHF_INVOICE", "Ja"); assertEquals(100, searchBean.find(metadata, "o*", query, 1).getEntries().size()); query = new HashMap<String, String>(); query.put("EHF_INVOICE", "Ja"); assertEquals(100, searchBean.find(metadata, "St*", query, 1).getEntries().size()); query = new HashMap<String, String>(); query.put("identifier", "991825*"); assertEquals(2, searchBean.find(metadata, null, query, 1).getEntries().size()); query = new HashMap<String, String>(); query.put("EHF_INVOICE", "Ja"); assertEquals(0, searchBean.find(metadata, "9908\\:", query, 1).getEntries().size()); query = new HashMap<String, String>(); query.put("EHF_INVOICE", "Ja"); assertEquals(1, searchBean.find(metadata, "time and date", query, 1).getEntries().size()); query = new HashMap<String, String>(); query.put("identifier", "991825827"); assertEquals(1, searchBean.find(metadata, null, query, 1).getEntries().size()); query = new HashMap<String, String>(); query.put("EHF_INVOICE", "Ja"); assertEquals(1, searchBean.find(metadata, "991825827", query, 1).getEntries().size()); query = new HashMap<String, String>(); query.put("EHF_INVOICE", "Ja"); assertEquals(1, searchBean.find(metadata, "\"Time and date\"", query, 1).getEntries().size()); query = new HashMap<String, String>(); query.put("EHF_INVOICE", "Ja"); assertEquals(1, searchBean.find(metadata, "988375713 \"Time and date\"", query, 1).getEntries().size()); query = new HashMap<String, String>(); query.put("EHF_INVOICE", "Ja"); assertEquals(1, searchBean.find(metadata, "988375713 \"Time and date", query, 1).getEntries().size()); } @Test public void testDelete() { indexBean.delete("difi/miljo/kalkulator"); } @Test public void testLookupAdv() throws Exception { metadata.setLocation("difi/geo/kommune"); metadata.setLogger(logger); fieldBean.update(metadata); indexBean.update(metadata); searchBean.update(metadata); Map<String, String> query = new HashMap<String, String>(); query.put("kommune", "1401"); query.put("fylke", "14"); assertEquals(1, searchBean.find(metadata, null, query, 1).getEntries().size()); assertEquals(0, searchBean.find(metadata, null, query, 2).getEntries().size()); query.clear(); query.put("kommune", "1401"); assertEquals(1, searchBean.find(metadata, null, query, 1).getEntries().size()); assertEquals(0, searchBean.find(metadata, null, query, 2).getEntries().size()); query.clear(); query.put("fylke", "14"); assertEquals(26, searchBean.find(metadata, "", query, 1).getEntries().size()); assertEquals(0, searchBean.find(metadata, "", query, 2).getEntries().size()); query.clear(); query.put("navn", "l*anger"); assertEquals(2, searchBean.find(metadata, "", query, 1).getEntries().size()); assertEquals(0, searchBean.find(metadata, "", query, 2).getEntries().size()); indexBean.delete("difi/geo/kommune"); } @Test public void test10000() throws Exception { FieldBean fieldBean = Mockito.mock(FieldBean.class); indexBean.setFielBean(fieldBean); MetadataLogger logger = Mockito.mock(MetadataLogger.class); CSVReader parser = Mockito.mock(CSVReader.class); Field settingsFactoryField = IndexBean.class.getDeclaredField("csvReaderFactory"); settingsFactoryField.setAccessible(true); settingsFactoryField.set(indexBean, parser); Metadata metadata = new Metadata(); metadata.setLocation("whoknows"); metadata.setUpdated(10L); metadata.setLogger(logger); File filename = Filesystem.getFile(FOLDER_SLAVE, metadata.getLocation(), FILE_DATASET); List<FieldLight> fields = new ArrayList<FieldLight>(); no.difi.datahotel.model.Field field; field = new no.difi.datahotel.model.Field(); field.setShortName("field1"); field.setSearchable(false); fields.add(field.light()); Map<String, String> line = new HashMap<String, String>(); line.put("field1", "value"); when(parser.open(filename)).thenReturn(parser); when(fieldBean.getFields(metadata)).thenReturn(fields); when(parser.hasNext()).thenReturn(true); when(parser.getNextLine()).thenReturn(line); doThrow(new RuntimeException()).when(logger).info("Document 20000"); indexBean.update(metadata); verify(parser, times(20000)).getNextLine(); verify(logger).info("Building index."); verify(logger).info("Document 10000"); verify(logger).info("Document 20000"); } @Test @Ignore public void testUnableToReadLine() throws Exception { FieldBean fieldBean = Mockito.mock(FieldBean.class); indexBean.setFielBean(fieldBean); MetadataLogger logger = Mockito.mock(MetadataLogger.class); CSVReader parser = Mockito.mock(CSVReader.class); Field settingsFactoryField = IndexBean.class.getDeclaredField("csvReaderFactory"); settingsFactoryField.setAccessible(true); settingsFactoryField.set(indexBean, parser); Metadata metadata = new Metadata(); metadata.setLocation("whoknows2"); metadata.setUpdated(10L); metadata.setLogger(logger); File filename = Filesystem.getFile(FOLDER_SLAVE, metadata.getLocation(), FILE_DATASET); List<FieldLight> fields = new ArrayList<FieldLight>(); no.difi.datahotel.model.Field field; field = new no.difi.datahotel.model.Field(); field.setShortName("field1"); field.setSearchable(false); fields.add(field.light()); Map<String, String> line = new HashMap<String, String>(); line.put("field2", "value"); when(parser.open(filename)).thenReturn(parser); when(fieldBean.getFields(metadata)).thenReturn(fields); when(parser.hasNext()).thenReturn(true); when(parser.getNextLine()).thenReturn(line); doThrow(new RuntimeException()).when(logger).info("Document 10000"); doThrow(new RuntimeException()).when(logger).info("[NullPointerException][IndexBean.java:88] Unable to index line 1. (null)"); indexBean.update(metadata); verify(parser, times(1)).getNextLine(); verify(logger).info("Building index."); } @Test public void testUpToDate() { MetadataLogger logger = Mockito.mock(MetadataLogger.class); Metadata metadata = new Metadata(); metadata.setLocation("difi/geo/kommune"); metadata.setUpdated(System.currentTimeMillis()); metadata.setLogger(logger); indexBean.update(metadata); searchBean.update(metadata); verify(logger).info("Building index."); indexBean.update(metadata); searchBean.update(metadata); verify(logger).info("Index up to date."); } }