diff --git a/xwiki-platform-core/xwiki-platform-panels/xwiki-platform-panels-test/xwiki-platform-panels-test-docker/src/test/it/org/xwiki/panels/test/ui/docker/PanelIT.java b/xwiki-platform-core/xwiki-platform-panels/xwiki-platform-panels-test/xwiki-platform-panels-test-docker/src/test/it/org/xwiki/panels/test/ui/docker/PanelIT.java index 06b7a407dab0..35545f67ca41 100644 --- a/xwiki-platform-core/xwiki-platform-panels/xwiki-platform-panels-test/xwiki-platform-panels-test-docker/src/test/it/org/xwiki/panels/test/ui/docker/PanelIT.java +++ b/xwiki-platform-core/xwiki-platform-panels/xwiki-platform-panels-test/xwiki-platform-panels-test-docker/src/test/it/org/xwiki/panels/test/ui/docker/PanelIT.java @@ -22,6 +22,7 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Order; import org.junit.jupiter.api.Test; +import org.openqa.selenium.By; import org.xwiki.administration.test.po.AdministrationPage; import org.xwiki.livedata.test.po.TableLayoutElement; import org.xwiki.model.reference.DocumentReference; @@ -56,6 +57,12 @@ class PanelIT private static final String SPECIAL_TITLE = "Is # & \u0163 triky\"? c:windows /root $util"; + private static final String PANELSIZE_SMALL = "Small"; + private static final String PANELSIZE_MEDIUM = "Medium"; + private static final String PANELSIZE_LARGE = "Large"; + private static final String PANEL_FIELD_WIDTH_RIGHT = "rightPanelsWidth"; + private static final String PANEL_FIELD_WIDTH_LEFT = "leftPanelsWidth"; + @BeforeEach void setUp(TestUtils testUtils) { @@ -174,6 +181,115 @@ void limitPanelViewRight(TestUtils testUtils, TestReference testReference) testUtils.deletePage(new DocumentReference("xwiki", "Panels", SPECIAL_TITLE)); } + @Test + @Order(4) + void togglePanels(TestUtils testUtils, TestReference testReference) throws Exception { + testUtils.setWikiPreference("rightPanels", "Panels.QuickLinks"); + testUtils.setWikiPreference("leftPanels", "Panels.Welcome"); + testUtils.setWikiPreference("showRightPanels", "1"); + testUtils.setWikiPreference("showLeftPanels", "1"); + String testMethodName = testReference.getLastSpaceReference().getName(); + String testClassName = testReference.getSpaceReferences().get(0).getName(); + testUtils.gotoPage(testClassName, testMethodName); + PageWithPanels panelPage = new PageWithPanels(); + // Check the initial state + assertTrue(panelPage.hasLeftPanels()); + assertTrue(panelPage.hasRightPanels()); + assertTrue(panelPage.panelIsToggled(PageWithPanels.LEFT)); + assertTrue(panelPage.panelIsToggled(PageWithPanels.RIGHT)); + // Toggle the left panels ON and OFF + panelPage.togglePanel(PageWithPanels.LEFT); + assertFalse(panelPage.panelIsToggled(PageWithPanels.LEFT)); + assertTrue(panelPage.panelIsToggled(PageWithPanels.RIGHT)); + panelPage.togglePanel(PageWithPanels.LEFT); + assertTrue(panelPage.panelIsToggled(PageWithPanels.LEFT)); + assertTrue(panelPage.panelIsToggled(PageWithPanels.RIGHT)); + // Toggle the right panels OFF and ON + panelPage.togglePanel(PageWithPanels.RIGHT); + assertTrue(panelPage.panelIsToggled(PageWithPanels.LEFT)); + assertFalse(panelPage.panelIsToggled(PageWithPanels.RIGHT)); + panelPage.togglePanel(PageWithPanels.RIGHT); + assertTrue(panelPage.panelIsToggled(PageWithPanels.LEFT)); + assertTrue(panelPage.panelIsToggled(PageWithPanels.RIGHT)); + // Toggle both panels OFF at once + panelPage.togglePanel(PageWithPanels.LEFT); + panelPage.togglePanel(PageWithPanels.RIGHT); + assertFalse(panelPage.panelIsToggled(PageWithPanels.LEFT)); + assertFalse(panelPage.panelIsToggled(PageWithPanels.RIGHT)); + // Reload the page to make sure the preference is kept in the localstorage + testUtils.getDriver().navigate().refresh(); + assertFalse(panelPage.panelIsToggled(PageWithPanels.LEFT)); + assertFalse(panelPage.panelIsToggled(PageWithPanels.RIGHT)); + panelPage.togglePanel(PageWithPanels.LEFT); + panelPage.togglePanel(PageWithPanels.RIGHT); + testUtils.getDriver().navigate().refresh(); + assertTrue(panelPage.panelIsToggled(PageWithPanels.LEFT)); + assertTrue(panelPage.panelIsToggled(PageWithPanels.RIGHT)); + } + + @Test + @Order(5) + void resizePanels(TestUtils testUtils, TestReference testReference) throws Exception { + testUtils.setWikiPreference("rightPanels", "Panels.QuickLinks"); + testUtils.setWikiPreference("leftPanels", "Panels.Welcome"); + testUtils.setWikiPreference("showRightPanels", "1"); + testUtils.setWikiPreference("showLeftPanels", "1"); + testUtils.setWikiPreference(PANEL_FIELD_WIDTH_RIGHT, PANELSIZE_MEDIUM); + testUtils.setWikiPreference(PANEL_FIELD_WIDTH_LEFT, PANELSIZE_MEDIUM); + String testMethodName = testReference.getLastSpaceReference().getName(); + String testClassName = testReference.getSpaceReferences().get(0).getName(); + testUtils.gotoPage(testClassName, testMethodName); + PageWithPanels panelPage = new PageWithPanels(); + assertAlmostEqualSize(200, panelPage.getPanelWidth(PageWithPanels.LEFT)); + assertAlmostEqualSize(200, panelPage.getPanelWidth(PageWithPanels.RIGHT)); + // Test that the defaults are respected. + testUtils.setWikiPreference(PANEL_FIELD_WIDTH_RIGHT, PANELSIZE_SMALL); + testUtils.setWikiPreference(PANEL_FIELD_WIDTH_LEFT, PANELSIZE_SMALL); + // Reload the page with the new preferences taken into account. + testUtils.gotoPage(testClassName, testMethodName); + panelPage = new PageWithPanels(); + assertAlmostEqualSize(100, panelPage.getPanelWidth(PageWithPanels.LEFT)); + assertAlmostEqualSize(100, panelPage.getPanelWidth(PageWithPanels.RIGHT)); + testUtils.setWikiPreference(PANEL_FIELD_WIDTH_RIGHT, PANELSIZE_LARGE); + testUtils.setWikiPreference(PANEL_FIELD_WIDTH_LEFT, PANELSIZE_LARGE); + // Reload the page with the new preferences taken into account. + testUtils.gotoPage(testClassName, testMethodName); + panelPage = new PageWithPanels(); + assertAlmostEqualSize(300, panelPage.getPanelWidth(PageWithPanels.LEFT)); + assertAlmostEqualSize(300, panelPage.getPanelWidth(PageWithPanels.RIGHT)); + // Check how the resize feature works. + panelPage.resizePanel(PageWithPanels.LEFT, -30); + panelPage.resizePanel(PageWithPanels.RIGHT, 30); + assertAlmostEqualSize(270, panelPage.getPanelWidth(PageWithPanels.LEFT)); + assertAlmostEqualSize(330, panelPage.getPanelWidth(PageWithPanels.RIGHT)); + // Check if the user preferences are kept on page reload. + testUtils.gotoPage(testClassName, testMethodName); + panelPage = new PageWithPanels(); + assertAlmostEqualSize(270, panelPage.getPanelWidth(PageWithPanels.LEFT)); + assertAlmostEqualSize(330, panelPage.getPanelWidth(PageWithPanels.RIGHT)); + // Check if the user preferences are kept on page reload even when defaults have changed. + testUtils.setWikiPreference(PANEL_FIELD_WIDTH_RIGHT, PANELSIZE_MEDIUM); + testUtils.setWikiPreference(PANEL_FIELD_WIDTH_LEFT, PANELSIZE_MEDIUM); + testUtils.gotoPage(testClassName, testMethodName); + panelPage = new PageWithPanels(); + assertAlmostEqualSize(270, panelPage.getPanelWidth(PageWithPanels.LEFT)); + assertAlmostEqualSize(330, panelPage.getPanelWidth(PageWithPanels.RIGHT)); + // Check that the user preferences are reset when toggling the panel off and on. + panelPage.togglePanel(PageWithPanels.RIGHT); + panelPage.togglePanel(PageWithPanels.RIGHT); + assertAlmostEqualSize(270, panelPage.getPanelWidth(PageWithPanels.LEFT)); + assertAlmostEqualSize(200, panelPage.getPanelWidth(PageWithPanels.RIGHT)); + // Check that the values are set to default if close enough to the default. + // The value does not snap to the default, but when reloading, the default will be applied + panelPage.resizePanel(PageWithPanels.LEFT, -60); + assertAlmostEqualSize(210, panelPage.getPanelWidth(PageWithPanels.LEFT)); + assertAlmostEqualSize(200, panelPage.getPanelWidth(PageWithPanels.RIGHT)); + testUtils.gotoPage(testClassName, testMethodName); + panelPage = new PageWithPanels(); + assertAlmostEqualSize(200, panelPage.getPanelWidth(PageWithPanels.LEFT)); + assertAlmostEqualSize(200, panelPage.getPanelWidth(PageWithPanels.RIGHT)); + } + private void setRightPanelInAdministration(String panelName) { AdministrationPage.gotoPage().clickSection("Look & Feel", "Panels"); @@ -187,4 +303,9 @@ private void setRightPanelInAdministration(String panelName) } panelsAdminPage.clickSave(); } + + private void assertAlmostEqualSize(int expected, int actual) { + /* We allow a margin of 2px difference due to small inconsistencies in the driver operations. */ + assertTrue(Math.abs(expected - actual) <= 2, "Expected " + expected + " but got " + actual); + } } diff --git a/xwiki-platform-core/xwiki-platform-panels/xwiki-platform-panels-test/xwiki-platform-panels-test-pageobjects/src/main/java/org/xwiki/panels/test/po/PageWithPanels.java b/xwiki-platform-core/xwiki-platform-panels/xwiki-platform-panels-test/xwiki-platform-panels-test-pageobjects/src/main/java/org/xwiki/panels/test/po/PageWithPanels.java index b8d1cd4d61a9..be9c8a2b603b 100644 --- a/xwiki-platform-core/xwiki-platform-panels/xwiki-platform-panels-test/xwiki-platform-panels-test-pageobjects/src/main/java/org/xwiki/panels/test/po/PageWithPanels.java +++ b/xwiki-platform-core/xwiki-platform-panels/xwiki-platform-panels-test/xwiki-platform-panels-test-pageobjects/src/main/java/org/xwiki/panels/test/po/PageWithPanels.java @@ -19,7 +19,12 @@ */ package org.xwiki.panels.test.po; +import java.util.Objects; + import org.openqa.selenium.By; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.interactions.Actions; +import org.openqa.selenium.support.FindBy; import org.xwiki.test.ui.po.BasePage; /** @@ -30,6 +35,26 @@ */ public class PageWithPanels extends BasePage { + @FindBy(id = "rightPanels") + private WebElement rightPanels; + + @FindBy(id = "leftPanels") + private WebElement leftPanels; + + @FindBy(id = "rightPanelsToggle") + private WebElement rightPanelsToggle; + + @FindBy(id = "leftPanelsToggle") + private WebElement leftPanelsToggle; + + @FindBy(css = "#rightPanels .ui-resizable-handle") + private WebElement rightPanelsResizeHandle; + + @FindBy(css = "#leftPanels .ui-resizable-handle") + private WebElement leftPanelsResizeHandle; + public static constant String RIGHT = "right"; + public static constant String LEFT = "left"; + /** * @param panelTitle the panel title * @return {@code true} if this page has the specified panel, {@code false} otherwise @@ -61,4 +86,32 @@ public boolean hasPanelInLeftColumn(String panelName) return getDriver().hasElementWithoutWaiting( By.xpath("//div[@id = 'leftPanels']/div[contains(@class, '"+panelName+"')]")); } + + public boolean panelIsToggled(String panelSide) { + WebElement panelToggle = (Objects.equals(panelSide, RIGHT)) ? rightPanelsToggle : leftPanelsToggle; + return Objects.equals(panelToggle.getDomAttribute("aria-expanded"), "true") + || Objects.equals(panelToggle.getDomAttribute("aria-expanded"), null); + } + + public void togglePanel(String panelSide) { + WebElement panelToggle = (Objects.equals(panelSide, RIGHT)) ? rightPanelsToggle : leftPanelsToggle; + panelToggle.click(); + } + public int getPanelWidth(String panelSide) { + WebElement panels = (Objects.equals(panelSide, RIGHT)) ? + rightPanels : leftPanels; + return panels.getSize().getWidth(); + } + public void resizePanel(String panelSide, int panelSizeDiff) { + WebElement panelResizeHandle = (Objects.equals(panelSide, RIGHT)) ? + rightPanelsResizeHandle : leftPanelsResizeHandle; + // Define the drag and drop action + Actions action = new Actions(this.getDriver().getWrappedDriver()); + action.clickAndHold(panelResizeHandle); + int panelSideInvert = Objects.equals(panelSide, RIGHT)? -1 : 1; + // We need to correct a bit the shift induced by the exact place where the handled is taken. + action.moveByOffset((panelSizeDiff + 6) * panelSideInvert, 0); + action.release(); + action.perform(); + } }