/*
* 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.soap.internal.loader;
import static java.util.Collections.emptySet;
import static java.util.stream.Collectors.toList;
import static java.util.stream.Stream.of;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.hasSize;
import static org.hamcrest.Matchers.instanceOf;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.isOneOf;
import static org.mule.runtime.api.dsl.DslResolvingContext.getDefault;
import static org.mule.runtime.core.config.MuleManifest.getProductVersion;
import static org.mule.runtime.extension.api.annotation.Extension.DEFAULT_CONFIG_DESCRIPTION;
import static org.mule.runtime.extension.api.annotation.Extension.DEFAULT_CONFIG_NAME;
import static org.mule.runtime.module.extension.internal.loader.java.DefaultJavaExtensionModelLoader.TYPE_PROPERTY_NAME;
import static org.mule.runtime.module.extension.internal.loader.java.DefaultJavaExtensionModelLoader.VERSION;
import static org.mule.runtime.module.extension.soap.internal.loader.SoapInvokeOperationDeclarer.ATTACHMENTS_PARAM;
import static org.mule.runtime.module.extension.soap.internal.loader.SoapInvokeOperationDeclarer.HEADERS_PARAM;
import static org.mule.runtime.module.extension.soap.internal.loader.SoapInvokeOperationDeclarer.OPERATION_DESCRIPTION;
import static org.mule.runtime.module.extension.soap.internal.loader.SoapInvokeOperationDeclarer.OPERATION_NAME;
import static org.mule.runtime.module.extension.soap.internal.loader.SoapInvokeOperationDeclarer.OPERATION_PARAM;
import static org.mule.runtime.module.extension.soap.internal.loader.SoapInvokeOperationDeclarer.REQUEST_PARAM;
import static org.mule.runtime.module.extension.soap.internal.loader.SoapInvokeOperationDeclarer.SERVICE_PARAM;
import static org.mule.runtime.module.extension.soap.internal.loader.SoapInvokeOperationDeclarer.TRANSPORT_HEADERS_PARAM;
import static org.mule.test.soap.extension.CalcioServiceProvider.CALCIO_DESC;
import static org.mule.test.soap.extension.CalcioServiceProvider.CALCIO_ID;
import org.mule.metadata.api.model.BinaryType;
import org.mule.metadata.api.model.ObjectType;
import org.mule.metadata.api.model.StringType;
import org.mule.metadata.api.model.UnionType;
import org.mule.runtime.api.meta.model.ExtensionModel;
import org.mule.runtime.api.meta.model.config.ConfigurationModel;
import org.mule.runtime.api.meta.model.connection.ConnectionProviderModel;
import org.mule.runtime.api.meta.model.error.ErrorModel;
import org.mule.runtime.api.meta.model.operation.OperationModel;
import org.mule.runtime.module.extension.internal.loader.enricher.ModuleErrors;
import org.mule.services.soap.api.exception.error.SoapErrors;
import org.mule.test.soap.extension.FootballSoapExtension;
import com.google.common.collect.ImmutableList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.junit.Test;
public class SoapExtensionDeclarationTestCase extends AbstractSoapExtensionDeclarationTestCase {
@Test
public void assertSoapExtensionModel() {
Map<String, Object> params = new HashMap<>();
params.put(TYPE_PROPERTY_NAME, FootballSoapExtension.class.getName());
params.put(VERSION, getProductVersion());
ExtensionModel model =
loader.loadExtensionModel(FootballSoapExtension.class.getClassLoader(), getDefault(emptySet()), params);
assertErrorModels(model.getErrorModels());
assertThat(model.getConfigurationModels(), hasSize(1));
ConfigurationModel configuration = model.getConfigurationModels().get(0);
assertThat(configuration.getName(), is(DEFAULT_CONFIG_NAME));
assertThat(configuration.getDescription(), is(DEFAULT_CONFIG_DESCRIPTION));
assertThat(configuration.getOperationModels(), hasSize(1));
assertOperation(configuration.getOperationModels().get(0));
List<ConnectionProviderModel> providers = configuration.getConnectionProviders();
assertThat(providers, hasSize(3));
assertConnectionProvider(providers.get(0), "base-connection", "",
new ParameterProber("leaguesAddress", "http://some-url.com", StringType.class, false));
assertConnectionProvider(providers.get(1), CALCIO_ID + "-connection", CALCIO_DESC);
assertConnectionProvider(providers.get(2), "la-liga-connection", "",
new ParameterProber("firstDivision", StringType.class),
new ParameterProber("secondDivision", StringType.class),
new ParameterProber("wsdlLocation", StringType.class));
}
private void assertErrorModels(Set<ErrorModel> errors) {
assertThat(errors, hasSize(13));
ImmutableList<String> errorNames = ImmutableList.<String>builder()
.addAll(of(SoapErrors.values()).map(Object::toString).collect(toList()))
.addAll(of(ModuleErrors.values()).map(Object::toString).collect(toList()))
.build();
errors.forEach(e -> assertThat(e.getType(), isOneOf(errorNames.toArray())));
}
private void assertOperation(OperationModel operation) {
assertThat(operation.getOutput().getType(), is(instanceOf(UnionType.class)));
assertErrorModels(operation.getErrorModels());
assertThat(operation.getName(), is(OPERATION_NAME));
assertThat(operation.getDescription(), is(OPERATION_DESCRIPTION));
ParameterProber[] probers = new ParameterProber[] {
new ParameterProber(OPERATION_PARAM, StringType.class),
new ParameterProber(SERVICE_PARAM, StringType.class),
new ParameterProber(REQUEST_PARAM, "#[payload]", BinaryType.class, false),
new ParameterProber(HEADERS_PARAM, null, BinaryType.class, false),
new ParameterProber(TRANSPORT_HEADERS_PARAM, null, ObjectType.class, false),
new ParameterProber(ATTACHMENTS_PARAM, null, ObjectType.class, false),
};
// the `1` is added because the sdk adds the target parameter automatically
assertThat(operation.getAllParameterModels(), hasSize(probers.length + 1));
assertParameters(operation.getAllParameterModels(), probers);
}
}