/*
* 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;
import static java.util.Collections.emptySet;
import static org.assertj.core.util.Arrays.isNullOrEmpty;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.Matchers.containsInAnyOrder;
import static org.hamcrest.Matchers.empty;
import static org.hamcrest.Matchers.hasSize;
import static org.junit.Assert.assertThat;
import static org.mule.runtime.api.dsl.DslResolvingContext.getDefault;
import static org.mule.runtime.api.meta.model.tck.TestCoreExtensionDeclarer.CHOICE_OPERATION_NAME;
import static org.mule.runtime.api.meta.model.tck.TestCoreExtensionDeclarer.EXTENSION_DESCRIPTION;
import static org.mule.runtime.api.meta.model.tck.TestCoreExtensionDeclarer.EXTENSION_NAME;
import static org.mule.runtime.api.meta.model.tck.TestCoreExtensionDeclarer.FOREACH_EXPRESSION_PARAMETER_NAME;
import static org.mule.runtime.api.meta.model.tck.TestCoreExtensionDeclarer.FOREACH_OPERATION_NAME;
import static org.mule.runtime.api.meta.model.tck.TestCoreExtensionDeclarer.OTHERWISE_ROUTE_NAME;
import static org.mule.runtime.api.meta.model.tck.TestCoreExtensionDeclarer.VENDOR;
import static org.mule.runtime.api.meta.model.tck.TestCoreExtensionDeclarer.VERSION;
import static org.mule.runtime.api.meta.model.tck.TestCoreExtensionDeclarer.WHEN_ROUTE_NAME;
import static org.mule.test.module.extension.internal.util.ExtensionsTestUtils.assertType;
import org.mule.metadata.api.model.StringType;
import org.mule.runtime.api.meta.model.ExtensionModel;
import org.mule.runtime.api.meta.model.Stereotype;
import org.mule.runtime.api.meta.model.operation.RouteModel;
import org.mule.runtime.api.meta.model.operation.RouterModel;
import org.mule.runtime.api.meta.model.operation.ScopeModel;
import org.mule.runtime.api.meta.model.parameter.ParameterModel;
import org.mule.runtime.api.meta.model.tck.TestCoreExtensionDeclarer;
import org.mule.runtime.extension.api.loader.ExtensionLoadingContext;
import org.mule.runtime.extension.api.loader.ExtensionModelLoader;
import org.mule.runtime.module.extension.internal.loader.java.AbstractJavaExtensionDeclarationTestCase;
import org.mule.tck.size.SmallTest;
import java.util.HashMap;
import java.util.List;
import org.junit.Before;
import org.junit.Test;
@SmallTest
public class CoreExtensionDeclarationTestCase extends AbstractJavaExtensionDeclarationTestCase {
private ExtensionModel extensionModel;
@Before
public void before() {
extensionModel = new ExtensionModelLoader() {
@Override
public String getId() {
return "test";
}
@Override
protected void declareExtension(ExtensionLoadingContext context) {
new TestCoreExtensionDeclarer().declareOn(context.getExtensionDeclarer());
}
}.loadExtensionModel(getClass().getClassLoader(), getDefault(emptySet()), new HashMap<>());
}
@Test
public void assertDeclaration() {
assertThat(extensionModel.getName(), is(EXTENSION_NAME));
assertThat(extensionModel.getDescription(), is(EXTENSION_DESCRIPTION));
assertThat(extensionModel.getVersion(), is(VERSION));
assertThat(extensionModel.getConfigurationModels(), hasSize(0));
assertThat(extensionModel.getVendor(), is(VENDOR));
assertThat(extensionModel.getOperationModels(), hasSize(2));
assertThat(extensionModel.getConnectionProviders(), is(empty()));
assertThat(extensionModel.getSourceModels(), is(empty()));
}
@Test
public void choiceRouter() {
RouterModel choice = (RouterModel) extensionModel.getOperationModel(CHOICE_OPERATION_NAME).get();
assertThat(choice.getAllParameterModels(), hasSize(0));
List<RouteModel> routes = choice.getRouteModels();
assertThat(routes, hasSize(2));
assertRoute(routes.get(0), WHEN_ROUTE_NAME, 1, null);
assertRoute(routes.get(1), OTHERWISE_ROUTE_NAME, 0, 1);
}
@Test
public void foreachScope() {
ScopeModel foreach = (ScopeModel) extensionModel.getOperationModel(FOREACH_OPERATION_NAME).get();
assertThat(foreach.getAllParameterModels(), hasSize(1));
ParameterModel parameter = foreach.getAllParameterModels().get(0);
assertThat(parameter.getName(), is(FOREACH_EXPRESSION_PARAMETER_NAME));
assertType(parameter.getType(), String.class, StringType.class);
}
private void assertRoute(RouteModel route, String name, int minOccurs, Integer maxOccurs, Stereotype... stereotypes) {
assertThat(route.getName(), is(name));
assertThat(route.getMinOccurs(), is(minOccurs));
if (maxOccurs != null) {
assertThat(route.getMaxOccurs().get(), is(maxOccurs));
} else {
assertThat(route.getMaxOccurs().isPresent(), is(false));
}
if (isNullOrEmpty(stereotypes)) {
assertThat(route.getAllowedStereotypes().isPresent(), is(false));
} else {
assertThat(route.getAllowedStereotypes().get(), containsInAnyOrder(stereotypes));
}
}
}