/******************************************************************************* * 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 static org.junit.Assert.assertTrue; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import java.io.ByteArrayInputStream; import java.io.InputStream; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; import java.math.BigDecimal; import java.util.Arrays; import java.util.Calendar; import java.util.HashMap; import java.util.Map; import java.util.UUID; import org.junit.Test; import com.google.gson.stream.JsonReader; import com.sap.core.odata.api.edm.EdmFacets; import com.sap.core.odata.api.edm.EdmProperty; import com.sap.core.odata.api.edm.EdmSimpleTypeKind; import com.sap.core.odata.api.ep.EntityProviderException; import com.sap.core.odata.api.ep.EntityProviderReadProperties; import com.sap.core.odata.core.ep.aggregator.EntityComplexPropertyInfo; import com.sap.core.odata.core.ep.aggregator.EntityInfoAggregator; import com.sap.core.odata.core.ep.aggregator.EntityPropertyInfo; import com.sap.core.odata.testutil.fit.BaseTest; import com.sap.core.odata.testutil.mock.MockFacade; /** * @author SAP AG */ public class JsonPropertyConsumerTest extends BaseTest { @Test public void booleanSimpleProperty() throws Exception { EdmProperty property = mock(EdmProperty.class); when(property.getName()).thenReturn("Boolean"); when(property.isSimple()).thenReturn(true); when(property.getType()).thenReturn(EdmSimpleTypeKind.Boolean.getEdmSimpleTypeInstance()); JsonReader reader = prepareReader("{\"Boolean\":true}"); final Map<String, Object> resultMap = execute(property, reader); assertEquals(Boolean.TRUE, resultMap.get("Boolean")); } @Test public void allNumberSimplePropertyKinds() throws Exception { String simplePropertyJson = "{\"d\":{\"Age\":67}}"; EdmProperty edmProperty = mock(EdmProperty.class); when(edmProperty.getName()).thenReturn("Age"); when(edmProperty.isSimple()).thenReturn(true); //Byte JsonReader reader = prepareReader(simplePropertyJson); when(edmProperty.getType()).thenReturn(EdmSimpleTypeKind.Byte.getEdmSimpleTypeInstance()); Map<String, Object> resultMap = execute(edmProperty, reader); assertEquals(Short.valueOf("67"), resultMap.get("Age")); //SByte reader = prepareReader(simplePropertyJson); when(edmProperty.getType()).thenReturn(EdmSimpleTypeKind.SByte.getEdmSimpleTypeInstance()); resultMap = execute(edmProperty, reader); assertEquals(Byte.valueOf("67"), resultMap.get("Age")); //Int16 reader = prepareReader(simplePropertyJson); when(edmProperty.getType()).thenReturn(EdmSimpleTypeKind.Int16.getEdmSimpleTypeInstance()); resultMap = execute(edmProperty, reader); assertEquals(Short.valueOf("67"), resultMap.get("Age")); //Int32 reader = prepareReader(simplePropertyJson); when(edmProperty.getType()).thenReturn(EdmSimpleTypeKind.Int32.getEdmSimpleTypeInstance()); resultMap = execute(edmProperty, reader); assertEquals(Integer.valueOf("67"), resultMap.get("Age")); } @Test public void allStringSimplePropertyKinds() throws Exception { EdmProperty edmProperty = mock(EdmProperty.class); when(edmProperty.getName()).thenReturn("Name"); when(edmProperty.isSimple()).thenReturn(true); String simplePropertyJson; //DateTime simplePropertyJson = "{\"d\":{\"Name\":\"\\/Date(915148800000)\\/\"}}"; JsonReader reader = prepareReader(simplePropertyJson); when(edmProperty.getType()).thenReturn(EdmSimpleTypeKind.DateTime.getEdmSimpleTypeInstance()); Map<String, Object> resultMap = execute(edmProperty, reader); Calendar entryDate = (Calendar) resultMap.get("Name"); assertEquals(Long.valueOf(915148800000l), Long.valueOf(entryDate.getTimeInMillis())); //DateTimeOffset simplePropertyJson = "{\"d\":{\"Name\":\"\\/Date(915148800000)\\/\"}}"; reader = prepareReader(simplePropertyJson); when(edmProperty.getType()).thenReturn(EdmSimpleTypeKind.DateTime.getEdmSimpleTypeInstance()); resultMap = execute(edmProperty, reader); entryDate = (Calendar) resultMap.get("Name"); assertEquals(Long.valueOf(915148800000l), Long.valueOf(entryDate.getTimeInMillis())); //Decimal simplePropertyJson = "{\"d\":{\"Name\":\"123456789\"}}"; reader = prepareReader(simplePropertyJson); when(edmProperty.getType()).thenReturn(EdmSimpleTypeKind.Decimal.getEdmSimpleTypeInstance()); resultMap = execute(edmProperty, reader); assertEquals(BigDecimal.valueOf(Long.valueOf("123456789")), resultMap.get("Name")); //Double simplePropertyJson = "{\"d\":{\"Name\":\"123456789\"}}"; reader = prepareReader(simplePropertyJson); when(edmProperty.getType()).thenReturn(EdmSimpleTypeKind.Double.getEdmSimpleTypeInstance()); resultMap = execute(edmProperty, reader); assertEquals(Double.valueOf("123456789"), resultMap.get("Name")); //Int64 simplePropertyJson = "{\"d\":{\"Name\":\"123456789\"}}"; reader = prepareReader(simplePropertyJson); when(edmProperty.getType()).thenReturn(EdmSimpleTypeKind.Int64.getEdmSimpleTypeInstance()); resultMap = execute(edmProperty, reader); assertEquals(Long.valueOf("123456789"), resultMap.get("Name")); //Single simplePropertyJson = "{\"d\":{\"Name\":\"123456\"}}"; reader = prepareReader(simplePropertyJson); when(edmProperty.getType()).thenReturn(EdmSimpleTypeKind.Single.getEdmSimpleTypeInstance()); resultMap = execute(edmProperty, reader); assertEquals(Float.valueOf("123456"), resultMap.get("Name")); //String simplePropertyJson = "{\"d\":{\"Name\":\"123456789\"}}"; reader = prepareReader(simplePropertyJson); when(edmProperty.getType()).thenReturn(EdmSimpleTypeKind.String.getEdmSimpleTypeInstance()); resultMap = execute(edmProperty, reader); assertEquals("123456789", resultMap.get("Name")); //Guid simplePropertyJson = "{\"d\":{\"Name\":\"AABBCCDD-AABB-CCDD-EEFF-AABBCCDDEEFF\"}}"; reader = prepareReader(simplePropertyJson); when(edmProperty.getType()).thenReturn(EdmSimpleTypeKind.Guid.getEdmSimpleTypeInstance()); resultMap = execute(edmProperty, reader); assertEquals(UUID.fromString("aabbccdd-aabb-ccdd-eeff-aabbccddeeff"), resultMap.get("Name")); //Binary simplePropertyJson = "{\"d\":{\"Name\":\"qrvM\"}}"; reader = prepareReader(simplePropertyJson); when(edmProperty.getType()).thenReturn(EdmSimpleTypeKind.Binary.getEdmSimpleTypeInstance()); resultMap = execute(edmProperty, reader); assertTrue(Arrays.equals(new byte[] { (byte) 0xAA, (byte) 0xBB, (byte) 0xCC }, (byte[]) resultMap.get("Name"))); //Time simplePropertyJson = "{\"d\":{\"Name\":\"PT23H32M3S\"}}"; reader = prepareReader(simplePropertyJson); when(edmProperty.getType()).thenReturn(EdmSimpleTypeKind.Time.getEdmSimpleTypeInstance()); resultMap = execute(edmProperty, reader); Calendar dateTime = Calendar.getInstance(); dateTime.clear(); dateTime.set(Calendar.HOUR_OF_DAY, 23); dateTime.set(Calendar.MINUTE, 32); dateTime.set(Calendar.SECOND, 3); assertEquals(dateTime, resultMap.get("Name")); } @Test public void simplePropertyOnOpenReader() throws Exception { String simplePropertyJson = "{\"Name\":\"Team 1\"}"; JsonReader reader = prepareReader(simplePropertyJson); EdmProperty edmProperty = (EdmProperty) MockFacade.getMockEdm().getDefaultEntityContainer().getEntitySet("Teams").getEntityType().getProperty("Name"); EntityPropertyInfo entityPropertyInfo = EntityInfoAggregator.create(edmProperty); reader.beginObject(); reader.nextName(); JsonPropertyConsumer jpc = new JsonPropertyConsumer(); Object value = jpc.readPropertyValue(reader, entityPropertyInfo, null); assertEquals("Team 1", value); } @Test public void veryLongStringStandalone() throws Exception { char[] chars = new char[32768]; Arrays.fill(chars, 0, 32768, 'a'); String propertyValue = new String(chars); String simplePropertyJson = "{\"d\":{\"Name\":\"" + propertyValue + "\"}}"; JsonReader reader = prepareReader(simplePropertyJson); final EdmProperty edmProperty = (EdmProperty) MockFacade.getMockEdm().getEntityType("RefScenario", "Room").getProperty("Name"); EntityProviderReadProperties readProperties = mock(EntityProviderReadProperties.class); when(readProperties.getTypeMappings()).thenReturn(null); Map<String, Object> resultMap = new JsonPropertyConsumer().readPropertyStandalone(reader, edmProperty, readProperties); assertEquals(propertyValue, resultMap.get("Name")); } @Test public void simplePropertyNull() throws Exception { JsonReader reader = prepareReader("{\"Name\":null}"); final EdmProperty property = (EdmProperty) MockFacade.getMockEdm().getEntityType("RefScenario", "Room").getProperty("Name"); final Map<String, Object> resultMap = new JsonPropertyConsumer().readPropertyStandalone(reader, property, null); assertTrue(resultMap.containsKey("Name")); assertNull(resultMap.get("Name")); } @Test(expected = EntityProviderException.class) public void simplePropertyNullValueNotAllowed() throws Exception { JsonReader reader = prepareReader("{\"Age\":null}"); EdmProperty property = (EdmProperty) MockFacade.getMockEdm().getEntityType("RefScenario", "Employee").getProperty("Age"); EdmFacets facets = mock(EdmFacets.class); when(facets.isNullable()).thenReturn(false); when(property.getFacets()).thenReturn(facets); new JsonPropertyConsumer().readPropertyStandalone(reader, property, null); } @Test public void simplePropertyWithNullMappingStandalone() throws Exception { String simplePropertyJson = "{\"d\":{\"Age\":67}}"; JsonReader reader = prepareReader(simplePropertyJson); final EdmProperty edmProperty = (EdmProperty) MockFacade.getMockEdm().getEntityType("RefScenario", "Employee").getProperty("Age"); EntityProviderReadProperties readProperties = mock(EntityProviderReadProperties.class); when(readProperties.getTypeMappings()).thenReturn(null); Map<String, Object> resultMap = new JsonPropertyConsumer().readPropertyStandalone(reader, edmProperty, readProperties); assertEquals(Integer.valueOf(67), resultMap.get("Age")); } @Test public void simplePropertyWithNullMappingStandaloneWithoutD() throws Exception { String simplePropertyJson = "{\"Age\":67}"; JsonReader reader = prepareReader(simplePropertyJson); final EdmProperty edmProperty = (EdmProperty) MockFacade.getMockEdm().getEntityType("RefScenario", "Employee").getProperty("Age"); EntityProviderReadProperties readProperties = mock(EntityProviderReadProperties.class); when(readProperties.getTypeMappings()).thenReturn(null); Map<String, Object> resultMap = new JsonPropertyConsumer().readPropertyStandalone(reader, edmProperty, readProperties); assertEquals(Integer.valueOf(67), resultMap.get("Age")); } @Test public void simplePropertyWithEmptyMappingStandalone() throws Exception { String simplePropertyJson = "{\"d\":{\"Age\":67}}"; JsonReader reader = prepareReader(simplePropertyJson); final EdmProperty edmProperty = (EdmProperty) MockFacade.getMockEdm().getEntityType("RefScenario", "Employee").getProperty("Age"); EntityProviderReadProperties readProperties = mock(EntityProviderReadProperties.class); when(readProperties.getTypeMappings()).thenReturn(new HashMap<String, Object>()); Map<String, Object> resultMap = new JsonPropertyConsumer().readPropertyStandalone(reader, edmProperty, readProperties); assertEquals(Integer.valueOf(67), resultMap.get("Age")); } @Test public void simplePropertyWithStringToLongMappingStandalone() throws Exception { String simplePropertyJson = "{\"d\":{\"Age\":67}}"; JsonReader reader = prepareReader(simplePropertyJson); final EdmProperty edmProperty = (EdmProperty) MockFacade.getMockEdm().getEntityType("RefScenario", "Employee").getProperty("Age"); EntityProviderReadProperties readProperties = mock(EntityProviderReadProperties.class); Map<String, Object> typeMappings = new HashMap<String, Object>(); typeMappings.put("Age", Long.class); when(readProperties.getTypeMappings()).thenReturn(typeMappings); Map<String, Object> resultMap = new JsonPropertyConsumer().readPropertyStandalone(reader, edmProperty, readProperties); assertEquals(Long.valueOf(67), resultMap.get("Age")); } @Test public void simplePropertyWithStringToNullMappingStandalone() throws Exception { String simplePropertyJson = "{\"d\":{\"Age\":67}}"; JsonReader reader = prepareReader(simplePropertyJson); final EdmProperty edmProperty = (EdmProperty) MockFacade.getMockEdm().getEntityType("RefScenario", "Employee").getProperty("Age"); EntityProviderReadProperties readProperties = mock(EntityProviderReadProperties.class); Map<String, Object> typeMappings = new HashMap<String, Object>(); typeMappings.put("Age", null); when(readProperties.getTypeMappings()).thenReturn(typeMappings); Map<String, Object> resultMap = new JsonPropertyConsumer().readPropertyStandalone(reader, edmProperty, readProperties); assertEquals(Integer.valueOf(67), resultMap.get("Age")); } @Test(expected = EntityProviderException.class) public void noContent() throws Exception { final EdmProperty property = (EdmProperty) MockFacade.getMockEdm().getEntityType("RefScenario", "Employee").getProperty("Age"); JsonReader reader = prepareReader("{}"); new JsonPropertyConsumer().readPropertyStandalone(reader, property, null); } @Test(expected = EntityProviderException.class) public void simplePropertyUnfinished() throws Exception { final EdmProperty property = (EdmProperty) MockFacade.getMockEdm().getEntityType("RefScenario", "Employee").getProperty("Age"); JsonReader reader = prepareReader("{\"Age\":67"); new JsonPropertyConsumer().readPropertyStandalone(reader, property, null); } @Test(expected = EntityProviderException.class) public void simplePropertInvalidName() throws Exception { String simplePropertyJson = "{\"d\":{\"Invalid\":67}}"; JsonReader reader = prepareReader(simplePropertyJson); final EdmProperty edmProperty = (EdmProperty) MockFacade.getMockEdm().getEntityType("RefScenario", "Employee").getProperty("Age"); new JsonPropertyConsumer().readPropertyStandalone(reader, edmProperty, null); } @Test public void complexPropertyWithStringToStringMappingStandalone() throws Exception { final String complexPropertyJson = "{\"d\":{\"City\":{\"__metadata\":{\"type\":\"RefScenario.c_City\"},\"PostalCode\":\"69124\",\"CityName\":\"Heidelberg\"}}}"; JsonReader reader = prepareReader(complexPropertyJson); final EdmProperty property = (EdmProperty) MockFacade.getMockEdm().getComplexType("RefScenario", "c_Location").getProperty("City"); EntityProviderReadProperties readProperties = mock(EntityProviderReadProperties.class); Map<String, Object> innerMappings = new HashMap<String, Object>(); innerMappings.put("PostalCode", String.class); Map<String, Object> typeMappings = new HashMap<String, Object>(); typeMappings.put("City", innerMappings); when(readProperties.getTypeMappings()).thenReturn(typeMappings); Map<String, Object> result = new JsonPropertyConsumer().readPropertyStandalone(reader, property, readProperties); assertEquals(1, result.size()); @SuppressWarnings("unchecked") Map<String, Object> innerResult = (Map<String, Object>) result.get("City"); assertEquals("Heidelberg", innerResult.get("CityName")); assertEquals("69124", innerResult.get("PostalCode")); } @Test public void deepComplexPropertyWithStringToStringMappingStandalone() throws Exception { final String complexPropertyJson = "{\"d\":{\"Location\":{\"__metadata\":{\"type\":\"RefScenario.c_Location\"},\"City\":{\"__metadata\":{\"type\":\"RefScenario.c_City\"},\"PostalCode\":\"69124\",\"CityName\":\"Heidelberg\"},\"Country\":\"Germany\"}}}"; JsonReader reader = prepareReader(complexPropertyJson); EdmProperty edmProperty = (EdmProperty) MockFacade.getMockEdm().getDefaultEntityContainer().getEntitySet("Employees").getEntityType().getProperty("Location"); EntityProviderReadProperties readProperties = mock(EntityProviderReadProperties.class); Map<String, Object> cityMappings = new HashMap<String, Object>(); cityMappings.put("PostalCode", String.class); Map<String, Object> locationMappings = new HashMap<String, Object>(); locationMappings.put("City", cityMappings); Map<String, Object> mappings = new HashMap<String, Object>(); mappings.put("Location", locationMappings); when(readProperties.getTypeMappings()).thenReturn(mappings); final Map<String, Object> result = new JsonPropertyConsumer().readPropertyStandalone(reader, edmProperty, readProperties); assertEquals(1, result.size()); @SuppressWarnings("unchecked") Map<String, Object> locationResult = (Map<String, Object>) result.get("Location"); assertEquals(2, locationResult.size()); assertEquals("Germany", locationResult.get("Country")); @SuppressWarnings("unchecked") Map<String, Object> innerResult = (Map<String, Object>) locationResult.get("City"); assertEquals(2, innerResult.size()); assertEquals("Heidelberg", innerResult.get("CityName")); assertEquals("69124", innerResult.get("PostalCode")); } @Test public void complexPropertyOnOpenReader() throws Exception { final String complexPropertyJson = "{\"__metadata\":{\"type\":\"RefScenario.c_City\"},\"PostalCode\":\"69124\",\"CityName\":\"Heidelberg\"}"; JsonReader reader = prepareReader(complexPropertyJson); final EdmProperty property = (EdmProperty) MockFacade.getMockEdm().getComplexType("RefScenario", "c_Location").getProperty("City"); EntityComplexPropertyInfo entityPropertyInfo = (EntityComplexPropertyInfo) EntityInfoAggregator.create(property); JsonPropertyConsumer jpc = new JsonPropertyConsumer(); @SuppressWarnings("unchecked") Map<String, Object> result = (Map<String, Object>) jpc.readPropertyValue(reader, entityPropertyInfo, null); assertEquals(2, result.size()); assertEquals("Heidelberg", result.get("CityName")); assertEquals("69124", result.get("PostalCode")); } @Test public void complexPropertyOnOpenReaderWithNoMetadata() throws Exception { final String complexPropertyJson = "{\"PostalCode\":\"69124\",\"CityName\":\"Heidelberg\"}"; JsonReader reader = prepareReader(complexPropertyJson); final EdmProperty property = (EdmProperty) MockFacade.getMockEdm().getComplexType("RefScenario", "c_Location").getProperty("City"); EntityComplexPropertyInfo entityPropertyInfo = (EntityComplexPropertyInfo) EntityInfoAggregator.create(property); JsonPropertyConsumer jpc = new JsonPropertyConsumer(); @SuppressWarnings("unchecked") Map<String, Object> result = (Map<String, Object>) jpc.readPropertyValue(reader, entityPropertyInfo, null); assertEquals(2, result.size()); assertEquals("Heidelberg", result.get("CityName")); assertEquals("69124", result.get("PostalCode")); } @Test public void deepComplexPropertyOnOpenReader() throws Exception { final String complexPropertyJson = "{\"__metadata\":{\"type\":\"RefScenario.c_Location\"},\"City\":{\"__metadata\":{\"type\":\"RefScenario.c_City\"},\"PostalCode\":\"69124\",\"CityName\":\"Heidelberg\"},\"Country\":\"Germany\"}"; JsonReader reader = prepareReader(complexPropertyJson); EdmProperty edmProperty = (EdmProperty) MockFacade.getMockEdm().getDefaultEntityContainer().getEntitySet("Employees").getEntityType().getProperty("Location"); EntityComplexPropertyInfo entityPropertyInfo = (EntityComplexPropertyInfo) EntityInfoAggregator.create(edmProperty); JsonPropertyConsumer jpc = new JsonPropertyConsumer(); @SuppressWarnings("unchecked") Map<String, Object> result = (Map<String, Object>) jpc.readPropertyValue(reader, entityPropertyInfo, null); assertEquals(2, result.size()); assertEquals("Germany", result.get("Country")); @SuppressWarnings("unchecked") Map<String, Object> innerResult = (Map<String, Object>) result.get("City"); assertEquals(2, innerResult.size()); assertEquals("Heidelberg", innerResult.get("CityName")); assertEquals("69124", innerResult.get("PostalCode")); } @Test public void simplePropertyStandalone() throws Exception { String simplePropertyJson = "{\"d\":{\"Name\":\"Team 1\"}}"; EdmProperty edmProperty = (EdmProperty) MockFacade.getMockEdm().getDefaultEntityContainer().getEntitySet("Teams").getEntityType().getProperty("Name"); JsonReader reader = prepareReader(simplePropertyJson); Map<String, Object> result = new JsonPropertyConsumer().readPropertyStandalone(reader, edmProperty, null); assertEquals("Team 1", result.get("Name")); } @Test public void complexPropertyStandalone() throws Exception { final String complexPropertyJson = "{\"d\":{\"City\":{\"__metadata\":{\"type\":\"RefScenario.c_City\"},\"PostalCode\":\"69124\",\"CityName\":\"Heidelberg\"}}}"; JsonReader reader = prepareReader(complexPropertyJson); final EdmProperty property = (EdmProperty) MockFacade.getMockEdm().getComplexType("RefScenario", "c_Location").getProperty("City"); final Map<String, Object> result = new JsonPropertyConsumer().readPropertyStandalone(reader, property, null); assertEquals(1, result.size()); @SuppressWarnings("unchecked") Map<String, Object> innerResult = (Map<String, Object>) result.get("City"); assertEquals("Heidelberg", innerResult.get("CityName")); assertEquals("69124", innerResult.get("PostalCode")); } @Test public void deepComplexPropertyStandalone() throws Exception { final String complexPropertyJson = "{\"d\":{\"Location\":{\"__metadata\":{\"type\":\"RefScenario.c_Location\"},\"City\":{\"__metadata\":{\"type\":\"RefScenario.c_City\"},\"PostalCode\":\"69124\",\"CityName\":\"Heidelberg\"},\"Country\":\"Germany\"}}}"; JsonReader reader = prepareReader(complexPropertyJson); EdmProperty edmProperty = (EdmProperty) MockFacade.getMockEdm().getDefaultEntityContainer().getEntitySet("Employees").getEntityType().getProperty("Location"); JsonPropertyConsumer jpc = new JsonPropertyConsumer(); Map<String, Object> result = jpc.readPropertyStandalone(reader, edmProperty, null); assertEquals(1, result.size()); @SuppressWarnings("unchecked") Map<String, Object> locationResult = (Map<String, Object>) result.get("Location"); assertEquals(2, locationResult.size()); assertEquals("Germany", locationResult.get("Country")); @SuppressWarnings("unchecked") Map<String, Object> innerResult = (Map<String, Object>) locationResult.get("City"); assertEquals(2, innerResult.size()); assertEquals("Heidelberg", innerResult.get("CityName")); assertEquals("69124", innerResult.get("PostalCode")); } @Test(expected = EntityProviderException.class) public void complexPropertyWithInvalidChild() throws Exception { String cityProperty = "{\"d\":{\"City\":{\"Invalid\":\"69124\",\"CityName\":\"Heidelberg\"}}}"; JsonReader reader = prepareReader(cityProperty); final EdmProperty property = (EdmProperty) MockFacade.getMockEdm().getComplexType("RefScenario", "c_Location").getProperty("City"); new JsonPropertyConsumer().readPropertyStandalone(reader, property, null); } @Test(expected = EntityProviderException.class) public void complexPropertyWithInvalidName() throws Exception { String cityProperty = "{\"d\":{\"Invalid\":{\"PostalCode\":\"69124\",\"CityName\":\"Heidelberg\"}}}"; JsonReader reader = prepareReader(cityProperty); final EdmProperty property = (EdmProperty) MockFacade.getMockEdm().getComplexType("RefScenario", "c_Location").getProperty("City"); new JsonPropertyConsumer().readPropertyStandalone(reader, property, null); } @Test public void complexPropertyNull() throws Exception { final String locationProperty = "{\"Location\":null}"; JsonReader reader = prepareReader(locationProperty); final EdmProperty property = (EdmProperty) MockFacade.getMockEdm().getDefaultEntityContainer().getEntitySet("Employees").getEntityType().getProperty("Location"); final Map<String, Object> propertyData = new JsonPropertyConsumer().readPropertyStandalone(reader, property, null); assertNotNull(propertyData); assertEquals(1, propertyData.size()); assertTrue(propertyData.containsKey("Location")); assertNull(propertyData.get("Location")); } @Test(expected = EntityProviderException.class) public void complexPropertyNullValueNotAllowed() throws Exception { final String locationProperty = "{\"Location\":null}"; JsonReader reader = prepareReader(locationProperty); EdmProperty property = (EdmProperty) MockFacade.getMockEdm().getDefaultEntityContainer().getEntitySet("Employees").getEntityType().getProperty("Location"); EdmFacets facets = mock(EdmFacets.class); when(facets.isNullable()).thenReturn(false); when(property.getFacets()).thenReturn(facets); new JsonPropertyConsumer().readPropertyStandalone(reader, property, null); } @Test public void complexPropertyEmpty() throws Exception { final String cityProperty = "{\"d\":{\"City\":{}}}"; JsonReader reader = prepareReader(cityProperty); final EdmProperty property = (EdmProperty) MockFacade.getMockEdm().getComplexType("RefScenario", "c_Location").getProperty("City"); final Map<String, Object> propertyData = new JsonPropertyConsumer().readPropertyStandalone(reader, property, null); assertNotNull(propertyData); assertEquals(1, propertyData.size()); assertNotNull(propertyData.get("City")); @SuppressWarnings("unchecked") final Map<String, Object> innerMap = (Map<String, Object>) propertyData.get("City"); assertTrue(innerMap.isEmpty()); } @Test(expected = EntityProviderException.class) public void complexPropertyMetadataInvalidTag() throws Exception { String complexPropertyJson = "{\"__metadata\":{\"invalid\":\"RefScenario.c_City\"},\"PostalCode\":\"69124\",\"CityName\":\"Heidelberg\"}"; JsonReader reader = prepareReader(complexPropertyJson); final EdmProperty property = (EdmProperty) MockFacade.getMockEdm().getComplexType("RefScenario", "c_Location").getProperty("City"); EntityComplexPropertyInfo entityPropertyInfo = (EntityComplexPropertyInfo) EntityInfoAggregator.create(property); new JsonPropertyConsumer().readPropertyValue(reader, entityPropertyInfo, null); } @Test(expected = EntityProviderException.class) public void complexPropertyMetadataInvalidTypeContent() throws Exception { String complexPropertyJson = "{\"__metadata\":{\"type\":\"Invalid\"},\"PostalCode\":\"69124\",\"CityName\":\"Heidelberg\"}"; JsonReader reader = prepareReader(complexPropertyJson); final EdmProperty property = (EdmProperty) MockFacade.getMockEdm().getComplexType("RefScenario", "c_Location").getProperty("City"); EntityComplexPropertyInfo entityPropertyInfo = (EntityComplexPropertyInfo) EntityInfoAggregator.create(property); new JsonPropertyConsumer().readPropertyValue(reader, entityPropertyInfo, null); } private JsonReader prepareReader(final String json) throws UnsupportedEncodingException { InputStream jsonStream = createContentAsStream(json); JsonReader reader = new JsonReader(new InputStreamReader(jsonStream)); return reader; } private Map<String, Object> execute(final EdmProperty edmProperty, final JsonReader reader) throws EntityProviderException { JsonPropertyConsumer jpc = new JsonPropertyConsumer(); Map<String, Object> resultMap = jpc.readPropertyStandalone(reader, edmProperty, null); return resultMap; } private InputStream createContentAsStream(final String json) throws UnsupportedEncodingException { return new ByteArrayInputStream(json.getBytes("UTF-8")); } @Test(expected = EntityProviderException.class) public void invalidDoubleClosingBrackets() throws Exception { String simplePropertyJson = "{\"d\":{\"Name\":\"Team 1\"}}}"; EdmProperty edmProperty = (EdmProperty) MockFacade.getMockEdm().getDefaultEntityContainer().getEntitySet("Teams").getEntityType().getProperty("Name"); JsonReader reader = prepareReader(simplePropertyJson); new JsonPropertyConsumer().readPropertyStandalone(reader, edmProperty, null); } @Test(expected = EntityProviderException.class) public void invalidDoubleClosingBracketsWithoutD() throws Exception { String simplePropertyJson = "{\"Name\":\"Team 1\"}}"; EdmProperty edmProperty = (EdmProperty) MockFacade.getMockEdm().getDefaultEntityContainer().getEntitySet("Teams").getEntityType().getProperty("Name"); JsonReader reader = prepareReader(simplePropertyJson); new JsonPropertyConsumer().readPropertyStandalone(reader, edmProperty, null); } }