/*******************************************************************************
* Copyright 2013 SAP AG
*
* Licensed 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 com.sap.core.odata.core.ep.consumer;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import java.io.InputStream;
import java.util.List;
import java.util.Map;
import org.junit.Test;
import com.sap.core.odata.api.edm.EdmEntitySet;
import com.sap.core.odata.api.edm.EdmNavigationProperty;
import com.sap.core.odata.api.ep.EntityProviderReadProperties;
import com.sap.core.odata.api.ep.callback.OnReadInlineContent;
import com.sap.core.odata.api.ep.callback.ReadEntryResult;
import com.sap.core.odata.api.ep.callback.ReadFeedResult;
import com.sap.core.odata.api.ep.entry.ODataEntry;
import com.sap.core.odata.api.ep.feed.FeedMetadata;
import com.sap.core.odata.api.ep.feed.ODataFeed;
import com.sap.core.odata.core.exception.ODataRuntimeException;
import com.sap.core.odata.testutil.mock.MockFacade;
/**
* @author SAP AG
*/
public class JsonEntryDeepInsertFeedTest extends AbstractConsumerTest {
private static final String BUILDING_WITH_INLINE_ROOMS = "JsonBuildingWithInlineRooms";
private static final String TEAM_WITH_INLINE_EMPLOYEES = "JsonTeamsWithInlineEmployees";
private static final String BUILDING_WITH_INLINE_ROOMS_NEXTLINK_AND_COUNT = "JsonBuildingWithInlineRoomsAndNextLinkAndCount";
@Test
public void innerFeedNoMediaResourceWithoutCallback() throws Exception {
ODataEntry outerEntry = prepareAndExecuteEntry(BUILDING_WITH_INLINE_ROOMS, "Buildings", DEFAULT_PROPERTIES);
ODataFeed innerRoomFeed = (ODataFeed) outerEntry.getProperties().get("nb_Rooms");
assertNotNull(innerRoomFeed);
List<ODataEntry> rooms = innerRoomFeed.getEntries();
assertNotNull(rooms);
assertEquals(1, rooms.size());
ODataEntry room = rooms.get(0);
Map<String, Object> roomProperties = room.getProperties();
assertEquals(4, roomProperties.size());
assertEquals("1", roomProperties.get("Id"));
assertEquals("Room 1", roomProperties.get("Name"));
assertEquals(Short.valueOf("1"), roomProperties.get("Version"));
assertEquals(Short.valueOf("1"), roomProperties.get("Seats"));
List<String> associationUris = room.getMetadata().getAssociationUris("nr_Employees");
assertEquals(1, associationUris.size());
assertEquals("http://localhost:8080/ReferenceScenario.svc/Rooms('1')/nr_Employees", associationUris.get(0));
associationUris = room.getMetadata().getAssociationUris("nr_Building");
assertEquals(1, associationUris.size());
assertEquals("http://localhost:8080/ReferenceScenario.svc/Rooms('1')/nr_Building", associationUris.get(0));
}
@Test
public void innerFeedNoMediaResourceWithoutCallbackContainsNextLinkAndCount() throws Exception {
ODataEntry outerEntry = prepareAndExecuteEntry(BUILDING_WITH_INLINE_ROOMS_NEXTLINK_AND_COUNT, "Buildings", DEFAULT_PROPERTIES);
ODataFeed innerRoomFeed = (ODataFeed) outerEntry.getProperties().get("nb_Rooms");
assertNotNull(innerRoomFeed);
List<ODataEntry> rooms = innerRoomFeed.getEntries();
assertNotNull(rooms);
assertEquals(1, rooms.size());
FeedMetadata roomsMetadata = innerRoomFeed.getFeedMetadata();
assertEquals(Integer.valueOf(1), roomsMetadata.getInlineCount());
assertEquals("nextLink", roomsMetadata.getNextLink());
}
@Test
public void innerFeedNoMediaResourceWithoutCallbackSimpleArray() throws Exception {
EdmEntitySet entitySet = MockFacade.getMockEdm().getDefaultEntityContainer().getEntitySet("Buildings");
String content = "{\"d\":{\"Id\":\"1\",\"Name\":\"Building 1\","
+ "\"nb_Rooms\":[{\"Id\":\"1\",\"Name\":\"Room 1\"}]}}";
InputStream contentBody = createContentAsStream(content);
final ODataEntry outerEntry = new JsonEntityConsumer().readEntry(entitySet, contentBody, DEFAULT_PROPERTIES);
assertNotNull(outerEntry);
final ODataFeed innerRoomFeed = (ODataFeed) outerEntry.getProperties().get("nb_Rooms");
assertNotNull(innerRoomFeed);
final List<ODataEntry> rooms = innerRoomFeed.getEntries();
assertNotNull(rooms);
assertEquals(1, rooms.size());
}
@Test
public void innerFeedMediaResourceWithoutCallback() throws Exception {
ODataEntry outerEntry = prepareAndExecuteEntry(TEAM_WITH_INLINE_EMPLOYEES, "Teams", DEFAULT_PROPERTIES);
ODataFeed innerEmployeeFeed = (ODataFeed) outerEntry.getProperties().get("nt_Employees");
assertNotNull(innerEmployeeFeed);
List<ODataEntry> employees = innerEmployeeFeed.getEntries();
assertNotNull(employees);
assertEquals(3, employees.size());
}
@Test
public void innerFeedNoMediaResourceWithCallback() throws Exception {
FeedCallback callback = new FeedCallback();
EntityProviderReadProperties readProperties = EntityProviderReadProperties.init().mergeSemantic(false).callback(callback).build();
ODataEntry outerEntry = prepareAndExecuteEntry(BUILDING_WITH_INLINE_ROOMS, "Buildings", readProperties);
ODataFeed innerRoomFeed = (ODataFeed) outerEntry.getProperties().get("nb_Rooms");
assertNull(innerRoomFeed);
innerRoomFeed = callback.getFeed();
List<ODataEntry> rooms = innerRoomFeed.getEntries();
assertNotNull(rooms);
assertEquals(1, rooms.size());
ODataEntry room = rooms.get(0);
Map<String, Object> roomProperties = room.getProperties();
assertEquals(4, roomProperties.size());
assertEquals("1", roomProperties.get("Id"));
assertEquals("Room 1", roomProperties.get("Name"));
assertEquals(Short.valueOf("1"), roomProperties.get("Version"));
assertEquals(Short.valueOf("1"), roomProperties.get("Seats"));
List<String> associationUris = room.getMetadata().getAssociationUris("nr_Employees");
assertEquals(1, associationUris.size());
assertEquals("http://localhost:8080/ReferenceScenario.svc/Rooms('1')/nr_Employees", associationUris.get(0));
associationUris = room.getMetadata().getAssociationUris("nr_Building");
assertEquals(1, associationUris.size());
assertEquals("http://localhost:8080/ReferenceScenario.svc/Rooms('1')/nr_Building", associationUris.get(0));
}
@Test
public void innerFeedNoMediaResourceWithCallbackContainsNextLinkAndCount() throws Exception {
ODataEntry outerEntry = prepareAndExecuteEntry(BUILDING_WITH_INLINE_ROOMS_NEXTLINK_AND_COUNT, "Buildings", DEFAULT_PROPERTIES);
ODataFeed innerRoomFeed = (ODataFeed) outerEntry.getProperties().get("nb_Rooms");
assertNotNull(innerRoomFeed);
List<ODataEntry> rooms = innerRoomFeed.getEntries();
assertNotNull(rooms);
assertEquals(1, rooms.size());
FeedMetadata roomsMetadata = innerRoomFeed.getFeedMetadata();
assertEquals(Integer.valueOf(1), roomsMetadata.getInlineCount());
assertEquals("nextLink", roomsMetadata.getNextLink());
}
@Test
public void innerFeedMediaResourceWithCallback() throws Exception {
ODataEntry outerEntry = prepareAndExecuteEntry(TEAM_WITH_INLINE_EMPLOYEES, "Teams", DEFAULT_PROPERTIES);
ODataFeed innerEmployeeFeed = (ODataFeed) outerEntry.getProperties().get("nt_Employees");
assertNotNull(innerEmployeeFeed);
List<ODataEntry> employees = innerEmployeeFeed.getEntries();
assertNotNull(employees);
assertEquals(3, employees.size());
}
private class FeedCallback implements OnReadInlineContent {
private ODataFeed feed;
private FeedCallback innerCallback;
public FeedCallback() {
}
public ODataFeed getFeed() {
return feed;
}
@Override
public void handleReadEntry(final ReadEntryResult context) {
throw new ODataRuntimeException("No entry expected");
}
@Override
public void handleReadFeed(final ReadFeedResult context) {
feed = context.getResult();
}
@Override
public EntityProviderReadProperties receiveReadProperties(final EntityProviderReadProperties readProperties, final EdmNavigationProperty navString) {
return EntityProviderReadProperties.init().mergeSemantic(false).callback(innerCallback).build();
}
}
}