/* * 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.resources.manifest; import static java.util.Arrays.asList; import static java.util.Optional.empty; import static java.util.Optional.of; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsInAnyOrder; import static org.hamcrest.collection.IsCollectionWithSize.hasSize; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import static org.mule.runtime.api.util.ExtensionModelTestUtils.visitableMock; import static org.mule.runtime.module.extension.internal.util.IntrospectionUtils.getOperationMethods; import static org.mule.test.module.extension.internal.util.ExtensionsTestUtils.mockParameters; import org.mule.metadata.api.ClassTypeLoader; import org.mule.runtime.api.meta.model.ExtensionModel; import org.mule.runtime.api.meta.model.OutputModel; import org.mule.runtime.api.meta.model.operation.OperationModel; import org.mule.runtime.api.meta.model.parameter.ParameterModel; import org.mule.runtime.extension.api.declaration.type.ExtensionsTypeLoaderFactory; import org.mule.runtime.extension.api.runtime.operation.Result; import org.mule.runtime.module.extension.internal.loader.java.property.ClassLoaderModelProperty; import org.mule.runtime.module.extension.internal.loader.java.property.ImplementingMethodModelProperty; import org.mule.tck.testmodels.fruit.Apple; import org.mule.test.heisenberg.extension.HeisenbergOperations; import org.mule.test.metadata.extension.model.shapes.Shape; import org.mule.test.vegan.extension.VeganAttributes; import com.google.common.reflect.TypeToken; import java.lang.reflect.Method; import java.lang.reflect.Type; import java.util.List; import java.util.Optional; import java.util.Set; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; @RunWith(MockitoJUnitRunner.class) public class ExportedArtifactsCollectorTestCase { private final ClassTypeLoader loader = ExtensionsTypeLoaderFactory.getDefault().createTypeLoader(); private static final String APPLE_PACKAGE = "org.mule.tck.testmodels.fruit"; private static final String PEEL_PACKAGE = "org.mule.tck.testmodels.fruit.peel"; private static final String SEED_PACKAGE = "org.mule.tck.testmodels.fruit.seed"; private static final String VEGAN_PACKAGE = "org.mule.test.vegan.extension"; private static final String SHAPE_PACKAGE = "org.mule.test.metadata.extension.model.shapes"; private static final String EXCEPTION_PACKAGE = "org.mule.test.heisenberg.extension.exception"; @Mock private ExtensionModel extensionModel; private ExportedArtifactsCollector collector; @Before public void setup() { ClassLoaderModelProperty classLoaderModelProperty = new ClassLoaderModelProperty(getClass().getClassLoader()); when(extensionModel.getModelProperty(ClassLoaderModelProperty.class)).thenReturn(of(classLoaderModelProperty)); OutputModel appleList = mockOutputModel(new TypeToken<List<Apple>>() {}.getType()); OperationModel firstOperation = mockOperationModel(appleList, mockOutputModel(List.class)); withMethod(firstOperation, getOperationMethods(HeisenbergOperations.class).stream() .filter(m -> m.getName().equals("callGusFring")) .findFirst()); ParameterModel parameter = mockParameterModel(Shape.class); OutputModel resultList = mockOutputModel(new TypeToken<List<Result<Apple, VeganAttributes>>>() {}.getType()); OperationModel secondOperation = mockOperationModel(resultList, mockOutputModel(List.class), parameter); withMethod(secondOperation, empty()); when(extensionModel.getOperationModels()).thenReturn(asList(firstOperation, secondOperation)); visitableMock(firstOperation, secondOperation); collector = new ExportedArtifactsCollector(extensionModel); } private void withMethod(OperationModel operationModel, Optional<Method> method) { when(operationModel.getModelProperty(ImplementingMethodModelProperty.class)) .thenReturn(method.map(ImplementingMethodModelProperty::new)); } @Test public void collect() { Set<String> exportedPackages = collector.getExportedPackages(); assertThat(exportedPackages, hasSize(6)); assertThat(exportedPackages, containsInAnyOrder(SHAPE_PACKAGE, APPLE_PACKAGE, VEGAN_PACKAGE, PEEL_PACKAGE, SEED_PACKAGE, EXCEPTION_PACKAGE)); } private OutputModel mockOutputModel(Type type) { OutputModel om = mock(OutputModel.class); when(om.getType()).thenReturn(loader.load(type)); return om; } private ParameterModel mockParameterModel(Type type) { ParameterModel pm = mock(ParameterModel.class); when(pm.getType()).thenReturn(loader.load(type)); return pm; } private OperationModel mockOperationModel(OutputModel output, OutputModel attributes, ParameterModel... params) { OperationModel op = mock(OperationModel.class); when(op.getOutput()).thenReturn(output); when(op.getOutputAttributes()).thenReturn(attributes); if (params != null) { mockParameters(op, params); } return op; } }