/* * 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.extension.internal.loader; import static java.util.Collections.emptySet; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.instanceOf; import static org.hamcrest.Matchers.is; import static org.mule.runtime.api.dsl.DslResolvingContext.getDefault; import static org.mule.runtime.extension.api.ExtensionConstants.TARGET_PARAMETER_DESCRIPTION; import static org.mule.runtime.extension.api.ExtensionConstants.TARGET_PARAMETER_NAME; import static org.mule.runtime.extension.internal.loader.XmlExtensionLoaderDelegate.CONFIG_NAME; import static org.mule.runtime.extension.internal.loader.XmlExtensionModelLoader.RESOURCE_XML; import org.junit.Test; import org.mule.metadata.api.model.MetadataFormat; import org.mule.metadata.api.model.ObjectType; import org.mule.runtime.api.meta.MuleVersion; import org.mule.runtime.api.meta.model.ExtensionModel; import org.mule.runtime.api.meta.model.config.ConfigurationModel; import org.mule.runtime.api.meta.model.operation.OperationModel; import org.mule.runtime.api.meta.model.parameter.ParameterModel; import org.mule.runtime.config.spring.dsl.model.extension.xml.GlobalElementComponentModelModelProperty; import org.mule.runtime.config.spring.dsl.model.extension.xml.OperationComponentModelModelProperty; import org.mule.tck.junit4.AbstractMuleTestCase; import java.io.IOException; import java.util.HashMap; import java.util.Map; import java.util.Optional; public class XmlExtensionLoaderTestCase extends AbstractMuleTestCase { private static final MuleVersion DEFAULT_MIN_MULE_VERSION = new MuleVersion("4.0.0"); @Test public void testModuleSimple() { String modulePath = "modules/module-simple.xml"; ExtensionModel extensionModel = getExtensionModelFrom(modulePath); assertThat(extensionModel.getName(), is("module-simple")); assertThat(extensionModel.getMinMuleVersion(), is(new MuleVersion("4.1.0"))); assertThat(extensionModel.getConfigurationModels().size(), is(0)); assertThat(extensionModel.getModelProperty(GlobalElementComponentModelModelProperty.class).isPresent(), is(false)); assertThat(extensionModel.getOperationModels().size(), is(11)); Optional<OperationModel> operationModel = extensionModel.getOperationModel("set-payload-concat-params-values"); assertThat(operationModel.isPresent(), is(true)); assertThat(operationModel.get().getAllParameterModels().size(), is(3)); assertThat(operationModel.get().getAllParameterModels().get(0).getName(), is("value1")); assertThat(operationModel.get().getAllParameterModels().get(1).getName(), is("value2")); assertThat(operationModel.get().getAllParameterModels().get(2).getName(), is(TARGET_PARAMETER_NAME)); Optional<OperationComponentModelModelProperty> modelProperty = operationModel.get().getModelProperty(OperationComponentModelModelProperty.class); assertThat(modelProperty.isPresent(), is(true)); assertThat(modelProperty.get().getBodyComponentModel().getInnerComponents().size(), is(1)); } @Test public void testModuleProperties() { String modulePath = "modules/module-properties.xml"; ExtensionModel extensionModel = getExtensionModelFrom(modulePath); assertThat(extensionModel.getName(), is("module-properties")); assertThat(extensionModel.getMinMuleVersion(), is(DEFAULT_MIN_MULE_VERSION)); assertThat(extensionModel.getConfigurationModels().size(), is(1)); ConfigurationModel configurationModel = extensionModel.getConfigurationModels().get(0); assertThat(configurationModel.getName(), is(CONFIG_NAME)); assertThat(configurationModel.getAllParameterModels().size(), is(4)); assertThat(configurationModel.getAllParameterModels().get(0).getName(), is("configParam")); assertThat(configurationModel.getAllParameterModels().get(1).getName(), is("defaultConfigParam")); Optional<GlobalElementComponentModelModelProperty> globalElementComponentModelModelProperty = configurationModel.getModelProperty(GlobalElementComponentModelModelProperty.class); assertThat(globalElementComponentModelModelProperty.isPresent(), is(true)); assertThat(globalElementComponentModelModelProperty.get().getGlobalElements().size(), is(0)); assertThat(configurationModel.getOperationModels().size(), is(7)); Optional<OperationModel> operationModel = configurationModel.getOperationModel("set-payload-add-param-and-property-values"); assertThat(operationModel.isPresent(), is(true)); assertThat(operationModel.get().getAllParameterModels().size(), is(2)); assertThat(operationModel.get().getAllParameterModels().get(0).getName(), is("value1")); assertThat(operationModel.get().getAllParameterModels().get(1).getName(), is(TARGET_PARAMETER_NAME)); Optional<OperationComponentModelModelProperty> modelProperty = operationModel.get().getModelProperty(OperationComponentModelModelProperty.class); assertThat(modelProperty.isPresent(), is(true)); assertThat(modelProperty.get().getBodyComponentModel().getInnerComponents().size(), is(1)); } @Test public void testModuleGlobalElement() { String modulePath = "modules/module-global-element.xml"; ExtensionModel extensionModel = getExtensionModelFrom(modulePath); assertThat(extensionModel.getName(), is("module-global-element")); assertThat(extensionModel.getMinMuleVersion(), is(DEFAULT_MIN_MULE_VERSION)); assertThat(extensionModel.getConfigurationModels().size(), is(1)); ConfigurationModel configurationModel = extensionModel.getConfigurationModels().get(0); assertThat(configurationModel.getName(), is(CONFIG_NAME)); assertThat(configurationModel.getAllParameterModels().size(), is(4)); assertThat(configurationModel.getAllParameterModels().get(0).getName(), is("someUserConfig")); assertThat(configurationModel.getAllParameterModels().get(1).getName(), is("somePassConfig")); assertThat(configurationModel.getAllParameterModels().get(2).getName(), is("port")); assertThat(configurationModel.getAllParameterModels().get(3).getName(), is("protocolConfig")); Optional<GlobalElementComponentModelModelProperty> globalElementComponentModelModelProperty = configurationModel.getModelProperty(GlobalElementComponentModelModelProperty.class); assertThat(globalElementComponentModelModelProperty.isPresent(), is(true)); assertThat(globalElementComponentModelModelProperty.get().getGlobalElements().size(), is(1)); assertThat(configurationModel.getOperationModels().size(), is(1)); Optional<OperationModel> operationModel = configurationModel.getOperationModel("do-login"); assertThat(operationModel.isPresent(), is(true)); assertThat(operationModel.get().getAllParameterModels().size(), is(3)); assertThat(operationModel.get().getAllParameterModels().get(0).getName(), is("someUser")); assertThat(operationModel.get().getAllParameterModels().get(1).getName(), is("somePass")); assertThat(operationModel.get().getAllParameterModels().get(2).getName(), is(TARGET_PARAMETER_NAME)); Optional<OperationComponentModelModelProperty> modelProperty = operationModel.get().getModelProperty(OperationComponentModelModelProperty.class); assertThat(modelProperty.isPresent(), is(true)); assertThat(modelProperty.get().getBodyComponentModel().getInnerComponents().size(), is(2)); } @Test public void testModuleCustomTypes() throws IOException { String modulePath = "modules/module-custom-types.xml"; ExtensionModel extensionModel = getExtensionModelFrom(modulePath); assertThat(extensionModel.getName(), is("module-custom-types")); assertThat(extensionModel.getMinMuleVersion(), is(DEFAULT_MIN_MULE_VERSION)); assertThat(extensionModel.getConfigurationModels().size(), is(0)); assertThat(extensionModel.getModelProperty(GlobalElementComponentModelModelProperty.class).isPresent(), is(false)); assertThat(extensionModel.getOperationModels().size(), is(1)); Optional<OperationModel> operationModel = extensionModel.getOperationModel("operation-with-custom-types"); assertThat(operationModel.isPresent(), is(true)); final OperationModel operation = operationModel.get(); assertThat(operation.getAllParameterModels().size(), is(2)); final ParameterModel parameterValueModel = operation.getAllParameterModels().get(0); assertThat(parameterValueModel.getName(), is("value")); assertThat(operation.getAllParameterModels().get(1).getName(), is(TARGET_PARAMETER_NAME)); assertThat(parameterValueModel.getType().getMetadataFormat(), is(MetadataFormat.JSON)); assertThat(parameterValueModel.getType(), instanceOf(ObjectType.class)); assertThat(((ObjectType) parameterValueModel.getType()).getFields().size(), is(2)); assertThat(operation.getOutput().getType().getMetadataFormat(), is(MetadataFormat.JSON)); assertThat(operation.getOutput().getType(), instanceOf(ObjectType.class)); assertThat(((ObjectType) operation.getOutput().getType()).getFields().size(), is(3)); Optional<OperationComponentModelModelProperty> modelProperty = operation.getModelProperty(OperationComponentModelModelProperty.class); assertThat(modelProperty.isPresent(), is(true)); assertThat(modelProperty.get().getBodyComponentModel().getInnerComponents().size(), is(1)); } @Test public void testModuleDocumentation() throws IOException { String modulePath = "modules/module-documentation.xml"; ExtensionModel extensionModel = getExtensionModelFrom(modulePath); assertThat(extensionModel.getName(), is("module-documentation")); assertThat(extensionModel.getMinMuleVersion(), is(DEFAULT_MIN_MULE_VERSION)); assertThat(extensionModel.getDescription(), is("Documentation for the connector")); assertThat(extensionModel.getConfigurationModels().size(), is(1)); ConfigurationModel configurationModel = extensionModel.getConfigurationModels().get(0); assertThat(configurationModel.getName(), is(CONFIG_NAME)); assertThat(configurationModel.getAllParameterModels().size(), is(2)); assertThat(configurationModel.getAllParameterModels().get(0).getName(), is("aPropertyWithDoc")); assertThat(configurationModel.getAllParameterModels().get(0).getDescription(), is("Documentation for the property")); assertThat(configurationModel.getAllParameterModels().get(1).getName(), is("aHiddenPropertyWithDoc")); assertThat(configurationModel.getAllParameterModels().get(1).getDescription(), is("Documentation for the hidden property")); assertThat(configurationModel.getAllParameterModels().get(1).getLayoutModel().isPresent(), is(true)); assertThat(configurationModel.getAllParameterModels().get(1).getLayoutModel().get().isPassword(), is(true)); Optional<GlobalElementComponentModelModelProperty> globalElementComponentModelModelProperty = configurationModel.getModelProperty(GlobalElementComponentModelModelProperty.class); assertThat(globalElementComponentModelModelProperty.isPresent(), is(true)); assertThat(globalElementComponentModelModelProperty.get().getGlobalElements().size(), is(0)); assertThat(configurationModel.getOperationModels().size(), is(1)); Optional<OperationModel> operationModel = configurationModel.getOperationModel("operation-with-doc"); assertThat(operationModel.isPresent(), is(true)); assertThat(operationModel.get().getDescription(), is("Documentation for the operation")); assertThat(operationModel.get().getAllParameterModels().size(), is(3)); assertThat(operationModel.get().getAllParameterModels().get(0).getName(), is("paramWithDoc")); assertThat(operationModel.get().getAllParameterModels().get(0).getDescription(), is("Documentation for the parameter")); assertThat(operationModel.get().getAllParameterModels().get(1).getName(), is("hiddenParamWithDoc")); assertThat(operationModel.get().getAllParameterModels().get(1).getDescription(), is("Documentation for the hidden parameter")); assertThat(operationModel.get().getAllParameterModels().get(1).getLayoutModel().isPresent(), is(true)); assertThat(operationModel.get().getAllParameterModels().get(1).getLayoutModel().get().isPassword(), is(true)); assertThat(operationModel.get().getAllParameterModels().get(2).getName(), is(TARGET_PARAMETER_NAME)); assertThat(operationModel.get().getAllParameterModels().get(2).getDescription(), is(TARGET_PARAMETER_DESCRIPTION)); assertThat(operationModel.get().getOutput().getDescription(), is("Documentation for the output")); Optional<OperationComponentModelModelProperty> modelProperty = operationModel.get().getModelProperty(OperationComponentModelModelProperty.class); assertThat(modelProperty.isPresent(), is(true)); assertThat(modelProperty.get().getBodyComponentModel().getInnerComponents().size(), is(1)); } private ExtensionModel getExtensionModelFrom(String modulePath) { Map<String, Object> parameters = new HashMap<>(); parameters.put(RESOURCE_XML, modulePath); return new XmlExtensionModelLoader().loadExtensionModel(getClass().getClassLoader(), getDefault(emptySet()), parameters); } }