From a1b0e5b60e6505353eacbc4ab441871a19c64768 Mon Sep 17 00:00:00 2001
From: Nisha Bagdwal <nishabagdwal@gmail.com>
Date: Wed, 29 May 2024 11:34:59 -0400
Subject: [PATCH 01/33] HPCC-31857 Modified code for chrome driver and selenium
 server to make the code run on my local machine. Added a few test cases to
 check if they run. Added logs to store failure logs in a log file.

---
 esp/src/test-ui/tests/Activities.java | 122 +++++++++++++++++++-------
 1 file changed, 92 insertions(+), 30 deletions(-)

diff --git a/esp/src/test-ui/tests/Activities.java b/esp/src/test-ui/tests/Activities.java
index d160ae8f60c..7fda14863b1 100644
--- a/esp/src/test-ui/tests/Activities.java
+++ b/esp/src/test-ui/tests/Activities.java
@@ -1,52 +1,114 @@
-import java.io.IOException;
-
+import org.openqa.selenium.By;
 import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
 import org.openqa.selenium.chrome.ChromeOptions;
-import org.openqa.selenium.chrome.ChromeDriver;
-import org.openqa.selenium.Capabilities;
 import org.openqa.selenium.remote.RemoteWebDriver;
-import org.testng.annotations.Test;
+
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URI;
+import java.util.List;
+import java.util.logging.FileHandler;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import java.util.logging.SimpleFormatter;
 
 public class Activities {
 
+    private static final Logger logger = Logger.getLogger(Activities.class.getName());
+
     public static void main(String[] args) throws IOException, InterruptedException {
-        System.setProperty("webdriver.chrome.silentOutput", "true");
-        System.setProperty("webdriver.chrome.driver", "/usr/bin/chromedriver");
-        // java.util.logging.Logger.getLogger("org.openqa.selenium").setLevel(Level.OFF);
+        // Set up logging to file
+        setupLogger();
+
+        System.setProperty("webdriver.chrome.silentOutput", "true"); // suppresses the logs generated by the ChromeDriver
+        System.setProperty("webdriver.chrome.driver", "C:/Users/nisha/Documents/Internship/Work/jars/chromeDriver"); // sets the system property to the path of the ChromeDriver executable.
+        //System.setProperty("webdriver.chrome.driver", "/usr/bin/chromedriver");
+        java.util.logging.Logger.getLogger("org.openqa.selenium").setLevel(Level.OFF); // turn off all logging from the Selenium WebDriver.
+
+        WebDriver driver = getWebDriver(args);
+
+        Thread.sleep(1000);
+
+        checkTextPresent(driver, "Target/Wuid");
+        checkTextPresent(driver, "Graph");
+        checkTextPresent(driver, "State");
+        checkTextPresent(driver, "Owner");
+        checkTextPresent(driver, "Job Name");
+        checkTextPresent(driver, "Refresh");
+
+        List<WebElement> links = driver.findElements(By.tagName("a"));
+        for (WebElement we : links) {
+            if ("ECL".equals(we.getAccessibleName())) {
+                we.click();
+                testLinkRedirect(driver, "http://192.168.0.221:8010/esp/files/index.html#/workunits");
+            } else if ("Files".equals(we.getAccessibleName())) {
+                we.click();
+                testLinkRedirect(driver, "http://192.168.0.221:8010/esp/files/index.html#/file");
+            } else if ("Published Queries".equals(we.getAccessibleName())) {
+                we.click();
+                testLinkRedirect(driver, "http://192.168.0.221:8010/esp/files/index.html#/querie");
+            }
+        }
+
+        driver.quit();
+    }
 
+    private static WebDriver getWebDriver(String[] args) throws MalformedURLException {
         ChromeOptions chromeOptions = new ChromeOptions();
-        chromeOptions.addArguments("--headless");
-        chromeOptions.addArguments("--no-sandbox");
-        chromeOptions.addArguments("--log-level=3");
+        chromeOptions.addArguments("--headless"); // sets the ChromeDriver to run in headless mode, meaning it runs without opening a visible browser window.
+        chromeOptions.addArguments("--no-sandbox"); // disables the sandbox security feature in Chrome.
+        chromeOptions.addArguments("--log-level=3"); // sets the log level for the ChromeDriver. Level 3 corresponds to errors only.
 
-        WebDriver driver = new ChromeDriver(chromeOptions);
+        RemoteWebDriver driver = new RemoteWebDriver(URI.create("http://localhost:4444/wd/hub").toURL(), chromeOptions);
 
-        Capabilities caps = ((RemoteWebDriver) driver).getCapabilities();
+        //WebDriver driver = new ChromeDriver(chromeOptions);
 
-        String browserName = caps.getBrowserName();
-        String browserVersion = caps.getVersion();
-        // System.out.println(browserName+" "+browserVersion);
+        //Capabilities caps = driver.getCapabilities();
+        //String browserName = caps.getBrowserName();
+        //String browserVersion = caps.getBrowserVersion();
+        //System.out.println(browserName+" "+browserVersion);
 
         driver.get(args[0]);
+        return driver;
+    }
 
-        Thread.sleep(1000);
-
-        if (driver.getPageSource().contains("Job Name")) {
-                System.out.println("Pass");
+    public static void testLinkRedirect(WebDriver driver, String expectedUrl) {
+        if (driver.getCurrentUrl().equals(expectedUrl)) {
+            System.out.println("Link Pass");
         } else {
-                System.err.println("Fail");
+            String errorMsg = "Failure: Current URL does not match expected URL\n" +
+                    "Current URL: " + driver.getCurrentUrl() + "\n" +
+                    "Expected URL: " + expectedUrl;
+            System.err.println(errorMsg);
+            logger.severe(errorMsg);
         }
-        if (driver.getPageSource().contains("Owner")) {
-                System.out.println("Pass");
-        } else {
-                System.err.println("Fail");
-        }
-        if (driver.getPageSource().contains("Target/Wuid")) {
-                System.out.println("Pass");
+    }
+
+    private static void checkTextPresent(WebDriver driver, String text) {
+        if (driver.getPageSource().contains(text)) {
+            System.out.println("Text Pass");
         } else {
-                System.err.println("Fail");
+            String errorMsg = "Failure: Text not present: " + text;
+            System.err.println(errorMsg);
+            logger.severe(errorMsg);
         }
+    }
 
-        driver.quit();
+    private static void setupLogger() {
+        try {
+            FileHandler fileHandler = new FileHandler("errorLog.log");
+            fileHandler.setLevel(Level.SEVERE); // Log only SEVERE level messages
+
+            SimpleFormatter formatter = new SimpleFormatter();
+            fileHandler.setFormatter(formatter);
+
+            logger.addHandler(fileHandler);
+
+            // Disable console logging
+            logger.setUseParentHandlers(false);
+        } catch (IOException e) {
+            System.err.println("Failed to setup logger: " + e.getMessage());
+        }
     }
 }

From 532619345fba84223cb81154fe23e607df0ff14f Mon Sep 17 00:00:00 2001
From: Nisha Bagdwal <nishabagdwal@gmail.com>
Date: Wed, 29 May 2024 13:58:59 -0400
Subject: [PATCH 02/33] HPCC-31857

Added condition to separate code for the local environment and GitHub Action environment
---
 esp/src/test-ui/tests/Activities.java | 46 ++++++++++++++++++---------
 1 file changed, 31 insertions(+), 15 deletions(-)

diff --git a/esp/src/test-ui/tests/Activities.java b/esp/src/test-ui/tests/Activities.java
index 7fda14863b1..f8e6ce8cba6 100644
--- a/esp/src/test-ui/tests/Activities.java
+++ b/esp/src/test-ui/tests/Activities.java
@@ -1,6 +1,8 @@
 import org.openqa.selenium.By;
+import org.openqa.selenium.Capabilities;
 import org.openqa.selenium.WebDriver;
 import org.openqa.selenium.WebElement;
+import org.openqa.selenium.chrome.ChromeDriver;
 import org.openqa.selenium.chrome.ChromeOptions;
 import org.openqa.selenium.remote.RemoteWebDriver;
 
@@ -17,19 +19,12 @@ public class Activities {
 
     private static final Logger logger = Logger.getLogger(Activities.class.getName());
 
-    public static void main(String[] args) throws IOException, InterruptedException {
-        // Set up logging to file
-        setupLogger();
+    public static void main(String[] args) {
 
-        System.setProperty("webdriver.chrome.silentOutput", "true"); // suppresses the logs generated by the ChromeDriver
-        System.setProperty("webdriver.chrome.driver", "C:/Users/nisha/Documents/Internship/Work/jars/chromeDriver"); // sets the system property to the path of the ChromeDriver executable.
-        //System.setProperty("webdriver.chrome.driver", "/usr/bin/chromedriver");
-        java.util.logging.Logger.getLogger("org.openqa.selenium").setLevel(Level.OFF); // turn off all logging from the Selenium WebDriver.
+        setupLogger();
 
         WebDriver driver = getWebDriver(args);
 
-        Thread.sleep(1000);
-
         checkTextPresent(driver, "Target/Wuid");
         checkTextPresent(driver, "Graph");
         checkTextPresent(driver, "State");
@@ -44,32 +39,51 @@ public static void main(String[] args) throws IOException, InterruptedException
                 testLinkRedirect(driver, "http://192.168.0.221:8010/esp/files/index.html#/workunits");
             } else if ("Files".equals(we.getAccessibleName())) {
                 we.click();
-                testLinkRedirect(driver, "http://192.168.0.221:8010/esp/files/index.html#/file");
+                testLinkRedirect(driver, "http://192.168.0.221:8010/esp/files/index.html#/files");
             } else if ("Published Queries".equals(we.getAccessibleName())) {
                 we.click();
-                testLinkRedirect(driver, "http://192.168.0.221:8010/esp/files/index.html#/querie");
+                testLinkRedirect(driver, "http://192.168.0.221:8010/esp/files/index.html#/queries");
             }
         }
 
         driver.quit();
     }
 
-    private static WebDriver getWebDriver(String[] args) throws MalformedURLException {
+    private static WebDriver getWebDriver(String[] args) {
+
         ChromeOptions chromeOptions = new ChromeOptions();
         chromeOptions.addArguments("--headless"); // sets the ChromeDriver to run in headless mode, meaning it runs without opening a visible browser window.
         chromeOptions.addArguments("--no-sandbox"); // disables the sandbox security feature in Chrome.
         chromeOptions.addArguments("--log-level=3"); // sets the log level for the ChromeDriver. Level 3 corresponds to errors only.
 
-        RemoteWebDriver driver = new RemoteWebDriver(URI.create("http://localhost:4444/wd/hub").toURL(), chromeOptions);
+        System.setProperty("webdriver.chrome.silentOutput", "true"); // suppresses the logs generated by the ChromeDriver
 
-        //WebDriver driver = new ChromeDriver(chromeOptions);
+        WebDriver driver;
 
-        //Capabilities caps = driver.getCapabilities();
+        if (System.getProperty("os.name").startsWith("Windows") && System.getenv("USERPROFILE").startsWith("C:\\Users\\nisha")) {
+            System.setProperty("webdriver.chrome.driver", "C:/Users/nisha/Documents/Internship/Work/jars/chromeDriver"); // sets the system property to the path of the ChromeDriver executable.
+            try {
+                driver = new RemoteWebDriver(URI.create("http://localhost:4444/wd/hub").toURL(), chromeOptions);
+            } catch (MalformedURLException e) {
+                throw new RuntimeException(e);
+            }
+        }else{
+            System.setProperty("webdriver.chrome.driver", "/usr/bin/chromedriver");
+            driver = new ChromeDriver(chromeOptions);
+        }
+
+        //Capabilities caps = ((RemoteWebDriver) driver).getCapabilities();
         //String browserName = caps.getBrowserName();
         //String browserVersion = caps.getBrowserVersion();
         //System.out.println(browserName+" "+browserVersion);
 
         driver.get(args[0]);
+        try {
+            Thread.sleep(2000);
+        } catch (InterruptedException e) {
+            throw new RuntimeException(e);
+        }
+
         return driver;
     }
 
@@ -110,5 +124,7 @@ private static void setupLogger() {
         } catch (IOException e) {
             System.err.println("Failed to setup logger: " + e.getMessage());
         }
+
+        Logger.getLogger("org.openqa.selenium").setLevel(Level.OFF); // turn off all logging from the Selenium WebDriver.
     }
 }

From 4b00f41a020d57ed15eae3b6c3c6ffe57c4ef859 Mon Sep 17 00:00:00 2001
From: Nisha Bagdwal <nishabagdwal@gmail.com>
Date: Wed, 29 May 2024 14:16:26 -0400
Subject: [PATCH 03/33] HPCC-31857

Created a constants file and replaced all the constants used in the Activities class with their respective constant variables.
---
 esp/src/test-ui/tests/Activities.java    | 12 ++++++------
 esp/src/test-ui/tests/config/Config.java | 11 +++++++++++
 2 files changed, 17 insertions(+), 6 deletions(-)
 create mode 100644 esp/src/test-ui/tests/config/Config.java

diff --git a/esp/src/test-ui/tests/Activities.java b/esp/src/test-ui/tests/Activities.java
index f8e6ce8cba6..d455378aa74 100644
--- a/esp/src/test-ui/tests/Activities.java
+++ b/esp/src/test-ui/tests/Activities.java
@@ -1,5 +1,5 @@
+import config.Config;
 import org.openqa.selenium.By;
-import org.openqa.selenium.Capabilities;
 import org.openqa.selenium.WebDriver;
 import org.openqa.selenium.WebElement;
 import org.openqa.selenium.chrome.ChromeDriver;
@@ -60,15 +60,15 @@ private static WebDriver getWebDriver(String[] args) {
 
         WebDriver driver;
 
-        if (System.getProperty("os.name").startsWith("Windows") && System.getenv("USERPROFILE").startsWith("C:\\Users\\nisha")) {
-            System.setProperty("webdriver.chrome.driver", "C:/Users/nisha/Documents/Internship/Work/jars/chromeDriver"); // sets the system property to the path of the ChromeDriver executable.
+        if (System.getProperty("os.name").startsWith(Config.LOCAL_OS) && System.getenv("USERPROFILE").startsWith(Config.USER_PROFILE)) {
+            System.setProperty("webdriver.chrome.driver", Config.PATH_LOCAL_CHROME_DRIVER); // sets the system property to the path of the ChromeDriver executable.
             try {
-                driver = new RemoteWebDriver(URI.create("http://localhost:4444/wd/hub").toURL(), chromeOptions);
+                driver = new RemoteWebDriver(URI.create(Config.LOCAL_SELENIUM_SERVER).toURL(), chromeOptions);
             } catch (MalformedURLException e) {
                 throw new RuntimeException(e);
             }
         }else{
-            System.setProperty("webdriver.chrome.driver", "/usr/bin/chromedriver");
+            System.setProperty("webdriver.chrome.driver", Config.PATH_GH_ACTION_CHROME_DRIVER);
             driver = new ChromeDriver(chromeOptions);
         }
 
@@ -111,7 +111,7 @@ private static void checkTextPresent(WebDriver driver, String text) {
 
     private static void setupLogger() {
         try {
-            FileHandler fileHandler = new FileHandler("errorLog.log");
+            FileHandler fileHandler = new FileHandler(Config.LOG_FILE);
             fileHandler.setLevel(Level.SEVERE); // Log only SEVERE level messages
 
             SimpleFormatter formatter = new SimpleFormatter();
diff --git a/esp/src/test-ui/tests/config/Config.java b/esp/src/test-ui/tests/config/Config.java
new file mode 100644
index 00000000000..982803f3fa6
--- /dev/null
+++ b/esp/src/test-ui/tests/config/Config.java
@@ -0,0 +1,11 @@
+package config;
+
+public class Config {
+
+    public static final String LOG_FILE = "errorLog.log";
+    public static final String LOCAL_OS = "Windows";
+    public static final String USER_PROFILE = "C:\\Users\\nisha";
+    public static final String PATH_LOCAL_CHROME_DRIVER = "C:/Users/nisha/Documents/Internship/Work/jars/chromeDriver";
+    public static final String PATH_GH_ACTION_CHROME_DRIVER = "/usr/bin/chromedriver";
+    public static final String LOCAL_SELENIUM_SERVER = "http://localhost:4444/wd/hub";
+}

From ae0bc4c6ed8176c922d65ea1590ffc2fb176b2be Mon Sep 17 00:00:00 2001
From: Nisha Bagdwal <nishabagdwal@gmail.com>
Date: Wed, 29 May 2024 15:16:27 -0400
Subject: [PATCH 04/33] HPCC-31857

Formatted code, distributed the code into methods, and made code configurable for the ECL Watch running on local and on Github Action.
---
 esp/src/test-ui/tests/Activities.java    | 95 +++++++++++++++---------
 esp/src/test-ui/tests/config/Config.java |  4 +-
 2 files changed, 64 insertions(+), 35 deletions(-)

diff --git a/esp/src/test-ui/tests/Activities.java b/esp/src/test-ui/tests/Activities.java
index d455378aa74..359a9be5500 100644
--- a/esp/src/test-ui/tests/Activities.java
+++ b/esp/src/test-ui/tests/Activities.java
@@ -25,28 +25,77 @@ public static void main(String[] args) {
 
         WebDriver driver = getWebDriver(args);
 
-        checkTextPresent(driver, "Target/Wuid");
-        checkTextPresent(driver, "Graph");
-        checkTextPresent(driver, "State");
-        checkTextPresent(driver, "Owner");
-        checkTextPresent(driver, "Job Name");
-        checkTextPresent(driver, "Refresh");
+        testingTheActivitiesPage(driver);
+
+        driver.quit();
+    }
 
+    private static void testingTheActivitiesPage(WebDriver driver) {
+
+        testForAllText(driver);
+        testForAllLinks(driver);
+    }
+
+    private static void testForAllLinks(WebDriver driver) {
         List<WebElement> links = driver.findElements(By.tagName("a"));
         for (WebElement we : links) {
-            if ("ECL".equals(we.getAccessibleName())) {
+            if("Activities".equals(we.getAccessibleName())){
                 we.click();
-                testLinkRedirect(driver, "http://192.168.0.221:8010/esp/files/index.html#/workunits");
+                testLinkRedirect(driver, getSystemIP() + "esp/files/index.html#/activities");
+            } else if ("ECL".equals(we.getAccessibleName())) {
+                we.click();
+                testLinkRedirect(driver, getSystemIP() + "esp/files/index.html#/workunits");
             } else if ("Files".equals(we.getAccessibleName())) {
                 we.click();
-                testLinkRedirect(driver, "http://192.168.0.221:8010/esp/files/index.html#/files");
+                testLinkRedirect(driver, getSystemIP() + "esp/files/index.html#/files");
             } else if ("Published Queries".equals(we.getAccessibleName())) {
                 we.click();
-                testLinkRedirect(driver, "http://192.168.0.221:8010/esp/files/index.html#/queries");
+                testLinkRedirect(driver, getSystemIP() + "esp/files/index.html#/queries");
+            }else if ("Operations".equals(we.getAccessibleName())) {
+                we.click();
+                testLinkRedirect(driver, getSystemIP() + "esp/files/index.html#/operations");
             }
         }
+    }
 
-        driver.quit();
+    private static String getSystemIP() {
+
+        return isRunningOnLocal() ? Config.LOCAL_ECL_WATCH_IP : Config.GH_ECL_WATCH_IP;
+    }
+
+    private static boolean isRunningOnLocal() {
+        return System.getProperty("os.name").startsWith(Config.LOCAL_OS) && System.getenv("USERPROFILE").startsWith(Config.LOCAL_USER_PROFILE);
+    }
+
+    private static void testForAllText(WebDriver driver) {
+        checkTextPresent(driver, "Target/Wuid");
+        checkTextPresent(driver, "Graph");
+        checkTextPresent(driver, "State");
+        checkTextPresent(driver, "Owner");
+        checkTextPresent(driver, "Job Name");
+        checkTextPresent(driver, "Refresh");
+    }
+
+    public static void testLinkRedirect(WebDriver driver, String expectedUrl) {
+        if (driver.getCurrentUrl().equals(expectedUrl)) {
+            System.out.println("Link Pass");
+        } else {
+            String errorMsg = "Failure: Current URL does not match expected URL\n" +
+                    "Current URL: " + driver.getCurrentUrl() + "\n" +
+                    "Expected URL: " + expectedUrl;
+            System.err.println(errorMsg);
+            logger.severe(errorMsg);
+        }
+    }
+
+    private static void checkTextPresent(WebDriver driver, String text) {
+        if (driver.getPageSource().contains(text)) {
+            System.out.println("Text Pass");
+        } else {
+            String errorMsg = "Failure: Text not present: " + text;
+            System.err.println(errorMsg);
+            logger.severe(errorMsg);
+        }
     }
 
     private static WebDriver getWebDriver(String[] args) {
@@ -60,7 +109,7 @@ private static WebDriver getWebDriver(String[] args) {
 
         WebDriver driver;
 
-        if (System.getProperty("os.name").startsWith(Config.LOCAL_OS) && System.getenv("USERPROFILE").startsWith(Config.USER_PROFILE)) {
+        if (isRunningOnLocal()) {
             System.setProperty("webdriver.chrome.driver", Config.PATH_LOCAL_CHROME_DRIVER); // sets the system property to the path of the ChromeDriver executable.
             try {
                 driver = new RemoteWebDriver(URI.create(Config.LOCAL_SELENIUM_SERVER).toURL(), chromeOptions);
@@ -87,28 +136,6 @@ private static WebDriver getWebDriver(String[] args) {
         return driver;
     }
 
-    public static void testLinkRedirect(WebDriver driver, String expectedUrl) {
-        if (driver.getCurrentUrl().equals(expectedUrl)) {
-            System.out.println("Link Pass");
-        } else {
-            String errorMsg = "Failure: Current URL does not match expected URL\n" +
-                    "Current URL: " + driver.getCurrentUrl() + "\n" +
-                    "Expected URL: " + expectedUrl;
-            System.err.println(errorMsg);
-            logger.severe(errorMsg);
-        }
-    }
-
-    private static void checkTextPresent(WebDriver driver, String text) {
-        if (driver.getPageSource().contains(text)) {
-            System.out.println("Text Pass");
-        } else {
-            String errorMsg = "Failure: Text not present: " + text;
-            System.err.println(errorMsg);
-            logger.severe(errorMsg);
-        }
-    }
-
     private static void setupLogger() {
         try {
             FileHandler fileHandler = new FileHandler(Config.LOG_FILE);
diff --git a/esp/src/test-ui/tests/config/Config.java b/esp/src/test-ui/tests/config/Config.java
index 982803f3fa6..df606e0f15a 100644
--- a/esp/src/test-ui/tests/config/Config.java
+++ b/esp/src/test-ui/tests/config/Config.java
@@ -4,8 +4,10 @@ public class Config {
 
     public static final String LOG_FILE = "errorLog.log";
     public static final String LOCAL_OS = "Windows";
-    public static final String USER_PROFILE = "C:\\Users\\nisha";
+    public static final String LOCAL_USER_PROFILE = "C:\\Users\\nisha";
     public static final String PATH_LOCAL_CHROME_DRIVER = "C:/Users/nisha/Documents/Internship/Work/jars/chromeDriver";
     public static final String PATH_GH_ACTION_CHROME_DRIVER = "/usr/bin/chromedriver";
     public static final String LOCAL_SELENIUM_SERVER = "http://localhost:4444/wd/hub";
+    public static final String LOCAL_ECL_WATCH_IP = "http://192.168.0.221:8010/";
+    public static final String GH_ECL_WATCH_IP = "";
 }

From 21095c9f7b7dfc8d76967ae3cf3149ef7e6042bb Mon Sep 17 00:00:00 2001
From: Nisha Bagdwal <nishabagdwal@gmail.com>
Date: Thu, 30 May 2024 16:37:25 -0400
Subject: [PATCH 05/33] HPCC-31857

Changed code for testing the navigation elements. Removed hard-coded urls. Created a common class for common methods. Created a new class ECLWatchUI as the starting point.
---
 esp/src/test-ui/tests/ECLWatchUI.java         | 108 ++++++++++++++++++
 esp/src/test-ui/tests/config/Config.java      |   4 +-
 .../tests/model/NavigationWebElement.java     |  14 +++
 esp/src/test-ui/tests/pages/Activities.java   |  69 +++++++++++
 esp/src/test-ui/tests/pages/ECLWorkUnits.java |  36 ++++++
 esp/src/test-ui/tests/utility/Common.java     |  36 ++++++
 6 files changed, 265 insertions(+), 2 deletions(-)
 create mode 100644 esp/src/test-ui/tests/ECLWatchUI.java
 create mode 100644 esp/src/test-ui/tests/model/NavigationWebElement.java
 create mode 100644 esp/src/test-ui/tests/pages/Activities.java
 create mode 100644 esp/src/test-ui/tests/pages/ECLWorkUnits.java
 create mode 100644 esp/src/test-ui/tests/utility/Common.java

diff --git a/esp/src/test-ui/tests/ECLWatchUI.java b/esp/src/test-ui/tests/ECLWatchUI.java
new file mode 100644
index 00000000000..c8bb665a57d
--- /dev/null
+++ b/esp/src/test-ui/tests/ECLWatchUI.java
@@ -0,0 +1,108 @@
+import config.Config;
+import model.NavigationWebElement;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.chrome.ChromeDriver;
+import org.openqa.selenium.chrome.ChromeOptions;
+import org.openqa.selenium.remote.RemoteWebDriver;
+import pages.Activities;
+import pages.ECLWorkUnits;
+
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URI;
+import java.util.List;
+import java.util.logging.FileHandler;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import java.util.logging.SimpleFormatter;
+
+public class ECLWatchUI {
+
+    private static final Logger logger = Logger.getLogger(ECLWatchUI.class.getName());
+
+    public static void main(String[] args) {
+
+        setupLogger();
+
+        WebDriver driver = getWebDriver(args);
+
+        startTesting(driver);
+
+        driver.quit();
+    }
+
+    private static void startTesting(WebDriver driver) {
+
+        Activities activities = new Activities(driver, logger);
+        List<NavigationWebElement> navWebElements = activities.testingTheActivitiesPage();
+
+        for (NavigationWebElement element : navWebElements) {
+
+            if(element.name().equals("ECL")){
+                driver.get(element.hrefValue());
+                ECLWorkUnits eclWorkUnits = new ECLWorkUnits(driver, logger);
+                eclWorkUnits.testingECLWorkUnitsPage();
+            }
+        }
+    }
+
+    private static boolean isRunningOnLocal() {
+        return System.getProperty("os.name").startsWith(Config.LOCAL_OS) && System.getenv("USERPROFILE").startsWith(Config.LOCAL_USER_PROFILE);
+    }
+
+    private static WebDriver getWebDriver(String[] args) {
+
+        ChromeOptions chromeOptions = new ChromeOptions();
+        chromeOptions.addArguments("--headless"); // sets the ChromeDriver to run in headless mode, meaning it runs without opening a visible browser window.
+        chromeOptions.addArguments("--no-sandbox"); // disables the sandbox security feature in Chrome.
+        chromeOptions.addArguments("--log-level=3"); // sets the log level for the ChromeDriver. Level 3 corresponds to errors only.
+
+        System.setProperty("webdriver.chrome.silentOutput", "true"); // suppresses the logs generated by the ChromeDriver
+
+        WebDriver driver;
+
+        if (isRunningOnLocal()) {
+            System.setProperty("webdriver.chrome.driver", Config.PATH_LOCAL_CHROME_DRIVER); // sets the system property to the path of the ChromeDriver executable.
+            try {
+                driver = new RemoteWebDriver(URI.create(Config.LOCAL_SELENIUM_SERVER).toURL(), chromeOptions);
+            } catch (MalformedURLException e) {
+                throw new RuntimeException(e);
+            }
+        }else{
+            System.setProperty("webdriver.chrome.driver", Config.PATH_GH_ACTION_CHROME_DRIVER);
+            driver = new ChromeDriver(chromeOptions);
+        }
+
+        //Capabilities caps = ((RemoteWebDriver) driver).getCapabilities();
+        //String browserName = caps.getBrowserName();
+        //String browserVersion = caps.getBrowserVersion();
+        //System.out.println(browserName+" "+browserVersion);
+
+        driver.get(args[0]);
+        try {
+            Thread.sleep(2000);
+        } catch (InterruptedException e) {
+            throw new RuntimeException(e);
+        }
+
+        return driver;
+    }
+
+    private static void setupLogger() {
+        try {
+            FileHandler fileHandler = new FileHandler(Config.LOG_FILE);
+
+            SimpleFormatter formatter = new SimpleFormatter();
+            fileHandler.setFormatter(formatter);
+
+            logger.addHandler(fileHandler);
+
+            // Disable console logging
+            logger.setUseParentHandlers(false);
+        } catch (IOException e) {
+            System.err.println("Failed to setup logger: " + e.getMessage());
+        }
+
+        Logger.getLogger("org.openqa.selenium").setLevel(Level.OFF); // turn off all logging from the Selenium WebDriver.
+    }
+}
diff --git a/esp/src/test-ui/tests/config/Config.java b/esp/src/test-ui/tests/config/Config.java
index df606e0f15a..0961b42c9ea 100644
--- a/esp/src/test-ui/tests/config/Config.java
+++ b/esp/src/test-ui/tests/config/Config.java
@@ -8,6 +8,6 @@ public class Config {
     public static final String PATH_LOCAL_CHROME_DRIVER = "C:/Users/nisha/Documents/Internship/Work/jars/chromeDriver";
     public static final String PATH_GH_ACTION_CHROME_DRIVER = "/usr/bin/chromedriver";
     public static final String LOCAL_SELENIUM_SERVER = "http://localhost:4444/wd/hub";
-    public static final String LOCAL_ECL_WATCH_IP = "http://192.168.0.221:8010/";
-    public static final String GH_ECL_WATCH_IP = "";
+//    public static final String LOCAL_ECL_WATCH_IP = "http://192.168.0.221:8010/";
+//    public static final String GH_ECL_WATCH_IP = "http://127.0.0.1:8010/";
 }
diff --git a/esp/src/test-ui/tests/model/NavigationWebElement.java b/esp/src/test-ui/tests/model/NavigationWebElement.java
new file mode 100644
index 00000000000..e82d982230d
--- /dev/null
+++ b/esp/src/test-ui/tests/model/NavigationWebElement.java
@@ -0,0 +1,14 @@
+package model;
+
+import org.openqa.selenium.WebElement;
+
+public record NavigationWebElement(String name, String hrefValue, WebElement webElement) {
+
+    @Override
+    public String toString() {
+        return "NavigationWebElement{" +
+                "name='" + name + '\'' +
+                ", hrefValue='" + hrefValue + '\'' +
+                '}';
+    }
+}
diff --git a/esp/src/test-ui/tests/pages/Activities.java b/esp/src/test-ui/tests/pages/Activities.java
new file mode 100644
index 00000000000..e951a6fd9c3
--- /dev/null
+++ b/esp/src/test-ui/tests/pages/Activities.java
@@ -0,0 +1,69 @@
+package pages;
+
+import model.NavigationWebElement;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+import utility.Common;
+
+import java.util.*;
+import java.util.logging.Logger;
+
+public class Activities {
+
+    WebDriver driver;
+    Logger logger;
+
+    public Activities(WebDriver driver, Logger logger) {
+        this.driver = driver;
+        this.logger = logger;
+    }
+
+    public List<NavigationWebElement> testingTheActivitiesPage() {
+
+        testForAllText();
+
+        List<NavigationWebElement> navWebElements = getNavWebElements();
+
+        testForNavigationLinks(navWebElements);
+
+        return navWebElements;
+    }
+
+    private void testForNavigationLinks(List<NavigationWebElement> navWebElements) {
+
+        for (NavigationWebElement element : navWebElements) {
+            element.webElement().click();
+            Common.testLinkRedirect(driver, element.hrefValue(), "Activities", logger);
+        }
+    }
+
+    private List<NavigationWebElement> getNavWebElements(){
+
+        List<NavigationWebElement> navWebElements = new ArrayList<>();
+        String[] navNamesArray = {"Activities", "ECL", "Files", "Published Queries", "Operations"};
+        Set<String> navNames = new HashSet<>(Arrays.asList(navNamesArray));
+
+        WebElement navDiv = driver.findElement(By.xpath("//ul[@class='ms-Nav-navItems navItems-169']"));
+        List<WebElement> navDivElements = navDiv.findElements(By.xpath("//li[@class='ms-Nav-navItem navItem-168']"));
+
+        for (WebElement webElement : navDivElements) {
+            WebElement webLinkElement = webElement.findElement(By.tagName("a"));
+            String hrefValue = webLinkElement.getAttribute("href");
+            String accessibleName = webLinkElement.getAccessibleName();
+            if (navNames.contains(accessibleName)) {
+                navWebElements.add(new NavigationWebElement(accessibleName, hrefValue, webLinkElement));
+            }
+        }
+
+        return navWebElements;
+    }
+
+    private void testForAllText() {
+        Common.checkTextPresent(driver, "Target/Wuid", "Activities", logger);
+        Common.checkTextPresent(driver, "Graph", "Activities", logger);
+        Common.checkTextPresent(driver, "State", "Activities", logger);
+        Common.checkTextPresent(driver, "Owner", "Activities", logger);
+        Common.checkTextPresent(driver, "Job Name", "Activities", logger);
+    }
+}
diff --git a/esp/src/test-ui/tests/pages/ECLWorkUnits.java b/esp/src/test-ui/tests/pages/ECLWorkUnits.java
new file mode 100644
index 00000000000..f22a3a89edb
--- /dev/null
+++ b/esp/src/test-ui/tests/pages/ECLWorkUnits.java
@@ -0,0 +1,36 @@
+package pages;
+
+import org.openqa.selenium.WebDriver;
+import utility.Common;
+
+import java.util.logging.Logger;
+
+public class ECLWorkUnits {
+
+    WebDriver driver;
+    Logger logger;
+
+    public ECLWorkUnits(WebDriver driver, Logger logger) {
+        this.driver = driver;
+        this.logger = logger;
+    }
+
+    public void testingECLWorkUnitsPage(){
+
+        testForAllText();
+
+    }
+
+    private void testForAllText() {
+        Common.checkTextPresent(driver, "WUID   ", "ECL WorkUnits", logger);
+        Common.checkTextPresent(driver, "Owner", "ECL WorkUnits", logger);
+        Common.checkTextPresent(driver, "Job Name", "ECL WorkUnits", logger);
+        Common.checkTextPresent(driver, "Cluster", "ECL WorkUnits", logger);
+        Common.checkTextPresent(driver, "Roxie Cluster", "ECL WorkUnits", logger);
+        Common.checkTextPresent(driver, "State", "ECL WorkUnits", logger);
+        Common.checkTextPresent(driver, "Total Cluster Time", "ECL WorkUnits", logger);
+        Common.checkTextPresent(driver, "Compile Cost", "ECL WorkUnits", logger);
+        Common.checkTextPresent(driver, "Execution Cost", "ECL WorkUnits", logger);
+        Common.checkTextPresent(driver, "File Access Cost", "ECL WorkUnits", logger);
+    }
+}
diff --git a/esp/src/test-ui/tests/utility/Common.java b/esp/src/test-ui/tests/utility/Common.java
new file mode 100644
index 00000000000..62a0226be0f
--- /dev/null
+++ b/esp/src/test-ui/tests/utility/Common.java
@@ -0,0 +1,36 @@
+package utility;
+
+import org.openqa.selenium.WebDriver;
+
+import java.util.logging.Logger;
+
+public class Common {
+
+    public static void testLinkRedirect(WebDriver driver, String expectedUrl, String page, Logger logger) {
+        if (driver.getCurrentUrl().equals(expectedUrl)) {
+            System.out.println("Success: Link Pass " + page +" "+ expectedUrl);
+            String msg = "Success: "+page+" : Current URL does match expected URL\n" +
+                    "Current URL: " + driver.getCurrentUrl() + "\n" +
+                    "Expected URL: " + expectedUrl;
+            logger.info(msg);
+        } else {
+            String errorMsg = "Failure: "+page+" : Current URL does not match expected URL\n" +
+                    "Current URL: " + driver.getCurrentUrl() + "\n" +
+                    "Expected URL: " + expectedUrl;
+            System.err.println(errorMsg);
+            logger.severe(errorMsg);
+        }
+    }
+
+    public static void checkTextPresent(WebDriver driver, String text, String page, Logger logger) {
+        if (driver.getPageSource().contains(text)) {
+            System.out.println("Success: Text Pass "+ page + " "+ text);
+            String msg = "Success: "+page+": Text present: " + text;
+            logger.info(msg);
+        } else {
+            String errorMsg = "Failure: "+page+": Text not present: " + text;
+            System.err.println(errorMsg);
+            logger.severe(errorMsg);
+        }
+    }
+}

From 56326f45bfaf093487dd799b4d2b47758a47a660 Mon Sep 17 00:00:00 2001
From: Nisha Bagdwal <nishabagdwal@gmail.com>
Date: Thu, 30 May 2024 16:46:25 -0400
Subject: [PATCH 06/33] HPCC-31857

Changed code for testing the navigation elements. Removed hard-coded urls. Created a common class for common methods. Created a new class ECLWatchUI as the starting point.
---
 esp/src/test-ui/tests/Activities.java         | 164 ++++--------------
 esp/src/test-ui/tests/ECLWatchUI.java         |   2 -
 .../tests/{pages => }/ECLWorkUnits.java       |   2 -
 esp/src/test-ui/tests/pages/Activities.java   |  69 --------
 4 files changed, 37 insertions(+), 200 deletions(-)
 rename esp/src/test-ui/tests/{pages => }/ECLWorkUnits.java (98%)
 delete mode 100644 esp/src/test-ui/tests/pages/Activities.java

diff --git a/esp/src/test-ui/tests/Activities.java b/esp/src/test-ui/tests/Activities.java
index 359a9be5500..73b23fd5703 100644
--- a/esp/src/test-ui/tests/Activities.java
+++ b/esp/src/test-ui/tests/Activities.java
@@ -1,157 +1,67 @@
-import config.Config;
+import model.NavigationWebElement;
 import org.openqa.selenium.By;
 import org.openqa.selenium.WebDriver;
 import org.openqa.selenium.WebElement;
-import org.openqa.selenium.chrome.ChromeDriver;
-import org.openqa.selenium.chrome.ChromeOptions;
-import org.openqa.selenium.remote.RemoteWebDriver;
-
-import java.io.IOException;
-import java.net.MalformedURLException;
-import java.net.URI;
-import java.util.List;
-import java.util.logging.FileHandler;
-import java.util.logging.Level;
+import utility.Common;
+
+import java.util.*;
 import java.util.logging.Logger;
-import java.util.logging.SimpleFormatter;
 
 public class Activities {
 
-    private static final Logger logger = Logger.getLogger(Activities.class.getName());
-
-    public static void main(String[] args) {
-
-        setupLogger();
-
-        WebDriver driver = getWebDriver(args);
-
-        testingTheActivitiesPage(driver);
-
-        driver.quit();
-    }
-
-    private static void testingTheActivitiesPage(WebDriver driver) {
+    WebDriver driver;
+    Logger logger;
 
-        testForAllText(driver);
-        testForAllLinks(driver);
+    public Activities(WebDriver driver, Logger logger) {
+        this.driver = driver;
+        this.logger = logger;
     }
 
-    private static void testForAllLinks(WebDriver driver) {
-        List<WebElement> links = driver.findElements(By.tagName("a"));
-        for (WebElement we : links) {
-            if("Activities".equals(we.getAccessibleName())){
-                we.click();
-                testLinkRedirect(driver, getSystemIP() + "esp/files/index.html#/activities");
-            } else if ("ECL".equals(we.getAccessibleName())) {
-                we.click();
-                testLinkRedirect(driver, getSystemIP() + "esp/files/index.html#/workunits");
-            } else if ("Files".equals(we.getAccessibleName())) {
-                we.click();
-                testLinkRedirect(driver, getSystemIP() + "esp/files/index.html#/files");
-            } else if ("Published Queries".equals(we.getAccessibleName())) {
-                we.click();
-                testLinkRedirect(driver, getSystemIP() + "esp/files/index.html#/queries");
-            }else if ("Operations".equals(we.getAccessibleName())) {
-                we.click();
-                testLinkRedirect(driver, getSystemIP() + "esp/files/index.html#/operations");
-            }
-        }
-    }
+    public List<NavigationWebElement> testingTheActivitiesPage() {
 
-    private static String getSystemIP() {
+        testForAllText();
 
-        return isRunningOnLocal() ? Config.LOCAL_ECL_WATCH_IP : Config.GH_ECL_WATCH_IP;
-    }
+        List<NavigationWebElement> navWebElements = getNavWebElements();
 
-    private static boolean isRunningOnLocal() {
-        return System.getProperty("os.name").startsWith(Config.LOCAL_OS) && System.getenv("USERPROFILE").startsWith(Config.LOCAL_USER_PROFILE);
-    }
+        testForNavigationLinks(navWebElements);
 
-    private static void testForAllText(WebDriver driver) {
-        checkTextPresent(driver, "Target/Wuid");
-        checkTextPresent(driver, "Graph");
-        checkTextPresent(driver, "State");
-        checkTextPresent(driver, "Owner");
-        checkTextPresent(driver, "Job Name");
-        checkTextPresent(driver, "Refresh");
+        return navWebElements;
     }
 
-    public static void testLinkRedirect(WebDriver driver, String expectedUrl) {
-        if (driver.getCurrentUrl().equals(expectedUrl)) {
-            System.out.println("Link Pass");
-        } else {
-            String errorMsg = "Failure: Current URL does not match expected URL\n" +
-                    "Current URL: " + driver.getCurrentUrl() + "\n" +
-                    "Expected URL: " + expectedUrl;
-            System.err.println(errorMsg);
-            logger.severe(errorMsg);
-        }
-    }
+    private void testForNavigationLinks(List<NavigationWebElement> navWebElements) {
 
-    private static void checkTextPresent(WebDriver driver, String text) {
-        if (driver.getPageSource().contains(text)) {
-            System.out.println("Text Pass");
-        } else {
-            String errorMsg = "Failure: Text not present: " + text;
-            System.err.println(errorMsg);
-            logger.severe(errorMsg);
+        for (NavigationWebElement element : navWebElements) {
+            element.webElement().click();
+            Common.testLinkRedirect(driver, element.hrefValue(), "Activities", logger);
         }
     }
 
-    private static WebDriver getWebDriver(String[] args) {
+    private List<NavigationWebElement> getNavWebElements(){
 
-        ChromeOptions chromeOptions = new ChromeOptions();
-        chromeOptions.addArguments("--headless"); // sets the ChromeDriver to run in headless mode, meaning it runs without opening a visible browser window.
-        chromeOptions.addArguments("--no-sandbox"); // disables the sandbox security feature in Chrome.
-        chromeOptions.addArguments("--log-level=3"); // sets the log level for the ChromeDriver. Level 3 corresponds to errors only.
+        List<NavigationWebElement> navWebElements = new ArrayList<>();
+        String[] navNamesArray = {"Activities", "ECL", "Files", "Published Queries", "Operations"};
+        Set<String> navNames = new HashSet<>(Arrays.asList(navNamesArray));
 
-        System.setProperty("webdriver.chrome.silentOutput", "true"); // suppresses the logs generated by the ChromeDriver
+        WebElement navDiv = driver.findElement(By.xpath("//ul[@class='ms-Nav-navItems navItems-169']"));
+        List<WebElement> navDivElements = navDiv.findElements(By.xpath("//li[@class='ms-Nav-navItem navItem-168']"));
 
-        WebDriver driver;
-
-        if (isRunningOnLocal()) {
-            System.setProperty("webdriver.chrome.driver", Config.PATH_LOCAL_CHROME_DRIVER); // sets the system property to the path of the ChromeDriver executable.
-            try {
-                driver = new RemoteWebDriver(URI.create(Config.LOCAL_SELENIUM_SERVER).toURL(), chromeOptions);
-            } catch (MalformedURLException e) {
-                throw new RuntimeException(e);
+        for (WebElement webElement : navDivElements) {
+            WebElement webLinkElement = webElement.findElement(By.tagName("a"));
+            String hrefValue = webLinkElement.getAttribute("href");
+            String accessibleName = webLinkElement.getAccessibleName();
+            if (navNames.contains(accessibleName)) {
+                navWebElements.add(new NavigationWebElement(accessibleName, hrefValue, webLinkElement));
             }
-        }else{
-            System.setProperty("webdriver.chrome.driver", Config.PATH_GH_ACTION_CHROME_DRIVER);
-            driver = new ChromeDriver(chromeOptions);
-        }
-
-        //Capabilities caps = ((RemoteWebDriver) driver).getCapabilities();
-        //String browserName = caps.getBrowserName();
-        //String browserVersion = caps.getBrowserVersion();
-        //System.out.println(browserName+" "+browserVersion);
-
-        driver.get(args[0]);
-        try {
-            Thread.sleep(2000);
-        } catch (InterruptedException e) {
-            throw new RuntimeException(e);
         }
 
-        return driver;
+        return navWebElements;
     }
 
-    private static void setupLogger() {
-        try {
-            FileHandler fileHandler = new FileHandler(Config.LOG_FILE);
-            fileHandler.setLevel(Level.SEVERE); // Log only SEVERE level messages
-
-            SimpleFormatter formatter = new SimpleFormatter();
-            fileHandler.setFormatter(formatter);
-
-            logger.addHandler(fileHandler);
-
-            // Disable console logging
-            logger.setUseParentHandlers(false);
-        } catch (IOException e) {
-            System.err.println("Failed to setup logger: " + e.getMessage());
-        }
-
-        Logger.getLogger("org.openqa.selenium").setLevel(Level.OFF); // turn off all logging from the Selenium WebDriver.
+    private void testForAllText() {
+        Common.checkTextPresent(driver, "Target/Wuid", "Activities", logger);
+        Common.checkTextPresent(driver, "Graph", "Activities", logger);
+        Common.checkTextPresent(driver, "State", "Activities", logger);
+        Common.checkTextPresent(driver, "Owner", "Activities", logger);
+        Common.checkTextPresent(driver, "Job Name", "Activities", logger);
     }
 }
diff --git a/esp/src/test-ui/tests/ECLWatchUI.java b/esp/src/test-ui/tests/ECLWatchUI.java
index c8bb665a57d..f24aae0dd01 100644
--- a/esp/src/test-ui/tests/ECLWatchUI.java
+++ b/esp/src/test-ui/tests/ECLWatchUI.java
@@ -4,8 +4,6 @@
 import org.openqa.selenium.chrome.ChromeDriver;
 import org.openqa.selenium.chrome.ChromeOptions;
 import org.openqa.selenium.remote.RemoteWebDriver;
-import pages.Activities;
-import pages.ECLWorkUnits;
 
 import java.io.IOException;
 import java.net.MalformedURLException;
diff --git a/esp/src/test-ui/tests/pages/ECLWorkUnits.java b/esp/src/test-ui/tests/ECLWorkUnits.java
similarity index 98%
rename from esp/src/test-ui/tests/pages/ECLWorkUnits.java
rename to esp/src/test-ui/tests/ECLWorkUnits.java
index f22a3a89edb..a4a651e344b 100644
--- a/esp/src/test-ui/tests/pages/ECLWorkUnits.java
+++ b/esp/src/test-ui/tests/ECLWorkUnits.java
@@ -1,5 +1,3 @@
-package pages;
-
 import org.openqa.selenium.WebDriver;
 import utility.Common;
 
diff --git a/esp/src/test-ui/tests/pages/Activities.java b/esp/src/test-ui/tests/pages/Activities.java
deleted file mode 100644
index e951a6fd9c3..00000000000
--- a/esp/src/test-ui/tests/pages/Activities.java
+++ /dev/null
@@ -1,69 +0,0 @@
-package pages;
-
-import model.NavigationWebElement;
-import org.openqa.selenium.By;
-import org.openqa.selenium.WebDriver;
-import org.openqa.selenium.WebElement;
-import utility.Common;
-
-import java.util.*;
-import java.util.logging.Logger;
-
-public class Activities {
-
-    WebDriver driver;
-    Logger logger;
-
-    public Activities(WebDriver driver, Logger logger) {
-        this.driver = driver;
-        this.logger = logger;
-    }
-
-    public List<NavigationWebElement> testingTheActivitiesPage() {
-
-        testForAllText();
-
-        List<NavigationWebElement> navWebElements = getNavWebElements();
-
-        testForNavigationLinks(navWebElements);
-
-        return navWebElements;
-    }
-
-    private void testForNavigationLinks(List<NavigationWebElement> navWebElements) {
-
-        for (NavigationWebElement element : navWebElements) {
-            element.webElement().click();
-            Common.testLinkRedirect(driver, element.hrefValue(), "Activities", logger);
-        }
-    }
-
-    private List<NavigationWebElement> getNavWebElements(){
-
-        List<NavigationWebElement> navWebElements = new ArrayList<>();
-        String[] navNamesArray = {"Activities", "ECL", "Files", "Published Queries", "Operations"};
-        Set<String> navNames = new HashSet<>(Arrays.asList(navNamesArray));
-
-        WebElement navDiv = driver.findElement(By.xpath("//ul[@class='ms-Nav-navItems navItems-169']"));
-        List<WebElement> navDivElements = navDiv.findElements(By.xpath("//li[@class='ms-Nav-navItem navItem-168']"));
-
-        for (WebElement webElement : navDivElements) {
-            WebElement webLinkElement = webElement.findElement(By.tagName("a"));
-            String hrefValue = webLinkElement.getAttribute("href");
-            String accessibleName = webLinkElement.getAccessibleName();
-            if (navNames.contains(accessibleName)) {
-                navWebElements.add(new NavigationWebElement(accessibleName, hrefValue, webLinkElement));
-            }
-        }
-
-        return navWebElements;
-    }
-
-    private void testForAllText() {
-        Common.checkTextPresent(driver, "Target/Wuid", "Activities", logger);
-        Common.checkTextPresent(driver, "Graph", "Activities", logger);
-        Common.checkTextPresent(driver, "State", "Activities", logger);
-        Common.checkTextPresent(driver, "Owner", "Activities", logger);
-        Common.checkTextPresent(driver, "Job Name", "Activities", logger);
-    }
-}

From 117b8becf6dbc19dfc1deb10829adff4b0ad6dd9 Mon Sep 17 00:00:00 2001
From: Nisha Bagdwal <nishabagdwal@gmail.com>
Date: Fri, 31 May 2024 10:49:28 -0400
Subject: [PATCH 07/33] HPCC-31857

Changed code for getting web elements by class name to getting web elements by name. Cleaned and formatted some code.
---
 esp/src/test-ui/tests/Activities.java     | 34 ++++++++++-------------
 esp/src/test-ui/tests/ECLWatchUI.java     | 12 ++++++--
 esp/src/test-ui/tests/ECLWorkUnits.java   | 21 ++++++--------
 esp/src/test-ui/tests/utility/Common.java | 12 ++++----
 4 files changed, 37 insertions(+), 42 deletions(-)

diff --git a/esp/src/test-ui/tests/Activities.java b/esp/src/test-ui/tests/Activities.java
index 73b23fd5703..e3446cfbca7 100644
--- a/esp/src/test-ui/tests/Activities.java
+++ b/esp/src/test-ui/tests/Activities.java
@@ -4,7 +4,8 @@
 import org.openqa.selenium.WebElement;
 import utility.Common;
 
-import java.util.*;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.logging.Logger;
 
 public class Activities {
@@ -32,36 +33,29 @@ private void testForNavigationLinks(List<NavigationWebElement> navWebElements) {
 
         for (NavigationWebElement element : navWebElements) {
             element.webElement().click();
-            Common.testLinkRedirect(driver, element.hrefValue(), "Activities", logger);
+            Common.testLinkRedirect(driver, element.hrefValue(), "Activities Page", logger);
         }
     }
 
-    private List<NavigationWebElement> getNavWebElements(){
+    private List<NavigationWebElement> getNavWebElements() {
 
         List<NavigationWebElement> navWebElements = new ArrayList<>();
         String[] navNamesArray = {"Activities", "ECL", "Files", "Published Queries", "Operations"};
-        Set<String> navNames = new HashSet<>(Arrays.asList(navNamesArray));
-
-        WebElement navDiv = driver.findElement(By.xpath("//ul[@class='ms-Nav-navItems navItems-169']"));
-        List<WebElement> navDivElements = navDiv.findElements(By.xpath("//li[@class='ms-Nav-navItem navItem-168']"));
-
-        for (WebElement webElement : navDivElements) {
-            WebElement webLinkElement = webElement.findElement(By.tagName("a"));
-            String hrefValue = webLinkElement.getAttribute("href");
-            String accessibleName = webLinkElement.getAccessibleName();
-            if (navNames.contains(accessibleName)) {
-                navWebElements.add(new NavigationWebElement(accessibleName, hrefValue, webLinkElement));
-            }
+
+        for (String navName : navNamesArray) {
+            WebElement webElement = driver.findElement(By.name(navName)).findElement(By.tagName("a"));
+            String hrefValue = webElement.getAttribute("href");
+            navWebElements.add(new NavigationWebElement(navName, hrefValue, webElement));
         }
 
         return navWebElements;
     }
 
     private void testForAllText() {
-        Common.checkTextPresent(driver, "Target/Wuid", "Activities", logger);
-        Common.checkTextPresent(driver, "Graph", "Activities", logger);
-        Common.checkTextPresent(driver, "State", "Activities", logger);
-        Common.checkTextPresent(driver, "Owner", "Activities", logger);
-        Common.checkTextPresent(driver, "Job Name", "Activities", logger);
+        String[] textArray = {"Target/Wuid", "Graph", "State", "Owner", "Job Name"};
+
+        for (String text : textArray) {
+            Common.checkTextPresent(driver, text, "Activities Page", logger);
+        }
     }
 }
diff --git a/esp/src/test-ui/tests/ECLWatchUI.java b/esp/src/test-ui/tests/ECLWatchUI.java
index f24aae0dd01..571a91ca466 100644
--- a/esp/src/test-ui/tests/ECLWatchUI.java
+++ b/esp/src/test-ui/tests/ECLWatchUI.java
@@ -8,6 +8,7 @@
 import java.io.IOException;
 import java.net.MalformedURLException;
 import java.net.URI;
+import java.time.Duration;
 import java.util.List;
 import java.util.logging.FileHandler;
 import java.util.logging.Level;
@@ -36,8 +37,13 @@ private static void startTesting(WebDriver driver) {
 
         for (NavigationWebElement element : navWebElements) {
 
-            if(element.name().equals("ECL")){
+            if (element.name().equals("ECL")) {
                 driver.get(element.hrefValue());
+                try {
+                    Thread.sleep(Duration.ofSeconds(2));
+                } catch (InterruptedException e) {
+                    throw new RuntimeException(e);
+                }
                 ECLWorkUnits eclWorkUnits = new ECLWorkUnits(driver, logger);
                 eclWorkUnits.testingECLWorkUnitsPage();
             }
@@ -66,7 +72,7 @@ private static WebDriver getWebDriver(String[] args) {
             } catch (MalformedURLException e) {
                 throw new RuntimeException(e);
             }
-        }else{
+        } else {
             System.setProperty("webdriver.chrome.driver", Config.PATH_GH_ACTION_CHROME_DRIVER);
             driver = new ChromeDriver(chromeOptions);
         }
@@ -78,7 +84,7 @@ private static WebDriver getWebDriver(String[] args) {
 
         driver.get(args[0]);
         try {
-            Thread.sleep(2000);
+            Thread.sleep(Duration.ofSeconds(2));
         } catch (InterruptedException e) {
             throw new RuntimeException(e);
         }
diff --git a/esp/src/test-ui/tests/ECLWorkUnits.java b/esp/src/test-ui/tests/ECLWorkUnits.java
index a4a651e344b..5168730226a 100644
--- a/esp/src/test-ui/tests/ECLWorkUnits.java
+++ b/esp/src/test-ui/tests/ECLWorkUnits.java
@@ -13,22 +13,17 @@ public ECLWorkUnits(WebDriver driver, Logger logger) {
         this.logger = logger;
     }
 
-    public void testingECLWorkUnitsPage(){
-
+    public void testingECLWorkUnitsPage() {
         testForAllText();
-
     }
 
     private void testForAllText() {
-        Common.checkTextPresent(driver, "WUID   ", "ECL WorkUnits", logger);
-        Common.checkTextPresent(driver, "Owner", "ECL WorkUnits", logger);
-        Common.checkTextPresent(driver, "Job Name", "ECL WorkUnits", logger);
-        Common.checkTextPresent(driver, "Cluster", "ECL WorkUnits", logger);
-        Common.checkTextPresent(driver, "Roxie Cluster", "ECL WorkUnits", logger);
-        Common.checkTextPresent(driver, "State", "ECL WorkUnits", logger);
-        Common.checkTextPresent(driver, "Total Cluster Time", "ECL WorkUnits", logger);
-        Common.checkTextPresent(driver, "Compile Cost", "ECL WorkUnits", logger);
-        Common.checkTextPresent(driver, "Execution Cost", "ECL WorkUnits", logger);
-        Common.checkTextPresent(driver, "File Access Cost", "ECL WorkUnits", logger);
+
+        String[] textArray = {"WUID", "Owner", "Job Name", "Cluster", "Roxie Cluster", "State", "Total Cluster Time",
+                "Compile Cost", "Execution Cost", "File Access Cost"};
+
+        for (String text : textArray) {
+            Common.checkTextPresent(driver, text, "ECL WorkUnits Page", logger);
+        }
     }
 }
diff --git a/esp/src/test-ui/tests/utility/Common.java b/esp/src/test-ui/tests/utility/Common.java
index 62a0226be0f..ca80934ce4a 100644
--- a/esp/src/test-ui/tests/utility/Common.java
+++ b/esp/src/test-ui/tests/utility/Common.java
@@ -8,13 +8,13 @@ public class Common {
 
     public static void testLinkRedirect(WebDriver driver, String expectedUrl, String page, Logger logger) {
         if (driver.getCurrentUrl().equals(expectedUrl)) {
-            System.out.println("Success: Link Pass " + page +" "+ expectedUrl);
-            String msg = "Success: "+page+" : Current URL does match expected URL\n" +
+            System.out.println("Success: Link Pass " + page + " " + expectedUrl);
+            String msg = "Success: " + page + " : Current URL does match expected URL\n" +
                     "Current URL: " + driver.getCurrentUrl() + "\n" +
                     "Expected URL: " + expectedUrl;
             logger.info(msg);
         } else {
-            String errorMsg = "Failure: "+page+" : Current URL does not match expected URL\n" +
+            String errorMsg = "Failure: " + page + " : Current URL does not match expected URL\n" +
                     "Current URL: " + driver.getCurrentUrl() + "\n" +
                     "Expected URL: " + expectedUrl;
             System.err.println(errorMsg);
@@ -24,11 +24,11 @@ public static void testLinkRedirect(WebDriver driver, String expectedUrl, String
 
     public static void checkTextPresent(WebDriver driver, String text, String page, Logger logger) {
         if (driver.getPageSource().contains(text)) {
-            System.out.println("Success: Text Pass "+ page + " "+ text);
-            String msg = "Success: "+page+": Text present: " + text;
+            System.out.println("Success: Text Pass " + page + " " + text);
+            String msg = "Success: " + page + ": Text present: " + text;
             logger.info(msg);
         } else {
-            String errorMsg = "Failure: "+page+": Text not present: " + text;
+            String errorMsg = "Failure: " + page + ": Text not present: " + text;
             System.err.println(errorMsg);
             logger.severe(errorMsg);
         }

From c998c960faecc1b21589b3170e431c9ea1739247 Mon Sep 17 00:00:00 2001
From: Nisha Bagdwal <nishabagdwal@gmail.com>
Date: Fri, 31 May 2024 15:19:17 -0400
Subject: [PATCH 08/33] HPCC-31857

Changed code for testing the links of navigation menu. Removed success messages from logs.
---
 esp/src/test-ui/tests/Activities.java     | 39 ++++++++++++++++++++---
 esp/src/test-ui/tests/ECLWorkUnits.java   |  5 ++-
 esp/src/test-ui/tests/config/Config.java  |  2 --
 esp/src/test-ui/tests/utility/Common.java | 30 ++++++++---------
 4 files changed, 49 insertions(+), 27 deletions(-)

diff --git a/esp/src/test-ui/tests/Activities.java b/esp/src/test-ui/tests/Activities.java
index e3446cfbca7..4a3da12dcb3 100644
--- a/esp/src/test-ui/tests/Activities.java
+++ b/esp/src/test-ui/tests/Activities.java
@@ -6,12 +6,23 @@
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 import java.util.logging.Logger;
 
 public class Activities {
 
-    WebDriver driver;
-    Logger logger;
+    private final WebDriver driver;
+    private final Logger logger;
+
+    static final String[] textArray = {"Target/Wuid", "Graph", "State", "Owner", "Job Name"};
+    static final String[] navNamesArray = {"Activities", "ECL", "Files", "Published Queries", "Operations"};
+    static final Map<String, List<String>> tabsListMap = Map.of(
+            "Activities", List.of("Activities", "Event Scheduler"),
+            "ECL", List.of("Workunits", "Playground"),
+            "Files", List.of("Logical Files", "Landing Zones", "Workunits", "XRef (L)"),
+            "Published Queries", List.of("Queries", "Package Maps"),
+            "Operations", List.of("Topology (L)", "Disk Usage (L)", "Target Clusters (L)", "Cluster Processes (L)", "System Servers (L)", "Security (L)", "Dynamic ESDL (L)")
+    );
 
     public Activities(WebDriver driver, Logger logger) {
         this.driver = driver;
@@ -33,14 +44,33 @@ private void testForNavigationLinks(List<NavigationWebElement> navWebElements) {
 
         for (NavigationWebElement element : navWebElements) {
             element.webElement().click();
-            Common.testLinkRedirect(driver, element.hrefValue(), "Activities Page", logger);
+
+            if (testTabsForNavigationLinks(driver, element)) {
+                String msg = "Success: Navigation Menu Link for " + element.name() + " URL : " + element.hrefValue();
+                System.out.println(msg);
+            } else {
+                String errorMsg = "Failure: Navigation Menu Link for " + element.name() + " URL : " + element.hrefValue();
+                System.err.println(errorMsg);
+                logger.severe(errorMsg);
+            }
         }
     }
 
+    private boolean testTabsForNavigationLinks(WebDriver driver, NavigationWebElement element) {
+        List<String> tabsList = tabsListMap.get(element.name());
+
+        for (String tab : tabsList) {
+            if (!driver.getPageSource().contains(tab)) {
+                return false;
+            }
+        }
+
+        return true;
+    }
+
     private List<NavigationWebElement> getNavWebElements() {
 
         List<NavigationWebElement> navWebElements = new ArrayList<>();
-        String[] navNamesArray = {"Activities", "ECL", "Files", "Published Queries", "Operations"};
 
         for (String navName : navNamesArray) {
             WebElement webElement = driver.findElement(By.name(navName)).findElement(By.tagName("a"));
@@ -52,7 +82,6 @@ private List<NavigationWebElement> getNavWebElements() {
     }
 
     private void testForAllText() {
-        String[] textArray = {"Target/Wuid", "Graph", "State", "Owner", "Job Name"};
 
         for (String text : textArray) {
             Common.checkTextPresent(driver, text, "Activities Page", logger);
diff --git a/esp/src/test-ui/tests/ECLWorkUnits.java b/esp/src/test-ui/tests/ECLWorkUnits.java
index 5168730226a..eb8563012b7 100644
--- a/esp/src/test-ui/tests/ECLWorkUnits.java
+++ b/esp/src/test-ui/tests/ECLWorkUnits.java
@@ -7,6 +7,8 @@ public class ECLWorkUnits {
 
     WebDriver driver;
     Logger logger;
+    static final String[] textArray = {"WUID", "Owner", "Job Name", "Cluster", "Roxie Cluster", "State", "Total Cluster Time",
+            "Compile Cost", "Execution Cost", "File Access Cost", "ABCXYYY"};
 
     public ECLWorkUnits(WebDriver driver, Logger logger) {
         this.driver = driver;
@@ -19,9 +21,6 @@ public void testingECLWorkUnitsPage() {
 
     private void testForAllText() {
 
-        String[] textArray = {"WUID", "Owner", "Job Name", "Cluster", "Roxie Cluster", "State", "Total Cluster Time",
-                "Compile Cost", "Execution Cost", "File Access Cost"};
-
         for (String text : textArray) {
             Common.checkTextPresent(driver, text, "ECL WorkUnits Page", logger);
         }
diff --git a/esp/src/test-ui/tests/config/Config.java b/esp/src/test-ui/tests/config/Config.java
index 0961b42c9ea..36604c06eb9 100644
--- a/esp/src/test-ui/tests/config/Config.java
+++ b/esp/src/test-ui/tests/config/Config.java
@@ -8,6 +8,4 @@ public class Config {
     public static final String PATH_LOCAL_CHROME_DRIVER = "C:/Users/nisha/Documents/Internship/Work/jars/chromeDriver";
     public static final String PATH_GH_ACTION_CHROME_DRIVER = "/usr/bin/chromedriver";
     public static final String LOCAL_SELENIUM_SERVER = "http://localhost:4444/wd/hub";
-//    public static final String LOCAL_ECL_WATCH_IP = "http://192.168.0.221:8010/";
-//    public static final String GH_ECL_WATCH_IP = "http://127.0.0.1:8010/";
 }
diff --git a/esp/src/test-ui/tests/utility/Common.java b/esp/src/test-ui/tests/utility/Common.java
index ca80934ce4a..d52222192d8 100644
--- a/esp/src/test-ui/tests/utility/Common.java
+++ b/esp/src/test-ui/tests/utility/Common.java
@@ -6,27 +6,23 @@
 
 public class Common {
 
-    public static void testLinkRedirect(WebDriver driver, String expectedUrl, String page, Logger logger) {
-        if (driver.getCurrentUrl().equals(expectedUrl)) {
-            System.out.println("Success: Link Pass " + page + " " + expectedUrl);
-            String msg = "Success: " + page + " : Current URL does match expected URL\n" +
-                    "Current URL: " + driver.getCurrentUrl() + "\n" +
-                    "Expected URL: " + expectedUrl;
-            logger.info(msg);
-        } else {
-            String errorMsg = "Failure: " + page + " : Current URL does not match expected URL\n" +
-                    "Current URL: " + driver.getCurrentUrl() + "\n" +
-                    "Expected URL: " + expectedUrl;
-            System.err.println(errorMsg);
-            logger.severe(errorMsg);
-        }
-    }
+//    public static void testLinkRedirect(WebDriver driver, String expectedUrl, String page, Logger logger) {
+//        if (driver.getCurrentUrl().equals(expectedUrl)) {
+//            System.out.println("Success: Link Pass " + page + " " + expectedUrl);
+//        } else {
+//            String errorMsg = "Failure: " + page + " : Current URL does not match expected URL\n" +
+//                    "Current URL: " + driver.getCurrentUrl() + "\n" +
+//                    "Expected URL: " + expectedUrl;
+//            System.err.println(errorMsg);
+//            logger.severe(errorMsg);
+//        }
+//    }
 
     public static void checkTextPresent(WebDriver driver, String text, String page, Logger logger) {
         if (driver.getPageSource().contains(text)) {
-            System.out.println("Success: Text Pass " + page + " " + text);
             String msg = "Success: " + page + ": Text present: " + text;
-            logger.info(msg);
+            System.out.println(msg);
+            //logger.info(msg);
         } else {
             String errorMsg = "Failure: " + page + ": Text not present: " + text;
             System.err.println(errorMsg);

From 1f7752d6181f0d652c69c94bb760994b32da920d Mon Sep 17 00:00:00 2001
From: Nisha Bagdwal <nishabagdwal@gmail.com>
Date: Mon, 3 Jun 2024 12:20:16 -0400
Subject: [PATCH 09/33] HPCC-31857

Added code - if navigation link fails, the error message should not only say that the test failed but also say that on which page the navigation actually landed.
---
 esp/src/test-ui/tests/Activities.java    | 29 ++++++++++++++++++++++--
 esp/src/test-ui/tests/ECLWorkUnits.java  |  2 +-
 esp/src/test-ui/tests/config/Config.java |  2 ++
 3 files changed, 30 insertions(+), 3 deletions(-)

diff --git a/esp/src/test-ui/tests/Activities.java b/esp/src/test-ui/tests/Activities.java
index 4a3da12dcb3..89c76547542 100644
--- a/esp/src/test-ui/tests/Activities.java
+++ b/esp/src/test-ui/tests/Activities.java
@@ -21,7 +21,8 @@ public class Activities {
             "ECL", List.of("Workunits", "Playground"),
             "Files", List.of("Logical Files", "Landing Zones", "Workunits", "XRef (L)"),
             "Published Queries", List.of("Queries", "Package Maps"),
-            "Operations", List.of("Topology (L)", "Disk Usage (L)", "Target Clusters (L)", "Cluster Processes (L)", "System Servers (L)", "Security (L)", "Dynamic ESDL (L)")
+            "Operations", List.of("Topology (L)", "Disk Usage (L)", "Target Clusters (L)", "Cluster Processes (L)", "System Servers (L)", "Security (L)", "Dynamic ESDL (L)"),
+            "DummyNavName", List.of("DummyTab1", "DummyTab2")
     );
 
     public Activities(WebDriver driver, Logger logger) {
@@ -49,13 +50,35 @@ private void testForNavigationLinks(List<NavigationWebElement> navWebElements) {
                 String msg = "Success: Navigation Menu Link for " + element.name() + " URL : " + element.hrefValue();
                 System.out.println(msg);
             } else {
-                String errorMsg = "Failure: Navigation Menu Link for " + element.name() + " URL : " + element.hrefValue();
+                String currentPage = getCurrentPage(driver);
+                String errorMsg = "Failure: Navigation Menu Link for " + element.name() + " page failed. The current navigation page that we landed on is " + currentPage + ". Current URL : " + element.hrefValue();
                 System.err.println(errorMsg);
                 logger.severe(errorMsg);
             }
         }
     }
 
+    private String getCurrentPage(WebDriver driver) {
+
+        for(var entry : tabsListMap.entrySet()){
+
+            List<String> tabs = entry.getValue();
+            boolean allTabsPresent = true;
+            for (String tab : tabs) {
+                if (!driver.getPageSource().contains(tab)) {
+                    allTabsPresent = false;
+                    break;
+                }
+            }
+
+            if(allTabsPresent){
+                return entry.getKey();
+            }
+        }
+
+        return "Invalid Page";
+    }
+
     private boolean testTabsForNavigationLinks(WebDriver driver, NavigationWebElement element) {
         List<String> tabsList = tabsListMap.get(element.name());
 
@@ -78,6 +101,8 @@ private List<NavigationWebElement> getNavWebElements() {
             navWebElements.add(new NavigationWebElement(navName, hrefValue, webElement));
         }
 
+        navWebElements.add(new NavigationWebElement("DummyNavName", "http://192.168.0.221:8010/esp/files/index.html#/files", navWebElements.get(2).webElement()));
+
         return navWebElements;
     }
 
diff --git a/esp/src/test-ui/tests/ECLWorkUnits.java b/esp/src/test-ui/tests/ECLWorkUnits.java
index eb8563012b7..0d946037540 100644
--- a/esp/src/test-ui/tests/ECLWorkUnits.java
+++ b/esp/src/test-ui/tests/ECLWorkUnits.java
@@ -8,7 +8,7 @@ public class ECLWorkUnits {
     WebDriver driver;
     Logger logger;
     static final String[] textArray = {"WUID", "Owner", "Job Name", "Cluster", "Roxie Cluster", "State", "Total Cluster Time",
-            "Compile Cost", "Execution Cost", "File Access Cost", "ABCXYYY"};
+            "Compile Cost", "Execution Cost", "File Access Cost"};
 
     public ECLWorkUnits(WebDriver driver, Logger logger) {
         this.driver = driver;
diff --git a/esp/src/test-ui/tests/config/Config.java b/esp/src/test-ui/tests/config/Config.java
index 36604c06eb9..cde04f48500 100644
--- a/esp/src/test-ui/tests/config/Config.java
+++ b/esp/src/test-ui/tests/config/Config.java
@@ -8,4 +8,6 @@ public class Config {
     public static final String PATH_LOCAL_CHROME_DRIVER = "C:/Users/nisha/Documents/Internship/Work/jars/chromeDriver";
     public static final String PATH_GH_ACTION_CHROME_DRIVER = "/usr/bin/chromedriver";
     public static final String LOCAL_SELENIUM_SERVER = "http://localhost:4444/wd/hub";
+
+    // Testing workunits page -> ECLWorkUnits.java
 }

From 7d4d0beb5efdfb2f1d5259a2621d677313027802 Mon Sep 17 00:00:00 2001
From: Nisha Bagdwal <nishabagdwal@gmail.com>
Date: Mon, 3 Jun 2024 17:01:52 -0400
Subject: [PATCH 10/33] HPCC-31857

Created a new framework using TestNG.
---
 .../test-ui/tests/framework/TestRunner.java   | 101 +++++++++++++++
 .../tests/framework/config/Config.java        |  13 ++
 .../tests/framework/config/TestClasses.java   |  13 ++
 .../framework/model/NavigationWebElement.java |  14 +++
 .../tests/framework/model/TestClass.java      |  20 +++
 .../tests/framework/pages/ActivitiesTest.java | 115 ++++++++++++++++++
 .../framework/pages/ECLWorkUnitsTest.java     |  31 +++++
 .../tests/framework/setup/LoggerHolder.java   |  16 +++
 .../tests/framework/setup/TestInjector.java   |  30 +++++
 .../framework/setup/WebDriverHolder.java      |  15 +++
 .../tests/framework/utility/Common.java       |  43 +++++++
 esp/src/test-ui/tests/utility/Common.java     |  11 ++
 12 files changed, 422 insertions(+)
 create mode 100644 esp/src/test-ui/tests/framework/TestRunner.java
 create mode 100644 esp/src/test-ui/tests/framework/config/Config.java
 create mode 100644 esp/src/test-ui/tests/framework/config/TestClasses.java
 create mode 100644 esp/src/test-ui/tests/framework/model/NavigationWebElement.java
 create mode 100644 esp/src/test-ui/tests/framework/model/TestClass.java
 create mode 100644 esp/src/test-ui/tests/framework/pages/ActivitiesTest.java
 create mode 100644 esp/src/test-ui/tests/framework/pages/ECLWorkUnitsTest.java
 create mode 100644 esp/src/test-ui/tests/framework/setup/LoggerHolder.java
 create mode 100644 esp/src/test-ui/tests/framework/setup/TestInjector.java
 create mode 100644 esp/src/test-ui/tests/framework/setup/WebDriverHolder.java
 create mode 100644 esp/src/test-ui/tests/framework/utility/Common.java

diff --git a/esp/src/test-ui/tests/framework/TestRunner.java b/esp/src/test-ui/tests/framework/TestRunner.java
new file mode 100644
index 00000000000..186aaf828d7
--- /dev/null
+++ b/esp/src/test-ui/tests/framework/TestRunner.java
@@ -0,0 +1,101 @@
+package framework;
+
+import config.Config;
+import framework.config.TestClasses;
+import framework.model.TestClass;
+import framework.setup.TestInjector;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.chrome.ChromeDriver;
+import org.openqa.selenium.chrome.ChromeOptions;
+import org.openqa.selenium.remote.RemoteWebDriver;
+import org.testng.TestNG;
+
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.logging.FileHandler;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import java.util.logging.SimpleFormatter;
+
+public class TestRunner {
+    public static void main(String[] args) {
+
+        Logger logger = setupLogger();
+        WebDriver driver = setupWebDriver();
+
+        TestNG testng = new TestNG();
+        testng.setTestClasses(loadClasses());
+        testng.addListener(new TestInjector(logger, driver));
+        testng.run();
+        driver.quit();
+    }
+
+    private static WebDriver setupWebDriver() {
+
+        ChromeOptions chromeOptions = new ChromeOptions();
+        chromeOptions.addArguments("--headless"); // sets the ChromeDriver to run in headless mode, meaning it runs without opening a visible browser window.
+        chromeOptions.addArguments("--no-sandbox"); // disables the sandbox security feature in Chrome.
+        chromeOptions.addArguments("--log-level=3"); // sets the log level for the ChromeDriver. Level 3 corresponds to errors only.
+
+        System.setProperty("webdriver.chrome.silentOutput", "true"); // suppresses the logs generated by the ChromeDriver
+
+        WebDriver driver;
+
+        if (isRunningOnLocal()) {
+            System.setProperty("webdriver.chrome.driver", Config.PATH_LOCAL_CHROME_DRIVER); // sets the system property to the path of the ChromeDriver executable.
+            try {
+                driver = new RemoteWebDriver(URI.create(Config.LOCAL_SELENIUM_SERVER).toURL(), chromeOptions);
+            } catch (MalformedURLException e) {
+                throw new RuntimeException(e);
+            }
+        } else {
+            System.setProperty("webdriver.chrome.driver", Config.PATH_GH_ACTION_CHROME_DRIVER);
+            driver = new ChromeDriver(chromeOptions);
+        }
+
+        //Capabilities caps = ((RemoteWebDriver) driver).getCapabilities();
+        //String browserName = caps.getBrowserName();
+        //String browserVersion = caps.getBrowserVersion();
+        //System.out.println(browserName+" "+browserVersion);
+
+        return driver;
+    }
+
+    private static boolean isRunningOnLocal() {
+        return System.getProperty("os.name").startsWith(Config.LOCAL_OS) && System.getenv("USERPROFILE").startsWith(Config.LOCAL_USER_PROFILE);
+    }
+
+    private static Class<?>[] loadClasses() {
+
+        List<Class<?>> classes = new ArrayList<>();
+        for (TestClass testClass : TestClasses.testClassesList) {
+            try {
+                classes.add(Class.forName(testClass.getPath()));
+            } catch (ClassNotFoundException e) {
+                System.err.println(e.getMessage());
+            }
+        }
+
+        return classes.toArray(new Class<?>[0]);
+    }
+
+    private static Logger setupLogger() {
+        Logger logger = Logger.getLogger(TestRunner.class.getName());
+        try {
+            FileHandler fileHandler = new FileHandler(Config.LOG_FILE);
+            SimpleFormatter formatter = new SimpleFormatter();
+            fileHandler.setFormatter(formatter);
+            logger.addHandler(fileHandler);
+            logger.setUseParentHandlers(false);
+            logger.setLevel(Level.ALL);
+        } catch (IOException e) {
+            System.err.println("Failed to setup logger: " + e.getMessage());
+        }
+
+        Logger.getLogger("org.openqa.selenium").setLevel(Level.OFF); // turn off all logging from the Selenium WebDriver.
+        return logger;
+    }
+}
diff --git a/esp/src/test-ui/tests/framework/config/Config.java b/esp/src/test-ui/tests/framework/config/Config.java
new file mode 100644
index 00000000000..d46347bba92
--- /dev/null
+++ b/esp/src/test-ui/tests/framework/config/Config.java
@@ -0,0 +1,13 @@
+package framework.config;
+
+public class Config {
+
+    public static final String LOG_FILE = "errorLog.log";
+    public static final String LOCAL_OS = "Windows";
+    public static final String LOCAL_USER_PROFILE = "C:\\Users\\nisha";
+    public static final String PATH_LOCAL_CHROME_DRIVER = "C:/Users/nisha/Documents/Internship/Work/jars/chromeDriver";
+    public static final String PATH_GH_ACTION_CHROME_DRIVER = "/usr/bin/chromedriver";
+    public static final String LOCAL_SELENIUM_SERVER = "http://localhost:4444/wd/hub";
+    public static final String ACTIVITIES_URL = "http://192.168.0.221:8010/esp/files/index.html#/activities";
+    public static final String ECL_WORK_UNITS_URL = "http://192.168.0.221:8010/esp/files/index.html#/workunits";
+}
diff --git a/esp/src/test-ui/tests/framework/config/TestClasses.java b/esp/src/test-ui/tests/framework/config/TestClasses.java
new file mode 100644
index 00000000000..2f850a49bb9
--- /dev/null
+++ b/esp/src/test-ui/tests/framework/config/TestClasses.java
@@ -0,0 +1,13 @@
+package framework.config;
+
+import framework.model.TestClass;
+
+import java.util.List;
+
+public class TestClasses {
+
+    public static final List<TestClass> testClassesList = List.of(
+            new TestClass("ActivitiesTest", "framework.pages.ActivitiesTest"),
+            new TestClass("ECLWorkUnitsTest", "framework.pages.ECLWorkUnitsTest")
+    );
+}
diff --git a/esp/src/test-ui/tests/framework/model/NavigationWebElement.java b/esp/src/test-ui/tests/framework/model/NavigationWebElement.java
new file mode 100644
index 00000000000..cf095ad554f
--- /dev/null
+++ b/esp/src/test-ui/tests/framework/model/NavigationWebElement.java
@@ -0,0 +1,14 @@
+package framework.model;
+
+import org.openqa.selenium.WebElement;
+
+public record NavigationWebElement(String name, String hrefValue, WebElement webElement) {
+
+    @Override
+    public String toString() {
+        return "NavigationWebElement{" +
+                "name='" + name + '\'' +
+                ", hrefValue='" + hrefValue + '\'' +
+                '}';
+    }
+}
diff --git a/esp/src/test-ui/tests/framework/model/TestClass.java b/esp/src/test-ui/tests/framework/model/TestClass.java
new file mode 100644
index 00000000000..9ac5bf9b58b
--- /dev/null
+++ b/esp/src/test-ui/tests/framework/model/TestClass.java
@@ -0,0 +1,20 @@
+package framework.model;
+
+public class TestClass {
+
+    String name;
+    String path;
+
+    public TestClass(String name, String path) {
+        this.name = name;
+        this.path = path;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPath() {
+        return path;
+    }
+}
diff --git a/esp/src/test-ui/tests/framework/pages/ActivitiesTest.java b/esp/src/test-ui/tests/framework/pages/ActivitiesTest.java
new file mode 100644
index 00000000000..378bd3c797b
--- /dev/null
+++ b/esp/src/test-ui/tests/framework/pages/ActivitiesTest.java
@@ -0,0 +1,115 @@
+package framework.pages;
+
+import framework.config.Config;
+import framework.setup.LoggerHolder;
+import framework.model.NavigationWebElement;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+import org.testng.annotations.Test;
+import framework.utility.Common;
+import framework.setup.WebDriverHolder;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.logging.Logger;
+
+public class ActivitiesTest {
+
+    static final String[] textArray = {"Target/Wuid", "Graph", "State", "Owner", "Job Name"};
+    static final String[] navNamesArray = {"Activities", "ECL", "Files", "Published Queries", "Operations"};
+    static final Map<String, List<String>> tabsListMap = Map.of(
+            "Activities", List.of("Activities", "Event Scheduler"),
+            "ECL", List.of("Workunits", "Playground"),
+            "Files", List.of("Logical Files", "Landing Zones", "Workunits", "XRef (L)"),
+            "Published Queries", List.of("Queries", "Package Maps"),
+            "Operations", List.of("Topology (L)", "Disk Usage (L)", "Target Clusters (L)", "Cluster Processes (L)", "System Servers (L)", "Security (L)", "Dynamic ESDL (L)"),
+            "DummyNavName", List.of("DummyTab1", "DummyTab2")
+    );
+    @Test
+    public void testActivitiesPage() {
+        WebDriver driver = WebDriverHolder.getDriver();
+        Common.openWebPage(driver, Config.ACTIVITIES_URL);
+
+        Logger logger = LoggerHolder.getLogger();
+
+        testForAllText(logger, driver);
+
+        List<NavigationWebElement> navWebElements = getNavWebElements(driver);
+
+        testForNavigationLinks(driver, navWebElements, logger);
+    }
+
+    private void testForNavigationLinks(WebDriver driver, List<NavigationWebElement> navWebElements, Logger logger) {
+
+        for (NavigationWebElement element : navWebElements) {
+            element.webElement().click();
+
+            if (testTabsForNavigationLinks(driver, element)) {
+                String msg = "Success: Navigation Menu Link for " + element.name() + " URL : " + element.hrefValue();
+                System.out.println(msg);
+            } else {
+                String currentPage = getCurrentPage(driver);
+                String errorMsg = "Failure: Navigation Menu Link for " + element.name() + " page failed. The current navigation page that we landed on is " + currentPage + ". Current URL : " + element.hrefValue();
+                System.err.println(errorMsg);
+                logger.severe(errorMsg);
+            }
+        }
+    }
+
+    private String getCurrentPage(WebDriver driver) {
+
+        for (var entry : tabsListMap.entrySet()) {
+
+            List<String> tabs = entry.getValue();
+            boolean allTabsPresent = true;
+            for (String tab : tabs) {
+                if (!driver.getPageSource().contains(tab)) {
+                    allTabsPresent = false;
+                    break;
+                }
+            }
+
+            if (allTabsPresent) {
+                return entry.getKey();
+            }
+        }
+
+        return "Invalid Page";
+    }
+
+    private boolean testTabsForNavigationLinks(WebDriver driver, NavigationWebElement element) {
+        List<String> tabsList = tabsListMap.get(element.name());
+
+        for (String tab : tabsList) {
+            if (!driver.getPageSource().contains(tab)) {
+                return false;
+            }
+        }
+
+        return true;
+    }
+
+    private List<NavigationWebElement> getNavWebElements(WebDriver driver) {
+
+        List<NavigationWebElement> navWebElements = new ArrayList<>();
+
+        for (String navName : navNamesArray) {
+            WebElement webElement = driver.findElement(By.name(navName)).findElement(By.tagName("a"));
+            String hrefValue = webElement.getAttribute("href");
+            navWebElements.add(new NavigationWebElement(navName, hrefValue, webElement));
+        }
+
+        navWebElements.add(new NavigationWebElement("DummyNavName", "http://192.168.0.221:8010/esp/files/index.html#/files", navWebElements.get(2).webElement()));
+
+        return navWebElements;
+    }
+
+    private void testForAllText(Logger logger, WebDriver driver) {
+
+        for (String text : textArray) {
+            Common.checkTextPresent(driver, text, "Activities Page", logger);
+        }
+    }
+}
diff --git a/esp/src/test-ui/tests/framework/pages/ECLWorkUnitsTest.java b/esp/src/test-ui/tests/framework/pages/ECLWorkUnitsTest.java
new file mode 100644
index 00000000000..4f5e67f17d7
--- /dev/null
+++ b/esp/src/test-ui/tests/framework/pages/ECLWorkUnitsTest.java
@@ -0,0 +1,31 @@
+package framework.pages;
+
+import framework.config.Config;
+import framework.setup.LoggerHolder;
+import framework.setup.WebDriverHolder;
+import org.openqa.selenium.WebDriver;
+import org.testng.annotations.Test;
+import framework.utility.Common;
+
+import java.util.logging.Logger;
+
+public class ECLWorkUnitsTest {
+
+    static final String[] textArray = {"WUID", "Owner", "Job Name", "Cluster", "Roxie Cluster", "State", "Total Cluster Time",
+            "Compile Cost", "Execution Cost", "File Access Cost", "ABCXYZ"};
+
+    @Test
+    public void testingECLWorkUnitsPage() {
+        WebDriver driver = WebDriverHolder.getDriver();
+        Common.openWebPage(driver, Config.ECL_WORK_UNITS_URL);
+        Logger logger = LoggerHolder.getLogger();
+        testForAllText(driver, logger);
+    }
+
+    private void testForAllText(WebDriver driver, Logger logger) {
+
+        for (String text : textArray) {
+            Common.checkTextPresent(driver, text, "ECL WorkUnits Page", logger);
+        }
+    }
+}
diff --git a/esp/src/test-ui/tests/framework/setup/LoggerHolder.java b/esp/src/test-ui/tests/framework/setup/LoggerHolder.java
new file mode 100644
index 00000000000..a62774a3533
--- /dev/null
+++ b/esp/src/test-ui/tests/framework/setup/LoggerHolder.java
@@ -0,0 +1,16 @@
+package framework.setup;
+
+import java.util.logging.Logger;
+
+public class LoggerHolder {
+    private static Logger logger;
+
+    public static void setLogger(Logger logger) {
+        LoggerHolder.logger = logger;
+    }
+
+    public static Logger getLogger() {
+        return logger;
+    }
+}
+
diff --git a/esp/src/test-ui/tests/framework/setup/TestInjector.java b/esp/src/test-ui/tests/framework/setup/TestInjector.java
new file mode 100644
index 00000000000..a075750a59e
--- /dev/null
+++ b/esp/src/test-ui/tests/framework/setup/TestInjector.java
@@ -0,0 +1,30 @@
+package framework.setup;
+
+import org.testng.IInvokedMethod;
+import org.testng.IInvokedMethodListener;
+import org.testng.ITestResult;
+import org.openqa.selenium.WebDriver;
+import java.util.logging.Logger;
+
+public class TestInjector implements IInvokedMethodListener {
+    private final Logger logger;
+    private final WebDriver driver;
+
+    public TestInjector(Logger logger, WebDriver driver) {
+        this.logger = logger;
+        this.driver = driver;
+    }
+
+    @Override
+    public void beforeInvocation(IInvokedMethod method, ITestResult testResult) {
+        if (method.isTestMethod()) {
+            LoggerHolder.setLogger(logger);
+            WebDriverHolder.setDriver(driver);
+        }
+    }
+
+    @Override
+    public void afterInvocation(IInvokedMethod method, ITestResult testResult) {
+        // Optionally, clean up if necessary
+    }
+}
diff --git a/esp/src/test-ui/tests/framework/setup/WebDriverHolder.java b/esp/src/test-ui/tests/framework/setup/WebDriverHolder.java
new file mode 100644
index 00000000000..d2887388db2
--- /dev/null
+++ b/esp/src/test-ui/tests/framework/setup/WebDriverHolder.java
@@ -0,0 +1,15 @@
+package framework.setup;
+
+import org.openqa.selenium.WebDriver;
+
+public class WebDriverHolder {
+    private static WebDriver driver;
+
+    public static void setDriver(WebDriver driver) {
+        WebDriverHolder.driver = driver;
+    }
+
+    public static WebDriver getDriver() {
+        return driver;
+    }
+}
diff --git a/esp/src/test-ui/tests/framework/utility/Common.java b/esp/src/test-ui/tests/framework/utility/Common.java
new file mode 100644
index 00000000000..a2c42200d7b
--- /dev/null
+++ b/esp/src/test-ui/tests/framework/utility/Common.java
@@ -0,0 +1,43 @@
+package framework.utility;
+
+import org.openqa.selenium.WebDriver;
+
+import java.time.Duration;
+import java.util.logging.Logger;
+
+public class Common {
+
+//    public static void testLinkRedirect(WebDriver driver, String expectedUrl, String page, Logger logger) {
+//        if (driver.getCurrentUrl().equals(expectedUrl)) {
+//            System.out.println("Success: Link Pass " + page + " " + expectedUrl);
+//        } else {
+//            String errorMsg = "Failure: " + page + " : Current URL does not match expected URL\n" +
+//                    "Current URL: " + driver.getCurrentUrl() + "\n" +
+//                    "Expected URL: " + expectedUrl;
+//            System.err.println(errorMsg);
+//            logger.severe(errorMsg);
+//        }
+//    }
+
+    public static void checkTextPresent(WebDriver driver, String text, String page, Logger logger) {
+        if (driver.getPageSource().contains(text)) {
+            String msg = "Success: " + page + ": Text present: " + text;
+            System.out.println(msg);
+            //logger.info(msg);
+        } else {
+            String errorMsg = "Failure: " + page + ": Text not present: " + text;
+            System.err.println(errorMsg);
+            logger.severe(errorMsg);
+        }
+    }
+
+    public static void openWebPage(WebDriver driver, String url) {
+
+        driver.get(url);
+        try {
+            Thread.sleep(Duration.ofSeconds(2));
+        } catch (InterruptedException e) {
+            throw new RuntimeException(e);
+        }
+    }
+}
diff --git a/esp/src/test-ui/tests/utility/Common.java b/esp/src/test-ui/tests/utility/Common.java
index d52222192d8..c66fceb2da6 100644
--- a/esp/src/test-ui/tests/utility/Common.java
+++ b/esp/src/test-ui/tests/utility/Common.java
@@ -2,6 +2,7 @@
 
 import org.openqa.selenium.WebDriver;
 
+import java.time.Duration;
 import java.util.logging.Logger;
 
 public class Common {
@@ -29,4 +30,14 @@ public static void checkTextPresent(WebDriver driver, String text, String page,
             logger.severe(errorMsg);
         }
     }
+
+    public static void openWebPage(WebDriver driver, String url) {
+
+        driver.get(url);
+        try {
+            Thread.sleep(Duration.ofSeconds(2));
+        } catch (InterruptedException e) {
+            throw new RuntimeException(e);
+        }
+    }
 }

From c7eff812f9081df7c09aa5b65fdf87eabe91f09e Mon Sep 17 00:00:00 2001
From: Nisha Bagdwal <nishabagdwal@gmail.com>
Date: Tue, 4 Jun 2024 09:42:35 -0400
Subject: [PATCH 11/33] HPCC-31857

Created a new framework using TestNG. Changed code for accessing urls for local and GitHub action environment.
---
 esp/src/test-ui/tests/Activities.java         | 130 +++++-------------
 esp/src/test-ui/tests/ECLWatchUI.java         | 112 ---------------
 esp/src/test-ui/tests/ECLWorkUnits.java       |  28 ----
 esp/src/test-ui/tests/config/Config.java      |  13 --
 .../test-ui/tests/framework/TestRunner.java   |   9 +-
 .../tests/framework/config/Config.java        |   6 +-
 .../tests/framework/pages/ActivitiesTest.java |   8 +-
 .../framework/pages/ECLWorkUnitsTest.java     |   4 +-
 .../tests/framework/utility/Common.java       |  10 ++
 .../tests/model/NavigationWebElement.java     |  14 --
 esp/src/test-ui/tests/utility/Common.java     |  43 ------
 11 files changed, 54 insertions(+), 323 deletions(-)
 delete mode 100644 esp/src/test-ui/tests/ECLWatchUI.java
 delete mode 100644 esp/src/test-ui/tests/ECLWorkUnits.java
 delete mode 100644 esp/src/test-ui/tests/config/Config.java
 delete mode 100644 esp/src/test-ui/tests/model/NavigationWebElement.java
 delete mode 100644 esp/src/test-ui/tests/utility/Common.java

diff --git a/esp/src/test-ui/tests/Activities.java b/esp/src/test-ui/tests/Activities.java
index 89c76547542..9886025fafd 100644
--- a/esp/src/test-ui/tests/Activities.java
+++ b/esp/src/test-ui/tests/Activities.java
@@ -1,115 +1,47 @@
-import model.NavigationWebElement;
-import org.openqa.selenium.By;
 import org.openqa.selenium.WebDriver;
-import org.openqa.selenium.WebElement;
-import utility.Common;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.logging.Logger;
+import org.openqa.selenium.chrome.ChromeDriver;
+import org.openqa.selenium.chrome.ChromeOptions;
 
 public class Activities {
 
-    private final WebDriver driver;
-    private final Logger logger;
-
-    static final String[] textArray = {"Target/Wuid", "Graph", "State", "Owner", "Job Name"};
-    static final String[] navNamesArray = {"Activities", "ECL", "Files", "Published Queries", "Operations"};
-    static final Map<String, List<String>> tabsListMap = Map.of(
-            "Activities", List.of("Activities", "Event Scheduler"),
-            "ECL", List.of("Workunits", "Playground"),
-            "Files", List.of("Logical Files", "Landing Zones", "Workunits", "XRef (L)"),
-            "Published Queries", List.of("Queries", "Package Maps"),
-            "Operations", List.of("Topology (L)", "Disk Usage (L)", "Target Clusters (L)", "Cluster Processes (L)", "System Servers (L)", "Security (L)", "Dynamic ESDL (L)"),
-            "DummyNavName", List.of("DummyTab1", "DummyTab2")
-    );
+    public static void main(String[] args) throws InterruptedException {
+        System.setProperty("webdriver.chrome.silentOutput", "true");
+        System.setProperty("webdriver.chrome.driver", "/usr/bin/chromedriver");
+        // java.util.logging.Logger.getLogger("org.openqa.selenium").setLevel(Level.OFF);
 
-    public Activities(WebDriver driver, Logger logger) {
-        this.driver = driver;
-        this.logger = logger;
-    }
+        ChromeOptions chromeOptions = new ChromeOptions();
+        chromeOptions.addArguments("--headless");
+        chromeOptions.addArguments("--no-sandbox");
+        chromeOptions.addArguments("--log-level=3");
 
-    public List<NavigationWebElement> testingTheActivitiesPage() {
+        WebDriver driver = new ChromeDriver(chromeOptions);
 
-        testForAllText();
+        //Capabilities caps = ((RemoteWebDriver) driver).getCapabilities();
 
-        List<NavigationWebElement> navWebElements = getNavWebElements();
+        //String browserName = caps.getBrowserName();
+        //String browserVersion = caps.getVersion();
+        // System.out.println(browserName+" "+browserVersion);
 
-        testForNavigationLinks(navWebElements);
+        driver.get(args[0]);
 
-        return navWebElements;
-    }
+        Thread.sleep(1000);
 
-    private void testForNavigationLinks(List<NavigationWebElement> navWebElements) {
-
-        for (NavigationWebElement element : navWebElements) {
-            element.webElement().click();
-
-            if (testTabsForNavigationLinks(driver, element)) {
-                String msg = "Success: Navigation Menu Link for " + element.name() + " URL : " + element.hrefValue();
-                System.out.println(msg);
-            } else {
-                String currentPage = getCurrentPage(driver);
-                String errorMsg = "Failure: Navigation Menu Link for " + element.name() + " page failed. The current navigation page that we landed on is " + currentPage + ". Current URL : " + element.hrefValue();
-                System.err.println(errorMsg);
-                logger.severe(errorMsg);
-            }
+        if (driver.getPageSource().contains("Job Name")) {
+            System.out.println("Pass");
+        } else {
+            System.err.println("Fail");
         }
-    }
-
-    private String getCurrentPage(WebDriver driver) {
-
-        for(var entry : tabsListMap.entrySet()){
-
-            List<String> tabs = entry.getValue();
-            boolean allTabsPresent = true;
-            for (String tab : tabs) {
-                if (!driver.getPageSource().contains(tab)) {
-                    allTabsPresent = false;
-                    break;
-                }
-            }
-
-            if(allTabsPresent){
-                return entry.getKey();
-            }
-        }
-
-        return "Invalid Page";
-    }
-
-    private boolean testTabsForNavigationLinks(WebDriver driver, NavigationWebElement element) {
-        List<String> tabsList = tabsListMap.get(element.name());
-
-        for (String tab : tabsList) {
-            if (!driver.getPageSource().contains(tab)) {
-                return false;
-            }
+        if (driver.getPageSource().contains("Owner")) {
+            System.out.println("Pass");
+        } else {
+            System.err.println("Fail");
         }
-
-        return true;
-    }
-
-    private List<NavigationWebElement> getNavWebElements() {
-
-        List<NavigationWebElement> navWebElements = new ArrayList<>();
-
-        for (String navName : navNamesArray) {
-            WebElement webElement = driver.findElement(By.name(navName)).findElement(By.tagName("a"));
-            String hrefValue = webElement.getAttribute("href");
-            navWebElements.add(new NavigationWebElement(navName, hrefValue, webElement));
+        if (driver.getPageSource().contains("Target/Wuid")) {
+            System.out.println("Pass");
+        } else {
+            System.err.println("Fail");
         }
 
-        navWebElements.add(new NavigationWebElement("DummyNavName", "http://192.168.0.221:8010/esp/files/index.html#/files", navWebElements.get(2).webElement()));
-
-        return navWebElements;
-    }
-
-    private void testForAllText() {
-
-        for (String text : textArray) {
-            Common.checkTextPresent(driver, text, "Activities Page", logger);
-        }
+        driver.quit();
     }
-}
+}
\ No newline at end of file
diff --git a/esp/src/test-ui/tests/ECLWatchUI.java b/esp/src/test-ui/tests/ECLWatchUI.java
deleted file mode 100644
index 571a91ca466..00000000000
--- a/esp/src/test-ui/tests/ECLWatchUI.java
+++ /dev/null
@@ -1,112 +0,0 @@
-import config.Config;
-import model.NavigationWebElement;
-import org.openqa.selenium.WebDriver;
-import org.openqa.selenium.chrome.ChromeDriver;
-import org.openqa.selenium.chrome.ChromeOptions;
-import org.openqa.selenium.remote.RemoteWebDriver;
-
-import java.io.IOException;
-import java.net.MalformedURLException;
-import java.net.URI;
-import java.time.Duration;
-import java.util.List;
-import java.util.logging.FileHandler;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-import java.util.logging.SimpleFormatter;
-
-public class ECLWatchUI {
-
-    private static final Logger logger = Logger.getLogger(ECLWatchUI.class.getName());
-
-    public static void main(String[] args) {
-
-        setupLogger();
-
-        WebDriver driver = getWebDriver(args);
-
-        startTesting(driver);
-
-        driver.quit();
-    }
-
-    private static void startTesting(WebDriver driver) {
-
-        Activities activities = new Activities(driver, logger);
-        List<NavigationWebElement> navWebElements = activities.testingTheActivitiesPage();
-
-        for (NavigationWebElement element : navWebElements) {
-
-            if (element.name().equals("ECL")) {
-                driver.get(element.hrefValue());
-                try {
-                    Thread.sleep(Duration.ofSeconds(2));
-                } catch (InterruptedException e) {
-                    throw new RuntimeException(e);
-                }
-                ECLWorkUnits eclWorkUnits = new ECLWorkUnits(driver, logger);
-                eclWorkUnits.testingECLWorkUnitsPage();
-            }
-        }
-    }
-
-    private static boolean isRunningOnLocal() {
-        return System.getProperty("os.name").startsWith(Config.LOCAL_OS) && System.getenv("USERPROFILE").startsWith(Config.LOCAL_USER_PROFILE);
-    }
-
-    private static WebDriver getWebDriver(String[] args) {
-
-        ChromeOptions chromeOptions = new ChromeOptions();
-        chromeOptions.addArguments("--headless"); // sets the ChromeDriver to run in headless mode, meaning it runs without opening a visible browser window.
-        chromeOptions.addArguments("--no-sandbox"); // disables the sandbox security feature in Chrome.
-        chromeOptions.addArguments("--log-level=3"); // sets the log level for the ChromeDriver. Level 3 corresponds to errors only.
-
-        System.setProperty("webdriver.chrome.silentOutput", "true"); // suppresses the logs generated by the ChromeDriver
-
-        WebDriver driver;
-
-        if (isRunningOnLocal()) {
-            System.setProperty("webdriver.chrome.driver", Config.PATH_LOCAL_CHROME_DRIVER); // sets the system property to the path of the ChromeDriver executable.
-            try {
-                driver = new RemoteWebDriver(URI.create(Config.LOCAL_SELENIUM_SERVER).toURL(), chromeOptions);
-            } catch (MalformedURLException e) {
-                throw new RuntimeException(e);
-            }
-        } else {
-            System.setProperty("webdriver.chrome.driver", Config.PATH_GH_ACTION_CHROME_DRIVER);
-            driver = new ChromeDriver(chromeOptions);
-        }
-
-        //Capabilities caps = ((RemoteWebDriver) driver).getCapabilities();
-        //String browserName = caps.getBrowserName();
-        //String browserVersion = caps.getBrowserVersion();
-        //System.out.println(browserName+" "+browserVersion);
-
-        driver.get(args[0]);
-        try {
-            Thread.sleep(Duration.ofSeconds(2));
-        } catch (InterruptedException e) {
-            throw new RuntimeException(e);
-        }
-
-        return driver;
-    }
-
-    private static void setupLogger() {
-        try {
-            FileHandler fileHandler = new FileHandler(Config.LOG_FILE);
-
-            SimpleFormatter formatter = new SimpleFormatter();
-            fileHandler.setFormatter(formatter);
-
-            logger.addHandler(fileHandler);
-
-            // Disable console logging
-            logger.setUseParentHandlers(false);
-        } catch (IOException e) {
-            System.err.println("Failed to setup logger: " + e.getMessage());
-        }
-
-        Logger.getLogger("org.openqa.selenium").setLevel(Level.OFF); // turn off all logging from the Selenium WebDriver.
-    }
-}
diff --git a/esp/src/test-ui/tests/ECLWorkUnits.java b/esp/src/test-ui/tests/ECLWorkUnits.java
deleted file mode 100644
index 0d946037540..00000000000
--- a/esp/src/test-ui/tests/ECLWorkUnits.java
+++ /dev/null
@@ -1,28 +0,0 @@
-import org.openqa.selenium.WebDriver;
-import utility.Common;
-
-import java.util.logging.Logger;
-
-public class ECLWorkUnits {
-
-    WebDriver driver;
-    Logger logger;
-    static final String[] textArray = {"WUID", "Owner", "Job Name", "Cluster", "Roxie Cluster", "State", "Total Cluster Time",
-            "Compile Cost", "Execution Cost", "File Access Cost"};
-
-    public ECLWorkUnits(WebDriver driver, Logger logger) {
-        this.driver = driver;
-        this.logger = logger;
-    }
-
-    public void testingECLWorkUnitsPage() {
-        testForAllText();
-    }
-
-    private void testForAllText() {
-
-        for (String text : textArray) {
-            Common.checkTextPresent(driver, text, "ECL WorkUnits Page", logger);
-        }
-    }
-}
diff --git a/esp/src/test-ui/tests/config/Config.java b/esp/src/test-ui/tests/config/Config.java
deleted file mode 100644
index cde04f48500..00000000000
--- a/esp/src/test-ui/tests/config/Config.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package config;
-
-public class Config {
-
-    public static final String LOG_FILE = "errorLog.log";
-    public static final String LOCAL_OS = "Windows";
-    public static final String LOCAL_USER_PROFILE = "C:\\Users\\nisha";
-    public static final String PATH_LOCAL_CHROME_DRIVER = "C:/Users/nisha/Documents/Internship/Work/jars/chromeDriver";
-    public static final String PATH_GH_ACTION_CHROME_DRIVER = "/usr/bin/chromedriver";
-    public static final String LOCAL_SELENIUM_SERVER = "http://localhost:4444/wd/hub";
-
-    // Testing workunits page -> ECLWorkUnits.java
-}
diff --git a/esp/src/test-ui/tests/framework/TestRunner.java b/esp/src/test-ui/tests/framework/TestRunner.java
index 186aaf828d7..3ab5376fd81 100644
--- a/esp/src/test-ui/tests/framework/TestRunner.java
+++ b/esp/src/test-ui/tests/framework/TestRunner.java
@@ -1,10 +1,11 @@
 package framework;
 
-import config.Config;
+import framework.config.Config;
 import framework.config.TestClasses;
 import framework.model.TestClass;
 import framework.setup.TestInjector;
 import org.openqa.selenium.WebDriver;
+import framework.utility.Common;
 import org.openqa.selenium.chrome.ChromeDriver;
 import org.openqa.selenium.chrome.ChromeOptions;
 import org.openqa.selenium.remote.RemoteWebDriver;
@@ -44,7 +45,7 @@ private static WebDriver setupWebDriver() {
 
         WebDriver driver;
 
-        if (isRunningOnLocal()) {
+        if (Common.isRunningOnLocal()) {
             System.setProperty("webdriver.chrome.driver", Config.PATH_LOCAL_CHROME_DRIVER); // sets the system property to the path of the ChromeDriver executable.
             try {
                 driver = new RemoteWebDriver(URI.create(Config.LOCAL_SELENIUM_SERVER).toURL(), chromeOptions);
@@ -64,10 +65,6 @@ private static WebDriver setupWebDriver() {
         return driver;
     }
 
-    private static boolean isRunningOnLocal() {
-        return System.getProperty("os.name").startsWith(Config.LOCAL_OS) && System.getenv("USERPROFILE").startsWith(Config.LOCAL_USER_PROFILE);
-    }
-
     private static Class<?>[] loadClasses() {
 
         List<Class<?>> classes = new ArrayList<>();
diff --git a/esp/src/test-ui/tests/framework/config/Config.java b/esp/src/test-ui/tests/framework/config/Config.java
index d46347bba92..439c12e88b7 100644
--- a/esp/src/test-ui/tests/framework/config/Config.java
+++ b/esp/src/test-ui/tests/framework/config/Config.java
@@ -8,6 +8,8 @@ public class Config {
     public static final String PATH_LOCAL_CHROME_DRIVER = "C:/Users/nisha/Documents/Internship/Work/jars/chromeDriver";
     public static final String PATH_GH_ACTION_CHROME_DRIVER = "/usr/bin/chromedriver";
     public static final String LOCAL_SELENIUM_SERVER = "http://localhost:4444/wd/hub";
-    public static final String ACTIVITIES_URL = "http://192.168.0.221:8010/esp/files/index.html#/activities";
-    public static final String ECL_WORK_UNITS_URL = "http://192.168.0.221:8010/esp/files/index.html#/workunits";
+    public static final String LOCAL_IP = "http://192.168.0.221:8010/";
+    public static final String GITHUB_ACTION_IP = "http://127.0.0.1:8010/";
+    public static final String ACTIVITIES_URL = "esp/files/index.html#/activities";
+    public static final String ECL_WORK_UNITS_URL = "esp/files/index.html#/workunits";
 }
diff --git a/esp/src/test-ui/tests/framework/pages/ActivitiesTest.java b/esp/src/test-ui/tests/framework/pages/ActivitiesTest.java
index 378bd3c797b..b415ed408d9 100644
--- a/esp/src/test-ui/tests/framework/pages/ActivitiesTest.java
+++ b/esp/src/test-ui/tests/framework/pages/ActivitiesTest.java
@@ -24,13 +24,13 @@ public class ActivitiesTest {
             "ECL", List.of("Workunits", "Playground"),
             "Files", List.of("Logical Files", "Landing Zones", "Workunits", "XRef (L)"),
             "Published Queries", List.of("Queries", "Package Maps"),
-            "Operations", List.of("Topology (L)", "Disk Usage (L)", "Target Clusters (L)", "Cluster Processes (L)", "System Servers (L)", "Security (L)", "Dynamic ESDL (L)"),
-            "DummyNavName", List.of("DummyTab1", "DummyTab2")
+            "Operations", List.of("Topology (L)", "Disk Usage (L)", "Target Clusters (L)", "Cluster Processes (L)", "System Servers (L)", "Security (L)", "Dynamic ESDL (L)")
+            //"DummyNavName", List.of("DummyTab1", "DummyTab2")
     );
     @Test
     public void testActivitiesPage() {
         WebDriver driver = WebDriverHolder.getDriver();
-        Common.openWebPage(driver, Config.ACTIVITIES_URL);
+        Common.openWebPage(driver, Common.getUrl(Config.ACTIVITIES_URL));
 
         Logger logger = LoggerHolder.getLogger();
 
@@ -101,7 +101,7 @@ private List<NavigationWebElement> getNavWebElements(WebDriver driver) {
             navWebElements.add(new NavigationWebElement(navName, hrefValue, webElement));
         }
 
-        navWebElements.add(new NavigationWebElement("DummyNavName", "http://192.168.0.221:8010/esp/files/index.html#/files", navWebElements.get(2).webElement()));
+        //navWebElements.add(new NavigationWebElement("DummyNavName", "http://192.168.0.221:8010/esp/files/index.html#/files", navWebElements.get(2).webElement()));
 
         return navWebElements;
     }
diff --git a/esp/src/test-ui/tests/framework/pages/ECLWorkUnitsTest.java b/esp/src/test-ui/tests/framework/pages/ECLWorkUnitsTest.java
index 4f5e67f17d7..499f2198750 100644
--- a/esp/src/test-ui/tests/framework/pages/ECLWorkUnitsTest.java
+++ b/esp/src/test-ui/tests/framework/pages/ECLWorkUnitsTest.java
@@ -12,12 +12,12 @@
 public class ECLWorkUnitsTest {
 
     static final String[] textArray = {"WUID", "Owner", "Job Name", "Cluster", "Roxie Cluster", "State", "Total Cluster Time",
-            "Compile Cost", "Execution Cost", "File Access Cost", "ABCXYZ"};
+            "Compile Cost", "Execution Cost", "File Access Cost"};
 
     @Test
     public void testingECLWorkUnitsPage() {
         WebDriver driver = WebDriverHolder.getDriver();
-        Common.openWebPage(driver, Config.ECL_WORK_UNITS_URL);
+        Common.openWebPage(driver, Common.getUrl(Config.ECL_WORK_UNITS_URL));
         Logger logger = LoggerHolder.getLogger();
         testForAllText(driver, logger);
     }
diff --git a/esp/src/test-ui/tests/framework/utility/Common.java b/esp/src/test-ui/tests/framework/utility/Common.java
index a2c42200d7b..9e33fa865f0 100644
--- a/esp/src/test-ui/tests/framework/utility/Common.java
+++ b/esp/src/test-ui/tests/framework/utility/Common.java
@@ -1,5 +1,6 @@
 package framework.utility;
 
+import framework.config.Config;
 import org.openqa.selenium.WebDriver;
 
 import java.time.Duration;
@@ -40,4 +41,13 @@ public static void openWebPage(WebDriver driver, String url) {
             throw new RuntimeException(e);
         }
     }
+
+    public static boolean isRunningOnLocal() {
+        return System.getProperty("os.name").startsWith(Config.LOCAL_OS) && System.getenv("USERPROFILE").startsWith(Config.LOCAL_USER_PROFILE);
+    }
+
+    public static String getUrl(String url) {
+
+        return isRunningOnLocal() ? Config.LOCAL_IP + url : Config.GITHUB_ACTION_IP + url;
+    }
 }
diff --git a/esp/src/test-ui/tests/model/NavigationWebElement.java b/esp/src/test-ui/tests/model/NavigationWebElement.java
deleted file mode 100644
index e82d982230d..00000000000
--- a/esp/src/test-ui/tests/model/NavigationWebElement.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package model;
-
-import org.openqa.selenium.WebElement;
-
-public record NavigationWebElement(String name, String hrefValue, WebElement webElement) {
-
-    @Override
-    public String toString() {
-        return "NavigationWebElement{" +
-                "name='" + name + '\'' +
-                ", hrefValue='" + hrefValue + '\'' +
-                '}';
-    }
-}
diff --git a/esp/src/test-ui/tests/utility/Common.java b/esp/src/test-ui/tests/utility/Common.java
deleted file mode 100644
index c66fceb2da6..00000000000
--- a/esp/src/test-ui/tests/utility/Common.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package utility;
-
-import org.openqa.selenium.WebDriver;
-
-import java.time.Duration;
-import java.util.logging.Logger;
-
-public class Common {
-
-//    public static void testLinkRedirect(WebDriver driver, String expectedUrl, String page, Logger logger) {
-//        if (driver.getCurrentUrl().equals(expectedUrl)) {
-//            System.out.println("Success: Link Pass " + page + " " + expectedUrl);
-//        } else {
-//            String errorMsg = "Failure: " + page + " : Current URL does not match expected URL\n" +
-//                    "Current URL: " + driver.getCurrentUrl() + "\n" +
-//                    "Expected URL: " + expectedUrl;
-//            System.err.println(errorMsg);
-//            logger.severe(errorMsg);
-//        }
-//    }
-
-    public static void checkTextPresent(WebDriver driver, String text, String page, Logger logger) {
-        if (driver.getPageSource().contains(text)) {
-            String msg = "Success: " + page + ": Text present: " + text;
-            System.out.println(msg);
-            //logger.info(msg);
-        } else {
-            String errorMsg = "Failure: " + page + ": Text not present: " + text;
-            System.err.println(errorMsg);
-            logger.severe(errorMsg);
-        }
-    }
-
-    public static void openWebPage(WebDriver driver, String url) {
-
-        driver.get(url);
-        try {
-            Thread.sleep(Duration.ofSeconds(2));
-        } catch (InterruptedException e) {
-            throw new RuntimeException(e);
-        }
-    }
-}

From 5848b40ade5e267a8159a5831194145ddbb70aaf Mon Sep 17 00:00:00 2001
From: Nisha Bagdwal <nishabagdwal@gmail.com>
Date: Wed, 5 Jun 2024 16:48:36 -0400
Subject: [PATCH 12/33] HPCC-31857

Code for parsing JSON file and created mapper classes. Code to access workunits from UI.
---
 .../tests/framework/config/Config.java        |   2 +
 .../tests/framework/config/TestClasses.java   |   2 +-
 .../framework/model/ApplicationValue.java     |  39 +++
 .../framework/model/ApplicationValues.java    |  19 ++
 .../tests/framework/model/ECLWorkunit.java    | 225 ++++++++++++++++++
 .../framework/model/WUQueryResponse.java      | 172 +++++++++++++
 .../tests/framework/model/WUQueryRoot.java    |  16 ++
 .../tests/framework/model/Workunits.java      |  19 ++
 .../framework/pages/ECLWorkUnitsTest.java     | 213 ++++++++++++++++-
 .../tests/framework/utility/Common.java       |   5 +-
 10 files changed, 708 insertions(+), 4 deletions(-)
 create mode 100644 esp/src/test-ui/tests/framework/model/ApplicationValue.java
 create mode 100644 esp/src/test-ui/tests/framework/model/ApplicationValues.java
 create mode 100644 esp/src/test-ui/tests/framework/model/ECLWorkunit.java
 create mode 100644 esp/src/test-ui/tests/framework/model/WUQueryResponse.java
 create mode 100644 esp/src/test-ui/tests/framework/model/WUQueryRoot.java
 create mode 100644 esp/src/test-ui/tests/framework/model/Workunits.java

diff --git a/esp/src/test-ui/tests/framework/config/Config.java b/esp/src/test-ui/tests/framework/config/Config.java
index 439c12e88b7..4554ab34365 100644
--- a/esp/src/test-ui/tests/framework/config/Config.java
+++ b/esp/src/test-ui/tests/framework/config/Config.java
@@ -7,6 +7,8 @@ public class Config {
     public static final String LOCAL_USER_PROFILE = "C:\\Users\\nisha";
     public static final String PATH_LOCAL_CHROME_DRIVER = "C:/Users/nisha/Documents/Internship/Work/jars/chromeDriver";
     public static final String PATH_GH_ACTION_CHROME_DRIVER = "/usr/bin/chromedriver";
+    public static final String PATH_LOCAL_WORKUNITS_JSON = "C:/Users/nisha/Documents/Internship/Work/files/workunits.json";
+    public static final String PATH_GH_ACTION_WORKUNITS_JSON = "";
     public static final String LOCAL_SELENIUM_SERVER = "http://localhost:4444/wd/hub";
     public static final String LOCAL_IP = "http://192.168.0.221:8010/";
     public static final String GITHUB_ACTION_IP = "http://127.0.0.1:8010/";
diff --git a/esp/src/test-ui/tests/framework/config/TestClasses.java b/esp/src/test-ui/tests/framework/config/TestClasses.java
index 2f850a49bb9..2a1a3fb1faf 100644
--- a/esp/src/test-ui/tests/framework/config/TestClasses.java
+++ b/esp/src/test-ui/tests/framework/config/TestClasses.java
@@ -7,7 +7,7 @@
 public class TestClasses {
 
     public static final List<TestClass> testClassesList = List.of(
-            new TestClass("ActivitiesTest", "framework.pages.ActivitiesTest"),
+            //new TestClass("ActivitiesTest", "framework.pages.ActivitiesTest"),
             new TestClass("ECLWorkUnitsTest", "framework.pages.ECLWorkUnitsTest")
     );
 }
diff --git a/esp/src/test-ui/tests/framework/model/ApplicationValue.java b/esp/src/test-ui/tests/framework/model/ApplicationValue.java
new file mode 100644
index 00000000000..1d84fb03f0e
--- /dev/null
+++ b/esp/src/test-ui/tests/framework/model/ApplicationValue.java
@@ -0,0 +1,39 @@
+package framework.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+public class ApplicationValue {
+
+    @JsonProperty("Application")
+    private String application;
+
+    @JsonProperty("Name")
+    private String name;
+
+    @JsonProperty("Value")
+    private String value;
+
+    public String getApplication() {
+        return application;
+    }
+
+    public void setApplication(String application) {
+        this.application = application;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+    public void setValue(String value) {
+        this.value = value;
+    }
+}
diff --git a/esp/src/test-ui/tests/framework/model/ApplicationValues.java b/esp/src/test-ui/tests/framework/model/ApplicationValues.java
new file mode 100644
index 00000000000..4f65fb761ce
--- /dev/null
+++ b/esp/src/test-ui/tests/framework/model/ApplicationValues.java
@@ -0,0 +1,19 @@
+package framework.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import java.util.List;
+
+public class ApplicationValues {
+
+    @JsonProperty("ApplicationValue")
+    private List<ApplicationValue> applicationValue;
+
+    public List<ApplicationValue> getApplicationValue() {
+        return applicationValue;
+    }
+
+    public void setApplicationValue(List<ApplicationValue> applicationValue) {
+        this.applicationValue = applicationValue;
+    }
+}
diff --git a/esp/src/test-ui/tests/framework/model/ECLWorkunit.java b/esp/src/test-ui/tests/framework/model/ECLWorkunit.java
new file mode 100644
index 00000000000..63ac6c8e417
--- /dev/null
+++ b/esp/src/test-ui/tests/framework/model/ECLWorkunit.java
@@ -0,0 +1,225 @@
+package framework.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+public class ECLWorkunit {
+
+    @JsonProperty("Wuid")
+    private String wuid;
+    private String href;
+    @JsonProperty("Owner")
+    private String owner;
+
+    @JsonProperty("Cluster")
+    private String cluster;
+
+    @JsonProperty("Jobname")
+    private String jobname;
+
+    @JsonProperty("StateID")
+    private int stateID;
+
+    @JsonProperty("State")
+    private String state;
+
+    @JsonProperty("Protected")
+    private boolean isProtected;
+
+    @JsonProperty("Action")
+    private int action;
+
+    @JsonProperty("ActionEx")
+    private String actionEx;
+
+    @JsonProperty("IsPausing")
+    private boolean isPausing;
+
+    @JsonProperty("ThorLCR")
+    private boolean thorLCR;
+
+    @JsonProperty("TotalClusterTime")
+    private String totalClusterTime;
+
+    @JsonProperty("ApplicationValues")
+    private ApplicationValues applicationValues;
+
+    @JsonProperty("ExecuteCost")
+    private double executeCost;
+
+    @JsonProperty("FileAccessCost")
+    private double fileAccessCost;
+
+    @JsonProperty("CompileCost")
+    private double compileCost;
+
+    @JsonProperty("NoAccess")
+    private boolean noAccess;
+
+    public String getWuid() {
+        return wuid;
+    }
+
+    public void setWuid(String wuid) {
+        this.wuid = wuid;
+    }
+
+    public String getHref() {
+        return href;
+    }
+
+    public void setHref(String href) {
+        this.href = href;
+    }
+
+    public String getOwner() {
+        return owner;
+    }
+
+    public void setOwner(String owner) {
+        this.owner = owner;
+    }
+
+    public String getCluster() {
+        return cluster;
+    }
+
+    public void setCluster(String cluster) {
+        this.cluster = cluster;
+    }
+
+    public String getJobname() {
+        return jobname;
+    }
+
+    public void setJobname(String jobname) {
+        this.jobname = jobname;
+    }
+
+    public int getStateID() {
+        return stateID;
+    }
+
+    public void setStateID(int stateID) {
+        this.stateID = stateID;
+    }
+
+    public String getState() {
+        return state;
+    }
+
+    public void setState(String state) {
+        this.state = state;
+    }
+
+    public boolean isProtected() {
+        return isProtected;
+    }
+
+    public void setProtected(boolean aProtected) {
+        isProtected = aProtected;
+    }
+
+    public int getAction() {
+        return action;
+    }
+
+    public void setAction(int action) {
+        this.action = action;
+    }
+
+    public String getActionEx() {
+        return actionEx;
+    }
+
+    public void setActionEx(String actionEx) {
+        this.actionEx = actionEx;
+    }
+
+    public boolean isPausing() {
+        return isPausing;
+    }
+
+    public void setPausing(boolean pausing) {
+        isPausing = pausing;
+    }
+
+    public boolean isThorLCR() {
+        return thorLCR;
+    }
+
+    public void setThorLCR(boolean thorLCR) {
+        this.thorLCR = thorLCR;
+    }
+
+    public String getTotalClusterTime() {
+        return totalClusterTime;
+    }
+
+    public void setTotalClusterTime(String totalClusterTime) {
+        this.totalClusterTime = totalClusterTime;
+    }
+
+    public ApplicationValues getApplicationValues() {
+        return applicationValues;
+    }
+
+    public void setApplicationValues(ApplicationValues applicationValues) {
+        this.applicationValues = applicationValues;
+    }
+
+    public double getExecuteCost() {
+        return executeCost;
+    }
+
+    public void setExecuteCost(double executeCost) {
+        this.executeCost = executeCost;
+    }
+
+    public double getFileAccessCost() {
+        return fileAccessCost;
+    }
+
+    public void setFileAccessCost(double fileAccessCost) {
+        this.fileAccessCost = fileAccessCost;
+    }
+
+    public double getCompileCost() {
+        return compileCost;
+    }
+
+    public void setCompileCost(double compileCost) {
+        this.compileCost = compileCost;
+    }
+
+    public boolean isNoAccess() {
+        return noAccess;
+    }
+
+    public void setNoAccess(boolean noAccess) {
+        this.noAccess = noAccess;
+    }
+
+    @Override
+    public String toString() {
+        return "ECLWorkunit{" +
+                "wuid='" + wuid + '\'' +
+                ", href='" + href + '\'' +
+                ", owner='" + owner + '\'' +
+                ", cluster='" + cluster + '\'' +
+                ", jobname='" + jobname + '\'' +
+                ", stateID=" + stateID +
+                ", state='" + state + '\'' +
+                ", isProtected=" + isProtected +
+                ", action=" + action +
+                ", actionEx='" + actionEx + '\'' +
+                ", isPausing=" + isPausing +
+                ", thorLCR=" + thorLCR +
+                ", totalClusterTime='" + totalClusterTime + '\'' +
+                ", applicationValues=" + applicationValues +
+                ", executeCost=" + executeCost +
+                ", fileAccessCost=" + fileAccessCost +
+                ", compileCost=" + compileCost +
+                ", noAccess=" + noAccess +
+                '}';
+    }
+}
diff --git a/esp/src/test-ui/tests/framework/model/WUQueryResponse.java b/esp/src/test-ui/tests/framework/model/WUQueryResponse.java
new file mode 100644
index 00000000000..5186b89535d
--- /dev/null
+++ b/esp/src/test-ui/tests/framework/model/WUQueryResponse.java
@@ -0,0 +1,172 @@
+package framework.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+public class WUQueryResponse {
+
+    @JsonProperty("Type")
+    private String type;
+
+    @JsonProperty("LogicalFileSearchType")
+    private String logicalFileSearchType;
+
+    @JsonProperty("Count")
+    private int count;
+
+    @JsonProperty("PageSize")
+    private int pageSize;
+
+    @JsonProperty("NextPage")
+    private int nextPage;
+
+    @JsonProperty("LastPage")
+    private int lastPage;
+
+    @JsonProperty("NumWUs")
+    private int numWUs;
+
+    @JsonProperty("First")
+    private boolean first;
+
+    @JsonProperty("PageStartFrom")
+    private int pageStartFrom;
+
+    @JsonProperty("PageEndAt")
+    private int pageEndAt;
+
+    @JsonProperty("Descending")
+    private boolean descending;
+
+    @JsonProperty("BasicQuery")
+    private String basicQuery;
+
+    @JsonProperty("Filters")
+    private String filters;
+
+    @JsonProperty("CacheHint")
+    private long cacheHint;
+
+    @JsonProperty("Workunits")
+    private Workunits workunits;
+
+    // getters and setters
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public String getLogicalFileSearchType() {
+        return logicalFileSearchType;
+    }
+
+    public void setLogicalFileSearchType(String logicalFileSearchType) {
+        this.logicalFileSearchType = logicalFileSearchType;
+    }
+
+    public int getCount() {
+        return count;
+    }
+
+    public void setCount(int count) {
+        this.count = count;
+    }
+
+    public int getPageSize() {
+        return pageSize;
+    }
+
+    public void setPageSize(int pageSize) {
+        this.pageSize = pageSize;
+    }
+
+    public int getNextPage() {
+        return nextPage;
+    }
+
+    public void setNextPage(int nextPage) {
+        this.nextPage = nextPage;
+    }
+
+    public int getLastPage() {
+        return lastPage;
+    }
+
+    public void setLastPage(int lastPage) {
+        this.lastPage = lastPage;
+    }
+
+    public int getNumWUs() {
+        return numWUs;
+    }
+
+    public void setNumWUs(int numWUs) {
+        this.numWUs = numWUs;
+    }
+
+    public boolean isFirst() {
+        return first;
+    }
+
+    public void setFirst(boolean first) {
+        this.first = first;
+    }
+
+    public int getPageStartFrom() {
+        return pageStartFrom;
+    }
+
+    public void setPageStartFrom(int pageStartFrom) {
+        this.pageStartFrom = pageStartFrom;
+    }
+
+    public int getPageEndAt() {
+        return pageEndAt;
+    }
+
+    public void setPageEndAt(int pageEndAt) {
+        this.pageEndAt = pageEndAt;
+    }
+
+    public boolean isDescending() {
+        return descending;
+    }
+
+    public void setDescending(boolean descending) {
+        this.descending = descending;
+    }
+
+    public String getBasicQuery() {
+        return basicQuery;
+    }
+
+    public void setBasicQuery(String basicQuery) {
+        this.basicQuery = basicQuery;
+    }
+
+    public String getFilters() {
+        return filters;
+    }
+
+    public void setFilters(String filters) {
+        this.filters = filters;
+    }
+
+    public long getCacheHint() {
+        return cacheHint;
+    }
+
+    public void setCacheHint(long cacheHint) {
+        this.cacheHint = cacheHint;
+    }
+
+    public Workunits getWorkunits() {
+        return workunits;
+    }
+
+    public void setWorkunits(Workunits workunits) {
+        this.workunits = workunits;
+    }
+}
diff --git a/esp/src/test-ui/tests/framework/model/WUQueryRoot.java b/esp/src/test-ui/tests/framework/model/WUQueryRoot.java
new file mode 100644
index 00000000000..24f20797392
--- /dev/null
+++ b/esp/src/test-ui/tests/framework/model/WUQueryRoot.java
@@ -0,0 +1,16 @@
+package framework.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+public class WUQueryRoot {
+    @JsonProperty("WUQueryResponse")
+    private WUQueryResponse wuQueryResponse;
+
+    public WUQueryResponse getWUQueryResponse() {
+        return wuQueryResponse;
+    }
+
+    public void setWUQueryResponse(WUQueryResponse wuQueryResponse) {
+        this.wuQueryResponse = wuQueryResponse;
+    }
+}
diff --git a/esp/src/test-ui/tests/framework/model/Workunits.java b/esp/src/test-ui/tests/framework/model/Workunits.java
new file mode 100644
index 00000000000..7bbed424429
--- /dev/null
+++ b/esp/src/test-ui/tests/framework/model/Workunits.java
@@ -0,0 +1,19 @@
+package framework.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import java.util.List;
+
+public class Workunits {
+
+    @JsonProperty("ECLWorkunit")
+    private List<ECLWorkunit> eclWorkunit;
+
+    public List<ECLWorkunit> getECLWorkunit() {
+        return eclWorkunit;
+    }
+
+    public void setECLWorkunit(List<ECLWorkunit> eclWorkunit) {
+        this.eclWorkunit = eclWorkunit;
+    }
+}
diff --git a/esp/src/test-ui/tests/framework/pages/ECLWorkUnitsTest.java b/esp/src/test-ui/tests/framework/pages/ECLWorkUnitsTest.java
index 499f2198750..7d0dcff4923 100644
--- a/esp/src/test-ui/tests/framework/pages/ECLWorkUnitsTest.java
+++ b/esp/src/test-ui/tests/framework/pages/ECLWorkUnitsTest.java
@@ -1,12 +1,21 @@
 package framework.pages;
 
+import com.fasterxml.jackson.databind.ObjectMapper;
 import framework.config.Config;
+import framework.model.ECLWorkunit;
+import framework.model.WUQueryResponse;
+import framework.model.WUQueryRoot;
 import framework.setup.LoggerHolder;
 import framework.setup.WebDriverHolder;
+import framework.utility.Common;
+import org.openqa.selenium.By;
 import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
 import org.testng.annotations.Test;
-import framework.utility.Common;
 
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.logging.Logger;
 
 public class ECLWorkUnitsTest {
@@ -19,7 +28,207 @@ public void testingECLWorkUnitsPage() {
         WebDriver driver = WebDriverHolder.getDriver();
         Common.openWebPage(driver, Common.getUrl(Config.ECL_WORK_UNITS_URL));
         Logger logger = LoggerHolder.getLogger();
-        testForAllText(driver, logger);
+
+        //testForAllText(driver, logger);
+
+        testWorkUnitContent(driver, logger);
+
+    }
+
+    private void testWorkUnitContent(WebDriver driver, Logger logger) {
+
+        List<WebElement> allWorkUnitsUI = getAllWorkUnitsFromUI(driver);
+
+        System.out.println("Number of Workunits from UI: " + allWorkUnitsUI.size());
+
+        List<ECLWorkunit> eclWorkunitsUI = convertWebElementsToObjects(allWorkUnitsUI);
+
+        List<ECLWorkunit> eclWorkunitsJson = getAllWorkUnitsFromJson();
+
+        System.out.println("Number of Workunits from Json: " + eclWorkunitsJson.size());
+
+        compareWorkUnits(eclWorkunitsUI, eclWorkunitsJson, logger);
+    }
+
+    private List<ECLWorkunit> convertWebElementsToObjects(List<WebElement> allWorkUnitsUI) {
+
+        List<ECLWorkunit> eclWorkunits = new ArrayList<>();
+
+        for(WebElement element : allWorkUnitsUI){
+
+            ECLWorkunit eclWorkunit = new ECLWorkunit();
+
+            WebElement columnWebElement = element.findElement(By.cssSelector("div[data-automation-key=Wuid]"));
+
+            String wuid = columnWebElement.getText();
+            String href = columnWebElement.findElement(By.tagName("a")).getAttribute("href");
+
+            columnWebElement = element.findElement(By.cssSelector("div[data-automation-key=Owner]"));
+            String owner = columnWebElement.getText();
+
+            columnWebElement = element.findElement(By.cssSelector("div[data-automation-key=Jobname]"));
+            String jobname = columnWebElement.getText();
+
+            columnWebElement = element.findElement(By.cssSelector("div[data-automation-key=Cluster]"));
+            String cluster = columnWebElement.getText();
+
+            columnWebElement = element.findElement(By.cssSelector("div[data-automation-key=RoxieCluster]")); // need to ask for this column, it is empty, no value in json
+            String roxieCluster = columnWebElement.getText();
+
+            columnWebElement = element.findElement(By.cssSelector("div[data-automation-key=State]"));
+            String state = columnWebElement.getText();
+
+            columnWebElement = element.findElement(By.cssSelector("div[data-automation-key=TotalClusterTime]"));
+            String totalClusterTime = columnWebElement.getText();
+
+            columnWebElement = element.findElement(By.cssSelector("div[data-automation-key='Compile Cost']"));
+            String compileCost = columnWebElement.getText();
+
+            columnWebElement = element.findElement(By.cssSelector("div[data-automation-key='Execution Cost']"));
+            String executionCost = columnWebElement.getText();
+
+            columnWebElement = element.findElement(By.cssSelector("div[data-automation-key='File Access Cost']"));
+            String fileAccessCost = columnWebElement.getText();
+
+            eclWorkunit.setWuid(wuid.trim());
+            eclWorkunit.setHref(href);
+            eclWorkunit.setOwner(owner);
+            eclWorkunit.setJobname(jobname);
+            eclWorkunit.setCluster(cluster);
+            eclWorkunit.setState(state);
+            eclWorkunit.setTotalClusterTime(totalClusterTime);
+            eclWorkunit.setCompileCost(extractDoubleValue(compileCost));
+            eclWorkunit.setExecuteCost(extractDoubleValue(executionCost));
+            eclWorkunit.setFileAccessCost(extractDoubleValue(fileAccessCost));
+
+            eclWorkunits.add(eclWorkunit);
+        }
+
+        return eclWorkunits;
+    }
+
+    public static double extractDoubleValue(String value) {
+        String doubleString = value.split(" ")[0];
+        return Double.parseDouble(doubleString);
+    }
+
+    private void compareWorkUnits(List<ECLWorkunit> eclWorkunitsUI, List<ECLWorkunit> eclWorkunitsJson, Logger logger) {
+
+//        if(allWorkUnitsUI.size() != eclWorkunitsJson.size()){
+//            String errMsg = "Number of workunits is different on UI and JSON. \nUI Workunits: "+ allWorkUnitsUI.size()+ "\nJSON Workunits: "+eclWorkunitsJson.size()+"\n";
+//            System.err.println(errMsg);
+//            logger.severe(errMsg);
+//        }
+
+        for(int i = 0; i < eclWorkunitsUI.size(); i++){
+
+            if(eclWorkunitsUI.get(i).getWuid().equals(eclWorkunitsJson.get(i).getWuid())){
+
+                if(!eclWorkunitsUI.get(i).getOwner().equals(eclWorkunitsJson.get(i).getOwner())){
+                    String errMsg = "Incorrect Owner in UI for Wuid : "+ eclWorkunitsUI.get(i).getWuid() +" Correct Owner is: " + eclWorkunitsJson.get(i).getOwner();
+                    System.out.println(errMsg);
+                    logger.severe(errMsg);
+                }
+
+                if(!eclWorkunitsUI.get(i).getCluster().equals(eclWorkunitsJson.get(i).getCluster())){
+                    String errMsg = "Incorrect Cluster in UI for Wuid : "+ eclWorkunitsUI.get(i).getWuid() +" Correct Cluster is: " + eclWorkunitsJson.get(i).getCluster();
+                    System.out.println(errMsg);
+                    logger.severe(errMsg);
+                }
+
+            }else{
+
+                String errMsg = "Incorrect Wuid in UI: "+eclWorkunitsUI.get(i).getWuid()+" Correct Wuid is: " + eclWorkunitsJson.get(i).getWuid();
+                logger.severe(errMsg);
+                System.out.println(errMsg);
+            }
+        }
+    }
+
+    private List<ECLWorkunit> getAllWorkUnitsFromJson() {
+
+        try {
+
+            ObjectMapper objectMapper = new ObjectMapper();
+            String filePath = Common.isRunningOnLocal() ? Config.PATH_LOCAL_WORKUNITS_JSON : Config.PATH_GH_ACTION_WORKUNITS_JSON;
+
+            WUQueryRoot wuQueryRoot = objectMapper.readValue(new File(filePath), WUQueryRoot.class);
+
+            WUQueryResponse wuQueryResponse = wuQueryRoot.getWUQueryResponse();
+            return wuQueryResponse.getWorkunits().getECLWorkunit();
+
+        } catch (Exception e) {
+            System.err.println("Exception: " + e.getMessage());
+        }
+
+        return null;
+    }
+
+    private List<WebElement> getAllWorkUnitsFromUI(WebDriver driver) {
+
+        List<WebElement> workunitDivs = driver.findElements(By.cssSelector("div[data-list-index]"));
+
+//        WebElement dropdown = driver.findElement(By.id("pageSize"));
+//
+//        // Click the dropdown to open the options
+//        dropdown.click();
+//
+//        WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
+//
+//        // Wait for the options to be visible
+//        List<WebElement> options = wait.until(ExpectedConditions.visibilityOfAllElementsLocatedBy(By.cssSelector(".ms-Dropdown-item")));
+//
+//        // Loop through the options and select the one with value 1000
+//        for (WebElement option : options) {
+//            if (option.getText().equals("1000")) {
+//                option.click();
+//                break;
+//            }
+//        }
+//
+//        wait.until(ExpectedConditions.invisibilityOfElementLocated(By.cssSelector(".ms-Dropdown-item")));
+//
+//        try {
+//
+//            Thread.sleep(10000);
+//
+//            JavascriptExecutor js = (JavascriptExecutor) driver;
+//
+//            Long lastHeight = (Long) js.executeScript("return document.body.scrollHeight");
+//
+//            System.out.println("last Height: " + lastHeight);
+//
+//            while (true) {
+//
+//                js.executeScript("window.scrollTo(0, document.body.scrollHeight)");
+//
+//                Thread.sleep(10000);
+//
+//                Long newHeight = (Long) js.executeScript("return document.body.scrollHeight");
+//                if (newHeight.equals(lastHeight)) {
+//                    break;
+//                }
+//                lastHeight = newHeight;
+//            }
+//        } catch (InterruptedException e) {
+//            System.err.println(e.getMessage());
+//        }
+//
+//        workunitDivs = driver.findElements(By.cssSelector("div[data-list-index]"));
+//        System.out.println("Updated size: " + workunitDivs.size());
+
+
+//        int targetIndexString = 54;
+//
+//        WebElement workunitDiv = driver.findElement(By.cssSelector("div[data-list-index='" + targetIndexString + "']"));
+//
+//        String column = "Wuid";
+//
+//        WebElement column1 = workunitDiv.findElement(By.cssSelector("div[data-automation-key='" + column + "']"));
+//
+//        System.out.println("Value: " + column1.getText());
+
+        return workunitDivs;
     }
 
     private void testForAllText(WebDriver driver, Logger logger) {
diff --git a/esp/src/test-ui/tests/framework/utility/Common.java b/esp/src/test-ui/tests/framework/utility/Common.java
index 9e33fa865f0..38793ba6785 100644
--- a/esp/src/test-ui/tests/framework/utility/Common.java
+++ b/esp/src/test-ui/tests/framework/utility/Common.java
@@ -34,9 +34,12 @@ public static void checkTextPresent(WebDriver driver, String text, String page,
 
     public static void openWebPage(WebDriver driver, String url) {
 
-        driver.get(url);
         try {
+
+            driver.get(url);
+            driver.manage().window().maximize();
             Thread.sleep(Duration.ofSeconds(2));
+
         } catch (InterruptedException e) {
             throw new RuntimeException(e);
         }

From e98158e48af9c27ee4370e8cd7b82d6cbcc512fd Mon Sep 17 00:00:00 2001
From: Nisha Bagdwal <nishabagdwal@gmail.com>
Date: Thu, 6 Jun 2024 16:41:53 -0400
Subject: [PATCH 13/33] HPCC-31857 : Testing content and sorting

Code for testing the content of all the workunits on ECL Workunits page. Wrote code to check the sorting functionality for column WUID.

Signed-off-by: Nisha Bagdwal <nishabagdwal@gmail.com>
---
 .../tests/framework/model/ECLWorkunit.java    |  16 +
 .../framework/pages/ECLWorkUnitsTest.java     | 328 ++++++++++++------
 .../tests/framework/utility/Common.java       |  12 +-
 3 files changed, 248 insertions(+), 108 deletions(-)

diff --git a/esp/src/test-ui/tests/framework/model/ECLWorkunit.java b/esp/src/test-ui/tests/framework/model/ECLWorkunit.java
index 63ac6c8e417..311aa64db9e 100644
--- a/esp/src/test-ui/tests/framework/model/ECLWorkunit.java
+++ b/esp/src/test-ui/tests/framework/model/ECLWorkunit.java
@@ -55,6 +55,22 @@ public class ECLWorkunit {
     @JsonProperty("NoAccess")
     private boolean noAccess;
 
+    public ECLWorkunit(String wuid, String owner, String cluster, String jobname, String state, double executeCost, String totalClusterTime, double fileAccessCost, double compileCost) {
+        this.wuid = wuid;
+        this.owner = owner;
+        this.cluster = cluster;
+        this.jobname = jobname;
+        this.state = state;
+        this.totalClusterTime = totalClusterTime;
+        this.executeCost = executeCost;
+        this.fileAccessCost = fileAccessCost;
+        this.compileCost = compileCost;
+    }
+
+    public ECLWorkunit() {
+
+    }
+
     public String getWuid() {
         return wuid;
     }
diff --git a/esp/src/test-ui/tests/framework/pages/ECLWorkUnitsTest.java b/esp/src/test-ui/tests/framework/pages/ECLWorkUnitsTest.java
index 7d0dcff4923..ee37cda2576 100644
--- a/esp/src/test-ui/tests/framework/pages/ECLWorkUnitsTest.java
+++ b/esp/src/test-ui/tests/framework/pages/ECLWorkUnitsTest.java
@@ -11,10 +11,14 @@
 import org.openqa.selenium.By;
 import org.openqa.selenium.WebDriver;
 import org.openqa.selenium.WebElement;
+import org.openqa.selenium.support.ui.ExpectedConditions;
+import org.openqa.selenium.support.ui.WebDriverWait;
 import org.testng.annotations.Test;
 
 import java.io.File;
+import java.time.Duration;
 import java.util.ArrayList;
+import java.util.Comparator;
 import java.util.List;
 import java.util.logging.Logger;
 
@@ -31,30 +35,131 @@ public void testingECLWorkUnitsPage() {
 
         //testForAllText(driver, logger);
 
-        testWorkUnitContent(driver, logger);
+        List<ECLWorkunit> eclWorkunitsJson = getAllWorkUnitsFromJson(logger);
+
+        if (eclWorkunitsJson != null) {
+            if (testWorkUnitContent(driver, logger, eclWorkunitsJson)) {
+                testTheSortingOrder(driver, logger, eclWorkunitsJson);
+            }
+        }
+    }
+
+    private void testTheSortingOrder(WebDriver driver, Logger logger, List<ECLWorkunit> eclWorkunitsJson) {
+
+        //String[] columnKeys = {"Wuid", "Owner", "Jobname", "Cluster", "State", "TotalClusterTime", "Compile Cost", "Execution Cost", "File Access Cost"};
+
+        String[] columnKeys = {"Wuid"};
+
+        for (String key : columnKeys) {
+            testTheSortingOrderForOneColumn(driver, logger, eclWorkunitsJson, key);
+        }
+    }
+
+    private void testTheSortingOrderForOneColumn(WebDriver driver, Logger logger, List<ECLWorkunit> eclWorkunitsJson, String columnKey) {
+
+        for (int i = 0; i < 3; i++) {
+            WebElement columnHeader = driver.findElement(By.cssSelector("div[data-item-key='" + columnKey + "']"));
+
+            columnHeader.click();
+
+            Common.sleep();
+
+            columnHeader = driver.findElement(By.cssSelector("div[data-item-key='" + columnKey + "']"));
+
+            String currentSortOrder = columnHeader.getAttribute("aria-sort");
+
+            System.out.println("Current sorting order " + i + ": " + currentSortOrder);
+
+            List<ECLWorkunit> eclWorkunitsUI = convertWebElementsToObjects(driver.findElements(By.cssSelector("div[data-list-index]")));
+
+            if (currentSortOrder.equals("ascending")) {
+
+                List<ECLWorkunit> eclWorkunitsJsonSorted = ascendingSortJsonCopy(eclWorkunitsJson, columnKey);
+                if (compareWorkUnits(eclWorkunitsUI, eclWorkunitsJsonSorted, logger)) {
+                    System.out.println("Success: ECL Workunits page: Workunits are correctly sorted in ascending order by: " + columnKey);
+                } else {
+                    String errMsg = "Failure: ECL Workunits page: Workunits are not correctly sorted in ascending order by: " + columnKey;
+                    System.err.println(errMsg);
+                    logger.severe(errMsg);
+                }
+
+            } else if (currentSortOrder.equals("descending")) {
+
+                List<ECLWorkunit> eclWorkunitsJsonSorted = descendingSortJsonCopy(eclWorkunitsJson, columnKey);
+                if (compareWorkUnits(eclWorkunitsUI, eclWorkunitsJsonSorted, logger)) {
+                    System.out.println("Success: ECL Workunits page: Workunits are correctly sorted in descending order by: " + columnKey);
+                } else {
+                    String errMsg = "Failure: ECL Workunits page: Workunits are not correctly sorted in descending order by: " + columnKey;
+                    System.err.println(errMsg);
+                    logger.severe(errMsg);
+                }
+            }
+        }
+    }
+
+    private List<ECLWorkunit> ascendingSortJsonCopy(List<ECLWorkunit> eclWorkunitsJson, String columnKey) {
+
+        List<ECLWorkunit> clonedJsonList = cloneList(eclWorkunitsJson);
+
+        switch (columnKey) {
+
+            case "Wuid":
+                clonedJsonList.sort(Comparator.comparing(ECLWorkunit::getWuid)); //(w1, w2) -> w1.getWuid().compareTo(w2.getWuid())
+                break;
+        }
+
+        return clonedJsonList;
 
     }
 
-    private void testWorkUnitContent(WebDriver driver, Logger logger) {
+    private List<ECLWorkunit> descendingSortJsonCopy(List<ECLWorkunit> eclWorkunitsJson, String columnKey) {
+
+        List<ECLWorkunit> clonedJsonList = cloneList(eclWorkunitsJson);
 
-        List<WebElement> allWorkUnitsUI = getAllWorkUnitsFromUI(driver);
+        switch (columnKey) {
+
+            case "Wuid":
+                clonedJsonList.sort((w1, w2) -> w2.getWuid().compareTo(w1.getWuid()));
+                break;
+        }
 
-        System.out.println("Number of Workunits from UI: " + allWorkUnitsUI.size());
+        return clonedJsonList;
 
-        List<ECLWorkunit> eclWorkunitsUI = convertWebElementsToObjects(allWorkUnitsUI);
+    }
+
+    public static List<ECLWorkunit> cloneList(List<ECLWorkunit> originalList) {
+        List<ECLWorkunit> clonedList = new ArrayList<>();
+        for (ECLWorkunit w : originalList) {
+            clonedList.add(new ECLWorkunit(
+                    w.getWuid(),
+                    w.getOwner(),
+                    w.getCluster(),
+                    w.getJobname(),
+                    w.getState(),
+                    w.getExecuteCost(),
+                    w.getTotalClusterTime(),
+                    w.getFileAccessCost(),
+                    w.getCompileCost()
+            ));
+        }
+        return clonedList;
+    }
 
-        List<ECLWorkunit> eclWorkunitsJson = getAllWorkUnitsFromJson();
+    private boolean testWorkUnitContent(WebDriver driver, Logger logger, List<ECLWorkunit> eclWorkunitsJson) {
 
+        List<ECLWorkunit> eclWorkunitsUI = getAllWorkUnitsFromUI(driver);
+
+        System.out.println("Number of Workunits from UI: " + eclWorkunitsUI.size());
         System.out.println("Number of Workunits from Json: " + eclWorkunitsJson.size());
 
-        compareWorkUnits(eclWorkunitsUI, eclWorkunitsJson, logger);
+        return compareWorkUnits(eclWorkunitsUI, eclWorkunitsJson, logger);
     }
 
     private List<ECLWorkunit> convertWebElementsToObjects(List<WebElement> allWorkUnitsUI) {
 
         List<ECLWorkunit> eclWorkunits = new ArrayList<>();
 
-        for(WebElement element : allWorkUnitsUI){
+        for (WebElement element : allWorkUnitsUI) {
 
             ECLWorkunit eclWorkunit = new ECLWorkunit();
 
@@ -72,9 +177,6 @@ private List<ECLWorkunit> convertWebElementsToObjects(List<WebElement> allWorkUn
             columnWebElement = element.findElement(By.cssSelector("div[data-automation-key=Cluster]"));
             String cluster = columnWebElement.getText();
 
-            columnWebElement = element.findElement(By.cssSelector("div[data-automation-key=RoxieCluster]")); // need to ask for this column, it is empty, no value in json
-            String roxieCluster = columnWebElement.getText();
-
             columnWebElement = element.findElement(By.cssSelector("div[data-automation-key=State]"));
             String state = columnWebElement.getText();
 
@@ -112,40 +214,99 @@ public static double extractDoubleValue(String value) {
         return Double.parseDouble(doubleString);
     }
 
-    private void compareWorkUnits(List<ECLWorkunit> eclWorkunitsUI, List<ECLWorkunit> eclWorkunitsJson, Logger logger) {
-
-//        if(allWorkUnitsUI.size() != eclWorkunitsJson.size()){
-//            String errMsg = "Number of workunits is different on UI and JSON. \nUI Workunits: "+ allWorkUnitsUI.size()+ "\nJSON Workunits: "+eclWorkunitsJson.size()+"\n";
-//            System.err.println(errMsg);
-//            logger.severe(errMsg);
-//        }
-
-        for(int i = 0; i < eclWorkunitsUI.size(); i++){
-
-            if(eclWorkunitsUI.get(i).getWuid().equals(eclWorkunitsJson.get(i).getWuid())){
-
-                if(!eclWorkunitsUI.get(i).getOwner().equals(eclWorkunitsJson.get(i).getOwner())){
-                    String errMsg = "Incorrect Owner in UI for Wuid : "+ eclWorkunitsUI.get(i).getWuid() +" Correct Owner is: " + eclWorkunitsJson.get(i).getOwner();
-                    System.out.println(errMsg);
+    private boolean compareWorkUnits(List<ECLWorkunit> eclWorkunitsUI, List<ECLWorkunit> eclWorkunitsJson, Logger logger) {
+
+        if (eclWorkunitsUI.size() != eclWorkunitsJson.size()) {
+            String errMsg = "Failure: ECL Workunits page: Number of workunits is different on UI and JSON. \nUI Workunits: " + eclWorkunitsUI.size() + "\nJSON Workunits: " + eclWorkunitsJson.size() + "\n";
+            System.err.println(errMsg);
+            logger.severe(errMsg);
+            return false;
+
+        } else {
+            boolean allPass = true;
+            for (int i = 0; i < eclWorkunitsUI.size(); i++) {
+
+                boolean pass = true;
+
+                if (eclWorkunitsUI.get(i).getWuid().equals(eclWorkunitsJson.get(i).getWuid())) {
+
+                    String wuid = eclWorkunitsUI.get(i).getWuid();
+
+                    if (!eclWorkunitsUI.get(i).getOwner().equals(eclWorkunitsJson.get(i).getOwner())) {
+                        String errMsg = "Failure: ECL Workunits page: Incorrect Owner in UI for Wuid : " + wuid + ". Correct Owner is: " + eclWorkunitsJson.get(i).getOwner();
+                        System.out.println(errMsg);
+                        logger.severe(errMsg);
+                        pass = false;
+                    }
+
+                    if (!eclWorkunitsUI.get(i).getCluster().equals(eclWorkunitsJson.get(i).getCluster())) {
+                        String errMsg = "Failure: ECL Workunits page: Incorrect Cluster in UI for Wuid : " + wuid + ". Correct Cluster is: " + eclWorkunitsJson.get(i).getCluster();
+                        System.out.println(errMsg);
+                        logger.severe(errMsg);
+                        pass = false;
+                    }
+
+                    if (!eclWorkunitsUI.get(i).getJobname().equals(eclWorkunitsJson.get(i).getJobname())) {
+                        String errMsg = "Failure: ECL Workunits page: Incorrect Job Name in UI for Wuid : " + wuid + ". Correct Job Name is: " + eclWorkunitsJson.get(i).getJobname();
+                        System.out.println(errMsg);
+                        logger.severe(errMsg);
+                        pass = false;
+                    }
+
+                    if (!eclWorkunitsUI.get(i).getState().equals(eclWorkunitsJson.get(i).getState())) {
+                        String errMsg = "Failure: ECL Workunits page: Incorrect State in UI for Wuid : " + wuid + ". Correct State is: " + eclWorkunitsJson.get(i).getState();
+                        System.out.println(errMsg);
+                        logger.severe(errMsg);
+                        pass = false;
+                    }
+
+                    if (!eclWorkunitsUI.get(i).getTotalClusterTime().equals(eclWorkunitsJson.get(i).getTotalClusterTime())) {
+                        String errMsg = "Failure: ECL Workunits page: Incorrect Total Cluster Time in UI for Wuid : " + wuid + ". Correct Total Cluster Time is: " + eclWorkunitsJson.get(i).getTotalClusterTime();
+                        System.out.println(errMsg);
+                        logger.severe(errMsg);
+                        pass = false;
+                    }
+
+                    if (eclWorkunitsUI.get(i).getCompileCost() != eclWorkunitsJson.get(i).getCompileCost()) {
+                        String errMsg = "Failure: ECL Workunits page: Incorrect Compile Cost in UI for Wuid : " + wuid + ". Correct Compile Cost is: " + eclWorkunitsJson.get(i).getCompileCost();
+                        System.out.println(errMsg);
+                        logger.severe(errMsg);
+                        pass = false;
+                    }
+
+                    if (eclWorkunitsUI.get(i).getExecuteCost() != eclWorkunitsJson.get(i).getExecuteCost()) {
+                        String errMsg = "Failure: ECL Workunits page: Incorrect Execute Cost in UI for Wuid : " + wuid + ". Correct Execute Cost is: " + eclWorkunitsJson.get(i).getExecuteCost();
+                        System.out.println(errMsg);
+                        logger.severe(errMsg);
+                        pass = false;
+                    }
+
+                    if (eclWorkunitsUI.get(i).getFileAccessCost() != eclWorkunitsJson.get(i).getFileAccessCost()) {
+                        String errMsg = "Failure: ECL Workunits page: Incorrect File Access Cost in UI for Wuid : " + wuid + ". Correct File Access Cost is: " + eclWorkunitsJson.get(i).getExecuteCost();
+                        System.out.println(errMsg);
+                        logger.severe(errMsg);
+                        pass = false;
+                    }
+
+                    if (pass) {
+                        System.out.println(i + ". Success: Content test passed for WUID: " + wuid);
+                    } else {
+                        allPass = false;
+                    }
+
+                } else {
+
+                    String errMsg = "Failure: ECL Workunits page: Incorrect Wuid in UI: " + eclWorkunitsUI.get(i).getWuid() + " Correct Wuid is: " + eclWorkunitsJson.get(i).getWuid();
                     logger.severe(errMsg);
-                }
-
-                if(!eclWorkunitsUI.get(i).getCluster().equals(eclWorkunitsJson.get(i).getCluster())){
-                    String errMsg = "Incorrect Cluster in UI for Wuid : "+ eclWorkunitsUI.get(i).getWuid() +" Correct Cluster is: " + eclWorkunitsJson.get(i).getCluster();
                     System.out.println(errMsg);
-                    logger.severe(errMsg);
                 }
-
-            }else{
-
-                String errMsg = "Incorrect Wuid in UI: "+eclWorkunitsUI.get(i).getWuid()+" Correct Wuid is: " + eclWorkunitsJson.get(i).getWuid();
-                logger.severe(errMsg);
-                System.out.println(errMsg);
             }
+
+            return allPass;
         }
     }
 
-    private List<ECLWorkunit> getAllWorkUnitsFromJson() {
+    private List<ECLWorkunit> getAllWorkUnitsFromJson(Logger logger) {
 
         try {
 
@@ -159,76 +320,37 @@ private List<ECLWorkunit> getAllWorkUnitsFromJson() {
 
         } catch (Exception e) {
             System.err.println("Exception: " + e.getMessage());
+            logger.severe("Failure: Exception: " + e.getMessage());
         }
 
+        logger.severe("Failure: Error in JSON Parsing");
         return null;
     }
 
-    private List<WebElement> getAllWorkUnitsFromUI(WebDriver driver) {
-
-        List<WebElement> workunitDivs = driver.findElements(By.cssSelector("div[data-list-index]"));
-
-//        WebElement dropdown = driver.findElement(By.id("pageSize"));
-//
-//        // Click the dropdown to open the options
-//        dropdown.click();
-//
-//        WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
-//
-//        // Wait for the options to be visible
-//        List<WebElement> options = wait.until(ExpectedConditions.visibilityOfAllElementsLocatedBy(By.cssSelector(".ms-Dropdown-item")));
-//
-//        // Loop through the options and select the one with value 1000
-//        for (WebElement option : options) {
-//            if (option.getText().equals("1000")) {
-//                option.click();
-//                break;
-//            }
-//        }
-//
-//        wait.until(ExpectedConditions.invisibilityOfElementLocated(By.cssSelector(".ms-Dropdown-item")));
-//
-//        try {
-//
-//            Thread.sleep(10000);
-//
-//            JavascriptExecutor js = (JavascriptExecutor) driver;
-//
-//            Long lastHeight = (Long) js.executeScript("return document.body.scrollHeight");
-//
-//            System.out.println("last Height: " + lastHeight);
-//
-//            while (true) {
-//
-//                js.executeScript("window.scrollTo(0, document.body.scrollHeight)");
-//
-//                Thread.sleep(10000);
-//
-//                Long newHeight = (Long) js.executeScript("return document.body.scrollHeight");
-//                if (newHeight.equals(lastHeight)) {
-//                    break;
-//                }
-//                lastHeight = newHeight;
-//            }
-//        } catch (InterruptedException e) {
-//            System.err.println(e.getMessage());
-//        }
-//
-//        workunitDivs = driver.findElements(By.cssSelector("div[data-list-index]"));
-//        System.out.println("Updated size: " + workunitDivs.size());
-
-
-//        int targetIndexString = 54;
-//
-//        WebElement workunitDiv = driver.findElement(By.cssSelector("div[data-list-index='" + targetIndexString + "']"));
-//
-//        String column = "Wuid";
-//
-//        WebElement column1 = workunitDiv.findElement(By.cssSelector("div[data-automation-key='" + column + "']"));
-//
-//        System.out.println("Value: " + column1.getText());
-
-        return workunitDivs;
+    private List<ECLWorkunit> getAllWorkUnitsFromUI(WebDriver driver) {
+
+        WebElement dropdown = driver.findElement(By.id("pageSize"));
+
+        dropdown.click();
+
+        WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
+
+        List<WebElement> options = wait.until(ExpectedConditions.visibilityOfAllElementsLocatedBy(By.cssSelector(".ms-Dropdown-item")));
+
+        for (WebElement option : options) {
+            if (option.getText().equals("100")) {
+                option.click();
+                break;
+            }
+        }
+
+        wait.until(ExpectedConditions.invisibilityOfElementLocated(By.cssSelector(".ms-Dropdown-item")));
+
+        driver.navigate().refresh();
+
+        Common.sleep();
+
+        return convertWebElementsToObjects(driver.findElements(By.cssSelector("div[data-list-index]")));
     }
 
     private void testForAllText(WebDriver driver, Logger logger) {
diff --git a/esp/src/test-ui/tests/framework/utility/Common.java b/esp/src/test-ui/tests/framework/utility/Common.java
index 38793ba6785..ff2a6975a9a 100644
--- a/esp/src/test-ui/tests/framework/utility/Common.java
+++ b/esp/src/test-ui/tests/framework/utility/Common.java
@@ -34,12 +34,14 @@ public static void checkTextPresent(WebDriver driver, String text, String page,
 
     public static void openWebPage(WebDriver driver, String url) {
 
-        try {
-
-            driver.get(url);
-            driver.manage().window().maximize();
-            Thread.sleep(Duration.ofSeconds(2));
+        driver.get(url);
+        driver.manage().window().maximize();
+        sleep();
+    }
 
+    public static void sleep() {
+        try {
+            Thread.sleep(Duration.ofSeconds(4));
         } catch (InterruptedException e) {
             throw new RuntimeException(e);
         }

From 36c581f4549f826a46f356d75aec6f39ae346bde Mon Sep 17 00:00:00 2001
From: Nisha Bagdwal <nishabagdwal@gmail.com>
Date: Thu, 6 Jun 2024 23:00:16 -0400
Subject: [PATCH 14/33] HPCC-31857 : Testing content and sorting

Code for testing the content of all the workunits on ECL Workunits page. Wrote code to check the sorting functionality for column WUID.

Signed-off-by: Nisha Bagdwal <nishabagdwal@gmail.com>
---
 .../framework/pages/ECLWorkUnitsTest.java     | 44 ++++---------------
 1 file changed, 8 insertions(+), 36 deletions(-)

diff --git a/esp/src/test-ui/tests/framework/pages/ECLWorkUnitsTest.java b/esp/src/test-ui/tests/framework/pages/ECLWorkUnitsTest.java
index ee37cda2576..fdf18b3cf67 100644
--- a/esp/src/test-ui/tests/framework/pages/ECLWorkUnitsTest.java
+++ b/esp/src/test-ui/tests/framework/pages/ECLWorkUnitsTest.java
@@ -74,8 +74,8 @@ private void testTheSortingOrderForOneColumn(WebDriver driver, Logger logger, Li
 
             if (currentSortOrder.equals("ascending")) {
 
-                List<ECLWorkunit> eclWorkunitsJsonSorted = ascendingSortJsonCopy(eclWorkunitsJson, columnKey);
-                if (compareWorkUnits(eclWorkunitsUI, eclWorkunitsJsonSorted, logger)) {
+                ascendingSortJson(eclWorkunitsJson, columnKey);
+                if (compareWorkUnits(eclWorkunitsUI, eclWorkunitsJson, logger)) {
                     System.out.println("Success: ECL Workunits page: Workunits are correctly sorted in ascending order by: " + columnKey);
                 } else {
                     String errMsg = "Failure: ECL Workunits page: Workunits are not correctly sorted in ascending order by: " + columnKey;
@@ -85,8 +85,8 @@ private void testTheSortingOrderForOneColumn(WebDriver driver, Logger logger, Li
 
             } else if (currentSortOrder.equals("descending")) {
 
-                List<ECLWorkunit> eclWorkunitsJsonSorted = descendingSortJsonCopy(eclWorkunitsJson, columnKey);
-                if (compareWorkUnits(eclWorkunitsUI, eclWorkunitsJsonSorted, logger)) {
+                descendingSortJson(eclWorkunitsJson, columnKey);
+                if (compareWorkUnits(eclWorkunitsUI, eclWorkunitsJson, logger)) {
                     System.out.println("Success: ECL Workunits page: Workunits are correctly sorted in descending order by: " + columnKey);
                 } else {
                     String errMsg = "Failure: ECL Workunits page: Workunits are not correctly sorted in descending order by: " + columnKey;
@@ -97,52 +97,24 @@ private void testTheSortingOrderForOneColumn(WebDriver driver, Logger logger, Li
         }
     }
 
-    private List<ECLWorkunit> ascendingSortJsonCopy(List<ECLWorkunit> eclWorkunitsJson, String columnKey) {
-
-        List<ECLWorkunit> clonedJsonList = cloneList(eclWorkunitsJson);
+    private void ascendingSortJson(List<ECLWorkunit> eclWorkunitsJson, String columnKey) {
 
         switch (columnKey) {
 
             case "Wuid":
-                clonedJsonList.sort(Comparator.comparing(ECLWorkunit::getWuid)); //(w1, w2) -> w1.getWuid().compareTo(w2.getWuid())
+                eclWorkunitsJson.sort(Comparator.comparing(ECLWorkunit::getWuid)); //(w1, w2) -> w1.getWuid().compareTo(w2.getWuid())
                 break;
         }
-
-        return clonedJsonList;
-
     }
 
-    private List<ECLWorkunit> descendingSortJsonCopy(List<ECLWorkunit> eclWorkunitsJson, String columnKey) {
-
-        List<ECLWorkunit> clonedJsonList = cloneList(eclWorkunitsJson);
+    private void descendingSortJson(List<ECLWorkunit> eclWorkunitsJson, String columnKey) {
 
         switch (columnKey) {
 
             case "Wuid":
-                clonedJsonList.sort((w1, w2) -> w2.getWuid().compareTo(w1.getWuid()));
+                eclWorkunitsJson.sort((w1, w2) -> w2.getWuid().compareTo(w1.getWuid()));
                 break;
         }
-
-        return clonedJsonList;
-
-    }
-
-    public static List<ECLWorkunit> cloneList(List<ECLWorkunit> originalList) {
-        List<ECLWorkunit> clonedList = new ArrayList<>();
-        for (ECLWorkunit w : originalList) {
-            clonedList.add(new ECLWorkunit(
-                    w.getWuid(),
-                    w.getOwner(),
-                    w.getCluster(),
-                    w.getJobname(),
-                    w.getState(),
-                    w.getExecuteCost(),
-                    w.getTotalClusterTime(),
-                    w.getFileAccessCost(),
-                    w.getCompileCost()
-            ));
-        }
-        return clonedList;
     }
 
     private boolean testWorkUnitContent(WebDriver driver, Logger logger, List<ECLWorkunit> eclWorkunitsJson) {

From a39f4f5945833f6e6993a6a60b0c32772c9cf93f Mon Sep 17 00:00:00 2001
From: Nisha Bagdwal <nishabagdwal@gmail.com>
Date: Thu, 6 Jun 2024 23:04:55 -0400
Subject: [PATCH 15/33] HPCC-31857 : Testing content and sorting

Wrote code to check the sorting functionality for column WUID.

Signed-off-by: Nisha Bagdwal <nishabagdwal@gmail.com>
---
 .../test-ui/tests/framework/pages/ECLWorkUnitsTest.java   | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/esp/src/test-ui/tests/framework/pages/ECLWorkUnitsTest.java b/esp/src/test-ui/tests/framework/pages/ECLWorkUnitsTest.java
index fdf18b3cf67..71bc5266fb5 100644
--- a/esp/src/test-ui/tests/framework/pages/ECLWorkUnitsTest.java
+++ b/esp/src/test-ui/tests/framework/pages/ECLWorkUnitsTest.java
@@ -260,9 +260,7 @@ private boolean compareWorkUnits(List<ECLWorkunit> eclWorkunitsUI, List<ECLWorku
                         pass = false;
                     }
 
-                    if (pass) {
-                        System.out.println(i + ". Success: Content test passed for WUID: " + wuid);
-                    } else {
+                    if (!pass) {
                         allPass = false;
                     }
 
@@ -274,6 +272,10 @@ private boolean compareWorkUnits(List<ECLWorkunit> eclWorkunitsUI, List<ECLWorku
                 }
             }
 
+            if(allPass){
+                System.out.println("Success: ECL Workunits page: All workunits content test passed.");
+            }
+
             return allPass;
         }
     }

From b07bc756f4a08799873aa900eaa30467cd4e3d38 Mon Sep 17 00:00:00 2001
From: Nisha Bagdwal <nishabagdwal@gmail.com>
Date: Fri, 7 Jun 2024 15:23:20 -0400
Subject: [PATCH 16/33] HPCC-31857 : Testing sorting ECL Workunits

Implemented the sorting logic for all the columns.

Signed-off-by: Nisha Bagdwal <nishabagdwal@gmail.com>
---
 .../framework/pages/ECLWorkUnitsTest.java     | 105 ++++++++++++++----
 1 file changed, 81 insertions(+), 24 deletions(-)

diff --git a/esp/src/test-ui/tests/framework/pages/ECLWorkUnitsTest.java b/esp/src/test-ui/tests/framework/pages/ECLWorkUnitsTest.java
index 71bc5266fb5..eb61c1c9ad7 100644
--- a/esp/src/test-ui/tests/framework/pages/ECLWorkUnitsTest.java
+++ b/esp/src/test-ui/tests/framework/pages/ECLWorkUnitsTest.java
@@ -48,7 +48,7 @@ private void testTheSortingOrder(WebDriver driver, Logger logger, List<ECLWorkun
 
         //String[] columnKeys = {"Wuid", "Owner", "Jobname", "Cluster", "State", "TotalClusterTime", "Compile Cost", "Execution Cost", "File Access Cost"};
 
-        String[] columnKeys = {"Wuid"};
+        String[] columnKeys = {"Owner"};
 
         for (String key : columnKeys) {
             testTheSortingOrderForOneColumn(driver, logger, eclWorkunitsJson, key);
@@ -69,30 +69,22 @@ private void testTheSortingOrderForOneColumn(WebDriver driver, Logger logger, Li
             String currentSortOrder = columnHeader.getAttribute("aria-sort");
 
             System.out.println("Current sorting order " + i + ": " + currentSortOrder);
+            System.out.println("Current column name " + i + ": " + columnKey);
 
             List<ECLWorkunit> eclWorkunitsUI = convertWebElementsToObjects(driver.findElements(By.cssSelector("div[data-list-index]")));
 
-            if (currentSortOrder.equals("ascending")) {
-
-                ascendingSortJson(eclWorkunitsJson, columnKey);
-                if (compareWorkUnits(eclWorkunitsUI, eclWorkunitsJson, logger)) {
-                    System.out.println("Success: ECL Workunits page: Workunits are correctly sorted in ascending order by: " + columnKey);
-                } else {
-                    String errMsg = "Failure: ECL Workunits page: Workunits are not correctly sorted in ascending order by: " + columnKey;
-                    System.err.println(errMsg);
-                    logger.severe(errMsg);
-                }
-
-            } else if (currentSortOrder.equals("descending")) {
+            switch (currentSortOrder) {
+                case "ascending" -> ascendingSortJson(eclWorkunitsJson, columnKey);
+                case "descending" -> descendingSortJson(eclWorkunitsJson, columnKey);
+                case "none" -> descendingSortJson(eclWorkunitsJson, "Wuid");
+            }
 
-                descendingSortJson(eclWorkunitsJson, columnKey);
-                if (compareWorkUnits(eclWorkunitsUI, eclWorkunitsJson, logger)) {
-                    System.out.println("Success: ECL Workunits page: Workunits are correctly sorted in descending order by: " + columnKey);
-                } else {
-                    String errMsg = "Failure: ECL Workunits page: Workunits are not correctly sorted in descending order by: " + columnKey;
-                    System.err.println(errMsg);
-                    logger.severe(errMsg);
-                }
+            if (compareWorkUnits(eclWorkunitsUI, eclWorkunitsJson, logger)) {
+                System.out.println("Success: ECL Workunits page: Workunits are correctly sorted in " + currentSortOrder + " order by: " + columnKey);
+            } else {
+                String errMsg = "Failure: ECL Workunits page: Workunits are not correctly sorted in " + currentSortOrder + " order by: " + columnKey;
+                System.err.println(errMsg);
+                logger.severe(errMsg);
             }
         }
     }
@@ -104,6 +96,38 @@ private void ascendingSortJson(List<ECLWorkunit> eclWorkunitsJson, String column
             case "Wuid":
                 eclWorkunitsJson.sort(Comparator.comparing(ECLWorkunit::getWuid)); //(w1, w2) -> w1.getWuid().compareTo(w2.getWuid())
                 break;
+
+            case "Owner":
+                eclWorkunitsJson.sort(Comparator.comparing(ECLWorkunit::getOwner));
+                break;
+
+            case "Jobname":
+                eclWorkunitsJson.sort(Comparator.comparing(ECLWorkunit::getJobname));
+                break;
+
+            case "Cluster":
+                eclWorkunitsJson.sort(Comparator.comparing(ECLWorkunit::getCluster));
+                break;
+
+            case "State":
+                eclWorkunitsJson.sort(Comparator.comparing(ECLWorkunit::getState));
+                break;
+
+            case "TotalClusterTime":
+                eclWorkunitsJson.sort(Comparator.comparing(ECLWorkunit::getTotalClusterTime));
+                break;
+
+            case "Compile Cost":
+                eclWorkunitsJson.sort(Comparator.comparing(ECLWorkunit::getCompileCost));
+                break;
+
+            case "Execution Cost":
+                eclWorkunitsJson.sort(Comparator.comparing(ECLWorkunit::getExecuteCost));
+                break;
+
+            case "File Access Cost":
+                eclWorkunitsJson.sort(Comparator.comparing(ECLWorkunit::getFileAccessCost));
+                break;
         }
     }
 
@@ -112,7 +136,39 @@ private void descendingSortJson(List<ECLWorkunit> eclWorkunitsJson, String colum
         switch (columnKey) {
 
             case "Wuid":
-                eclWorkunitsJson.sort((w1, w2) -> w2.getWuid().compareTo(w1.getWuid()));
+                eclWorkunitsJson.sort(Comparator.comparing(ECLWorkunit::getWuid).reversed());
+                break;
+
+            case "Owner":
+                eclWorkunitsJson.sort(Comparator.comparing(ECLWorkunit::getOwner).reversed());
+                break;
+
+            case "Jobname":
+                eclWorkunitsJson.sort(Comparator.comparing(ECLWorkunit::getJobname).reversed());
+                break;
+
+            case "Cluster":
+                eclWorkunitsJson.sort(Comparator.comparing(ECLWorkunit::getCluster).reversed());
+                break;
+
+            case "State":
+                eclWorkunitsJson.sort(Comparator.comparing(ECLWorkunit::getState).reversed());
+                break;
+
+            case "TotalClusterTime":
+                eclWorkunitsJson.sort(Comparator.comparing(ECLWorkunit::getTotalClusterTime).reversed());
+                break;
+
+            case "Compile Cost":
+                eclWorkunitsJson.sort(Comparator.comparing(ECLWorkunit::getCompileCost).reversed());
+                break;
+
+            case "Execution Cost":
+                eclWorkunitsJson.sort(Comparator.comparing(ECLWorkunit::getExecuteCost).reversed());
+                break;
+
+            case "File Access Cost":
+                eclWorkunitsJson.sort(Comparator.comparing(ECLWorkunit::getFileAccessCost).reversed());
                 break;
         }
     }
@@ -268,11 +324,12 @@ private boolean compareWorkUnits(List<ECLWorkunit> eclWorkunitsUI, List<ECLWorku
 
                     String errMsg = "Failure: ECL Workunits page: Incorrect Wuid in UI: " + eclWorkunitsUI.get(i).getWuid() + " Correct Wuid is: " + eclWorkunitsJson.get(i).getWuid();
                     logger.severe(errMsg);
-                    System.out.println(errMsg);
+                    System.err.println(errMsg);
+                    allPass = false;
                 }
             }
 
-            if(allPass){
+            if (allPass) {
                 System.out.println("Success: ECL Workunits page: All workunits content test passed.");
             }
 

From 7fc52f1d5abdb65c0fc7df72a81f6484d411d673 Mon Sep 17 00:00:00 2001
From: Nisha Bagdwal <nishabagdwal@gmail.com>
Date: Mon, 10 Jun 2024 09:20:18 -0400
Subject: [PATCH 17/33] HPCC-31857 : Reverting the changes of Activities.java

Signed-off-by: Nisha Bagdwal <nishabagdwal@gmail.com>
---
 esp/src/test-ui/tests/Activities.java | 29 ++++++++++++++++-----------
 1 file changed, 17 insertions(+), 12 deletions(-)

diff --git a/esp/src/test-ui/tests/Activities.java b/esp/src/test-ui/tests/Activities.java
index 9886025fafd..d160ae8f60c 100644
--- a/esp/src/test-ui/tests/Activities.java
+++ b/esp/src/test-ui/tests/Activities.java
@@ -1,10 +1,15 @@
+import java.io.IOException;
+
 import org.openqa.selenium.WebDriver;
-import org.openqa.selenium.chrome.ChromeDriver;
 import org.openqa.selenium.chrome.ChromeOptions;
+import org.openqa.selenium.chrome.ChromeDriver;
+import org.openqa.selenium.Capabilities;
+import org.openqa.selenium.remote.RemoteWebDriver;
+import org.testng.annotations.Test;
 
 public class Activities {
 
-    public static void main(String[] args) throws InterruptedException {
+    public static void main(String[] args) throws IOException, InterruptedException {
         System.setProperty("webdriver.chrome.silentOutput", "true");
         System.setProperty("webdriver.chrome.driver", "/usr/bin/chromedriver");
         // java.util.logging.Logger.getLogger("org.openqa.selenium").setLevel(Level.OFF);
@@ -16,10 +21,10 @@ public static void main(String[] args) throws InterruptedException {
 
         WebDriver driver = new ChromeDriver(chromeOptions);
 
-        //Capabilities caps = ((RemoteWebDriver) driver).getCapabilities();
+        Capabilities caps = ((RemoteWebDriver) driver).getCapabilities();
 
-        //String browserName = caps.getBrowserName();
-        //String browserVersion = caps.getVersion();
+        String browserName = caps.getBrowserName();
+        String browserVersion = caps.getVersion();
         // System.out.println(browserName+" "+browserVersion);
 
         driver.get(args[0]);
@@ -27,21 +32,21 @@ public static void main(String[] args) throws InterruptedException {
         Thread.sleep(1000);
 
         if (driver.getPageSource().contains("Job Name")) {
-            System.out.println("Pass");
+                System.out.println("Pass");
         } else {
-            System.err.println("Fail");
+                System.err.println("Fail");
         }
         if (driver.getPageSource().contains("Owner")) {
-            System.out.println("Pass");
+                System.out.println("Pass");
         } else {
-            System.err.println("Fail");
+                System.err.println("Fail");
         }
         if (driver.getPageSource().contains("Target/Wuid")) {
-            System.out.println("Pass");
+                System.out.println("Pass");
         } else {
-            System.err.println("Fail");
+                System.err.println("Fail");
         }
 
         driver.quit();
     }
-}
\ No newline at end of file
+}

From b42b5eb72cbdf7f5eeaeb22c739d7d689c3fc377 Mon Sep 17 00:00:00 2001
From: Nisha Bagdwal <nishabagdwal@gmail.com>
Date: Mon, 10 Jun 2024 13:23:28 -0400
Subject: [PATCH 18/33] HPCC-31857 : Sorting functionality test cases

Signed-off-by: Nisha Bagdwal <nishabagdwal@gmail.com>
---
 .../framework/model/ApplicationValue.java     |  24 --
 .../framework/model/ApplicationValues.java    |   8 -
 .../tests/framework/model/ECLWorkunit.java    | 153 +--------
 .../tests/framework/model/TestClass.java      |   4 -
 .../framework/model/WUQueryResponse.java      | 117 -------
 .../tests/framework/model/WUQueryRoot.java    |   4 -
 .../tests/framework/model/Workunits.java      |   4 -
 .../framework/pages/ECLWorkUnitsTest.java     | 295 ++++++++----------
 .../tests/framework/utility/TimeUtils.java    |  20 ++
 9 files changed, 155 insertions(+), 474 deletions(-)
 create mode 100644 esp/src/test-ui/tests/framework/utility/TimeUtils.java

diff --git a/esp/src/test-ui/tests/framework/model/ApplicationValue.java b/esp/src/test-ui/tests/framework/model/ApplicationValue.java
index 1d84fb03f0e..67f87f1da0a 100644
--- a/esp/src/test-ui/tests/framework/model/ApplicationValue.java
+++ b/esp/src/test-ui/tests/framework/model/ApplicationValue.java
@@ -12,28 +12,4 @@ public class ApplicationValue {
 
     @JsonProperty("Value")
     private String value;
-
-    public String getApplication() {
-        return application;
-    }
-
-    public void setApplication(String application) {
-        this.application = application;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public String getValue() {
-        return value;
-    }
-
-    public void setValue(String value) {
-        this.value = value;
-    }
 }
diff --git a/esp/src/test-ui/tests/framework/model/ApplicationValues.java b/esp/src/test-ui/tests/framework/model/ApplicationValues.java
index 4f65fb761ce..d7a1425d1e3 100644
--- a/esp/src/test-ui/tests/framework/model/ApplicationValues.java
+++ b/esp/src/test-ui/tests/framework/model/ApplicationValues.java
@@ -8,12 +8,4 @@ public class ApplicationValues {
 
     @JsonProperty("ApplicationValue")
     private List<ApplicationValue> applicationValue;
-
-    public List<ApplicationValue> getApplicationValue() {
-        return applicationValue;
-    }
-
-    public void setApplicationValue(List<ApplicationValue> applicationValue) {
-        this.applicationValue = applicationValue;
-    }
 }
diff --git a/esp/src/test-ui/tests/framework/model/ECLWorkunit.java b/esp/src/test-ui/tests/framework/model/ECLWorkunit.java
index 311aa64db9e..c789250992b 100644
--- a/esp/src/test-ui/tests/framework/model/ECLWorkunit.java
+++ b/esp/src/test-ui/tests/framework/model/ECLWorkunit.java
@@ -1,12 +1,13 @@
 package framework.model;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonSetter;
+import framework.utility.TimeUtils;
 
 public class ECLWorkunit {
 
     @JsonProperty("Wuid")
     private String wuid;
-    private String href;
     @JsonProperty("Owner")
     private String owner;
 
@@ -38,7 +39,7 @@ public class ECLWorkunit {
     private boolean thorLCR;
 
     @JsonProperty("TotalClusterTime")
-    private String totalClusterTime;
+    private double totalClusterTime;
 
     @JsonProperty("ApplicationValues")
     private ApplicationValues applicationValues;
@@ -55,187 +56,45 @@ public class ECLWorkunit {
     @JsonProperty("NoAccess")
     private boolean noAccess;
 
-    public ECLWorkunit(String wuid, String owner, String cluster, String jobname, String state, double executeCost, String totalClusterTime, double fileAccessCost, double compileCost) {
-        this.wuid = wuid;
-        this.owner = owner;
-        this.cluster = cluster;
-        this.jobname = jobname;
-        this.state = state;
-        this.totalClusterTime = totalClusterTime;
-        this.executeCost = executeCost;
-        this.fileAccessCost = fileAccessCost;
-        this.compileCost = compileCost;
-    }
-
-    public ECLWorkunit() {
-
-    }
-
     public String getWuid() {
         return wuid;
     }
 
-    public void setWuid(String wuid) {
-        this.wuid = wuid;
-    }
-
-    public String getHref() {
-        return href;
-    }
-
-    public void setHref(String href) {
-        this.href = href;
-    }
-
     public String getOwner() {
         return owner;
     }
 
-    public void setOwner(String owner) {
-        this.owner = owner;
-    }
-
     public String getCluster() {
         return cluster;
     }
 
-    public void setCluster(String cluster) {
-        this.cluster = cluster;
-    }
-
     public String getJobname() {
         return jobname;
     }
 
-    public void setJobname(String jobname) {
-        this.jobname = jobname;
-    }
-
-    public int getStateID() {
-        return stateID;
-    }
-
-    public void setStateID(int stateID) {
-        this.stateID = stateID;
-    }
-
     public String getState() {
         return state;
     }
 
-    public void setState(String state) {
-        this.state = state;
-    }
-
-    public boolean isProtected() {
-        return isProtected;
-    }
-
-    public void setProtected(boolean aProtected) {
-        isProtected = aProtected;
-    }
-
-    public int getAction() {
-        return action;
-    }
-
-    public void setAction(int action) {
-        this.action = action;
-    }
-
-    public String getActionEx() {
-        return actionEx;
-    }
-
-    public void setActionEx(String actionEx) {
-        this.actionEx = actionEx;
-    }
-
-    public boolean isPausing() {
-        return isPausing;
-    }
-
-    public void setPausing(boolean pausing) {
-        isPausing = pausing;
-    }
-
-    public boolean isThorLCR() {
-        return thorLCR;
-    }
-
-    public void setThorLCR(boolean thorLCR) {
-        this.thorLCR = thorLCR;
-    }
-
-    public String getTotalClusterTime() {
+    public double getTotalClusterTime() {
         return totalClusterTime;
     }
 
+    @JsonSetter("TotalClusterTime")
     public void setTotalClusterTime(String totalClusterTime) {
-        this.totalClusterTime = totalClusterTime;
-    }
-
-    public ApplicationValues getApplicationValues() {
-        return applicationValues;
-    }
-
-    public void setApplicationValues(ApplicationValues applicationValues) {
-        this.applicationValues = applicationValues;
+        this.totalClusterTime = TimeUtils.convertToDouble(totalClusterTime);
     }
 
     public double getExecuteCost() {
         return executeCost;
     }
 
-    public void setExecuteCost(double executeCost) {
-        this.executeCost = executeCost;
-    }
-
     public double getFileAccessCost() {
         return fileAccessCost;
     }
 
-    public void setFileAccessCost(double fileAccessCost) {
-        this.fileAccessCost = fileAccessCost;
-    }
-
     public double getCompileCost() {
         return compileCost;
     }
 
-    public void setCompileCost(double compileCost) {
-        this.compileCost = compileCost;
-    }
-
-    public boolean isNoAccess() {
-        return noAccess;
-    }
-
-    public void setNoAccess(boolean noAccess) {
-        this.noAccess = noAccess;
-    }
-
-    @Override
-    public String toString() {
-        return "ECLWorkunit{" +
-                "wuid='" + wuid + '\'' +
-                ", href='" + href + '\'' +
-                ", owner='" + owner + '\'' +
-                ", cluster='" + cluster + '\'' +
-                ", jobname='" + jobname + '\'' +
-                ", stateID=" + stateID +
-                ", state='" + state + '\'' +
-                ", isProtected=" + isProtected +
-                ", action=" + action +
-                ", actionEx='" + actionEx + '\'' +
-                ", isPausing=" + isPausing +
-                ", thorLCR=" + thorLCR +
-                ", totalClusterTime='" + totalClusterTime + '\'' +
-                ", applicationValues=" + applicationValues +
-                ", executeCost=" + executeCost +
-                ", fileAccessCost=" + fileAccessCost +
-                ", compileCost=" + compileCost +
-                ", noAccess=" + noAccess +
-                '}';
-    }
 }
diff --git a/esp/src/test-ui/tests/framework/model/TestClass.java b/esp/src/test-ui/tests/framework/model/TestClass.java
index 9ac5bf9b58b..240cdd98a90 100644
--- a/esp/src/test-ui/tests/framework/model/TestClass.java
+++ b/esp/src/test-ui/tests/framework/model/TestClass.java
@@ -10,10 +10,6 @@ public TestClass(String name, String path) {
         this.path = path;
     }
 
-    public String getName() {
-        return name;
-    }
-
     public String getPath() {
         return path;
     }
diff --git a/esp/src/test-ui/tests/framework/model/WUQueryResponse.java b/esp/src/test-ui/tests/framework/model/WUQueryResponse.java
index 5186b89535d..eb1a9aa3a7d 100644
--- a/esp/src/test-ui/tests/framework/model/WUQueryResponse.java
+++ b/esp/src/test-ui/tests/framework/model/WUQueryResponse.java
@@ -49,124 +49,7 @@ public class WUQueryResponse {
     @JsonProperty("Workunits")
     private Workunits workunits;
 
-    // getters and setters
-    public String getType() {
-        return type;
-    }
-
-    public void setType(String type) {
-        this.type = type;
-    }
-
-    public String getLogicalFileSearchType() {
-        return logicalFileSearchType;
-    }
-
-    public void setLogicalFileSearchType(String logicalFileSearchType) {
-        this.logicalFileSearchType = logicalFileSearchType;
-    }
-
-    public int getCount() {
-        return count;
-    }
-
-    public void setCount(int count) {
-        this.count = count;
-    }
-
-    public int getPageSize() {
-        return pageSize;
-    }
-
-    public void setPageSize(int pageSize) {
-        this.pageSize = pageSize;
-    }
-
-    public int getNextPage() {
-        return nextPage;
-    }
-
-    public void setNextPage(int nextPage) {
-        this.nextPage = nextPage;
-    }
-
-    public int getLastPage() {
-        return lastPage;
-    }
-
-    public void setLastPage(int lastPage) {
-        this.lastPage = lastPage;
-    }
-
-    public int getNumWUs() {
-        return numWUs;
-    }
-
-    public void setNumWUs(int numWUs) {
-        this.numWUs = numWUs;
-    }
-
-    public boolean isFirst() {
-        return first;
-    }
-
-    public void setFirst(boolean first) {
-        this.first = first;
-    }
-
-    public int getPageStartFrom() {
-        return pageStartFrom;
-    }
-
-    public void setPageStartFrom(int pageStartFrom) {
-        this.pageStartFrom = pageStartFrom;
-    }
-
-    public int getPageEndAt() {
-        return pageEndAt;
-    }
-
-    public void setPageEndAt(int pageEndAt) {
-        this.pageEndAt = pageEndAt;
-    }
-
-    public boolean isDescending() {
-        return descending;
-    }
-
-    public void setDescending(boolean descending) {
-        this.descending = descending;
-    }
-
-    public String getBasicQuery() {
-        return basicQuery;
-    }
-
-    public void setBasicQuery(String basicQuery) {
-        this.basicQuery = basicQuery;
-    }
-
-    public String getFilters() {
-        return filters;
-    }
-
-    public void setFilters(String filters) {
-        this.filters = filters;
-    }
-
-    public long getCacheHint() {
-        return cacheHint;
-    }
-
-    public void setCacheHint(long cacheHint) {
-        this.cacheHint = cacheHint;
-    }
-
     public Workunits getWorkunits() {
         return workunits;
     }
-
-    public void setWorkunits(Workunits workunits) {
-        this.workunits = workunits;
-    }
 }
diff --git a/esp/src/test-ui/tests/framework/model/WUQueryRoot.java b/esp/src/test-ui/tests/framework/model/WUQueryRoot.java
index 24f20797392..c5a1c54993d 100644
--- a/esp/src/test-ui/tests/framework/model/WUQueryRoot.java
+++ b/esp/src/test-ui/tests/framework/model/WUQueryRoot.java
@@ -9,8 +9,4 @@ public class WUQueryRoot {
     public WUQueryResponse getWUQueryResponse() {
         return wuQueryResponse;
     }
-
-    public void setWUQueryResponse(WUQueryResponse wuQueryResponse) {
-        this.wuQueryResponse = wuQueryResponse;
-    }
 }
diff --git a/esp/src/test-ui/tests/framework/model/Workunits.java b/esp/src/test-ui/tests/framework/model/Workunits.java
index 7bbed424429..d52b00c5682 100644
--- a/esp/src/test-ui/tests/framework/model/Workunits.java
+++ b/esp/src/test-ui/tests/framework/model/Workunits.java
@@ -12,8 +12,4 @@ public class Workunits {
     public List<ECLWorkunit> getECLWorkunit() {
         return eclWorkunit;
     }
-
-    public void setECLWorkunit(List<ECLWorkunit> eclWorkunit) {
-        this.eclWorkunit = eclWorkunit;
-    }
 }
diff --git a/esp/src/test-ui/tests/framework/pages/ECLWorkUnitsTest.java b/esp/src/test-ui/tests/framework/pages/ECLWorkUnitsTest.java
index eb61c1c9ad7..0c1dd6c21f5 100644
--- a/esp/src/test-ui/tests/framework/pages/ECLWorkUnitsTest.java
+++ b/esp/src/test-ui/tests/framework/pages/ECLWorkUnitsTest.java
@@ -8,6 +8,7 @@
 import framework.setup.LoggerHolder;
 import framework.setup.WebDriverHolder;
 import framework.utility.Common;
+import framework.utility.TimeUtils;
 import org.openqa.selenium.By;
 import org.openqa.selenium.WebDriver;
 import org.openqa.selenium.WebElement;
@@ -18,14 +19,19 @@
 import java.io.File;
 import java.time.Duration;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Comparator;
 import java.util.List;
 import java.util.logging.Logger;
 
 public class ECLWorkUnitsTest {
 
-    static final String[] textArray = {"WUID", "Owner", "Job Name", "Cluster", "Roxie Cluster", "State", "Total Cluster Time",
-            "Compile Cost", "Execution Cost", "File Access Cost"};
+    static final String[] columnNames = {"WUID", "Owner", "Job Name", "Cluster", "State", "Total Cluster Time", "Compile Cost", "Execution Cost", "File Access Cost"};
+    static final String[] columnKeys = {"Wuid", "Owner", "Jobname", "Cluster", "State", "TotalClusterTime", "Compile Cost", "Execution Cost", "File Access Cost"};
+    List<String> costColumns = Arrays.asList("Compile Cost", "Execution Cost", "File Access Cost");
+    static final String uniqueKeyName = "WUID";
+    static final String uniqueKey = "Wuid";
+    static final String pageName = "ECL Workunits";
 
     @Test
     public void testingECLWorkUnitsPage() {
@@ -33,29 +39,27 @@ public void testingECLWorkUnitsPage() {
         Common.openWebPage(driver, Common.getUrl(Config.ECL_WORK_UNITS_URL));
         Logger logger = LoggerHolder.getLogger();
 
-        //testForAllText(driver, logger);
+        testForAllText(driver, logger);
+        testTheSortingOrder(driver, logger);
+    }
+
+    private void testTheSortingOrder(WebDriver driver, Logger logger) {
 
         List<ECLWorkunit> eclWorkunitsJson = getAllWorkUnitsFromJson(logger);
 
         if (eclWorkunitsJson != null) {
-            if (testWorkUnitContent(driver, logger, eclWorkunitsJson)) {
-                testTheSortingOrder(driver, logger, eclWorkunitsJson);
-            }
-        }
-    }
-
-    private void testTheSortingOrder(WebDriver driver, Logger logger, List<ECLWorkunit> eclWorkunitsJson) {
-
-        //String[] columnKeys = {"Wuid", "Owner", "Jobname", "Cluster", "State", "TotalClusterTime", "Compile Cost", "Execution Cost", "File Access Cost"};
 
-        String[] columnKeys = {"Owner"};
+            clickDropdown(driver);
 
-        for (String key : columnKeys) {
-            testTheSortingOrderForOneColumn(driver, logger, eclWorkunitsJson, key);
+            if (testTableContent(driver, logger, eclWorkunitsJson)) {
+                for (int i = 0; i < columnKeys.length; i++) {
+                    testTheSortingOrderForOneColumn(driver, logger, eclWorkunitsJson, columnKeys[i], columnNames[i]);
+                }
+            }
         }
     }
 
-    private void testTheSortingOrderForOneColumn(WebDriver driver, Logger logger, List<ECLWorkunit> eclWorkunitsJson, String columnKey) {
+    private void testTheSortingOrderForOneColumn(WebDriver driver, Logger logger, List<ECLWorkunit> eclWorkunitsJson, String columnKey, String columnName) {
 
         for (int i = 0; i < 3; i++) {
             WebElement columnHeader = driver.findElement(By.cssSelector("div[data-item-key='" + columnKey + "']"));
@@ -71,24 +75,87 @@ private void testTheSortingOrderForOneColumn(WebDriver driver, Logger logger, Li
             System.out.println("Current sorting order " + i + ": " + currentSortOrder);
             System.out.println("Current column name " + i + ": " + columnKey);
 
-            List<ECLWorkunit> eclWorkunitsUI = convertWebElementsToObjects(driver.findElements(By.cssSelector("div[data-list-index]")));
+            List<Object> columnDataFromUI = getDataFromUIUsingColumnKey(driver, columnKey);
 
             switch (currentSortOrder) {
                 case "ascending" -> ascendingSortJson(eclWorkunitsJson, columnKey);
                 case "descending" -> descendingSortJson(eclWorkunitsJson, columnKey);
-                case "none" -> descendingSortJson(eclWorkunitsJson, "Wuid");
+                case "none" -> descendingSortJson(eclWorkunitsJson, uniqueKey);
             }
 
-            if (compareWorkUnits(eclWorkunitsUI, eclWorkunitsJson, logger)) {
-                System.out.println("Success: ECL Workunits page: Workunits are correctly sorted in " + currentSortOrder + " order by: " + columnKey);
+            List<Object> columnDataFromJSON = getDataFromJSONUsingColumnKey(columnKey, eclWorkunitsJson);
+
+            List<Object> columnDataIDFromUI = getDataFromUIUsingColumnKey(driver, uniqueKey);
+
+            if (compareData(columnDataFromUI, columnDataFromJSON, columnDataIDFromUI, logger, columnName)) {
+                System.out.println("Success: " + pageName + ": Values are correctly sorted in " + currentSortOrder + " order by: " + columnName);
             } else {
-                String errMsg = "Failure: ECL Workunits page: Workunits are not correctly sorted in " + currentSortOrder + " order by: " + columnKey;
+                String errMsg = "Failure: " + pageName + ": Values are not correctly sorted in " + currentSortOrder + " order by: " + columnName;
                 System.err.println(errMsg);
                 logger.severe(errMsg);
             }
         }
     }
 
+    private List<Object> getDataFromJSONUsingColumnKey(String columnKey, List<ECLWorkunit> eclWorkunits) {
+
+        List<Object> columnDataFromJSON = new ArrayList<>();
+
+        for (ECLWorkunit eclWorkunit : eclWorkunits) {
+            switch (columnKey) {
+
+                case "Wuid":
+                    columnDataFromJSON.add(eclWorkunit.getWuid());
+                    break;
+
+                case "Owner":
+                    columnDataFromJSON.add(eclWorkunit.getOwner());
+                    break;
+
+                case "Jobname":
+                    columnDataFromJSON.add(eclWorkunit.getJobname());
+                    break;
+
+                case "Cluster":
+                    columnDataFromJSON.add(eclWorkunit.getCluster());
+                    break;
+
+                case "State":
+                    columnDataFromJSON.add(eclWorkunit.getState());
+                    break;
+
+                case "TotalClusterTime":
+                    columnDataFromJSON.add(eclWorkunit.getTotalClusterTime());
+                    break;
+
+                case "Compile Cost":
+                    columnDataFromJSON.add(eclWorkunit.getCompileCost());
+                    break;
+
+                case "Execution Cost":
+                    columnDataFromJSON.add(eclWorkunit.getExecuteCost());
+                    break;
+
+                case "File Access Cost":
+                    columnDataFromJSON.add(eclWorkunit.getFileAccessCost());
+                    break;
+            }
+        }
+
+        return columnDataFromJSON;
+    }
+
+    private List<Object> getDataFromUIUsingColumnKey(WebDriver driver, String columnKey) {
+
+        List<WebElement> elements = driver.findElements(By.cssSelector("div[data-automation-key='" + columnKey + "']"));
+        List<Object> columnData = new ArrayList<>();
+        for (WebElement element : elements) {
+            columnData.add(element.getText());
+        }
+
+        return columnData;
+    }
+
     private void ascendingSortJson(List<ECLWorkunit> eclWorkunitsJson, String columnKey) {
 
         switch (columnKey) {
@@ -173,168 +240,66 @@ private void descendingSortJson(List<ECLWorkunit> eclWorkunitsJson, String colum
         }
     }
 
-    private boolean testWorkUnitContent(WebDriver driver, Logger logger, List<ECLWorkunit> eclWorkunitsJson) {
+    private boolean testTableContent(WebDriver driver, Logger logger, List<ECLWorkunit> eclWorkunitsJson) {
 
-        List<ECLWorkunit> eclWorkunitsUI = getAllWorkUnitsFromUI(driver);
-
-        System.out.println("Number of Workunits from UI: " + eclWorkunitsUI.size());
         System.out.println("Number of Workunits from Json: " + eclWorkunitsJson.size());
 
-        return compareWorkUnits(eclWorkunitsUI, eclWorkunitsJson, logger);
-    }
-
-    private List<ECLWorkunit> convertWebElementsToObjects(List<WebElement> allWorkUnitsUI) {
+        List<Object> columnDataIDFromUI = getDataFromUIUsingColumnKey(driver, uniqueKey);
 
-        List<ECLWorkunit> eclWorkunits = new ArrayList<>();
+        System.out.println("Number of Workunits from UI: " + columnDataIDFromUI.size());
 
-        for (WebElement element : allWorkUnitsUI) {
+        boolean pass = true;
 
-            ECLWorkunit eclWorkunit = new ECLWorkunit();
-
-            WebElement columnWebElement = element.findElement(By.cssSelector("div[data-automation-key=Wuid]"));
-
-            String wuid = columnWebElement.getText();
-            String href = columnWebElement.findElement(By.tagName("a")).getAttribute("href");
-
-            columnWebElement = element.findElement(By.cssSelector("div[data-automation-key=Owner]"));
-            String owner = columnWebElement.getText();
-
-            columnWebElement = element.findElement(By.cssSelector("div[data-automation-key=Jobname]"));
-            String jobname = columnWebElement.getText();
-
-            columnWebElement = element.findElement(By.cssSelector("div[data-automation-key=Cluster]"));
-            String cluster = columnWebElement.getText();
+        for (int i = 0; i < columnKeys.length; i++) {
+            List<Object> columnDataFromUI = getDataFromUIUsingColumnKey(driver, columnKeys[i]);
+            List<Object> columnDataFromJSON = getDataFromJSONUsingColumnKey(columnKeys[i], eclWorkunitsJson);
+            if (!compareData(columnDataFromUI, columnDataFromJSON, columnDataIDFromUI, logger, columnNames[i])) {
+                pass = false;
+            }
+        }
 
-            columnWebElement = element.findElement(By.cssSelector("div[data-automation-key=State]"));
-            String state = columnWebElement.getText();
+        return pass;
+    }
 
-            columnWebElement = element.findElement(By.cssSelector("div[data-automation-key=TotalClusterTime]"));
-            String totalClusterTime = columnWebElement.getText();
+    private boolean compareData(List<Object> dataUI, List<Object> dataJSON, List<Object> dataIDUI, Logger logger, String columnName) {
 
-            columnWebElement = element.findElement(By.cssSelector("div[data-automation-key='Compile Cost']"));
-            String compileCost = columnWebElement.getText();
+        boolean pass = true;
 
-            columnWebElement = element.findElement(By.cssSelector("div[data-automation-key='Execution Cost']"));
-            String executionCost = columnWebElement.getText();
+        for (int i = 0; i < dataUI.size(); i++) {
 
-            columnWebElement = element.findElement(By.cssSelector("div[data-automation-key='File Access Cost']"));
-            String fileAccessCost = columnWebElement.getText();
+            Object dataUIValue = dataUI.get(i);
+            Object dataJSONValue = dataJSON.get(i);
+            Object dataIDUIValue = dataIDUI.get(i);
 
-            eclWorkunit.setWuid(wuid.trim());
-            eclWorkunit.setHref(href);
-            eclWorkunit.setOwner(owner);
-            eclWorkunit.setJobname(jobname);
-            eclWorkunit.setCluster(cluster);
-            eclWorkunit.setState(state);
-            eclWorkunit.setTotalClusterTime(totalClusterTime);
-            eclWorkunit.setCompileCost(extractDoubleValue(compileCost));
-            eclWorkunit.setExecuteCost(extractDoubleValue(executionCost));
-            eclWorkunit.setFileAccessCost(extractDoubleValue(fileAccessCost));
+            if (costColumns.contains(columnName)) {
+                dataUIValue = Double.parseDouble(((String) dataUIValue).split(" ")[0]);
+            } else if (columnName.equals("Total Cluster Time")) {
+                dataUIValue = TimeUtils.convertToDouble((String) dataUIValue);
+            } else if (dataUIValue instanceof String) {
+                dataUIValue = ((String) dataUIValue).trim();
+            }
 
-            eclWorkunits.add(eclWorkunit);
+            if (!checkValues(dataUIValue, dataJSONValue, dataIDUIValue, logger, columnName)) {
+                pass = false;
+            }
         }
 
-        return eclWorkunits;
-    }
+        if (pass) {
+            System.out.println("Success: " + pageName + ": Content test passed for column: " + columnName);
+        }
 
-    public static double extractDoubleValue(String value) {
-        String doubleString = value.split(" ")[0];
-        return Double.parseDouble(doubleString);
+        return pass;
     }
 
-    private boolean compareWorkUnits(List<ECLWorkunit> eclWorkunitsUI, List<ECLWorkunit> eclWorkunitsJson, Logger logger) {
-
-        if (eclWorkunitsUI.size() != eclWorkunitsJson.size()) {
-            String errMsg = "Failure: ECL Workunits page: Number of workunits is different on UI and JSON. \nUI Workunits: " + eclWorkunitsUI.size() + "\nJSON Workunits: " + eclWorkunitsJson.size() + "\n";
-            System.err.println(errMsg);
+    private boolean checkValues(Object dataUIValue, Object dataJSONValue, Object dataIDUIValue, Logger logger, String columnName) {
+        if (!dataUIValue.equals(dataJSONValue)) {
+            String errMsg = "Failure: " + pageName + ": Incorrect " + columnName + " : " + dataUIValue + " in UI for " + uniqueKeyName + " : " + dataIDUIValue + ". Correct " + columnName + " is: " + dataJSONValue;
+            System.out.println(errMsg);
             logger.severe(errMsg);
             return false;
-
-        } else {
-            boolean allPass = true;
-            for (int i = 0; i < eclWorkunitsUI.size(); i++) {
-
-                boolean pass = true;
-
-                if (eclWorkunitsUI.get(i).getWuid().equals(eclWorkunitsJson.get(i).getWuid())) {
-
-                    String wuid = eclWorkunitsUI.get(i).getWuid();
-
-                    if (!eclWorkunitsUI.get(i).getOwner().equals(eclWorkunitsJson.get(i).getOwner())) {
-                        String errMsg = "Failure: ECL Workunits page: Incorrect Owner in UI for Wuid : " + wuid + ". Correct Owner is: " + eclWorkunitsJson.get(i).getOwner();
-                        System.out.println(errMsg);
-                        logger.severe(errMsg);
-                        pass = false;
-                    }
-
-                    if (!eclWorkunitsUI.get(i).getCluster().equals(eclWorkunitsJson.get(i).getCluster())) {
-                        String errMsg = "Failure: ECL Workunits page: Incorrect Cluster in UI for Wuid : " + wuid + ". Correct Cluster is: " + eclWorkunitsJson.get(i).getCluster();
-                        System.out.println(errMsg);
-                        logger.severe(errMsg);
-                        pass = false;
-                    }
-
-                    if (!eclWorkunitsUI.get(i).getJobname().equals(eclWorkunitsJson.get(i).getJobname())) {
-                        String errMsg = "Failure: ECL Workunits page: Incorrect Job Name in UI for Wuid : " + wuid + ". Correct Job Name is: " + eclWorkunitsJson.get(i).getJobname();
-                        System.out.println(errMsg);
-                        logger.severe(errMsg);
-                        pass = false;
-                    }
-
-                    if (!eclWorkunitsUI.get(i).getState().equals(eclWorkunitsJson.get(i).getState())) {
-                        String errMsg = "Failure: ECL Workunits page: Incorrect State in UI for Wuid : " + wuid + ". Correct State is: " + eclWorkunitsJson.get(i).getState();
-                        System.out.println(errMsg);
-                        logger.severe(errMsg);
-                        pass = false;
-                    }
-
-                    if (!eclWorkunitsUI.get(i).getTotalClusterTime().equals(eclWorkunitsJson.get(i).getTotalClusterTime())) {
-                        String errMsg = "Failure: ECL Workunits page: Incorrect Total Cluster Time in UI for Wuid : " + wuid + ". Correct Total Cluster Time is: " + eclWorkunitsJson.get(i).getTotalClusterTime();
-                        System.out.println(errMsg);
-                        logger.severe(errMsg);
-                        pass = false;
-                    }
-
-                    if (eclWorkunitsUI.get(i).getCompileCost() != eclWorkunitsJson.get(i).getCompileCost()) {
-                        String errMsg = "Failure: ECL Workunits page: Incorrect Compile Cost in UI for Wuid : " + wuid + ". Correct Compile Cost is: " + eclWorkunitsJson.get(i).getCompileCost();
-                        System.out.println(errMsg);
-                        logger.severe(errMsg);
-                        pass = false;
-                    }
-
-                    if (eclWorkunitsUI.get(i).getExecuteCost() != eclWorkunitsJson.get(i).getExecuteCost()) {
-                        String errMsg = "Failure: ECL Workunits page: Incorrect Execute Cost in UI for Wuid : " + wuid + ". Correct Execute Cost is: " + eclWorkunitsJson.get(i).getExecuteCost();
-                        System.out.println(errMsg);
-                        logger.severe(errMsg);
-                        pass = false;
-                    }
-
-                    if (eclWorkunitsUI.get(i).getFileAccessCost() != eclWorkunitsJson.get(i).getFileAccessCost()) {
-                        String errMsg = "Failure: ECL Workunits page: Incorrect File Access Cost in UI for Wuid : " + wuid + ". Correct File Access Cost is: " + eclWorkunitsJson.get(i).getExecuteCost();
-                        System.out.println(errMsg);
-                        logger.severe(errMsg);
-                        pass = false;
-                    }
-
-                    if (!pass) {
-                        allPass = false;
-                    }
-
-                } else {
-
-                    String errMsg = "Failure: ECL Workunits page: Incorrect Wuid in UI: " + eclWorkunitsUI.get(i).getWuid() + " Correct Wuid is: " + eclWorkunitsJson.get(i).getWuid();
-                    logger.severe(errMsg);
-                    System.err.println(errMsg);
-                    allPass = false;
-                }
-            }
-
-            if (allPass) {
-                System.out.println("Success: ECL Workunits page: All workunits content test passed.");
-            }
-
-            return allPass;
         }
+
+        return true;
     }
 
     private List<ECLWorkunit> getAllWorkUnitsFromJson(Logger logger) {
@@ -358,7 +323,7 @@ private List<ECLWorkunit> getAllWorkUnitsFromJson(Logger logger) {
         return null;
     }
 
-    private List<ECLWorkunit> getAllWorkUnitsFromUI(WebDriver driver) {
+    private void clickDropdown(WebDriver driver) {
 
         WebElement dropdown = driver.findElement(By.id("pageSize"));
 
@@ -380,13 +345,11 @@ private List<ECLWorkunit> getAllWorkUnitsFromUI(WebDriver driver) {
         driver.navigate().refresh();
 
         Common.sleep();
-
-        return convertWebElementsToObjects(driver.findElements(By.cssSelector("div[data-list-index]")));
     }
 
     private void testForAllText(WebDriver driver, Logger logger) {
 
-        for (String text : textArray) {
+        for (String text : columnNames) {
             Common.checkTextPresent(driver, text, "ECL WorkUnits Page", logger);
         }
     }
diff --git a/esp/src/test-ui/tests/framework/utility/TimeUtils.java b/esp/src/test-ui/tests/framework/utility/TimeUtils.java
new file mode 100644
index 00000000000..6c397225f7b
--- /dev/null
+++ b/esp/src/test-ui/tests/framework/utility/TimeUtils.java
@@ -0,0 +1,20 @@
+package framework.utility;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class TimeUtils {
+    private static final Pattern TIME_PATTERN = Pattern.compile("(\\d+):(\\d+\\.\\d+)");
+
+    public static double convertToDouble(String time) {
+        Matcher matcher = TIME_PATTERN.matcher(time);
+        if (matcher.matches()) {
+            int minutes = Integer.parseInt(matcher.group(1));
+            double seconds = Double.parseDouble(matcher.group(2));
+            return minutes * 60 + seconds;
+        } else {
+            return Double.parseDouble(time);
+        }
+    }
+}
+

From 02bc183539956c0c42198e330537590c6b8653ef Mon Sep 17 00:00:00 2001
From: Nisha Bagdwal <nishabagdwal@gmail.com>
Date: Mon, 10 Jun 2024 17:04:19 -0400
Subject: [PATCH 19/33] HPCC-31857 : Code Refactoring Using Generics

Added a base super class to make code more reusable. Added a README file for understanding of framework.

Signed-off-by: Nisha Bagdwal <nishabagdwal@gmail.com>
---
 esp/src/test-ui/tests/framework/README.md     |   7 +
 .../tests/framework/pages/BaseTableTest.java  | 217 ++++++++++
 .../framework/pages/ECLWorkUnitsTest.java     | 370 +++---------------
 3 files changed, 285 insertions(+), 309 deletions(-)
 create mode 100644 esp/src/test-ui/tests/framework/README.md
 create mode 100644 esp/src/test-ui/tests/framework/pages/BaseTableTest.java

diff --git a/esp/src/test-ui/tests/framework/README.md b/esp/src/test-ui/tests/framework/README.md
new file mode 100644
index 00000000000..df8da1cc4d2
--- /dev/null
+++ b/esp/src/test-ui/tests/framework/README.md
@@ -0,0 +1,7 @@
+Project: An Automated ECL Watch Test Suite
+
+This project's code begins with the TestRunner.java file. The main method in this class loads all the Java classes created for writing test cases for specific web pages of the ECL Watch UI and then runs the tests in those classes sequentially.
+
+The names of the Java classes that the TestRunner class needs to load should be listed in the config/TestClasses.java file.
+
+Each Java class created to write tests for specific web pages should have at least one method annotated with @Test. The code for each class starts to run from this method.
\ No newline at end of file
diff --git a/esp/src/test-ui/tests/framework/pages/BaseTableTest.java b/esp/src/test-ui/tests/framework/pages/BaseTableTest.java
new file mode 100644
index 00000000000..f7b522f9265
--- /dev/null
+++ b/esp/src/test-ui/tests/framework/pages/BaseTableTest.java
@@ -0,0 +1,217 @@
+package framework.pages;
+
+import framework.setup.LoggerHolder;
+import framework.setup.WebDriverHolder;
+import framework.utility.Common;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.support.ui.ExpectedConditions;
+import org.openqa.selenium.support.ui.WebDriverWait;
+
+import java.time.Duration;
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+import java.util.function.Function;
+import java.util.logging.Logger;
+
+public abstract class BaseTableTest<T> {
+
+    protected abstract String getPageName();
+
+    protected abstract String getPageUrl();
+
+    protected abstract String getJsonFilePath();
+
+    protected abstract String[] getColumnNames();
+
+    protected abstract String[] getColumnKeys();
+
+    protected abstract String getUniqueKeyName();
+
+    protected abstract String getUniqueKey();
+
+    protected abstract Object parseDataUIValue(Object dataUIValue, String columnName);
+
+    protected abstract List<T> parseJson(String filePath) throws Exception;
+
+    protected abstract Object getColumnDataFromJson(T object, String columnKey);
+
+    protected abstract void sortJsonUsingSortOrder(String currentSortOrder, List<T> jsonObjects, String columnKey);
+
+    protected void testPage() {
+        WebDriver driver = WebDriverHolder.getDriver();
+        Common.openWebPage(driver, getPageUrl());
+        Logger logger = LoggerHolder.getLogger();
+
+        testForAllText(driver, logger);
+        testContentAndSortingOrder(driver, logger);
+    }
+
+    private void testContentAndSortingOrder(WebDriver driver, Logger logger) {
+        List<T> jsonObjects = getAllObjectsFromJson(logger);
+
+        if (jsonObjects != null) {
+            clickDropdown(driver);
+
+            if (testTableContent(driver, logger, jsonObjects)) {
+                for (int i = 0; i < getColumnKeys().length; i++) {
+                    testTheSortingOrderForOneColumn(driver, logger, jsonObjects, getColumnKeys()[i], getColumnNames()[i]);
+                }
+            }
+        }
+    }
+
+    private void testTheSortingOrderForOneColumn(WebDriver driver, Logger logger, List<T> jsonObjects, String columnKey, String columnName) {
+        for (int i = 0; i < 3; i++) {
+
+            String currentSortOrder = getCurrentSortingOrder(driver, columnKey);
+            List<Object> columnDataFromUI = getDataFromUIUsingColumnKey(driver, columnKey);
+
+            sortJsonUsingSortOrder(currentSortOrder, jsonObjects, columnKey);
+
+            List<Object> columnDataFromJSON = getDataFromJSONUsingColumnKey(columnKey, jsonObjects);
+            List<Object> columnDataIDFromUI = getDataFromUIUsingColumnKey(driver, getUniqueKey());
+
+            if (compareData(columnDataFromUI, columnDataFromJSON, columnDataIDFromUI, logger, columnName)) {
+                System.out.println("Success: " + getPageName() + ": Values are correctly sorted in " + currentSortOrder + " order by: " + columnName);
+            } else {
+                String errMsg = "Failure: " + getPageName() + ": Values are not correctly sorted in " + currentSortOrder + " order by: " + columnName;
+                System.err.println(errMsg);
+                logger.severe(errMsg);
+            }
+        }
+    }
+
+    private String getCurrentSortingOrder(WebDriver driver, String columnKey) {
+
+        WebElement columnHeader = driver.findElement(By.cssSelector("div[data-item-key='" + columnKey + "']"));
+        columnHeader.click();
+
+        Common.sleep();
+
+        columnHeader = driver.findElement(By.cssSelector("div[data-item-key='" + columnKey + "']"));
+
+        return columnHeader.getAttribute("aria-sort");
+    }
+
+    private List<Object> getDataFromJSONUsingColumnKey(String columnKey, List<T> jsonObjects) {
+        List<Object> columnDataFromJSON = new ArrayList<>();
+        for (T jsonObject : jsonObjects) {
+            columnDataFromJSON.add(getColumnDataFromJson(jsonObject, columnKey));
+        }
+        return columnDataFromJSON;
+    }
+
+    private List<Object> getDataFromUIUsingColumnKey(WebDriver driver, String columnKey) {
+        List<WebElement> elements = driver.findElements(By.cssSelector("div[data-automation-key='" + columnKey + "']"));
+        List<Object> columnData = new ArrayList<>();
+        for (WebElement element : elements) {
+            columnData.add(element.getText());
+        }
+        return columnData;
+    }
+
+    void ascendingSortJson(List<T> jsonObjects, String columnKey) {
+        jsonObjects.sort(Comparator.comparing(jsonObject -> (Comparable) getColumnDataFromJson(jsonObject, columnKey)));
+    }
+
+    void descendingSortJson(List<T> jsonObjects, String columnKey) {
+        jsonObjects.sort(Comparator.comparing((Function<T, Comparable>) jsonObject -> (Comparable) getColumnDataFromJson(jsonObject, columnKey)).reversed());
+    }
+
+    private boolean testTableContent(WebDriver driver, Logger logger, List<T> jsonObjects) {
+        System.out.println("Page: " + getPageName() + " Number of Objects from Json: " + jsonObjects.size());
+
+        List<Object> columnDataIDFromUI = getDataFromUIUsingColumnKey(driver, getUniqueKey());
+
+        System.out.println("Page: " + getPageName() + " Number of Objects from UI: " + columnDataIDFromUI.size());
+
+        boolean pass = true;
+
+        for (int i = 0; i < getColumnKeys().length; i++) {
+            List<Object> columnDataFromUI = getDataFromUIUsingColumnKey(driver, getColumnKeys()[i]);
+            List<Object> columnDataFromJSON = getDataFromJSONUsingColumnKey(getColumnKeys()[i], jsonObjects);
+            if (!compareData(columnDataFromUI, columnDataFromJSON, columnDataIDFromUI, logger, getColumnNames()[i])) {
+                pass = false;
+            }
+        }
+
+        return pass;
+    }
+
+    private List<T> getAllObjectsFromJson(Logger logger) {
+        String filePath = getJsonFilePath();
+        try {
+            return parseJson(filePath);
+        } catch (Exception e) {
+            System.err.println("Exception: " + e.getMessage());
+            logger.severe("Failure: Exception: " + e.getMessage());
+        }
+
+        logger.severe("Failure: Error in JSON Parsing: " + filePath);
+        return null;
+    }
+
+    private boolean compareData(List<Object> dataUI, List<Object> dataJSON, List<Object> dataIDUI, Logger logger, String columnName) {
+
+        boolean pass = true;
+
+        for (int i = 0; i < dataUI.size(); i++) {
+
+            Object dataUIValue = dataUI.get(i);
+            Object dataJSONValue = dataJSON.get(i);
+            Object dataIDUIValue = dataIDUI.get(i);
+
+            dataUIValue = parseDataUIValue(dataUIValue, columnName);
+
+            if (!checkValues(dataUIValue, dataJSONValue, dataIDUIValue, logger, columnName)) {
+                pass = false;
+            }
+        }
+
+        if (pass) {
+            System.out.println("Success: " + getPageName() + ": Content test passed for column: " + columnName);
+        }
+
+        return pass;
+    }
+
+    private boolean checkValues(Object dataUIValue, Object dataJSONValue, Object dataIDUIValue, Logger logger, String columnName) {
+        if (!dataUIValue.equals(dataJSONValue)) {
+            String errMsg = "Failure: " + getPageName() + ": Incorrect " + columnName + " : " + dataUIValue + " in UI for " + getUniqueKeyName() + " : " + dataIDUIValue + ". Correct " + columnName + " is: " + dataJSONValue;
+            System.out.println(errMsg);
+            logger.severe(errMsg);
+            return false;
+        }
+
+        return true;
+    }
+
+    private void clickDropdown(WebDriver driver) {
+        WebElement dropdown = driver.findElement(By.id("pageSize"));
+        dropdown.click();
+
+        WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
+        List<WebElement> options = wait.until(ExpectedConditions.visibilityOfAllElementsLocatedBy(By.cssSelector(".ms-Dropdown-item")));
+
+        for (WebElement option : options) {
+            if (option.getText().equals("100")) {
+                option.click();
+                break;
+            }
+        }
+
+        wait.until(ExpectedConditions.invisibilityOfElementLocated(By.cssSelector(".ms-Dropdown-item")));
+        driver.navigate().refresh();
+        Common.sleep();
+    }
+
+    private void testForAllText(WebDriver driver, Logger logger) {
+        for (String text : getColumnNames()) {
+            Common.checkTextPresent(driver, text, getPageName(), logger);
+        }
+    }
+}
+
diff --git a/esp/src/test-ui/tests/framework/pages/ECLWorkUnitsTest.java b/esp/src/test-ui/tests/framework/pages/ECLWorkUnitsTest.java
index 0c1dd6c21f5..c1b79094a0e 100644
--- a/esp/src/test-ui/tests/framework/pages/ECLWorkUnitsTest.java
+++ b/esp/src/test-ui/tests/framework/pages/ECLWorkUnitsTest.java
@@ -5,352 +5,104 @@
 import framework.model.ECLWorkunit;
 import framework.model.WUQueryResponse;
 import framework.model.WUQueryRoot;
-import framework.setup.LoggerHolder;
-import framework.setup.WebDriverHolder;
 import framework.utility.Common;
 import framework.utility.TimeUtils;
-import org.openqa.selenium.By;
-import org.openqa.selenium.WebDriver;
-import org.openqa.selenium.WebElement;
-import org.openqa.selenium.support.ui.ExpectedConditions;
-import org.openqa.selenium.support.ui.WebDriverWait;
 import org.testng.annotations.Test;
 
 import java.io.File;
-import java.time.Duration;
-import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Comparator;
 import java.util.List;
 import java.util.logging.Logger;
 
-public class ECLWorkUnitsTest {
-
-    static final String[] columnNames = {"WUID", "Owner", "Job Name", "Cluster", "State", "Total Cluster Time", "Compile Cost", "Execution Cost", "File Access Cost"};
-    static final String[] columnKeys = {"Wuid", "Owner", "Jobname", "Cluster", "State", "TotalClusterTime", "Compile Cost", "Execution Cost", "File Access Cost"};
-    List<String> costColumns = Arrays.asList("Compile Cost", "Execution Cost", "File Access Cost");
-    static final String uniqueKeyName = "WUID";
-    static final String uniqueKey = "Wuid";
-    static final String pageName = "ECL Workunits";
+public class ECLWorkUnitsTest extends BaseTableTest<ECLWorkunit> {
 
     @Test
     public void testingECLWorkUnitsPage() {
-        WebDriver driver = WebDriverHolder.getDriver();
-        Common.openWebPage(driver, Common.getUrl(Config.ECL_WORK_UNITS_URL));
-        Logger logger = LoggerHolder.getLogger();
-
-        testForAllText(driver, logger);
-        testTheSortingOrder(driver, logger);
+        testPage();
     }
 
-    private void testTheSortingOrder(WebDriver driver, Logger logger) {
-
-        List<ECLWorkunit> eclWorkunitsJson = getAllWorkUnitsFromJson(logger);
-
-        if (eclWorkunitsJson != null) {
-
-            clickDropdown(driver);
-
-            if (testTableContent(driver, logger, eclWorkunitsJson)) {
-                for (int i = 0; i < columnKeys.length; i++) {
-                    testTheSortingOrderForOneColumn(driver, logger, eclWorkunitsJson, columnKeys[i], columnNames[i]);
-                }
-            }
-        }
+    @Override
+    protected String getPageName() {
+        return "ECL Workunits";
     }
 
-    private void testTheSortingOrderForOneColumn(WebDriver driver, Logger logger, List<ECLWorkunit> eclWorkunitsJson, String columnKey, String columnName) {
-
-        for (int i = 0; i < 3; i++) {
-            WebElement columnHeader = driver.findElement(By.cssSelector("div[data-item-key='" + columnKey + "']"));
-
-            columnHeader.click();
-
-            Common.sleep();
-
-            columnHeader = driver.findElement(By.cssSelector("div[data-item-key='" + columnKey + "']"));
-
-            String currentSortOrder = columnHeader.getAttribute("aria-sort");
-
-            System.out.println("Current sorting order " + i + ": " + currentSortOrder);
-            System.out.println("Current column name " + i + ": " + columnKey);
-
-            List<Object> columnDataFromUI = getDataFromUIUsingColumnKey(driver, columnKey);
-
-            switch (currentSortOrder) {
-                case "ascending" -> ascendingSortJson(eclWorkunitsJson, columnKey);
-                case "descending" -> descendingSortJson(eclWorkunitsJson, columnKey);
-                case "none" -> descendingSortJson(eclWorkunitsJson, uniqueKey);
-            }
-
-            List<Object> columnDataFromJSON = getDataFromJSONUsingColumnKey(columnKey, eclWorkunitsJson);
-
-            List<Object> columnDataIDFromUI = getDataFromUIUsingColumnKey(driver, uniqueKey);
-
-            if (compareData(columnDataFromUI, columnDataFromJSON, columnDataIDFromUI, logger, columnName)) {
-                System.out.println("Success: " + pageName + ": Values are correctly sorted in " + currentSortOrder + " order by: " + columnName);
-            } else {
-                String errMsg = "Failure: " + pageName + ": Values are not correctly sorted in " + currentSortOrder + " order by: " + columnName;
-                System.err.println(errMsg);
-                logger.severe(errMsg);
-            }
-        }
+    @Override
+    protected String getPageUrl() {
+        return Common.getUrl(Config.ECL_WORK_UNITS_URL);
     }
 
-    private List<Object> getDataFromJSONUsingColumnKey(String columnKey, List<ECLWorkunit> eclWorkunits) {
-
-        List<Object> columnDataFromJSON = new ArrayList<>();
-
-        for (ECLWorkunit eclWorkunit : eclWorkunits) {
-            switch (columnKey) {
-
-                case "Wuid":
-                    columnDataFromJSON.add(eclWorkunit.getWuid());
-                    break;
-
-                case "Owner":
-                    columnDataFromJSON.add(eclWorkunit.getOwner());
-                    break;
-
-                case "Jobname":
-                    columnDataFromJSON.add(eclWorkunit.getJobname());
-                    break;
-
-                case "Cluster":
-                    columnDataFromJSON.add(eclWorkunit.getCluster());
-                    break;
-
-                case "State":
-                    columnDataFromJSON.add(eclWorkunit.getState());
-                    break;
-
-                case "TotalClusterTime":
-                    columnDataFromJSON.add(eclWorkunit.getTotalClusterTime());
-                    break;
-
-                case "Compile Cost":
-                    columnDataFromJSON.add(eclWorkunit.getCompileCost());
-                    break;
-
-                case "Execution Cost":
-                    columnDataFromJSON.add(eclWorkunit.getExecuteCost());
-                    break;
-
-                case "File Access Cost":
-                    columnDataFromJSON.add(eclWorkunit.getFileAccessCost());
-                    break;
-            }
-        }
-
-        return columnDataFromJSON;
+    @Override
+    protected String getJsonFilePath() {
+        return Common.isRunningOnLocal() ? Config.PATH_LOCAL_WORKUNITS_JSON : Config.PATH_GH_ACTION_WORKUNITS_JSON;
     }
 
-    private List<Object> getDataFromUIUsingColumnKey(WebDriver driver, String columnKey) {
-
-        List<WebElement> elements = driver.findElements(By.cssSelector("div[data-automation-key='" + columnKey + "']"));
-        List<Object> columnData = new ArrayList<>();
-        for (WebElement element : elements) {
-            columnData.add(element.getText());
-        }
-
-        return columnData;
+    @Override
+    protected String[] getColumnNames() {
+        return new String[]{"WUID", "Owner", "Job Name", "Cluster", "State", "Total Cluster Time", "Compile Cost", "Execution Cost", "File Access Cost"};
     }
 
-    private void ascendingSortJson(List<ECLWorkunit> eclWorkunitsJson, String columnKey) {
-
-        switch (columnKey) {
-
-            case "Wuid":
-                eclWorkunitsJson.sort(Comparator.comparing(ECLWorkunit::getWuid)); //(w1, w2) -> w1.getWuid().compareTo(w2.getWuid())
-                break;
-
-            case "Owner":
-                eclWorkunitsJson.sort(Comparator.comparing(ECLWorkunit::getOwner));
-                break;
-
-            case "Jobname":
-                eclWorkunitsJson.sort(Comparator.comparing(ECLWorkunit::getJobname));
-                break;
-
-            case "Cluster":
-                eclWorkunitsJson.sort(Comparator.comparing(ECLWorkunit::getCluster));
-                break;
-
-            case "State":
-                eclWorkunitsJson.sort(Comparator.comparing(ECLWorkunit::getState));
-                break;
-
-            case "TotalClusterTime":
-                eclWorkunitsJson.sort(Comparator.comparing(ECLWorkunit::getTotalClusterTime));
-                break;
-
-            case "Compile Cost":
-                eclWorkunitsJson.sort(Comparator.comparing(ECLWorkunit::getCompileCost));
-                break;
-
-            case "Execution Cost":
-                eclWorkunitsJson.sort(Comparator.comparing(ECLWorkunit::getExecuteCost));
-                break;
-
-            case "File Access Cost":
-                eclWorkunitsJson.sort(Comparator.comparing(ECLWorkunit::getFileAccessCost));
-                break;
-        }
+    @Override
+    protected String[] getColumnKeys() {
+        return new String[]{"Wuid", "Owner", "Jobname", "Cluster", "State", "TotalClusterTime", "Compile Cost", "Execution Cost", "File Access Cost"};
     }
 
-    private void descendingSortJson(List<ECLWorkunit> eclWorkunitsJson, String columnKey) {
-
-        switch (columnKey) {
-
-            case "Wuid":
-                eclWorkunitsJson.sort(Comparator.comparing(ECLWorkunit::getWuid).reversed());
-                break;
-
-            case "Owner":
-                eclWorkunitsJson.sort(Comparator.comparing(ECLWorkunit::getOwner).reversed());
-                break;
-
-            case "Jobname":
-                eclWorkunitsJson.sort(Comparator.comparing(ECLWorkunit::getJobname).reversed());
-                break;
-
-            case "Cluster":
-                eclWorkunitsJson.sort(Comparator.comparing(ECLWorkunit::getCluster).reversed());
-                break;
-
-            case "State":
-                eclWorkunitsJson.sort(Comparator.comparing(ECLWorkunit::getState).reversed());
-                break;
-
-            case "TotalClusterTime":
-                eclWorkunitsJson.sort(Comparator.comparing(ECLWorkunit::getTotalClusterTime).reversed());
-                break;
-
-            case "Compile Cost":
-                eclWorkunitsJson.sort(Comparator.comparing(ECLWorkunit::getCompileCost).reversed());
-                break;
-
-            case "Execution Cost":
-                eclWorkunitsJson.sort(Comparator.comparing(ECLWorkunit::getExecuteCost).reversed());
-                break;
-
-            case "File Access Cost":
-                eclWorkunitsJson.sort(Comparator.comparing(ECLWorkunit::getFileAccessCost).reversed());
-                break;
-        }
+    @Override
+    protected String getUniqueKeyName() {
+        return "WUID";
     }
 
-    private boolean testTableContent(WebDriver driver, Logger logger, List<ECLWorkunit> eclWorkunitsJson) {
-
-        System.out.println("Number of Workunits from Json: " + eclWorkunitsJson.size());
-
-        List<Object> columnDataIDFromUI = getDataFromUIUsingColumnKey(driver, uniqueKey);
-
-        System.out.println("Number of Workunits from UI: " + columnDataIDFromUI.size());
-
-        boolean pass = true;
-
-        for (int i = 0; i < columnKeys.length; i++) {
-            List<Object> columnDataFromUI = getDataFromUIUsingColumnKey(driver, columnKeys[i]);
-            List<Object> columnDataFromJSON = getDataFromJSONUsingColumnKey(columnKeys[i], eclWorkunitsJson);
-            if (!compareData(columnDataFromUI, columnDataFromJSON, columnDataIDFromUI, logger, columnNames[i])) {
-                pass = false;
-            }
-        }
-
-        return pass;
+    @Override
+    protected String getUniqueKey() {
+        return "Wuid";
     }
 
-    private boolean compareData(List<Object> dataUI, List<Object> dataJSON, List<Object> dataIDUI, Logger logger, String columnName) {
-
-        boolean pass = true;
-
-        for (int i = 0; i < dataUI.size(); i++) {
-
-            Object dataUIValue = dataUI.get(i);
-            Object dataJSONValue = dataJSON.get(i);
-            Object dataIDUIValue = dataIDUI.get(i);
-
-            if (costColumns.contains(columnName)) {
-                dataUIValue = Double.parseDouble(((String) dataUIValue).split(" ")[0]);
-            } else if (columnName.equals("Total Cluster Time")) {
-                dataUIValue = TimeUtils.convertToDouble((String) dataUIValue);
-            } else if (dataUIValue instanceof String) {
-                dataUIValue = ((String) dataUIValue).trim();
-            }
-
-            if (!checkValues(dataUIValue, dataJSONValue, dataIDUIValue, logger, columnName)) {
-                pass = false;
-            }
-        }
-
-        if (pass) {
-            System.out.println("Success: " + pageName + ": Content test passed for column: " + columnName);
-        }
-
-        return pass;
+    private List<String> getCostColumns() {
+        return Arrays.asList("Compile Cost", "Execution Cost", "File Access Cost");
     }
 
-    private boolean checkValues(Object dataUIValue, Object dataJSONValue, Object dataIDUIValue, Logger logger, String columnName) {
-        if (!dataUIValue.equals(dataJSONValue)) {
-            String errMsg = "Failure: " + pageName + ": Incorrect " + columnName + " : " + dataUIValue + " in UI for " + uniqueKeyName + " : " + dataIDUIValue + ". Correct " + columnName + " is: " + dataJSONValue;
-            System.out.println(errMsg);
-            logger.severe(errMsg);
-            return false;
-        }
-
-        return true;
+    @Override
+    protected List<ECLWorkunit> parseJson(String filePath) throws Exception {
+        ObjectMapper objectMapper = new ObjectMapper();
+        WUQueryRoot wuQueryRoot = objectMapper.readValue(new File(filePath), WUQueryRoot.class);
+        WUQueryResponse wuQueryResponse = wuQueryRoot.getWUQueryResponse();
+        return wuQueryResponse.getWorkunits().getECLWorkunit();
     }
 
-    private List<ECLWorkunit> getAllWorkUnitsFromJson(Logger logger) {
-
-        try {
-
-            ObjectMapper objectMapper = new ObjectMapper();
-            String filePath = Common.isRunningOnLocal() ? Config.PATH_LOCAL_WORKUNITS_JSON : Config.PATH_GH_ACTION_WORKUNITS_JSON;
-
-            WUQueryRoot wuQueryRoot = objectMapper.readValue(new File(filePath), WUQueryRoot.class);
-
-            WUQueryResponse wuQueryResponse = wuQueryRoot.getWUQueryResponse();
-            return wuQueryResponse.getWorkunits().getECLWorkunit();
-
-        } catch (Exception e) {
-            System.err.println("Exception: " + e.getMessage());
-            logger.severe("Failure: Exception: " + e.getMessage());
-        }
-
-        logger.severe("Failure: Error in JSON Parsing");
-        return null;
+    @Override
+    protected Object getColumnDataFromJson(ECLWorkunit workunit, String columnKey) {
+        return switch (columnKey) {
+            case "Wuid" -> workunit.getWuid();
+            case "Owner" -> workunit.getOwner();
+            case "Jobname" -> workunit.getJobname();
+            case "Cluster" -> workunit.getCluster();
+            case "State" -> workunit.getState();
+            case "TotalClusterTime" -> workunit.getTotalClusterTime();
+            case "Compile Cost" -> workunit.getCompileCost();
+            case "Execution Cost" -> workunit.getExecuteCost();
+            case "File Access Cost" -> workunit.getFileAccessCost();
+            default -> null;
+        };
     }
 
-    private void clickDropdown(WebDriver driver) {
-
-        WebElement dropdown = driver.findElement(By.id("pageSize"));
-
-        dropdown.click();
-
-        WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
-
-        List<WebElement> options = wait.until(ExpectedConditions.visibilityOfAllElementsLocatedBy(By.cssSelector(".ms-Dropdown-item")));
-
-        for (WebElement option : options) {
-            if (option.getText().equals("100")) {
-                option.click();
-                break;
-            }
+    @Override
+    protected Object parseDataUIValue(Object dataUIValue, String columnName) {
+        if (getCostColumns().contains(columnName)) {
+            dataUIValue = Double.parseDouble(((String) dataUIValue).split(" ")[0]);
+        } else if (columnName.equals("Total Cluster Time")) {
+            dataUIValue = TimeUtils.convertToDouble((String) dataUIValue);
+        } else if (dataUIValue instanceof String) {
+            dataUIValue = ((String) dataUIValue).trim();
         }
 
-        wait.until(ExpectedConditions.invisibilityOfElementLocated(By.cssSelector(".ms-Dropdown-item")));
-
-        driver.navigate().refresh();
-
-        Common.sleep();
+        return dataUIValue;
     }
 
-    private void testForAllText(WebDriver driver, Logger logger) {
-
-        for (String text : columnNames) {
-            Common.checkTextPresent(driver, text, "ECL WorkUnits Page", logger);
+    @Override
+    protected void sortJsonUsingSortOrder(String currentSortOrder, List<ECLWorkunit> workunitsJson, String columnKey){
+        switch (currentSortOrder) {
+            case "ascending" -> ascendingSortJson(workunitsJson, columnKey);
+            case "descending" -> descendingSortJson(workunitsJson, columnKey);
+            case "none" -> descendingSortJson(workunitsJson, getUniqueKey());
         }
     }
-}
+}
\ No newline at end of file

From 63d30a0fd8d9d564a9bcaf1d646f5456aa11c4ad Mon Sep 17 00:00:00 2001
From: Nisha Bagdwal <nishabagdwal@gmail.com>
Date: Tue, 11 Jun 2024 12:31:56 -0400
Subject: [PATCH 20/33] HPCC-31857 : Dropdown page size and time formatter

Code to select page size based on the number of items in json. Updated code of TimeUtils.java to format time string with days and hours as well.

Signed-off-by: Nisha Bagdwal <nishabagdwal@gmail.com>
---
 .../tests/framework/config/Config.java        |  1 +
 .../tests/framework/pages/BaseTableTest.java  | 25 +++++++++++++++--
 .../framework/pages/ECLWorkUnitsTest.java     |  3 +-
 .../tests/framework/utility/TimeUtils.java    | 28 +++++++++++++++----
 4 files changed, 47 insertions(+), 10 deletions(-)

diff --git a/esp/src/test-ui/tests/framework/config/Config.java b/esp/src/test-ui/tests/framework/config/Config.java
index 4554ab34365..b549b972d7f 100644
--- a/esp/src/test-ui/tests/framework/config/Config.java
+++ b/esp/src/test-ui/tests/framework/config/Config.java
@@ -14,4 +14,5 @@ public class Config {
     public static final String GITHUB_ACTION_IP = "http://127.0.0.1:8010/";
     public static final String ACTIVITIES_URL = "esp/files/index.html#/activities";
     public static final String ECL_WORK_UNITS_URL = "esp/files/index.html#/workunits";
+    public static final int[] dropdownValues = {10, 25, 50, 100, 250, 500, 1000};
 }
diff --git a/esp/src/test-ui/tests/framework/pages/BaseTableTest.java b/esp/src/test-ui/tests/framework/pages/BaseTableTest.java
index f7b522f9265..1f36db2fa4e 100644
--- a/esp/src/test-ui/tests/framework/pages/BaseTableTest.java
+++ b/esp/src/test-ui/tests/framework/pages/BaseTableTest.java
@@ -1,5 +1,6 @@
 package framework.pages;
 
+import framework.config.Config;
 import framework.setup.LoggerHolder;
 import framework.setup.WebDriverHolder;
 import framework.utility.Common;
@@ -53,7 +54,8 @@ private void testContentAndSortingOrder(WebDriver driver, Logger logger) {
         List<T> jsonObjects = getAllObjectsFromJson(logger);
 
         if (jsonObjects != null) {
-            clickDropdown(driver);
+            int numOfItemsJSON = jsonObjects.size();
+            clickDropdown(driver, numOfItemsJSON);
 
             if (testTableContent(driver, logger, jsonObjects)) {
                 for (int i = 0; i < getColumnKeys().length; i++) {
@@ -128,6 +130,11 @@ private boolean testTableContent(WebDriver driver, Logger logger, List<T> jsonOb
 
         System.out.println("Page: " + getPageName() + " Number of Objects from UI: " + columnDataIDFromUI.size());
 
+        if(jsonObjects.size() != columnDataIDFromUI.size()){
+            Common.sleep();
+            columnDataIDFromUI = getDataFromUIUsingColumnKey(driver, getUniqueKey());
+        }
+
         boolean pass = true;
 
         for (int i = 0; i < getColumnKeys().length; i++) {
@@ -189,15 +196,27 @@ private boolean checkValues(Object dataUIValue, Object dataJSONValue, Object dat
         return true;
     }
 
-    private void clickDropdown(WebDriver driver) {
+    private void clickDropdown(WebDriver driver, int numOfItemsJSON) {
         WebElement dropdown = driver.findElement(By.id("pageSize"));
         dropdown.click();
 
         WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
         List<WebElement> options = wait.until(ExpectedConditions.visibilityOfAllElementsLocatedBy(By.cssSelector(".ms-Dropdown-item")));
 
+        int selectedValue = Config.dropdownValues[0];
+
+        // the smallest dropdown value greater than numOfItemsJSON
+        for (int value : Config.dropdownValues) {
+            if (numOfItemsJSON < value) {
+                selectedValue = value;
+                break;
+            }
+        }
+
+        System.out.println("Dropdown selected: " + selectedValue);
+
         for (WebElement option : options) {
-            if (option.getText().equals("100")) {
+            if (option.getText().equals(String.valueOf(selectedValue))) {
                 option.click();
                 break;
             }
diff --git a/esp/src/test-ui/tests/framework/pages/ECLWorkUnitsTest.java b/esp/src/test-ui/tests/framework/pages/ECLWorkUnitsTest.java
index c1b79094a0e..53d350b06dd 100644
--- a/esp/src/test-ui/tests/framework/pages/ECLWorkUnitsTest.java
+++ b/esp/src/test-ui/tests/framework/pages/ECLWorkUnitsTest.java
@@ -12,7 +12,6 @@
 import java.io.File;
 import java.util.Arrays;
 import java.util.List;
-import java.util.logging.Logger;
 
 public class ECLWorkUnitsTest extends BaseTableTest<ECLWorkunit> {
 
@@ -98,7 +97,7 @@ protected Object parseDataUIValue(Object dataUIValue, String columnName) {
     }
 
     @Override
-    protected void sortJsonUsingSortOrder(String currentSortOrder, List<ECLWorkunit> workunitsJson, String columnKey){
+    protected void sortJsonUsingSortOrder(String currentSortOrder, List<ECLWorkunit> workunitsJson, String columnKey) {
         switch (currentSortOrder) {
             case "ascending" -> ascendingSortJson(workunitsJson, columnKey);
             case "descending" -> descendingSortJson(workunitsJson, columnKey);
diff --git a/esp/src/test-ui/tests/framework/utility/TimeUtils.java b/esp/src/test-ui/tests/framework/utility/TimeUtils.java
index 6c397225f7b..e2757310ca1 100644
--- a/esp/src/test-ui/tests/framework/utility/TimeUtils.java
+++ b/esp/src/test-ui/tests/framework/utility/TimeUtils.java
@@ -4,17 +4,35 @@
 import java.util.regex.Pattern;
 
 public class TimeUtils {
-    private static final Pattern TIME_PATTERN = Pattern.compile("(\\d+):(\\d+\\.\\d+)");
+    private static final Pattern TIME_PATTERN = Pattern.compile("(\\d+):(\\d+):(\\d+):(\\d+\\.\\d+)|(\\d+):(\\d+):(\\d+\\.\\d+)|(\\d+):(\\d+\\.\\d+)|(\\d+\\.\\d+)");
 
     public static double convertToDouble(String time) {
         Matcher matcher = TIME_PATTERN.matcher(time);
         if (matcher.matches()) {
-            int minutes = Integer.parseInt(matcher.group(1));
-            double seconds = Double.parseDouble(matcher.group(2));
-            return minutes * 60 + seconds;
+            int days = 0;
+            int hours = 0;
+            int minutes = 0;
+            double seconds = 0.0;
+
+            if (matcher.group(1) != null) { // Matches d:h:m:s.s
+                days = Integer.parseInt(matcher.group(1));
+                hours = Integer.parseInt(matcher.group(2));
+                minutes = Integer.parseInt(matcher.group(3));
+                seconds = Double.parseDouble(matcher.group(4));
+            } else if (matcher.group(5) != null) { // Matches h:m:s.s
+                hours = Integer.parseInt(matcher.group(5));
+                minutes = Integer.parseInt(matcher.group(6));
+                seconds = Double.parseDouble(matcher.group(7));
+            } else if (matcher.group(8) != null) { // Matches m:s.s
+                minutes = Integer.parseInt(matcher.group(8));
+                seconds = Double.parseDouble(matcher.group(9));
+            } else if (matcher.group(10) != null) { // Matches s.s
+                seconds = Double.parseDouble(matcher.group(10));
+            }
+
+            return days * 86400 + hours * 3600 + minutes * 60 + seconds;
         } else {
             return Double.parseDouble(time);
         }
     }
 }
-

From 702d25102fd266dba8e3c9006feab053a9483223 Mon Sep 17 00:00:00 2001
From: Nisha Bagdwal <nishabagdwal@gmail.com>
Date: Tue, 11 Jun 2024 14:55:59 -0400
Subject: [PATCH 21/33] HPCC-31857 : Error Logger

Added error log if number of items in ui does not match with the number of items in json.

Signed-off-by: Nisha Bagdwal <nishabagdwal@gmail.com>
---
 .../tests/framework/pages/BaseTableTest.java        | 13 +++++++++++--
 1 file changed, 11 insertions(+), 2 deletions(-)

diff --git a/esp/src/test-ui/tests/framework/pages/BaseTableTest.java b/esp/src/test-ui/tests/framework/pages/BaseTableTest.java
index 1f36db2fa4e..8544106227e 100644
--- a/esp/src/test-ui/tests/framework/pages/BaseTableTest.java
+++ b/esp/src/test-ui/tests/framework/pages/BaseTableTest.java
@@ -128,13 +128,22 @@ private boolean testTableContent(WebDriver driver, Logger logger, List<T> jsonOb
 
         List<Object> columnDataIDFromUI = getDataFromUIUsingColumnKey(driver, getUniqueKey());
 
-        System.out.println("Page: " + getPageName() + " Number of Objects from UI: " + columnDataIDFromUI.size());
-
         if(jsonObjects.size() != columnDataIDFromUI.size()){
             Common.sleep();
             columnDataIDFromUI = getDataFromUIUsingColumnKey(driver, getUniqueKey());
         }
 
+        System.out.println("Page: " + getPageName() + " Number of Objects from UI: " + columnDataIDFromUI.size());
+
+        if(jsonObjects.size() != columnDataIDFromUI.size()){
+            String errMsg = "Failure: " + getPageName() +": Number of items on UI are not equal to the number of items in JSON" +
+                    "\nNumber of Objects from Json: " + jsonObjects.size() +
+                    "\nNumber of Objects from UI: " + columnDataIDFromUI.size();
+            System.out.println(errMsg);
+            logger.severe(errMsg);
+            return false;
+        }
+
         boolean pass = true;
 
         for (int i = 0; i < getColumnKeys().length; i++) {

From 0658f5d70e375d41fbe39f2d68667ad8d52f0aa2 Mon Sep 17 00:00:00 2001
From: Nisha Bagdwal <nishabagdwal@gmail.com>
Date: Tue, 11 Jun 2024 15:12:54 -0400
Subject: [PATCH 22/33] HPCC-31857 : Error Logger

Added error log if number of items in ui does not match with the number of items in json.

Signed-off-by: Nisha Bagdwal <nishabagdwal@gmail.com>
---
 esp/src/test-ui/tests/framework/pages/BaseTableTest.java | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/esp/src/test-ui/tests/framework/pages/BaseTableTest.java b/esp/src/test-ui/tests/framework/pages/BaseTableTest.java
index 8544106227e..db294002e7e 100644
--- a/esp/src/test-ui/tests/framework/pages/BaseTableTest.java
+++ b/esp/src/test-ui/tests/framework/pages/BaseTableTest.java
@@ -128,15 +128,15 @@ private boolean testTableContent(WebDriver driver, Logger logger, List<T> jsonOb
 
         List<Object> columnDataIDFromUI = getDataFromUIUsingColumnKey(driver, getUniqueKey());
 
-        if(jsonObjects.size() != columnDataIDFromUI.size()){
+        if (jsonObjects.size() != columnDataIDFromUI.size()) {
             Common.sleep();
             columnDataIDFromUI = getDataFromUIUsingColumnKey(driver, getUniqueKey());
         }
 
         System.out.println("Page: " + getPageName() + " Number of Objects from UI: " + columnDataIDFromUI.size());
 
-        if(jsonObjects.size() != columnDataIDFromUI.size()){
-            String errMsg = "Failure: " + getPageName() +": Number of items on UI are not equal to the number of items in JSON" +
+        if (jsonObjects.size() != columnDataIDFromUI.size()) {
+            String errMsg = "Failure: " + getPageName() + ": Number of items on UI are not equal to the number of items in JSON" +
                     "\nNumber of Objects from Json: " + jsonObjects.size() +
                     "\nNumber of Objects from UI: " + columnDataIDFromUI.size();
             System.out.println(errMsg);

From d6b5fd7a28f1e8e64d376af97a3db6bfbf1e947b Mon Sep 17 00:00:00 2001
From: Nisha Bagdwal <nishabagdwal@gmail.com>
Date: Wed, 12 Jun 2024 11:52:10 -0400
Subject: [PATCH 23/33] HPCC-31857 : Time Utility for Total Cluster Time

Added code to handle the case -> "d days h:m:s.s".

Signed-off-by: Nisha Bagdwal <nishabagdwal@gmail.com>
---
 .../test-ui/tests/framework/model/ECLWorkunit.java |  6 +++---
 .../tests/framework/pages/BaseTableTest.java       |  4 ++--
 .../tests/framework/pages/ECLWorkUnitsTest.java    |  2 +-
 .../test-ui/tests/framework/utility/TimeUtils.java | 14 +++++++++-----
 4 files changed, 15 insertions(+), 11 deletions(-)

diff --git a/esp/src/test-ui/tests/framework/model/ECLWorkunit.java b/esp/src/test-ui/tests/framework/model/ECLWorkunit.java
index c789250992b..6a4cc340fe3 100644
--- a/esp/src/test-ui/tests/framework/model/ECLWorkunit.java
+++ b/esp/src/test-ui/tests/framework/model/ECLWorkunit.java
@@ -39,7 +39,7 @@ public class ECLWorkunit {
     private boolean thorLCR;
 
     @JsonProperty("TotalClusterTime")
-    private double totalClusterTime;
+    private long totalClusterTime;
 
     @JsonProperty("ApplicationValues")
     private ApplicationValues applicationValues;
@@ -76,13 +76,13 @@ public String getState() {
         return state;
     }
 
-    public double getTotalClusterTime() {
+    public long getTotalClusterTime() {
         return totalClusterTime;
     }
 
     @JsonSetter("TotalClusterTime")
     public void setTotalClusterTime(String totalClusterTime) {
-        this.totalClusterTime = TimeUtils.convertToDouble(totalClusterTime);
+        this.totalClusterTime = TimeUtils.convertToMilliseconds(totalClusterTime);
     }
 
     public double getExecuteCost() {
diff --git a/esp/src/test-ui/tests/framework/pages/BaseTableTest.java b/esp/src/test-ui/tests/framework/pages/BaseTableTest.java
index db294002e7e..32257e7174a 100644
--- a/esp/src/test-ui/tests/framework/pages/BaseTableTest.java
+++ b/esp/src/test-ui/tests/framework/pages/BaseTableTest.java
@@ -124,7 +124,7 @@ void descendingSortJson(List<T> jsonObjects, String columnKey) {
     }
 
     private boolean testTableContent(WebDriver driver, Logger logger, List<T> jsonObjects) {
-        System.out.println("Page: " + getPageName() + " Number of Objects from Json: " + jsonObjects.size());
+        System.out.println("Page: " + getPageName() + ": Number of Objects from Json: " + jsonObjects.size());
 
         List<Object> columnDataIDFromUI = getDataFromUIUsingColumnKey(driver, getUniqueKey());
 
@@ -133,7 +133,7 @@ private boolean testTableContent(WebDriver driver, Logger logger, List<T> jsonOb
             columnDataIDFromUI = getDataFromUIUsingColumnKey(driver, getUniqueKey());
         }
 
-        System.out.println("Page: " + getPageName() + " Number of Objects from UI: " + columnDataIDFromUI.size());
+        System.out.println("Page: " + getPageName() + ": Number of Objects from UI: " + columnDataIDFromUI.size());
 
         if (jsonObjects.size() != columnDataIDFromUI.size()) {
             String errMsg = "Failure: " + getPageName() + ": Number of items on UI are not equal to the number of items in JSON" +
diff --git a/esp/src/test-ui/tests/framework/pages/ECLWorkUnitsTest.java b/esp/src/test-ui/tests/framework/pages/ECLWorkUnitsTest.java
index 53d350b06dd..204d8353163 100644
--- a/esp/src/test-ui/tests/framework/pages/ECLWorkUnitsTest.java
+++ b/esp/src/test-ui/tests/framework/pages/ECLWorkUnitsTest.java
@@ -88,7 +88,7 @@ protected Object parseDataUIValue(Object dataUIValue, String columnName) {
         if (getCostColumns().contains(columnName)) {
             dataUIValue = Double.parseDouble(((String) dataUIValue).split(" ")[0]);
         } else if (columnName.equals("Total Cluster Time")) {
-            dataUIValue = TimeUtils.convertToDouble((String) dataUIValue);
+            dataUIValue = TimeUtils.convertToMilliseconds((String) dataUIValue);
         } else if (dataUIValue instanceof String) {
             dataUIValue = ((String) dataUIValue).trim();
         }
diff --git a/esp/src/test-ui/tests/framework/utility/TimeUtils.java b/esp/src/test-ui/tests/framework/utility/TimeUtils.java
index e2757310ca1..f2f5e6c1943 100644
--- a/esp/src/test-ui/tests/framework/utility/TimeUtils.java
+++ b/esp/src/test-ui/tests/framework/utility/TimeUtils.java
@@ -4,9 +4,13 @@
 import java.util.regex.Pattern;
 
 public class TimeUtils {
-    private static final Pattern TIME_PATTERN = Pattern.compile("(\\d+):(\\d+):(\\d+):(\\d+\\.\\d+)|(\\d+):(\\d+):(\\d+\\.\\d+)|(\\d+):(\\d+\\.\\d+)|(\\d+\\.\\d+)");
+    private static final Pattern TIME_PATTERN = Pattern.compile(
+            "(\\d+)\\s+days\\s+(\\d+):(\\d+):(\\d+\\.\\d+)|" +
+                    "(\\d+):(\\d+):(\\d+\\.\\d+)|" +
+                    "(\\d+):(\\d+\\.\\d+)|" +
+                    "(\\d+\\.\\d+)");
 
-    public static double convertToDouble(String time) {
+    public static long convertToMilliseconds(String time) {
         Matcher matcher = TIME_PATTERN.matcher(time);
         if (matcher.matches()) {
             int days = 0;
@@ -14,7 +18,7 @@ public static double convertToDouble(String time) {
             int minutes = 0;
             double seconds = 0.0;
 
-            if (matcher.group(1) != null) { // Matches d:h:m:s.s
+            if (matcher.group(1) != null) { // Matches d days h:m:s.s
                 days = Integer.parseInt(matcher.group(1));
                 hours = Integer.parseInt(matcher.group(2));
                 minutes = Integer.parseInt(matcher.group(3));
@@ -30,9 +34,9 @@ public static double convertToDouble(String time) {
                 seconds = Double.parseDouble(matcher.group(10));
             }
 
-            return days * 86400 + hours * 3600 + minutes * 60 + seconds;
+            return days * 86400000L + hours * 3600000L + minutes * 60000L + (long) (seconds * 1000);
         } else {
-            return Double.parseDouble(time);
+            return (long) (Double.parseDouble(time) * 1000);
         }
     }
 }

From 2a37498adf87e3c95733ca39ba340efb0ae128d9 Mon Sep 17 00:00:00 2001
From: Nisha Bagdwal <nishabagdwal@gmail.com>
Date: Thu, 13 Jun 2024 16:55:20 -0400
Subject: [PATCH 24/33] HPCC-31857 : Time Utils and additional check after
 navigation

1. Modify Time utils to have constants for days, hours, minutes, seconds in milliseconds
 2. Handle the case for malformed time string
 3. After navigating back to the original page, check if the dropdown value has changed or not.

Signed-off-by: Nisha Bagdwal <nishabagdwal@gmail.com>
---
 .../tests/framework/pages/ActivitiesTest.java |  5 +-
 .../tests/framework/pages/BaseTableTest.java  | 80 +++++++++++++++++--
 .../framework/pages/ECLWorkUnitsTest.java     | 52 +++++++++++-
 .../tests/framework/utility/TimeUtils.java    | 15 +++-
 4 files changed, 138 insertions(+), 14 deletions(-)

diff --git a/esp/src/test-ui/tests/framework/pages/ActivitiesTest.java b/esp/src/test-ui/tests/framework/pages/ActivitiesTest.java
index b415ed408d9..bfbf5682c98 100644
--- a/esp/src/test-ui/tests/framework/pages/ActivitiesTest.java
+++ b/esp/src/test-ui/tests/framework/pages/ActivitiesTest.java
@@ -47,7 +47,7 @@ private void testForNavigationLinks(WebDriver driver, List<NavigationWebElement>
             element.webElement().click();
 
             if (testTabsForNavigationLinks(driver, element)) {
-                String msg = "Success: Navigation Menu Link for " + element.name() + " URL : " + element.hrefValue();
+                String msg = "Success: Navigation Menu Link for " + element.name() + ". URL : " + element.hrefValue();
                 System.out.println(msg);
             } else {
                 String currentPage = getCurrentPage(driver);
@@ -81,9 +81,10 @@ private String getCurrentPage(WebDriver driver) {
 
     private boolean testTabsForNavigationLinks(WebDriver driver, NavigationWebElement element) {
         List<String> tabsList = tabsListMap.get(element.name());
+        String pageSource = driver.getPageSource();
 
         for (String tab : tabsList) {
-            if (!driver.getPageSource().contains(tab)) {
+            if (!pageSource.contains(tab)) {
                 return false;
             }
         }
diff --git a/esp/src/test-ui/tests/framework/pages/BaseTableTest.java b/esp/src/test-ui/tests/framework/pages/BaseTableTest.java
index 32257e7174a..352ffa3f3ec 100644
--- a/esp/src/test-ui/tests/framework/pages/BaseTableTest.java
+++ b/esp/src/test-ui/tests/framework/pages/BaseTableTest.java
@@ -8,6 +8,7 @@
 import org.openqa.selenium.WebDriver;
 import org.openqa.selenium.WebElement;
 import org.openqa.selenium.support.ui.ExpectedConditions;
+import org.openqa.selenium.support.ui.Select;
 import org.openqa.selenium.support.ui.WebDriverWait;
 
 import java.time.Duration;
@@ -33,7 +34,11 @@ public abstract class BaseTableTest<T> {
 
     protected abstract String getUniqueKey();
 
-    protected abstract Object parseDataUIValue(Object dataUIValue, String columnName);
+    protected abstract String[] getColumnKeysWithLinks();
+
+    protected abstract Object parseDataUIValue(Object dataUIValue, String columnName, Object dataIDUIValue, Logger logger);
+
+    protected abstract Object parseDataJSONValue(Object dataJSONValue, String columnName, Object dataIDUIValue, Logger logger);
 
     protected abstract List<T> parseJson(String filePath) throws Exception;
 
@@ -41,13 +46,68 @@ public abstract class BaseTableTest<T> {
 
     protected abstract void sortJsonUsingSortOrder(String currentSortOrder, List<T> jsonObjects, String columnKey);
 
+    protected abstract String getCurrentPage(WebDriver driver);
+
     protected void testPage() {
-        WebDriver driver = WebDriverHolder.getDriver();
-        Common.openWebPage(driver, getPageUrl());
-        Logger logger = LoggerHolder.getLogger();
+        try {
+            WebDriver driver = WebDriverHolder.getDriver();
+            Common.openWebPage(driver, getPageUrl());
+            Logger logger = LoggerHolder.getLogger();
+
+            testForAllText(driver, logger);
+            testContentAndSortingOrder(driver, logger);
+            testLinksInTable(driver, logger);
+
+        } catch (Exception ex) {
+            System.out.println(ex.getMessage());
+        }
+    }
+
+    private void testLinksInTable(WebDriver driver, Logger logger) {
+
+        for(String columnKey : getColumnKeysWithLinks()){
+
+            List<Object> values = getDataFromUIUsingColumnKey(driver, columnKey);
+
+            int i = 1;
+
+            for(Object value : values){
+                String name = value.toString().trim();
+                //WebElement element = driver.findElement(By.xpath("//div[contains(text(), '"+name+"')]/.."));
+                WebElement element = waitForElement(driver, By.xpath("//div[contains(text(), '" + name + "')]/.."));
+                String href = element.findElement(By.tagName("a")).getAttribute("href");
 
-        testForAllText(driver, logger);
-        testContentAndSortingOrder(driver, logger);
+                String dropdownValueBefore = getSelectedDropdownValue(driver);
+
+                element.click();
+
+                if (driver.getPageSource().contains(name)) {
+                    String msg = "Success: "+getPageName()+": Link Test Pass for " + i++ +". "+ name + ". URL : " + href;
+                    System.out.println(msg);
+                } else {
+                    String currentPage = getCurrentPage(driver);
+                    String errorMsg = "Failure: "+getPageName()+": Link Test Fail for " + i++ +". "+ name + " page failed. The current navigation page that we landed on is " + currentPage + ". Current URL : " + href;
+                    System.err.println(errorMsg);
+                    logger.severe(errorMsg);
+                }
+
+                driver.navigate().to(getPageUrl());
+                driver.navigate().refresh();
+
+                String dropdownValueAfter = getSelectedDropdownValue(driver);
+
+                // Log error if the dropdown value has changed
+                if (!dropdownValueBefore.equals(dropdownValueAfter)) {
+                    String dropdownErrorMsg = "Failure: "+getPageName()+": Dropdown value changed after navigating back. Before: " + dropdownValueBefore + ", After: " + dropdownValueAfter;
+                    System.err.println(dropdownErrorMsg);
+                    logger.severe(dropdownErrorMsg);
+                }
+            }
+        }
+    }
+
+    protected WebElement waitForElement(WebDriver driver, By locator) {
+        return new WebDriverWait(driver, Duration.ofSeconds(10)).until(ExpectedConditions.presenceOfElementLocated(locator));
     }
 
     private void testContentAndSortingOrder(WebDriver driver, Logger logger) {
@@ -180,7 +240,8 @@ private boolean compareData(List<Object> dataUI, List<Object> dataJSON, List<Obj
             Object dataJSONValue = dataJSON.get(i);
             Object dataIDUIValue = dataIDUI.get(i);
 
-            dataUIValue = parseDataUIValue(dataUIValue, columnName);
+            dataUIValue = parseDataUIValue(dataUIValue, columnName, dataIDUIValue, logger);
+            dataJSONValue = parseDataJSONValue(dataJSONValue, columnName, dataIDUIValue, logger);
 
             if (!checkValues(dataUIValue, dataJSONValue, dataIDUIValue, logger, columnName)) {
                 pass = false;
@@ -236,6 +297,11 @@ private void clickDropdown(WebDriver driver, int numOfItemsJSON) {
         Common.sleep();
     }
 
+    private String getSelectedDropdownValue(WebDriver driver) {
+        WebElement dropdown = waitForElement(driver, By.id("pageSize"));
+        return dropdown.getText().trim();
+    }
+
     private void testForAllText(WebDriver driver, Logger logger) {
         for (String text : getColumnNames()) {
             Common.checkTextPresent(driver, text, getPageName(), logger);
diff --git a/esp/src/test-ui/tests/framework/pages/ECLWorkUnitsTest.java b/esp/src/test-ui/tests/framework/pages/ECLWorkUnitsTest.java
index 204d8353163..6b4116053e2 100644
--- a/esp/src/test-ui/tests/framework/pages/ECLWorkUnitsTest.java
+++ b/esp/src/test-ui/tests/framework/pages/ECLWorkUnitsTest.java
@@ -7,11 +7,16 @@
 import framework.model.WUQueryRoot;
 import framework.utility.Common;
 import framework.utility.TimeUtils;
+import org.openqa.selenium.By;
+import org.openqa.selenium.NoSuchElementException;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
 import org.testng.annotations.Test;
 
 import java.io.File;
 import java.util.Arrays;
 import java.util.List;
+import java.util.logging.Logger;
 
 public class ECLWorkUnitsTest extends BaseTableTest<ECLWorkunit> {
 
@@ -45,6 +50,11 @@ protected String[] getColumnKeys() {
         return new String[]{"Wuid", "Owner", "Jobname", "Cluster", "State", "TotalClusterTime", "Compile Cost", "Execution Cost", "File Access Cost"};
     }
 
+    @Override
+    protected String[] getColumnKeysWithLinks() {
+        return new String[]{"Wuid"};
+    }
+
     @Override
     protected String getUniqueKeyName() {
         return "WUID";
@@ -84,11 +94,19 @@ protected Object getColumnDataFromJson(ECLWorkunit workunit, String columnKey) {
     }
 
     @Override
-    protected Object parseDataUIValue(Object dataUIValue, String columnName) {
+    protected Object parseDataUIValue(Object dataUIValue, String columnName, Object dataIDUIValue, Logger logger) {
         if (getCostColumns().contains(columnName)) {
             dataUIValue = Double.parseDouble(((String) dataUIValue).split(" ")[0]);
         } else if (columnName.equals("Total Cluster Time")) {
-            dataUIValue = TimeUtils.convertToMilliseconds((String) dataUIValue);
+            long timeInMilliSecs = TimeUtils.convertToMilliseconds((String) dataUIValue);
+            if(timeInMilliSecs == -1){ // Malformed time string
+                String errMsg = "Failure: " + getPageName() + ": Incorrect time format for " + columnName + " : " + dataUIValue + " in UI for " + getUniqueKeyName() + " : " + dataIDUIValue;
+                System.out.println(errMsg);
+                logger.severe(errMsg);
+                return dataUIValue;
+            }
+
+            return timeInMilliSecs;
         } else if (dataUIValue instanceof String) {
             dataUIValue = ((String) dataUIValue).trim();
         }
@@ -96,6 +114,23 @@ protected Object parseDataUIValue(Object dataUIValue, String columnName) {
         return dataUIValue;
     }
 
+    @Override
+    protected Object parseDataJSONValue(Object dataJSONValue, String columnName, Object dataIDUIValue, Logger logger) {
+        if (columnName.equals("Total Cluster Time")) {
+            long timeInMilliSecs = (long) dataJSONValue;
+            if(timeInMilliSecs == -1){ // Malformed time string
+                String errMsg = "Failure: " + getPageName() + ": Incorrect time format for " + columnName + " in JSON for " + getUniqueKeyName() + " : " + dataIDUIValue;
+                System.out.println(errMsg);
+                logger.severe(errMsg);
+                return dataJSONValue;
+            }
+
+            return timeInMilliSecs;
+        }
+
+        return dataJSONValue;
+    }
+
     @Override
     protected void sortJsonUsingSortOrder(String currentSortOrder, List<ECLWorkunit> workunitsJson, String columnKey) {
         switch (currentSortOrder) {
@@ -104,4 +139,17 @@ protected void sortJsonUsingSortOrder(String currentSortOrder, List<ECLWorkunit>
             case "none" -> descendingSortJson(workunitsJson, getUniqueKey());
         }
     }
+
+    @Override
+    protected String getCurrentPage(WebDriver driver) {
+        try {
+            WebElement element = waitForElement(driver, By.id("wuid"));
+            if (element != null) {
+                return element.getAttribute("title");
+            }
+        } catch (NoSuchElementException e) {
+            return "Invalid Page";
+        }
+        return "Invalid Page";
+    }
 }
\ No newline at end of file
diff --git a/esp/src/test-ui/tests/framework/utility/TimeUtils.java b/esp/src/test-ui/tests/framework/utility/TimeUtils.java
index f2f5e6c1943..c128a078677 100644
--- a/esp/src/test-ui/tests/framework/utility/TimeUtils.java
+++ b/esp/src/test-ui/tests/framework/utility/TimeUtils.java
@@ -10,6 +10,11 @@ public class TimeUtils {
                     "(\\d+):(\\d+\\.\\d+)|" +
                     "(\\d+\\.\\d+)");
 
+    private static final long MILLISECONDS_IN_A_SECOND = 1000;
+    private static final long MILLISECONDS_IN_A_MINUTE = 60 * MILLISECONDS_IN_A_SECOND;
+    private static final long MILLISECONDS_IN_AN_HOUR = 60 * MILLISECONDS_IN_A_MINUTE;
+    private static final long MILLISECONDS_IN_A_DAY = 24 * MILLISECONDS_IN_AN_HOUR;
+
     public static long convertToMilliseconds(String time) {
         Matcher matcher = TIME_PATTERN.matcher(time);
         if (matcher.matches()) {
@@ -34,9 +39,13 @@ public static long convertToMilliseconds(String time) {
                 seconds = Double.parseDouble(matcher.group(10));
             }
 
-            return days * 86400000L + hours * 3600000L + minutes * 60000L + (long) (seconds * 1000);
-        } else {
-            return (long) (Double.parseDouble(time) * 1000);
+            return days * MILLISECONDS_IN_A_DAY +
+                    hours * MILLISECONDS_IN_AN_HOUR +
+                    minutes * MILLISECONDS_IN_A_MINUTE +
+                    (long) (seconds * MILLISECONDS_IN_A_SECOND);
+
+        } else { // Malformed time string
+            return -1;
         }
     }
 }

From 892dd534b1f8e87739af7f8e12d3fef25ecf5862 Mon Sep 17 00:00:00 2001
From: Nisha Bagdwal <nishabagdwal@gmail.com>
Date: Fri, 14 Jun 2024 12:09:37 -0400
Subject: [PATCH 25/33] HPCC-31857 : Time Utils Changes

Added a constant for malformed string. Changed the time parsing for seconds from Double to Integers for better performance.

Signed-off-by: Nisha Bagdwal <nishabagdwal@gmail.com>
---
 .../tests/framework/config/Config.java        |  2 +
 .../tests/framework/pages/BaseTableTest.java  | 11 ++--
 .../framework/pages/ECLWorkUnitsTest.java     |  4 +-
 .../tests/framework/utility/TimeUtils.java    | 58 +++++++++++--------
 4 files changed, 44 insertions(+), 31 deletions(-)

diff --git a/esp/src/test-ui/tests/framework/config/Config.java b/esp/src/test-ui/tests/framework/config/Config.java
index b549b972d7f..709798c1205 100644
--- a/esp/src/test-ui/tests/framework/config/Config.java
+++ b/esp/src/test-ui/tests/framework/config/Config.java
@@ -15,4 +15,6 @@ public class Config {
     public static final String ACTIVITIES_URL = "esp/files/index.html#/activities";
     public static final String ECL_WORK_UNITS_URL = "esp/files/index.html#/workunits";
     public static final int[] dropdownValues = {10, 25, 50, 100, 250, 500, 1000};
+
+    public static final int MALFORMED_TIME_STRING = -1;
 }
diff --git a/esp/src/test-ui/tests/framework/pages/BaseTableTest.java b/esp/src/test-ui/tests/framework/pages/BaseTableTest.java
index 352ffa3f3ec..6468196aff5 100644
--- a/esp/src/test-ui/tests/framework/pages/BaseTableTest.java
+++ b/esp/src/test-ui/tests/framework/pages/BaseTableTest.java
@@ -8,7 +8,6 @@
 import org.openqa.selenium.WebDriver;
 import org.openqa.selenium.WebElement;
 import org.openqa.selenium.support.ui.ExpectedConditions;
-import org.openqa.selenium.support.ui.Select;
 import org.openqa.selenium.support.ui.WebDriverWait;
 
 import java.time.Duration;
@@ -65,13 +64,13 @@ protected void testPage() {
 
     private void testLinksInTable(WebDriver driver, Logger logger) {
 
-        for(String columnKey : getColumnKeysWithLinks()){
+        for (String columnKey : getColumnKeysWithLinks()) {
 
             List<Object> values = getDataFromUIUsingColumnKey(driver, columnKey);
 
             int i = 1;
 
-            for(Object value : values){
+            for (Object value : values) {
                 String name = value.toString().trim();
                 //WebElement element = driver.findElement(By.xpath("//div[contains(text(), '"+name+"')]/.."));
                 WebElement element = waitForElement(driver, By.xpath("//div[contains(text(), '" + name + "')]/.."));
@@ -82,11 +81,11 @@ private void testLinksInTable(WebDriver driver, Logger logger) {
                 element.click();
 
                 if (driver.getPageSource().contains(name)) {
-                    String msg = "Success: "+getPageName()+": Link Test Pass for " + i++ +". "+ name + ". URL : " + href;
+                    String msg = "Success: " + getPageName() + ": Link Test Pass for " + i++ + ". " + name + ". URL : " + href;
                     System.out.println(msg);
                 } else {
                     String currentPage = getCurrentPage(driver);
-                    String errorMsg = "Failure: "+getPageName()+": Link Test Fail for " + i++ +". "+ name + " page failed. The current navigation page that we landed on is " + currentPage + ". Current URL : " + href;
+                    String errorMsg = "Failure: " + getPageName() + ": Link Test Fail for " + i++ + ". " + name + " page failed. The current navigation page that we landed on is " + currentPage + ". Current URL : " + href;
                     System.err.println(errorMsg);
                     logger.severe(errorMsg);
                 }
@@ -98,7 +97,7 @@ private void testLinksInTable(WebDriver driver, Logger logger) {
 
                 // Log error if the dropdown value has changed
                 if (!dropdownValueBefore.equals(dropdownValueAfter)) {
-                    String dropdownErrorMsg = "Failure: "+getPageName()+": Dropdown value changed after navigating back. Before: " + dropdownValueBefore + ", After: " + dropdownValueAfter;
+                    String dropdownErrorMsg = "Failure: " + getPageName() + ": Dropdown value changed after navigating back. Before: " + dropdownValueBefore + ", After: " + dropdownValueAfter;
                     System.err.println(dropdownErrorMsg);
                     logger.severe(dropdownErrorMsg);
                 }
diff --git a/esp/src/test-ui/tests/framework/pages/ECLWorkUnitsTest.java b/esp/src/test-ui/tests/framework/pages/ECLWorkUnitsTest.java
index 6b4116053e2..b5837fb4d6b 100644
--- a/esp/src/test-ui/tests/framework/pages/ECLWorkUnitsTest.java
+++ b/esp/src/test-ui/tests/framework/pages/ECLWorkUnitsTest.java
@@ -99,7 +99,7 @@ protected Object parseDataUIValue(Object dataUIValue, String columnName, Object
             dataUIValue = Double.parseDouble(((String) dataUIValue).split(" ")[0]);
         } else if (columnName.equals("Total Cluster Time")) {
             long timeInMilliSecs = TimeUtils.convertToMilliseconds((String) dataUIValue);
-            if(timeInMilliSecs == -1){ // Malformed time string
+            if (timeInMilliSecs == Config.MALFORMED_TIME_STRING) {
                 String errMsg = "Failure: " + getPageName() + ": Incorrect time format for " + columnName + " : " + dataUIValue + " in UI for " + getUniqueKeyName() + " : " + dataIDUIValue;
                 System.out.println(errMsg);
                 logger.severe(errMsg);
@@ -118,7 +118,7 @@ protected Object parseDataUIValue(Object dataUIValue, String columnName, Object
     protected Object parseDataJSONValue(Object dataJSONValue, String columnName, Object dataIDUIValue, Logger logger) {
         if (columnName.equals("Total Cluster Time")) {
             long timeInMilliSecs = (long) dataJSONValue;
-            if(timeInMilliSecs == -1){ // Malformed time string
+            if (timeInMilliSecs == Config.MALFORMED_TIME_STRING) {
                 String errMsg = "Failure: " + getPageName() + ": Incorrect time format for " + columnName + " in JSON for " + getUniqueKeyName() + " : " + dataIDUIValue;
                 System.out.println(errMsg);
                 logger.severe(errMsg);
diff --git a/esp/src/test-ui/tests/framework/utility/TimeUtils.java b/esp/src/test-ui/tests/framework/utility/TimeUtils.java
index c128a078677..d15f72b2a13 100644
--- a/esp/src/test-ui/tests/framework/utility/TimeUtils.java
+++ b/esp/src/test-ui/tests/framework/utility/TimeUtils.java
@@ -1,14 +1,16 @@
 package framework.utility;
 
+import framework.config.Config;
+
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
 public class TimeUtils {
     private static final Pattern TIME_PATTERN = Pattern.compile(
-            "(\\d+)\\s+days\\s+(\\d+):(\\d+):(\\d+\\.\\d+)|" +
-                    "(\\d+):(\\d+):(\\d+\\.\\d+)|" +
-                    "(\\d+):(\\d+\\.\\d+)|" +
-                    "(\\d+\\.\\d+)");
+            "\\s*(\\d+)\\s+days\\s+(\\d+):(\\d+):(\\d+).(\\d+)|" +
+                    "(\\d+):(\\d+):(\\d+).(\\d+)|" +
+                    "(\\d+):(\\d+).(\\d+)|" +
+                    "(\\d+).(\\d+)\\s*");
 
     private static final long MILLISECONDS_IN_A_SECOND = 1000;
     private static final long MILLISECONDS_IN_A_MINUTE = 60 * MILLISECONDS_IN_A_SECOND;
@@ -21,31 +23,41 @@ public static long convertToMilliseconds(String time) {
             int days = 0;
             int hours = 0;
             int minutes = 0;
-            double seconds = 0.0;
-
-            if (matcher.group(1) != null) { // Matches d days h:m:s.s
-                days = Integer.parseInt(matcher.group(1));
-                hours = Integer.parseInt(matcher.group(2));
-                minutes = Integer.parseInt(matcher.group(3));
-                seconds = Double.parseDouble(matcher.group(4));
-            } else if (matcher.group(5) != null) { // Matches h:m:s.s
-                hours = Integer.parseInt(matcher.group(5));
-                minutes = Integer.parseInt(matcher.group(6));
-                seconds = Double.parseDouble(matcher.group(7));
-            } else if (matcher.group(8) != null) { // Matches m:s.s
-                minutes = Integer.parseInt(matcher.group(8));
-                seconds = Double.parseDouble(matcher.group(9));
-            } else if (matcher.group(10) != null) { // Matches s.s
-                seconds = Double.parseDouble(matcher.group(10));
+            int seconds = 0;
+            int milliSeconds = 0;
+
+            try {
+                if (matcher.group(1) != null) { // Matches d days h:m:s.s
+                    days = Integer.parseInt(matcher.group(1));
+                    hours = Integer.parseInt(matcher.group(2));
+                    minutes = Integer.parseInt(matcher.group(3));
+                    seconds = Integer.parseInt(matcher.group(4));
+                    milliSeconds = Integer.parseInt(matcher.group(5));
+                } else if (matcher.group(6) != null) { // Matches h:m:s.s
+                    hours = Integer.parseInt(matcher.group(6));
+                    minutes = Integer.parseInt(matcher.group(7));
+                    seconds = Integer.parseInt(matcher.group(8));
+                    milliSeconds = Integer.parseInt(matcher.group(9));
+                } else if (matcher.group(10) != null) { // Matches m:s.s
+                    minutes = Integer.parseInt(matcher.group(10));
+                    seconds = Integer.parseInt(matcher.group(11));
+                    milliSeconds = Integer.parseInt(matcher.group(12));
+                } else if (matcher.group(13) != null) { // Matches s.s
+                    seconds = Integer.parseInt(matcher.group(13));
+                    milliSeconds = Integer.parseInt(matcher.group(14));
+                }
+            } catch (NumberFormatException e) {
+                return Config.MALFORMED_TIME_STRING;
             }
 
             return days * MILLISECONDS_IN_A_DAY +
                     hours * MILLISECONDS_IN_AN_HOUR +
                     minutes * MILLISECONDS_IN_A_MINUTE +
-                    (long) (seconds * MILLISECONDS_IN_A_SECOND);
+                    seconds * MILLISECONDS_IN_A_SECOND +
+                    milliSeconds;
 
-        } else { // Malformed time string
-            return -1;
+        } else {
+            return Config.MALFORMED_TIME_STRING;
         }
     }
 }

From 8f4b4b16276054b8e2e679d464f46563063ce7d7 Mon Sep 17 00:00:00 2001
From: Nisha Bagdwal <nishabagdwal@gmail.com>
Date: Fri, 14 Jun 2024 12:58:54 -0400
Subject: [PATCH 26/33] HPCC-31857 : Added New File

Added a new file for documentation.

Signed-off-by: Nisha Bagdwal <nishabagdwal@gmail.com>
---
 esp/src/test-ui/tests/framework/DesignDocument.md | 0
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 esp/src/test-ui/tests/framework/DesignDocument.md

diff --git a/esp/src/test-ui/tests/framework/DesignDocument.md b/esp/src/test-ui/tests/framework/DesignDocument.md
new file mode 100644
index 00000000000..e69de29bb2d

From b02bad055bc04ef474e899a9ecd4327c41f10c28 Mon Sep 17 00:00:00 2001
From: Nisha Bagdwal <nishabagdwal@gmail.com>
Date: Fri, 14 Jun 2024 15:47:55 -0400
Subject: [PATCH 27/33] HPCC-31857 : Documentation

Added documentation for TestRunner class.

Signed-off-by: Nisha Bagdwal <nishabagdwal@gmail.com>
---
 .../test-ui/tests/framework/DesignDocument.md |   0
 .../framework/documentation/DesignDocument.md |  18 ++++++++++++++++++
 .../tests/framework/documentation/img.png     | Bin 0 -> 14385 bytes
 .../tests/framework/documentation/img_1.png   | Bin 0 -> 2507 bytes
 .../tests/framework/documentation/img_2.png   | Bin 0 -> 3979 bytes
 .../tests/framework/documentation/img_3.png   | Bin 0 -> 3296 bytes
 .../tests/framework/documentation/img_4.png   | Bin 0 -> 2324 bytes
 .../tests/framework/documentation/img_5.png   | Bin 0 -> 7677 bytes
 8 files changed, 18 insertions(+)
 delete mode 100644 esp/src/test-ui/tests/framework/DesignDocument.md
 create mode 100644 esp/src/test-ui/tests/framework/documentation/DesignDocument.md
 create mode 100644 esp/src/test-ui/tests/framework/documentation/img.png
 create mode 100644 esp/src/test-ui/tests/framework/documentation/img_1.png
 create mode 100644 esp/src/test-ui/tests/framework/documentation/img_2.png
 create mode 100644 esp/src/test-ui/tests/framework/documentation/img_3.png
 create mode 100644 esp/src/test-ui/tests/framework/documentation/img_4.png
 create mode 100644 esp/src/test-ui/tests/framework/documentation/img_5.png

diff --git a/esp/src/test-ui/tests/framework/DesignDocument.md b/esp/src/test-ui/tests/framework/DesignDocument.md
deleted file mode 100644
index e69de29bb2d..00000000000
diff --git a/esp/src/test-ui/tests/framework/documentation/DesignDocument.md b/esp/src/test-ui/tests/framework/documentation/DesignDocument.md
new file mode 100644
index 00000000000..8a5284d8cea
--- /dev/null
+++ b/esp/src/test-ui/tests/framework/documentation/DesignDocument.md
@@ -0,0 +1,18 @@
+**The Class Design and Code Flow for ECL Watch Test Suite**
+
+1. TestRunner.java
+
+![img_2.png](img_2.png)
+
+Description: The code for ECL Watch Tests starts from the main method written inside this class.
+This method calls the setupLogger() method to set up logging for the tests, next it calls the setupWebDriver()
+method which sets the ChromeOptions and creates a web driver using Chrome Driver. After getting the
+logger and driver, this method calls the loadClasses() method to load all the java classes that contains test cases
+for distinct web pages. The names of all those classes are stored in config/TestClasses.java file. After loading
+all the java classes, the code creates a test injector with the driver and logger using the setup/TestInjector. We need
+this test injector because we need to pass our driver and logger to all of our classes that need to run tests. After
+setting the test injector, we call the run method on the TestNG object, which then runs the tests written in the
+loaded java classes. Below are the UML diagrams of the classes used in TestRunner class.
+
+![img_3.png](img_3.png) ![img_4.png](img_4.png) ![img_5.png](img_5.png)
+
diff --git a/esp/src/test-ui/tests/framework/documentation/img.png b/esp/src/test-ui/tests/framework/documentation/img.png
new file mode 100644
index 0000000000000000000000000000000000000000..657bd05e3839b6f84c60d0e446ed542e0e4813d0
GIT binary patch
literal 14385
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

literal 0
HcmV?d00001

diff --git a/esp/src/test-ui/tests/framework/documentation/img_1.png b/esp/src/test-ui/tests/framework/documentation/img_1.png
new file mode 100644
index 0000000000000000000000000000000000000000..21e040c25885339f6d75520f71d1769d47c194f8
GIT binary patch
literal 2507
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
Rx}*W}XRCL*o;mQ^zW{)<8h`)*

literal 0
HcmV?d00001

diff --git a/esp/src/test-ui/tests/framework/documentation/img_2.png b/esp/src/test-ui/tests/framework/documentation/img_2.png
new file mode 100644
index 0000000000000000000000000000000000000000..066710df8b2d8ca50707d304a717d78337b1a0d6
GIT binary patch
literal 3979
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
Wtnnsd26D+pCBK8)E&Th3AN>bG;Eh=T

literal 0
HcmV?d00001

diff --git a/esp/src/test-ui/tests/framework/documentation/img_3.png b/esp/src/test-ui/tests/framework/documentation/img_3.png
new file mode 100644
index 0000000000000000000000000000000000000000..6d9370dada3720217e4b76ce76377d045fb9ae70
GIT binary patch
literal 3296
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

literal 0
HcmV?d00001

diff --git a/esp/src/test-ui/tests/framework/documentation/img_4.png b/esp/src/test-ui/tests/framework/documentation/img_4.png
new file mode 100644
index 0000000000000000000000000000000000000000..913e8d519fa36031a34507ec607ddb3447a9089e
GIT binary patch
literal 2324
zcmd^BeM}Q)7(b&!XQs=xWF}kGE!%X+tQz7XA3`P?M8zslI)-gcTw$UXw{kscr3@3}
z+=n<3>ld&LYV8NDQUU34c8ggSQ8@+bS<00Wg-Va!F|a+_>-Bb;Y|;6z%a-h)_j%sr
z$?x|*@B99Kc@A&coH=Lq8?ylbn3J`BZ4LlTyTa#(X2tRA&g#@v05Hpwwf3XDebT_)
z+lqV1ug<s?<{G>Q7tHufb7q};b5VaN38?z&mt*>YZ{NIJ8JiBs?hA3?OJULYv~kf(
zX~31Qf1df1c*PVjwIpsKAk)v^Um1&D{NQ?vrCpk^=h$pux#aYY=NKvfK7(+-4H}|f
zj%JTC=dyE#WS5y#Sc#69*%!O3dYT))@JTUrTb(R0J$mV3Meicx-e1XYAf34SY<4|@
z+L5cI1PXVz!jZ5D*0@l~6O~7smLVBB3~_-Hv6(HYHE7uZwUu-cYK2^9>nko`JJnW!
z5EnRifhv#^NzuODI`K-X8=&4}Qxr9MAG^UEsT~h?kpuQ{370piuBdIfDiAtIMX3(L
z#PMdbzT$pZn=;dz8-WHE8Mn+Y?hQ+{=fk904w3Htt(B&7#Hw=ENUrpN-5OVIcOLGI
zm%IGC*{E6|hdYZPo@^Og_$-+})t<tX)R*CkQiIAL6m^-%F&r^xPT=nD#QED#JftpX
z=e(VyHo{%RJke@9oYou?q9dSFDx)1^w-C%Fa5fT<Ml6xiQX~yzKwE4<iIlFtW^;6U
zrh7L&KJea5cEaR{I&>44WSH>2!4(tf@X@B|k;p($yAtN%R6J<Vi+4CMb{l%OB!3b=
z<roZB(KWH9?O97MjL>n*Ga_mH`G4?1amzC!oB8xNE<E@tU~i)CeVFwEa8hvd;=dk~
zW}lE3oCtRB(r4#P1I}$!TAqI#DxB|p%{ed4Wr$XA1T@t=crSsjXrsv<4S!YdR>BZg
z$H=$~`93j|TSt{it_fu2ZL}$(fPHs|6VTAyV3<rJ-XRBw$SL!rnT1vihhg8;VUFZX
zjI}4_PZTnSrLvz}Lk1?`iv<`e8uF#9Ibv`N>+x%~E>ap)ig^xa{A#pO>rb<p(2MXD
z!tEWZCE*Pe|4)ym_NH*-#D-$iX&Ktb{!IY3Vn5jGuk#}|pI>{EQnx{OgDO<i!1Ch3
zqNeM9BtPAt!BRmuYIV6?h`4-puAK+!{E?7Ra3l(&s>SIxTY*pA#&q<`@nVQJVuNoX
z$}>%CKz1DlijzHZ43T&xGQGv234QNl0-dmQv>SJuF?1FA`&b1TawwsYAN08s;U^0{
z!=f%#KE5MeE^3Ery*6$BO<`~oLJr_I%!~+i-VR<A;qScR%&p?&Tu@^;E;8GLlSIey
zz{F`hDc6OlD>g9I16--OL1q)~<lJ;2n2dKs+&G(~8cB#Z=NA(`Oc@W?h#^#>pM))i
za3W^uA3juePTD|{7|~n8<?87@HF@i`jk=cFe&Zt_aM&T*y5JgAoYMMOiDtD`%I)Ea
zgF9PgE@jX$Id<x4A&V!D2P_UVo6$8_qQy0f(wh>4kxTvQXWjlAC0vaj;&rrMYtqHu
zHwkPSo3z2fI-qS-J?G+Ifbf!$zQCZ{BN^OUSz3Lb@5&#d#sXF$3_WO3P>(9im_gwr
zU67?5_Y7l*f_udrE8&i|WZWc_cRD?qXV|8e`WEKVZp>0|WF*}9ZYhP=nKd{XykRU_
zIap_8;IZ3@Ak~lb52v7Igc3xz(8MVR6p#ic_<p@kZ(~t)+0%B>)>XL%YKXYevqmPk
zDR8H=K8qQ3SWTW3{aEhf9)Xh&JkItW#_-qPU+9E;G={MnJ<Z<%u>HtnWktjrla121
zdG`m|gN3}5sn)atwex>rEB};T{l{>R9N-OFj!b@1uoxJxdUhBYc1B-MjzgPOoA_x5
O$Xd5~t#!@z1AhQwxV?n{

literal 0
HcmV?d00001

diff --git a/esp/src/test-ui/tests/framework/documentation/img_5.png b/esp/src/test-ui/tests/framework/documentation/img_5.png
new file mode 100644
index 0000000000000000000000000000000000000000..eba74b343a9472816019316a5ac447029d0d85cb
GIT binary patch
literal 7677
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

literal 0
HcmV?d00001


From 90f6dae2f121000b097f75173c0813485af65bba Mon Sep 17 00:00:00 2001
From: Nisha Bagdwal <nishabagdwal@gmail.com>
Date: Fri, 14 Jun 2024 15:50:22 -0400
Subject: [PATCH 28/33] HPCC-31857 : Documentation

Deleted unnecessary images.

Signed-off-by: Nisha Bagdwal <nishabagdwal@gmail.com>
---
 .../tests/framework/documentation/img.png       | Bin 14385 -> 0 bytes
 .../tests/framework/documentation/img_1.png     | Bin 2507 -> 0 bytes
 2 files changed, 0 insertions(+), 0 deletions(-)
 delete mode 100644 esp/src/test-ui/tests/framework/documentation/img.png
 delete mode 100644 esp/src/test-ui/tests/framework/documentation/img_1.png

diff --git a/esp/src/test-ui/tests/framework/documentation/img.png b/esp/src/test-ui/tests/framework/documentation/img.png
deleted file mode 100644
index 657bd05e3839b6f84c60d0e446ed542e0e4813d0..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 14385
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

diff --git a/esp/src/test-ui/tests/framework/documentation/img_1.png b/esp/src/test-ui/tests/framework/documentation/img_1.png
deleted file mode 100644
index 21e040c25885339f6d75520f71d1769d47c194f8..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 2507
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
Rx}*W}XRCL*o;mQ^zW{)<8h`)*


From bb3a06320ba310d62b0a30d3bc19b462633c90af Mon Sep 17 00:00:00 2001
From: Nisha Bagdwal <nishabagdwal@gmail.com>
Date: Fri, 14 Jun 2024 15:56:19 -0400
Subject: [PATCH 29/33] HPCC-31857 : Documentation

Added content for TestRunner class.

Signed-off-by: Nisha Bagdwal <nishabagdwal@gmail.com>
---
 .../tests/framework/documentation/DesignDocument.md        | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/esp/src/test-ui/tests/framework/documentation/DesignDocument.md b/esp/src/test-ui/tests/framework/documentation/DesignDocument.md
index 8a5284d8cea..001850e5c8d 100644
--- a/esp/src/test-ui/tests/framework/documentation/DesignDocument.md
+++ b/esp/src/test-ui/tests/framework/documentation/DesignDocument.md
@@ -7,9 +7,12 @@
 Description: The code for ECL Watch Tests starts from the main method written inside this class.
 This method calls the setupLogger() method to set up logging for the tests, next it calls the setupWebDriver()
 method which sets the ChromeOptions and creates a web driver using Chrome Driver. After getting the
-logger and driver, this method calls the loadClasses() method to load all the java classes that contains test cases
+logger and driver, this method creates a testNG object and calls the loadClasses() method to load all the java classes
+that contains test cases
 for distinct web pages. The names of all those classes are stored in config/TestClasses.java file. After loading
-all the java classes, the code creates a test injector with the driver and logger using the setup/TestInjector. We need
+all the java classes, the code sets the classes in the testNG object and creates a test injector with the driver and
+logger using
+the setup/TestInjector, then sets up this injector as a listener to the testNG object. We need
 this test injector because we need to pass our driver and logger to all of our classes that need to run tests. After
 setting the test injector, we call the run method on the TestNG object, which then runs the tests written in the
 loaded java classes. Below are the UML diagrams of the classes used in TestRunner class.

From 38872aeefd6f2ab308536752ad9f5e649ca45d8f Mon Sep 17 00:00:00 2001
From: Nisha Bagdwal <nishabagdwal@gmail.com>
Date: Fri, 14 Jun 2024 16:07:08 -0400
Subject: [PATCH 30/33] HPCC-31857 : Documentation

Modified content for TestRunner class.

Signed-off-by: Nisha Bagdwal <nishabagdwal@gmail.com>
---
 .../framework/documentation/DesignDocument.md | 61 +++++++++++++++----
 1 file changed, 49 insertions(+), 12 deletions(-)

diff --git a/esp/src/test-ui/tests/framework/documentation/DesignDocument.md b/esp/src/test-ui/tests/framework/documentation/DesignDocument.md
index 001850e5c8d..7a9cd9e4384 100644
--- a/esp/src/test-ui/tests/framework/documentation/DesignDocument.md
+++ b/esp/src/test-ui/tests/framework/documentation/DesignDocument.md
@@ -4,18 +4,55 @@
 
 ![img_2.png](img_2.png)
 
-Description: The code for ECL Watch Tests starts from the main method written inside this class.
-This method calls the setupLogger() method to set up logging for the tests, next it calls the setupWebDriver()
-method which sets the ChromeOptions and creates a web driver using Chrome Driver. After getting the
-logger and driver, this method creates a testNG object and calls the loadClasses() method to load all the java classes
-that contains test cases
-for distinct web pages. The names of all those classes are stored in config/TestClasses.java file. After loading
-all the java classes, the code sets the classes in the testNG object and creates a test injector with the driver and
-logger using
-the setup/TestInjector, then sets up this injector as a listener to the testNG object. We need
-this test injector because we need to pass our driver and logger to all of our classes that need to run tests. After
-setting the test injector, we call the run method on the TestNG object, which then runs the tests written in the
-loaded java classes. Below are the UML diagrams of the classes used in TestRunner class.
+The TestRunner class is responsible for setting up and executing automated tests using the TestNG framework in a
+Selenium-based testing environment. It initializes the WebDriver, loads test classes, configures logging, and runs the
+tests.
+
+**Code Flow:**
+
+1. main Method
+
+The entry point of the application. It performs the following steps:
+
+- Calls setupLogger to configure the logging system.
+- Logs test execution details to a specified file.
+- Calls setupWebDriver to initialize the WebDriver based on the environment (local or remote).
+- Creates an instance of TestNG.
+- Sets the test classes to be run by calling loadClasses.
+- Adds a TestInjector listener to inject dependencies (logger and driver) into the tests.
+- Runs the tests using TestNG.
+- Quits the WebDriver session after the tests have completed.
+
+2. setupWebDriver Method
+
+Initializes and returns a WebDriver instance configured for headless Chrome operation:
+
+- Configures ChromeDriver to run in headless mode, disables sandbox security, and sets log level to errors only.
+- Suppresses logs generated by ChromeDriver.
+- Checks if the tests are running locally using Common.isRunningOnLocal.
+- If local, sets up the driver to connect to a local Selenium server.
+- If not local, initializes a standard ChromeDriver.
+
+3. loadClasses Method
+
+Loads the test classes specified in TestClasses.testClassesList:
+
+- Iterates over the testClassesList and loads each class by its fully qualified name.
+- Adds the loaded class to the list classes.
+- Catches and prints any ClassNotFoundException.
+
+4. setupLogger Method
+
+Configures the logger for logging test execution details:
+
+- Creates a logger for TestRunner.
+- Sets up a FileHandler to log messages to a file specified by Config.LOG_FILE.
+- Uses a SimpleFormatter to format the log messages.
+- Adds the handler to the logger and sets the log level to ALL.
+- Catches and prints any IOException.
+- Turns off all logging from the Selenium WebDriver to reduce noise in the logs.
+
+Below are the UML diagrams of the classes used in TestRunner class.
 
 ![img_3.png](img_3.png) ![img_4.png](img_4.png) ![img_5.png](img_5.png)
 

From e16ef4a5af056891fbbd944212ce54e679039802 Mon Sep 17 00:00:00 2001
From: Nisha Bagdwal <nishabagdwal@gmail.com>
Date: Mon, 17 Jun 2024 10:37:17 -0400
Subject: [PATCH 31/33] HPCC-31857 : Documentation

Added documentation for more classes

Signed-off-by: Nisha Bagdwal <nishabagdwal@gmail.com>
---
 .../tests/framework/config/Config.java        |   1 -
 .../tests/framework/documentation/Config.png  | Bin 0 -> 13193 bytes
 .../framework/documentation/DesignDocument.md |  86 +++++++++++++++++-
 .../framework/documentation/LoggerHolder.png  | Bin 0 -> 2861 bytes
 .../{img_3.png => TestClass.png}              | Bin
 .../{img_4.png => TestClasses.png}            | Bin
 .../{img_5.png => TestInjector.png}           | Bin
 .../{img_2.png => TestRunner.png}             | Bin
 .../documentation/WebDriverHolder.png         | Bin 0 -> 3135 bytes
 9 files changed, 82 insertions(+), 5 deletions(-)
 create mode 100644 esp/src/test-ui/tests/framework/documentation/Config.png
 create mode 100644 esp/src/test-ui/tests/framework/documentation/LoggerHolder.png
 rename esp/src/test-ui/tests/framework/documentation/{img_3.png => TestClass.png} (100%)
 rename esp/src/test-ui/tests/framework/documentation/{img_4.png => TestClasses.png} (100%)
 rename esp/src/test-ui/tests/framework/documentation/{img_5.png => TestInjector.png} (100%)
 rename esp/src/test-ui/tests/framework/documentation/{img_2.png => TestRunner.png} (100%)
 create mode 100644 esp/src/test-ui/tests/framework/documentation/WebDriverHolder.png

diff --git a/esp/src/test-ui/tests/framework/config/Config.java b/esp/src/test-ui/tests/framework/config/Config.java
index 709798c1205..8536558661f 100644
--- a/esp/src/test-ui/tests/framework/config/Config.java
+++ b/esp/src/test-ui/tests/framework/config/Config.java
@@ -15,6 +15,5 @@ public class Config {
     public static final String ACTIVITIES_URL = "esp/files/index.html#/activities";
     public static final String ECL_WORK_UNITS_URL = "esp/files/index.html#/workunits";
     public static final int[] dropdownValues = {10, 25, 50, 100, 250, 500, 1000};
-
     public static final int MALFORMED_TIME_STRING = -1;
 }
diff --git a/esp/src/test-ui/tests/framework/documentation/Config.png b/esp/src/test-ui/tests/framework/documentation/Config.png
new file mode 100644
index 0000000000000000000000000000000000000000..e33466b0fb8d7c95774a976fa76b5eb491869edb
GIT binary patch
literal 13193
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

literal 0
HcmV?d00001

diff --git a/esp/src/test-ui/tests/framework/documentation/DesignDocument.md b/esp/src/test-ui/tests/framework/documentation/DesignDocument.md
index 7a9cd9e4384..8bc8d0f3962 100644
--- a/esp/src/test-ui/tests/framework/documentation/DesignDocument.md
+++ b/esp/src/test-ui/tests/framework/documentation/DesignDocument.md
@@ -1,8 +1,8 @@
 **The Class Design and Code Flow for ECL Watch Test Suite**
 
-1. TestRunner.java
+**1. TestRunner.java**
 
-![img_2.png](img_2.png)
+![img_2.png](TestRunner.png)
 
 The TestRunner class is responsible for setting up and executing automated tests using the TestNG framework in a
 Selenium-based testing environment. It initializes the WebDriver, loads test classes, configures logging, and runs the
@@ -52,7 +52,85 @@ Configures the logger for logging test execution details:
 - Catches and prints any IOException.
 - Turns off all logging from the Selenium WebDriver to reduce noise in the logs.
 
-Below are the UML diagrams of the classes used in TestRunner class.
+**2. TestClasses.java**
 
-![img_3.png](img_3.png) ![img_4.png](img_4.png) ![img_5.png](img_5.png)
+![img_4.png](TestClasses.png)
 
+The TestClasses class in the framework.config package is responsible for maintaining
+a list of test classes used in the framework. This class provides a centralized and
+immutable collection of test class metadata, which includes the name of each test
+class and its fully qualified class name. This setup helps organize and reference
+the test classes easily throughout the testing framework. By using the TestClasses
+class, the framework can dynamically load and execute tests, enhancing modularity
+and maintainability.
+
+**3. TestClass.java**
+
+![img_3.png](TestClass.png)
+
+The TestClass class in the framework.model package is a simple model class designed
+to encapsulate metadata about a test class within the testing framework. It contains
+the name of the test class and its fully qualified class name (path). This class
+provides a structured way to store and retrieve information about each test class,
+which can be utilized by other components in the framework for dynamically loading and
+executing tests.
+
+**4. TestInjector.java**
+
+![img_5.png](TestInjector.png)
+
+The TestInjector class in the framework.setup package implements the
+IInvokedMethodListener interface from TestNG. This class is designed to inject
+dependencies (such as a logger and a WebDriver instance) into test methods before
+they are invoked. It ensures that these dependencies are available to the tests when
+they are executed. The TestInjector class provides a way to set up the necessary
+environment for test execution by using holders to manage the logger and WebDriver
+instances.
+
+**Code Flow:**
+
+1. constructor
+
+An instance of TestInjector is created with a Logger and a WebDriver.
+
+2. Before Invocation
+
+- Before a test method is invoked, the beforeInvocation method is called.
+- It checks if the method is a test method.
+- If it is a test method, it sets the logger and driver instances in their respective holders.
+
+3. After Invocation
+
+- After a test method is invoked, the afterInvocation method is called.
+- Currently, this method does not perform any actions but can be extended for cleanup operations.
+
+**5. WebDriverHolder.java**
+
+![img.png](WebDriverHolder.png)
+
+The WebDriverHolder class in the framework.setup package is a utility class designed to
+manage a singleton instance of WebDriver. This class allows the framework to store and
+access the WebDriver instance globally, ensuring that all test methods can utilize the
+same driver instance. This class is used in the TestInjector class in the beforeInvocation() method.
+
+**6. LoggerHolder.java**
+
+![img.png](LoggerHolder.png)
+
+The LoggerHolder class in the framework.setup package is a utility class designed to manage a
+singleton instance of Logger. This class allows the framework to store and access the
+Logger instance globally, ensuring that all test methods and other components can utilize
+the same logger instance for consistent logging throughout the application. This class is
+used in the TestInjector class in the beforeInvocation() method.
+
+**7. Config.java**
+
+![img.png](Config.png)
+
+The Config class in the framework.config package serves as a centralized configuration
+repository for the application. It contains various constants that are used throughout
+the framework, providing a single point of reference for configuration settings such as
+file paths, IPs, and other constants. This approach enhances the maintainability and
+readability of the code by avoiding hard-coded values scattered across different classes.
+
+**8. Config.java**
\ No newline at end of file
diff --git a/esp/src/test-ui/tests/framework/documentation/LoggerHolder.png b/esp/src/test-ui/tests/framework/documentation/LoggerHolder.png
new file mode 100644
index 0000000000000000000000000000000000000000..547e7c857c765c7ea8dda03d57d478a7e745a264
GIT binary patch
literal 2861
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

literal 0
HcmV?d00001

diff --git a/esp/src/test-ui/tests/framework/documentation/img_3.png b/esp/src/test-ui/tests/framework/documentation/TestClass.png
similarity index 100%
rename from esp/src/test-ui/tests/framework/documentation/img_3.png
rename to esp/src/test-ui/tests/framework/documentation/TestClass.png
diff --git a/esp/src/test-ui/tests/framework/documentation/img_4.png b/esp/src/test-ui/tests/framework/documentation/TestClasses.png
similarity index 100%
rename from esp/src/test-ui/tests/framework/documentation/img_4.png
rename to esp/src/test-ui/tests/framework/documentation/TestClasses.png
diff --git a/esp/src/test-ui/tests/framework/documentation/img_5.png b/esp/src/test-ui/tests/framework/documentation/TestInjector.png
similarity index 100%
rename from esp/src/test-ui/tests/framework/documentation/img_5.png
rename to esp/src/test-ui/tests/framework/documentation/TestInjector.png
diff --git a/esp/src/test-ui/tests/framework/documentation/img_2.png b/esp/src/test-ui/tests/framework/documentation/TestRunner.png
similarity index 100%
rename from esp/src/test-ui/tests/framework/documentation/img_2.png
rename to esp/src/test-ui/tests/framework/documentation/TestRunner.png
diff --git a/esp/src/test-ui/tests/framework/documentation/WebDriverHolder.png b/esp/src/test-ui/tests/framework/documentation/WebDriverHolder.png
new file mode 100644
index 0000000000000000000000000000000000000000..f4c4ebf958f666be44ed57b4236632a20f4dc725
GIT binary patch
literal 3135
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
Yq`9yCl)1MN`!N90-zKC$Zyh@IPlJbg&j0`b

literal 0
HcmV?d00001


From d71e4f53b7a62a9971e3c5e3ec7c85c25d1c83be Mon Sep 17 00:00:00 2001
From: Nisha Bagdwal <nishabagdwal@gmail.com>
Date: Mon, 17 Jun 2024 16:39:43 -0400
Subject: [PATCH 32/33] HPCC-31857 : Documentation

Added documentation for more classes

Signed-off-by: Nisha Bagdwal <nishabagdwal@gmail.com>
---
 .../tests/framework/config/Config.java        |   1 +
 .../documentation/ActivitiesTest.png          | Bin 0 -> 15534 bytes
 .../documentation/ApplicationValue.png        | Bin 0 -> 2919 bytes
 .../documentation/ApplicationValues.png       | Bin 0 -> 2566 bytes
 .../framework/documentation/BaseTableTest.png | Bin 0 -> 128722 bytes
 .../tests/framework/documentation/Common.png  | Bin 0 -> 6174 bytes
 .../framework/documentation/DesignDocument.md | 331 +++++++++++++++++-
 .../documentation/ECLWorkUnitsTest.png        | Bin 0 -> 21757 bytes
 .../framework/documentation/ECLWorkunit.png   | Bin 0 -> 21832 bytes
 .../documentation/NavigationWebElement.png    | Bin 0 -> 10506 bytes
 .../framework/documentation/TestInjector.png  | Bin 7677 -> 10050 bytes
 .../framework/documentation/TimeUtils.png     | Bin 0 -> 6626 bytes
 .../documentation/WUQueryResponse.png         | Bin 0 -> 12328 bytes
 .../framework/documentation/WUQueryRoot.png   | Bin 0 -> 4085 bytes
 .../framework/documentation/Workunits.png     | Bin 0 -> 4176 bytes
 .../tests/framework/utility/Common.java       |  17 +-
 16 files changed, 330 insertions(+), 19 deletions(-)
 create mode 100644 esp/src/test-ui/tests/framework/documentation/ActivitiesTest.png
 create mode 100644 esp/src/test-ui/tests/framework/documentation/ApplicationValue.png
 create mode 100644 esp/src/test-ui/tests/framework/documentation/ApplicationValues.png
 create mode 100644 esp/src/test-ui/tests/framework/documentation/BaseTableTest.png
 create mode 100644 esp/src/test-ui/tests/framework/documentation/Common.png
 create mode 100644 esp/src/test-ui/tests/framework/documentation/ECLWorkUnitsTest.png
 create mode 100644 esp/src/test-ui/tests/framework/documentation/ECLWorkunit.png
 create mode 100644 esp/src/test-ui/tests/framework/documentation/NavigationWebElement.png
 create mode 100644 esp/src/test-ui/tests/framework/documentation/TimeUtils.png
 create mode 100644 esp/src/test-ui/tests/framework/documentation/WUQueryResponse.png
 create mode 100644 esp/src/test-ui/tests/framework/documentation/WUQueryRoot.png
 create mode 100644 esp/src/test-ui/tests/framework/documentation/Workunits.png

diff --git a/esp/src/test-ui/tests/framework/config/Config.java b/esp/src/test-ui/tests/framework/config/Config.java
index 8536558661f..98b8311ac28 100644
--- a/esp/src/test-ui/tests/framework/config/Config.java
+++ b/esp/src/test-ui/tests/framework/config/Config.java
@@ -16,4 +16,5 @@ public class Config {
     public static final String ECL_WORK_UNITS_URL = "esp/files/index.html#/workunits";
     public static final int[] dropdownValues = {10, 25, 50, 100, 250, 500, 1000};
     public static final int MALFORMED_TIME_STRING = -1;
+    public static final int WAIT_TIME_IN_SECONDS = 4;
 }
diff --git a/esp/src/test-ui/tests/framework/documentation/ActivitiesTest.png b/esp/src/test-ui/tests/framework/documentation/ActivitiesTest.png
new file mode 100644
index 0000000000000000000000000000000000000000..c3b17514907881bf55ec3e7d592f0893847d9c4d
GIT binary patch
literal 15534
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
NIpuBPKfU)a{{z3MCF}qI

literal 0
HcmV?d00001

diff --git a/esp/src/test-ui/tests/framework/documentation/ApplicationValue.png b/esp/src/test-ui/tests/framework/documentation/ApplicationValue.png
new file mode 100644
index 0000000000000000000000000000000000000000..47bb55d8d921f2c9f7655e61ff28cd0c7a022b7c
GIT binary patch
literal 2919
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

literal 0
HcmV?d00001

diff --git a/esp/src/test-ui/tests/framework/documentation/ApplicationValues.png b/esp/src/test-ui/tests/framework/documentation/ApplicationValues.png
new file mode 100644
index 0000000000000000000000000000000000000000..7aa4a5756328c3af6c39de72be3cb2ce924bae11
GIT binary patch
literal 2566
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

literal 0
HcmV?d00001

diff --git a/esp/src/test-ui/tests/framework/documentation/BaseTableTest.png b/esp/src/test-ui/tests/framework/documentation/BaseTableTest.png
new file mode 100644
index 0000000000000000000000000000000000000000..289db16ed4529dafef09e02a9d1daee42a8cd85d
GIT binary patch
literal 128722
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
B0^I-r

literal 0
HcmV?d00001

diff --git a/esp/src/test-ui/tests/framework/documentation/Common.png b/esp/src/test-ui/tests/framework/documentation/Common.png
new file mode 100644
index 0000000000000000000000000000000000000000..0d2b76cc7bb8b8565471fad4f62958cba598e55b
GIT binary patch
literal 6174
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

literal 0
HcmV?d00001

diff --git a/esp/src/test-ui/tests/framework/documentation/DesignDocument.md b/esp/src/test-ui/tests/framework/documentation/DesignDocument.md
index 8bc8d0f3962..678f7529f4b 100644
--- a/esp/src/test-ui/tests/framework/documentation/DesignDocument.md
+++ b/esp/src/test-ui/tests/framework/documentation/DesignDocument.md
@@ -8,7 +8,7 @@ The TestRunner class is responsible for setting up and executing automated tests
 Selenium-based testing environment. It initializes the WebDriver, loads test classes, configures logging, and runs the
 tests.
 
-**Code Flow:**
+**Methods:**
 
 1. main Method
 
@@ -77,7 +77,7 @@ executing tests.
 
 **4. TestInjector.java**
 
-![img_5.png](TestInjector.png)
+![img.png](TestInjector.png)
 
 The TestInjector class in the framework.setup package implements the
 IInvokedMethodListener interface from TestNG. This class is designed to inject
@@ -87,7 +87,7 @@ they are executed. The TestInjector class provides a way to set up the necessary
 environment for test execution by using holders to manage the logger and WebDriver
 instances.
 
-**Code Flow:**
+**Methods:**
 
 1. constructor
 
@@ -133,4 +133,327 @@ the framework, providing a single point of reference for configuration settings
 file paths, IPs, and other constants. This approach enhances the maintainability and
 readability of the code by avoiding hard-coded values scattered across different classes.
 
-**8. Config.java**
\ No newline at end of file
+**8. Common.java**
+
+![img.png](Common.png)
+
+The Common class in the framework.utility package provides a set of utility
+methods that are frequently used throughout the testing framework. These
+methods handle common tasks such as checking for text presence on a webpage,
+opening a webpage, and determining the environment in which the code is
+running (local or GitHub Actions). The class leverages constants from the
+Config class to maintain consistency and facilitate configuration management.
+
+**Methods:**
+
+1. checkTextPresent Method
+
+Checks if the specified text is present on the current webpage and logs the result.
+
+- Retrieves the page source using driver.getPageSource().
+- Checks if the page source contains the specified text.
+- Logs a success message if the text is found; otherwise, logs an error message and records it using the provided
+  logger.
+
+2. openWebPage Method
+
+Opens the specified URL in the browser and maximizes the window.
+
+- Navigates to the specified URL using driver.get(url).
+- Maximizes the browser window using driver.manage().window().maximize().
+- Calls the sleep method to pause the execution for a short period to allow the page to load completely.
+
+3. sleep Method
+
+The sleep method pauses the execution of the program for a specified duration
+(4 seconds in this case). This can be useful in scenarios where a delay is required,
+such as waiting for a webpage to load completely before proceeding with further actions.
+
+4. isRunningOnLocal Method
+
+Determines if the code is running on a local environment.
+
+- Checks if the operating system name starts with the value of Config.LOCAL_OS.
+- Checks if the user profile path starts with the value of Config.LOCAL_USER_PROFILE.
+- Returns true if both conditions are met, indicating a local environment; otherwise, returns false.
+
+5. getUrl Method
+
+Constructs the full URL based on the environment (local or GitHub Actions).
+
+- Calls isRunningOnLocal to check the environment.
+- If running locally, returns the URL prefixed with Config.LOCAL_IP.
+- If running in GitHub Actions, returns the URL prefixed with Config.GITHUB_ACTION_IP.
+
+**9. TimeUtils.java**
+
+![img.png](TimeUtils.png)
+
+The TimeUtils class in the framework.utility package provides utility functions to handle
+time strings and convert them into milliseconds. This is useful for standardizing time
+representations and performing time-based calculations in a consistent manner.
+
+TIME_PATTERN: A regular expression pattern used to match various time formats. The supported formats are:
+
+- d days h:m:s.s
+- h:m:s.s
+- m:s.s
+- s.s
+
+**Methods:**
+
+1. convertToMilliseconds Method
+
+This method converts a time string into milliseconds based on the matched pattern. If the
+time string does not match any recognized format, it returns a predefined constant for
+malformed time strings.
+
+- The method first attempts to match the input time string against the TIME_PATTERN.
+- If the string matches the pattern, it initializes the time components (days, hours, minutes, seconds, milliseconds) to
+  zero.
+- The method then extracts values based on the matching groups.
+- If any parsing errors occur (e.g., NumberFormatException) or if the string does not match the pattern, the method
+  returns Config.MALFORMED_TIME_STRING.
+- If the parsing is successful, the method calculates the total duration in milliseconds
+
+**10. NavigationWebElement**
+
+![img.png](NavigationWebElement.png)
+
+This NavigationWebElement class in the framework.model package, is a record class used to represent a navigation element
+within a web application framework. It offers a concise way to store and manage information about such
+elements.
+
+- The class is defined as a record which is a recent addition to Java that simplifies creating immutable data classes.
+- It has three properties:
+    - name: A String representing the name or identifier of the navigation element in the menu bar(e.g., "Activities", "
+      ECL", "Files).
+    - hrefValue: A String representing the href attribute value of the element, which typically specifies the URL linked
+      to by the element.
+    - webElement: A WebElement object from the Selenium library. This holds the actual WebElement instance representing
+      the element in the web page.
+
+- Due to the record nature, a constructor is not explicitly defined. The compiler generates a constructor that takes
+  arguments for each property and initializes them.
+- The NavigationWebElement class offers a structured way to manage data related to navigation elements in a web
+  application framework.
+
+**11. Java Classes for Representing Workunit JSON Data**
+
+This section details the class structure used to map JSON data file of list of "Workunit"
+entities into Java objects. These classes provide a clear representation of the data and
+allow for easy access to its values throughout the codebase. This structure is particularly
+beneficial for writing test cases, as it simplifies working with the data in a well-defined
+format. Below are the UML diagram of the classes used for JSON mapping to java objects for
+workunits JSON file.
+
+![img.png](WUQueryRoot.png)
+![img.png](WUQueryResponse.png)
+![img.png](Workunits.png)
+![img.png](ECLWorkunit.png)
+![img.png](ApplicationValues.png)
+![img.png](ApplicationValue.png)
+
+**12. ActivitiesTest**
+
+![img.png](ActivitiesTest.png)
+
+This ActivitiesTest class in the framework.pages package, implements a TestNG test (@Test)
+for the Activities page of ECL Watch UI. It focuses on verifying the following aspects of the
+Activities page:
+
+- Presence of specific text elements
+- Functionality of navigation links and their corresponding sub-tabs
+
+**Class Variables:**
+
+- textArray: A static final String array containing expected text elements to be present on the Activities page (e.g., "
+  Target/Wuid", "Graph").
+- navNamesArray: A static final String array containing names used to locate the navigation link WebElements on the
+  Activities page (e.g., "Activities", "ECL", "Files).
+- tabsListMap: A static final Map that defines the expected sub-tabs for each navigation link. The key is the navigation
+  link name, and the value is a List of expected sub-tabs.
+
+**Methods:**
+
+1. testActivitiesPage (Test Method)
+
+- Obtains the WebDriver instance (WebDriverHolder.getDriver()).
+- Opens the Activities page using the URL from Config.ACTIVITIES_URL and Common.openWebPage.
+- Retrieves a Logger instance for logging test results (LoggerHolder.getLogger()).
+- Calls testForAllText to verify the presence of expected text elements on the page.
+- Calls getNavWebElements to retrieve a list of NavigationWebElement objects representing navigation links.
+- Calls testForNavigationLinks to verify the functionality of navigation links.
+
+2. testForAllText Method
+
+- Iterates through the textArray.
+- For each text element, calls Common.checkTextPresent to check its presence on the Activities page using the provided
+  WebDriver, text element, page name ("Activities Page"), and Logger instance.
+
+3. testForNavigationLinks Method
+
+- Takes the WebDriver instance, a list of NavigationWebElement objects, and a Logger instance as arguments.
+- Iterates through the list of NavigationWebElement objects:
+    - Clicks on the WebElement using the webElement().click() method.
+    - Calls testTabsForNavigationLinks to verify if the expected sub-tabs are present for the clicked link.
+    - Logs success/failure messages based on the verification result using the Logger instance.
+
+4. getCurrentPage Method
+
+- Iterates through the tabsListMap.
+- For each entry (navigation link name and its corresponding sub-tabs):
+    - Checks if all sub-tabs from the list are present in the current page source using driver.getPageSource().
+    - If all sub-tabs are found, returns the navigation link name (current page).
+- If no matching navigation link is found, returns "Invalid Page".
+
+5. testTabsForNavigationLinks Method:
+
+- Takes the WebDriver instance and a NavigationWebElement object as arguments.
+- Retrieves the expected sub-tabs list for the navigation element from tabsListMap.
+- Gets the current page source using driver.getPageSource().
+- Iterates through the expected sub-tabs list:
+    - Checks if each sub-tab is present in the page source.
+    - If any sub-tab is missing, returns false.
+- If all sub-tabs are found, returns true.
+
+6. getNavWebElements Method:
+
+- Creates an empty list to store NavigationWebElement objects.
+- Iterates through the navNamesArray.
+- For each navigation link name:
+    - Finds the WebElement using driver.findElement with By.name strategy.
+    - Extracts the href attribute value.
+    - Creates a new NavigationWebElement object with the name, href value, and WebElement reference.
+    - Adds the NavigationWebElement to the list.
+- Returns the list of NavigationWebElement objects.
+
+**13. BaseTableTest**
+
+![img.png](BaseTableTest.png)
+
+This abstract class, `BaseTableTest`, in the framework.pages package, provides a framework for
+testing web pages that display tabular data. It defines methods for common functionalities like:
+
+- Verifying the presence of expected text elements on the page.
+- Comparing the content displayed in the table with corresponding data from a JSON file.
+- Testing the sorting functionality of the table columns.
+- Verifying links within the table cells and their navigation behavior.
+
+**Abstract Methods:**
+
+1. `getPageName`: Returns the name of the page under test.
+2. `getPageUrl`: Returns the URL of the page under test.
+3. `getJsonFilePath`: Returns the file path of the JSON file containing reference data.
+4. `getColumnNames`: Returns an array of column names displayed in the table header.
+5. `getColumnKeys`: Returns an array of unique keys used to identify table headers.
+6. `getUniqueKeyName`: Returns the name of the unique key used to identify table rows.
+7. `getUniqueKey`: Returns the unique key value for the current row (used for logging).
+8. `getColumnKeysWithLinks`: Returns an array of column keys that contain links within the table cells.
+9. `parseDataUIValue`: Parses and pre-processes a data value extracted from the UI table.
+10. `parseDataJSONValue`: Parses and pre-processes a data value extracted from the JSON file.
+11. `parseJson`: Parses the JSON file and returns a list of objects representing the data.
+12. `getColumnDataFromJson`: Extracts a specific data value from a JSON object based on the provided column key.
+13. `sortJsonUsingSortOrder`: Sorts the list of JSON objects based on a given column key and sort order.
+14. `getCurrentPage`: Retrieves the name of the current page displayed in the browser.
+
+**Non-Abstract Methods:**
+
+1. `testPage`: The main test method that orchestrates all other functionalities to test the target web page.
+
+- Opens the target webpage using the URL obtained from `getPageUrl`.
+- Calls `testForAllText` to verify the presence of expected text elements.
+- Calls `testContentAndSortingOrder` to compare table data and test sorting functionality.
+- Calls `testLinksInTable` to verify links within table cells and their navigation behavior.
+
+2. `waitForElement`: Waits for an element to be present on the page using explicit wait with a timeout.
+
+3. `testContentAndSortingOrder`:
+
+- Retrieves all objects from the JSON file using `getAllObjectsFromJson`.
+- Clicks on the dropdown menu to select an appropriate number of items to display in the table.
+- Calls `testTableContent` to compare the table data with JSON data.
+- Iterates through each column:
+    - Calls `testTheSortingOrderForOneColumn` to test sorting functionality for the current column.
+
+4. `testTheSortingOrderForOneColumn`:
+
+- Gets the current sorting order for the specified column using `getCurrentSortingOrder`.
+- Extracts data from the UI table and JSON file for the specified column.
+- Sorts the JSON objects based on the current sorting order using `sortJsonUsingSortOrder`.
+- Compares the sorted JSON data with the extracted UI data using `compareData`.
+
+5. `getCurrentSortingOrder`: Gets the current sorting order (ascending/descending/none) for a specified column.
+
+6. `getDataFromJSONUsingColumnKey`: Extracts a list of data values for a specified column from all JSON objects.
+
+7. `getDataFromUIUsingColumnKey`: Extracts a list of data values for a specified column from all table cells (UI).
+
+8. `ascendingSortJson`: Sorts a list of JSON objects in ascending order based on a specified column key.
+
+9. `descendingSortJson`: Sorts a list of JSON objects in descending order based on a specified column key.
+
+10. `testTableContent`:
+
+- Compares the number of items displayed in the UI table with the number of objects retrieved from the JSON file.
+- Iterates through each column:
+    - Extracts data from the UI table and JSON file for the current column.
+    - Calls `compareData` to compare the extracted data.
+
+11. `getAllObjectsFromJson`: Parses the JSON file and returns a list of objects representing the data. Handles potential
+    exceptions during parsing.
+
+12. `compareData`: Compares a list of data values extracted from the UI table with the corresponding list from the JSON
+    file.
+
+- Iterates through each data pair:
+    - Calls `parseDataUIValue` and `parseDataJSONValue` to pre-process the data (if needed).
+    - Calls `checkValues` to perform the actual comparison and handle mismatches.
+
+13. `checkValues`: Compares two data values and logs an error message if they don't match.
+
+**14. ECLWorkUnitsTest**
+
+![img.png](ECLWorkUnitsTest.png)
+
+This class, `ECLWorkUnitsTest`, in the framework.pages package, extends the `BaseTableTest`
+class and specifically implements test cases for the ECL Workunits page within the ECL Watch UI.
+It inherits functionalities for common table testing procedures and specializes them for the
+ECL Workunits data and behavior.
+
+**Override Methods:**
+
+1. `getPageName`: Returns the display name of the page under test ("ECL Workunits").
+2. `getPageUrl`: Returns the URL for the ECL Workunits page constructed using `Config.ECL_WORK_UNITS_URL`.
+3. `getJsonFilePath`: Determines the file path of the JSON file containing ECL Workunit data based on the test execution
+   environment (local vs. GitHub Actions).
+4. `getColumnNames`: Returns an array of column names displayed in the ECL Workunits table header.
+5. `getColumnKeys`: Returns an array of unique keys used to identify ECL Workunit table headers.
+6. `getColumnKeysWithLinks`: Returns an array specifying the column key that contains links within table cells (
+   currently, only "Wuid" has links).
+7. `getUniqueKeyName`: Returns the name of the unique key used to identify ECL Workunit table rows ("WUID").
+8. `getUniqueKey`: Returns the actual value of the unique key for the current row (used for logging).
+9. `parseJson`: Parses the JSON file specific to ECL Workunits and returns a list of `ECLWorkunit` objects representing
+   the data.
+10. `getColumnDataFromJson`: Extracts a specific data value from an `ECLWorkunit` object based on the provided column
+    key.
+11. `parseDataUIValue`: Parses and pre-processes a data value extracted from the ECL Workunits UI table.
+12. `parseDataJSONValue`: Parses and pre-processes a data value extracted from the ECL Workunits JSON file (if
+    necessary).
+13. `sortJsonUsingSortOrder`: Sorts the list of `ECLWorkunit` objects based on a given column key and sort order,
+    considering the specific sorting behavior for the ECL Workunits table (default sort is descending by WUID).
+14. `getCurrentPage`: Retrieves the title attribute of the "wuid" element to determine the current page displayed.
+
+**Additional Methods:**
+
+1. `getCostColumns`: Returns a list of column names that represent cost-related data (Compile Cost, Execution Cost, File
+   Access Cost).
+
+**Test Method:**
+
+1. `testingECLWorkUnitsPage`: Calls the inherited `testPage` method to execute the core test logic for the ECL Workunits
+   page.
+
+
+
+
diff --git a/esp/src/test-ui/tests/framework/documentation/ECLWorkUnitsTest.png b/esp/src/test-ui/tests/framework/documentation/ECLWorkUnitsTest.png
new file mode 100644
index 0000000000000000000000000000000000000000..8e7ab0792d8e434dd9e516fc0e3add0792f17ebd
GIT binary patch
literal 21757
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
I-}?Rk0S&~DegFUf

literal 0
HcmV?d00001

diff --git a/esp/src/test-ui/tests/framework/documentation/ECLWorkunit.png b/esp/src/test-ui/tests/framework/documentation/ECLWorkunit.png
new file mode 100644
index 0000000000000000000000000000000000000000..5bbf9018ae624487a62be8bdd4f47a20885873b7
GIT binary patch
literal 21832
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
SH>5%zeelV@v)@1d<^KoiLcxCk

literal 0
HcmV?d00001

diff --git a/esp/src/test-ui/tests/framework/documentation/NavigationWebElement.png b/esp/src/test-ui/tests/framework/documentation/NavigationWebElement.png
new file mode 100644
index 0000000000000000000000000000000000000000..b32e3dc1ae1e182fb6fad59ed7efba80101093b2
GIT binary patch
literal 10506
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
H2Y>qCGF`&Z

literal 0
HcmV?d00001

diff --git a/esp/src/test-ui/tests/framework/documentation/TestInjector.png b/esp/src/test-ui/tests/framework/documentation/TestInjector.png
index eba74b343a9472816019316a5ac447029d0d85cb..e45e93682a7382aa26d7fc47e06ebbb6e4e26ea3 100644
GIT binary patch
literal 10050
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
Iw}1b?0d#u;s{jB1

literal 7677
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

diff --git a/esp/src/test-ui/tests/framework/documentation/TimeUtils.png b/esp/src/test-ui/tests/framework/documentation/TimeUtils.png
new file mode 100644
index 0000000000000000000000000000000000000000..342180bc0fe82a8acfaff67afc6fb4b351a884bd
GIT binary patch
literal 6626
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

literal 0
HcmV?d00001

diff --git a/esp/src/test-ui/tests/framework/documentation/WUQueryResponse.png b/esp/src/test-ui/tests/framework/documentation/WUQueryResponse.png
new file mode 100644
index 0000000000000000000000000000000000000000..a84157c8b310b1e4c7e299cec64dd4083bb11e1c
GIT binary patch
literal 12328
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

literal 0
HcmV?d00001

diff --git a/esp/src/test-ui/tests/framework/documentation/WUQueryRoot.png b/esp/src/test-ui/tests/framework/documentation/WUQueryRoot.png
new file mode 100644
index 0000000000000000000000000000000000000000..2276a694af584a550cf10e30aa0527061561810e
GIT binary patch
literal 4085
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
W`en>^cknq6?A;R?#(y{A)V~4M-*OTF

literal 0
HcmV?d00001

diff --git a/esp/src/test-ui/tests/framework/documentation/Workunits.png b/esp/src/test-ui/tests/framework/documentation/Workunits.png
new file mode 100644
index 0000000000000000000000000000000000000000..0c50d24564b5366198622c12137dd4f283d639f5
GIT binary patch
literal 4176
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
F^&e*nReS&d

literal 0
HcmV?d00001

diff --git a/esp/src/test-ui/tests/framework/utility/Common.java b/esp/src/test-ui/tests/framework/utility/Common.java
index ff2a6975a9a..2fb12970a09 100644
--- a/esp/src/test-ui/tests/framework/utility/Common.java
+++ b/esp/src/test-ui/tests/framework/utility/Common.java
@@ -8,23 +8,10 @@
 
 public class Common {
 
-//    public static void testLinkRedirect(WebDriver driver, String expectedUrl, String page, Logger logger) {
-//        if (driver.getCurrentUrl().equals(expectedUrl)) {
-//            System.out.println("Success: Link Pass " + page + " " + expectedUrl);
-//        } else {
-//            String errorMsg = "Failure: " + page + " : Current URL does not match expected URL\n" +
-//                    "Current URL: " + driver.getCurrentUrl() + "\n" +
-//                    "Expected URL: " + expectedUrl;
-//            System.err.println(errorMsg);
-//            logger.severe(errorMsg);
-//        }
-//    }
-
     public static void checkTextPresent(WebDriver driver, String text, String page, Logger logger) {
         if (driver.getPageSource().contains(text)) {
             String msg = "Success: " + page + ": Text present: " + text;
             System.out.println(msg);
-            //logger.info(msg);
         } else {
             String errorMsg = "Failure: " + page + ": Text not present: " + text;
             System.err.println(errorMsg);
@@ -41,9 +28,9 @@ public static void openWebPage(WebDriver driver, String url) {
 
     public static void sleep() {
         try {
-            Thread.sleep(Duration.ofSeconds(4));
+            Thread.sleep(Duration.ofSeconds(Config.WAIT_TIME_IN_SECONDS));
         } catch (InterruptedException e) {
-            throw new RuntimeException(e);
+            System.err.println(e.getMessage());
         }
     }
 

From 4c1833a1a843d72855dce027911ebaf717c8a366 Mon Sep 17 00:00:00 2001
From: Nisha Bagdwal <nishabagdwal@gmail.com>
Date: Mon, 17 Jun 2024 16:44:50 -0400
Subject: [PATCH 33/33] HPCC-31857 : Documentation

Added documentation for more classes

Signed-off-by: Nisha Bagdwal <nishabagdwal@gmail.com>
---
 .../framework/documentation/DesignDocument.md    |   5 +++++
 .../framework/documentation/relationship.png     | Bin 0 -> 4857 bytes
 2 files changed, 5 insertions(+)
 create mode 100644 esp/src/test-ui/tests/framework/documentation/relationship.png

diff --git a/esp/src/test-ui/tests/framework/documentation/DesignDocument.md b/esp/src/test-ui/tests/framework/documentation/DesignDocument.md
index 678f7529f4b..268d34458db 100644
--- a/esp/src/test-ui/tests/framework/documentation/DesignDocument.md
+++ b/esp/src/test-ui/tests/framework/documentation/DesignDocument.md
@@ -454,6 +454,11 @@ ECL Workunits data and behavior.
 1. `testingECLWorkUnitsPage`: Calls the inherited `testPage` method to execute the core test logic for the ECL Workunits
    page.
 
+**Class Relationship Structure:**
+
+![img.png](relationship.png)
+
+
 
 
 
diff --git a/esp/src/test-ui/tests/framework/documentation/relationship.png b/esp/src/test-ui/tests/framework/documentation/relationship.png
new file mode 100644
index 0000000000000000000000000000000000000000..004a6e9da4dca968b77796472bd7beed23639e66
GIT binary patch
literal 4857
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
S*`c(wP8sN!YFBCAhW-a@CUa2$

literal 0
HcmV?d00001