package org.fluentlenium.configuration;
import org.assertj.core.api.Assertions;
import org.fluentlenium.configuration.PropertiesBackendConfigurationTest.DummyConfigurationFactory;
import org.junit.Before;
import org.junit.Test;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import org.openqa.selenium.remote.DesiredCapabilities;
import java.util.function.Function;
import static org.mockito.Mockito.RETURNS_DEFAULTS;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
public class ComposedConfigurationTest {
private ProgrammaticConfiguration configuration;
private ConfigurationProperties configurationProperties1;
private ConfigurationProperties configurationProperties2;
private ConfigurationProperties configurationProperties3;
private ComposedConfiguration composed;
@Before
public void before() {
Answer configurationReadAnswer = new Answer() {
@Override
public Object answer(InvocationOnMock invocation) throws Throwable {
if (invocation.getMethod().getReturnType().isPrimitive()) {
return RETURNS_DEFAULTS.answer(invocation);
}
return null;
}
};
configurationProperties1 = mock(ConfigurationProperties.class, configurationReadAnswer);
configurationProperties2 = mock(ConfigurationProperties.class, configurationReadAnswer);
configurationProperties3 = mock(ConfigurationProperties.class, configurationReadAnswer);
configuration = new ProgrammaticConfiguration();
composed = new ComposedConfiguration(configuration, configuration, configurationProperties1, configurationProperties2,
configurationProperties3);
}
@Test
public void configurationFactory() {
Assertions.assertThat(composed.getConfigurationFactory()).isNull();
composed.setConfigurationFactory(DefaultConfigurationFactory.class);
Assertions.assertThat(composed.getConfigurationFactory()).isSameAs(DefaultConfigurationFactory.class);
when(configurationProperties2.getConfigurationFactory()).thenAnswer(new Answer<Object>() {
@Override
public Object answer(InvocationOnMock invocation) throws Throwable {
return DummyConfigurationFactory.class;
}
});
Assertions.assertThat(composed.getConfigurationFactory()).isSameAs(DefaultConfigurationFactory.class);
composed.setConfigurationFactory(null);
Assertions.assertThat(composed.getConfigurationFactory()).isSameAs(DummyConfigurationFactory.class);
when(configurationProperties3.getConfigurationFactory()).thenAnswer(new Answer<Object>() {
@Override
public Object answer(InvocationOnMock invocation) throws Throwable {
return DefaultConfigurationFactory.class;
}
});
Assertions.assertThat(composed.getConfigurationFactory()).isSameAs(DummyConfigurationFactory.class);
}
private <T> void testImpl(Function<ConfigurationProperties, T> getter, Function<T, Void> setter, T defaultValue, T value1,
T value2) {
if (defaultValue == null) {
Assertions.assertThat(getter.apply(composed)).isNull();
} else {
Assertions.assertThat(getter.apply(composed)).isEqualTo(defaultValue);
}
setter.apply(value1);
Assertions.assertThat(getter.apply(composed)).isEqualTo(value1);
when(getter.apply(configurationProperties2)).thenReturn(value2);
Assertions.assertThat(getter.apply(composed)).isEqualTo(value1);
setter.apply(defaultValue);
Assertions.assertThat(getter.apply(composed)).isEqualTo(value2);
when(getter.apply(configurationProperties3)).thenReturn(value1);
Assertions.assertThat(getter.apply(composed)).isEqualTo(value2);
}
@Test
public void webDriver() {
testImpl(new Function<ConfigurationProperties, String>() {
@Override
public String apply(ConfigurationProperties input) {
return input.getWebDriver();
}
}, new Function<String, Void>() {
@Override
public Void apply(String input) {
composed.setWebDriver(input);
return null;
}
}, null, "firefox", "chrome");
}
@Test
public void baseUrl() {
testImpl(input -> input.getBaseUrl(), input -> {
composed.setBaseUrl(input);
return null;
}, null, "firefox", "chrome");
}
@Test
public void pageLoadTimeout() {
testImpl(input -> input.getPageLoadTimeout(), input -> {
composed.setPageLoadTimeout(input);
return null;
}, null, 1000L, 2000L);
}
@Test
public void implicitlyWait() {
testImpl(input -> input.getImplicitlyWait(), input -> {
composed.setImplicitlyWait(input);
return null;
}, null, 1000L, 2000L);
}
@Test
public void scriptTimeout() {
testImpl(input -> input.getScriptTimeout(), input -> {
composed.setScriptTimeout(input);
return null;
}, null, 1000L, 2000L);
}
@Test
public void screenshotPath() {
testImpl(input -> input.getScreenshotPath(), input -> {
composed.setScreenshotPath(input);
return null;
}, null, "firefox", "chrome");
}
@Test
public void htmlDumpPath() {
testImpl(input -> input.getHtmlDumpPath(), input -> {
composed.setHtmlDumpPath(input);
return null;
}, null, "firefox", "chrome");
}
@Test
public void screenshotMode() {
testImpl(input -> input.getScreenshotMode(), input -> {
composed.setScreenshotMode(input);
return null;
}, null, ConfigurationProperties.TriggerMode.MANUAL, ConfigurationProperties.TriggerMode.AUTOMATIC_ON_FAIL);
}
@Test
public void htmlDumpMode() {
testImpl(input -> input.getHtmlDumpMode(), input -> {
composed.setHtmlDumpMode(input);
return null;
}, null, ConfigurationProperties.TriggerMode.MANUAL, ConfigurationProperties.TriggerMode.AUTOMATIC_ON_FAIL);
}
@Test
public void capabilities() {
DesiredCapabilities cap1 = new DesiredCapabilities();
cap1.setJavascriptEnabled(true);
DesiredCapabilities cap2 = new DesiredCapabilities();
cap2.setJavascriptEnabled(false);
testImpl(input -> input.getCapabilities(), input -> {
composed.setCapabilities(input);
return null;
}, null, cap1, cap2);
}
@Test
public void eventsEnabled() {
testImpl(input -> input.getEventsEnabled(), input -> {
composed.setEventsEnabled(input);
return null;
}, null, true, false);
}
}