From 423e42b5ba0650194a0b52c3b2e78722585eb438 Mon Sep 17 00:00:00 2001 From: labkey-tchad Date: Sat, 11 Apr 2020 10:56:29 -0700 Subject: [PATCH 1/3] Parameters for adding functionality to API Container Helper --- .../labkey/test/params/FolderDefinition.java | 186 ++++++++++++++++++ 1 file changed, 186 insertions(+) create mode 100644 src/org/labkey/test/params/FolderDefinition.java diff --git a/src/org/labkey/test/params/FolderDefinition.java b/src/org/labkey/test/params/FolderDefinition.java new file mode 100644 index 0000000000..81c8d05383 --- /dev/null +++ b/src/org/labkey/test/params/FolderDefinition.java @@ -0,0 +1,186 @@ +package org.labkey.test.params; + +import org.json.simple.JSONObject; +import org.labkey.remoteapi.CommandResponse; +import org.labkey.remoteapi.PostCommand; +import org.labkey.remoteapi.security.CreateContainerCommand; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +public class FolderDefinition +{ + private String _parentPath = "/"; + + // CreateContainerAction params + private String _name; + private String _folderType; + private String _title; + private String _description; + private Set _ensureModules = new HashSet<>(); + private Boolean _isWorkbook; + private String _type; + + // SetFolderPermissionsAction params + private boolean _inheritPermissions = false; + private String _copyPermissionsProject; + + public FolderDefinition() + { + } + + public FolderDefinition(String name) + { + _name = name; + } + + public String getParentPath() + { + return _parentPath; + } + + public FolderDefinition setParentPath(String parentPath) + { + _parentPath = parentPath; + return this; + } + + public String getName() + { + return _name; + } + + public FolderDefinition setName(String name) + { + _name = name; + return this; + } + + public String getFolderType() + { + return _folderType; + } + + public FolderDefinition setFolderType(String folderType) + { + _folderType = folderType; + return this; + } + + public String getTitle() + { + return _title; + } + + public FolderDefinition setTitle(String title) + { + _title = title; + return this; + } + + public String getDescription() + { + return _description; + } + + public FolderDefinition setDescription(String description) + { + _description = description; + return this; + } + + public Set getEnsureModules() + { + return new HashSet<>(_ensureModules); + } + + public FolderDefinition setEnsureModules(Set ensureModules) + { + _ensureModules = ensureModules; + return this; + } + + public Boolean getWorkbook() + { + return _isWorkbook; + } + + public FolderDefinition setWorkbook(Boolean workbook) + { + _isWorkbook = workbook; + return this; + } + + public String getType() + { + return _type; + } + + public FolderDefinition setType(String type) + { + _type = type; + return this; + } + + public FolderDefinition inheritParentPermissions() + { + _inheritPermissions = true; + _copyPermissionsProject = null; + return this; + } + + public FolderDefinition copyPermissionsFromProject(String projectPath) + { + _inheritPermissions = true; + _copyPermissionsProject = projectPath; + return this; + } + + public FolderDefinition permissionsForMyUserOnly() + { + _inheritPermissions = false; + _copyPermissionsProject = null; + return this; + } + + public CreateContainerCommand getCreateCommand() + { + CreateContainerCommand command = new CreateContainerCommand(_name); + final List ensureModules = new ArrayList<>(getEnsureModules()); + if (!ensureModules.isEmpty()) + { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("ensureModules", ensureModules); // Not yet supported by CreateContainerCommand + command.setJsonObject(jsonObject); + } + command.setTitle(getTitle()); + command.setDescription(getDescription()); + command.setFolderType(getFolderType()); + command.setWorkbook(getWorkbook()); + command.setType(getType()); + return command; + } + + public PostCommand getPermissionsCommand() + { + PostCommand command = new PostCommand<>("admin", "setFolderPermissions"); + JSONObject jsonObject = new JSONObject(); + if (_copyPermissionsProject != null) + { + jsonObject.put("permissionType", "CopyExistingProject"); + jsonObject.put("targetProject", _copyPermissionsProject); + } + else if (_inheritPermissions) + { + jsonObject.put("permissionType", "Inherit"); + } + else + { + jsonObject.put("permissionType", "CurrentUser"); + } + command.setJsonObject(jsonObject); + return command; + } +} From 57f095e6750ea6979aa9a3617c1fe9553f646f8a Mon Sep 17 00:00:00 2001 From: labkey-tchad Date: Wed, 23 Sep 2020 14:38:08 -0700 Subject: [PATCH 2/3] Add module customization to API container helper --- src/org/labkey/test/LabKeySiteWrapper.java | 10 +++ src/org/labkey/test/WebDriverWrapper.java | 4 +- .../test/components/SubfoldersWebPart.java | 6 +- .../test/components/api/ProjectMenu.java | 6 +- ...bFolderPage.java => CreateFolderPage.java} | 32 ++++--- ...derDefinition.java => ContainerProps.java} | 85 +++++++++++++------ .../test/tests/SubfolderWebPartTest.java | 2 +- .../labkey/test/util/APIContainerHelper.java | 78 ++++++++--------- .../test/util/AbstractContainerHelper.java | 60 ++++++------- .../labkey/test/util/UIContainerHelper.java | 51 ++++++----- 10 files changed, 198 insertions(+), 136 deletions(-) rename src/org/labkey/test/pages/admin/{CreateSubFolderPage.java => CreateFolderPage.java} (80%) rename src/org/labkey/test/params/{FolderDefinition.java => ContainerProps.java} (59%) diff --git a/src/org/labkey/test/LabKeySiteWrapper.java b/src/org/labkey/test/LabKeySiteWrapper.java index a8307484fa..18d6e2616e 100644 --- a/src/org/labkey/test/LabKeySiteWrapper.java +++ b/src/org/labkey/test/LabKeySiteWrapper.java @@ -478,14 +478,24 @@ protected void setSystemMaintenance(boolean enable) public void ensureAdminMode() { if (!onLabKeyPage()) + { + TestLogger.warn("ensureAdminMode called from non-standard page"); goToHome(); + } if (!isSignedIn()) + { + TestLogger.warn("ensureAdminMode called while not logged in"); simpleSignIn(); + } else if (!isUserSystemAdmin() && isImpersonating()) + { + TestLogger.warn("ensureAdminMode called while impersonating non-admin"); stopImpersonating(false); + } Locator projectMenu = ProjectMenu.Locators.menuProjectNav; if (!isElementPresent(projectMenu)) { + TestLogger.warn("project menu not present after ensureAdminMode"); goToHome(); waitForElement(projectMenu, WAIT_FOR_PAGE); } diff --git a/src/org/labkey/test/WebDriverWrapper.java b/src/org/labkey/test/WebDriverWrapper.java index 2c2f4a7c67..a1e7b07392 100644 --- a/src/org/labkey/test/WebDriverWrapper.java +++ b/src/org/labkey/test/WebDriverWrapper.java @@ -35,6 +35,7 @@ import org.labkey.test.components.html.RadioButton; import org.labkey.test.components.html.SiteNavBar; import org.labkey.test.components.labkey.LabKeyAlert; +import org.labkey.test.pages.admin.CreateFolderPage; import org.labkey.test.pages.admin.FolderManagementPage; import org.labkey.test.pages.assay.AssayBeginPage; import org.labkey.test.pages.core.admin.ProjectSettingsPage; @@ -879,9 +880,10 @@ public BeginPage goToManageLists() return new BeginPage(getDriver()); } - public void goToCreateProject() + public CreateFolderPage goToCreateProject() { clickAdminMenuItem("Site", "Create Project"); + return new CreateFolderPage(getDriver()); } diff --git a/src/org/labkey/test/components/SubfoldersWebPart.java b/src/org/labkey/test/components/SubfoldersWebPart.java index 558d9317ba..58d70b2871 100644 --- a/src/org/labkey/test/components/SubfoldersWebPart.java +++ b/src/org/labkey/test/components/SubfoldersWebPart.java @@ -17,7 +17,7 @@ import org.labkey.test.Locator; import org.labkey.test.pages.LabKeyPage; -import org.labkey.test.pages.admin.CreateSubFolderPage; +import org.labkey.test.pages.admin.CreateFolderPage; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; @@ -55,11 +55,11 @@ public LabKeyPage goToSubfolder(String folderName) return new LabKeyPage(getDriver()); } - public CreateSubFolderPage clickCreateSubfolder() + public CreateFolderPage clickCreateSubfolder() { getWrapper().clickButton("Create New Subfolder", WAIT_FOR_PAGE); - return new CreateSubFolderPage(getDriver()); + return new CreateFolderPage(getDriver()); } @Override diff --git a/src/org/labkey/test/components/api/ProjectMenu.java b/src/org/labkey/test/components/api/ProjectMenu.java index 1ad9e92915..5aa8e4e3f6 100644 --- a/src/org/labkey/test/components/api/ProjectMenu.java +++ b/src/org/labkey/test/components/api/ProjectMenu.java @@ -19,8 +19,8 @@ import org.labkey.test.WebDriverWrapper; import org.labkey.test.components.Component; import org.labkey.test.components.WebDriverComponent; +import org.labkey.test.pages.admin.CreateFolderPage; import org.labkey.test.pages.admin.CreateProjectPage; -import org.labkey.test.pages.admin.CreateSubFolderPage; import org.labkey.test.util.TestLogger; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; @@ -186,11 +186,11 @@ public List projectMenuLinks() /** * Creates a subfolder from the context you are already in (e.g. project/folder) */ - public CreateSubFolderPage navigateToCreateSubFolderPage() + public CreateFolderPage navigateToCreateSubFolderPage() { open(); getWrapper().clickAndWait(elementCache().newSubFolderButton); - return new CreateSubFolderPage(getDriver()); + return new CreateFolderPage(getDriver()); } public CreateProjectPage navigateToCreateProjectPage() diff --git a/src/org/labkey/test/pages/admin/CreateSubFolderPage.java b/src/org/labkey/test/pages/admin/CreateFolderPage.java similarity index 80% rename from src/org/labkey/test/pages/admin/CreateSubFolderPage.java rename to src/org/labkey/test/pages/admin/CreateFolderPage.java index c505fa6d3f..0d2bc10c02 100644 --- a/src/org/labkey/test/pages/admin/CreateSubFolderPage.java +++ b/src/org/labkey/test/pages/admin/CreateFolderPage.java @@ -21,9 +21,12 @@ import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; -public class CreateSubFolderPage extends LabKeyPage +/** + * Wraps createFolder.jsp, rendered by 'AdminController.CreateFolderAction' + */ +public class CreateFolderPage extends LabKeyPage { - public CreateSubFolderPage(WebDriver test) + public CreateFolderPage(WebDriver test) { super(test); } @@ -42,20 +45,25 @@ public SetFolderPermissionsPage clickNext() return new SetFolderPermissionsPage(getDriver()); } - public CreateSubFolderPage setFolderName(String name) + public CreateFolderPage setName(String name) { setFormElement(newElementCache().nameInput, name); return this; } - public CreateSubFolderPage selectFolderType(String folderType) + public CreateFolderPage selectFolderType(String folderType) { + if (null == folderType || folderType.equals("None")) + { + folderType = "Custom"; + } + WebElement folderTypeRadioButton =Locator.xpath("//td[./label[text()='"+folderType+"']]/input[@type='button' and contains(@class, 'radio')]") .waitForElement(getDriver(), WAIT_FOR_JAVASCRIPT); - folderTypeRadioButton.click(); + folderTypeRadioButton.click(); - if (folderType.equalsIgnoreCase("Custom")) - waitFor(()-> Locator.tagWithText("div", "Choose Modules:").findElementOrNull(getDriver()) != null, 4000 ); + if (folderType.equalsIgnoreCase("Custom")) + waitFor(()-> Locator.tagWithText("div", "Choose Modules:").findElementOrNull(getDriver()) != null, 4000 ); if (folderType.equalsIgnoreCase("Create From Template Folder")) waitFor(()-> Locator.input("templateSourceId").findElementOrNull(getDriver()) != null, 4000 ); @@ -63,7 +71,7 @@ public CreateSubFolderPage selectFolderType(String folderType) return this; } - public CreateSubFolderPage createFromTemplateFolder(String templateFolder) + public CreateFolderPage createFromTemplateFolder(String templateFolder) { selectFolderType("Create From Template Folder"); _ext4Helper.waitForMaskToDisappear(); @@ -75,14 +83,14 @@ public CreateSubFolderPage createFromTemplateFolder(String templateFolder) return this; } - public CreateSubFolderPage setTemplatePartCheckBox(String templatePart, boolean checked) + public CreateFolderPage setTemplatePartCheckBox(String templatePart, boolean checked) { Checkbox checkbox = new Checkbox(Locator.xpath("//td[label[text()='"+templatePart+"']]/input").waitForElement(getDriver(), 4000)); checkbox.set(checked); return this; } - public CreateSubFolderPage addTabs(String[] tabsToAdd) + public CreateFolderPage addTabs(String[] tabsToAdd) { if (tabsToAdd != null) { @@ -92,13 +100,13 @@ public CreateSubFolderPage addTabs(String[] tabsToAdd) return this; } - public CreateSubFolderPage setTitle(String title) + public CreateFolderPage setTitle(String title) { setFormElement(newElementCache().titleInput, title); return this; } - public CreateSubFolderPage setUseNameAsDisplayTitle() + public CreateFolderPage setUseNameAsDisplayTitle() { _ext4Helper.checkCheckbox(Locator.ehrCheckboxWithLabel( "Use name as display title")); return this; diff --git a/src/org/labkey/test/params/FolderDefinition.java b/src/org/labkey/test/params/ContainerProps.java similarity index 59% rename from src/org/labkey/test/params/FolderDefinition.java rename to src/org/labkey/test/params/ContainerProps.java index 81c8d05383..c7413eaeb5 100644 --- a/src/org/labkey/test/params/FolderDefinition.java +++ b/src/org/labkey/test/params/ContainerProps.java @@ -6,34 +6,57 @@ import org.labkey.remoteapi.security.CreateContainerCommand; import java.util.ArrayList; -import java.util.HashSet; +import java.util.Collections; import java.util.List; -import java.util.Set; -public class FolderDefinition +/** + * Properties for creating Projects, Folders, and Workbooks + */ +public class ContainerProps { - private String _parentPath = "/"; + private String _parentPath; // CreateContainerAction params private String _name; private String _folderType; private String _title; private String _description; - private Set _ensureModules = new HashSet<>(); - private Boolean _isWorkbook; + private List _ensureModules = new ArrayList<>(); + private boolean _isWorkbook = false; private String _type; // SetFolderPermissionsAction params - private boolean _inheritPermissions = false; + private Boolean _inheritPermissions = null; private String _copyPermissionsProject; - public FolderDefinition() + /** + * Private constructor for project, folder, and workbook factory methods. + */ + private ContainerProps() + { } + + public static ContainerProps project(String name) { + return new ContainerProps().setName(name); } - public FolderDefinition(String name) + public static ContainerProps folder(String parentPath, String name) { - _name = name; + return new ContainerProps() + .setParentPath(parentPath) + .setName(name); + } + + public static ContainerProps workbook(String parentPath) + { + return new ContainerProps() + .setParentPath(parentPath) + .setWorkbook(true); + } + + public boolean isProject() + { + return getParentPath() == null || getParentPath().isEmpty() || getParentPath().equalsIgnoreCase("/"); } public String getParentPath() @@ -41,7 +64,7 @@ public String getParentPath() return _parentPath; } - public FolderDefinition setParentPath(String parentPath) + public ContainerProps setParentPath(String parentPath) { _parentPath = parentPath; return this; @@ -52,7 +75,7 @@ public String getName() return _name; } - public FolderDefinition setName(String name) + public ContainerProps setName(String name) { _name = name; return this; @@ -63,7 +86,7 @@ public String getFolderType() return _folderType; } - public FolderDefinition setFolderType(String folderType) + public ContainerProps setFolderType(String folderType) { _folderType = folderType; return this; @@ -74,7 +97,7 @@ public String getTitle() return _title; } - public FolderDefinition setTitle(String title) + public ContainerProps setTitle(String title) { _title = title; return this; @@ -85,29 +108,29 @@ public String getDescription() return _description; } - public FolderDefinition setDescription(String description) + public ContainerProps setDescription(String description) { _description = description; return this; } - public Set getEnsureModules() + public List getEnsureModules() { - return new HashSet<>(_ensureModules); + return Collections.unmodifiableList(_ensureModules); } - public FolderDefinition setEnsureModules(Set ensureModules) + public ContainerProps setEnsureModules(List ensureModules) { _ensureModules = ensureModules; return this; } - public Boolean getWorkbook() + public boolean isWorkbook() { return _isWorkbook; } - public FolderDefinition setWorkbook(Boolean workbook) + public ContainerProps setWorkbook(Boolean workbook) { _isWorkbook = workbook; return this; @@ -118,27 +141,34 @@ public String getType() return _type; } - public FolderDefinition setType(String type) + /** + * Set container type, not to be confused with 'folderType'. This parameter + * is usually not required because the server will infer 'normal' or + * 'workbook' from other properties. + * @param type 'type' parameter + * @return this property object + */ + public ContainerProps setType(String type) { _type = type; return this; } - public FolderDefinition inheritParentPermissions() + public ContainerProps inheritParentPermissions() { _inheritPermissions = true; _copyPermissionsProject = null; return this; } - public FolderDefinition copyPermissionsFromProject(String projectPath) + public ContainerProps copyPermissionsFromProject(String projectPath) { _inheritPermissions = true; _copyPermissionsProject = projectPath; return this; } - public FolderDefinition permissionsForMyUserOnly() + public ContainerProps permissionsForMyUserOnly() { _inheritPermissions = false; _copyPermissionsProject = null; @@ -158,13 +188,18 @@ public CreateContainerCommand getCreateCommand() command.setTitle(getTitle()); command.setDescription(getDescription()); command.setFolderType(getFolderType()); - command.setWorkbook(getWorkbook()); + command.setWorkbook(isWorkbook()); command.setType(getType()); return command; } public PostCommand getPermissionsCommand() { + if (_inheritPermissions == null) + { + return null; + } + PostCommand command = new PostCommand<>("admin", "setFolderPermissions"); JSONObject jsonObject = new JSONObject(); if (_copyPermissionsProject != null) diff --git a/src/org/labkey/test/tests/SubfolderWebPartTest.java b/src/org/labkey/test/tests/SubfolderWebPartTest.java index 62c5b5b2d6..9ce3d4336d 100644 --- a/src/org/labkey/test/tests/SubfolderWebPartTest.java +++ b/src/org/labkey/test/tests/SubfolderWebPartTest.java @@ -161,7 +161,7 @@ public void createSubdirectoryFromWebPart() subfoldersWebPart.clickCreateSubfolder() .selectFolderType("Collaboration") - .setFolderName(newSubFolderName) + .setName(newSubFolderName) .clickNext() .setMyUserOnly() .clickFinish(); diff --git a/src/org/labkey/test/util/APIContainerHelper.java b/src/org/labkey/test/util/APIContainerHelper.java index 9c11216c57..6e3913d2bb 100644 --- a/src/org/labkey/test/util/APIContainerHelper.java +++ b/src/org/labkey/test/util/APIContainerHelper.java @@ -16,24 +16,24 @@ package org.labkey.test.util; import org.apache.http.HttpStatus; -import org.jetbrains.annotations.Nullable; import org.json.simple.JSONObject; import org.labkey.remoteapi.CommandException; import org.labkey.remoteapi.Connection; import org.labkey.remoteapi.PostCommand; -import org.labkey.remoteapi.security.CreateContainerCommand; import org.labkey.remoteapi.security.CreateContainerResponse; import org.labkey.remoteapi.security.DeleteContainerCommand; import org.labkey.remoteapi.security.GetContainersCommand; import org.labkey.test.BaseWebDriverTest; import org.labkey.test.TestTimeoutException; import org.labkey.test.WebTestHelper; +import org.labkey.test.params.ContainerProps; import java.io.IOException; import java.net.SocketTimeoutException; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; import java.util.HashMap; +import java.util.List; import java.util.Map; import static org.junit.Assert.assertEquals; @@ -54,77 +54,79 @@ public void setNavigateToCreatedFolders(boolean navigateToCreatedFolders) } @Override - protected void doCreateProject(String projectName, String folderType) + protected void doCreateProject(String projectName, String folderType, List enableModules) { - doCreateFolder("", projectName, folderType); + doCreateFolder("", projectName, folderType, enableModules); } public CreateContainerResponse createWorkbook(String parentPath, String title, String folderType) { - return doCreateContainer(parentPath, null, title, folderType, true); + ContainerProps props = ContainerProps.workbook(parentPath).setTitle(title).setFolderType(folderType); + return createContainer(props); } @Override - protected void doCreateFolder(String path, String folderName, String folderType) + protected void doCreateFolder(String parentPath, String folderName, String folderType, List enableModules) { - doCreateContainer(path, folderName, null, folderType, false); - - String[] splitPath = path.split("/"); - StringBuilder fullPath = new StringBuilder(); - for (String container : splitPath) - { - fullPath.append(container).append("/"); - } - fullPath.append(folderName); + ContainerProps containerProps = ContainerProps.folder(parentPath, folderName).setType(folderType) + .setEnsureModules(enableModules); + CreateContainerResponse createContainerResponse = createContainer(containerProps); if (navigateToCreatedFolders) { - _test.beginAt(WebTestHelper.buildURL("project", fullPath.toString(), "begin")); + _test.beginAt(WebTestHelper.buildURL("project", createContainerResponse.getPath(), "begin")); } } - public CreateContainerResponse doCreateContainer(String parentPath, @Nullable String name, String title, String folderType, boolean isWorkbook) + @Override + protected void doCreateContainer(ContainerProps props) { - Connection connection = WebTestHelper.getRemoteApiConnection(); - CreateContainerCommand command = new CreateContainerCommand(name); - - if (isWorkbook) - command.setWorkbook(true); - - if (title != null) - command.setTitle(title); + createContainer(props); + } - command.setFolderType(folderType); - parentPath = (parentPath.startsWith("/") ? "" : "/") + parentPath; + public CreateContainerResponse createContainer(ContainerProps props) + { + String parentPath = props.getParentPath(); + String name = props.getName(); + String folderType = props.getFolderType(); + boolean isWorkbook = props.isWorkbook(); + String expectedPath = String.join("/", props.isProject() ? "/" : parentPath, name).replaceAll("//+", "/"); if (isWorkbook) _test.log("Creating new workbook via API in container: " + parentPath); - else if (parentPath.equals("/")) - _test.log("Creating project via API: " + name); + else if (props.isProject()) + _test.log("Creating project via API: " + props.getName()); else - _test.log("Creating new folder via API: " + parentPath + "/" + name); + _test.log("Creating new folder via API: " + parentPath + "/" + props.getName()); try { - CreateContainerResponse response = command.execute(connection, parentPath); + Connection connection = WebTestHelper.getRemoteApiConnection(); + CreateContainerResponse response = props.getCreateCommand().execute(connection, parentPath); if (!isWorkbook) { - String path = String.join("/", parentPath, name).replace("//", "/"); - assertEquals("Unexpected path for created container", path, response.getPath()); + assertEquals("Unexpected path for created container", expectedPath, response.getPath()); } - if (folderType == null || "custom".equals(folderType.toLowerCase()) || "none".equals(folderType)) + if (folderType == null || "custom".equalsIgnoreCase(folderType) || "none".equals(folderType)) folderType = (isWorkbook ? "Workbook" : "None"); assertEquals("Wrong folder type for " + response.getPath() + ". Defining module may be missing.", folderType, response.getProperty("folderType")); return response; } catch (CommandException | IOException e) { - throw new RuntimeException("Failed to create container: " + parentPath + (name == null ? "" : "/" + name), e); + if (props.isWorkbook()) + { + throw new RuntimeException("Failed to create workbook in: " + parentPath, e); + } + else + { + throw new RuntimeException("Failed to create container: " + expectedPath, e); + } } } @Override - protected void doDeleteProject(String projectName, boolean failIfNotFound, int wait) throws TestTimeoutException + protected void doDeleteProject(String projectName, boolean failIfNotFound, int wait) { deleteContainer("/" + projectName, failIfNotFound, wait); } @@ -136,13 +138,13 @@ public void deleteFolder(@LoggedParam String project, @LoggedParam String folder deleteContainer(project + "/" + folderName, true, waitTime); } - public void deleteWorkbook(String parent, int rowId, boolean failIfNotFound, int wait) throws TestTimeoutException + public void deleteWorkbook(String parent, int rowId, boolean failIfNotFound, int wait) { String path = parent + "/" + rowId; deleteContainer(path, failIfNotFound, wait); } - public void deleteContainer(String path, boolean failIfNotFound, int wait) throws TestTimeoutException + public void deleteContainer(String path, boolean failIfNotFound, int wait) { WebTestHelper.logToServer("=Test= Starting container delete: " + path); diff --git a/src/org/labkey/test/util/AbstractContainerHelper.java b/src/org/labkey/test/util/AbstractContainerHelper.java index 3ded1f3b27..f21c6d4f2e 100644 --- a/src/org/labkey/test/util/AbstractContainerHelper.java +++ b/src/org/labkey/test/util/AbstractContainerHelper.java @@ -30,8 +30,9 @@ import org.labkey.test.TestProperties; import org.labkey.test.TestTimeoutException; import org.labkey.test.WebTestHelper; -import org.labkey.test.pages.admin.CreateSubFolderPage; +import org.labkey.test.pages.admin.CreateFolderPage; import org.labkey.test.pages.admin.SetFolderPermissionsPage; +import org.labkey.test.params.ContainerProps; import org.openqa.selenium.NoSuchElementException; import org.openqa.selenium.WebElement; @@ -78,10 +79,17 @@ public Set getCreatedFolders() /** @param folderType the name of the type of container to create. * May be null, in which case you get the server's default folder type */ - @LogMethod(quiet = true) public final void createProject(@LoggedParam String projectName, @Nullable String folderType) { - doCreateProject(projectName, folderType); + createProject(projectName, folderType, List.of()); + } + + /** @param folderType the name of the type of container to create. + * May be null, in which case you get the server's default folder type */ + @LogMethod(quiet = true) + public final void createProject(@LoggedParam String projectName, @Nullable String folderType, List enableModules) + { + doCreateProject(projectName, folderType, enableModules); _createdProjects.add(projectName); } @@ -126,11 +134,12 @@ public final void createSubfolder(String parentPath, String folderName) @LogMethod public final void createSubfolder(String parentPath, String folderName, String folderType) { - doCreateFolder(parentPath, folderName, folderType); + doCreateFolder(parentPath, folderName, folderType, null); } - protected abstract void doCreateProject(String projectName, String folderType); - protected abstract void doCreateFolder(String parentPath, String folderName, String folderType); + protected abstract void doCreateProject(String projectName, String folderType, List enableModules); + protected abstract void doCreateFolder(String parentPath, String folderName, String folderType, List enableModules); + protected abstract void doCreateContainer(ContainerProps props); // Projects might be created by other means public void addCreatedProject(String projectName) @@ -274,7 +283,7 @@ public void createSubFolderFromTemplate(String project, String child, String tem public void createSubfolder(String project, String child, String[] tabsToAdd) { // create a child of the top-level project folder: - createSubfolder(project, project, child, "None", tabsToAdd); + doCreateFolder(project, child, "None", Arrays.asList(tabsToAdd)); } public void createSubfolder(String project, String parent, String child, String folderType, @Nullable String[] tabsToAdd) @@ -305,34 +314,34 @@ public void createSubfolder(String project, String parent, String child, String @LogMethod public void createSubfolder(@LoggedParam String project, String parent, @LoggedParam String child, @Nullable String folderType, String templateFolder, @Nullable String[] templatePartsToUncheck, @Nullable String[] tabsToAdd, boolean inheritPermissions, @Nullable String title) { - CreateSubFolderPage createSubFolderPage = startCreateFolder(project, parent, child); + CreateFolderPage createFolderPage = startCreateFolder(project, parent, child); if (null != folderType && !folderType.equals("None")) { - createSubFolderPage.selectFolderType(folderType); + createFolderPage.selectFolderType(folderType); if(folderType.equals("Create From Template Folder")) { _test.log("create from template"); - createSubFolderPage.createFromTemplateFolder(templateFolder); + createFolderPage.createFromTemplateFolder(templateFolder); if(title != null) { - createSubFolderPage.setUseNameAsDisplayTitle(); - createSubFolderPage.setTitle(title); + createFolderPage.setUseNameAsDisplayTitle(); + createFolderPage.setTitle(title); } if (templatePartsToUncheck != null) { for(String part : templatePartsToUncheck) { - createSubFolderPage.setTemplatePartCheckBox(part, false); + createFolderPage.setTemplatePartCheckBox(part, false); } } } } else { - createSubFolderPage.selectFolderType("Custom"); - createSubFolderPage.addTabs(tabsToAdd); + createFolderPage.selectFolderType("Custom"); + createFolderPage.addTabs(tabsToAdd); } - SetFolderPermissionsPage setFolderPermissionsPage = createSubFolderPage.clickNext(); + SetFolderPermissionsPage setFolderPermissionsPage = createFolderPage.clickNext(); _createdFolders.add(new WebTestHelper.FolderIdentifier(project, child)); //second page of the wizard @@ -379,7 +388,7 @@ public void createSubfolder(@LoggedParam String project, String parent, @LoggedP } } - private CreateSubFolderPage startCreateFolder(String project, String parent, String child) + private CreateFolderPage startCreateFolder(String project, String parent, String child) { if (!parent.equals(project)) _test.navigateToFolder(project, parent); @@ -387,7 +396,7 @@ private CreateSubFolderPage startCreateFolder(String project, String parent, Str _test.clickProject(project); return _test.projectMenu().navigateToCreateSubFolderPage() - .setFolderName(child); + .setName(child); } public boolean doesContainerExist(String containerPath) @@ -396,21 +405,6 @@ public boolean doesContainerExist(String containerPath) return response != HttpStatus.SC_NOT_FOUND; } - /** - * @deprecated Use precise container path: {@link #doesContainerExist(String)} - */ - @Deprecated - public boolean doesFolderExist(String project, String parent, String child) - { - _test.clickProject(project); - if (!parent.equals(project)) - { - _test.clickFolder(parent); - } - _test.openFolderMenu(); - return _test.isElementPresent(Locator.id("folderBar_menu").append(Locator.linkWithText(child))); - } - public void deleteFolder(String project, @LoggedParam String folderName) { deleteFolder(project, folderName, _test.WAIT_FOR_PAGE); diff --git a/src/org/labkey/test/util/UIContainerHelper.java b/src/org/labkey/test/util/UIContainerHelper.java index cce3a8d65e..49a1dca62a 100644 --- a/src/org/labkey/test/util/UIContainerHelper.java +++ b/src/org/labkey/test/util/UIContainerHelper.java @@ -16,10 +16,11 @@ package org.labkey.test.util; import org.labkey.test.BaseWebDriverTest; -import org.labkey.test.LabKeySiteWrapper; -import org.labkey.test.Locator; import org.labkey.test.Locators; import org.labkey.test.WebDriverWrapper; +import org.labkey.test.pages.admin.CreateFolderPage; +import org.labkey.test.pages.admin.SetFolderPermissionsPage; +import org.labkey.test.params.ContainerProps; import java.util.List; @@ -34,38 +35,30 @@ public UIContainerHelper(BaseWebDriverTest test) @Override @LogMethod - public void doCreateFolder(String child, String parentPath, String foldertype) + public void doCreateFolder(String parentPath, String folderName, String foldertype, List enableModules) { String[] ancestors = parentPath.split("/"); - createSubfolder(ancestors[0], ancestors[ancestors.length - 1], child, foldertype, null); + createSubfolder(ancestors[0], ancestors[ancestors.length - 1], folderName, foldertype, enableModules.toArray(new String[]{})); } @Override @LogMethod - protected void doCreateProject(String projectName, String folderType) + protected void doCreateProject(String projectName, String folderType, List enableModules) { _test.log("Creating project with name " + projectName); _test.ensureAdminMode(); - _test.goToCreateProject(); - _test.waitForElement(Locator.name("name"), BaseWebDriverTest.WAIT_FOR_JAVASCRIPT); - _test.setFormElement(Locator.name("name"), projectName); - - if (null != folderType && !folderType.equals("None")) - _test.click(Locator.xpath("//td[./label[text()='"+folderType+"']]/input")); - else - { - _test.click(Locator.xpath("//td[./label[text()='Custom']]/input")); - _test.waitForElementToBeVisible(Locator.input("defaultModule")); // wait for module-choice flyout - } - - _test.waitAndClickAndWait(Ext4Helper.Locators.ext4Button("Next")); + CreateFolderPage createFolderPage = _test.goToCreateProject(); + createFolderPage.setName(projectName); + createFolderPage.selectFolderType(folderType); + createFolderPage.addTabs(enableModules.toArray(new String[]{})); + SetFolderPermissionsPage setFolderPermissionsPage = createFolderPage.clickNext(); List errors = _test.getTexts(Locators.labkeyError.findElements(_test.getDriver())); if (!errors.isEmpty()) fail("Unexpected error(s) during project creation: " + errors); //second page of the wizard - _test.waitAndClickAndWait(Ext4Helper.Locators.ext4Button("Next")); + setFolderPermissionsPage.clickNext(); //third page of wizard if (_test.isElementPresent(Ext4Helper.Locators.ext4Button("Finish"))) @@ -84,13 +77,31 @@ protected void doCreateProject(String projectName, String folderType) // block until the project exists long startTime = System.currentTimeMillis(); _test.log("Wait extra long for folder to finish deleting."); - while (!projectLinkExists(projectName) && System.currentTimeMillis() - startTime < LabKeySiteWrapper.WAIT_FOR_JAVASCRIPT) + while (!projectLinkExists(projectName) && System.currentTimeMillis() - startTime < WebDriverWrapper.WAIT_FOR_JAVASCRIPT) { WebDriverWrapper.sleep(5000); _test.refresh(); } } + @Override + protected void doCreateContainer(ContainerProps props) + { + if (props.isWorkbook()) + { + throw new IllegalArgumentException( + "UIContainerHelper doesn't support workbooks. Use APIContainerHelper or WorkbookHelper."); + } + else if (props.isProject()) + { + doCreateProject(props.getName(), props.getFolderType(), props.getEnsureModules()); + } + else + { + doCreateFolder(props.getParentPath(), props.getName(), props.getFolderType(), props.getEnsureModules()); + } + } + @LogMethod @Override protected void doDeleteProject(String project, boolean failIfNotFound, int wait) From 0c1bfb40571e77cc2fa0e24ab0b5782e780ff454 Mon Sep 17 00:00:00 2001 From: labkey-tchad Date: Wed, 23 Sep 2020 14:49:04 -0700 Subject: [PATCH 3/3] Enable modules during project creation --- .../test/tests/issues/IssueDomainSharingTest.java | 13 +++++-------- .../labkey/test/tests/issues/IssuesAdminTest.java | 7 +++---- src/org/labkey/test/tests/wiki/WikiLongTest.java | 6 ++---- .../labkey/test/util/AbstractContainerHelper.java | 11 ++--------- 4 files changed, 12 insertions(+), 25 deletions(-) diff --git a/src/org/labkey/test/tests/issues/IssueDomainSharingTest.java b/src/org/labkey/test/tests/issues/IssueDomainSharingTest.java index 839e7a9902..a030b6b323 100644 --- a/src/org/labkey/test/tests/issues/IssueDomainSharingTest.java +++ b/src/org/labkey/test/tests/issues/IssueDomainSharingTest.java @@ -24,12 +24,12 @@ import org.labkey.test.WebDriverWrapper; import org.labkey.test.categories.DailyA; import org.labkey.test.categories.Issues; -import org.labkey.test.components.issues.IssueListDefDataRegion; import org.labkey.test.components.ext4.Window; -import org.labkey.test.pages.issues.IssuesAdminPage; +import org.labkey.test.components.issues.IssueListDefDataRegion; import org.labkey.test.pages.issues.DetailsPage; import org.labkey.test.pages.issues.InsertIssueDefPage; import org.labkey.test.pages.issues.InsertPage; +import org.labkey.test.pages.issues.IssuesAdminPage; import org.labkey.test.pages.issues.ListPage; import org.labkey.test.params.FieldDefinition; import org.labkey.test.params.FieldDefinition.ColumnType; @@ -80,10 +80,8 @@ public static void setupProject() private void doSetup() { _userHelper.createUser(USER); - _containerHelper.createProject(getProjectName(), null); - _containerHelper.enableModule("Issues"); - _containerHelper.createSubfolder(getProjectName(), FOLDER); - _containerHelper.enableModule("Issues"); + _containerHelper.createProject(getProjectName(), null, "Issues"); + _containerHelper.createSubfolder(getProjectName(), FOLDER, "Issues"); } @Test @@ -172,8 +170,7 @@ public void testCantShareDomainBetweenProjects() { final String listDef = "UnSharedTestDef"; - _containerHelper.createProject(PROJECT2, null); - _containerHelper.enableModule("Issues"); + _containerHelper.createProject(PROJECT2, null, "Issues"); _issuesHelper.goToIssueListDefinitions(PROJECT2) .createIssuesListDefinition(listDef); diff --git a/src/org/labkey/test/tests/issues/IssuesAdminTest.java b/src/org/labkey/test/tests/issues/IssuesAdminTest.java index 34b80be32e..a6261346b1 100644 --- a/src/org/labkey/test/tests/issues/IssuesAdminTest.java +++ b/src/org/labkey/test/tests/issues/IssuesAdminTest.java @@ -23,10 +23,10 @@ import org.labkey.test.TestTimeoutException; import org.labkey.test.categories.DailyA; import org.labkey.test.categories.Issues; -import org.labkey.test.components.issues.IssueListDefDataRegion; import org.labkey.test.components.html.OptionSelect; -import org.labkey.test.pages.issues.IssuesAdminPage; +import org.labkey.test.components.issues.IssueListDefDataRegion; import org.labkey.test.pages.issues.InsertPage; +import org.labkey.test.pages.issues.IssuesAdminPage; import org.labkey.test.pages.issues.ListPage; import org.labkey.test.util.ApiPermissionsHelper; import org.labkey.test.util.DataRegionTable; @@ -120,8 +120,7 @@ public void customIssueNameTest() final String defaultSingular = "Issue"; final String defaultPlural = "Issues"; - _containerHelper.createProject(PROJECT3, null); - _containerHelper.enableModule("Issues"); + _containerHelper.createProject(PROJECT3, null, "Issues"); _issuesHelper.goToIssueListDefinitions(PROJECT3).createIssuesListDefinition("issues"); diff --git a/src/org/labkey/test/tests/wiki/WikiLongTest.java b/src/org/labkey/test/tests/wiki/WikiLongTest.java index 49c6282d7d..a888bb068c 100644 --- a/src/org/labkey/test/tests/wiki/WikiLongTest.java +++ b/src/org/labkey/test/tests/wiki/WikiLongTest.java @@ -145,12 +145,10 @@ protected String getProjectName() public void testSteps() { enableEmailRecorder(); - _containerHelper.createProject(PROJECT2_NAME, null); - _containerHelper.enableModule(PROJECT2_NAME, "MS2"); + _containerHelper.createProject(PROJECT2_NAME, null, "MS2"); _securityHelper.setProjectPerm(USERS_GROUP, "Editor"); clickButton("Save and Finish"); - _containerHelper.createProject(PROJECT_NAME, null); - _containerHelper.enableModule(PROJECT_NAME, "MS2"); + _containerHelper.createProject(PROJECT_NAME, null, "MS2"); _permissionsHelper.createPermissionsGroup("testers"); _securityHelper.setProjectPerm("testers", "Editor"); _securityHelper.setProjectPerm(USERS_GROUP, "Editor"); diff --git a/src/org/labkey/test/util/AbstractContainerHelper.java b/src/org/labkey/test/util/AbstractContainerHelper.java index f21c6d4f2e..c8a566a306 100644 --- a/src/org/labkey/test/util/AbstractContainerHelper.java +++ b/src/org/labkey/test/util/AbstractContainerHelper.java @@ -77,19 +77,12 @@ public Set getCreatedFolders() return _createdFolders; } - /** @param folderType the name of the type of container to create. - * May be null, in which case you get the server's default folder type */ - public final void createProject(@LoggedParam String projectName, @Nullable String folderType) - { - createProject(projectName, folderType, List.of()); - } - /** @param folderType the name of the type of container to create. * May be null, in which case you get the server's default folder type */ @LogMethod(quiet = true) - public final void createProject(@LoggedParam String projectName, @Nullable String folderType, List enableModules) + public final void createProject(@LoggedParam String projectName, @Nullable String folderType, String... enableModules) { - doCreateProject(projectName, folderType, enableModules); + doCreateProject(projectName, folderType, Arrays.asList(enableModules)); _createdProjects.add(projectName); }