Skip to content

Commit 4631f56

Browse files
Merge branch 'develop' into fb_smFolderArchives
2 parents 61c1963 + b0e42cd commit 4631f56

37 files changed

Lines changed: 627 additions & 277 deletions

data/api/security-api.xml

Lines changed: 66 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<ApiTests xmlns="http://labkey.org/query/xml">
22

33
<test name="get group permissions" type="get">
4-
<url>Security%20API%20Test%20Project/security-getGroupPerms.view?</url>
4+
<url>Security%20API%20Test%20Project/security-getGroupPerms.api</url>
55
<response>
66
{"container":
77
{
@@ -93,8 +93,71 @@
9393
</response>
9494
</test>
9595

96+
<test name="get group permissions excluding groups without effective permissions" type="get">
97+
<url>Security%20API%20Test%20Project/security-getGroupPerms.api?includeEmptyPermGroups=false</url>
98+
<response>
99+
{"container":
100+
{
101+
"id": "THIS CONTAINER GUID FIELD IS IGNORED IN JSON CHECK",
102+
"name": "Security API Test Project",
103+
"path": "/Security API Test Project",
104+
"isInheritingPerms": false,
105+
"groups": [
106+
{
107+
"id": 1672,
108+
"name": "testgroup1",
109+
"roles": ["org.labkey.api.security.roles.EditorRole"],
110+
"isSystemGroup": false,
111+
"isProjectGroup": true,
112+
"type": "g",
113+
"effectivePermissions": [
114+
"org.labkey.api.security.permissions.InsertPermission",
115+
"org.labkey.api.security.permissions.DeletePermission",
116+
"org.labkey.api.security.permissions.EditSharedViewPermission",
117+
"org.labkey.api.reports.permissions.EditSharedReportPermission",
118+
"org.labkey.api.security.permissions.ReadPermission",
119+
"org.labkey.api.reports.permissions.ShareReportPermission",
120+
"org.labkey.api.study.permissions.SharedParticipantGroupPermission",
121+
"org.labkey.announcements.model.SecureMessageBoardRespondPermission",
122+
"org.labkey.api.security.permissions.ReadSomePermission",
123+
"org.labkey.api.lists.permissions.ManagePicklistsPermission",
124+
"org.labkey.api.security.permissions.UpdatePermission",
125+
"org.labkey.announcements.model.SecureMessageBoardReadPermission",
126+
"org.labkey.api.security.permissions.SampleWorkflowDeletePermission",
127+
"org.labkey.api.security.permissions.SampleWorkflowJobPermission",
128+
"org.labkey.api.security.permissions.AssayReadPermission",
129+
"org.labkey.api.security.permissions.NotebookReadPermission",
130+
"org.labkey.api.security.permissions.DataClassReadPermission",
131+
"org.labkey.api.security.permissions.MediaReadPermission",
132+
"org.labkey.api.security.permissions.MoveEntitiesPermission",
133+
],
134+
"groups": []
135+
},
136+
{
137+
"id": 1673,
138+
"name": "testgroup2",
139+
"roles": ["org.labkey.api.security.roles.ReaderRole"],
140+
"isSystemGroup": false,
141+
"isProjectGroup": true,
142+
"type": "g",
143+
"effectivePermissions": [
144+
"org.labkey.api.security.permissions.ReadPermission",
145+
"org.labkey.api.security.permissions.ReadSomePermission",
146+
"org.labkey.api.security.permissions.AssayReadPermission",
147+
"org.labkey.api.security.permissions.DataClassReadPermission",
148+
"org.labkey.api.security.permissions.NotebookReadPermission",
149+
"org.labkey.api.security.permissions.MediaReadPermission"
150+
],
151+
"groups": []
152+
}
153+
]
154+
}
155+
}
156+
</response>
157+
</test>
158+
96159
<test name="groups for current user" type="get">
97-
<url>Security%20Api%20Test%20Project/security-getGroupsForCurrentUser.view?</url>
160+
<url>Security%20Api%20Test%20Project/security-getGroupsForCurrentUser.api</url>
98161
<response>
99162
{"groups": [
100163
{
@@ -115,7 +178,7 @@
115178
</test>
116179

117180
<test name="ensure login" type="get">
118-
<url>Security%20Api%20Test%20Project/security-ensureLogin.view?</url>
181+
<url>Security%20Api%20Test%20Project/security-ensureLogin.api</url>
119182
<response>
120183
{"currentUser":
121184
{

src/org/labkey/test/WebTestHelper.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@
4949
import org.labkey.remoteapi.SimplePostCommand;
5050
import org.labkey.remoteapi.query.DeleteRowsCommand;
5151
import org.labkey.remoteapi.query.Filter;
52-
import org.labkey.remoteapi.query.SaveRowsResponse;
52+
import org.labkey.remoteapi.query.RowsResponse;
5353
import org.labkey.remoteapi.query.SelectRowsCommand;
5454
import org.labkey.serverapi.reader.Readers;
5555
import org.labkey.test.util.InstallCert;
@@ -200,7 +200,7 @@ public static void deleteApiKey(Connection connection, String apiKey)
200200
{
201201
DeleteRowsCommand deleteRowsCommand = new DeleteRowsCommand("core", "apiKeys");
202202
deleteRowsCommand.setRows(rows);
203-
SaveRowsResponse response = deleteRowsCommand.execute(connection, null);
203+
RowsResponse response = deleteRowsCommand.execute(connection, null);
204204
savedApiKeys.remove(apiKey);
205205
deletedApiKeys.add(apiKey);
206206
Assert.assertEquals("Wrong number of rows affected by apiKey deletion", 1, response.getRowsAffected());

src/org/labkey/test/components/CustomizeView.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -367,7 +367,9 @@ private WebElement expandPivots(CharSequence fieldKey)
367367
_driver.scrollIntoView(fieldRow, false);
368368
if (!StringUtils.trimToEmpty(fieldRow.getAttribute("class")).contains("expanded"))
369369
{
370-
Locator.css(".x4-tree-expander").findElement(fieldRow).click();
370+
WebElement expander = Locator.css(".x4-tree-expander").findElement(fieldRow);
371+
_driver.scrollIntoView(expander, true);
372+
expander.click();
371373
}
372374
Locator.tag("tr").withClass("x4-grid-tree-node-expanded").withAttribute("data-recordid", dataRecordId).waitForElement(getComponentElement(), 10000);
373375
WebDriverWrapper.waitFor(() -> Locator.css("tr[data-recordid] + tr:not(.x4-grid-row)").findElements(getComponentElement()).isEmpty(), 2000); // Spacer row appears during expansion animation

src/org/labkey/test/components/ui/grids/DetailTableEdit.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -543,6 +543,7 @@ public DetailDataPanel clickCancel()
543543
{
544544
String title = getSourceTitle();
545545
elementCache().cancelButton.click();
546+
getWrapper().shortWait().until(ExpectedConditions.stalenessOf(elementCache().cancelButton));
546547
return new DetailDataPanel.DetailDataPanelFinder(getDriver()).withTitle(title).waitFor();
547548
}
548549

src/org/labkey/test/components/ui/notifications/ServerNotificationMenu.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -158,9 +158,9 @@ public void clickMarkAll()
158158
public ImportsPage clickViewAll()
159159
{
160160
expand();
161-
WebDriverWrapper.waitFor(elementCache().viewAllLink::isDisplayed,
161+
WebDriverWrapper.waitFor(elementCache().viewAllLink()::isDisplayed,
162162
"View all link did not become visible.", 2_500);
163-
elementCache().viewAllLink.click();
163+
elementCache().viewAllLink().click();
164164
return new ImportsPage(getWrapper());
165165
}
166166

@@ -278,7 +278,10 @@ public final WebElement markAll()
278278
.refindWhenNeeded(elementCache().menuContent);
279279
}
280280

281-
public final WebElement viewAllLink = Locator.linkContainingText("View all activity").refindWhenNeeded(this);
281+
public final WebElement viewAllLink()
282+
{
283+
return Locator.linkContainingText("View all activity").refindWhenNeeded(this);
284+
}
282285

283286
}
284287

src/org/labkey/test/params/FieldDefinition.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,8 @@ else if (Character.isUpperCase(c) && Character.isLowerCase(chars[i - 1]))
123123
}
124124
}
125125

126-
return buf.toString();
126+
// Multiple spaces in the UI are collapsed into a single space
127+
return buf.toString().replaceAll("\\s+", " ");
127128
}
128129

129130
public String getEffectiveLabel()

src/org/labkey/test/params/FieldInfo.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import org.jetbrains.annotations.Contract;
44
import org.jetbrains.annotations.NotNull;
55
import org.labkey.test.params.FieldDefinition.ColumnType;
6+
import org.labkey.test.util.DomainUtils;
67
import org.labkey.test.util.EscapeUtil;
78
import org.labkey.test.util.TestDataGenerator;
89

@@ -53,13 +54,21 @@ public FieldInfo(String name)
5354
/**
5455
* Creates a FieldInfo with a semi-random name
5556
*/
56-
public static FieldInfo random(String namePart, ColumnType columnType)
57+
public static FieldInfo random(String namePart, ColumnType columnType, DomainUtils.DomainKind domainKind)
5758
{
58-
FieldInfo field = new FieldInfo(TestDataGenerator.randomFieldName(namePart), columnType);
59+
FieldInfo field = new FieldInfo(TestDataGenerator.randomFieldName(namePart, null, domainKind), columnType);
5960
field.setNamePart(namePart);
6061
return field;
6162
}
6263

64+
/**
65+
* Creates a FieldInfo with a semi-random name
66+
*/
67+
public static FieldInfo random(String namePart, ColumnType columnType)
68+
{
69+
return random(namePart, columnType, null);
70+
}
71+
6372
/**
6473
* Creates a String field with a semi-random name
6574
*/

src/org/labkey/test/params/experiment/DataClassDefinition.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,4 +168,14 @@ public TestDataGenerator getTestDataGenerator(String containerPath)
168168
{
169169
return super.getTestDataGenerator(containerPath).withColumns(List.of(new FieldDefinition("Name", FieldDefinition.ColumnType.String)));
170170
}
171+
172+
public FieldDefinition getFieldByNamePart(String namePart)
173+
{
174+
for (FieldDefinition field : getFields())
175+
{
176+
if (field.isNamePartMatch(namePart))
177+
return field;
178+
}
179+
throw new IllegalArgumentException("No field found with name part: " + namePart);
180+
}
171181
}

src/org/labkey/test/params/list/ListDefinition.java

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,11 @@
11
package org.labkey.test.params.list;
22

33
import org.jetbrains.annotations.NotNull;
4-
import org.labkey.remoteapi.CommandException;
5-
import org.labkey.remoteapi.Connection;
64
import org.labkey.remoteapi.domain.Domain;
7-
import org.labkey.remoteapi.domain.InferDomainCommand;
85
import org.labkey.remoteapi.domain.PropertyDescriptor;
6+
import org.labkey.test.params.FieldDefinition;
97
import org.labkey.test.params.property.DomainProps;
108

11-
import java.io.File;
12-
import java.io.IOException;
139
import java.util.ArrayList;
1410
import java.util.HashMap;
1511
import java.util.List;
@@ -19,7 +15,7 @@ public abstract class ListDefinition extends DomainProps
1915
{
2016
private String _name;
2117
private String _description;
22-
private List<PropertyDescriptor> _fields = new ArrayList<>();
18+
private List<FieldDefinition> _fields = new ArrayList<>();
2319
private String _keyName;
2420
// API Options
2521
private String _titleColumn;
@@ -67,7 +63,7 @@ public List<PropertyDescriptor> getFields()
6763
return new ArrayList<>(_fields); // return a copy
6864
}
6965

70-
public ListDefinition setFields(List<? extends PropertyDescriptor> fields)
66+
public ListDefinition setFields(List<FieldDefinition> fields)
7167
{
7268
if (!fields.isEmpty() && getKeyName() == null)
7369
{
@@ -78,14 +74,7 @@ public ListDefinition setFields(List<? extends PropertyDescriptor> fields)
7874
return this;
7975
}
8076

81-
public ListDefinition inferFields(File dataFile, Connection connection) throws IOException, CommandException
82-
{
83-
return setFields(new InferDomainCommand(dataFile, getKind())
84-
.execute(connection, "/")
85-
.getFields());
86-
}
87-
88-
public ListDefinition addField(@NotNull PropertyDescriptor field)
77+
public ListDefinition addField(@NotNull FieldDefinition field)
8978
{
9079
if (getKeyName() == null)
9180
{
@@ -157,4 +146,14 @@ protected Map<String, Object> getOptions()
157146
}
158147

159148
protected abstract String getKeyType();
149+
150+
public FieldDefinition getFieldByNamePart(String namePart)
151+
{
152+
for (FieldDefinition field : _fields)
153+
{
154+
if (field.isNamePartMatch(namePart))
155+
return field;
156+
}
157+
throw new IllegalArgumentException("No field found with name part: " + namePart);
158+
}
160159
}

src/org/labkey/test/tests/ApiKeyTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
import org.labkey.remoteapi.query.GetQueryDetailsResponse;
3333
import org.labkey.remoteapi.query.GetSchemasCommand;
3434
import org.labkey.remoteapi.query.ImportDataResponse;
35-
import org.labkey.remoteapi.query.SaveRowsResponse;
35+
import org.labkey.remoteapi.query.RowsResponse;
3636
import org.labkey.remoteapi.query.SelectRowsCommand;
3737
import org.labkey.remoteapi.query.SelectRowsResponse;
3838
import org.labkey.remoteapi.query.Sort;
@@ -379,7 +379,7 @@ private void verifyValidAPIKey(Connection connection, String userEmail) throws I
379379
valueCount.incrementAndGet();
380380
assertEquals("Rows imported", 1, importResponse.getRowCount());
381381

382-
SaveRowsResponse saveResponse = queryApiHelper.insertRows(List.of(Map.of(LIST_VALUE, "value" + valueCount.get())));
382+
RowsResponse saveResponse = queryApiHelper.insertRows(List.of(Map.of(LIST_VALUE, "value" + valueCount.get())));
383383
valueCount.incrementAndGet();
384384
assertEquals("Rows inserted", 1, saveResponse.getRowsAffected());
385385

0 commit comments

Comments
 (0)