/**
* Copyright 2010-2016 Ralph Schaer <ralphschaer@gmail.com>
*
* 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 ch.ralscha.extdirectspring.controller;
import static org.assertj.core.api.Assertions.assertThat;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.MvcResult;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import ch.ralscha.extdirectspring.bean.EdStoreResult;
import ch.ralscha.extdirectspring.bean.ExtDirectResponse;
import ch.ralscha.extdirectspring.bean.ExtDirectStoreResult;
import ch.ralscha.extdirectspring.provider.RemoteProviderTreeLoad.Node;
import ch.ralscha.extdirectspring.provider.Row;
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration("classpath:/testApplicationContext.xml")
@SuppressWarnings("unchecked")
public class RouterControllerMetadataTest {
@Autowired
private WebApplicationContext wac;
private MockMvc mockMvc;
@BeforeClass
public static void beforeTest() {
Locale.setDefault(Locale.US);
}
@Before
public void setupMockMvc() throws Exception {
this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build();
}
@Test
public void testWithMetadataParameter() {
Map<String, Object> readRequest = new HashMap<String, Object>();
readRequest.put("id", 10);
readRequest.put("query", "name");
Map<String, Object> metadata = new HashMap<String, Object>();
metadata.put("mp", "aMetadataValue");
ExtDirectStoreResult<Row> storeResponse = (ExtDirectStoreResult<Row>) ControllerUtil
.sendAndReceive(this.mockMvc, "remoteProviderMetadata", "method1",
metadata, new TypeReference<ExtDirectStoreResult<Row>>() {
// nothing here
}, readRequest);
assertThat(storeResponse.getTotal()).isEqualTo(50L);
assertThat(storeResponse.getRecords()).hasSize(50);
int ix = 0;
for (Row row : storeResponse.getRecords()) {
assertThat(row.getName()).startsWith("name: " + ix + ":10;aMetadataValue;en");
ix += 2;
}
readRequest = new HashMap<String, Object>();
readRequest.put("id", 10);
readRequest.put("query", "name");
storeResponse = (ExtDirectStoreResult<Row>) ControllerUtil.sendAndReceive(
this.mockMvc, "remoteProviderMetadata", "method1", null, null,
readRequest);
}
@Test
public void testWithMetadataParameterDefaultValue() {
Map<String, Object> readRequest = new HashMap<String, Object>();
readRequest.put("query", "firstname");
ExtDirectStoreResult<Row> storeResponse = (ExtDirectStoreResult<Row>) ControllerUtil
.sendAndReceive(this.mockMvc, "remoteProviderMetadata", "method2", null,
new TypeReference<ExtDirectStoreResult<Row>>() {
// nothing here
}, readRequest);
assertThat(storeResponse.getTotal()).isEqualTo(50L);
assertThat(storeResponse.getRecords()).hasSize(50);
int i = 1;
for (Row row : storeResponse.getRecords()) {
assertThat(row.getName()).isEqualTo("firstname: " + i + ":1;true");
i += 2;
}
}
@Test
public void testWithMetadataParameterEd() {
Map<String, Object> readRequest = new HashMap<String, Object>();
readRequest.put("id", 10);
readRequest.put("query", "name");
Map<String, Object> metadata = new HashMap<String, Object>();
metadata.put("mp", "aMetadataValue");
EdStoreResult storeResponse = (EdStoreResult) ControllerUtil.sendAndReceive(
this.mockMvc, "remoteProviderMetadata", "method1Ed", metadata,
EdStoreResult.class, readRequest);
assertThat(storeResponse.total()).isEqualTo(50L);
assertThat(storeResponse.records()).hasSize(50);
int ix = 0;
ObjectMapper om = new ObjectMapper();
for (Map<String, Object> m : (Collection<Map<String, Object>>) storeResponse
.records()) {
Row row = om.convertValue(m, Row.class);
assertThat(row.getName()).startsWith("name: " + ix + ":10;aMetadataValue;en");
ix += 2;
}
readRequest = new HashMap<String, Object>();
readRequest.put("id", 10);
readRequest.put("query", "name");
storeResponse = (EdStoreResult) ControllerUtil.sendAndReceive(this.mockMvc,
"remoteProviderMetadata", "method1Ed", null, null, readRequest);
}
@Test
public void testWithMetadataParameterDefaultValueEd() {
Map<String, Object> readRequest = new HashMap<String, Object>();
readRequest.put("query", "firstname");
EdStoreResult storeResponse = (EdStoreResult) ControllerUtil.sendAndReceive(
this.mockMvc, "remoteProviderMetadata", "method2Ed", null,
EdStoreResult.class, readRequest);
assertThat(storeResponse.total()).isEqualTo(50L);
assertThat(storeResponse.records()).hasSize(50);
int i = 1;
ObjectMapper om = new ObjectMapper();
for (Map<String, Object> m : (Collection<Map<String, Object>>) storeResponse
.records()) {
Row row = om.convertValue(m, Row.class);
assertThat(row.getName()).isEqualTo("firstname: " + i + ":1;true");
i += 2;
}
}
@Test
public void testWithMetadataParameterOptional() {
List<Row> rows = (List<Row>) ControllerUtil.sendAndReceive(this.mockMvc,
"remoteProviderMetadata", "method3", null,
new TypeReference<List<Row>>() {
// nothing here
});
RouterControllerStoreTest.assert100Rows(rows, ":null");
Map<String, Object> readRequest = new HashMap<String, Object>();
readRequest.put("query", "");
Map<String, Object> metadata = new HashMap<String, Object>();
metadata.put("id", "12");
rows = (List<Row>) ControllerUtil.sendAndReceive(this.mockMvc,
"remoteProviderMetadata", "method3", metadata,
new TypeReference<List<Row>>() {
// nothing here
}, readRequest);
RouterControllerStoreTest.assert100Rows(rows, ":12");
}
@Test
public void testWithMetadataParameterJava8Optional() {
List<Row> rows = (List<Row>) ControllerUtil.sendAndReceive(this.mockMvc,
"remoteProviderMetadata", "method4", null,
new TypeReference<List<Row>>() {
// nothing here
});
RouterControllerStoreTest.assert100Rows(rows, ":null");
Map<String, Object> readRequest = new HashMap<String, Object>();
readRequest.put("query", "");
Map<String, Object> metadata = new HashMap<String, Object>();
metadata.put("id", "13");
rows = (List<Row>) ControllerUtil.sendAndReceive(this.mockMvc,
"remoteProviderMetadata", "method4", metadata,
new TypeReference<List<Row>>() {
// nothing here
}, readRequest);
RouterControllerStoreTest.assert100Rows(rows, ":13");
}
@Test
public void testWithMetadataParameterOptionalDefaultValue() {
Map<String, Object> readRequest = new HashMap<String, Object>();
readRequest.put("query", "name");
Map<String, Object> metadata = new HashMap<String, Object>();
metadata.put("id", "10");
ExtDirectStoreResult<Row> storeResponse = (ExtDirectStoreResult<Row>) ControllerUtil
.sendAndReceive(this.mockMvc, "remoteProviderMetadata", "method5",
metadata, new TypeReference<ExtDirectStoreResult<Row>>() {
// nothing here
}, readRequest);
assertThat(storeResponse.getTotal()).isEqualTo(50L);
assertThat(storeResponse.getRecords()).hasSize(50);
int ix = 0;
for (Row row : storeResponse.getRecords()) {
assertThat(row.getName()).startsWith("name: " + ix + ":10;en");
ix += 2;
}
readRequest = new HashMap<String, Object>();
readRequest.put("query", "name");
storeResponse = (ExtDirectStoreResult<Row>) ControllerUtil.sendAndReceive(
this.mockMvc, "remoteProviderMetadata", "method5", null,
new TypeReference<ExtDirectStoreResult<Row>>() {
// nothing here
}, readRequest);
assertThat(storeResponse.getTotal()).isEqualTo(50L);
assertThat(storeResponse.getRecords()).hasSize(50);
ix = 0;
for (Row row : storeResponse.getRecords()) {
assertThat(row.getName()).startsWith("name: " + ix + ":20;en");
ix += 2;
}
}
@Test
public void testWithMetadataParameterJava8OptionalDefaultValue() {
Map<String, Object> readRequest = new HashMap<String, Object>();
readRequest.put("query", "name");
Map<String, Object> metadata = new HashMap<String, Object>();
metadata.put("id", "10");
ExtDirectStoreResult<Row> storeResponse = (ExtDirectStoreResult<Row>) ControllerUtil
.sendAndReceive(this.mockMvc, "remoteProviderMetadata", "method6",
metadata, new TypeReference<ExtDirectStoreResult<Row>>() {
// nothing here
}, readRequest);
assertThat(storeResponse.getTotal()).isEqualTo(50L);
assertThat(storeResponse.getRecords()).hasSize(50);
int ix = 0;
for (Row row : storeResponse.getRecords()) {
assertThat(row.getName()).startsWith("name: " + ix + ":10;en");
ix += 2;
}
readRequest = new HashMap<String, Object>();
readRequest.put("query", "name");
storeResponse = (ExtDirectStoreResult<Row>) ControllerUtil.sendAndReceive(
this.mockMvc, "remoteProviderMetadata", "method6", null,
new TypeReference<ExtDirectStoreResult<Row>>() {
// nothing here
}, readRequest);
assertThat(storeResponse.getTotal()).isEqualTo(50L);
assertThat(storeResponse.getRecords()).hasSize(50);
ix = 0;
for (Row row : storeResponse.getRecords()) {
assertThat(row.getName()).startsWith("name: " + ix + ":20;en");
ix += 2;
}
}
@Test
public void testWithMetadataParameterOptionalDefaultValueEd() {
Map<String, Object> readRequest = new HashMap<String, Object>();
readRequest.put("query", "name");
Map<String, Object> metadata = new HashMap<String, Object>();
metadata.put("id", "10");
EdStoreResult storeResponse = (EdStoreResult) ControllerUtil.sendAndReceive(
this.mockMvc, "remoteProviderMetadata", "method5Ed", metadata,
EdStoreResult.class, readRequest);
assertThat(storeResponse.total()).isEqualTo(50L);
assertThat(storeResponse.records()).hasSize(50);
int ix = 0;
ObjectMapper om = new ObjectMapper();
for (Map<String, Object> m : (Collection<Map<String, Object>>) storeResponse
.records()) {
Row row = om.convertValue(m, Row.class);
assertThat(row.getName()).startsWith("name: " + ix + ":10;en");
ix += 2;
}
readRequest = new HashMap<String, Object>();
readRequest.put("query", "name");
storeResponse = (EdStoreResult) ControllerUtil.sendAndReceive(this.mockMvc,
"remoteProviderMetadata", "method5Ed", null, EdStoreResult.class,
readRequest);
assertThat(storeResponse.total()).isEqualTo(50L);
assertThat(storeResponse.records()).hasSize(50);
ix = 0;
for (Map<String, Object> m : (Collection<Map<String, Object>>) storeResponse
.records()) {
Row row = om.convertValue(m, Row.class);
assertThat(row.getName()).startsWith("name: " + ix + ":20;en");
ix += 2;
}
}
@Test
public void testWithMetadataParameterJava8OptionalDefaultValueEd() {
Map<String, Object> readRequest = new HashMap<String, Object>();
readRequest.put("query", "name");
Map<String, Object> metadata = new HashMap<String, Object>();
metadata.put("id", "10");
EdStoreResult storeResponse = (EdStoreResult) ControllerUtil.sendAndReceive(
this.mockMvc, "remoteProviderMetadata", "method6Ed", metadata,
EdStoreResult.class, readRequest);
assertThat(storeResponse.total()).isEqualTo(50L);
assertThat(storeResponse.records()).hasSize(50);
int ix = 0;
ObjectMapper om = new ObjectMapper();
for (Map<String, Object> m : (Collection<Map<String, Object>>) storeResponse
.records()) {
Row row = om.convertValue(m, Row.class);
assertThat(row.getName()).startsWith("name: " + ix + ":10;en");
ix += 2;
}
readRequest = new HashMap<String, Object>();
readRequest.put("query", "name");
storeResponse = (EdStoreResult) ControllerUtil.sendAndReceive(this.mockMvc,
"remoteProviderMetadata", "method6Ed", null, EdStoreResult.class,
readRequest);
assertThat(storeResponse.total()).isEqualTo(50L);
assertThat(storeResponse.records()).hasSize(50);
ix = 0;
for (Map<String, Object> m : (Collection<Map<String, Object>>) storeResponse
.records()) {
Row row = om.convertValue(m, Row.class);
assertThat(row.getName()).startsWith("name: " + ix + ":20;en");
ix += 2;
}
}
@Test
public void testUpdateWithMetadataParam() throws Exception {
Map<String, Object> storeRequest = new LinkedHashMap<String, Object>();
List<Row> rowsToUpdate = new ArrayList<Row>();
rowsToUpdate.add(new Row(10, "Ralph", true, "109.55"));
storeRequest.put("records", rowsToUpdate);
Map<String, Object> metadata = new HashMap<String, Object>();
metadata.put("id", 10);
executeUpdate(this.mockMvc, "remoteProviderMetadata", "update1", storeRequest,
metadata);
}
@Test
public void testUpdateWithMetadataParamDefaultValue() throws Exception {
Map<String, Object> storeRequest = new LinkedHashMap<String, Object>();
List<Row> rowsToUpdate = new ArrayList<Row>();
rowsToUpdate.add(new Row(10, "Ralph", true, "109.55"));
storeRequest.put("records", rowsToUpdate);
Map<String, Object> metadata = new HashMap<String, Object>();
metadata.put("id", 1);
executeUpdate(this.mockMvc, "remoteProviderMetadata", "update2", storeRequest,
metadata);
executeUpdate(this.mockMvc, "remoteProviderMetadata", "update2", storeRequest,
null);
}
@Test
public void testUpdateWithMetadataParamJava8Optional() throws Exception {
Map<String, Object> storeRequest = new LinkedHashMap<String, Object>();
List<Row> rowsToUpdate = new ArrayList<Row>();
rowsToUpdate.add(new Row(10, "Ralph", true, "109.55"));
storeRequest.put("records", rowsToUpdate);
Map<String, Object> metadata = new HashMap<String, Object>();
metadata.put("id", 2);
executeUpdate(this.mockMvc, "remoteProviderMetadata", "update3", storeRequest,
metadata);
executeUpdate(this.mockMvc, "remoteProviderMetadata", "update3", storeRequest,
null);
}
private static void executeUpdate(MockMvc mockMvc, String action, String method,
Map<String, Object> storeRequest, Map<String, Object> metadata)
throws Exception {
String edRequest = ControllerUtil.createEdsRequest(action, method, false, 1,
storeRequest, metadata);
MvcResult mvcResult = ControllerUtil.performRouterRequest(mockMvc, edRequest);
List<ExtDirectResponse> responses = ControllerUtil
.readDirectResponses(mvcResult.getResponse().getContentAsByteArray());
assertThat(responses).hasSize(1);
ExtDirectResponse resp = responses.get(0);
assertThat(resp.getAction()).isEqualTo(action);
assertThat(resp.getMethod()).isEqualTo(method);
assertThat(resp.getType()).isEqualTo("rpc");
assertThat(resp.getTid()).isEqualTo(1);
assertThat(resp.getMessage()).isNull();
assertThat(resp.getWhere()).isNull();
assertThat(resp.getResult()).isNotNull();
Object result = resp.getResult();
if (result instanceof List) {
List<Row> storeResponse = ControllerUtil.convertValue(result,
new TypeReference<List<Row>>() {/* nothing_here */
});
assertThat(storeResponse).hasSize(1);
assertThat(storeResponse.get(0).getId()).isEqualTo(10);
assertThat(storeResponse.get(0).getName()).isEqualTo("Ralph");
assertThat(storeResponse.get(0).isAdmin()).isTrue();
assertThat(storeResponse.get(0).getSalary())
.isEqualTo(new BigDecimal("109.55"));
}
else {
Row storeResponse = ControllerUtil.convertValue(result, Row.class);
assertThat(storeResponse.getId()).isEqualTo(10);
assertThat(storeResponse.getName()).isEqualTo("Ralph");
assertThat(storeResponse.isAdmin()).isTrue();
assertThat(storeResponse.getSalary()).isEqualTo(new BigDecimal("109.55"));
}
}
@Test
public void testTreeLoadMetadataParam() {
Map<String, Object> requestParameters = new LinkedHashMap<String, Object>();
requestParameters.put("node", "root");
requestParameters.put("foo", "foo");
Map<String, Object> metadata = new HashMap<String, Object>();
metadata.put("id", 2);
List<Node> nodes = (List<Node>) ControllerUtil.sendAndReceive(this.mockMvc,
"remoteProviderMetadata", "treeLoad1", metadata,
new TypeReference<List<Node>>() {/* nothinghere */
}, requestParameters);
String appendix = ":foo;2";
assertThat(nodes).hasSize(5).containsSequence(
new Node("n1", "Node 1" + appendix, false),
new Node("n2", "Node 2" + appendix, false),
new Node("n3", "Node 3" + appendix, false),
new Node("n4", "Node 4" + appendix, false),
new Node("n5", "Node 5" + appendix, false));
ControllerUtil.sendAndReceive(this.mockMvc, "remoteProviderMetadata", "treeLoad1",
null, null, requestParameters);
}
@Test
public void testTreeLoadMetadataParamOptional() {
Map<String, Object> requestParameters = new LinkedHashMap<String, Object>();
requestParameters.put("node", "root");
requestParameters.put("foo", "foo");
Map<String, Object> metadata = new HashMap<String, Object>();
metadata.put("id", 22);
List<Node> nodes = (List<Node>) ControllerUtil.sendAndReceive(this.mockMvc,
"remoteProviderMetadata", "treeLoad2", metadata,
new TypeReference<List<Node>>() {/* nothinghere */
}, requestParameters);
String appendix = ":foo;22";
assertThat(nodes).hasSize(5).containsSequence(
new Node("n1", "Node 1" + appendix, false),
new Node("n2", "Node 2" + appendix, false),
new Node("n3", "Node 3" + appendix, false),
new Node("n4", "Node 4" + appendix, false),
new Node("n5", "Node 5" + appendix, false));
nodes = (List<Node>) ControllerUtil.sendAndReceive(this.mockMvc,
"remoteProviderMetadata", "treeLoad2", null,
new TypeReference<List<Node>>() {/* nothinghere */
}, requestParameters);
appendix = ":foo;22";
assertThat(nodes).hasSize(5).containsSequence(
new Node("n1", "Node 1" + appendix, false),
new Node("n2", "Node 2" + appendix, false),
new Node("n3", "Node 3" + appendix, false),
new Node("n4", "Node 4" + appendix, false),
new Node("n5", "Node 5" + appendix, false));
}
@Test
public void testTreeLoadMetadataParamJava8Optional() {
Map<String, Object> requestParameters = new LinkedHashMap<String, Object>();
requestParameters.put("node", "root");
requestParameters.put("foo", "foo");
Map<String, Object> metadata = new HashMap<String, Object>();
metadata.put("id", 23);
List<Node> nodes = (List<Node>) ControllerUtil.sendAndReceive(this.mockMvc,
"remoteProviderMetadata", "treeLoad3", metadata,
new TypeReference<List<Node>>() {/* nothinghere */
}, requestParameters);
String appendix = ":foo;23";
assertThat(nodes).hasSize(5).containsSequence(
new Node("n1", "Node 1" + appendix, false),
new Node("n2", "Node 2" + appendix, false),
new Node("n3", "Node 3" + appendix, false),
new Node("n4", "Node 4" + appendix, false),
new Node("n5", "Node 5" + appendix, false));
nodes = (List<Node>) ControllerUtil.sendAndReceive(this.mockMvc,
"remoteProviderMetadata", "treeLoad3", null,
new TypeReference<List<Node>>() {/* nothinghere */
}, requestParameters);
appendix = ":foo;23";
assertThat(nodes).hasSize(5).containsSequence(
new Node("n1", "Node 1" + appendix, false),
new Node("n2", "Node 2" + appendix, false),
new Node("n3", "Node 3" + appendix, false),
new Node("n4", "Node 4" + appendix, false),
new Node("n5", "Node 5" + appendix, false));
}
}