package org.odata4j.test.unit.producer.inmemory; import java.util.List; import junit.framework.Assert; import org.core4j.Enumerable; import org.core4j.Func; import org.core4j.Func1; import org.core4j.Funcs; import org.junit.Test; import org.odata4j.core.OAtomStreamEntity; import org.odata4j.core.OEntityKey; import org.odata4j.edm.EdmEntitySet; import org.odata4j.edm.EdmProperty; import org.odata4j.expression.BoolCommonExpression; import org.odata4j.expression.Expression; import org.odata4j.producer.CountResponse; import org.odata4j.producer.EntitiesResponse; import org.odata4j.producer.EntityQueryInfo; import org.odata4j.producer.InlineCount; import org.odata4j.producer.QueryInfo; import org.odata4j.producer.inmemory.InMemoryProducer; import org.odata4j.producer.resources.OptionsQueryParser; @SuppressWarnings("unused") public class InMemoryProducerTest { private final QueryInfo NULL_QUERY = new QueryInfo(InlineCount.ALLPAGES, null, null, null, null, null, null, null, null); private final EntityQueryInfo NULL_ENTITY_QUERY = new EntityQueryInfo(null, null, null, null); @Test public void inlineCountWithOneShotIterable() { InMemoryProducer producer = new InMemoryProducer("inlineCountWithOneShotIterable"); final List<String> testData = Enumerable.create("one", "two", "three").toList(); Func<Iterable<String>> getTestData = new Func<Iterable<String>>() { @Override public Iterable<String> apply() { // worst case - a one shot iterable return Enumerable.createFromIterator(Funcs.constant(testData.iterator())); } }; producer.register(String.class, String.class, "TestData", getTestData, Funcs.identity(String.class)); EntitiesResponse response = producer.getEntities(null, "TestData", null); Assert.assertEquals(3, response.getEntities().size()); Assert.assertNull(response.getInlineCount()); response = producer.getEntities(null, "TestData", NULL_QUERY); Assert.assertEquals(3, response.getEntities().size()); Assert.assertEquals(Integer.valueOf(3), response.getInlineCount()); } @Test public void testStreamEntity() { final InMemoryProducer p = new InMemoryProducer("testStreamEntity"); p.register(StreamEntity.class, "setName", new Func<Iterable<StreamEntity>>() { @Override public Iterable<StreamEntity> apply() { return Enumerable.create(new StreamEntity()); } }, "Id"); p.register(String.class, String.class, "ss", new Func<Iterable<String>>() { @Override public Iterable<String> apply() { return Enumerable.create("aaa"); } }, Funcs.identity(String.class)); final EdmEntitySet setName = p.getMetadata().findEdmEntitySet("setName"); Assert.assertNotNull(setName); Assert.assertTrue(setName.getType().getHasStream()); final EdmEntitySet ss = p.getMetadata().findEdmEntitySet("ss"); Assert.assertNotNull(ss); Assert.assertFalse(ss.getType().getHasStream()); } @Test public void testSetNameAndType() { final SimpleEntity e1 = new SimpleEntity(); String namespace = "testSetNameAndType"; InMemoryProducer p = new InMemoryProducer(namespace); p.register(SimpleEntity.class, "setName", "typeName", new Func<Iterable<SimpleEntity>>() { @Override public Iterable<SimpleEntity> apply() { return Enumerable.create(e1, new SimpleEntity()); } }, "Id"); Assert.assertEquals(2, p.getEntities(null, "setName", NULL_QUERY).getEntities().size()); Assert.assertNotNull(p.getEntity(null, "setName", OEntityKey.create(e1.getId()), NULL_ENTITY_QUERY).getEntity()); Assert.assertNotNull(p.getMetadata().findEdmEntitySet("setName")); Assert.assertNotNull(p.getMetadata().findEdmEntityType(namespace + ".typeName")); } @Test public void complexQuery() { class Entry { public String getFoo() { return "322COMMON333"; } public int getId() { return System.identityHashCode(this); } } InMemoryProducer producer = new InMemoryProducer("complexQuery"); final List<Entry> testData = Enumerable.create(new Entry(), new Entry()).toList(); Func<Iterable<Entry>> getTestData = new Func<Iterable<Entry>>() { @Override public Iterable<Entry> apply() { // worst case - a one shot iterable return Enumerable.createFromIterator(Funcs.constant(testData.iterator())); } }; producer.register(Entry.class, Integer.class, "TestData", getTestData, new Func1<Entry, Integer>() { @Override public Integer apply(Entry entry) { return entry.getId(); } }); QueryInfo qi = new QueryInfo(InlineCount.ALLPAGES, null, null, OptionsQueryParser.parseFilter("(Foo ne null) and substringof('common',tolower(Foo))"), null, null, null, null, null); EntitiesResponse data = producer.getEntities(null, "TestData", qi); Assert.assertEquals(data.getEntities().size(), 2); } @Test public void testSimpleCount() { InMemoryProducer p = new InMemoryProducer("testSimpleCount"); p.register(SimpleEntity.class, "setName", "typeName", new Func<Iterable<SimpleEntity>>() { @Override public Iterable<SimpleEntity> apply() { return Enumerable.create(new SimpleEntity(), new SimpleEntity()); } }, "Id"); CountResponse response = p.getEntitiesCount(null, "setName", null); Assert.assertEquals(2L, response.getCount()); } @Test public void testFilteredCount() { InMemoryProducer p = new InMemoryProducer("testFilteredCount"); p.register(SimpleEntity.class, "setName", "typeName", new Func<Iterable<SimpleEntity>>() { @Override public Iterable<SimpleEntity> apply() { return Enumerable.create(new SimpleEntity(1), new SimpleEntity(2)); } }, "Id"); BoolCommonExpression filter = Expression.gt(Expression.simpleProperty("Integer"), Expression.integral(1)); CountResponse response = p.getEntitiesCount(null, "setName", new QueryInfo(InlineCount.NONE, null, null, filter, null, null, null, null, null)); Assert.assertEquals(1L, response.getCount()); } @Test public void testTopCount() { InMemoryProducer p = new InMemoryProducer("testTopCount"); p.register(SimpleEntity.class, "setName", "typeName", new Func<Iterable<SimpleEntity>>() { @Override public Iterable<SimpleEntity> apply() { return Enumerable.create(new SimpleEntity(1), new SimpleEntity(2), new SimpleEntity(3), new SimpleEntity(4), new SimpleEntity(5)); } }, "Id"); CountResponse response = p.getEntitiesCount(null, "setName", new QueryInfo(InlineCount.NONE, 3, null, null, null, null, null, null, null)); Assert.assertEquals(3L, response.getCount()); } @Test public void testSkipCount() { InMemoryProducer p = new InMemoryProducer("testSkipCount"); p.register(SimpleEntity.class, "setName", "typeName", new Func<Iterable<SimpleEntity>>() { @Override public Iterable<SimpleEntity> apply() { return Enumerable.create(new SimpleEntity(1), new SimpleEntity(2), new SimpleEntity(3), new SimpleEntity(4), new SimpleEntity(5)); } }, "Id"); CountResponse response = p.getEntitiesCount(null, "setName", new QueryInfo(InlineCount.NONE, null, 3, null, null, null, null, null, null)); Assert.assertEquals(2L, response.getCount()); } @Test public void testMetadataContainerName() { InMemoryProducer p = new InMemoryProducer("testMetadataContainerName", "Foo", 20, null, null); String name = p.getMetadata().getSchemas().iterator().next().getEntityContainers().iterator().next().getName(); Assert.assertEquals("Foo", name); } @Test public void testKeysAreNotNull() { InMemoryProducer p = new InMemoryProducer("testKeysAreNotNull"); p.register(SimpleEntity.class, "QQ", new Func<Iterable<SimpleEntity>>() { @Override public Iterable<SimpleEntity> apply() { return Enumerable.create(new SimpleEntity()); } }, "Id", "String"); Enumerable<EdmProperty> properties = p.getMetadata().getEdmEntitySet("QQ").getType().getProperties(); boolean found = false; for (EdmProperty property : properties) { if (property.getName().equals("Id") || property.getName().equals("String")) { Assert.assertFalse(property.isNullable()); found = true; } } Assert.assertTrue("There should be keys", found); } private static class SimpleEntity { private final int integer; public SimpleEntity() { this(0); } public SimpleEntity(int integer) { this.integer = integer; } public String getId() { return String.valueOf(System.identityHashCode(this)); } public String getString() { return "string-" + getId(); } public boolean getBool() { return false; } public int getInteger() { return integer; } } private static class StreamEntity extends SimpleEntity implements OAtomStreamEntity { @Override public String getAtomEntityType() { return "application/zip"; } @Override public String getAtomEntitySource() { return "somewhere"; } } }