Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion src/org/labkey/test/BaseWebDriverTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@
import org.labkey.test.pages.query.NewQueryPage;
import org.labkey.test.pages.query.SourceQueryPage;
import org.labkey.test.pages.search.SearchResultsPage;
import org.labkey.test.params.ContainerInfo;
import org.labkey.test.params.FieldDefinition;
import org.labkey.test.params.FieldKey;
import org.labkey.test.teamcity.TeamCityUtils;
Expand Down Expand Up @@ -222,7 +223,7 @@ public abstract class BaseWebDriverTest extends LabKeySiteWrapper implements Cle

public static final String TRICKY_CHARACTERS = "><&/%\\' \"1\u00E4\u00F6\u00FC\u00C5";
public static final String TRICKY_CHARACTERS_NO_QUOTES = "></% 1\u00E4\u00F6\u00FC\u00C5";
public static final String TRICKY_CHARACTERS_FOR_PROJECT_NAMES = "\u2603~!@$&()_+{}-=[],.#\u00E4\u00F6\u00FC\u00C5"; // No slash or space
public static final String TRICKY_CHARACTERS_FOR_PROJECT_NAMES = ContainerInfo.TRICKY_CHARACTERS;
public static final String LONG_NON_ASCII_STRING = StringUtils.repeat(FieldDefinition.SNOWMAN, 22); // "☃" See Issue 52714
public static final String INJECT_CHARS_1 = Crawler.injectScriptBlock;
public static final String INJECT_CHARS_2 = Crawler.injectAttributeScript;
Expand Down
105 changes: 105 additions & 0 deletions src/org/labkey/test/params/ContainerInfo.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
package org.labkey.test.params;

import org.jetbrains.annotations.NotNull;
import org.labkey.test.TestProperties;
import org.labkey.test.util.AbstractContainerHelper;
import org.labkey.test.util.TestDataGenerator;

import java.util.Collections;
import java.util.List;
import java.util.Objects;

import static org.labkey.test.util.TestDataGenerator.ALL_CHARS_PLACEHOLDER;
import static org.labkey.test.util.TestDataGenerator.WIDE_PLACEHOLDER;
import static org.labkey.test.util.TextUtils.containerPath;

public class ContainerInfo
{
public static final String TRICKY_CHARACTERS = "\u2603~!@$&()_+{}-=[],.#\u00E4\u00F6\u00FC\u00C5" + WIDE_PLACEHOLDER + ALL_CHARS_PLACEHOLDER; // No slash or space

private final @NotNull String _name;
private final String _parentContainerPath;
private final @NotNull String _containerPath;
private final String _folderType;
private final @NotNull List<String> _enableModules;

protected ContainerInfo(String name, ContainerInfo parentContainer, String folderType, List<String> enableModules)
{
_parentContainerPath = parentContainer == null ? null : parentContainer.getContainerPath();
_name = Objects.requireNonNull(containerPath(name));
_containerPath = containerPath(_parentContainerPath, name);
_folderType = folderType;
_enableModules = enableModules == null || enableModules.isEmpty() ? Collections.emptyList() : List.copyOf(enableModules);
}

private static @NotNull String getRandomName(String folderName)
{
if (TestProperties.isTestRunningOnTeamCity())
return TestDataGenerator.randomName(folderName, TestDataGenerator.randomInt(0, 5), 5, TRICKY_CHARACTERS, null);
else
return folderName + TRICKY_CHARACTERS;
}

public static ContainerInfo folder(String folderName, ContainerInfo parentContainer, String folderType, List<String> enableModules)
{
return new ContainerInfo(getRandomName(folderName), parentContainer, folderType, enableModules);
}

public static ContainerInfo folder(String folderName, ContainerInfo parentContainer, String folderType)
{
return folder(folderName, parentContainer, folderType, null);
}

public static ContainerInfo folder(String folderName, ContainerInfo parentContainer)
{
return folder(folderName, parentContainer, null, null);
}

public static ContainerInfo project(String projectName, String folderType, List<String> enableModules)
{
return folder(projectName, null, folderType, enableModules);
}

public static ContainerInfo project(String projectName, String folderType)
{
return project(projectName, folderType, null);
}

public static ContainerInfo project(String projectName)
{
return project(projectName, null, null);
}

public void create(AbstractContainerHelper containerHelper)
{
create(containerHelper, _folderType);
}

public void create(AbstractContainerHelper containerHelper, String folderType)
{
if (isProject())
containerHelper.createProject(_name, folderType);
else
containerHelper.createSubfolder(_parentContainerPath, _name, folderType);
if (!_enableModules.isEmpty())
{
containerHelper.enableModules(_containerPath, _enableModules);
}
}

public @NotNull String getName()
{
return _name;
}

public @NotNull String getContainerPath()
{
return _containerPath;
}

public boolean isProject()
{
return _parentContainerPath == null;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import org.labkey.remoteapi.domain.PropertyDescriptor;
import org.labkey.test.params.FieldDefinition;
import org.labkey.test.params.property.DomainProps;
import org.labkey.test.util.DomainUtils.DomainKind;
import org.labkey.test.util.TestDataGenerator;

import java.util.ArrayList;
Expand Down Expand Up @@ -123,7 +124,7 @@ protected Domain getDomainDesign()
@Override
protected String getKind()
{
return "DataClass";
return DomainKind.DataClass.name();
}

@NotNull
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import org.labkey.test.components.ui.domainproperties.samples.SampleTypeDesigner;
import org.labkey.test.params.FieldDefinition;
import org.labkey.test.params.property.DomainProps;
import org.labkey.test.util.DomainUtils.DomainKind;

import java.util.ArrayList;
import java.util.HashMap;
Expand All @@ -14,8 +15,6 @@
import java.util.Map;
import java.util.Set;

import static org.labkey.test.util.exp.SampleTypeAPIHelper.SAMPLE_TYPE_DOMAIN_KIND;

/**
* Defines a Sample Type. Suitable for use with UI and API helpers.
* 'exp.materials'
Expand Down Expand Up @@ -217,7 +216,7 @@ protected Domain getDomainDesign()
@Override
protected String getKind()
{
return SAMPLE_TYPE_DOMAIN_KIND;
return DomainKind.SampleSet.name();
}

@NotNull
Expand Down
4 changes: 2 additions & 2 deletions src/org/labkey/test/params/list/IntListDefinition.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import org.jetbrains.annotations.NotNull;
import org.labkey.remoteapi.domain.PropertyDescriptor;
import org.labkey.test.params.FieldDefinition;
import org.labkey.test.util.DomainUtils.DomainKind;
import org.labkey.test.util.TestDataGenerator;

import java.util.List;
Expand All @@ -11,7 +12,6 @@

public class IntListDefinition extends ListDefinition
{
private static final String DOMAIN_KIND = "IntList";

private final boolean isAutoIncrementKey;

Expand Down Expand Up @@ -43,7 +43,7 @@ public List<PropertyDescriptor> getFields()
@Override
protected String getKind()
{
return DOMAIN_KIND;
return DomainKind.IntList.name();
}

@Override
Expand Down
4 changes: 2 additions & 2 deletions src/org/labkey/test/params/list/VarListDefinition.java
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package org.labkey.test.params.list;

import org.jetbrains.annotations.NotNull;
import org.labkey.test.util.DomainUtils.DomainKind;

public class VarListDefinition extends ListDefinition
{
private static final String DOMAIN_KIND = "VarList";

public VarListDefinition(String name)
{
Expand All @@ -15,7 +15,7 @@ public VarListDefinition(String name)
@Override
protected String getKind()
{
return DOMAIN_KIND;
return DomainKind.VarList.name();
}

@Override
Expand Down
7 changes: 4 additions & 3 deletions src/org/labkey/test/params/study/DatasetDefinition.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import org.labkey.remoteapi.domain.Domain;
import org.labkey.remoteapi.domain.PropertyDescriptor;
import org.labkey.test.params.property.DomainProps;
import org.labkey.test.util.DomainUtils.DomainKind;

import java.util.ArrayList;
import java.util.HashMap;
Expand All @@ -12,7 +13,7 @@

public class DatasetDefinition extends DomainProps
{
private String _name;
private final String _name;
private String _description;
private List<PropertyDescriptor> _fields = new ArrayList<>();
private String _kindName;
Expand All @@ -21,8 +22,8 @@ public class DatasetDefinition extends DomainProps
private String _keyPropertyName;
private Boolean _timeKeyField;

public static final String VISIT_BASED_STUDY = "StudyDatasetVisit";
public static final String DATE_BASED_STUDY = "StudyDatasetDate";
public static final String VISIT_BASED_STUDY = DomainKind.StudyDatasetVisit.name();
public static final String DATE_BASED_STUDY = DomainKind.StudyDatasetDate.name();

public static DatasetDefinition create(String name)
{
Expand Down
12 changes: 8 additions & 4 deletions src/org/labkey/test/util/AbstractContainerHelper.java
Original file line number Diff line number Diff line change
Expand Up @@ -199,11 +199,15 @@ private GetModulesResponse getModules(String containerPath)
}
}

public void enableModule(String projectName, String moduleName)
public void enableModule(String containerPath, String moduleName)
{
_test.ensureAdminMode();
_test.clickProject(projectName);
enableModule(moduleName);
enableModules(containerPath, List.of(moduleName));
}

public void enableModules(String containerPath, List<String> moduleNames)
{
_test.goToProjectHome(containerPath);
enableModules(moduleNames);
}

public void enableModule(String moduleName)
Expand Down
5 changes: 1 addition & 4 deletions src/org/labkey/test/util/SampleTypeHelper.java
Original file line number Diff line number Diff line change
Expand Up @@ -83,10 +83,7 @@ public static SampleTypeHelper beginAtSampleTypesList(WebDriverWrapper dWrapper,
private static String convertMapToTsv(@NotNull List<Map<String, String>> data)
{
List<String> headers = new ArrayList<>(data.get(0).keySet());
List<Map<String, Object>> rows = new ArrayList<>();
for (Map<String, String> row : data)
rows.add(new HashMap<>(row));
return TestDataUtils.tsvStringFromRowMaps(rows, headers, true);
return TestDataUtils.tsvStringFromRowMaps(data, headers, true);
}

@Override
Expand Down
24 changes: 18 additions & 6 deletions src/org/labkey/test/util/TestDataGenerator.java
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ public TestDataGenerator(String schema, String queryName, String containerPath)
_containerPath = containerPath;
}

public static File writeCsvFile(List<FieldDefinition> fields, List<Map<String, Object>> entityData, String fileName) throws IOException
public static <T> File writeCsvFile(List<FieldDefinition> fields, List<Map<String, T>> entityData, String fileName) throws IOException
{
List<List<String>> rows = TestDataUtils.replaceColumnHeaders(
TestDataUtils.rowListsFromMaps(entityData), ColumnNameMapper.labelToName(fields)); // Use field names
Expand Down Expand Up @@ -299,12 +299,12 @@ public TestDataGenerator setAutoGeneratedFields(String... fieldNames)
return this;
}

/**
* Clear any existing generated rows and add new ones
*/
public TestDataGenerator withGeneratedRows(int desiredRowCount)
{
if (getRowCount() > 0)
{
throw new IllegalStateException("Rows have already been generated");
}
_rows.clear();

generateRows(desiredRowCount);

Expand Down Expand Up @@ -640,6 +640,8 @@ private static boolean isDomainAndFieldNameInvalid(DomainUtils.DomainKind domain
try
{
CommandResponse response = command.execute(WebTestHelper.getRemoteApiConnection(), "/home");
if (response.getParsedData() == null)
throw new RuntimeException("Failed to parse response for command: " + response.getText());
return response.getParsedData().containsKey("errors");
}
catch (CommandException | IOException e)
Expand Down Expand Up @@ -823,6 +825,11 @@ public RowsResponse insertRows(Connection cn) throws IOException, CommandExcepti
return insertRows(cn, getRows());
}

public RowsResponse insertRows(Connection cn, String containerPath) throws IOException, CommandException
{
return getQueryHelper(cn, containerPath).insertRows(getRows());
}

public RowsResponse insertRows(Connection cn, List<Map<String, Object>> rows) throws IOException, CommandException
{
return getQueryHelper(cn).insertRows(rows);
Expand Down Expand Up @@ -899,9 +906,14 @@ public RowsResponse deleteRows(Connection cn, List<Map<String,Object>> rowsToDel
return getQueryHelper(cn).deleteRows(rowsToDelete);
}

public QueryApiHelper getQueryHelper(Connection connection, String containerPath)
{
return new QueryApiHelper(connection, containerPath, _schemaName, _queryName);
}

public QueryApiHelper getQueryHelper(Connection connection)
{
return new QueryApiHelper(connection, _containerPath, _schemaName, _queryName);
return getQueryHelper(connection, _containerPath);
}

public TestDataValidator getValidator()
Expand Down
10 changes: 10 additions & 0 deletions src/org/labkey/test/util/TestUser.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import org.labkey.remoteapi.Connection;
import org.labkey.remoteapi.security.CreateUserResponse;
import org.labkey.test.WebDriverWrapper;
import org.labkey.test.WebTestHelper;

import java.io.IOException;

Expand Down Expand Up @@ -102,6 +103,15 @@ public String getPassword()
return _password;
}

/**
* Create a non-impersonating API connection for the user.
* @return new Connection
*/
public Connection getUserConnection()
{
return new Connection(WebTestHelper.getBaseURL(), getEmail(), getPassword());
}

public TestUser addPermission(String role, String containerPath)
{
new ApiPermissionsHelper(getWrapper()).addMemberToRole(getEmail(), role, PermissionsHelper.MemberType.user, containerPath);
Expand Down
19 changes: 19 additions & 0 deletions src/org/labkey/test/util/TextUtils.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
package org.labkey.test.util;

import org.apache.commons.lang3.StringUtils;

import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.regex.Pattern;

public class TextUtils
Expand Down Expand Up @@ -38,4 +42,19 @@ public static List<String> normalizeSpaceMultiline(List<String> values)
{
return values.stream().map(TextUtils::normalizeSpaceMultiline).toList();
}

/// Join project and folder names to create a normalized containerPath.\
/// The resulting value will be normalized:
/// - repeated path separators will be collapsed to a single slash
/// - leading and trailing slashes will be removed
/// - whitespace around folder names will be removed
/// - the ROOT container will be represented as `null`
/// @param pathParts project name and subfolders to be joined
/// @return normalized container path. `null` for the root container
public static String containerPath(String... pathParts)
{
return StringUtils.trimToNull(
StringUtils.strip(String.join("/", Arrays.stream(pathParts).filter(Objects::nonNull).toList()), "/")
.replaceAll("\\s*/+\\s*", "/"));
}
}
2 changes: 1 addition & 1 deletion src/org/labkey/test/util/data/ColumnNameMapper.java
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,6 @@ public String apply(String s)
.map(Supplier::get)
.filter(Objects::nonNull)
.findFirst()
.orElse(s);
.orElseThrow(() -> new IllegalArgumentException("No column mapping found for " + s));
}
}
Loading