blob: 423cd018dfd5f1d15c8cae8494d3d0ede919263e [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.odata2.jpa.processor.core.access.data;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.fail;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.List;
import org.apache.olingo.odata2.api.ODataService;
import org.apache.olingo.odata2.api.edm.Edm;
import org.apache.olingo.odata2.api.edm.EdmEntitySet;
import org.apache.olingo.odata2.api.edm.EdmEntityType;
import org.apache.olingo.odata2.api.edm.EdmException;
import org.apache.olingo.odata2.api.edm.EdmMapping;
import org.apache.olingo.odata2.api.edm.EdmMultiplicity;
import org.apache.olingo.odata2.api.edm.EdmNavigationProperty;
import org.apache.olingo.odata2.api.edm.provider.EntityType;
import org.apache.olingo.odata2.api.edm.provider.Mapping;
import org.apache.olingo.odata2.api.ep.EntityProvider;
import org.apache.olingo.odata2.api.ep.EntityProviderException;
import org.apache.olingo.odata2.api.exception.ODataException;
import org.apache.olingo.odata2.api.uri.KeyPredicate;
import org.apache.olingo.odata2.api.uri.NavigationSegment;
import org.apache.olingo.odata2.api.uri.PathSegment;
import org.apache.olingo.odata2.api.uri.UriInfo;
import org.apache.olingo.odata2.api.uri.info.DeleteUriInfo;
import org.apache.olingo.odata2.api.uri.info.GetEntitySetUriInfo;
import org.apache.olingo.odata2.api.uri.info.GetEntityUriInfo;
import org.apache.olingo.odata2.api.uri.info.PostUriInfo;
import org.apache.olingo.odata2.core.edm.provider.EdmEntityTypeImplProv;
import org.apache.olingo.odata2.jpa.processor.api.ODataJPAContext;
import org.apache.olingo.odata2.jpa.processor.api.exception.ODataJPAModelException;
import org.apache.olingo.odata2.jpa.processor.api.exception.ODataJPARuntimeException;
import org.apache.olingo.odata2.jpa.processor.api.model.JPAEdmMapping;
import org.apache.olingo.odata2.jpa.processor.core.common.ODataJPATestConstants;
import org.apache.olingo.odata2.jpa.processor.core.mock.JPAProcessorMockAbstract;
import org.apache.olingo.odata2.jpa.processor.core.mock.ODataContextMock;
import org.apache.olingo.odata2.jpa.processor.core.mock.ODataJPAContextMock;
import org.apache.olingo.odata2.jpa.processor.core.mock.PathInfoMock;
import org.apache.olingo.odata2.jpa.processor.core.mock.PathSegmentMock;
import org.apache.olingo.odata2.jpa.processor.core.mock.data.Note;
import org.apache.olingo.odata2.jpa.processor.core.mock.data.SalesOrderHeader;
import org.apache.olingo.odata2.jpa.processor.core.model.JPAEdmMappingImpl;
import org.easymock.EasyMock;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
public class JPALinkTest {
private static Edm edm;
private static SalesOrderHeader header;
private static Note note;
@SuppressWarnings("unused")
private static short testCase = 0;
private InputStream requestPayload = null;
@BeforeClass
public static void loadEdm() throws EntityProviderException {
edm = EntityProvider.readMetadata(JPALinkTest.class.getClassLoader().getResourceAsStream(
"metadata.xml"), false);
}
@Before
public void setUp() {
header = null;
note = null;
requestPayload = JPALinkTest.class.getClassLoader().getResourceAsStream(
"SalesOrderNotesLink.json");
}
@Test
public void testCreateLink() {
testCase = 0;
try {
ODataJPAContext context = mockODataJPAContext(false);
JPALink link = new JPALink(context);
Field processor = JPALink.class.
getDeclaredField("jpaProcessor");
processor.setAccessible(true);
processor.set(link, new JPAProcessorMock());
link.create(mockPostURIInfo(false), requestPayload, "application/json", "application/json");
assertEquals(2, header.getNotesDetails().size());
} catch (ODataException e) {
fail(ODataJPATestConstants.EXCEPTION_MSG_PART_1 + e.getMessage() + ODataJPATestConstants.EXCEPTION_MSG_PART_2);
} catch (NoSuchFieldException e) {
fail(ODataJPATestConstants.EXCEPTION_MSG_PART_1 + e.getMessage() + ODataJPATestConstants.EXCEPTION_MSG_PART_2);
} catch (SecurityException e) {
fail(ODataJPATestConstants.EXCEPTION_MSG_PART_1 + e.getMessage() + ODataJPATestConstants.EXCEPTION_MSG_PART_2);
} catch (IllegalArgumentException e) {
fail(ODataJPATestConstants.EXCEPTION_MSG_PART_1 + e.getMessage() + ODataJPATestConstants.EXCEPTION_MSG_PART_2);
} catch (IllegalAccessException e) {
fail(ODataJPATestConstants.EXCEPTION_MSG_PART_1 + e.getMessage() + ODataJPATestConstants.EXCEPTION_MSG_PART_2);
} catch (NoSuchMethodException e) {
fail(ODataJPATestConstants.EXCEPTION_MSG_PART_1 + e.getMessage() + ODataJPATestConstants.EXCEPTION_MSG_PART_2);
}
}
@Test
public void testDeleteLink() {
testCase = 1;
try {
ODataJPAContext context = mockODataJPAContext(false);
JPALink link = new JPALink(context);
Field processor = JPALink.class.
getDeclaredField("jpaProcessor");
processor.setAccessible(true);
processor.set(link, new JPAProcessorMock());
link.delete(mockDeleteURIInfo(false));
assertNull(header.getNotesDetails());
} catch (ODataException e) {
fail(ODataJPATestConstants.EXCEPTION_MSG_PART_1 + e.getMessage() + ODataJPATestConstants.EXCEPTION_MSG_PART_2);
} catch (NoSuchFieldException e) {
fail(ODataJPATestConstants.EXCEPTION_MSG_PART_1 + e.getMessage() + ODataJPATestConstants.EXCEPTION_MSG_PART_2);
} catch (SecurityException e) {
fail(ODataJPATestConstants.EXCEPTION_MSG_PART_1 + e.getMessage() + ODataJPATestConstants.EXCEPTION_MSG_PART_2);
} catch (IllegalArgumentException e) {
fail(ODataJPATestConstants.EXCEPTION_MSG_PART_1 + e.getMessage() + ODataJPATestConstants.EXCEPTION_MSG_PART_2);
} catch (IllegalAccessException e) {
fail(ODataJPATestConstants.EXCEPTION_MSG_PART_1 + e.getMessage() + ODataJPATestConstants.EXCEPTION_MSG_PART_2);
} catch (NoSuchMethodException e) {
fail(ODataJPATestConstants.EXCEPTION_MSG_PART_1 + e.getMessage() + ODataJPATestConstants.EXCEPTION_MSG_PART_2);
}
}
@Test
public void testDeleteLinkReverse() {
testCase = 1;
try {
ODataJPAContext context = mockODataJPAContext(true);
JPALink link = new JPALink(context);
Field processor = JPALink.class.
getDeclaredField("jpaProcessor");
processor.setAccessible(true);
processor.set(link, new JPAProcessorMock());
link.delete(mockDeleteURIInfo(true));
assertNull(note.getSalesOrderHeader());
} catch (ODataException e) {
fail(ODataJPATestConstants.EXCEPTION_MSG_PART_1 + e.getMessage() + ODataJPATestConstants.EXCEPTION_MSG_PART_2);
} catch (NoSuchFieldException e) {
fail(ODataJPATestConstants.EXCEPTION_MSG_PART_1 + e.getMessage() + ODataJPATestConstants.EXCEPTION_MSG_PART_2);
} catch (SecurityException e) {
fail(ODataJPATestConstants.EXCEPTION_MSG_PART_1 + e.getMessage() + ODataJPATestConstants.EXCEPTION_MSG_PART_2);
} catch (IllegalArgumentException e) {
fail(ODataJPATestConstants.EXCEPTION_MSG_PART_1 + e.getMessage() + ODataJPATestConstants.EXCEPTION_MSG_PART_2);
} catch (IllegalAccessException e) {
fail(ODataJPATestConstants.EXCEPTION_MSG_PART_1 + e.getMessage() + ODataJPATestConstants.EXCEPTION_MSG_PART_2);
} catch (NoSuchMethodException e) {
fail(ODataJPATestConstants.EXCEPTION_MSG_PART_1 + e.getMessage() + ODataJPATestConstants.EXCEPTION_MSG_PART_2);
}
}
private ODataJPAContext mockODataJPAContext(boolean isReverse) {
String path1 = null;
String path2 = null;
String path3 = null;
if (isReverse) {
path1 = "Notes('2')";
path2 = "$links";
path3 = "salesOrderHeader(1L)";
} else {
path1 = "SalesOrders(1L)";
path2 = "$links";
path3 = "NotesDetails('2')";
}
try {
List<PathSegment> pathSegments = new ArrayList<PathSegment>();
PathSegmentMock pathSegmentMock = new PathSegmentMock();
pathSegmentMock.setPath(path1);
pathSegments.add(pathSegmentMock);
pathSegmentMock = new PathSegmentMock();
pathSegmentMock.setPath(path2);
pathSegments.add(pathSegmentMock);
pathSegmentMock = new PathSegmentMock();
pathSegmentMock.setPath(path3);
pathSegments.add(pathSegmentMock);
PathInfoMock pathInfoMock = new PathInfoMock();
pathInfoMock.setServiceRootURI("http://localhost/so.svc");
pathInfoMock.setPathSegments(pathSegments);
ODataService service = EasyMock.createMock(ODataService.class);
EasyMock.expect(service.getEntityDataModel()).andReturn(edm).anyTimes();
EasyMock.replay(service);
ODataContextMock odataContextMock = new ODataContextMock();
odataContextMock.setPathInfo(pathInfoMock.mock());
odataContextMock.setODataService(service);
ODataJPAContext context = ODataJPAContextMock.mockODataJPAContext(odataContextMock.mock());
return context;
} catch (URISyntaxException e) {
fail(ODataJPATestConstants.EXCEPTION_MSG_PART_1 + e.getMessage() + ODataJPATestConstants.EXCEPTION_MSG_PART_2);
} catch (ODataException e) {
fail(ODataJPATestConstants.EXCEPTION_MSG_PART_1 + e.getMessage() + ODataJPATestConstants.EXCEPTION_MSG_PART_2);
}
return null;
}
private List<NavigationSegment> mockNavigationSegments(boolean isReverse) throws EdmException, NoSuchFieldException,
SecurityException, IllegalArgumentException, IllegalAccessException {
Class<?> type = null;
String entityTypeName = null;
String keyLiteral = null;
EdmMultiplicity multiplicity = null;
String navPropertyName = null;
String toRole = null;
String associationName = null;
if (isReverse) {
type = SalesOrderHeader.class;
entityTypeName = "SalesOrder";
keyLiteral = "1";
multiplicity = EdmMultiplicity.ONE;
navPropertyName = "salesOrderHeader";
toRole = "SalesOrder";
associationName = "Note_SalesOrder";
} else {
type = List.class;
entityTypeName = "Note";
keyLiteral = "2";
multiplicity = EdmMultiplicity.MANY;
navPropertyName = "NotesDetails";
toRole = "Note";
associationName = "Note_SalesOrder";
}
JPAEdmMapping mapping = new JPAEdmMappingImpl();
mapping.setJPAType(type);
KeyPredicate keyPredicate = EasyMock.createMock(KeyPredicate.class);
EasyMock.expect(keyPredicate.getProperty()).andReturn(
edm.getEntityType("SalesOrderProcessing", entityTypeName).getKeyProperties().get(0)).anyTimes();
EasyMock.expect(keyPredicate.getLiteral()).andReturn(keyLiteral);
EasyMock.replay(keyPredicate);
List<KeyPredicate> keyPredicates = new ArrayList<KeyPredicate>();
keyPredicates.add(keyPredicate);
NavigationSegment navigationSegment = EasyMock.createMock(NavigationSegment.class);
EasyMock.expect(navigationSegment.getKeyPredicates()).andReturn(keyPredicates);
EdmNavigationProperty navProperty = EasyMock.createMock(EdmNavigationProperty.class);
EasyMock.expect(navProperty.getMapping()).andReturn((EdmMapping) mapping).anyTimes();
EasyMock.expect(navProperty.getMultiplicity()).andReturn(multiplicity).anyTimes();
EasyMock.expect(navProperty.getName()).andReturn(navPropertyName).anyTimes();
EasyMock.expect(navProperty.getToRole()).andReturn(toRole).anyTimes();
EasyMock.expect(navProperty.getRelationship()).andReturn(
edm.getAssociation("SalesOrderProcessing", associationName));
EasyMock.replay(navProperty);
EdmEntityType edmEntityType =
edm.getAssociation("SalesOrderProcessing", associationName).getEnd(toRole).getEntityType();
Field field = EdmEntityTypeImplProv.class.getDeclaredField("entityType");
field.setAccessible(true);
EntityType entityType = (EntityType) field.get(edmEntityType);
entityType.setMapping((Mapping) mapping);
EasyMock.expect(navigationSegment.getNavigationProperty()).andReturn(navProperty).anyTimes();
EasyMock.replay(navigationSegment);
List<NavigationSegment> navigationSegments = new ArrayList<NavigationSegment>();
navigationSegments.add(navigationSegment);
return navigationSegments;
}
private PostUriInfo mockPostURIInfo(boolean isReverse) throws ODataException, NoSuchMethodException,
SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException {
PostUriInfo uriInfo = EasyMock.createMock(UriInfo.class);
for (EdmEntitySet edmEntitySet : edm.getEntitySets()) {
if (edmEntitySet.getName().equals("Notes")) {
EasyMock.expect(uriInfo.getTargetEntitySet()).andReturn(edmEntitySet).anyTimes();
break;
}
}
EasyMock.expect(((UriInfo) uriInfo).isLinks()).andReturn(true);
EasyMock.expect(uriInfo.getNavigationSegments()).andReturn(mockNavigationSegments(isReverse)).anyTimes();
EasyMock.replay(uriInfo);
return uriInfo;
}
private DeleteUriInfo mockDeleteURIInfo(boolean isReverse) throws ODataException, NoSuchMethodException,
SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException {
DeleteUriInfo uriInfo = EasyMock.createMock(DeleteUriInfo.class);
EasyMock.expect(uriInfo.getNavigationSegments()).andReturn(mockNavigationSegments(isReverse)).anyTimes();
EasyMock.replay(uriInfo);
return uriInfo;
}
private static class JPAProcessorMock extends JPAProcessorMockAbstract {
@Override
public <T> Object process(GetEntityUriInfo uriParserResultView) throws ODataJPAModelException,
ODataJPARuntimeException {
try {
if (uriParserResultView.getTargetEntitySet().getName().equals("Notes")) {
assertEquals("id", uriParserResultView.getKeyPredicates().get(0).getProperty().getName());
header = new SalesOrderHeader();
note = new Note();
note.setSalesOrderHeader(header);
return note;
} else if (uriParserResultView.getTargetEntitySet().getName().equals("SalesOrders")) {
assertEquals("ID", uriParserResultView.getKeyPredicates().get(0).getProperty().getName());
header = new SalesOrderHeader();
Note note = new Note();
List<Note> notes = new ArrayList<Note>();
notes.add(note);
header.setNotesDetails(notes);
return header;
}
} catch (EdmException e) {
fail(ODataJPATestConstants.EXCEPTION_MSG_PART_1 + e.getMessage() + ODataJPATestConstants.EXCEPTION_MSG_PART_2);
}
return null;
}
@Override
public List<Object> process(GetEntitySetUriInfo uriParserResultView) throws ODataJPAModelException,
ODataJPARuntimeException {
return null;
}
}
}