/*******************************************************************************
* 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.fit.ref;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import org.apache.http.HttpResponse;
import org.apache.olingo.odata2.api.commons.HttpContentType;
import org.apache.olingo.odata2.api.commons.HttpHeaders;
import org.apache.olingo.odata2.api.edm.EdmEntityContainer;
import org.apache.olingo.odata2.api.ep.EntityProvider;
import org.apache.olingo.odata2.api.ep.EntityProviderReadProperties;
import org.apache.olingo.odata2.api.ep.entry.ODataEntry;
import org.apache.olingo.odata2.testutil.helper.StringHelper;
import org.apache.olingo.odata2.testutil.server.ServletType;
import org.junit.Test;
/**
* Tests employing the reference scenario reading function-import output in JSON format.
*
*/
public class FunctionImportJsonTest extends AbstractRefTest {
public FunctionImportJsonTest(final ServletType servletType) {
super(servletType);
}
private EdmEntityContainer getEntityContainer() throws Exception {
final HttpResponse response = callUri("$metadata");
final EdmEntityContainer entityContainer = EntityProvider.readMetadata(response.getEntity().getContent(), false)
.getDefaultEntityContainer();
getBody(response);
return entityContainer;
}
@Test
public void entityCollection() throws Exception {
final HttpResponse response = callUri("EmployeeSearch?q='nat'&$format=json");
checkMediaType(response, HttpContentType.APPLICATION_JSON);
final String body = getBody(response);
assertEquals(getBody(callUri("Employees?$filter=substringof('nat',EmployeeName)&$format=json")), body);
}
@Test
public void complexTypeCollection() throws Exception {
final HttpResponse response = callUri("AllLocations?$format=json");
checkMediaType(response, HttpContentType.APPLICATION_JSON);
final String body = getBody(response);
assertEquals("{\"d\":{\"__metadata\":{\"type\":\"Collection(RefScenario.c_Location)\"},"
+ "\"results\":[{\"__metadata\":{\"type\":\"RefScenario.c_Location\"},"
+ "\"City\":{\"__metadata\":{\"type\":\"RefScenario.c_City\"},"
+ "\"PostalCode\":\"69124\",\"CityName\":\"Heidelberg\"},\"Country\":\"Germany\"},"
+ "{\"__metadata\":{\"type\":\"RefScenario.c_Location\"},"
+ "\"City\":{\"__metadata\":{\"type\":\"RefScenario.c_City\"},"
+ "\"PostalCode\":\"69190\",\"CityName\":\"Walldorf\"},\"Country\":\"Germany\"}]}}",
body);
final Object result = EntityProvider.readFunctionImport(HttpContentType.APPLICATION_JSON,
getEntityContainer().getFunctionImport("AllLocations"), StringHelper.encapsulate(body),
EntityProviderReadProperties.init().build());
assertNotNull(result);
final List<?> collection = (List<?>) result;
@SuppressWarnings("unchecked")
final Map<String, Object> secondLocation = (Map<String, Object>) collection.get(1);
@SuppressWarnings("unchecked")
final Map<String, Object> secondCity = (Map<String, Object>) secondLocation.get("City");
assertEquals(CITY_2_NAME, secondCity.get("CityName"));
}
@Test
public void simpleTypeCollection() throws Exception {
final HttpResponse response = callUri("AllUsedRoomIds?$format=json");
checkMediaType(response, HttpContentType.APPLICATION_JSON);
final String body = getBody(response);
assertEquals("{\"d\":{\"__metadata\":{\"type\":\"Collection(Edm.String)\"},"
+ "\"results\":[\"1\",\"2\",\"3\"]}}",
body);
final Object result = EntityProvider.readFunctionImport(HttpContentType.APPLICATION_JSON,
getEntityContainer().getFunctionImport("AllUsedRoomIds"), StringHelper.encapsulate(body),
EntityProviderReadProperties.init().build());
assertNotNull(result);
assertEquals(Arrays.asList("1", "2", "3"), result);
}
@Test
public void simpleType() throws Exception {
final HttpResponse response = callUri("MaximalAge?$format=json");
checkMediaType(response, HttpContentType.APPLICATION_JSON);
final String body = getBody(response);
assertEquals("{\"d\":{\"MaximalAge\":56}}", body);
final Object result = EntityProvider.readFunctionImport(HttpContentType.APPLICATION_JSON,
getEntityContainer().getFunctionImport("MaximalAge"), StringHelper.encapsulate(body),
EntityProviderReadProperties.init().build());
assertNotNull(result);
assertEquals(Short.valueOf(EMPLOYEE_3_AGE), result);
}
@SuppressWarnings("unchecked")
@Test
public void complexType() throws Exception {
final HttpResponse response = callUri("MostCommonLocation?$format=json");
checkMediaType(response, HttpContentType.APPLICATION_JSON);
final String body = getBody(response);
assertEquals("{\"d\":{\"MostCommonLocation\":"
+ "{\"__metadata\":{\"type\":\"RefScenario.c_Location\"},"
+ "\"City\":{\"__metadata\":{\"type\":\"RefScenario.c_City\"},"
+ "\"PostalCode\":\"69190\",\"CityName\":\"" + CITY_2_NAME + "\"},"
+ "\"Country\":\"Germany\"}}}",
body);
final Object result = EntityProvider.readFunctionImport(HttpContentType.APPLICATION_JSON,
getEntityContainer().getFunctionImport("MostCommonLocation"), StringHelper.encapsulate(body),
EntityProviderReadProperties.init().build());
assertNotNull(result);
Map<String, Object> resultMap = (Map<String, Object>) result;
assertNotNull(resultMap);
assertFalse(resultMap.isEmpty());
resultMap = (Map<String, Object>) resultMap.get("City");
assertNotNull(resultMap);
assertFalse(resultMap.isEmpty());
assertEquals(CITY_2_NAME, resultMap.get("CityName"));
}
@Test
public void binary() throws Exception {
final HttpResponse response = callUri("ManagerPhoto?Id='1'&$format=json");
checkMediaType(response, HttpContentType.APPLICATION_JSON);
assertTrue(getBody(response).startsWith("{\"d\":{\"ManagerPhoto\":\"iVBORw0KGgoAAAAN"));
}
@Test
public void entity() throws Exception {
final String expected = getBody(callUri("Employees('3')?$format=json"));
final HttpResponse response = callUri("OldestEmployee", HttpHeaders.ACCEPT, HttpContentType.APPLICATION_JSON);
checkMediaType(response, HttpContentType.APPLICATION_JSON);
final String body = getBody(response);
assertEquals(expected, body);
final Object result = EntityProvider.readFunctionImport(HttpContentType.APPLICATION_JSON,
getEntityContainer().getFunctionImport("OldestEmployee"), StringHelper.encapsulate(body),
EntityProviderReadProperties.init().build());
assertNotNull(result);
final ODataEntry entry = (ODataEntry) result;
assertEquals("3", entry.getProperties().get("EmployeeId"));
}
}