package org.infinispan.query.impl;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.hibernate.search.query.engine.spi.EntityInfo;
import org.infinispan.AdvancedCache;
import org.infinispan.query.ResultIterator;
import org.infinispan.query.backend.KeyTransformationHandler;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
/**
* @author Navin Surtani
* <p/>
* Test class for the {@link EagerIterator}
*/
@Test(groups = "functional", testName = "query.impl.EagerIteratorTest")
public class EagerIteratorTest {
List<String> keys;
List<EntityInfo> entityInfos;
Map<String, String> dummyResults;
ResultIterator<Object> iterator;
AdvancedCache<String, String> cache;
private KeyTransformationHandler keyTransformationHandler;
@BeforeMethod
public void setUp() throws Exception {
keys = new ArrayList<>();
dummyResults = new HashMap<>();
entityInfos = new ArrayList<>();
keyTransformationHandler = new KeyTransformationHandler();
for (int i = 1; i <= 10; i++) {
String key = "key" + i;
keys.add(key);
entityInfos.add(new MockEntityInfo(keyTransformationHandler.keyToString(key)));
dummyResults.put(key, "Result number " + i);
}
// create the instance of the iterator.
cache = mock(AdvancedCache.class);
when(cache.get(any())).thenAnswer(invocation -> {
String k = invocation.getArguments()[0].toString();
return dummyResults.get(k);
});
iterator = new EagerIterator<>(entityInfos, new EntityLoader(cache, keyTransformationHandler), getFetchSize());
}
protected int getFetchSize() {
return 1;
}
@AfterMethod
public void tearDown() {
iterator.close();
keys = null;
dummyResults = null;
iterator = null;
}
protected String resultAt(int index) {
return dummyResults.get(keys.get(index));
}
public void testNextAndHasNext() {
for (int i = 0; i < keys.size(); i++) {
Object expectedValue = resultAt(i);
assert iterator.hasNext(); // should have next as long as we are less than the number of elements.
assert expectedValue == iterator.next(); // tests next()
}
assert !iterator.hasNext(); // this should now NOT be true.
}
private static class MockEntityInfo implements EntityInfo {
private final String key;
public MockEntityInfo(String key) {
this.key = key;
}
@Override
public Class<?> getClazz() {
return null;
}
@Override
public Serializable getId() {
return key;
}
@Override
public String getIdName() {
return null;
}
@Override
public Object[] getProjection() {
return new Object[0];
}
@Override
public Object getEntityInstance() {
return null;
}
@Override
public void populateWithEntityInstance(Object entity) {
}
}
}