package org.fluentlenium.core.action;
import org.assertj.core.api.Assertions;
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.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.interactions.HasInputDevices;
import org.openqa.selenium.interactions.Keyboard;
import org.openqa.selenium.interactions.Mouse;
import org.openqa.selenium.interactions.internal.Coordinates;
import org.openqa.selenium.internal.Locatable;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@RunWith(MockitoJUnitRunner.class)
public class MouseElementActionsTest {
@Mock
private Keyboard keyboard;
@Mock
private Mouse mouse;
@Mock
private InputDevicesDriver driver;
@Mock
private LocatableElement element;
@Mock
private Coordinates coordinates;
@Before
public void before() {
when(driver.getKeyboard()).thenReturn(keyboard);
when(driver.getMouse()).thenReturn(mouse);
when(element.getCoordinates()).thenReturn(coordinates);
}
@After
public void after() {
reset(driver, keyboard, mouse);
}
@Test
public void testClickAndHold() {
MouseElementActions actions = new MouseElementActions(driver, element);
actions.clickAndHold();
verify(mouse).mouseMove(coordinates);
verify(mouse).mouseDown(coordinates);
}
@Test
public void testClick() {
MouseElementActions actions = new MouseElementActions(driver, element);
actions.click();
verify(mouse).mouseMove(coordinates);
verify(mouse).click(coordinates);
}
@Test
public void testContextClick() {
MouseElementActions actions = new MouseElementActions(driver, element);
actions.contextClick();
verify(mouse).mouseMove(coordinates);
verify(mouse).contextClick(coordinates);
}
@Test
public void testDoubleClick() {
MouseElementActions actions = new MouseElementActions(driver, element);
actions.doubleClick();
verify(mouse).mouseMove(coordinates);
verify(mouse).doubleClick(coordinates);
}
@Test
public void testRelease() {
MouseElementActions actions = new MouseElementActions(driver, element);
actions.release();
verify(mouse).mouseMove(coordinates);
verify(mouse).mouseUp(coordinates);
}
@Test
public void moveToElement() {
MouseElementActions actions = new MouseElementActions(driver, element);
actions.moveToElement();
verify(mouse).mouseMove(coordinates);
}
@Test
public void moveToElementOffset() {
MouseElementActions actions = new MouseElementActions(driver, element);
actions.moveToElement(10, 20);
verify(mouse).mouseMove(coordinates, 10, 20);
}
@Test
public void dragAndDropFrom() {
MouseElementActions actions = new MouseElementActions(driver, element);
LocatableElement source = mock(LocatableElement.class);
Coordinates sourceCoordinates = mock(Coordinates.class);
when(source.getCoordinates()).thenReturn(sourceCoordinates);
actions.dragAndDropFrom(source);
verify(mouse).mouseMove(sourceCoordinates);
verify(mouse).mouseDown(sourceCoordinates);
verify(mouse, times(2)).mouseMove(coordinates);
verify(mouse).mouseUp(coordinates);
}
@Test
public void dragAndDropTo() {
MouseElementActions actions = new MouseElementActions(driver, element);
LocatableElement target = mock(LocatableElement.class);
Coordinates targetCoordinates = mock(Coordinates.class);
when(target.getCoordinates()).thenReturn(targetCoordinates);
actions.dragAndDropTo(target);
verify(mouse).mouseMove(coordinates);
verify(mouse).mouseDown(coordinates);
verify(mouse, times(2)).mouseMove(targetCoordinates);
verify(mouse).mouseUp(targetCoordinates);
}
@Test
public void dragAndDropBy() {
MouseElementActions actions = new MouseElementActions(driver, element);
actions.dragAndDropBy(10, 20);
verify(mouse).mouseMove(coordinates);
verify(mouse).mouseDown(coordinates);
verify(mouse).mouseMove(null, 10, 20);
verify(mouse).mouseUp(null);
}
@Test
public void testBasic() {
MouseElementActions actions = new MouseElementActions(driver, element);
Assertions.assertThat(actions.basic()).isSameAs(mouse);
}
private abstract static class InputDevicesDriver implements WebDriver, HasInputDevices { // NOPMD AbstractNaming
}
private abstract static class LocatableElement implements WebElement, Locatable { // NOPMD AbstractNaming
}
}