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
2 changes: 1 addition & 1 deletion src/org/labkey/remoteapi/SimpleFormCommand.java
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@
import java.util.List;
import java.util.Map;

public class SimpleFormCommand extends Command<CommandResponse, HttpUriRequest>
public class SimpleFormCommand extends Command<CommandResponse>
{
private final Map<String, String> _formData;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,8 @@ public class ImportExperimentDataCommand extends ImportDataCommand
{
private AuditLogHelper.AuditBehaviorType _auditBehavior;
private Boolean _crossTypeImport;
private String _containerPath;

private final String _containerPath;

public ImportExperimentDataCommand(String schemaName, String queryName, String containerPath)
{
Expand Down Expand Up @@ -76,5 +77,4 @@ protected HttpPost createRequest(URI uri) {
}
return post;
}

}
2 changes: 1 addition & 1 deletion src/org/labkey/test/stress/ApiTestCommand.java
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@
import java.io.Reader;
import java.net.URI;

class ApiTestCommand extends Command<CommandResponse, HttpUriRequest>
class ApiTestCommand extends Command<CommandResponse>
{
private final String _url;
private final String _type;
Expand Down
8 changes: 4 additions & 4 deletions src/org/labkey/test/tests/ClientAPITest.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@

import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.math.NumberUtils;
import org.apache.hc.client5.http.classic.methods.HttpGet;
import org.apache.hc.client5.http.classic.methods.HttpUriRequest;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.json.JSONObject;
Expand Down Expand Up @@ -58,9 +58,9 @@
import org.labkey.test.util.PortalHelper;
import org.labkey.test.util.StudyHelper;
import org.labkey.test.util.TestDataGenerator;
import org.labkey.test.util.data.TestDataUtils;
import org.labkey.test.util.UIUserHelper;
import org.labkey.test.util.WikiHelper;
import org.labkey.test.util.data.TestDataUtils;
import org.labkey.test.util.query.QueryUtils;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.TimeoutException;
Expand Down Expand Up @@ -1481,9 +1481,9 @@ private void runCommand(Connection cn, SimpleGetCommand source, String requestCo
SimpleGetCommand cmd = new SimpleGetCommand(source.getControllerName(), source.getActionName())
{
@Override
protected HttpGet getHttpRequest(Connection connection, String folderPath) throws URISyntaxException
protected HttpUriRequest getHttpRequest(Connection connection, String folderPath) throws URISyntaxException
{
HttpGet request = super.getHttpRequest(connection, folderPath);
HttpUriRequest request = super.getHttpRequest(connection, folderPath);
request.setHeader("Content-Type", requestContentType);

return request;
Expand Down
76 changes: 63 additions & 13 deletions src/org/labkey/test/tests/JavaClientApiTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,9 @@
import org.labkey.remoteapi.domain.GetDomainDetailsCommand;
import org.labkey.remoteapi.domain.PropertyDescriptor;
import org.labkey.remoteapi.domain.SaveDomainCommand;
import org.labkey.remoteapi.query.BaseQueryCommand;
import org.labkey.remoteapi.query.DeleteRowsCommand;
import org.labkey.remoteapi.query.ExecuteSqlCommand;
import org.labkey.remoteapi.query.Filter;
import org.labkey.remoteapi.query.InsertRowsCommand;
import org.labkey.remoteapi.query.SaveRowsResponse;
Expand Down Expand Up @@ -70,6 +72,7 @@
import org.labkey.test.util.PermissionsHelper.PrincipalType;
import org.labkey.test.util.PortalHelper;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
Expand Down Expand Up @@ -570,7 +573,7 @@ public void testImpersonateUser() throws Exception
// stop impersonation
StopImpersonatingCommand stopCmd = new StopImpersonatingCommand();
CommandResponse stopResp = stopCmd.execute(cn, PROJECT_NAME);
assertEquals(302, stopResp.getStatusCode());
assertEquals(200, stopResp.getStatusCode());

// check whoami
who = new WhoAmICommand().execute(cn, PROJECT_NAME);
Expand Down Expand Up @@ -608,6 +611,7 @@ public void testImpersonationConnection() throws Exception
cn.stopImpersonating();
}

// Also tests SelectRowCommand and ExecuteSqlCommand
@Test
public void testSaveRowsApiCommand() throws Exception
{
Expand Down Expand Up @@ -741,18 +745,7 @@ public void testSaveRowsApiCommand() throws Exception
// Verify players list after operations
{
var selectRowsCommand = new SelectRowsCommand(schemaName, playersListName);
selectRowsCommand.addSort(new Sort("JerseyNumber", Sort.Direction.ASCENDING));

var resp = selectRowsCommand.execute(conn, PROJECT_NAME);
assertEquals(3, resp.getRowCount());

var players = resp.getRows();
assertEquals(19, players.get(0).get("jerseyNumber")); // verify case-insensitive
assertEquals("Seattle Mariners", players.get(0).get("Team"));
assertEquals(24, players.get(1).get("Jerseynumber")); // verify case-insensitive
assertEquals("Seattle Mariners", players.get(1).get("Team"));
assertEquals(44, players.get(2).get("JerseyNumber"));
assertEquals("New York Yankees", players.get(2).get("Team"));
verifyJerseys(conn, selectRowsCommand, 3);
}

// Verify teams list after operations
Expand All @@ -773,6 +766,63 @@ public void testSaveRowsApiCommand() throws Exception
assertEquals("San Francisco", teams.get(2).get("City"));
assertEquals("Giants", teams.get(2).get("Team"));
}

// Test ExecuteSqlCommand basic SELECT
{
var executeSqlCommand = new ExecuteSqlCommand(schemaName, "SELECT * FROM " + schemaName + "." + ExecuteSqlCommand.quoteIdentifier(playersListName));
var resp = verifyJerseys(conn, executeSqlCommand, 3);
// setIncludeMetadata(true), the default, should result in metadata and column model
assertNotNull(resp.getMetaData());
assertNotNull(resp.getColumnModel()); // setIncludeMetadata(true), the default
}

// Test ExecuteSqlCommand includeMetadata, offset, and maxRows properties
{
var executeSqlCommand = new ExecuteSqlCommand(schemaName, "SELECT * FROM " + schemaName + "." + ExecuteSqlCommand.quoteIdentifier(playersListName));
executeSqlCommand.addSort(new Sort("JerseyNumber", Sort.Direction.ASCENDING));
executeSqlCommand.setIncludeMetadata(false);
executeSqlCommand.setOffset(2);
executeSqlCommand.setMaxRows(1);
var resp = verifyJerseys(conn, executeSqlCommand, 1);
// setIncludeMetadata(false) should result in no metadata or column model
assertNull(resp.getMetaData());
assertNull(resp.getColumnModel());
}

// Test ExecuteSqlCommand parameterized query
{
var executeSqlCommand = new ExecuteSqlCommand(schemaName,
"PARAMETERS\n" +
"(\n" +
" Number INTEGER\n" +
")\nSELECT * FROM " + schemaName + "." + ExecuteSqlCommand.quoteIdentifier(playersListName) +
"\nWHERE JerseyNumber = Number");
executeSqlCommand.setQueryParameters(Map.of("Number", "44"));
verifyJerseys(conn, executeSqlCommand, 1);
}
}

private SelectRowsResponse verifyJerseys(Connection conn, BaseQueryCommand<SelectRowsResponse> command, int expectedCount) throws IOException, CommandException
{
command.addSort(new Sort("JerseyNumber", Sort.Direction.ASCENDING));
var resp = command.execute(conn, PROJECT_NAME);
var players = resp.getRows();
assertEquals(expectedCount, players.size());

// Phelps (the Yankee) is always the last player
var lastPlayer = players.getLast();
assertEquals(44, lastPlayer.get("JerseyNumber"));
assertEquals("New York Yankees", lastPlayer.get("Team"));

if (expectedCount == 3)
{
assertEquals(19, players.get(0).get("jerseyNumber")); // verify case-insensitive
assertEquals("Seattle Mariners", players.get(0).get("Team"));
assertEquals(24, players.get(1).get("Jerseynumber")); // verify case-insensitive
assertEquals("Seattle Mariners", players.get(1).get("Team"));
}

return resp;
}

@Override
Expand Down
2 changes: 1 addition & 1 deletion src/org/labkey/test/tests/SimpleModuleTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -446,7 +446,7 @@ private void doTestColumnValidators() throws Exception
deleteCmd.execute(createDefaultConnection(), getProjectName());
}

private void submitAndTestExpectedFailure(Command<?, ?> cmd, String expectedError) throws Exception
private void submitAndTestExpectedFailure(Command<?> cmd, String expectedError) throws Exception
{
try
{
Expand Down
19 changes: 7 additions & 12 deletions src/org/labkey/test/tests/list/ListTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -958,7 +958,7 @@ private int lookupListAuditRowId(Connection cn, String listName) throws Exceptio
SelectRowsResponse rs = cmd.execute(cn, getProjectName());
if (rs.getRows().isEmpty())
throw new AssertionError("No ListAuditEvent for " + listName);
return ((Number) rs.getRows().get(0).get("RowId")).intValue();
return ((Number) rs.getRows().getFirst().get("RowId")).intValue();
}

/* Issue 23487: add regression coverage for batch insert into list with multiple errors
Expand Down Expand Up @@ -1092,9 +1092,9 @@ public void testRemoveColumnOverAPI() throws Exception
public void testChangeListNameOverAPI() throws Exception
{
List<FieldDefinition> cols = Arrays.asList(
new FieldDefinition("name", ColumnType.String),
new FieldDefinition("title", ColumnType.String),
new FieldDefinition("dewey", ColumnType.Decimal)
new FieldDefinition("name", ColumnType.String),
new FieldDefinition("title", ColumnType.String),
new FieldDefinition("dewey", ColumnType.Decimal)
);
String listName = "remoteAPIBeforeRename";
TestDataGenerator dgen = new TestDataGenerator("lists", listName, getProjectName())
Expand All @@ -1114,7 +1114,6 @@ public void testChangeListNameOverAPI() throws Exception
@Test
public void testChangeListName()
{

String listNameBefore = TestDataGenerator.randomDomainName("Before Rename", DomainUtils.DomainKind.IntList);

_listHelper.createList(PROJECT_VERIFY, listNameBefore,
Expand Down Expand Up @@ -1962,19 +1961,19 @@ private List<Map<String, Object>> getListAuditEventsSince(String listName, int p
).getRows();
}

private List<String> getQueryFormFieldNamesDecoded()
private List<String> getQueryFormFieldNamesDecoded()
{
ArrayList<String> ret = new ArrayList<>();
Locator.tag("input").attributeStartsWith("name", "quf_")
.findElements(getDriver()).stream()
.map(el -> el.getDomAttribute("name"))
.map(s -> s.substring(4))
.forEach(name -> ret.add(name));
.forEach(ret::add);
Locator.tag("input").attributeStartsWith("name", "%_quf_")
.findElements(getDriver()).stream()
.map(el -> el.getDomAttribute("name"))
.map(name -> EscapeUtil.decode(name.substring(6)))
.forEach(name -> ret.add(name));
.forEach(ret::add);
return ret;
}

Expand Down Expand Up @@ -2017,12 +2016,10 @@ public void testTrickyCharacterFields() throws IOException
// These validate Issue 52069 Issue 52070 Issue 52071
testTricky("Tricky Field Character", false);
testTricky("TrickyField Character Auto Key", true);

}

private void testTricky(String listName, boolean autoKey) throws IOException
{

String keyField = "Key Field \"`~!@#$%^&*()_-+={}[]|\\:;<>,.?/\u5668\u9aa8";
String keyField_Bulk = "\"" + keyField.replace("\"", "\"\"") + "\"" ;
String intField = "Int Field \"`~!@#$%^&*()_-+={}[]|\\:;<>,.?/\u00a5\u00e6";
Expand Down Expand Up @@ -2141,7 +2138,6 @@ private void testTricky(String listName, boolean autoKey) throws IOException
expectedValues.add(Map.of(EscapeUtil.fieldKeyEncodePart(keyField), "3",
EscapeUtil.fieldKeyEncodePart(intField), "300",
EscapeUtil.fieldKeyEncodePart(trickyField), "303"));

}
else
{
Expand Down Expand Up @@ -2232,7 +2228,6 @@ private void testTricky(String listName, boolean autoKey) throws IOException
assertEquals(String.format("Row detail for column '%s' not as expected.", expectedFields.get(i)),
expectedFields.get(i), actualFields.get(i));
}

}

private void validateDataRegionTableForTricky(List<Map<String, String>> expectedValue)
Expand Down