/*
* 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.internal.keygenerator;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.equalTo;
import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import static org.mule.runtime.api.metadata.DataType.OBJECT;
import static org.mule.runtime.api.metadata.DataType.STRING;
import org.mule.runtime.api.metadata.TypedValue;
import org.mule.runtime.core.api.Event;
import org.mule.runtime.core.api.MuleContext;
import org.mule.runtime.core.api.el.ExtendedExpressionManager;
import org.mule.runtime.core.internal.message.InternalMessage;
import org.mule.tck.junit4.AbstractMuleTestCase;
import java.io.NotSerializableException;
import java.io.Serializable;
import org.junit.Before;
import org.junit.Test;
public class ExpressionKeyGeneratorTestCase extends AbstractMuleTestCase {
private static final String RESOLVED_KEY = "KEY";
private static final String SINGLE_EXPRESSION = "#[expression]";
private ExpressionMuleEventKeyGenerator keyGenerator;
private InternalMessage message;
private MuleContext muleContext;
private Event event;
private ExtendedExpressionManager expressionManager;
@Before
public void setUp() throws Exception {
expressionManager = mock(ExtendedExpressionManager.class);
muleContext = mock(MuleContext.class);
doReturn(expressionManager).when(muleContext).getExpressionManager();
message = mock(InternalMessage.class);
event = mock(Event.class);
when(event.getMessage()).thenReturn(message);
keyGenerator = new ExpressionMuleEventKeyGenerator();
}
@Test
public void testGeneratesSerializableKey() throws Exception {
keyGenerator.setExpression(SINGLE_EXPRESSION);
keyGenerator.setMuleContext(muleContext);
TypedValue<String> typedValue = new TypedValue<>(RESOLVED_KEY, STRING);
when(expressionManager.evaluate(SINGLE_EXPRESSION, event)).thenReturn(typedValue);
Serializable key = keyGenerator.generateKey(event);
assertEquals(RESOLVED_KEY, key);
}
@Test
public void resolvesCompositeExpression() throws Exception {
keyGenerator.setExpression(SINGLE_EXPRESSION + SINGLE_EXPRESSION);
keyGenerator.setMuleContext(muleContext);
when(expressionManager.parse(SINGLE_EXPRESSION + SINGLE_EXPRESSION, event, null)).thenReturn(RESOLVED_KEY);
Serializable key = keyGenerator.generateKey(event);
assertThat(key, equalTo(RESOLVED_KEY));
}
@Test(expected = NotSerializableException.class)
public void testThrowsExceptionOnNonSerializableKey() throws Exception {
keyGenerator.setExpression(SINGLE_EXPRESSION);
keyGenerator.setMuleContext(muleContext);
when(expressionManager.evaluate(SINGLE_EXPRESSION, event)).thenReturn(new TypedValue(null, OBJECT));
keyGenerator.generateKey(event);
}
}