package io.bootique.meta.config; import com.google.inject.Module; import io.bootique.BQModule; import io.bootique.BQModuleProvider; import io.bootique.BQRuntime; import io.bootique.annotation.BQConfig; import io.bootique.annotation.BQConfigProperty; import io.bootique.meta.module.ModulesMetadata; import io.bootique.unit.BQInternalTestFactory; import org.junit.Rule; import org.junit.Test; import org.mockito.Mockito; import java.lang.reflect.Type; import java.util.Collection; import java.util.Collections; import java.util.Map; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; public class ConfigMetadataIT { @Rule public BQInternalTestFactory runtimeFactory = new BQInternalTestFactory(); @Test public void testSingleConfig() { BQRuntime runtime = runtimeFactory.app().module(new BQModuleProvider() { @Override public Module module() { return Mockito.mock(Module.class); } @Override public Map<String, Type> configs() { return Collections.singletonMap("pf", TestConfig.class); } @Override public BQModule.Builder moduleBuilder() { return BQModuleProvider.super .moduleBuilder() .name("my"); } }).createRuntime(); Collection<ConfigMetadataNode> configs = runtime .getInstance(ModulesMetadata.class) .getModules() .stream() .filter(mmd -> "my".equals(mmd.getName())) .findFirst() .get() .getConfigs(); assertEquals(1, configs.size()); ConfigValueMetadata cm = (ConfigValueMetadata) configs.iterator().next(); assertTrue("pf".equals(cm.getName())); String walkThrough = cm.accept(new ConfigMetadataVisitor<String>() { @Override public String visitObjectMetadata(ConfigObjectMetadata metadata) { StringBuilder buffer = new StringBuilder(visitValueMetadata(metadata)); metadata.getProperties().forEach(p -> buffer.append(":[").append(p.accept(this)).append("]")); return buffer.toString(); } @Override public String visitValueMetadata(ConfigValueMetadata metadata) { return metadata.getName() + ":" + metadata.getType().getTypeName() + ":" + metadata.getDescription(); } }); assertEquals("pf:io.bootique.meta.config.ConfigMetadataIT$TestConfig:null:[p1:java.lang.String:(p1 desc)]", walkThrough); } @BQConfig public static class TestConfig { private String p1; private String p2; @BQConfigProperty("(p1 desc)") public void setP1(String p1) { this.p1 = p1; } public void setP2(String p2) { this.p2 = p2; } } }