blob: 42af891fc742aec2cb470d9e65d80babc67f75a4 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.olingo.server.core.edm.provider;
import org.apache.olingo.commons.api.edm.EdmComplexType;
import org.apache.olingo.commons.api.edm.EdmElement;
import org.apache.olingo.commons.api.edm.EdmEntityType;
import org.apache.olingo.commons.api.edm.EdmException;
import org.apache.olingo.commons.api.edm.EdmKeyPropertyRef;
import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeKind;
import org.apache.olingo.commons.api.edm.EdmProperty;
import org.apache.olingo.commons.api.edm.FullQualifiedName;
import org.apache.olingo.server.api.edm.provider.ComplexType;
import org.apache.olingo.server.api.edm.provider.EdmProvider;
import org.apache.olingo.server.api.edm.provider.EntityType;
import org.apache.olingo.server.api.edm.provider.NavigationProperty;
import org.apache.olingo.server.api.edm.provider.Property;
import org.apache.olingo.server.api.edm.provider.PropertyRef;
import org.junit.Before;
import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
public class EdmEntityTypeImplTest {
private EdmEntityType baseType;
private EdmEntityType typeWithBaseType;
private EdmEntityType typeWithComplexKey;
@Before
public void setupTypes() throws Exception {
EdmProvider provider = mock(EdmProvider.class);
EdmProviderImpl edm = new EdmProviderImpl(provider);
FullQualifiedName baseName = new FullQualifiedName("namespace", "BaseTypeName");
EntityType baseType = new EntityType();
baseType.setName(baseName.getName());
List<Property> properties = new ArrayList<Property>();
properties.add(new Property().setName("Id").setType(EdmPrimitiveTypeKind.String.getFullQualifiedName()));
properties.add(new Property().setName("Name").setType(EdmPrimitiveTypeKind.String.getFullQualifiedName()));
baseType.setProperties(properties);
List<PropertyRef> key = new ArrayList<PropertyRef>();
key.add(new PropertyRef().setPropertyName("Id"));
baseType.setKey(key);
List<NavigationProperty> navigationProperties = new ArrayList<NavigationProperty>();
navigationProperties.add(new NavigationProperty().setName("nav1"));
baseType.setNavigationProperties(navigationProperties);
when(provider.getEntityType(baseName)).thenReturn(baseType);
this.baseType = EdmEntityTypeImpl.getInstance(edm, baseName, baseType);
FullQualifiedName typeName = new FullQualifiedName("namespace", "typeName");
EntityType type = new EntityType();
type.setName(typeName.getName());
type.setBaseType(baseName);
List<Property> typeProperties = new ArrayList<Property>();
typeProperties.add(new Property().setName("address").setType(EdmPrimitiveTypeKind.String.getFullQualifiedName()));
typeProperties.add(new Property().setName("email").setType(EdmPrimitiveTypeKind.String.getFullQualifiedName()));
type.setProperties(typeProperties);
List<NavigationProperty> typeNavigationProperties = new ArrayList<NavigationProperty>();
typeNavigationProperties.add(new NavigationProperty().setName("nav2"));
type.setNavigationProperties(typeNavigationProperties);
when(provider.getEntityType(typeName)).thenReturn(type);
typeWithBaseType = EdmEntityTypeImpl.getInstance(edm, typeName, type);
FullQualifiedName typeWithComplexKeyName = new FullQualifiedName("namespace", "typeName");
EntityType typeWithComplexKeyProvider = new EntityType();
typeWithComplexKeyProvider.setName(typeWithComplexKeyName.getName());
List<Property> typeWithComplexKeyProperties = new ArrayList<Property>();
typeWithComplexKeyProperties.add(new Property().setName("Id").setType(
EdmPrimitiveTypeKind.String.getFullQualifiedName()));
List<Property> complexTypeProperties = new ArrayList<Property>();
complexTypeProperties.add(new Property().setName("ComplexPropName").setType(
EdmPrimitiveTypeKind.String.getFullQualifiedName()));
FullQualifiedName complexTypeName = new FullQualifiedName("namespace", "complexTypeName");
when(provider.getComplexType(complexTypeName)).thenReturn(
new ComplexType().setName("complexTypeName").setProperties(complexTypeProperties));
typeWithComplexKeyProperties.add(new Property().setName("Comp").setType(complexTypeName));
typeWithComplexKeyProvider.setProperties(typeWithComplexKeyProperties);
List<PropertyRef> keyForTypeWithComplexKey = new ArrayList<PropertyRef>();
keyForTypeWithComplexKey.add(new PropertyRef().setPropertyName("Id"));
keyForTypeWithComplexKey.add(new PropertyRef().setPropertyName("ComplexPropName").setAlias("alias").setPath(
"Comp/ComplexPropName"));
typeWithComplexKeyProvider.setKey(keyForTypeWithComplexKey);
when(provider.getEntityType(typeWithComplexKeyName)).thenReturn(typeWithComplexKeyProvider);
typeWithComplexKey = EdmEntityTypeImpl.getInstance(edm, typeWithComplexKeyName, typeWithComplexKeyProvider);
}
@Test
public void testAbstractBaseTypeWithoutKey() throws Exception {
EdmProvider provider = mock(EdmProvider.class);
EdmProviderImpl edm = new EdmProviderImpl(provider);
FullQualifiedName baseName = new FullQualifiedName("namespace", "BaseTypeName");
EntityType baseType = new EntityType();
baseType.setName(baseName.getName());
List<Property> properties = new ArrayList<Property>();
properties.add(new Property().setName("Id").setType(EdmPrimitiveTypeKind.String.getFullQualifiedName()));
properties.add(new Property().setName("Name").setType(EdmPrimitiveTypeKind.String.getFullQualifiedName()));
baseType.setProperties(properties);
List<NavigationProperty> navigationProperties = new ArrayList<NavigationProperty>();
navigationProperties.add(new NavigationProperty().setName("nav1"));
baseType.setNavigationProperties(navigationProperties);
when(provider.getEntityType(baseName)).thenReturn(baseType);
baseType.setAbstract(true);
EdmEntityType edmAbstarctBaseType = EdmEntityTypeImpl.getInstance(edm, baseName, baseType);
assertEquals(2, edmAbstarctBaseType.getPropertyNames().size());
assertEquals("Id", edmAbstarctBaseType.getPropertyNames().get(0));
assertEquals("Name", edmAbstarctBaseType.getPropertyNames().get(1));
FullQualifiedName typeName = new FullQualifiedName("namespace", "typeName");
EntityType type = new EntityType();
type.setName(typeName.getName());
type.setBaseType(baseName);
List<Property> typeProperties = new ArrayList<Property>();
typeProperties.add(new Property().setName("address").setType(EdmPrimitiveTypeKind.String.getFullQualifiedName()));
typeProperties.add(new Property().setName("email").setType(EdmPrimitiveTypeKind.String.getFullQualifiedName()));
type.setProperties(typeProperties);
List<PropertyRef> key = new ArrayList<PropertyRef>();
key.add(new PropertyRef().setPropertyName("email"));
type.setKey(key);
List<NavigationProperty> typeNavigationProperties = new ArrayList<NavigationProperty>();
typeNavigationProperties.add(new NavigationProperty().setName("nav2"));
type.setNavigationProperties(typeNavigationProperties);
when(provider.getEntityType(typeName)).thenReturn(type);
EdmEntityType edmType = EdmEntityTypeImpl.getInstance(edm, typeName, type);
assertNotNull(edmType.getBaseType());
assertEquals(2, edmAbstarctBaseType.getPropertyNames().size());
assertEquals(1, edmType.getKeyPropertyRefs().size());
assertEquals("email", edmType.getKeyPredicateNames().get(0));
assertEquals(4, edmType.getPropertyNames().size());
assertEquals("Id", edmType.getPropertyNames().get(0));
assertEquals("Name", edmType.getPropertyNames().get(1));
assertEquals("address", edmType.getPropertyNames().get(2));
assertEquals("email", edmType.getPropertyNames().get(3));
assertEquals(2, edmType.getNavigationPropertyNames().size());
assertEquals("nav1", edmType.getNavigationPropertyNames().get(0));
assertEquals("nav2", edmType.getNavigationPropertyNames().get(1));
}
@Test
public void testAbstractBaseTypeWithtKey() throws Exception {
EdmProvider provider = mock(EdmProvider.class);
EdmProviderImpl edm = new EdmProviderImpl(provider);
FullQualifiedName baseName = new FullQualifiedName("namespace", "BaseTypeName");
EntityType baseType = new EntityType();
baseType.setName(baseName.getName());
List<Property> properties = new ArrayList<Property>();
properties.add(new Property().setName("Id").setType(EdmPrimitiveTypeKind.String.getFullQualifiedName()));
properties.add(new Property().setName("Name").setType(EdmPrimitiveTypeKind.String.getFullQualifiedName()));
baseType.setProperties(properties);
List<PropertyRef> key = new ArrayList<PropertyRef>();
key.add(new PropertyRef().setPropertyName("Id"));
baseType.setKey(key);
List<NavigationProperty> navigationProperties = new ArrayList<NavigationProperty>();
navigationProperties.add(new NavigationProperty().setName("nav1"));
baseType.setNavigationProperties(navigationProperties);
when(provider.getEntityType(baseName)).thenReturn(baseType);
baseType.setAbstract(true);
EdmEntityType edmAbstarctBaseType = EdmEntityTypeImpl.getInstance(edm, baseName, baseType);
FullQualifiedName typeName = new FullQualifiedName("namespace", "typeName");
EntityType type = new EntityType();
type.setName(typeName.getName());
type.setBaseType(baseName);
List<Property> typeProperties = new ArrayList<Property>();
typeProperties.add(new Property().setName("address").setType(EdmPrimitiveTypeKind.String.getFullQualifiedName()));
typeProperties.add(new Property().setName("email").setType(EdmPrimitiveTypeKind.String.getFullQualifiedName()));
type.setProperties(typeProperties);
List<NavigationProperty> typeNavigationProperties = new ArrayList<NavigationProperty>();
typeNavigationProperties.add(new NavigationProperty().setName("nav2"));
type.setNavigationProperties(typeNavigationProperties);
when(provider.getEntityType(typeName)).thenReturn(type);
EdmEntityType edmType = EdmEntityTypeImpl.getInstance(edm, typeName, type);
assertNotNull(edmType.getBaseType());
assertEquals(2, edmAbstarctBaseType.getPropertyNames().size());
assertEquals(1, edmType.getKeyPropertyRefs().size());
assertEquals("Id", edmType.getKeyPredicateNames().get(0));
assertEquals(4, edmType.getPropertyNames().size());
assertEquals("Id", edmType.getPropertyNames().get(0));
assertEquals("Name", edmType.getPropertyNames().get(1));
assertEquals("address", edmType.getPropertyNames().get(2));
assertEquals("email", edmType.getPropertyNames().get(3));
assertEquals(2, edmType.getNavigationPropertyNames().size());
assertEquals("nav1", edmType.getNavigationPropertyNames().get(0));
assertEquals("nav2", edmType.getNavigationPropertyNames().get(1));
}
@Test
public void hasStream() {
assertFalse(typeWithBaseType.hasStream());
}
@Test
public void complexKeyWithAlias() {
List<String> keyPredicateNames = typeWithComplexKey.getKeyPredicateNames();
assertEquals(2, keyPredicateNames.size());
assertEquals("Id", keyPredicateNames.get(0));
assertEquals("alias", keyPredicateNames.get(1));
EdmKeyPropertyRef keyPropertyRef = typeWithComplexKey.getKeyPropertyRef("Id");
assertNotNull(keyPropertyRef);
assertEquals("Id", keyPropertyRef.getKeyPropertyName());
assertNull(keyPropertyRef.getAlias());
EdmProperty keyProperty = keyPropertyRef.getProperty();
assertNotNull(keyProperty);
assertEquals(typeWithComplexKey.getProperty("Id"), keyProperty);
keyPropertyRef = typeWithComplexKey.getKeyPropertyRef("alias");
assertNotNull(keyPropertyRef);
assertEquals("ComplexPropName", keyPropertyRef.getKeyPropertyName());
assertEquals("alias", keyPropertyRef.getAlias());
assertEquals("Comp/ComplexPropName", keyPropertyRef.getPath());
keyProperty = keyPropertyRef.getProperty();
assertNotNull(keyProperty);
EdmElement complexProperty = typeWithComplexKey.getProperty("Comp");
EdmComplexType complexType = (EdmComplexType) complexProperty.getType();
assertNotNull(complexType);
assertEquals(complexType.getProperty("ComplexPropName"), keyProperty);
}
@Test
public void keyBehaviour() {
List<String> keyPredicateNames = baseType.getKeyPredicateNames();
assertEquals(1, keyPredicateNames.size());
assertEquals("Id", keyPredicateNames.get(0));
EdmKeyPropertyRef keyPropertyRef = baseType.getKeyPropertyRef("Id");
assertNotNull(keyPropertyRef);
assertEquals("Id", keyPropertyRef.getKeyPropertyName());
assertNull(keyPropertyRef.getAlias());
EdmProperty keyProperty = keyPropertyRef.getProperty();
assertNotNull(keyProperty);
assertEquals(baseType.getProperty("Id"), keyProperty);
List<EdmKeyPropertyRef> keyPropertyRefs = baseType.getKeyPropertyRefs();
assertNotNull(keyPropertyRefs);
assertEquals(1, keyPropertyRefs.size());
assertEquals("Id", keyPropertyRefs.get(0).getKeyPropertyName());
}
@Test
public void keyBehaviourWithBasetype() {
List<String> keyPredicateNames = typeWithBaseType.getKeyPredicateNames();
assertEquals(1, keyPredicateNames.size());
assertEquals("Id", keyPredicateNames.get(0));
EdmKeyPropertyRef keyPropertyRef = typeWithBaseType.getKeyPropertyRef("Id");
assertNotNull(keyPropertyRef);
assertEquals("Id", keyPropertyRef.getKeyPropertyName());
assertNull(keyPropertyRef.getAlias());
List<EdmKeyPropertyRef> keyPropertyRefs = typeWithBaseType.getKeyPropertyRefs();
assertNotNull(keyPropertyRefs);
assertEquals(1, keyPropertyRefs.size());
assertEquals("Id", keyPropertyRefs.get(0).getKeyPropertyName());
assertTrue(keyPropertyRefs == typeWithBaseType.getKeyPropertyRefs());
}
@Test
public void getBaseType() {
assertNull(baseType.getBaseType());
assertNotNull(typeWithBaseType.getBaseType());
}
@Test
public void propertiesBehaviour() {
List<String> propertyNames = baseType.getPropertyNames();
assertEquals(2, propertyNames.size());
assertEquals("Id", baseType.getProperty("Id").getName());
assertEquals("Name", baseType.getProperty("Name").getName());
}
@Test
public void propertiesBehaviourWithBaseType() {
List<String> propertyNames = typeWithBaseType.getPropertyNames();
assertEquals(4, propertyNames.size());
assertEquals("Id", typeWithBaseType.getProperty("Id").getName());
assertEquals("Name", typeWithBaseType.getProperty("Name").getName());
assertEquals("address", typeWithBaseType.getProperty("address").getName());
assertEquals("email", typeWithBaseType.getProperty("email").getName());
}
@Test
public void navigationPropertiesBehaviour() {
List<String> navigationPropertyNames = baseType.getNavigationPropertyNames();
assertEquals(1, navigationPropertyNames.size());
assertEquals("nav1", baseType.getProperty("nav1").getName());
}
@Test
public void navigationPropertiesBehaviourWithBaseType() {
List<String> navigationPropertyNames = typeWithBaseType.getNavigationPropertyNames();
assertEquals(2, navigationPropertyNames.size());
assertEquals("nav1", typeWithBaseType.getProperty("nav1").getName());
assertEquals("nav2", typeWithBaseType.getProperty("nav2").getName());
}
@Test
public void propertyCaching() {
EdmElement property = typeWithBaseType.getProperty("Id");
assertTrue(property == typeWithBaseType.getProperty("Id"));
property = typeWithBaseType.getProperty("address");
assertTrue(property == typeWithBaseType.getProperty("address"));
property = typeWithBaseType.getProperty("nav1");
assertTrue(property == typeWithBaseType.getProperty("nav1"));
property = typeWithBaseType.getProperty("nav2");
assertTrue(property == typeWithBaseType.getProperty("nav2"));
}
@Test
public void abstractTypeDoesNotNeedKey() {
EdmProviderImpl edm = mock(EdmProviderImpl.class);
EntityType entityType = new EntityType().setName("n").setAbstract(true);
EdmEntityTypeImpl.getInstance(edm, new FullQualifiedName("n", "n"), entityType);
}
@Test(expected = EdmException.class)
public void invalidBaseType() {
EdmProviderImpl edm = mock(EdmProviderImpl.class);
EntityType entityType = new EntityType().setName("n").setBaseType(new FullQualifiedName("wrong", "wrong"));
EdmEntityTypeImpl instance = EdmEntityTypeImpl.getInstance(edm, new FullQualifiedName("n", "n"), entityType);
instance.getBaseType();
}
@Test
public void abstractTypeWithAbstractBaseTypeDoesNotNeedKey() throws Exception {
EdmProvider provider = mock(EdmProvider.class);
EdmProviderImpl edm = new EdmProviderImpl(provider);
FullQualifiedName baseName = new FullQualifiedName("n", "base");
when(provider.getEntityType(baseName)).thenReturn(new EntityType().setName("base").setAbstract(true));
EntityType entityType = new EntityType().setName("n").setAbstract(true).setBaseType(baseName);
EdmEntityTypeImpl.getInstance(edm, new FullQualifiedName("n", "n"), entityType);
}
}