/*
* 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.metadata;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.hasItems;
import static org.mule.runtime.api.component.location.Location.builder;
import static org.mule.tck.junit4.matcher.MetadataKeyMatcher.metadataKeyWithId;
import static org.mule.test.metadata.extension.MetadataConnection.CAR;
import static org.mule.test.metadata.extension.MetadataConnection.HOUSE;
import static org.mule.test.metadata.extension.MetadataConnection.PERSON;
import static org.mule.test.module.extension.metadata.MetadataExtensionFunctionalTestCase.ResolutionType.EXPLICIT_RESOLUTION;
import org.mule.runtime.api.meta.model.source.SourceModel;
import org.mule.runtime.api.metadata.MetadataKey;
import org.mule.runtime.api.metadata.MetadataKeysContainer;
import org.mule.runtime.api.metadata.MetadataService;
import org.mule.runtime.api.metadata.descriptor.ComponentMetadataDescriptor;
import org.mule.runtime.api.metadata.resolving.MetadataResult;
import org.mule.runtime.core.api.construct.Flow;
import org.mule.tck.message.StringAttributes;
import java.util.Set;
import org.junit.Test;
public class SourceMetadataTestCase extends MetadataExtensionFunctionalTestCase<SourceModel> {
public SourceMetadataTestCase(ResolutionType resolutionType) {
super(resolutionType);
this.provider = resolutionType == EXPLICIT_RESOLUTION ? MetadataService::getSourceMetadata
: (metadataService, componentId, key) -> metadataService.getSourceMetadata(componentId);
this.location = builder().globalName(SOURCE_METADATA).addSourcePart().build();
}
@Override
protected String getConfigFile() {
return METADATA_TEST;
}
@Override
protected boolean isDisposeContextPerClass() {
return false;
}
@Test
public void getSourceMetadataKeys() {
final MetadataResult<MetadataKeysContainer> metadataKeysResult = metadataService.getMetadataKeys(location);
assertThat(metadataKeysResult.isSuccess(), is(true));
final Set<MetadataKey> metadataKeys = getKeysFromContainer(metadataKeysResult.get());
assertThat(metadataKeys.size(), is(3));
assertThat(metadataKeys, hasItems(metadataKeyWithId(PERSON), metadataKeyWithId(CAR), metadataKeyWithId(HOUSE)));
}
@Test
public void injectComposedMetadataKeyIdInstanceInSource() throws Exception {
((Flow) getFlowConstruct(SOURCE_METADATA_WITH_MULTILEVEL)).start();
}
@Test
public void injectSimpleMetadataKeyIdInstanceInSource() throws Exception {
((Flow) getFlowConstruct(SOURCE_METADATA)).start();
}
@Test
public void getSourceDynamicOutputMetadata() throws Exception {
final MetadataResult<ComponentMetadataDescriptor<SourceModel>> result = getComponentDynamicMetadata(PERSON_METADATA_KEY);
assertThat(result.isSuccess(), is(true));
ComponentMetadataDescriptor<SourceModel> componentMetadata = result.get();
assertExpectedOutput(componentMetadata.getModel(), personType, typeLoader.load(StringAttributes.class));
assertThat(componentMetadata.getMetadataAttributes().getKey().get(), is(PERSON_METADATA_KEY));
}
}