Skip to content

Commit 08d76c0

Browse files
committed
Extract test into its own class
1 parent 140426e commit 08d76c0

File tree

2 files changed

+288
-204
lines changed

2 files changed

+288
-204
lines changed
Lines changed: 288 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,288 @@
1+
package org.labkey.test.tests.list;
2+
3+
import org.jetbrains.annotations.Nullable;
4+
import org.junit.BeforeClass;
5+
import org.junit.Test;
6+
import org.junit.experimental.categories.Category;
7+
import org.labkey.remoteapi.CommandException;
8+
import org.labkey.test.BaseWebDriverTest;
9+
import org.labkey.test.categories.Daily;
10+
import org.labkey.test.categories.Data;
11+
import org.labkey.test.categories.Hosting;
12+
import org.labkey.test.components.CustomizeView;
13+
import org.labkey.test.pages.ImportDataPage;
14+
import org.labkey.test.pages.list.EditListDefinitionPage;
15+
import org.labkey.test.params.FieldDefinition;
16+
import org.labkey.test.util.DataRegionTable;
17+
import org.labkey.test.util.EscapeUtil;
18+
import org.labkey.test.util.TestDataGenerator;
19+
import org.labkey.test.util.query.QueryApiHelper;
20+
21+
import java.io.IOException;
22+
import java.util.Arrays;
23+
import java.util.List;
24+
import java.util.Map;
25+
26+
import static org.junit.Assert.assertEquals;
27+
28+
// Issue 52098, Issue 49422
29+
@Category({Daily.class, Data.class, Hosting.class})
30+
public class ListLookupTest extends BaseWebDriverTest
31+
{
32+
private static final String lookToListName = TestDataGenerator.randomDomainName("lookToList");
33+
private static final String lookToKeyFieldName = TestDataGenerator.randomFieldName("lookToKeyField");
34+
private static final String lookToFieldName = TestDataGenerator.randomFieldName("lookToField");
35+
private static List<Map<String, String>> lookToListValues;
36+
private static String lookupKeyAsNameNumber;
37+
private static String lookupKeyAsNameFieldValue;
38+
private static final String lookFromListName = TestDataGenerator.randomDomainName("lookFromList");
39+
private static final String lookFromKeyFieldName = TestDataGenerator.randomFieldName("Look From Key Field");
40+
private static final String lookFromLookupFieldName = TestDataGenerator.randomFieldName("Look From Lookup Field");
41+
private static final String lookFromLookupFieldKey = EscapeUtil.fieldKeyEncodePart(lookFromLookupFieldName);
42+
43+
@BeforeClass
44+
public static void setupProject()
45+
{
46+
ListLookupTest init = getCurrentTest();
47+
init.doSetup();
48+
}
49+
50+
private void doSetup()
51+
{
52+
log("Setup project and list module");
53+
_containerHelper.createProject(getProjectName(), null);
54+
55+
log("Create a list to use as a lookup table with some number-like names.");
56+
_listHelper.createList(getProjectName(), lookToListName, lookToKeyFieldName,
57+
new FieldDefinition(lookToFieldName, FieldDefinition.ColumnType.String));
58+
String bulkData = lookToFieldName + "\n" +
59+
"1E2\n" +
60+
"102\n" +
61+
"Lookup\n" +
62+
".123";
63+
_listHelper.bulkImportData(bulkData);
64+
65+
DataRegionTable dataRegionTable = new DataRegionTable("query", getDriver());
66+
CustomizeView customizer = dataRegionTable.openCustomizeGrid();
67+
customizer.showHiddenItems();
68+
customizer.addColumn(EscapeUtil.fieldKeyEncodePart(lookToKeyFieldName));
69+
customizer.clickViewGrid();
70+
lookToListValues = dataRegionTable.getTableData();
71+
lookupKeyAsNameNumber = lookToListValues.get(0).get(EscapeUtil.fieldKeyEncodePart(lookToKeyFieldName));
72+
lookupKeyAsNameFieldValue = lookToListValues.get(0).get(EscapeUtil.fieldKeyEncodePart(lookToFieldName));
73+
_listHelper.insertNewRow(Map.of(lookToFieldName, lookupKeyAsNameNumber));
74+
75+
log("Create a second list that looks up to the first list.");
76+
_listHelper.createList(getProjectName(), lookFromListName, lookFromKeyFieldName);
77+
EditListDefinitionPage listDefinitionPage = _listHelper.goToEditDesign(lookFromListName);
78+
listDefinitionPage.getFieldsPanel()
79+
.addField(lookFromLookupFieldName)
80+
.setLookup(new FieldDefinition.IntLookup("lists", lookToListName));
81+
listDefinitionPage.clickSave();
82+
}
83+
84+
85+
@Test
86+
public void testWithoutValidatorOrAlternateKeys() throws IOException, CommandException
87+
{
88+
setLookupValidatorEnabled(false);
89+
resetList();
90+
91+
log("Import data into the second list without alternate keys.");
92+
String bulkData = lookFromLookupFieldName + "\n" + lookupKeyAsNameNumber;
93+
_listHelper.clickImportData()
94+
.setText(bulkData)
95+
.submit();
96+
log("Verify the import succeeds and resolves by primary key when not expecting alternate keys.");
97+
List<Map<String, String>> expectedData = List.of(
98+
Map.of(lookFromLookupFieldKey, lookupKeyAsNameFieldValue)
99+
);
100+
validateListValues(expectedData);
101+
102+
log("Clean out list before next import.");
103+
resetList();
104+
log("Import data into second list without alternate keys supplying invalid primary key");
105+
bulkData = lookFromLookupFieldName + "\n1000";
106+
_listHelper.clickImportData()
107+
.setText(bulkData)
108+
.submit();
109+
log("Verify the import succeeds but invalid primary key is left unresolved.");
110+
expectedData = List.of(
111+
Map.of(lookFromLookupFieldKey, "<1000>")
112+
);
113+
validateListValues(expectedData);
114+
115+
log("Check for error if not using alternate key and type does not match");
116+
bulkData = lookFromLookupFieldName + "\nnoneSuch";
117+
ImportDataPage importDataPage = _listHelper.clickImportData();
118+
String error = importDataPage
119+
.setText(bulkData)
120+
.submitExpectingError();
121+
checker().withScreenshot().verifyEquals("Error message for invalid primary key not as expected", "Could not convert value 'noneSuch' (String) for Integer field '" + lookFromLookupFieldName + "'", error);
122+
}
123+
124+
@Test
125+
public void testWithoutValidatorWithAlternateKeys() throws IOException, CommandException
126+
{
127+
setLookupValidatorEnabled(false);
128+
log("Clean out list before next import.");
129+
resetList();
130+
log("Import data into the second list using number-like lookup values expecting alternate keys but also accepting primary keys.");
131+
String bulkData = lookFromLookupFieldName + "\n" +
132+
"1E2\n" + // valid alternate key looking like a number
133+
lookupKeyAsNameNumber + "\n" + // valid alternate key same value as a primary key
134+
".123\n" + // valid alternate key looking like a float
135+
"Lookup\n" + // valid alternate key that is a string
136+
lookupKeyAsNameNumber + "\n" + // another copy
137+
"102\n" + // valid number-like alternate key
138+
lookToListValues.get(1).get(EscapeUtil.fieldKeyEncodePart(lookToKeyFieldName)) + "\n" + // primary key value not matching an alternate key
139+
"1000" // primary key-type value that doesn't match
140+
;
141+
_listHelper.clickImportData()
142+
.setText(bulkData)
143+
.setImportLookupByAlternateKey(true)
144+
.submit();
145+
log("Verify the import succeeds and resolves the lookups appropriately.");
146+
List<Map<String, String>> expectedData = List.of(
147+
Map.of(lookFromLookupFieldKey, "1E2"),
148+
Map.of(lookFromLookupFieldKey, lookupKeyAsNameNumber),
149+
Map.of(lookFromLookupFieldKey, ".123"),
150+
Map.of(lookFromLookupFieldKey, "Lookup"),
151+
Map.of(lookFromLookupFieldKey, lookupKeyAsNameNumber),
152+
Map.of(lookFromLookupFieldKey, "102"),
153+
Map.of(lookFromLookupFieldKey, lookToListValues.get(1).get(EscapeUtil.fieldKeyEncodePart(lookToFieldName))),
154+
Map.of(lookFromLookupFieldKey, "<1000>")
155+
);
156+
validateListValues(expectedData);
157+
158+
log("Check for error if providing non-matching string value that is not a number");
159+
bulkData = lookFromLookupFieldName + "\nNotAValue";
160+
ImportDataPage importDataPage = _listHelper.clickImportData();
161+
String error = importDataPage
162+
.setText(bulkData)
163+
.setImportLookupByAlternateKey(true)
164+
.submitExpectingError();
165+
checker().withScreenshot().verifyEquals("Error message after supplying invalid alternate key not as expected", "Value 'NotAValue' not found for field " + lookFromLookupFieldName + " in the current context.", error);
166+
}
167+
168+
@Test
169+
public void testWithLookupValidatorWithoutAlternateKeys() throws IOException, CommandException
170+
{
171+
setLookupValidatorEnabled(true);
172+
log("Clean out list before next import.");
173+
resetList();
174+
175+
// without alternate keys
176+
log("With lookup validation on, import data into the second list without alternate keys.");
177+
String bulkData = lookFromLookupFieldName + "\n" + lookupKeyAsNameNumber;
178+
_listHelper.clickImportData()
179+
.setText(bulkData)
180+
.submit();
181+
log("Verify the import succeeds and resolves by primary key when not expecting alternate keys.");
182+
List<Map<String, String>> expectedData = List.of(
183+
Map.of(lookFromLookupFieldKey, lookupKeyAsNameFieldValue)
184+
);
185+
validateListValues(expectedData);
186+
187+
log("With lookup validation on, import data and provide an invalid primary key.");
188+
ImportDataPage importDataPage = _listHelper.clickImportData();
189+
String error = importDataPage
190+
.setText(lookFromLookupFieldName + "\n1000")
191+
.submitExpectingError();
192+
checker().withScreenshot().verifyEquals("Error message for invalid primary key value not as expected", "Value '1000' was not present in lookup target 'lists." + lookToListName + "' for field '" + lookFromLookupFieldName + "'", error);
193+
194+
log("With lookup validation on, import data and provide an invalid primary key of type string.");
195+
error = importDataPage
196+
.setText(lookFromLookupFieldName + "\nLook")
197+
.submitExpectingError();
198+
checker().withScreenshot().verifyEquals("Error message for invalid primary key type not as expected", "Could not convert value 'Look' (String) for Integer field '" + lookFromLookupFieldName + "'", error);
199+
}
200+
201+
@Test
202+
public void testWithLookupValidatorAndAlternateKeys() throws IOException, CommandException
203+
{
204+
setLookupValidatorEnabled(true);
205+
log("Clean out list before next import.");
206+
resetList();
207+
208+
log("With lookup validation on, import data into the second list using number-like lookup values expecting alternate keys but also accepting primary keys.");
209+
String bulkData = lookFromLookupFieldName + "\n" +
210+
"1E2\n" + // valid alternate key looking like a number
211+
lookupKeyAsNameNumber + "\n" + // valid alternate key same value as a primary key
212+
".123\n" + // valid alternate key looking like a float
213+
"Lookup\n" + // valid alternate key that is a string
214+
lookupKeyAsNameNumber + "\n" + // another copy
215+
"102\n" + // valid number-like alternate key
216+
lookToListValues.get(1).get(EscapeUtil.fieldKeyEncodePart(lookToKeyFieldName)) + "\n" // primary key value not matching an alternate key
217+
;
218+
_listHelper.clickImportData()
219+
.setText(bulkData)
220+
.setImportLookupByAlternateKey(true)
221+
.submit();
222+
log("Verify the import succeeds and resolves the lookups appropriately.");
223+
List<Map<String, String>> expectedData = List.of(
224+
Map.of(lookFromLookupFieldKey, "1E2"),
225+
Map.of(lookFromLookupFieldKey, lookupKeyAsNameNumber),
226+
Map.of(lookFromLookupFieldKey, ".123"),
227+
Map.of(lookFromLookupFieldKey, "Lookup"),
228+
Map.of(lookFromLookupFieldKey, lookupKeyAsNameNumber),
229+
Map.of(lookFromLookupFieldKey, "102"),
230+
Map.of(lookFromLookupFieldKey, lookToListValues.get(1).get(EscapeUtil.fieldKeyEncodePart(lookToFieldName)))
231+
);
232+
validateListValues(expectedData);
233+
234+
bulkData = lookFromLookupFieldName + "\nInvalid";
235+
ImportDataPage importDataPage = _listHelper.clickImportData();
236+
String error = importDataPage
237+
.setText(bulkData)
238+
.setImportLookupByAlternateKey(true)
239+
.submitExpectingError();
240+
checker().withScreenshot().verifyEquals("Error message for invalid string alternate key not as expected", "Value 'Invalid' not found for field " + lookFromLookupFieldName + " in the current context.", error);
241+
242+
bulkData = lookFromLookupFieldName + "\n1234";
243+
error = importDataPage
244+
.setText(bulkData)
245+
.setImportLookupByAlternateKey(true)
246+
.submitExpectingError();
247+
checker().withScreenshot().verifyEquals("Error message for invalid number-like alternate key not as expected", "Value '1234' was not present in lookup target 'lists." + lookToListName + "' for field '" + lookFromLookupFieldName + "'", error);
248+
249+
}
250+
251+
private void setLookupValidatorEnabled(boolean enabled)
252+
{
253+
log("Setting lookup validator to " + enabled + " on list " + lookFromListName);
254+
EditListDefinitionPage listDefinitionPage = _listHelper.goToEditDesign(lookFromListName);
255+
listDefinitionPage.getFieldsPanel()
256+
.getField(lookFromLookupFieldName)
257+
.expand()
258+
.setLookupValidatorEnabled(enabled);
259+
listDefinitionPage.clickSave();
260+
}
261+
262+
private void resetList() throws IOException, CommandException
263+
{
264+
new QueryApiHelper(createDefaultConnection(), getProjectName(), "lists", lookFromListName).truncateTable();
265+
}
266+
267+
private void validateListValues(List<Map<String, String>> expectedValue)
268+
{
269+
DataRegionTable dataRegionTable = new DataRegionTable("query", getDriver());
270+
List<Map<String, String>> actualValue = dataRegionTable.getTableData();
271+
272+
assertEquals("List data not as expected after action.",
273+
expectedValue, actualValue);
274+
}
275+
276+
@Override
277+
protected @Nullable String getProjectName()
278+
{
279+
return "List Lookup Test";
280+
}
281+
282+
@Override
283+
public List<String> getAssociatedModules()
284+
{
285+
return Arrays.asList("list");
286+
}
287+
288+
}

0 commit comments

Comments
 (0)