package org.jbake.launcher;
import org.apache.commons.configuration.CompositeConfiguration;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.kohsuke.args4j.CmdLineException;
import org.kohsuke.args4j.CmdLineParser;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import static org.mockito.Mockito.verify;
@RunWith( MockitoJUnitRunner.class )
public class MainTest {
private Main main;
@Mock private Baker mockBaker;
@Mock private JettyServer mockJetty;
@Mock private BakeWatcher mockWatcher;
@Before
public void setup() {
this.main = new Main(mockBaker, mockJetty, mockWatcher);
}
@Test
public void launchJetty() {
String[] args = {"-s"};
main.run(args);
verify(mockJetty).run("output","8820");
}
@Test
public void launchBakeAndJetty() {
String[] args = {"-b", "-s"};
main.run(args);
verify(mockJetty).run("output","8820");
}
@Test
public void launchBakeAndJettyWithCustomDirForJetty() {
String[] args = {"-b", "-s", "src/jbake"};
main.run(args);
verify(mockJetty).run("src/jbake","8820");
}
@Test
public void launchJettyWithCustomSourceDir() {
String[] args = {"src/jbake", "-s"};
main.run(args);
verify(mockJetty).run("src/jbake","8820");
}
@Test
public void launchJettyWithCustomServerSourceDir() {
String[] args = {"-s", "build/jbake"};
main.run(args);
verify(mockJetty).run("build/jbake","8820");
}
// Documentation states these two commands will define the custom output, but the LaunchOptions file isn't setup for that.
// I have written this test to define the existing functionality of the code and not that defined in docs.
@Test
public void launchJettyWithCustomDestinationDir() {
String[] args = {"-s", "build/jbake"};
main.run(args);
verify(mockJetty).run("build/jbake","8820");
}
@Test
public void launchJettyWithCustomSrcAndDestDir() {
String[] args = {"jbake", "build/jbake", "-s"};
main.run(args);
verify(mockJetty).run("build/jbake","8820");
}
@Test
public void launchJettyWithCustomDestViaConfig() throws CmdLineException {
String[] args = {"-s"};
Map<String, String> properties = new HashMap<String, String>(){{
put("destination.folder", "build/jbake");
}};
main.run(stubOptions(args), stubConfig(properties));
verify(mockJetty).run("build/jbake","8820");
}
@Test
public void launchJettyWithCmdlineOverridingProperties() throws CmdLineException {
String[] args = {"src/jbake", "build/jbake", "-s"};
Map<String,String> properties = new HashMap<String,String>(){{
put("destination.folder", "target/jbake");
}};
main.run(stubOptions(args), stubConfig(properties));
verify(mockJetty).run("build/jbake","8820");
}
private LaunchOptions stubOptions(String[] args) throws CmdLineException {
LaunchOptions res = new LaunchOptions();
CmdLineParser parser = new CmdLineParser(res);
parser.parseArgument(args);
return res;
}
private CompositeConfiguration stubConfig(Map<String, String> properties) {
CompositeConfiguration config = new CompositeConfiguration();
config.addProperty("server.port", "8820");
for (Map.Entry<String,String> pair : properties.entrySet()) {
config.addProperty(pair.getKey(), pair.getValue());
}
return config;
}
}