package io.graceland.application; import java.util.List; import org.junit.Test; import io.graceland.plugin.Plugin; import io.graceland.testing.TestModes; import static org.hamcrest.Matchers.contains; import static org.hamcrest.Matchers.equalTo; import static org.junit.Assert.assertThat; import static org.mockito.Mockito.mock; public class ModalApplicationTest extends ApplicationTest { private static final String[] ARGS_MISSING = new String[]{"server", "config.yml"}; private static final String[] ARGS_DEV = new String[]{"server", "config.yml", "--DEV"}; private static final String[] ARGS_PROD = new String[]{"server", "config.yml", "--PROD"}; private static final String[] ARGS_NOT_VALID = new String[]{"server", "config.yml", "--NOTFOUND"}; private static final String[] ARGS_BAD_CASE = new String[]{"server", "config.yml", "--dev"}; private Plugin plugin1 = mock(Plugin.class); private Plugin plugin2 = mock(Plugin.class); private Plugin plugin3 = mock(Plugin.class); private Plugin plugin4 = mock(Plugin.class); @Override protected Application newApplication() { return new ModalApplication<TestModes>(TestModes.class, TestModes.PROD, ARGS_MISSING) { @Override protected void configureFor(TestModes mode) { // do not load a plugin } }; } @Test public void loads_prod_mode() { Application application = new TestModalApplication(ARGS_PROD); List<Plugin> plugins = application.getPlugins(); assertThat(plugins, contains(plugin1, plugin2, plugin3)); } @Test public void loads_dev_mode() { Application application = new TestModalApplication(ARGS_DEV); List<Plugin> plugins = application.getPlugins(); assertThat(plugins, contains(plugin1, plugin3, plugin4)); } @Test(expected = NullPointerException.class) public void requires_a_modeClass() { new ModalApplication<TestModes>(null, TestModes.DEV, ARGS_MISSING) { @Override protected void configureFor(TestModes mode) { // do not configure } }; } @Test(expected = NullPointerException.class) public void requires_a_default_mode() { new ModalApplication<TestModes>(TestModes.class, null, ARGS_MISSING) { @Override protected void configureFor(TestModes mode) { // do not configure } }; } @Test(expected = NullPointerException.class) public void requires_args() { new ModalApplication<TestModes>(TestModes.class, TestModes.DEV, null) { @Override protected void configureFor(TestModes mode) { // do not configure } }; } @Test public void uses_default_mode_when_none_found() { TestModes mode = new TestModalApplication(ARGS_MISSING).getMode(); assertThat(mode, equalTo(TestModes.PROD)); } @Test public void can_read_mode_from_args() { TestModes shouldBeDEV = new TestModalApplication(ARGS_DEV).getMode(); assertThat(shouldBeDEV, equalTo(TestModes.DEV)); TestModes shouldBePROD = new TestModalApplication(ARGS_PROD).getMode(); assertThat(shouldBePROD, equalTo(TestModes.PROD)); } @Test(expected = UnknownModeException.class) public void throws_error_when_unknown_mode() { new TestModalApplication(ARGS_NOT_VALID).getMode(); } @Test(expected = UnknownModeException.class) public void modes_are_case_sensitive() { new TestModalApplication(ARGS_BAD_CASE).getMode(); } class TestModalApplication extends ModalApplication<TestModes> { protected TestModalApplication(String[] args) { super(TestModes.class, TestModes.PROD, args); } @Override protected void configureFor(TestModes mode) { loadPlugin(plugin1); switch (mode) { case DEV: loadPlugin(plugin3); loadPlugin(plugin4); break; case PROD: loadPlugin(plugin2); loadPlugin(plugin3); break; } } } }