package org.fluentlenium.core.hook;
import org.assertj.core.api.Assertions;
import org.fluentlenium.adapter.FluentAdapter;
import org.fluentlenium.core.components.DefaultComponentInstantiator;
import org.fluentlenium.core.domain.FluentList;
import org.fluentlenium.core.domain.FluentWebElement;
import org.fluentlenium.core.proxy.LocatorHandler;
import org.fluentlenium.core.proxy.LocatorProxies;
import org.fluentlenium.core.search.Search;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.runners.MockitoJUnitRunner;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import java.util.Arrays;
import java.util.List;
import java.util.function.Function;
import static org.mockito.Mockito.when;
@RunWith(MockitoJUnitRunner.class)
public class SearchHookTest {
@Mock
private WebElement element;
@Mock
private WebDriver driver;
private DefaultComponentInstantiator instantiator;
private Search search;
@Before
public void before() {
FluentAdapter fluentAdapter = new FluentAdapter();
fluentAdapter.initFluent(driver);
instantiator = new DefaultComponentInstantiator(fluentAdapter);
search = new Search(driver, this, instantiator, fluentAdapter);
when(driver.findElements(By.cssSelector(".selector"))).thenReturn(Arrays.asList(element));
when(element.isDisplayed()).thenReturn(true);
when(element.isEnabled()).thenReturn(true);
}
@Test
public void testHookedSearch() {
FluentWebElement hookedElement = search.el(".selector").withHook(NanoHook.class).click();
Mockito.verify(element).click();
LocatorHandler<WebElement> componentHandler = LocatorProxies.getLocatorHandler(hookedElement.getElement());
NanoHook hookElement = (NanoHook) componentHandler.getInvocationTarget(null);
Assertions.assertThat(hookElement.getBeforeClickNano()).isNotEqualTo(0L);
Assertions.assertThat(hookElement.getAfterClickNano()).isNotEqualTo(0L);
}
@Test
public void testHookSearchFirstAfter() {
FluentWebElement hookedElement = search.$(".selector").withHook(NanoHook.class).first().click();
Mockito.verify(element).click();
LocatorHandler<WebElement> componentHandler = LocatorProxies.getLocatorHandler(hookedElement.getElement());
NanoHook hookElement = (NanoHook) componentHandler.getInvocationTarget(null);
Assertions.assertThat(hookElement.getBeforeClickNano()).isNotEqualTo(0L);
Assertions.assertThat(hookElement.getAfterClickNano()).isNotEqualTo(0L);
}
@Test
public void testHookSearchFirstBefore() {
FluentWebElement hookedElement = search.$(".selector").first().withHook(NanoHook.class).click();
Mockito.verify(element).click();
LocatorHandler<WebElement> componentHandler = LocatorProxies.getLocatorHandler(hookedElement.getElement());
NanoHook hookElement = (NanoHook) componentHandler.getInvocationTarget(null);
Assertions.assertThat(hookElement.getBeforeClickNano()).isNotEqualTo(0L);
Assertions.assertThat(hookElement.getAfterClickNano()).isNotEqualTo(0L);
}
@Test
public void testHookSearchNoHook() {
FluentWebElement hookedElement = search.$(".selector").first().withHook(NanoHook.class).noHook().click();
Mockito.verify(element).click();
LocatorHandler<WebElement> componentHandler = LocatorProxies.getLocatorHandler(hookedElement.getElement());
WebElement hookElement = componentHandler.getInvocationTarget(null);
Assertions.assertThat(hookElement).isNotInstanceOf(NanoHook.class);
}
@Test
public void testHookSearchNoHookClickAndRestore() {
FluentWebElement hookedElement = search.$(".selector").first().withHook(NanoHook.class).noHook().click().restoreHooks();
Mockito.verify(element).click();
LocatorHandler<WebElement> componentHandler = LocatorProxies.getLocatorHandler(hookedElement.getElement());
NanoHook hookElement = (NanoHook) componentHandler.getInvocationTarget(null);
Assertions.assertThat(hookElement.getBeforeClickNano()).isEqualTo(0L);
Assertions.assertThat(hookElement.getAfterClickNano()).isEqualTo(0L);
}
@Test
public void testHookSearchHookBeforeFirstNoHookClickAndRestore() {
FluentWebElement hookedElement = search.$(".selector").withHook(NanoHook.class).first().noHook().click().restoreHooks();
Mockito.verify(element).click();
LocatorHandler<WebElement> componentHandler = LocatorProxies.getLocatorHandler(hookedElement.getElement());
NanoHook hookElement = (NanoHook) componentHandler.getInvocationTarget(null);
Assertions.assertThat(hookElement.getBeforeClickNano()).isEqualTo(0L);
Assertions.assertThat(hookElement.getAfterClickNano()).isEqualTo(0L);
}
@Test
public void testHookSearchNoHookFunction() {
FluentWebElement hookedElement = search.$(".selector").withHook(NanoHook.class).first()
.noHook(new Function<FluentWebElement, FluentWebElement>() {
@Override
public FluentWebElement apply(FluentWebElement input) {
return input.click();
}
});
Mockito.verify(element).click();
LocatorHandler<WebElement> componentHandler = LocatorProxies.getLocatorHandler(hookedElement.getElement());
NanoHook hookElement = (NanoHook) componentHandler.getInvocationTarget(null);
Assertions.assertThat(hookElement.getBeforeClickNano()).isEqualTo(0L);
Assertions.assertThat(hookElement.getAfterClickNano()).isEqualTo(0L);
}
@Test
public void testHookSearchFirstNoHookFunction() {
FluentWebElement hookedElement = search.$(".selector").first().withHook(NanoHook.class)
.noHook(new Function<FluentWebElement, FluentWebElement>() {
@Override
public FluentWebElement apply(FluentWebElement input) {
return input.click();
}
});
Mockito.verify(element).click();
LocatorHandler<WebElement> componentHandler = LocatorProxies.getLocatorHandler(hookedElement.getElement());
NanoHook hookElement = (NanoHook) componentHandler.getInvocationTarget(null);
Assertions.assertThat(hookElement.getBeforeClickNano()).isEqualTo(0L);
Assertions.assertThat(hookElement.getAfterClickNano()).isEqualTo(0L);
}
@Test
public void testHookSearchNoHookClone() {
FluentWebElement hookedElement = search.$(".selector").withHook(NanoHook.class).first().noHookInstance().click();
Mockito.verify(element).click();
LocatorHandler<WebElement> componentHandler = LocatorProxies.getLocatorHandler(hookedElement.getElement());
WebElement hookElement = componentHandler.getInvocationTarget(null);
Assertions.assertThat(hookElement).isNotInstanceOf(NanoHook.class);
}
@Test
public void testHookSearchListNoHookClone() {
FluentList<FluentWebElement> hookedElement = search.$(".selector").withHook(NanoHook.class).noHookInstance().click();
Mockito.verify(element).click();
LocatorHandler<List<WebElement>> componentHandler = LocatorProxies.getLocatorHandler(hookedElement);
List<WebElement> hookElement = componentHandler.getInvocationTarget(null);
Assertions.assertThat(hookElement).isNotInstanceOf(NanoHook.class);
}
}