package org.solrmarc.index.indexer;
import org.junit.Before;
import org.junit.Test;
import org.marc4j.MarcPermissiveStreamReader;
import org.marc4j.MarcReader;
import org.marc4j.marc.Record;
import org.solrmarc.index.indexer.AbstractValueIndexer;
import org.solrmarc.index.indexer.MultiValueIndexer;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.Collection;
import java.util.List;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.collection.IsIterableContainingInAnyOrder.containsInAnyOrder;
public class ValueIndexerFactoryTests
{
private Record testRecord;
private Record testRecord2;
private final static String inputfilename="./test/data/records/u233.mrc";
private final static String inputfilename2="./test/data/records/u5278992.mrc";
private static ValueIndexerFactory factory;
static
{
factory = ValueIndexerFactory.initialize(new String[]{System.getProperty("test.data.dir", "test/data")});
}
@Before
public void setup() throws FileNotFoundException
{
InputStream input = new BufferedInputStream(new FileInputStream(inputfilename));
MarcReader reader = new MarcPermissiveStreamReader(input, true, true);
testRecord = reader.next();
testRecord.setId(1L);
input = new BufferedInputStream(new FileInputStream(inputfilename2));
reader = new MarcPermissiveStreamReader(input, true, true);
testRecord2 = reader.next();
testRecord2.setId(1L);
}
@Test
public void testEmptyConfiguration() throws IllegalAccessException, InstantiationException
{
String[] configSpecs = { };
final List<AbstractValueIndexer<?>> valueIndexers = factory.createValueIndexers(configSpecs);
assertEquals(0, valueIndexers.size());
}
@Test
public void testConstantIndexer() throws Exception
{
final AbstractValueIndexer<?> valueIndexer = factory.createValueIndexer("constant", "\"Test constant\"");
final MultiValueIndexer indexer = (MultiValueIndexer) valueIndexer;
assertEquals(1, indexer.getSolrFieldNames().size());
assertEquals("constant", indexer.getSolrFieldNames().iterator().next());
assertEquals("Test constant", indexer.getFieldData(null).iterator().next());
}
@Test
public void testFullRecordIndexer() throws Exception
{
final AbstractValueIndexer<?> valueIndexer = factory.createValueIndexer("fullRecord", "text");
final MultiValueIndexer indexer = (MultiValueIndexer) valueIndexer;
assertEquals(1, indexer.getSolrFieldNames().size());
assertEquals("fullRecord", indexer.getSolrFieldNames().iterator().next());
@SuppressWarnings("unused")
String xml = indexer.getFieldData(testRecord).iterator().next().toString();
}
@Test
public void testDateIndexedIndexer() throws Exception
{
final AbstractValueIndexer<?> valueIndexer = factory.createValueIndexer("dateIndexed", "dateRecordIndexed");
final MultiValueIndexer indexer = (MultiValueIndexer) valueIndexer;
assertEquals(1, indexer.getSolrFieldNames().size());
assertEquals("dateIndexed", indexer.getSolrFieldNames().iterator().next());
String indexed = indexer.getFieldData(testRecord).iterator().next().toString();
String indexed2 = indexer.getFieldData(testRecord2).iterator().next().toString();
assertEquals(indexed, indexed2);
}
@Test
public void testFieldSpecDataFieldIndexer() throws Exception
{
final AbstractValueIndexer<?> valueIndexer = factory.createValueIndexer("title_fields", "245abnp, cleanEnd");
final MultiValueIndexer indexer = (MultiValueIndexer) valueIndexer;
assertEquals(1, indexer.getSolrFieldNames().size());
assertEquals("title_fields", indexer.getSolrFieldNames().iterator().next());
Collection<String> result = indexer.getFieldData(testRecord);
assertEquals(1, result.size());
String value = result.iterator().next();
assertEquals("Lascaux en Périgord noir : environnement, art pariétal et conservation", value);
}
@Test
public void testFieldSpecControlFieldIndexer() throws Exception
{
final AbstractValueIndexer<?> valueIndexer = factory.createValueIndexer("id", "001");
final MultiValueIndexer indexer = (MultiValueIndexer) valueIndexer;
assertEquals(1, indexer.getSolrFieldNames().size());
assertEquals("id", indexer.getSolrFieldNames().iterator().next());
Collection<String> result = indexer.getFieldData(testRecord);
assertEquals(1, result.size());
assertEquals("u233", result.iterator().next());
}
// "008[35-37]:041a:041d"
@Test
public void testFieldSpecMultiFieldIndexer() throws Exception
{
final AbstractValueIndexer<?> valueIndexer = factory.createValueIndexer("language_facet", "008[35-37]:041a:041d, language_map.properties, unique");
final MultiValueIndexer indexer = (MultiValueIndexer) valueIndexer;
assertEquals(1, indexer.getSolrFieldNames().size());
assertEquals("language_facet", indexer.getSolrFieldNames().iterator().next());
Collection<String> result = indexer.getFieldData(testRecord);
String[] expected = new String[] { "French", "English", "German", "Spanish" };
assertThat(result, containsInAnyOrder(expected));
}
@Test
public void testMixinIndexer() throws Exception
{
final AbstractValueIndexer<?> valueIndexer = factory.createValueIndexer("mixin", "custom, testMixinMethod");
final MultiValueIndexer indexer = (MultiValueIndexer) valueIndexer;
assertEquals(1, indexer.getSolrFieldNames().size());
assertEquals("mixin", indexer.getSolrFieldNames().iterator().next());
assertEquals("<null>", indexer.getFieldData(null).iterator().next());
}
@Test(expected = NullPointerException.class)
public void testManyIndexers() throws Exception
{
String[] configs = {
"mixin = custom, testMixinMethod",
"constant = \"Test constant\"",
"fullRecord = xml" };
final List<AbstractValueIndexer<?>> valueIndexers = factory.createValueIndexers(configs);
assertEquals(3, valueIndexers.size());
for (final AbstractValueIndexer<?> valueIndexer : valueIndexers)
{
// This will fail because the full record indexer dosn't allow NULL as record.
assertNotNull(valueIndexer.getFieldData(null));
}
}
@Test
public void testJavaIndexerInheritanceParent() throws Exception
{
final AbstractValueIndexer<?> valueIndexer = factory.createValueIndexer("javacall", "java(org.test.TestMixin), testMethod");
final MultiValueIndexer indexer = (MultiValueIndexer) valueIndexer;
assertEquals(1, indexer.getSolrFieldNames().size());
assertEquals("javacall", indexer.getSolrFieldNames().iterator().next());
assertEquals("<null>", indexer.getFieldData(null).iterator().next());
String recordAsText = indexer.getFieldData(testRecord).iterator().next();
int leaderLength = recordAsText.indexOf("\n");
String firstLine = recordAsText.substring(leaderLength+1, recordAsText.indexOf("\n", leaderLength+1));
assertEquals("001 u233", firstLine);
}
@Test
public void testJavaIndexerInheritanceChild() throws Exception
{
final AbstractValueIndexer<?> valueIndexer = factory.createValueIndexer("javachildcall", "java(ChildMixin), testMethod");
final MultiValueIndexer indexer = (MultiValueIndexer) valueIndexer;
assertEquals(1, indexer.getSolrFieldNames().size());
assertEquals("javachildcall", indexer.getSolrFieldNames().iterator().next());
assertEquals("Overwritten in ChildMixin", indexer.getFieldData(null).iterator().next());
}
}