package org.fluentlenium.core.inject; import org.fluentlenium.adapter.FluentAdapter; import org.fluentlenium.core.FluentControl; import org.fluentlenium.core.components.ComponentInstantiator; import org.fluentlenium.core.components.ComponentsManager; import org.fluentlenium.core.domain.FluentList; import org.fluentlenium.core.domain.FluentListImpl; import org.fluentlenium.core.domain.FluentWebElement; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import java.util.ArrayList; import java.util.List; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.reset; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @RunWith(MockitoJUnitRunner.class) public class FluentInjectorElementTest { @Mock private WebDriver webDriver; private FluentAdapter fluentAdapter; private FluentInjector injector; @Before public void before() { fluentAdapter = new FluentAdapter(); fluentAdapter.initFluent(webDriver); injector = new FluentInjector(fluentAdapter, null, new ComponentsManager(fluentAdapter), new DefaultContainerInstanciator(fluentAdapter)); } @After public void after() { reset(webDriver); } public static class FluentWebElementSubClass extends FluentWebElement { public FluentWebElementSubClass(WebElement webElement, FluentControl fluentControl, ComponentInstantiator instantiator) { super(webElement, fluentControl, instantiator); } } public static class WebElementWrapper { private final WebElement element; public WebElementWrapper(WebElement element) { this.element = element; } public WebElement getElement() { return element; } } public static class WebElementDriverWrapper { private final WebElement element; private final FluentControl fluentControl; public WebElementDriverWrapper(WebElement element, FluentControl fluentControl) { this.element = element; this.fluentControl = fluentControl; } public WebElement getElement() { return element; } public FluentControl getFluentControl() { return fluentControl; } } public static class FluentWebElementContainer { private FluentWebElement element; } @SuppressWarnings("PMD.FieldDeclarationsShouldBeAtStartOfClass") private static final FluentWebElement EXISTING_ELEMENT = mock(FluentWebElement.class); public static class ExistingFluentWebElementContainer { private final FluentWebElement element = EXISTING_ELEMENT; } public static class FluentWebElementSubClassContainer { private FluentWebElementSubClass element; } public static class WebElementWrapperContainer { private WebElementWrapper element; } public static class WebElementDriverWrapperContainer { private WebElementDriverWrapper element; } public static class FluentWebElementListContainer { private List<FluentWebElement> element; } public static class FluentWebElementSubClassListContainer { private List<FluentWebElementSubClass> element; } public static class WebElementWrapperListContainer { private List<WebElementWrapper> element; } public static class WebElementDriverWrapperListContainer { private List<WebElementDriverWrapper> element; } public static class FluentListSubClass<T extends FluentWebElementSubClass> extends FluentListImpl<T> { public FluentListSubClass(Class<T> componentClass, List<T> list, FluentControl fluentControl, ComponentInstantiator instantiator) { super(componentClass, list, fluentControl, instantiator); } } public static class ListSubClassContainer { private FluentListSubClass<FluentWebElementSubClass> element; } @Test public void testFluentWebElement() { FluentWebElementContainer container = new FluentWebElementContainer(); injector.inject(container); WebElement webElement = mock(WebElement.class); when(webElement.getTagName()).thenReturn("h1"); when(webDriver.findElement(any(By.class))).thenReturn(webElement); assertThat(container.element.tagName()).isEqualTo("h1"); assertThat(container.element).isExactlyInstanceOf(FluentWebElement.class); assertThat(container.element.getElement()).isInstanceOf(WebElement.class); } /** * Existing variables should not be injected. */ @Test public void testExistingFluentWebElement() { ExistingFluentWebElementContainer container = new ExistingFluentWebElementContainer(); injector.inject(container); WebElement webElement = mock(WebElement.class); when(webDriver.findElement(any(By.class))).thenReturn(webElement); assertThat(container.element).isSameAs(EXISTING_ELEMENT); } @Test public void testFluentWebElementExtends() { FluentWebElementSubClassContainer container = new FluentWebElementSubClassContainer(); injector.inject(container); WebElement webElement = mock(WebElement.class); when(webElement.getTagName()).thenReturn("h1"); when(webDriver.findElement(any(By.class))).thenReturn(webElement); assertThat(container.element.tagName()).isEqualTo("h1"); assertThat(container.element).isExactlyInstanceOf(FluentWebElementSubClass.class); assertThat(container.element.getElement()).isInstanceOf(WebElement.class); } @Test public void testWebElementWrapper() { WebElementWrapperContainer container = new WebElementWrapperContainer(); WebElement webElement = mock(WebElement.class); when(webDriver.findElement(any(By.class))).thenReturn(webElement); injector.inject(container); assertThat(container.element).isExactlyInstanceOf(WebElementWrapper.class); assertThat(container.element.getElement()).isInstanceOf(WebElement.class); } @Test public void testWebElementDriverWrapper() { WebElementDriverWrapperContainer container = new WebElementDriverWrapperContainer(); WebElement webElement = mock(WebElement.class); when(webDriver.findElement(any(By.class))).thenReturn(webElement); injector.inject(container); assertThat(container.element).isExactlyInstanceOf(WebElementDriverWrapper.class); assertThat(container.element.getElement()).isInstanceOf(WebElement.class); assertThat(container.element.getFluentControl()).isSameAs(fluentAdapter); } @Test public void testFluentWebElementList() { FluentWebElementListContainer container = new FluentWebElementListContainer(); injector.inject(container); WebElement webElement = mock(WebElement.class); when(webElement.getTagName()).thenReturn("h1"); WebElement webElement2 = mock(WebElement.class); when(webElement2.getTagName()).thenReturn("h2"); ArrayList<WebElement> webElements = new ArrayList<>(); webElements.add(webElement); webElements.add(webElement2); when(webDriver.findElements(any(By.class))).thenReturn(webElements); assertThat(container.element).hasSize(2); assertThat(container.element).isInstanceOf(FluentList.class); assertThat(container.element.get(0).tagName()).isEqualTo("h1"); assertThat(container.element.get(0)).isExactlyInstanceOf(FluentWebElement.class); assertThat(container.element.get(0).getElement()).isInstanceOf(WebElement.class); assertThat(container.element.get(1).tagName()).isEqualTo("h2"); assertThat(container.element.get(1)).isExactlyInstanceOf(FluentWebElement.class); assertThat(container.element.get(1).getElement()).isInstanceOf(WebElement.class); } @Test public void testFluentWebElementExtendsList() { FluentWebElementSubClassListContainer container = new FluentWebElementSubClassListContainer(); injector.inject(container); WebElement webElement = mock(WebElement.class); when(webElement.getTagName()).thenReturn("h1"); WebElement webElement2 = mock(WebElement.class); when(webElement2.getTagName()).thenReturn("h2"); ArrayList<WebElement> webElements = new ArrayList<>(); webElements.add(webElement); webElements.add(webElement2); when(webDriver.findElements(any(By.class))).thenReturn(webElements); assertThat(container.element).hasSize(2); assertThat(container.element).isInstanceOf(FluentList.class); assertThat(container.element.get(0).tagName()).isEqualTo("h1"); assertThat(container.element.get(0)).isExactlyInstanceOf(FluentWebElementSubClass.class); assertThat(container.element.get(0).getElement()).isInstanceOf(WebElement.class); assertThat(container.element.get(1).tagName()).isEqualTo("h2"); assertThat(container.element.get(1)).isExactlyInstanceOf(FluentWebElementSubClass.class); assertThat(container.element.get(1).getElement()).isInstanceOf(WebElement.class); } @Test public void testListSubClass() { ListSubClassContainer container = new ListSubClassContainer(); injector.inject(container); WebElement webElement = mock(WebElement.class); when(webElement.getTagName()).thenReturn("h1"); WebElement webElement2 = mock(WebElement.class); when(webElement2.getTagName()).thenReturn("h2"); ArrayList<WebElement> webElements = new ArrayList<>(); webElements.add(webElement); webElements.add(webElement2); when(webDriver.findElements(any(By.class))).thenReturn(webElements); assertThat(container.element).hasSize(2); assertThat(container.element).isExactlyInstanceOf(FluentListSubClass.class); assertThat(container.element.get(0).tagName()).isEqualTo("h1"); assertThat(container.element.get(0)).isExactlyInstanceOf(FluentWebElementSubClass.class); assertThat(container.element.get(0).getElement()).isInstanceOf(WebElement.class); assertThat(container.element.get(1).tagName()).isEqualTo("h2"); assertThat(container.element.get(1)).isExactlyInstanceOf(FluentWebElementSubClass.class); assertThat(container.element.get(1).getElement()).isInstanceOf(WebElement.class); } @Test public void testWebElementWrapperList() { WebElementWrapperListContainer container = new WebElementWrapperListContainer(); injector.inject(container); WebElement webElement = mock(WebElement.class); when(webElement.getTagName()).thenReturn("h1"); WebElement webElement2 = mock(WebElement.class); when(webElement2.getTagName()).thenReturn("h2"); ArrayList<WebElement> webElements = new ArrayList<>(); webElements.add(webElement); webElements.add(webElement2); when(webDriver.findElements(any(By.class))).thenReturn(webElements); assertThat(container.element).hasSize(2); assertThat(container.element).isNotInstanceOf(FluentList.class); assertThat(container.element.get(0)).isExactlyInstanceOf(WebElementWrapper.class); assertThat(container.element.get(0).getElement()).isInstanceOf(WebElement.class); assertThat(container.element.get(0).getElement().getTagName()).isEqualTo("h1"); assertThat(container.element.get(1)).isExactlyInstanceOf(WebElementWrapper.class); assertThat(container.element.get(1).getElement()).isInstanceOf(WebElement.class); assertThat(container.element.get(1).getElement().getTagName()).isEqualTo("h2"); } @Test public void testWebElementDriverWrapperList() { WebElementDriverWrapperListContainer container = new WebElementDriverWrapperListContainer(); injector.inject(container); WebElement webElement = mock(WebElement.class); when(webElement.getTagName()).thenReturn("h1"); WebElement webElement2 = mock(WebElement.class); when(webElement2.getTagName()).thenReturn("h2"); ArrayList<WebElement> webElements = new ArrayList<>(); webElements.add(webElement); webElements.add(webElement2); when(webDriver.findElements(any(By.class))).thenReturn(webElements); assertThat(container.element).hasSize(2); assertThat(container.element).isNotInstanceOf(FluentList.class); assertThat(container.element.get(0)).isExactlyInstanceOf(WebElementDriverWrapper.class); assertThat(container.element.get(0).getElement()).isInstanceOf(WebElement.class); assertThat(container.element.get(0).getElement().getTagName()).isEqualTo("h1"); assertThat(container.element.get(0).getFluentControl()).isSameAs(fluentAdapter); assertThat(container.element.get(1)).isExactlyInstanceOf(WebElementDriverWrapper.class); assertThat(container.element.get(1).getElement()).isInstanceOf(WebElement.class); assertThat(container.element.get(1).getElement().getTagName()).isEqualTo("h2"); assertThat(container.element.get(1).getFluentControl()).isSameAs(fluentAdapter); } @Test public void testNewInstance() { WebElement webElement = mock(WebElement.class); when(webElement.getTagName()).thenReturn("h1"); WebElement webElement2 = mock(WebElement.class); when(webElement2.getTagName()).thenReturn("h2"); ArrayList<WebElement> webElements = new ArrayList<>(); webElements.add(webElement); webElements.add(webElement2); when(webDriver.findElements(any(By.class))).thenReturn(webElements); WebElementDriverWrapperListContainer container = injector.newInstance(WebElementDriverWrapperListContainer.class); assertThat(container.element).hasSize(2); assertThat(container.element).isNotInstanceOf(FluentList.class); assertThat(container.element.get(0)).isExactlyInstanceOf(WebElementDriverWrapper.class); assertThat(container.element.get(0).getElement()).isInstanceOf(WebElement.class); assertThat(container.element.get(0).getElement().getTagName()).isEqualTo("h1"); assertThat(container.element.get(0).getFluentControl()).isSameAs(fluentAdapter); assertThat(container.element.get(1)).isExactlyInstanceOf(WebElementDriverWrapper.class); assertThat(container.element.get(1).getElement()).isInstanceOf(WebElement.class); assertThat(container.element.get(1).getElement().getTagName()).isEqualTo("h2"); assertThat(container.element.get(1).getFluentControl()).isSameAs(fluentAdapter); } }