Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
83 commits
Select commit Hold shift + click to select a range
194bd9d
Merged PR 1734170: Update pom parent versions
Oct 7, 2025
9010f09
Merged PR 1730839: [CheckMarx] Vulnerability in org.yaml:snakeyaml @ …
Oct 15, 2025
d79a0ba
Merged PR 1746054: add load for global datasheet
Oct 16, 2025
891d937
Merged PR 1748435: remove log4j dependencies
Oct 29, 2025
6e9f595
Merged PR 1789885: Fix [CheckMarx] Vulnerability in net.minidev:json-…
Nov 17, 2025
71ba6c3
Merged PR 1790109: Upgrade jquery to 3.7.1
Nov 17, 2025
4be6a8f
Merged PR 1757569: Fix bug on API JKS
Nov 19, 2025
0d7fcbd
Merged PR 1759585: Add fix for mssql
Nov 20, 2025
9db0a82
Merged PR 1780015: API HTTP request InterruptionException Handling
Nov 20, 2025
0e73ae5
Merged PR 1785880: Restrict recorder to 1 instance and appended times…
Nov 21, 2025
1b4fc92
Merged PR 1798681: Update jetty-server
Dec 1, 2025
e1bf243
Merged PR 1794795: Vuln fix for com.squareup.okhttp3:okhttp & com.squ…
Dec 3, 2025
34ea8c4
Implement homescreen action (#71)
jensdon Dec 12, 2025
eca1edd
Merge pull request #83 from ing-bank/ado/2.4
renzjephte Jan 21, 2026
99e28ef
Bug Fix: Terminate parent loop when data in component is exhausted
juliusborja Jan 15, 2026
89fbe50
Improve New Project popup layout
juliusborja Jan 16, 2026
6907594
Merge pull request #84 from ing-bank/fb44du/task/8501702-new-project-…
juliusborja Jan 23, 2026
5b27f52
Merge pull request #85 from ing-bank/fb44du/bug/8200043-reusable-comp…
juliusborja Jan 23, 2026
5d3c27b
Fix spelling: 'Parameterize' in test step context menu
juliusborja Jan 26, 2026
0c41138
Merge pull request #86 from ing-bank/bug/8556177-parameterize
juliusborja Jan 29, 2026
88a9b18
Bug Fix: Terminate parent loop when data in component is exhausted
juliusborja Jan 15, 2026
7ef272f
Fix setdevtools error
juliusborja Jan 30, 2026
471cfa9
Merge pull request #88 from ing-bank/fb44du/bug/8200043-reusable-comp…
juliusborja Jan 30, 2026
290fc85
Fix locator method first()
juliusborja Feb 11, 2026
c4c3cf4
8650760-downgrade toList (#93)
renzjephte Feb 13, 2026
25521b1
Merge pull request #91 from ing-bank/bug/8675322/first-locator
juliusborja Feb 13, 2026
5f871c8
Create httpClientRedirect API config (#94)
jdclomera Feb 19, 2026
7d664fd
[BugFix] String Operations - Substring missing last character (#92)
ayapjulie001 Feb 19, 2026
2d1759f
Refactor getElements selectors. Add last() method.
juliusborja Jan 15, 2026
24d51e3
Merge pull request #97 from ing-bank/task/8565014-locator-methods-batch1
juliusborja Feb 20, 2026
7f4b4c9
kafka schema registry
Feb 20, 2026
dcead10
imp shared obj
Jan 12, 2026
03f2829
imp shared obj
Jan 18, 2026
5fb639d
imp shared web obj
Jan 19, 2026
aae7682
imp shared web obj
Jan 20, 2026
4952ee5
imp web shared obj
Jan 20, 2026
221e3e4
imp shared webobj
Jan 25, 2026
74b35ae
imp copy page/object to shared
Jan 26, 2026
843b070
imp incremental suffix for page name
Jan 26, 2026
96feb15
imp incremental suffix for same names
Jan 26, 2026
6c26063
imp incremental suffix for page/obj names
Jan 27, 2026
2c3a73b
fixed reference renderer
Jan 27, 2026
ad6c1d0
fixed deleted page/object method
Jan 28, 2026
3be46ce
fixed autosuggest action for shared/project webobj
Jan 28, 2026
520239b
fixed rename page method
Jan 28, 2026
a0dcd56
fixed rename objects
Jan 28, 2026
68e388e
fixed rename notif
Jan 28, 2026
2de6b4d
fixed rename notif
Jan 29, 2026
8ed5aa2
cleanup
Jan 29, 2026
da0d24c
added javadocs
Jan 29, 2026
6c8226c
fixed getimpactedtestcases
Feb 1, 2026
d57c8f4
updated filepath for Shared
Feb 2, 2026
ace8868
imp shared mobile objs
Feb 8, 2026
bd2af52
imp shared mobile objs
Feb 8, 2026
51298be
fixed renderer and autosuggest
Feb 13, 2026
6b9d01d
updated copy to shared for mobile objs
Feb 13, 2026
c57f454
fixed rendered for same project names as category
Feb 13, 2026
55fa5a8
fixed delete option
Feb 15, 2026
c632f6e
fixed delete option
Feb 15, 2026
63c5fd6
fixed rename option
Feb 15, 2026
f985b40
fixed OR pane size
Feb 15, 2026
f105315
added javadocs
Feb 15, 2026
dcfafa6
disabled copytoshared option in sharedmobileOR
Feb 16, 2026
118dc3b
fixed reference renderer
Feb 18, 2026
0193661
updated based on comments
Feb 20, 2026
67497bd
updated based on comments
Feb 20, 2026
2e20440
clean up extra spaces
Feb 23, 2026
62ad170
updated based on comments
Feb 24, 2026
14dfe53
removed extra space in pom.xml
Feb 24, 2026
b7b4b8a
cleanup
Feb 24, 2026
e308de9
Merge pull request #102 from ing-bank/feature/ReusableObjects
mjcnavarro Feb 24, 2026
7e1b7c6
update sslCertificateVerification (#100)
ayapjulie001 Feb 24, 2026
b7b62bc
[BugFix] Cucumber Report No value present (#99)
ayapjulie001 Feb 24, 2026
45faf69
Add new action storeResponseCookiesInVariable (#101)
ayapjulie001 Feb 24, 2026
fe6a726
Merge pull request #105 from ing-bank/au-support/2.4
renzjephte Feb 24, 2026
9108e40
Add store and assert header action (#104)
renzjephte Feb 25, 2026
84b6b6b
Merge pull request #103 from ing-bank/task/8510575-kafka-schema-registry
mjcnavarro Feb 25, 2026
81de268
[Implementation] Upate executeDMLQuery report result (#106)
ayapjulie001 Feb 25, 2026
9f9103f
Rebase release2.4 from main (2.3.1) (#109)
ayapjulie001 Feb 25, 2026
d63ba01
Fixed 'Reached end of datasheet error'
juliusborja Feb 23, 2026
7c50ef2
Set default reusableheader status to PASS in the report
juliusborja Feb 26, 2026
8453d10
Merge pull request #108 from ing-bank/bug/8615024-reached-end-of-data…
juliusborja Feb 26, 2026
527014a
Merge branch 'main' into release/2.4
mjcnavarro Feb 26, 2026
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 Common/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
<parent>
<groupId>com.ing</groupId>
<artifactId>ingenious-playwright</artifactId>
<version>2.3.1</version>
<version>2.4</version>
</parent>
<artifactId>Common</artifactId>
<properties>
Expand Down
2 changes: 1 addition & 1 deletion Datalib/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
<parent>
<groupId>com.ing</groupId>
<artifactId>ingenious-playwright</artifactId>
<version>2.3.1</version>
<version>2.4</version>
</parent>
<artifactId>ingenious-datalib</artifactId>
<packaging>jar</packaging>
Expand Down
87 changes: 83 additions & 4 deletions Datalib/src/main/java/com/ing/datalib/component/Project.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,12 @@
import com.ing.datalib.util.data.FileScanner;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.ing.datalib.or.web.WebOR.ORScope;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.LinkedHashSet;
import java.util.Set;
import java.util.Objects;
import java.util.logging.Level;
import java.util.logging.Logger;
Expand All @@ -23,8 +26,21 @@
import javax.swing.table.TableModel;

/**
* Represents an automation project and acts as the central entry point for loading, managing,
* and persisting project data from disk.
* <p>
* A {@code Project} encapsulates the project’s filesystem location and name, and maintains the
* in-memory model of core assets such as scenarios (TestPlan), releases/test sets (TestLab),
* environment test data, project settings, and the {@link ObjectRepository}. It supports loading
* and reloading from disk, saving all managed components, and producing table models for UI
* components via {@code getTableModelFor(...)}.
* </p>
*
*
* <p>
* The class also provides refactoring utilities that propagate renames across scenarios, releases,
* and test data (e.g., scenario/test case renames, page/object reference updates, and test data
* renames), including scope-aware refactoring for Object Repository references where applicable.
* </p>
*/
public class Project {

Expand Down Expand Up @@ -211,7 +227,9 @@ public Boolean rename(String newName) {
}
}
getObjectRepository().getWebOR().setName(newName);
getObjectRepository().getWebSharedOR().setName(newName);
getObjectRepository().getMobileOR().setName(newName);
getObjectRepository().getMobileSharedOR().setName(newName);
return true;
}
return false;
Expand Down Expand Up @@ -395,7 +413,7 @@ public void refactorTestCaseScenario(String testCaseName, String oldScenarioName
.ifPresent(scn -> scn.setName(newScenarioName));
});
}

public void refactorObjectName(String pageName, String oldName, String newName) {
for (Scenario scenario : scenarios) {
scenario.refactorObjectName(pageName, oldName, newName);
Expand All @@ -408,12 +426,57 @@ public void refactorObjectName(String oldpageName, String oldObjName, String new
}
}

/**
* Renames an object reference on the given page for the specified OR scope across the project,
* by delegating to all scenarios.
*
* @param scope OR scope to match (e.g., shared vs project)
* @param pageName page (screen) name containing the object reference
* @param oldName existing object name to replace
* @param newName new object name to apply
*/
public void refactorObjectName(ORScope scope, String pageName, String oldName, String newName) {
for (Scenario scenario : scenarios) {
scenario.refactorObjectName(scope, pageName, oldName, newName);
}
}

public void refactorPageName(String oldPageName, String newPageName) {
for (Scenario scenario : scenarios) {
scenario.refactorPageName(oldPageName, newPageName);
}
}

/**
* Refactors (renames) a page reference across the project for a given Object Repository scope.
* <p>
* In addition to delegating the rename for the raw page names, this method also renames
* scope-qualified page names using the convention:
* <ul>
* <li>{@code "[Shared] " + pageName} when scope is {@code ORScope.SHARED}</li>
* <li>{@code "[Project] " + pageName} otherwise</li>
* </ul>
* For each {@link Scenario}, it applies both:
* {@code scenario.refactorPageName(oldPageName, newPageName)} and
* {@code scenario.refactorPageName(oldScoped, newScoped)}.
* </p>
*
* @param scope the Object Repository scope used to derive the scoped page name prefix
* @param oldPageName the original page name to be replaced
* @param newPageName the new page name to apply
*
* @implNote This method performs two refactors per scenario: one for the plain page name and one
* for the derived scoped form (e.g., {@code "[Shared] Login"}).
*/
public void refactorPageName(ORScope scope, String oldPageName, String newPageName) {
String oldScoped = scope == ORScope.SHARED ? "[Shared] " + oldPageName : "[Project] " + oldPageName;
String newScoped = scope == ORScope.SHARED ? "[Shared] " + newPageName : "[Project] " + newPageName;
for (Scenario scenario : scenarios) {
scenario.refactorPageName(oldPageName, newPageName);
scenario.refactorPageName(oldScoped, newScoped);
}
}

public void refactorTestData(String oldTDName, String newTDName) {
for (Scenario scenario : scenarios) {
scenario.refactorTestData(oldTDName, newTDName);
Expand All @@ -434,6 +497,23 @@ public List<TestCase> getImpactedObjectTestCases(String pageName, String objectN
return impactedTestCases;
}

public List getImpactedObjectTestCases(ORScope scope, String pageName, String objectName) {
Set impacted = new LinkedHashSet<>();
String scopedPageName = null;
if (scope != null) {
scopedPageName = (scope == ORScope.SHARED)
? "[Shared] " + pageName
: "[Project] " + pageName;
}
for (Scenario scenario : scenarios) {
impacted.addAll(scenario.getImpactedObjectTestCases(pageName, objectName));
if (scopedPageName != null) {
impacted.addAll(scenario.getImpactedObjectTestCases(scopedPageName, objectName));
}
}
return new ArrayList<>(impacted);
}

public List<TestCase> getImpactedTestCaseTestCases(String scenarioName, String testCaseName) {
List<TestCase> impactedTestCases = new ArrayList<>();
for (Scenario scenario : scenarios) {
Expand Down Expand Up @@ -520,5 +600,4 @@ private static DataItem fromTS(TestSet ts) {
}
}
}

}
}
32 changes: 29 additions & 3 deletions Datalib/src/main/java/com/ing/datalib/component/Scenario.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,25 @@
package com.ing.datalib.component;

import com.ing.datalib.component.utils.FileUtils;
import com.ing.datalib.or.web.WebOR.ORScope;
import java.io.File;
import java.util.ArrayList;
import java.util.List;

/**
* Represents a scenario within a project’s TestPlan and serves as a container for related test cases.
* <p>
* A {@code Scenario} is backed by a filesystem folder under {@code <project>/TestPlan/<scenario>},
* automatically loads its {@link TestCase} CSV files on construction, and exposes methods for adding,
* removing, loading, and saving test cases.
* </p>
*
*
* <p>
* The class also implements {@code DataModel} table-model behavior for UI consumption by presenting
* a scenario-level view of non-reusable test cases, and provides refactoring and impact-analysis helpers
* that delegate to contained test cases (e.g., object/page/test data reference updates and impacted test
* case discovery).
* </p>
*/
public class Scenario extends DataModel {

Expand Down Expand Up @@ -279,6 +291,21 @@ public void refactorObjectName(String oldpageName, String oldObjName, String new
}
}

/**
* Renames an object reference on the given page for the specified OR scope within this scenario,
* by delegating to all test cases.
*
* @param scope OR scope to match (e.g., shared vs project)
* @param pageName page (screen) name containing the object reference
* @param oldName existing object name to replace
* @param newName new object name to apply
*/
public void refactorObjectName(ORScope scope, String pageName, String oldName, String newName) {
for (TestCase testCase : testCases) {
testCase.refactorObjectName(scope, pageName, oldName, newName);
}
}

public void refactorPageName(String oldPageName, String newPageName) {
for (TestCase testCase : testCases) {
testCase.refactorPageName(oldPageName, newPageName);
Expand Down Expand Up @@ -350,5 +377,4 @@ public Boolean delete() {
}
return false;
}

}
}
92 changes: 86 additions & 6 deletions Datalib/src/main/java/com/ing/datalib/component/TestCase.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import com.ing.datalib.component.TestStep.HEADERS;
import com.ing.datalib.component.utils.FileUtils;
import com.ing.datalib.component.utils.SaveListener;
import com.ing.datalib.or.web.WebOR.ORScope;
import java.io.File;
import java.io.FileWriter;
import java.util.ArrayList;
Expand All @@ -18,8 +19,21 @@
import org.apache.commons.csv.CSVRecord;

/**
* Represents a test case composed of ordered {@link TestStep} entries and implements a table model
* suitable for direct editing in UI components.
* <p>
* A {@code TestCase} belongs to a {@link Scenario}, loads and persists its steps from/to a CSV file,
* and supports common editing operations such as inserting, removing, moving, replicating steps,
* clearing values, toggling comments/breakpoints, and bulk removal. Save state is tracked and propagated
* via a {@link SaveListener}.
* </p>
*
*
* <p>
* The class also supports creating and managing reusable test cases (represented as “Execute” steps),
* provides utilities for refactoring references (scenario/test case reuse links, object/page names,
* test data and columns—including scope-aware OR references), and can report impact when a given object,
* reusable, or test data reference is used.
* </p>
*/
public class TestCase extends DataModel {

Expand Down Expand Up @@ -557,7 +571,11 @@ public void refactorObjectName(String pageName, String oldName, String newName)
Boolean clearOnExit = getTestSteps().isEmpty();
loadTableModel();
for (TestStep testStep : testSteps) {
if (testStep.getReference().equals(pageName) && testStep.getObject().equals(oldName)) {
String ref = Objects.toString(testStep.getReference(), "");
String obj = Objects.toString(testStep.getObject(), "");
String normalizedRef = normalizePageRef(ref);

if (normalizedRef.equals(pageName) && obj.equals(oldName)) {
testStep.setObject(newName);
}
}
Expand All @@ -566,22 +584,85 @@ public void refactorObjectName(String pageName, String oldName, String newName)
getTestSteps().clear();
}
}

public void refactorObjectName(String oldpageName, String oldObjName, String newPageName, String newObjName) {
Boolean clearOnExit = getTestSteps().isEmpty();
loadTableModel();

for (TestStep testStep : testSteps) {
if (testStep.getReference().equals(oldpageName) && testStep.getObject().equals(oldObjName)) {
String ref = normalizePageRef(Objects.toString(testStep.getReference(), ""));
String obj = Objects.toString(testStep.getObject(), "");
if (ref.equals(oldpageName) && obj.equals(oldObjName)) {
testStep.setObject(newObjName);
testStep.setReference(newPageName);
}
}

if (clearOnExit) {
save();
getTestSteps().clear();
}
}

/**
* Renames an object reference on the given page within this test case, restricted to the specified OR scope.
* A step matches when its reference has the expected scope prefix and its normalized page name equals {@code pageName}.
*
* @param scope OR scope to match (e.g., {@code PROJECT} or {@code SHARED})
* @param pageName page (screen) name (without scope prefix) to match
* @param oldName existing object name to replace
* @param newName new object name to apply
*/
public void refactorObjectName(ORScope scope, String pageName, String oldName, String newName) {
Boolean clearOnExit = getTestSteps().isEmpty();
loadTableModel();
for (TestStep testStep : testSteps) {
String refRaw = Objects.toString(testStep.getReference(), "");
String obj = Objects.toString(testStep.getObject(), "");
boolean scopedMatch = matchesScope(refRaw, scope) && normalizePageRef(refRaw).equals(pageName);
if (scopedMatch && obj.equals(oldName)) {
testStep.setObject(newName);
}
}
if (clearOnExit) {
save();
getTestSteps().clear();
}
}

/**
* Checks whether a reference string is explicitly scoped for the given OR scope.
* Returns {@code true} only when {@code ref} starts with the expected scope prefix
* (e.g., {@code "[Project] "} or {@code "[Shared] "}); otherwise returns {@code false}.
*
* @param ref raw reference value (may be {@code null})
* @param scope scope to match against
* @return {@code true} if {@code ref} begins with the prefix for {@code scope}; {@code false} otherwise
*/
private boolean matchesScope(String ref, ORScope scope) {
if (ref == null) return false;
ref = ref.trim();
if (scope == ORScope.PROJECT) return ref.startsWith("[Project] ");
if (scope == ORScope.SHARED) return ref.startsWith("[Shared] ");
return false;
}

/**
* Normalizes a page reference by removing known scope prefixes.
* Trims the input and strips {@code "[Project] "} or {@code "[Shared] "} when present;
* otherwise returns the trimmed reference. Returns an empty string when {@code ref} is {@code null}.
*
* @param ref raw reference value (may be {@code null})
* @return normalized page name without scope prefix (never {@code null})
*/
private String normalizePageRef(String ref) {
if (ref == null) return "";
ref = ref.trim();
if (ref.startsWith("[Project] ")) return ref.substring("[Project] ".length()).trim();
if (ref.startsWith("[Shared] ")) return ref.substring("[Shared] ".length()).trim();
return ref;
}

public void refactorPageName(String oldPageName, String newPageName) {
Boolean clearOnExit = getTestSteps().isEmpty();
loadTableModel();
Expand Down Expand Up @@ -662,5 +743,4 @@ public Boolean rename(String newName) {
}
return false;
}

}
}
Loading