/*
* Copyright (c) MuleSoft, Inc. All rights reserved. http://www.mulesoft.com
* The software in this package is published under the terms of the CPAL v1.0
* license, a copy of which has been included with this distribution in the
* LICENSE.txt file.
*/
package org.mule.runtime.core.util;
import static org.hamcrest.CoreMatchers.allOf;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.hasEntry;
import static org.hamcrest.Matchers.hasProperty;
import static org.mockito.AdditionalAnswers.returnsFirstArg;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import static org.mule.runtime.api.metadata.DataType.BOOLEAN;
import static org.mule.runtime.api.metadata.DataType.INPUT_STREAM;
import static org.mule.runtime.api.metadata.DataType.NUMBER;
import static org.mule.runtime.api.metadata.DataType.OBJECT;
import static org.mule.runtime.api.metadata.DataType.STRING;
import static org.mule.runtime.api.metadata.MediaType.APPLICATION_JAVA;
import static org.mule.runtime.api.metadata.MediaType.APPLICATION_JSON;
import org.mule.runtime.api.exception.MuleException;
import org.mule.runtime.api.message.Message;
import org.mule.runtime.api.metadata.DataType;
import org.mule.runtime.api.metadata.MediaType;
import org.mule.runtime.api.streaming.CursorProvider;
import org.mule.runtime.core.api.Event;
import org.mule.runtime.core.api.expression.ExpressionRuntimeException;
import org.mule.runtime.core.api.registry.RegistrationException;
import org.mule.runtime.core.el.DefaultExpressionManager;
import org.mule.runtime.core.streaming.StreamingManager;
import org.mule.tck.junit4.AbstractMuleContextTestCase;
import org.mule.tck.size.SmallTest;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import java.io.InputStream;
import java.util.List;
import java.util.Map;
@SmallTest
@RunWith(MockitoJUnitRunner.class)
public class DWAttributeEvaluatorTestCase extends AbstractMuleContextTestCase {
private static final String HOST_PORT_JSON = "{\"host\":\"0.0.0.0\", \"port\" : 8081}";
private static final String JSON_CAR = "{\n \"color\": \"RED\",\n \"price\": 1000\n}";
private static final String DW_CAR = "#[{color : 'RED', price: 1000}]";
private static final String DW_CAR_LIST = "#[[{color : 'RED', price: 1000}]]";
private static final DataType CAR_DATA_TYPE = DataType.fromType(Car.class);
private static final DataType CAR_LIST_DATA_TYPE = DataType.builder().collectionType(List.class).itemType(Car.class).build();
private Event mockMuleEvent = mock(Event.class);
private DefaultExpressionManager expressionManager;
@Mock
private StreamingManager streamingManager;
@Before
public void setUp() throws RegistrationException {
when(streamingManager.manage(any(CursorProvider.class), any(Event.class))).then(returnsFirstArg());
expressionManager = new DefaultExpressionManager(muleContext, streamingManager);
}
@Test
public void plainTextValue() {
String staticValue = "attributeEvaluator";
AttributeEvaluator attributeEvaluator = getAttributeEvaluator(staticValue);
assertThat(attributeEvaluator.resolveValue(mockMuleEvent), is(staticValue));
}
@Test
public void getJavaStringFromIntJsonProperty() throws MuleException {
AttributeEvaluator attributeEvaluator = getAttributeEvaluator("#[payload.port]", STRING);
Event event = newEvent(HOST_PORT_JSON, APPLICATION_JSON);
Object port = attributeEvaluator.resolveValue(event);
assertThat(port, is("8081"));
}
@Test
public void getJavaIntFromIntJsonProperty() throws MuleException {
AttributeEvaluator attributeEvaluator = getAttributeEvaluator("#[payload.port]", NUMBER);
Event event = newEvent(HOST_PORT_JSON, APPLICATION_JSON);
Object port = attributeEvaluator.resolveValue(event);
assertThat(port, is(8081));
}
@Test
public void getJavaStringFromStringJsonProperty() throws MuleException {
AttributeEvaluator attributeEvaluator = getAttributeEvaluator("#[payload.host]", STRING);
Event event = newEvent(HOST_PORT_JSON, APPLICATION_JSON);
Object host = attributeEvaluator.resolveValue(event);
assertThat(host, is("0.0.0.0"));
}
@Test
public void getJavaObjectFromStringJsonProperty() throws MuleException {
AttributeEvaluator attributeEvaluator = getAttributeEvaluator("#[payload.host]", OBJECT);
Event event = newEvent(HOST_PORT_JSON, APPLICATION_JSON);
Object resolveValue = attributeEvaluator.resolveValue(event);
assertThat(IOUtils.toString((InputStream) ((CursorProvider) resolveValue).openCursor()), is("\"0.0.0.0\""));
}
@Test
public void getJavaInputStreamFromStringJsonProperty() throws MuleException {
AttributeEvaluator attributeEvaluator = getAttributeEvaluator("#[payload.host]", INPUT_STREAM);
Event event = newEvent(HOST_PORT_JSON, APPLICATION_JSON);
Object resolveValue = attributeEvaluator.resolveValue(event);
assertThat(IOUtils.toString((InputStream) ((CursorProvider) resolveValue).openCursor()), is("\"0.0.0.0\""));
}
@Test
public void getJavaPojo() throws MuleException {
AttributeEvaluator attributeEvaluator =
getAttributeEvaluator(DW_CAR, DataType.fromType(Car.class));
Object car = attributeEvaluator.resolveValue(newEvent());
assertThat(car, is(allOf(hasProperty("color", is("RED")), hasProperty("price", is(1000)))));
}
@Test
public void getJavaCarFromJsonCar() throws MuleException {
AttributeEvaluator attributeEvaluator = getAttributeEvaluator("#[payload]", CAR_DATA_TYPE);
Object car = attributeEvaluator.resolveValue(newEvent(JSON_CAR, APPLICATION_JSON));
assertThat(car, is(allOf(hasProperty("color", is("RED")), hasProperty("price", is(1000)))));
}
@Test
public void getMapFromJsonCar() throws MuleException {
AttributeEvaluator attributeEvaluator = getAttributeEvaluator("#[payload]", DataType.fromType(Map.class));
Map<String, String> car = attributeEvaluator.resolveValue(newEvent(JSON_CAR, APPLICATION_JSON));
assertThat(car, hasEntry(is("price"), is(1000)));
assertThat(car, hasEntry(is("color"), is("RED")));
}
@Test
public void getListOfCarsFromJsonCar() throws MuleException {
AttributeEvaluator attributeEvaluator =
getAttributeEvaluator("#[[payload]]", CAR_LIST_DATA_TYPE);
List<Car> cars = attributeEvaluator.resolveValue(newEvent(JSON_CAR, APPLICATION_JSON));
Car car = cars.get(0);
assertThat(car, is(allOf(hasProperty("color", is("RED")), hasProperty("price", is(1000)))));
}
@Test
public void getListOfCarsFromExpression() throws MuleException {
AttributeEvaluator attributeEvaluator =
getAttributeEvaluator(DW_CAR_LIST, CAR_LIST_DATA_TYPE);
List<Car> cars = attributeEvaluator.resolveValue(newEvent(JSON_CAR, APPLICATION_JSON));
Car car = cars.get(0);
assertThat(car, is(allOf(hasProperty("color", is("RED")), hasProperty("price", is(1000)))));
}
@Test
public void getListOfMapsFromJsonCar() throws MuleException {
AttributeEvaluator attributeEvaluator = getAttributeEvaluator("#[[payload as Object]]", DataType.fromType(List.class));
List<Map<String, String>> cars = attributeEvaluator.resolveValue(newEvent(JSON_CAR, APPLICATION_JSON));
Map<String, String> car = cars.get(0);
assertThat(car, hasEntry(is("price"), is(1000)));
assertThat(car, hasEntry(is("color"), is("RED")));
}
@Test(expected = ExpressionRuntimeException.class)
public void parseExpressionAreNotSupported() throws MuleException {
AttributeEvaluator attributeEvaluator = getAttributeEvaluator("invalid #['expression']");
attributeEvaluator.resolveValue(newEvent());
}
@Test
public void resolveIntegerValueFromJsonObject() throws MuleException {
AttributeEvaluator attributeEvaluator = getAttributeEvaluator("#[payload.port]", NUMBER);
Integer port = attributeEvaluator.resolveValue(newEvent(HOST_PORT_JSON, APPLICATION_JSON));
assertThat(port, is(8081));
}
@Test
public void resolveIntegerValueFromJavaString() throws MuleException {
AttributeEvaluator attributeEvaluator = getAttributeEvaluator("#[payload]", DataType.NUMBER);
Object port = attributeEvaluator.resolveValue(newEvent("12", APPLICATION_JAVA));
assertThat(port, is(12));
}
@Test
public void resolveStringValue() throws MuleException {
AttributeEvaluator attributeEvaluator = getAttributeEvaluator("#[payload.port]", STRING);
String port = attributeEvaluator.resolveValue(newEvent(HOST_PORT_JSON, APPLICATION_JSON));
assertThat(port, is("8081"));
}
@Test
public void getBooleanValue() throws MuleException {
AttributeEvaluator attributeEvaluator = getAttributeEvaluator("#[payload.ok]", BOOLEAN);
Boolean bool = attributeEvaluator.resolveValue(newEvent("{\"ok\" : true}", APPLICATION_JSON));
assertThat(bool, is(true));
}
private Event newEvent(Object payload, MediaType applicationJson) throws MuleException {
return Event.builder(newEvent())
.message(Message.builder()
.payload(payload)
.mediaType(applicationJson)
.build())
.build();
}
private AttributeEvaluator getAttributeEvaluator(String expression) {
return getAttributeEvaluator(expression, null);
}
private AttributeEvaluator getAttributeEvaluator(String expression, DataType expectedDataType) {
AttributeEvaluator attributeEvaluator = new AttributeEvaluator(expression, expectedDataType);
attributeEvaluator.initialize(expressionManager);
return attributeEvaluator;
}
}