blob: 6504f2e6c09a97c5dfaffae5a73a56fca4d2d26d [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.core.ep.producer;
import static org.custommonkey.xmlunit.XMLAssert.assertXpathExists;
import static org.custommonkey.xmlunit.XMLAssert.assertXpathNotExists;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.olingo.odata2.api.ODataCallback;
import org.apache.olingo.odata2.api.edm.*;
import org.apache.olingo.odata2.api.ep.EntityProviderException;
import org.apache.olingo.odata2.api.ep.EntityProviderWriteProperties;
import org.apache.olingo.odata2.api.ep.callback.OnWriteEntryContent;
import org.apache.olingo.odata2.api.ep.callback.OnWriteFeedContent;
import org.apache.olingo.odata2.api.ep.callback.WriteEntryCallbackContext;
import org.apache.olingo.odata2.api.ep.callback.WriteEntryCallbackResult;
import org.apache.olingo.odata2.api.ep.callback.WriteFeedCallbackContext;
import org.apache.olingo.odata2.api.ep.callback.WriteFeedCallbackResult;
import org.apache.olingo.odata2.api.exception.ODataApplicationException;
import org.apache.olingo.odata2.api.exception.ODataException;
import org.apache.olingo.odata2.api.processor.ODataResponse;
import org.apache.olingo.odata2.api.rt.RuntimeDelegate;
import org.apache.olingo.odata2.api.uri.ExpandSelectTreeNode;
import org.apache.olingo.odata2.api.uri.PathSegment;
import org.apache.olingo.odata2.api.uri.UriInfo;
import org.apache.olingo.odata2.core.ODataPathSegmentImpl;
import org.apache.olingo.odata2.core.ep.AbstractProviderTest;
import org.apache.olingo.odata2.core.ep.AtomEntityProvider;
import org.apache.olingo.odata2.core.exception.ODataRuntimeException;
import org.apache.olingo.odata2.core.uri.ExpandSelectTreeCreator;
import org.apache.olingo.odata2.core.uri.UriParserImpl;
import org.apache.olingo.odata2.testutil.helper.StringHelper;
import org.apache.olingo.odata2.testutil.mock.EdmTestProvider;
import org.apache.olingo.odata2.testutil.mock.MockFacade;
import org.custommonkey.xmlunit.exceptions.XpathException;
import org.junit.Test;
import org.xml.sax.SAXException;
public class XmlExpandProducerTest extends AbstractProviderTest {
private static final boolean T = true;
private static final boolean F = false;
private final URI inlineBaseUri;
private String employeeXPathString = "/a:entry/a:link[@href=\"Rooms('1')/nr_Employees\" and @title='nr_Employees']";
private String roomXPathString = "/a:entry/a:link[@href=\"Employees('1')/ne_Room\" and @title='ne_Room']";
private String teamXPathString = "/a:entry/a:link[@href=\"Employees('1')/ne_Team\" and @title='ne_Team']";
private String buildingXPathString = "/a:entry/a:link[@href=\"Buildings('1')/nb_Rooms\" and @title='nb_Rooms']";
public XmlExpandProducerTest(final StreamWriterImplType type) {
super(type);
try {
inlineBaseUri = new URI("http://hubbeldubbel.com/");
} catch (URISyntaxException e) {
throw new ODataRuntimeException(e);
}
}
@Test
public void expandSelectedTeamNullOmitInline() throws Exception {
ExpandSelectTreeNode selectTree = getSelectExpandTree("Employees('1')", "ne_Team", "ne_Team");
HashMap<String, ODataCallback> callbacksEmployee = createCallbacks("Employees");
EntityProviderWriteProperties properties =
EntityProviderWriteProperties.serviceRoot(BASE_URI).expandSelectTree(selectTree).callbacks(callbacksEmployee)
.omitInlineForNullData(true).build();
AtomEntityProvider provider = createAtomEntityProvider();
ODataResponse response =
provider.writeEntry(MockFacade.getMockEdm().getDefaultEntityContainer().getEntitySet("Employees"),
employeeData, properties);
String xmlString = verifyResponse(response);
verifyNavigationProperties(xmlString, F, F, T);
assertXpathExists(teamXPathString, xmlString);
assertXpathNotExists("/a:entry/m:properties", xmlString);
assertXpathNotExists(teamXPathString + "/m:inline", xmlString);
assertXpathNotExists(teamXPathString + "/m:inline/a:entry", xmlString);
}
@Test
public void expandSelectedRoomsNullOmitInline() throws Exception {
ExpandSelectTreeNode selectTree = getSelectExpandTree("Buildings('1')", "nb_Rooms", "nb_Rooms");
HashMap<String, ODataCallback> callbacksEmployee = createCallbacks("Buildings");
EntityProviderWriteProperties properties =
EntityProviderWriteProperties.serviceRoot(BASE_URI).expandSelectTree(selectTree).callbacks(callbacksEmployee)
.omitInlineForNullData(true).build();
AtomEntityProvider provider = createAtomEntityProvider();
ODataResponse response =
provider.writeEntry(MockFacade.getMockEdm().getDefaultEntityContainer().getEntitySet("Buildings"),
buildingData, properties);
String xmlString = verifyResponse(response);
assertXpathNotExists("/a:entry/m:properties", xmlString);
assertXpathExists(buildingXPathString, xmlString);
assertXpathNotExists(buildingXPathString + "/m:inline", xmlString);
assertXpathNotExists(buildingXPathString + "/m:inline/a:feed", xmlString);
assertXpathNotExists(buildingXPathString + "/m:inline/a:feed/a:id", xmlString);
assertXpathNotExists(buildingXPathString + "/m:inline/a:feed/a:title", xmlString);
assertXpathNotExists(buildingXPathString + "/m:inline/a:feed/a:updated", xmlString);
assertXpathNotExists(buildingXPathString + "/m:inline/a:feed/a:author", xmlString);
assertXpathNotExists(buildingXPathString + "/m:inline/a:feed/a:author/a:name", xmlString);
assertXpathNotExists(buildingXPathString + "/m:inline/a:feed/a:link[@href=\"Buildings('1')/nb_Rooms\"]", xmlString);
assertXpathNotExists(buildingXPathString + "/m:inline/a:feed/a:entry", xmlString);
}
@Test
public void expandSelectedEmployees() throws Exception {
ExpandSelectTreeNode selectTree = getSelectExpandTree("Rooms('1')", "nr_Employees", "nr_Employees");
HashMap<String, ODataCallback> callbacksRoom = createCallbacks("Rooms");
EntityProviderWriteProperties properties =
EntityProviderWriteProperties.serviceRoot(BASE_URI).expandSelectTree(selectTree).callbacks(callbacksRoom)
.build();
AtomEntityProvider provider = createAtomEntityProvider();
ODataResponse response =
provider.writeEntry(MockFacade.getMockEdm().getDefaultEntityContainer().getEntitySet("Rooms"), roomData,
properties);
String xmlString = verifyResponse(response);
assertXpathNotExists("/a:entry/m:properties", xmlString);
assertXpathExists("/a:entry/a:link", xmlString);
verifyEmployees(employeeXPathString, xmlString);
}
@Test(expected = EntityProviderException.class)
public void expandSelectedEmployeesWithFacets() throws Exception {
Edm edm = MockFacade.getMockEdm();
EdmTyped imageUrlProperty = edm.getEntityType("RefScenario", "Employee").getProperty("ImageUrl");
EdmFacets facets = mock(EdmFacets.class);
when(facets.getMaxLength()).thenReturn(1);
when(((EdmProperty) imageUrlProperty).getFacets()).thenReturn(facets);
ExpandSelectTreeNode selectTree = getSelectExpandTree("Rooms('1')", "nr_Employees", "nr_Employees");
HashMap<String, ODataCallback> callbacksRoom = createCallbacks("Rooms");
EntityProviderWriteProperties properties =
EntityProviderWriteProperties.serviceRoot(BASE_URI).expandSelectTree(selectTree)
.callbacks(callbacksRoom)
.build();
AtomEntityProvider provider = createAtomEntityProvider();
ODataResponse response =
provider.writeEntry(edm.getDefaultEntityContainer().getEntitySet("Rooms"), roomData,
properties);
String xmlString = verifyResponse(response);
assertXpathNotExists("/a:entry/m:properties", xmlString);
assertXpathExists("/a:entry/a:link", xmlString);
verifyEmployees(employeeXPathString, xmlString);
}
@Test
public void expandSelectedEmployeesIgnoreFacets() throws Exception {
Edm edm = MockFacade.getMockEdm();
EdmTyped imageUrlProperty = edm.getEntityType("RefScenario", "Employee").getProperty("ImageUrl");
EdmFacets facets = mock(EdmFacets.class);
when(facets.getMaxLength()).thenReturn(1);
when(((EdmProperty) imageUrlProperty).getFacets()).thenReturn(facets);
ExpandSelectTreeNode selectTree = getSelectExpandTree("Rooms('1')", "nr_Employees", "nr_Employees");
HashMap<String, ODataCallback> callbacksRoom = createCallbacks("Rooms");
EntityProviderWriteProperties properties =
EntityProviderWriteProperties.serviceRoot(BASE_URI).expandSelectTree(selectTree).callbacks(callbacksRoom)
.callbacks(callbacksRoom).validatingFacets(false)
.build();
AtomEntityProvider provider = createAtomEntityProvider();
ODataResponse response =
provider.writeEntry(edm.getDefaultEntityContainer().getEntitySet("Rooms"), roomData,
properties);
String xmlString = verifyResponse(response);
assertXpathNotExists("/a:entry/m:properties", xmlString);
assertXpathExists("/a:entry/a:link", xmlString);
verifyEmployees(employeeXPathString, xmlString);
}
@Test
public void expandSelectedEmployeesWithBuilder() throws Exception {
EdmEntitySet entitySet = MockFacade.getMockEdm().getDefaultEntityContainer().getEntitySet("Rooms");
List<String> navigationPropertyNames = new ArrayList<String>();
navigationPropertyNames.add("nr_Employees");
ExpandSelectTreeNode selectTree =
ExpandSelectTreeNode.entitySet(entitySet).expandedLinks(navigationPropertyNames).build();
HashMap<String, ODataCallback> callbacksRoom = createCallbacks("Rooms");
EntityProviderWriteProperties properties =
EntityProviderWriteProperties.serviceRoot(BASE_URI).expandSelectTree(selectTree).callbacks(callbacksRoom)
.build();
AtomEntityProvider provider = createAtomEntityProvider();
ODataResponse response =
provider.writeEntry(entitySet, roomData,
properties);
String xmlString = verifyResponse(response);
assertXpathNotExists("/a:entry/m:properties", xmlString);
assertXpathExists("/a:entry/a:link", xmlString);
verifyEmployees(employeeXPathString, xmlString);
}
@Test
public void expandSelectedEmployeesNull() throws Exception {
ExpandSelectTreeNode selectTree = getSelectExpandTree("Rooms('1')", "nr_Employees", "nr_Employees");
HashMap<String, ODataCallback> callbacksRoom = new HashMap<String, ODataCallback>();
ODataCallback employeeCallback = new OnWriteFeedContent() {
@Override
public WriteFeedCallbackResult retrieveFeedResult(final WriteFeedCallbackContext context)
throws ODataApplicationException {
WriteFeedCallbackResult writeFeedCallbackResult = new WriteFeedCallbackResult();
writeFeedCallbackResult.setInlineProperties(DEFAULT_PROPERTIES);
writeFeedCallbackResult.setFeedData(null);
return writeFeedCallbackResult;
}
};
callbacksRoom.put("nr_Employees", employeeCallback);
EntityProviderWriteProperties properties =
EntityProviderWriteProperties.serviceRoot(BASE_URI).expandSelectTree(selectTree).callbacks(callbacksRoom)
.build();
AtomEntityProvider provider = createAtomEntityProvider();
ODataResponse response =
provider.writeEntry(MockFacade.getMockEdm().getDefaultEntityContainer().getEntitySet("Rooms"), roomData,
properties);
String xmlString = verifyResponse(response);
assertXpathNotExists("/a:entry/m:properties", xmlString);
assertXpathExists("/a:entry/a:link", xmlString);
assertXpathExists(employeeXPathString + "/m:inline", xmlString);
assertXpathExists(employeeXPathString + "/m:inline/a:feed", xmlString);
assertXpathNotExists(employeeXPathString + "/m:inline/a:feed/a:entry", xmlString);
}
@Test
public void expandSelectedEmployeesEmpty() throws Exception {
ExpandSelectTreeNode selectTree = getSelectExpandTree("Rooms('1')", "nr_Employees", "nr_Employees");
HashMap<String, ODataCallback> callbacksRoom = new HashMap<String, ODataCallback>();
ODataCallback employeeCallback = new OnWriteFeedContent() {
@Override
public WriteFeedCallbackResult retrieveFeedResult(final WriteFeedCallbackContext context)
throws ODataApplicationException {
WriteFeedCallbackResult writeFeedCallbackResult = new WriteFeedCallbackResult();
writeFeedCallbackResult.setInlineProperties(DEFAULT_PROPERTIES);
writeFeedCallbackResult.setFeedData(new ArrayList<Map<String, Object>>());
return writeFeedCallbackResult;
}
};
callbacksRoom.put("nr_Employees", employeeCallback);
EntityProviderWriteProperties properties =
EntityProviderWriteProperties.serviceRoot(BASE_URI).expandSelectTree(selectTree).callbacks(callbacksRoom)
.build();
AtomEntityProvider provider = createAtomEntityProvider();
ODataResponse response =
provider.writeEntry(MockFacade.getMockEdm().getDefaultEntityContainer().getEntitySet("Rooms"), roomData,
properties);
String xmlString = verifyResponse(response);
assertXpathNotExists("/a:entry/m:properties", xmlString);
assertXpathExists("/a:entry/a:link", xmlString);
assertXpathExists(employeeXPathString + "/m:inline", xmlString);
assertXpathExists(employeeXPathString + "/m:inline/a:feed", xmlString);
}
@Test
public void expandSelectedEmployeesWithSelfLink() throws Exception {
ExpandSelectTreeNode selectTree = getSelectExpandTree("Rooms('1')", "nr_Employees", "nr_Employees");
HashMap<String, ODataCallback> callbacksRoom = createCallbacks("Rooms");
EntityProviderWriteProperties properties =
EntityProviderWriteProperties.serviceRoot(BASE_URI).expandSelectTree(selectTree).callbacks(callbacksRoom)
.build();
AtomEntityProvider provider = createAtomEntityProvider();
ODataResponse response =
provider.writeEntry(MockFacade.getMockEdm().getDefaultEntityContainer().getEntitySet("Rooms"), roomData,
properties);
String xmlString = verifyResponse(response);
assertXpathNotExists("/a:entry/m:properties", xmlString);
assertXpathExists("/a:entry/a:link", xmlString);
verifyEmployees(employeeXPathString, xmlString);
assertXpathExists(employeeXPathString + "/m:inline/a:feed/a:link[@href=\"Rooms('1')/nr_Employees\"]", xmlString);
}
@Test
public void deepExpandSelectedEmployees() throws Exception {
ExpandSelectTreeNode selectTree = getSelectExpandTree("Rooms('1')", "nr_Employees/ne_Room", "nr_Employees/ne_Room");
HashMap<String, ODataCallback> callbacksRoom = createCallbacks("Rooms");
EntityProviderWriteProperties properties =
EntityProviderWriteProperties.serviceRoot(BASE_URI).expandSelectTree(selectTree).callbacks(callbacksRoom)
.build();
AtomEntityProvider provider = createAtomEntityProvider();
ODataResponse response =
provider.writeEntry(MockFacade.getMockEdm().getDefaultEntityContainer().getEntitySet("Rooms"), roomData,
properties);
String xmlString = verifyResponse(response);
assertXpathNotExists("/a:entry/m:properties", xmlString);
assertXpathExists(employeeXPathString, xmlString);
assertXpathExists(employeeXPathString + "/m:inline/a:feed" + roomXPathString, xmlString);
assertXpathExists(employeeXPathString + "/m:inline/a:feed" + roomXPathString
+ "/m:inline/a:entry/a:content/m:properties", xmlString);
}
@Test
public void deepExpandSelectedEmployeesWithRoomId() throws Exception {
ExpandSelectTreeNode selectTree =
getSelectExpandTree("Rooms('1')", "nr_Employees/ne_Room/Id", "nr_Employees/ne_Room");
HashMap<String, ODataCallback> callbacksRoom = createCallbacks("Rooms");
EntityProviderWriteProperties properties =
EntityProviderWriteProperties.serviceRoot(BASE_URI).expandSelectTree(selectTree).callbacks(callbacksRoom)
.build();
AtomEntityProvider provider = createAtomEntityProvider();
ODataResponse response =
provider.writeEntry(MockFacade.getMockEdm().getDefaultEntityContainer().getEntitySet("Rooms"), roomData,
properties);
String xmlString = verifyResponse(response);
assertXpathNotExists("/a:entry/m:properties", xmlString);
assertXpathExists(employeeXPathString, xmlString);
assertXpathExists(employeeXPathString + "/m:inline/a:feed" + roomXPathString, xmlString);
assertXpathExists(employeeXPathString + "/m:inline/a:feed" + roomXPathString + "/m:inline", xmlString);
assertXpathExists(employeeXPathString + "/m:inline/a:feed" + roomXPathString + "/m:inline/a:entry", xmlString);
assertXpathExists(employeeXPathString + "/m:inline/a:feed" + roomXPathString
+ "/m:inline/a:entry/a:content/m:properties/d:Id", xmlString);
}
@Test
public void expandSelectedRoom() throws Exception {
ExpandSelectTreeNode selectTree = getSelectExpandTree("Employees('1')", "ne_Room", "ne_Room");
HashMap<String, ODataCallback> callbacksEmployee = createCallbacks("Employees");
EntityProviderWriteProperties properties =
EntityProviderWriteProperties.serviceRoot(BASE_URI).expandSelectTree(selectTree).callbacks(callbacksEmployee)
.build();
AtomEntityProvider provider = createAtomEntityProvider();
ODataResponse response =
provider.writeEntry(MockFacade.getMockEdm().getDefaultEntityContainer().getEntitySet("Employees"),
employeeData, properties);
String xmlString = verifyResponse(response);
verifyNavigationProperties(xmlString, F, T, F);
assertXpathNotExists("/a:entry/m:properties", xmlString);
verifyRoom(roomXPathString, xmlString);
}
@Test
public void expandSelectedTeamNull() throws Exception {
ExpandSelectTreeNode selectTree = getSelectExpandTree("Employees('1')", "ne_Team", "ne_Team");
HashMap<String, ODataCallback> callbacksEmployee = createCallbacks("Employees");
EntityProviderWriteProperties properties =
EntityProviderWriteProperties.serviceRoot(BASE_URI).expandSelectTree(selectTree).callbacks(callbacksEmployee)
.build();
AtomEntityProvider provider = createAtomEntityProvider();
ODataResponse response =
provider.writeEntry(MockFacade.getMockEdm().getDefaultEntityContainer().getEntitySet("Employees"),
employeeData, properties);
String xmlString = verifyResponse(response);
verifyNavigationProperties(xmlString, F, F, T);
assertXpathNotExists("/a:entry/m:properties", xmlString);
assertXpathExists(teamXPathString + "/m:inline", xmlString);
assertXpathNotExists(teamXPathString + "/m:inline/a:entry", xmlString);
}
@Test
public void expandSelectedTeamEmptyDataMap() throws Exception {
ExpandSelectTreeNode selectTree = getSelectExpandTree("Employees('1')", "ne_Team", "ne_Team");
HashMap<String, ODataCallback> callbacksEmployee = new HashMap<String, ODataCallback>();
OnWriteEntryContent callback = new OnWriteEntryContent() {
@Override
public WriteEntryCallbackResult retrieveEntryResult(final WriteEntryCallbackContext context)
throws ODataApplicationException {
WriteEntryCallbackResult result = new WriteEntryCallbackResult();
result.setInlineProperties(DEFAULT_PROPERTIES);
result.setEntryData(new HashMap<String, Object>());
return result;
}
};
callbacksEmployee.put("ne_Team", callback);
EntityProviderWriteProperties properties =
EntityProviderWriteProperties.serviceRoot(BASE_URI).expandSelectTree(selectTree).callbacks(callbacksEmployee)
.build();
AtomEntityProvider provider = createAtomEntityProvider();
ODataResponse response =
provider.writeEntry(MockFacade.getMockEdm().getDefaultEntityContainer().getEntitySet("Employees"),
employeeData, properties);
String xmlString = verifyResponse(response);
verifyNavigationProperties(xmlString, F, F, T);
assertXpathNotExists("/a:entry/m:properties", xmlString);
assertXpathExists(teamXPathString + "/m:inline", xmlString);
assertXpathNotExists(teamXPathString + "/m:inline/a:entry", xmlString);
}
@Test
public void expandSelectedRoomsNull() throws Exception {
ExpandSelectTreeNode selectTree = getSelectExpandTree("Buildings('1')", "nb_Rooms", "nb_Rooms");
HashMap<String, ODataCallback> callbacksEmployee = createCallbacks("Buildings");
EntityProviderWriteProperties properties =
EntityProviderWriteProperties.serviceRoot(BASE_URI).expandSelectTree(selectTree).callbacks(callbacksEmployee)
.build();
AtomEntityProvider provider = createAtomEntityProvider();
ODataResponse response =
provider.writeEntry(MockFacade.getMockEdm().getDefaultEntityContainer().getEntitySet("Buildings"),
buildingData, properties);
String xmlString = verifyResponse(response);
assertXpathNotExists("/a:entry/m:properties", xmlString);
assertXpathExists(buildingXPathString + "/m:inline", xmlString);
assertXpathExists(buildingXPathString + "/m:inline/a:feed", xmlString);
assertXpathExists(buildingXPathString + "/m:inline/a:feed/a:id", xmlString);
assertXpathExists(buildingXPathString + "/m:inline/a:feed/a:title", xmlString);
assertXpathExists(buildingXPathString + "/m:inline/a:feed/a:updated", xmlString);
assertXpathExists(buildingXPathString + "/m:inline/a:feed/a:author", xmlString);
assertXpathExists(buildingXPathString + "/m:inline/a:feed/a:author/a:name", xmlString);
assertXpathExists(buildingXPathString + "/m:inline/a:feed/a:link[@href=\"Buildings('1')/nb_Rooms\"]", xmlString);
assertXpathNotExists(buildingXPathString + "/m:inline/a:feed/a:entry", xmlString);
}
@Test(expected = EntityProviderException.class)
public void expandSelectedRoomsWithNullCallback() throws Exception {
ExpandSelectTreeNode selectTree = getSelectExpandTree("Buildings('1')", "nb_Rooms", "nb_Rooms");
HashMap<String, ODataCallback> callbacksBuilding = new HashMap<String, ODataCallback>();
callbacksBuilding.put("nb_Rooms", null);
EntityProviderWriteProperties properties =
EntityProviderWriteProperties.serviceRoot(BASE_URI).expandSelectTree(selectTree).callbacks(callbacksBuilding)
.build();
AtomEntityProvider provider = createAtomEntityProvider();
provider.writeEntry(MockFacade.getMockEdm().getDefaultEntityContainer().getEntitySet("Buildings"), buildingData,
properties);
}
private HashMap<String, ODataCallback> createCallbacks(final String entitySetName) throws EdmException,
ODataException {
HashMap<String, ODataCallback> callbacksEmployee = new HashMap<String, ODataCallback>();
MyCallback callback = new MyCallback(this, inlineBaseUri);
for (String navPropName : MockFacade.getMockEdm().getDefaultEntityContainer().getEntitySet(entitySetName)
.getEntityType().getNavigationPropertyNames()) {
callbacksEmployee.put(navPropName, callback);
}
return callbacksEmployee;
}
@Test
public void expandSelectedRoomWithoutCallback() throws Exception {
ExpandSelectTreeNode selectTree = getSelectExpandTree("Employees('1')", "ne_Room", "ne_Room");
EntityProviderWriteProperties properties =
EntityProviderWriteProperties.serviceRoot(BASE_URI).expandSelectTree(selectTree).build();
AtomEntityProvider provider = createAtomEntityProvider();
ODataResponse response =
provider.writeEntry(MockFacade.getMockEdm().getDefaultEntityContainer().getEntitySet("Employees"),
employeeData, properties);
String xmlString = verifyResponse(response);
verifyNavigationProperties(xmlString, F, T, F);
assertXpathNotExists("/a:entry/m:properties", xmlString);
assertXpathNotExists(roomXPathString + "/m:inline", xmlString);
}
@Test(expected = EntityProviderException.class)
public void expandSelectedRoomWithNullCallback() throws Exception {
ExpandSelectTreeNode selectTree = getSelectExpandTree("Employees('1')", "ne_Room", "ne_Room");
HashMap<String, ODataCallback> callbacksEmployee = new HashMap<String, ODataCallback>();
callbacksEmployee.put("ne_Room", null);
EntityProviderWriteProperties properties =
EntityProviderWriteProperties.serviceRoot(BASE_URI).expandSelectTree(selectTree).callbacks(callbacksEmployee)
.build();
AtomEntityProvider provider = createAtomEntityProvider();
provider.writeEntry(MockFacade.getMockEdm().getDefaultEntityContainer().getEntitySet("Employees"), employeeData,
properties);
}
private void verifyEmployees(final String path, final String xmlString) throws XpathException, IOException,
SAXException {
assertXpathExists(path, xmlString);
assertXpathExists(path + "/m:inline", xmlString);
assertXpathExists(path + "/m:inline/a:feed[@xml:base='" + inlineBaseUri.toString() + "']", xmlString);
assertXpathExists(path + "/m:inline/a:feed/a:entry", xmlString);
assertXpathExists(path + "/m:inline/a:feed/a:entry/a:id", xmlString);
assertXpathExists(path + "/m:inline/a:feed/a:entry/a:title", xmlString);
assertXpathExists(path + "/m:inline/a:feed/a:entry/a:updated", xmlString);
assertXpathExists(path + "/m:inline/a:feed/a:entry/a:category", xmlString);
assertXpathExists(path + "/m:inline/a:feed/a:entry/a:link", xmlString);
assertXpathExists(path + "/m:inline/a:feed/a:entry/a:content", xmlString);
assertXpathExists(path + "/m:inline/a:feed/a:entry/m:properties", xmlString);
assertXpathExists(path + "/m:inline/a:feed/a:entry/m:properties/d:EmployeeId", xmlString);
assertXpathExists(path + "/m:inline/a:feed/a:entry/m:properties/d:EmployeeName", xmlString);
assertXpathExists(path + "/m:inline/a:feed/a:entry/m:properties/d:ManagerId", xmlString);
assertXpathExists(path + "/m:inline/a:feed/a:entry/m:properties/d:TeamId", xmlString);
assertXpathExists(path + "/m:inline/a:feed/a:entry/m:properties/d:RoomId", xmlString);
assertXpathExists(path + "/m:inline/a:feed/a:entry/m:properties/d:Location", xmlString);
assertXpathExists(path + "/m:inline/a:feed/a:entry/m:properties/d:Age", xmlString);
assertXpathExists(path + "/m:inline/a:feed/a:entry/m:properties/d:ImageUrl", xmlString);
}
private void verifyRoom(final String path, final String xmlString) throws XpathException, IOException, SAXException {
assertXpathExists(path, xmlString);
assertXpathExists(path + "/m:inline", xmlString);
assertXpathExists(path + "/m:inline/a:entry", xmlString);
assertXpathExists(path + "/m:inline/a:entry[@xml:base='" + inlineBaseUri.toString() + "']", xmlString);
assertXpathExists(path + "/m:inline/a:entry/a:id", xmlString);
assertXpathExists(path + "/m:inline/a:entry/a:title", xmlString);
assertXpathExists(path + "/m:inline/a:entry/a:updated", xmlString);
assertXpathExists(path + "/m:inline/a:entry/a:category", xmlString);
assertXpathExists(path + "/m:inline/a:entry/a:link", xmlString);
assertXpathExists(path + "/m:inline/a:entry/a:content", xmlString);
assertXpathExists(path + "/m:inline/a:entry/a:content/m:properties", xmlString);
assertXpathExists(path + "/m:inline/a:entry/a:content/m:properties/d:Id", xmlString);
assertXpathExists(path + "/m:inline/a:entry/a:content/m:properties/d:Name", xmlString);
assertXpathExists(path + "/m:inline/a:entry/a:content/m:properties/d:Seats", xmlString);
assertXpathExists(path + "/m:inline/a:entry/a:content/m:properties/d:Version", xmlString);
}
private void verifyNavigationProperties(final String xmlString, final boolean neManager, final boolean neRoom,
final boolean neTeam) throws IOException, SAXException, XpathException {
if (neManager) {
assertXpathExists("/a:entry/a:link[@href=\"Employees('1')/ne_Manager\" and @title='ne_Manager']", xmlString);
} else {
assertXpathNotExists("/a:entry/a:link[@href=\"Employees('1')/ne_Manager\" and @title='ne_Manager']", xmlString);
}
if (neRoom) {
assertXpathExists("/a:entry/a:link[@href=\"Employees('1')/ne_Room\" and @title='ne_Room']", xmlString);
} else {
assertXpathNotExists("/a:entry/a:link[@href=\"Employees('1')/ne_Room\" and @title='ne_Room']", xmlString);
}
if (neTeam) {
assertXpathExists("/a:entry/a:link[@href=\"Employees('1')/ne_Team\" and @title='ne_Team']", xmlString);
} else {
assertXpathNotExists("/a:entry/a:link[@href=\"Employees('1')/ne_Team\" and @title='ne_Team']", xmlString);
}
}
private String verifyResponse(final ODataResponse response) throws IOException {
assertNotNull(response);
assertNotNull(response.getEntity());
assertNull("EntitypProvider should not set content header", response.getContentHeader());
String xmlString = StringHelper.inputStreamToString((InputStream) response.getEntity());
return xmlString;
}
private ExpandSelectTreeNode getSelectExpandTree(final String pathSegment, final String selectString,
final String expandString) throws Exception {
Edm edm = RuntimeDelegate.createEdm(new EdmTestProvider());
UriParserImpl uriParser = new UriParserImpl(edm);
List<PathSegment> pathSegments = new ArrayList<PathSegment>();
pathSegments.add(new ODataPathSegmentImpl(pathSegment, null));
Map<String, String> queryParameters = new HashMap<String, String>();
if (selectString != null) {
queryParameters.put("$select", selectString);
}
if (expandString != null) {
queryParameters.put("$expand", expandString);
}
UriInfo uriInfo = uriParser.parse(pathSegments, queryParameters);
ExpandSelectTreeCreator expandSelectTreeCreator =
new ExpandSelectTreeCreator(uriInfo.getSelect(), uriInfo.getExpand());
ExpandSelectTreeNode expandSelectTree = expandSelectTreeCreator.create();
assertNotNull(expandSelectTree);
return expandSelectTree;
}
}