From 6eb1d8ac9e11cd13d5ffc41279aecc1e60c5f8ce Mon Sep 17 00:00:00 2001 From: Chris Joosse Date: Wed, 14 Feb 2024 17:16:45 -0800 Subject: [PATCH] Test components for biologics cross-folder input form actions tests (#1821) --- .../components/react/SelectInputOption.java | 127 ++++++++++++++++++ .../apps/ChangeTargetFolderDialog.java | 36 +++++ 2 files changed, 163 insertions(+) create mode 100644 src/org/labkey/test/components/react/SelectInputOption.java create mode 100644 src/org/labkey/test/components/ui/navigation/apps/ChangeTargetFolderDialog.java diff --git a/src/org/labkey/test/components/react/SelectInputOption.java b/src/org/labkey/test/components/react/SelectInputOption.java new file mode 100644 index 0000000000..38a1d32862 --- /dev/null +++ b/src/org/labkey/test/components/react/SelectInputOption.java @@ -0,0 +1,127 @@ +package org.labkey.test.components.react; + +import org.apache.commons.lang3.StringUtils; +import org.labkey.api.collections.CaseInsensitiveHashMap; +import org.labkey.api.collections.CaseInsensitiveMapWrapper; +import org.labkey.api.util.Pair; +import org.labkey.test.Locator; +import org.labkey.test.components.Component; +import org.labkey.test.components.WebDriverComponent; +import org.labkey.test.components.html.Input; +import org.labkey.test.pages.LabKeyPage; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import static org.labkey.test.components.html.Input.Input; + +/* + This component is meant to wrap the verbose options in filteringReactSelect, ReactSelect + */ +public class SelectInputOption extends WebDriverComponent +{ + private final WebElement _el; + private final WebDriver _driver; + + protected SelectInputOption(WebElement element, WebDriver driver) + { + _el = element; + _driver = driver; + } + + @Override + public WebElement getComponentElement() + { + return _el; + } + + @Override + public WebDriver getDriver() + { + return _driver; + } + + public boolean isFocused() + { + return getComponentElement().getAttribute("class").contains("select-input__option--is-focused"); + } + + public Map getData() + { + return elementCache().getData(); + } + + @Override + protected ElementCache newElementCache() + { + return new ElementCache(); + } + + @Override + protected ElementCache elementCache() + { + return (ElementCache) super.elementCache(); + } + + + protected class ElementCache extends Component.ElementCache + { + public Locator.XPathLocator text_truncatePairLoc = Locator.tagWithClass("div", "text__truncate"); + + public Map getData() + { + Map data = new CaseInsensitiveHashMap<>(); + var elements = text_truncatePairLoc.findElements(this); + for (WebElement el : elements) + { + WebElement keyEl = Locator.tag("strong").findElement(el); + WebElement valEl = Locator.tag("span").findElement(el); + data.put(StringUtils.stripEnd(keyEl.getText(), ":"), valEl.getText()); + } + return data; + } + + } + + + public static class SelectInputOptionFinder extends WebDriverComponentFinder + { + private final Locator.XPathLocator _baseLocator = Locator.tagWithClass("div", "select-input__option"); + private String _key = null; + private String _value = null; + + public SelectInputOptionFinder(WebDriver driver) + { + super(driver); + } + + public SelectInputOptionFinder withValue(String key, String value) + { + _key = key; + _value = value; + return this; + } + + @Override + protected SelectInputOption construct(WebElement el, WebDriver driver) + { + return new SelectInputOption(el, driver); + } + + + @Override + protected Locator locator() + { + if (_key != null) + return _baseLocator.withChild(Locator.tagWithClass("div", "text__truncate") + .withChild(Locator.tagWithText("strong",_key)) + .parent() // children are siblings + .withChild(Locator.tagWithAttributeContaining("span", "title", _value))); + else + return _baseLocator; + } + } +} diff --git a/src/org/labkey/test/components/ui/navigation/apps/ChangeTargetFolderDialog.java b/src/org/labkey/test/components/ui/navigation/apps/ChangeTargetFolderDialog.java new file mode 100644 index 0000000000..d1db84ac82 --- /dev/null +++ b/src/org/labkey/test/components/ui/navigation/apps/ChangeTargetFolderDialog.java @@ -0,0 +1,36 @@ +package org.labkey.test.components.ui.navigation.apps; + +import org.labkey.test.components.bootstrap.ModalDialog; +import org.openqa.selenium.WebDriver; + + + +public class ChangeTargetFolderDialog extends ModalDialog +{ + private final UpdatesTargetFolder _updatingComponent; + public ChangeTargetFolderDialog(WebDriver driver, UpdatesTargetFolder updatingComponent) + { + super(new ModalDialogFinder(driver).withTitle("Change projects and reset form?")); + this._updatingComponent = updatingComponent; + } + + + public void clickCancel() + { + dismiss("Cancel"); + } + + public void clickChangeProjects() + { + _updatingComponent.doAndWaitForFolderUpdate(()-> + dismiss("Change Projects")); + + } + + + + static public interface UpdatesTargetFolder + { + void doAndWaitForFolderUpdate(Runnable func); + } +}