/*
* 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.test.module.extension.config;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.hasSize;
import static org.hamcrest.Matchers.notNullValue;
import static org.hamcrest.Matchers.nullValue;
import static org.hamcrest.core.Is.is;
import static org.hamcrest.core.IsEqual.equalTo;
import org.mule.runtime.api.exception.MuleException;
import org.mule.runtime.api.metadata.TypedValue;
import org.mule.tck.probe.JUnitLambdaProbe;
import org.mule.tck.probe.PollingProber;
import org.mule.test.module.extension.AbstractExtensionFunctionalTestCase;
import org.mule.test.vegan.extension.AppleConfig;
import org.mule.test.vegan.extension.HealthyFood;
import org.junit.Test;
import java.util.List;
import java.util.Map;
public class ConfigOverrideTestCase extends AbstractExtensionFunctionalTestCase {
@Override
protected String getConfigFile() {
return "vegan-config-overrides.xml";
}
@Override
protected boolean isDisposeContextPerClass() {
return true;
}
@Test
public void simpleParameterOverrideWithConfigDefaults() throws Exception {
TypedValue<Integer> result = flowRunner("timeToPeelOverrideOperationWithDefaults")
.run().getMessage().getPayload();
assertThat(result.getValue(), is(10));
}
@Test
public void simpleParameterOverrideWithConfigCustomValues() throws Exception {
TypedValue<Integer> result = flowRunner("timeToPeelOverrideOperationWithCustom")
.run().getMessage().getPayload();
assertThat(result.getValue(), is(60));
}
@Test
public void simpleParameterIsNotOverriddenIfDeclared() throws Exception {
TypedValue<Integer> result = flowRunner("timeToPeelDeclareValueInOperationWithCustom")
.run().getMessage().getPayload();
assertThat(result.getValue(), is(30));
}
@Test
public void instanceUsedForOverridesIsTheReferencedOne() throws Exception {
TypedValue<Integer> result = flowRunner("timeToPeelOverrideOperationWithBananaCustom")
.run().getMessage().getPayload();
assertThat(result.getValue(), is(20));
}
@Test
public void dynamicValuesGetResolved() throws Exception {
final String flowName = "timeToPeelOverrideOperationWithBananaDynamic";
TypedValue<Integer> result = flowRunner(flowName)
.withPayload("45")
.withVariable("declaredVar", null)
.run().getMessage().getPayload();
assertThat(result.getValue(), is(45));
result = flowRunner(flowName)
.withPayload("45")
.withVariable("declaredVar", "25")
.run().getMessage().getPayload();
assertThat(result.getValue(), is(25));
result = flowRunner(flowName)
.withPayload(null)
.withVariable("declaredVar", "25")
.run().getMessage().getPayload();
assertThat(result.getValue(), is(25));
result = flowRunner(flowName)
.withPayload(null)
.withVariable("declaredVar", null)
.run().getMessage().getPayload();
assertThat(result.getValue(), is(nullValue()));
}
@Test
public void listParameterOverrideWithNullsafeFromConfigDefaults() throws Exception {
TypedValue<List<String>> result = flowRunner("mainProducersOverrideOperationWithDefaults")
.run().getMessage().getPayload();
assertThat(result.getValue(), hasSize(0));
}
@Test
public void listParameterOverrideWithConfigCustomValues() throws Exception {
TypedValue<List<String>> result = flowRunner("mainProducersOverrideOperationWithCustom")
.run().getMessage().getPayload();
assertThat(result.getValue(), hasSize(2));
assertThat(result.getValue().get(0), equalTo("appleProducerOne"));
}
@Test
public void listParameterIsNotOverriddenIfDeclared() throws Exception {
TypedValue<List<String>> result = flowRunner("mainProducersDeclareValueInOperationWithCustom")
.run().getMessage().getPayload();
assertThat(result.getValue(), hasSize(1));
assertThat(result.getValue().get(0), equalTo("getProducersOne"));
}
@Test
public void pojoParameterOverrideFromConfigDefaults() throws Exception {
TypedValue<HealthyFood> result = flowRunner("sampleOverrideOperationWithDefaults")
.run().getMessage().getPayload();
assertThat(result.getValue(), is(nullValue()));
}
public void pojoParameterOverrideFromNullsafeConfigDefaults() throws Exception {
TypedValue<HealthyFood> result = flowRunner("sampleOverrideOperationWithBananaDefaults")
.run().getMessage().getPayload();
assertThat(result.getValue(), is(notNullValue()));
assertThat(result.getValue().getTasteProfile(), is(notNullValue()));
}
@Test
public void pojoParameterOverrideWithConfigCustomValues() throws Exception {
TypedValue<HealthyFood> result = flowRunner("sampleOverrideOperationWithCustom")
.run().getMessage().getPayload();
assertThat(result.getValue(), is(notNullValue()));
assertThat(result.getValue().getTasteProfile(), is(notNullValue()));
assertThat(result.getValue().getTasteProfile().isTasty(), is(true));
}
@Test
public void pojoParameterIsNotOverriddenIfDeclared() throws Exception {
TypedValue<HealthyFood> result = flowRunner("sampleDeclareValueInOperationWithCustom")
.run().getMessage().getPayload();
assertThat(result.getValue(), is(notNullValue()));
assertThat(result.getValue().getTasteProfile(), is(notNullValue()));
assertThat(result.getValue().getTasteProfile().isTasty(), is(false));
}
@Test
public void parameterIsNotOverriddenWithDefaults() throws Exception {
TypedValue<String> result = flowRunner("shouldNotOverrideOverrideOperationWithDefaults")
.run().getMessage().getPayload();
assertThat(result.getValue(), is(nullValue()));
}
@Test
public void parameterIsNotOverriddenWithCustomValue() throws Exception {
TypedValue<String> result = flowRunner("shouldNotOverrideOverrideOperationWithCustom")
.run().getMessage().getPayload();
assertThat(result.getValue(), is(nullValue()));
}
@Test
public void parameterIsNotOverriddenWhenDeclaredInline() throws Exception {
TypedValue<String> result = flowRunner("shouldNotOverrideDeclareValueInOperationWithCustom")
.run().getMessage().getPayload();
assertThat(result.getValue(), is("declared"));
}
@Test
public void sourceMainAndCallbacksUseOverrideFromConfigDefaults() throws Exception {
AppleConfig apple = locateConfig("apple");
pollingProbe(apple, "sourceOverrideWithDefaults", 0, null, null, 10);
}
@Test
public void sourceMainAndCallbacksUseOverrideFromConfigCustom() throws Exception {
AppleConfig apple = locateConfig("appleCustom");
pollingProbe(apple, "sourceOverrideWithCustom", 2, true, null, 60);
}
@Test
public void sourceMainAndCallbacksUseDeclaredParameters() throws Exception {
AppleConfig apple = locateConfig("appleCustom");
pollingProbe(apple, "sourceDeclareValueInlineWithCustom", 1, false, "declared", 30);
}
private boolean assertSourceResults(Map<String, List<Object>> results, String flowName,
int mainProducersSize, Boolean tasty, String shouldNotOverride, int timeToPeel) {
List<Object> objects = results.get(flowName);
if (objects == null) {
return false;
}
assertThat(objects.size(), is(4));
assertThat(((List) objects.get(0)).size(), is(mainProducersSize));
if (tasty == null) {
assertThat(objects.get(1), is(nullValue()));
} else {
assertThat(((HealthyFood) objects.get(1)).getTasteProfile().isTasty(), is(tasty));
}
assertThat(objects.get(2), is(shouldNotOverride));
assertThat(objects.get(3), is(timeToPeel));
return true;
}
private <T> T locateConfig(String name) throws MuleException {
return (T) muleContext.getExtensionManager()
.getConfiguration(name, testEvent()).getValue();
}
private void pollingProbe(AppleConfig config, String name,
int mainProducersSize, Boolean tasty, String shouldNotOverride, int timeToPeel) {
new PollingProber(30000, 300)
.check(new JUnitLambdaProbe(() -> assertSourceResults(config.getResults(), name,
mainProducersSize, tasty, shouldNotOverride, timeToPeel)));
}
}