blob: 36b1ccab5607e4f8e109b3892257a4cd66ce09e2 [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.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.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import org.apache.olingo.odata2.api.edm.EdmFacets;
import org.apache.olingo.odata2.api.edm.EdmProperty;
import org.apache.olingo.odata2.api.edm.EdmSimpleTypeKind;
import org.apache.olingo.odata2.api.ep.EntityProviderException;
import org.apache.olingo.odata2.api.ep.EntityProviderReadProperties;
import org.apache.olingo.odata2.core.ep.aggregator.EntityComplexPropertyInfo;
import org.apache.olingo.odata2.core.ep.aggregator.EntityInfoAggregator;
import org.apache.olingo.odata2.core.ep.aggregator.EntityPropertyInfo;
import org.apache.olingo.odata2.testutil.fit.BaseTest;
import org.apache.olingo.odata2.testutil.mock.MockFacade;
import org.junit.Test;
import com.google.gson.stream.JsonReader;
/**
*
*/
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"));
// Double without "
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"));
// Single without "
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, 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(expected = EntityProviderException.class)
public void simplePropertyViolatingValidation() throws Exception {
EdmProperty property = (EdmProperty) MockFacade.getMockEdm().getEntityType("RefScenario", "Room")
.getProperty("Name");
EdmFacets facets = mock(EdmFacets.class);
when(facets.getMaxLength()).thenReturn(10);
when(property.getFacets()).thenReturn(facets);
new JsonPropertyConsumer().readPropertyStandalone(prepareReader("{\"Name\":\"TooLongName\"}"), property, null);
}
@Test
public void simplePropertyIgnoringValidation() throws Exception {
EdmProperty property = (EdmProperty) MockFacade.getMockEdm().getEntityType("RefScenario", "Room")
.getProperty("Name");
EdmFacets facets = mock(EdmFacets.class);
when(facets.getMaxLength()).thenReturn(10);
when(property.getFacets()).thenReturn(facets);
final EntityProviderReadProperties readProperties = mock(EntityProviderReadProperties.class);
final Map<String, Object> resultMap = new JsonPropertyConsumer()
.readPropertyStandalone(prepareReader("{\"Name\":\"TooLongName\"}"), property, readProperties);
assertTrue(resultMap.containsKey("Name"));
assertEquals("TooLongName", 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, 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, 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, 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 complexPropertyNullValueNotAllowedButNotValidated() throws Exception {
final 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);
final EntityProviderReadProperties readProperties = mock(EntityProviderReadProperties.class);
final Map<String, Object> propertyData = new JsonPropertyConsumer()
.readPropertyStandalone(prepareReader("{\"Location\":null}"), property, readProperties);
assertNotNull(propertyData);
assertEquals(1, propertyData.size());
assertTrue(propertyData.containsKey("Location"));
assertNull(propertyData.get("Location"));
}
@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, 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, 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;
}
@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);
}
@Test
public void collectionEmpty() throws Exception {
final EntityPropertyInfo info = EntityInfoAggregator.create(
MockFacade.getMockEdm().getDefaultEntityContainer().getFunctionImport("AllUsedRoomIds"));
List<?> collection = new JsonPropertyConsumer().readCollection(prepareReader("[]"), info, null);
assertNotNull(collection);
assertTrue(collection.isEmpty());
collection = new JsonPropertyConsumer().readCollection(prepareReader("{\"d\":[]}"), info, null);
assertNotNull(collection);
assertTrue(collection.isEmpty());
collection = new JsonPropertyConsumer().readCollection(prepareReader("{\"results\":[]}"), info, null);
assertNotNull(collection);
assertTrue(collection.isEmpty());
collection = new JsonPropertyConsumer().readCollection(prepareReader("{\"d\":{\"results\":[]}}"), info, null);
assertNotNull(collection);
assertTrue(collection.isEmpty());
}
@Test
public void collectionSimple() throws Exception {
final EntityPropertyInfo info = EntityInfoAggregator.create(
MockFacade.getMockEdm().getDefaultEntityContainer().getFunctionImport("AllUsedRoomIds"));
List<?> collection = new JsonPropertyConsumer().readCollection(prepareReader("[\"1\",\"42\"]"), info, null);
assertNotNull(collection);
assertEquals(Arrays.asList("1", "42"), collection);
}
@Test
public void collectionSimpleWithMetadata() throws Exception {
final EntityPropertyInfo info = EntityInfoAggregator.create(
MockFacade.getMockEdm().getDefaultEntityContainer().getFunctionImport("AllUsedRoomIds"));
List<?> collection = new JsonPropertyConsumer().readCollection(prepareReader(
"{\"__metadata\":{\"type\":\"Collection(Edm.String)\"},\"results\":[\"1\",\"42\"]}"),
info, null);
assertNotNull(collection);
assertEquals(Arrays.asList("1", "42"), collection);
}
@Test
public void collectionSimpleWithMapping() throws Exception {
final EntityPropertyInfo info = EntityInfoAggregator.create(
MockFacade.getMockEdm().getDefaultEntityContainer().getFunctionImport("AllUsedRoomIds"));
EntityProviderReadProperties readProperties = mock(EntityProviderReadProperties.class);
when(readProperties.getTypeMappings()).thenReturn(
Collections.<String, Object> singletonMap("AllUsedRoomIds", String.class));
List<?> collection = new JsonPropertyConsumer().readCollection(prepareReader("[\"1\",\"42\"]"), info,
readProperties);
assertNotNull(collection);
assertEquals(Arrays.asList("1", "42"), collection);
}
@Test
public void collectionComplex() throws Exception {
final EntityPropertyInfo info = EntityInfoAggregator.create(
MockFacade.getMockEdm().getDefaultEntityContainer().getFunctionImport("AllLocations"));
EntityProviderReadProperties readProperties = mock(EntityProviderReadProperties.class);
final Map<String, Object> mappings = Collections.<String, Object> singletonMap("Location",
Collections.<String, Object> singletonMap("City",
Collections.<String, Object> singletonMap("PostalCode", String.class)));
when(readProperties.getTypeMappings()).thenReturn(mappings);
List<?> collection = new JsonPropertyConsumer().readCollection(prepareReader(
"{\"__metadata\":{\"type\":\"Collection(RefScenario.c_Location)\"},"
+ "\"results\":["
+ "{\"City\":{\"PostalCode\":\"69124\",\"CityName\":\"Heidelberg\"},\"Country\":\"Germany\"},"
+ "{\"City\":{\"PostalCode\":\"69190\",\"CityName\":\"Walldorf\"},\"Country\":\"Germany\"}]}"),
info, readProperties);
assertNotNull(collection);
assertEquals(2, collection.size());
@SuppressWarnings("unchecked")
final Map<String, Object> secondLocation = (Map<String, Object>) collection.get(1);
assertEquals("Germany", secondLocation.get("Country"));
}
@Test(expected = EntityProviderException.class)
public void collectionUnfinished() throws Exception {
final EntityPropertyInfo info = EntityInfoAggregator.create(
MockFacade.getMockEdm().getDefaultEntityContainer().getFunctionImport("AllUsedRoomIds"));
new JsonPropertyConsumer().readCollection(prepareReader("[\"1\""), info, null);
}
@Test(expected = EntityProviderException.class)
public void collectionWithoutClosing() throws Exception {
final EntityPropertyInfo info = EntityInfoAggregator.create(
MockFacade.getMockEdm().getDefaultEntityContainer().getFunctionImport("AllUsedRoomIds"));
new JsonPropertyConsumer().readCollection(prepareReader("{\"results\":[]"), info, null);
}
@Test(expected = EntityProviderException.class)
public void collectionWithWrongTag() throws Exception {
final EntityPropertyInfo info = EntityInfoAggregator.create(
MockFacade.getMockEdm().getDefaultEntityContainer().getFunctionImport("AllUsedRoomIds"));
new JsonPropertyConsumer().readCollection(prepareReader("{\"something\":[]}"), info, null);
}
@Test(expected = EntityProviderException.class)
public void collectionWithWrongInnerTag() throws Exception {
final EntityPropertyInfo info = EntityInfoAggregator.create(
MockFacade.getMockEdm().getDefaultEntityContainer().getFunctionImport("AllUsedRoomIds"));
new JsonPropertyConsumer().readCollection(prepareReader("{\"d\":{\"something\":[]}}"), info, null);
}
@Test(expected = EntityProviderException.class)
public void collectionWithTrailing() throws Exception {
final EntityPropertyInfo info = EntityInfoAggregator.create(
MockFacade.getMockEdm().getDefaultEntityContainer().getFunctionImport("AllUsedRoomIds"));
new JsonPropertyConsumer().readCollection(prepareReader("{\"results\":[],\"a\":0}"), info, null);
}
private InputStream createContentAsStream(final String json) throws UnsupportedEncodingException {
return new ByteArrayInputStream(json.getBytes("UTF-8"));
}
}