/*
* 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.module.extension.internal.runtime.resolver;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.nullValue;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.mule.runtime.module.extension.internal.runtime.resolver.ValueResolvingContext.from;
import org.mule.runtime.api.exception.MuleException;
import org.mule.runtime.api.metadata.DataType;
import org.mule.runtime.core.api.TransformationService;
import org.mule.runtime.core.api.el.ExtendedExpressionManager;
import org.mule.tck.junit4.AbstractMuleContextTestCase;
import org.mule.tck.size.SmallTest;
import org.junit.Test;
@SmallTest
public class TypeSafeValueResolverWrapperTestCase extends AbstractMuleContextTestCase {
private TransformationService transformationService = mock(TransformationService.class);
private ValueResolver<String> staticValueResolver = mock(ValueResolver.class);
private ValueResolver<String> dynamicValueResolver = mock(ValueResolver.class);
private TypeSafeValueResolverWrapper<Integer> dynamicResolver;
private TypeSafeValueResolverWrapper<Integer> staticResolver;
@Override
protected void doSetUp() throws Exception {
muleContext = spy(muleContext);
ExtendedExpressionManager expressionManager = spy(muleContext.getExpressionManager());
when(staticValueResolver.isDynamic()).thenReturn(false);
when(staticValueResolver.resolve(any(ValueResolvingContext.class))).thenReturn("123");
when(dynamicValueResolver.isDynamic()).thenReturn(true);
when(dynamicValueResolver.resolve(any(ValueResolvingContext.class))).thenReturn("123");
when(muleContext.getExpressionManager()).thenReturn(expressionManager);
dynamicResolver = new TypeSafeValueResolverWrapper<>(dynamicValueResolver, Integer.class);
dynamicResolver.setTransformationService(transformationService);
dynamicResolver.initialise();
staticResolver = new TypeSafeValueResolverWrapper<>(staticValueResolver, Integer.class);
staticResolver.setTransformationService(transformationService);
staticResolver.initialise();
when(transformationService.transform(eq("123"), any(DataType.class), any(DataType.class))).thenReturn(123);
}
@Test
public void staticValueIsTransformed() throws MuleException {
Integer resolve = staticResolver.resolve(ValueResolvingContext.from(testEvent()));
assertThat(resolve, is(123));
}
@Test
public void staticValueIsTransformedOnlyOnce() throws MuleException {
staticResolver.resolve(ValueResolvingContext.from(testEvent()));
staticResolver.resolve(ValueResolvingContext.from(testEvent()));
staticResolver.resolve(ValueResolvingContext.from(testEvent()));
staticResolver.resolve(ValueResolvingContext.from(testEvent()));
staticResolver.resolve(ValueResolvingContext.from(testEvent()));
verify(staticValueResolver, times(1)).resolve(any(ValueResolvingContext.class));
}
@Test
public void dynamicValueIsTransformed() throws MuleException {
Integer resolve = dynamicResolver.resolve(ValueResolvingContext.from(testEvent()));
assertThat(resolve, is(123));
}
@Test
public void dynamicValueIsTransformedOnlyOnce() throws MuleException {
dynamicResolver.resolve(ValueResolvingContext.from(testEvent()));
dynamicResolver.resolve(ValueResolvingContext.from(testEvent()));
dynamicResolver.resolve(ValueResolvingContext.from(testEvent()));
dynamicResolver.resolve(ValueResolvingContext.from(testEvent()));
dynamicResolver.resolve(ValueResolvingContext.from(testEvent()));
verify(dynamicValueResolver, times(5)).resolve(any(ValueResolvingContext.class));
}
@Test
public void transformNullValue() throws MuleException {
when(staticValueResolver.resolve(any(ValueResolvingContext.class))).thenReturn(null);
Integer value = staticResolver.resolve(ValueResolvingContext.from(testEvent()));
assertThat(value, is(nullValue()));
}
}