blob: 1eaa7ffde1dd71cae756e21f1aa82f42f0fce3b7 [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.uri.parser;
import java.util.Collections;
import org.apache.olingo.commons.api.edm.Edm;
import org.apache.olingo.commons.api.edm.EdmEntityContainer;
import org.apache.olingo.commons.api.edm.EdmEntitySet;
import org.apache.olingo.commons.api.edm.EdmEntityType;
import org.apache.olingo.commons.api.edm.EdmKeyPropertyRef;
import org.apache.olingo.commons.api.edm.EdmNavigationProperty;
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.OData;
import org.apache.olingo.server.api.uri.UriInfoKind;
import org.apache.olingo.server.core.uri.testutil.TestUriValidator;
import org.junit.Test;
import org.mockito.Mockito;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
/**
* Tests of the <code>Parser</code> implementation that require mocking of the EDM.
*/
public class ParserTest {
@Test
public void keyPropertyGuid() throws Exception {
final String entitySetName = "ESGuid";
final String keyPropertyName = "a";
EdmProperty keyProperty = Mockito.mock(EdmProperty.class);
Mockito.when(keyProperty.getType())
.thenReturn(OData.newInstance().createPrimitiveTypeInstance(EdmPrimitiveTypeKind.Guid));
EdmKeyPropertyRef keyPropertyRef = Mockito.mock(EdmKeyPropertyRef.class);
Mockito.when(keyPropertyRef.getName()).thenReturn(keyPropertyName);
Mockito.when(keyPropertyRef.getProperty()).thenReturn(keyProperty);
EdmEntityType entityType = Mockito.mock(EdmEntityType.class);
Mockito.when(entityType.getKeyPredicateNames()).thenReturn(Collections.singletonList(keyPropertyName));
Mockito.when(entityType.getKeyPropertyRefs()).thenReturn(Collections.singletonList(keyPropertyRef));
EdmEntitySet entitySet = Mockito.mock(EdmEntitySet.class);
Mockito.when(entitySet.getName()).thenReturn(entitySetName);
Mockito.when(entitySet.getEntityType()).thenReturn(entityType);
EdmEntityContainer container = Mockito.mock(EdmEntityContainer.class);
Mockito.when(container.getEntitySet(entitySetName)).thenReturn(entitySet);
Edm mockedEdm = Mockito.mock(Edm.class);
Mockito.when(mockedEdm.getEntityContainer()).thenReturn(container);
new TestUriValidator().setEdm(mockedEdm)
.run("ESGuid(f89dee73-af9f-4cd4-b330-db93c25ff3c7)")
.goPath()
.at(0).isEntitySet(entitySetName)
.at(0).isKeyPredicate(0, keyPropertyName, "f89dee73-af9f-4cd4-b330-db93c25ff3c7");
new TestUriValidator().setEdm(mockedEdm)
.run("ESGuid(889e3e73-af9f-4cd4-b330-db93c25ff3c7)")
.goPath()
.at(0).isEntitySet(entitySetName)
.at(0).isKeyPredicate(0, keyPropertyName, "889e3e73-af9f-4cd4-b330-db93c25ff3c7");
}
@Test
public void keyPropertyGuidStartsWithNumber() throws Exception {
final String entitySetName = "ESGuid";
final String keyPropertyName = "a";
EdmProperty keyProperty = Mockito.mock(EdmProperty.class);
Mockito.when(keyProperty.getType())
.thenReturn(OData.newInstance().createPrimitiveTypeInstance(EdmPrimitiveTypeKind.Guid));
EdmKeyPropertyRef keyPropertyRef = Mockito.mock(EdmKeyPropertyRef.class);
Mockito.when(keyPropertyRef.getName()).thenReturn(keyPropertyName);
Mockito.when(keyPropertyRef.getProperty()).thenReturn(keyProperty);
EdmEntityType entityType = Mockito.mock(EdmEntityType.class);
Mockito.when(entityType.getKeyPredicateNames()).thenReturn(Collections.singletonList(keyPropertyName));
Mockito.when(entityType.getKeyPropertyRefs()).thenReturn(Collections.singletonList(keyPropertyRef));
Mockito.when(entityType.getPropertyNames()).thenReturn(Collections.singletonList(keyPropertyName));
Mockito.when(entityType.getProperty(keyPropertyName)).thenReturn(keyProperty);
EdmEntitySet entitySet = Mockito.mock(EdmEntitySet.class);
Mockito.when(entitySet.getName()).thenReturn(entitySetName);
Mockito.when(entitySet.getEntityType()).thenReturn(entityType);
EdmEntityContainer container = Mockito.mock(EdmEntityContainer.class);
Mockito.when(container.getEntitySet(entitySetName)).thenReturn(entitySet);
Edm mockedEdm = Mockito.mock(Edm.class);
Mockito.when(mockedEdm.getEntityContainer()).thenReturn(container);
new TestUriValidator().setEdm(mockedEdm)
.run("ESGuid", "$filter=a eq 889e3e73-af9f-4cd4-b330-db93c25ff3c7");
}
@Test
public void navPropertySameNameAsEntitySet() throws Exception {
final String namespace = "namespace";
final String entityTypeName = "ETNavProp";
final FullQualifiedName nameETNavProp = new FullQualifiedName(namespace, entityTypeName);
final String entitySetName = "ESNavProp";
final String keyPropertyName = "a";
EdmProperty keyProperty = Mockito.mock(EdmProperty.class);
Mockito.when(keyProperty.getType())
.thenReturn(OData.newInstance().createPrimitiveTypeInstance(EdmPrimitiveTypeKind.Byte));
EdmKeyPropertyRef keyPropertyRef = Mockito.mock(EdmKeyPropertyRef.class);
Mockito.when(keyPropertyRef.getName()).thenReturn(keyPropertyName);
Mockito.when(keyPropertyRef.getProperty()).thenReturn(keyProperty);
EdmNavigationProperty navProperty = Mockito.mock(EdmNavigationProperty.class);
Mockito.when(navProperty.getName()).thenReturn(entitySetName);
Mockito.when(navProperty.isCollection()).thenReturn(true);
EdmEntityType entityType = Mockito.mock(EdmEntityType.class);
Mockito.when(entityType.getFullQualifiedName()).thenReturn(nameETNavProp);
Mockito.when(entityType.getKeyPredicateNames()).thenReturn(Collections.singletonList(keyPropertyName));
Mockito.when(entityType.getKeyPropertyRefs()).thenReturn(Collections.singletonList(keyPropertyRef));
Mockito.when(entityType.getNavigationProperty(entitySetName)).thenReturn(navProperty);
Mockito.when(navProperty.getType()).thenReturn(entityType);
EdmEntitySet entitySet = Mockito.mock(EdmEntitySet.class);
Mockito.when(entitySet.getName()).thenReturn(entitySetName);
Mockito.when(entitySet.getEntityType()).thenReturn(entityType);
EdmEntityContainer container = Mockito.mock(EdmEntityContainer.class);
Mockito.when(container.getEntitySet(entitySetName)).thenReturn(entitySet);
Edm mockedEdm = Mockito.mock(Edm.class);
Mockito.when(mockedEdm.getEntityContainer()).thenReturn(container);
new TestUriValidator().setEdm(mockedEdm)
.run("ESNavProp(1)/ESNavProp(2)/ESNavProp(3)/ESNavProp")
.goPath()
.at(0).isEntitySet(entitySetName)
.at(0).isKeyPredicate(0, keyPropertyName, "1")
.at(1).isNavProperty(entitySetName, nameETNavProp, false)
.at(1).isKeyPredicate(0, keyPropertyName, "2")
.at(2).isNavProperty(entitySetName, nameETNavProp, false)
.at(2).isKeyPredicate(0, keyPropertyName, "3")
.at(3).isNavProperty(entitySetName, nameETNavProp, true);
}
/**
* Test for EntitySet and NavigationProperty with same name defined in metadata.
* (related to Olingo issue OLINGO-741)
*/
@Test
public void expandNavigationPropertyWithSameNameAsEntitySet() throws Exception {
TestUriValidator testUri = new TestUriValidator();
Edm mockEdm = Mockito.mock(Edm.class);
EdmEntitySet esCategory = Mockito.mock(EdmEntitySet.class);
EdmEntitySet esProduct = Mockito.mock(EdmEntitySet.class);
EdmEntityType typeCategory = Mockito.mock(EdmEntityType.class);
EdmEntityContainer container = Mockito.mock(EdmEntityContainer.class);
EdmNavigationProperty productsNavigation = Mockito.mock(EdmNavigationProperty.class);
EdmEntityType productsType = Mockito.mock(EdmEntityType.class);
final FullQualifiedName nameProducts = new FullQualifiedName("NS", "Products");
Mockito.when(mockEdm.getEntityContainer()).thenReturn(container);
Mockito.when(typeCategory.getName()).thenReturn("Category");
Mockito.when(typeCategory.getNamespace()).thenReturn("NS");
Mockito.when(esCategory.getEntityType()).thenReturn(typeCategory);
Mockito.when(productsNavigation.getName()).thenReturn("Products");
Mockito.when(typeCategory.getNavigationProperty("Products")).thenReturn(productsNavigation);
Mockito.when(container.getEntitySet("Category")).thenReturn(esCategory);
Mockito.when(container.getEntitySet("Products")).thenReturn(esProduct);
Mockito.when(productsType.getFullQualifiedName()).thenReturn(nameProducts);
Mockito.when(productsType.getNamespace()).thenReturn("NS");
Mockito.when(productsNavigation.getType()).thenReturn(productsType);
// test and verify
testUri.setEdm(mockEdm)
.run("Category", "$expand=Products")
.isKind(UriInfoKind.resource).goExpand()
.first()
.goPath().first()
.isNavProperty("Products", nameProducts, false)
.isType(nameProducts, false);
Mockito.verifyZeroInteractions(esProduct);
}
/**
* Test for EntitySet with navigation to a not existing NavigationProperty (name)
* but with another EntitySet with this name defined in metadata.
* (related to Olingo issue OLINGO-755)
*/
@Test
public void entitySetWoNavigationButWithEntitySetWithSameName() throws Exception {
TestUriValidator testUri = new TestUriValidator();
Edm mockEdm = Mockito.mock(Edm.class);
EdmEntitySet esCategory = Mockito.mock(EdmEntitySet.class);
EdmEntitySet esProduct = Mockito.mock(EdmEntitySet.class);
EdmEntityType typeCategory = Mockito.mock(EdmEntityType.class);
FullQualifiedName fqnCategory = new FullQualifiedName("NS", "Category");
EdmEntityContainer container = Mockito.mock(EdmEntityContainer.class);
EdmNavigationProperty productsNavigation = Mockito.mock(EdmNavigationProperty.class);
EdmEntityType typeProduct = Mockito.mock(EdmEntityType.class);
FullQualifiedName fqnProduct = new FullQualifiedName("NS", "Products");
Mockito.when(mockEdm.getEntityContainer()).thenReturn(container);
Mockito.when(typeCategory.getName()).thenReturn(fqnCategory.getName());
Mockito.when(typeCategory.getNamespace()).thenReturn(fqnCategory.getNamespace());
Mockito.when(typeCategory.getFullQualifiedName()).thenReturn(fqnCategory);
Mockito.when(esCategory.getEntityType()).thenReturn(typeCategory);
Mockito.when(esProduct.getEntityType()).thenReturn(typeProduct);
Mockito.when(productsNavigation.getName()).thenReturn("Products");
Mockito.when(typeCategory.getProperty("Products")).thenReturn(productsNavigation);
Mockito.when(container.getEntitySet("Category")).thenReturn(esCategory);
Mockito.when(container.getEntitySet("Products")).thenReturn(esProduct);
Mockito.when(typeProduct.getName()).thenReturn(fqnProduct.getName());
Mockito.when(typeProduct.getNamespace()).thenReturn(fqnProduct.getNamespace());
Mockito.when(typeProduct.getFullQualifiedName()).thenReturn(fqnProduct);
Mockito.when(productsNavigation.getType()).thenReturn(typeProduct);
try {
// test and verify
testUri.setEdm(mockEdm)
.run("Products", "$expand=Category")
.isKind(UriInfoKind.resource).goExpand()
.first()
.goPath().first()
.isType(new FullQualifiedName("NS", "Category"), false);
fail("Expected exception was not thrown.");
} catch (final UriParserException e) {
assertEquals("Navigation Property 'Category' not found in type 'NS.Products'.", e.getMessage());
}
}
}