/*
* 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.core.Is.is;
import static org.junit.Assert.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import static org.mule.runtime.api.message.Message.of;
import static org.mule.runtime.module.extension.internal.runtime.resolver.ValueResolvingContext.from;
import static org.mule.test.module.extension.internal.util.ExtensionsTestUtils.toMetadataType;
import org.mule.metadata.api.model.MetadataType;
import org.mule.runtime.core.api.Event;
import org.mule.runtime.core.api.context.notification.FlowCallStack;
import org.mule.runtime.extension.api.annotation.param.NullSafe;
import org.mule.runtime.extension.api.annotation.param.Optional;
import org.mule.runtime.extension.api.annotation.param.Parameter;
import org.mule.tck.junit4.AbstractMuleContextTestCase;
import org.mule.tck.size.SmallTest;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Answers;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
@SmallTest
@RunWith(MockitoJUnitRunner.class)
public class NullSafeValueResolverWrapperTestCase extends AbstractMuleContextTestCase {
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
private Event event;
@Mock
private ObjectTypeParametersResolver objectTypeParametersResolver;
@Before
public void setUp() {
when(event.getFlowCallStack().clone()).thenReturn(mock(FlowCallStack.class));
when(event.getError()).thenReturn(java.util.Optional.empty());
when(event.getMessage()).thenReturn(of(null));
}
@Test
public void testMapType() throws Exception {
assertExpected(new StaticValueResolver(null), toMetadataType(HashMap.class), false, new HashMap<>());
}
@Test
public void testPojoType() throws Exception {
assertExpected(new StaticValueResolver(null), toMetadataType(DynamicPojo.class), true, new DynamicPojo(5));
}
@Test
public void testPojoWithStaticDefaultValue() throws Exception {
assertExpected(new StaticValueResolver(null), toMetadataType(NonDynamicPojo.class), false, new NonDynamicPojo(false));
}
@Test
public void testPojoWithMap() throws Exception {
DynamicPojoWithMap pojo = new DynamicPojoWithMap();
pojo.setMap(new HashMap<>());
assertExpected(new StaticValueResolver(null), toMetadataType(DynamicPojoWithMap.class), false, pojo);
}
private void assertExpected(ValueResolver valueResolver, MetadataType type, boolean isDynamic, Object expected)
throws Exception {
ValueResolver resolver = NullSafeValueResolverWrapper.of(valueResolver, type, muleContext, objectTypeParametersResolver);
assertThat(resolver.isDynamic(), is(isDynamic));
assertThat(resolver.resolve(ValueResolvingContext.from(event)), is(expected));
}
public static class DynamicPojo {
public DynamicPojo() {}
public DynamicPojo(int time) {
this.time = time;
}
@Parameter
@Optional(defaultValue = "#[5]")
private int time;
public int getTime() {
return time;
}
public void setTime(int time) {
this.time = time;
}
@Override
public boolean equals(Object o) {
if (o instanceof DynamicPojo) {
DynamicPojo that = (DynamicPojo) o;
return time == that.time;
}
return false;
}
@Override
public int hashCode() {
return Objects.hash(time);
}
}
public static class DynamicPojoWithMap {
public DynamicPojoWithMap() {}
@Parameter
@Optional
@NullSafe
private Map<String, String> map;
public Map<String, String> getMap() {
return map;
}
public void setMap(Map<String, String> map) {
this.map = map;
}
@Override
public boolean equals(Object o) {
if (o instanceof DynamicPojoWithMap) {
DynamicPojoWithMap that = (DynamicPojoWithMap) o;
return Objects.equals(map, that.map);
}
return false;
}
@Override
public int hashCode() {
return Objects.hash(map);
}
}
public static class NonDynamicPojo {
public NonDynamicPojo() {}
public NonDynamicPojo(Boolean staticDefaultValue) {
this.staticDefaultValue = staticDefaultValue;
}
@Parameter
@Optional(defaultValue = "false")
private Boolean staticDefaultValue;
public Boolean getStaticDefaultValue() {
return staticDefaultValue;
}
public void setStaticDefaultValue(Boolean staticDefaultValue) {
this.staticDefaultValue = staticDefaultValue;
}
@Override
public boolean equals(Object o) {
if (o instanceof NonDynamicPojo) {
NonDynamicPojo that = (NonDynamicPojo) o;
return Objects.equals(staticDefaultValue, that.staticDefaultValue);
}
return false;
}
@Override
public int hashCode() {
return Objects.hash(staticDefaultValue);
}
}
}