package io.dropwizard.cli; import io.dropwizard.Application; import io.dropwizard.Configuration; import io.dropwizard.configuration.ConfigurationException; import io.dropwizard.configuration.ConfigurationFactory; import io.dropwizard.configuration.ConfigurationSourceProvider; import io.dropwizard.logging.LoggingFactory; import io.dropwizard.server.ServerFactory; import io.dropwizard.setup.Bootstrap; import io.dropwizard.setup.Environment; import io.dropwizard.util.JarLocation; import net.sourceforge.argparse4j.inf.Argument; import net.sourceforge.argparse4j.inf.Namespace; import net.sourceforge.argparse4j.inf.Subparser; import org.eclipse.jetty.server.Server; import org.junit.After; import org.junit.Before; import org.junit.Test; import java.io.IOException; import java.util.Optional; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; public class InheritedServerCommandTest { private static class ApiCommand extends ServerCommand<Configuration> { protected ApiCommand(final Application<Configuration> application) { super(application, "api", "Runs the Dropwizard application as an API HTTP server"); } } private static class MyApplication extends Application<Configuration> { @Override public void initialize(final Bootstrap<Configuration> bootstrap) { bootstrap.addCommand(new ApiCommand(this)); super.initialize(bootstrap); } @Override public void run(Configuration configuration, Environment environment) throws Exception { } } private final MyApplication application = new MyApplication(); private final ApiCommand command = new ApiCommand(application); private final Server server = new Server(0); private final Environment environment = mock(Environment.class); private final Namespace namespace = mock(Namespace.class); private final ServerFactory serverFactory = mock(ServerFactory.class); private final Configuration configuration = mock(Configuration.class); @Before public void setUp() throws Exception { when(serverFactory.build(environment)).thenReturn(server); when(configuration.getServerFactory()).thenReturn(serverFactory); } @After public void tearDown() throws Exception { server.stop(); } @Test public void hasAName() throws Exception { assertThat(command.getName()) .isEqualTo("api"); } @Test public void hasADescription() throws Exception { assertThat(command.getDescription()) .isEqualTo("Runs the Dropwizard application as an API HTTP server"); } @Test public void buildsAndRunsAConfiguredServer() throws Exception { command.run(environment, namespace, configuration); assertThat(server.isStarted()) .isTrue(); } @Test public void usesDefaultConfigPath() throws Exception { class SingletonConfigurationFactory implements ConfigurationFactory { @Override public Object build(final ConfigurationSourceProvider provider, final String path) throws IOException, ConfigurationException { return configuration; } @Override public Object build() throws IOException, ConfigurationException { throw new AssertionError("Didn't use the default config path variable"); } } when(configuration.getLoggingFactory()).thenReturn(mock(LoggingFactory.class)); final Bootstrap<Configuration> bootstrap = new Bootstrap<>(application); bootstrap.setConfigurationFactoryFactory((klass, validator, objectMapper, propertyPrefix) -> new SingletonConfigurationFactory()); bootstrap.addCommand(new ConfiguredCommand<Configuration>("test", "a test command") { @Override protected void run(final Bootstrap<Configuration> bootstrap, final Namespace namespace, final Configuration configuration) throws Exception { assertThat(namespace.getString("file")) .isNotEmpty() .isEqualTo("yaml/server.yml"); } @Override protected Argument addFileArgument(final Subparser subparser) { return super.addFileArgument(subparser) .setDefault("yaml/server.yml"); } }); final JarLocation location = mock(JarLocation.class); when(location.toString()).thenReturn("dw-thing.jar"); when(location.getVersion()).thenReturn(Optional.of("1.0.0")); Cli cli = new Cli(location, bootstrap, System.out, System.err); cli.run("test"); } }