/** This method select trigger at the left panel */
 public static NotificationsPage selectNotificationLeftPanelAndCheckPage(
     TriggersPage triggersPage) {
   NotificationsPage notificationsPage = triggersPage.clickOnNotificationLink();
   Assert.assertTrue(notificationsPage.checkPage(), "Notifications page is not loaded correctly");
   Utilities.waitTime(ConstantsClass.TIMEOUT_1_SECONDS);
   return notificationsPage;
 }
 /**
  * This method create a trigger
  *
  * @param triggersPage Trigger PO
  * @param triggerName Trigger name
  */
 public static void createTrigger(TriggersPage triggersPage, String triggerName) {
   triggersPage.clickOnAddTrigger();
   Assert.assertTrue(
       triggersPage.isTriggerPopUPDisplayed(POPUP_ADD_TRIGGER),
       "Adding trigger popup is not displayed");
   triggersPage.addTrigger(triggerName);
   triggersPage.submit();
   Utilities.waitTime(ConstantsClass.TIMEOUT_2_SECONDS);
   Assert.assertTrue(
       triggersPage.existTrigger(triggerName),
       String.format("Trigger '%s' was not added correctly", triggerName));
 }
 /**
  * This method create a notification
  *
  * @param notificationsPage Notification PO
  * @param notificationName Notification name
  */
 public static void createNotification(
     NotificationsPage notificationsPage, String notificationName, String action) {
   notificationsPage.clickOnAddNotification();
   Assert.assertTrue(
       notificationsPage.isNotificationPopUPDisplayed(POPUP_ADD_NOTIFICATION),
       "Adding trigger popup is not displayed");
   notificationsPage.addNotification(notificationName, action);
   notificationsPage.submit();
   Utilities.waitTime(ConstantsClass.TIMEOUT_1_SECONDS);
   Assert.assertTrue(
       notificationsPage.existNotification(notificationName),
       String.format("Trigger '%s' was not added correctly", notificationName));
 }
 /**
  * This method prepare the text area to be used, since it is hidden
  *
  * @return The textarea element
  */
 private WebElement prepareTextArea() {
   String script =
       "arguments[0].setAttribute('style', 'overflow: visible; position: relative; width: 3px; height: 0px; top: 4px; left: 60px;');";
   WebDriverCommands.click(By.cssSelector(EXPAND_ALL), ConstantsClass.TIMEOUT_2_SECONDS);
   WebElement textAreaParentNode =
       WebDriverCommands.findElement(
           By.xpath(TEXT_AREA_PARENT_MIRROR), ConstantsClass.TIMEOUT_2_SECONDS);
   WebDriverCommands.executeScriptOnElement(
       WebDriverCommands.getDriver(), script, textAreaParentNode);
   Utilities.waitTime(ConstantsClass.TIMEOUT_1_SECONDS);
   WebElement textArea =
       WebDriverCommands.findElement(
           By.xpath(String.format(TEXT_AREA_MIRROR)), ConstantsClass.TIMEOUT_2_SECONDS);
   textArea.clear();
   return textArea;
 }
  /**
   * Test Case Name: Verify multiple Windows Servers can be added and modeled correctly
   *
   * <p>Summary: This test case verifies the ability to add and model multiple Server Window targets
   * simultaneously to discover the windows device components.
   *
   * <p>Pre-requisites: Zenoss instance is running Python Collector ZenPack is installed Microsoft
   * Windows ZenPack is installed
   *
   * <p>Post-requisites: The added devices must be deleted
   *
   * <p>Author Alexander Sanchez
   *
   * @param testCaseId The id of the test case
   * @param username User name of the application to test
   * @param password User password of the application to test
   * @param deviceName Name of the win 2008 device to add
   * @param windowsUser the windows user credential needed to model the windows 2003 device
   * @param windowsPassword the windows password credential needed to model the device
   * @param zenPackName the zenpack name
   * @param expectedComponents The list of components that need to be checked
   * @throws Exception Exception
   */
  @Test(groups = {"tc_32428"})
  @Parameters({
    "tc_32428_testcaseid",
    "tc_32428_username",
    "tc_32428_password",
    "tc_ps_win_devicename",
    "tc_32428_windowsuser",
    "tc_32428_windowspassword",
    "zenpack_microsoftwindowsname",
    "tc_win2008_expected_components"
  })
  public void verifyAddMultipleDevicesFunctionalityForWindowsZenpack(
      String testCaseId,
      String username,
      String password,
      String deviceName,
      String windowsUser,
      String windowsPassword,
      String zenPackName,
      String expectedComponents) {
    // ***Pre-Test
    setTestCaseSection(TEST_CASE_SECTION_PRETEST);
    TestlinkCommands.addStepDescription(TEST_CASE_SECTION_PRETEST_LABEL);
    TestlinkCommands.setTestCaseID(testCaseId);
    CommonPage commonPage = new CommonPage();
    String endPoint = getEndPoint();
    String targetNameSpace = getTargetNameSpace();
    String host = getHostName();
    Autoinstall autoinstall = new Autoinstall();

    ZenPacksCommon.validateZenpackInstalledCompleteWorkFlow(username, password, zenPackName);
    Utilities.waitTime(ConstantsClass.TIMEOUT_2_SECONDS);

    DevicesPage devicesPage =
        (DevicesPage) commonPage.navigateTo(ConstantsClass.INFRASTRUCTURE_PAGE);
    Assert.assertTrue(devicesPage.checkPage(), "Infrastructure page is not displayed");

    if (DevicesCommon.selectDeviceInList(devicesPage, deviceName, ConstantsClass.DEVICE_FILTER))
      Assert.assertTrue(
          autoinstall.deleteDevice(endPoint, targetNameSpace, host, deviceName),
          String.format("Device can't be deleted"));

    // ***Test
    setTestCaseSection(TEST_CASE_SECTION_TEST);
    Assert.assertTrue(
        devicesPage.clickOnAddDeviceButton(),
        "The list with options to add device is not displayed");
    devicesPage.clickOnAddDeviceOption(ConstantsClass.ADD_MULTIPLE_DEVICES_OPTION_NAME);

    // These parameters are quite cumbersome, but are needed for the following method. Said method
    // will need to be optimized in the future
    String parameters =
        ConstantsClass.ADD_INFRASTRUCTURE_CATEGORY_SERVER
            + ","
            + ConstantsClass.ADD_INFRASTRUCTURE_TYPE_WIN_SERVER_RM
            + ","
            + deviceName
            + ","
            + windowsUser
            + ","
            + windowsPassword;
    DevicesCommon.addMultipleDevices(new AddMultipleDevicesPage(), parameters);
    devicesPage = (DevicesPage) commonPage.navigateTo(ConstantsClass.INFRASTRUCTURE_PAGE);
    Assert.assertTrue(devicesPage.checkPage(), "Infrastructure page is not displayed");
    Utilities.waitTime(TIMEOUT_5_SECONDS);
    OverviewPage overviewPage = devicesPage.clickDeviceLink(deviceName);
    String[] components = expectedComponents.split(",");
    Assert.assertTrue(
        overviewPage.areExpectedComponentsDisplayed(components),
        "After manually changing the creds, the components were not modeled correctly");

    // Post Test
    setTestCaseSection(TEST_CASE_SECTION_POSTTEST);
    // Delete the device
    Assert.assertTrue(
        autoinstall.deleteDevice(endPoint, targetNameSpace, host, deviceName),
        String.format("Device [%s] can't be deleted", deviceName));
  }
  /**
   * Test Case Name: Adding/Modeling - Authentication - Wrong username/password
   *
   * <p>Summary: This is a negative test This test case verifies whether the user is given proper
   * message when user tries to add a Windows Device that has incorrect username and/or password
   *
   * <p>Pre-requisites: Python Collector ZenPack is installed Microsoft Windows ZenPack is installed
   * Target Device is configured with WinRM
   *
   * <p>Post-requisites: The added devices must be deleted
   *
   * <p>Author Alexander Sanchez
   *
   * @param testCaseId The id of the test case
   * @param username User name of the application to test
   * @param password User password of the application to test
   * @param deviceName Name of the win 2008 device to add
   * @param deviceClass the device class of the windows device
   * @param windowsUserCorrect the correct windows user credential needed to model the device
   * @param windowsUserIncorrect the incorrect windows user credential needed to model the device
   * @param windowsPasswordCorrect the correct windows password credential needed to model the
   *     device
   * @param windowsPasswordIncorrect the incorrect windows us credential needed to model the device
   * @param zenPackName the name of the zenpack that is being evaulated
   * @param expectedComponents The list of components that need to be checked
   * @throws Exception Exception
   */
  @Test(groups = {"tc_32430"})
  @Parameters({
    "tc_32430_testcaseid",
    "tc_32430_username",
    "tc_32430_password",
    "tc_ps_win_devicename",
    "tc_ps_win_deviceclass",
    "tc_32430_windowsusercorrect",
    "tc_32430_windowsuserincorrect",
    "tc_32430_windowspasswordcorrect",
    "tc_32430_windowspasswordincorrect",
    "zenpack_microsoftwindowsname",
    "tc_win2008_expected_components"
  })
  public void verifyWrongUsernamesAndPasswordsBlockModeling(
      String testCaseId,
      String username,
      String password,
      String deviceName,
      String deviceClass,
      String windowsUserCorrect,
      String windowsUserIncorrect,
      String windowsPasswordCorrect,
      String windowsPasswordIncorrect,
      String zenPackName,
      String expectedComponents) {

    Autoinstall autoinstall = new Autoinstall();
    CommonPage commonPage = new CommonPage();

    String host = getHostName();
    String endPoint = getEndPoint();
    String targetNameSpace = getTargetNameSpace();

    TestlinkCommands.setTestCaseID(testCaseId);

    // ***Pre-Test
    setTestCaseSection(TEST_CASE_SECTION_PRETEST);
    ZenPacksCommon.validateZenpackInstalledCompleteWorkFlow(username, password, zenPackName);
    Utilities.waitTime(ConstantsClass.TIMEOUT_2_SECONDS);

    DevicesPage devicesPage =
        (DevicesPage) commonPage.navigateTo(ConstantsClass.INFRASTRUCTURE_PAGE);
    Assert.assertTrue(devicesPage.checkPage(), "Infrastructure page is not displayed");
    // Utilities.waitTime(TIMEOUT_5_SECONDS);

    if (DevicesCommon.selectDeviceInList(devicesPage, deviceName, ConstantsClass.DEVICE_FILTER))
      Assert.assertTrue(
          autoinstall.deleteDevice(endPoint, targetNameSpace, host, deviceName),
          String.format("[WebService] Device %s can't be deleted", deviceName));

    // ***Test
    setTestCaseSection(TEST_CASE_SECTION_TEST);
    DevicesCommon.addSingleDevice(
        devicesPage, deviceName, deviceClass, "", "", "", "", false, "", "");

    DevicesCommon.selectDeviceInList(devicesPage, deviceName, ConstantsClass.DEVICE_FILTER);
    DeviceDetailPage deviceDetailPage = devicesPage.clickDeviceLink(deviceName);

    // The device hasn't been modeled yet
    String[] components = expectedComponents.split(",");
    Assert.assertFalse(
        deviceDetailPage.areExpectedComponentsDisplayed(components),
        "After manually changing the creds, the components were not modeled correctly");

    Map configPropertyMap = new HashMap();
    configPropertyMap.put(ConstantsClass.FILTER_CONFIGURATION_PAGE_WINRM_USER, windowsUserCorrect);
    configPropertyMap.put(
        ConstantsClass.FILTER_CONFIGURATION_PAGE_WINRM_PASSWORD, windowsPasswordIncorrect);
    ConfigurationPropertiesCommon.editConfigurationPropertyDeviceWinFailure(
        deviceDetailPage, configPropertyMap);

    // Should not show components
    Assert.assertFalse(
        deviceDetailPage.areExpectedComponentsDisplayed(components),
        "After manually changing the creds, the components were not modeled correctly");

    configPropertyMap.clear();
    configPropertyMap.put(
        ConstantsClass.FILTER_CONFIGURATION_PAGE_WINRM_USER, windowsUserIncorrect);
    configPropertyMap.put(
        ConstantsClass.FILTER_CONFIGURATION_PAGE_WINRM_PASSWORD, windowsPasswordCorrect);
    ConfigurationPropertiesCommon.editConfigurationPropertyDeviceWinFailure(
        deviceDetailPage, configPropertyMap);

    // Should not show components
    Assert.assertFalse(
        deviceDetailPage.areExpectedComponentsDisplayed(components),
        "After manually changing the creds, the components were not modeled correctly");

    // Post Test
    setTestCaseSection(TEST_CASE_SECTION_POSTTEST);
    Assert.assertTrue(
        autoinstall.deleteDevice(endPoint, targetNameSpace, host, deviceName),
        String.format("[WebService] Device %s can't be deleted", deviceName));
  }
  /**
   * Test Case Name: Service actions for zenoperator role (Edit a Dynamic service)
   *
   * <p>Summary: This test case is intended to verify that user with zenOperator role can view
   * services but cannot execute basicpage actions in the Services page, in this case, editing a
   * service.
   *
   * <p>Pre-requisites: Create a user "zenoperator_user" with "zenoperator" as role Login as
   * zenoperator_user Service "TestService" must be created
   *
   * <p>Post-requisites: User named "zenoperator_user" should be deleted Service "TestService" must
   * be deleted
   *
   * <p>Author: Jennifer Castro
   *
   * @param testCaseId Test case ID
   * @param username Username to login
   * @param password Password of the user to login
   * @param newUsername Username of the user to add
   * @param newUserPassword Password of the user to add
   * @param userRole Type of the user to add e.g: manager
   * @param userEmail Email of the user
   * @param testService Logical node name
   */
  @Test(groups = {"tc_21018", "impact_services_tests"})
  @Parameters({
    "tc_21018_testcaseid",
    "tc_21018_username",
    "tc_21018_password",
    "tc_21018_newusername",
    "tc_21018_newuserpassword",
    "tc_21018_userrole",
    "tc_21018_useremail",
    "tc_21018_testservice",
    "ds_root_tree_node_name"
  })
  public void editDynamicServiceAsZenoperator(
      String testCaseId,
      String username,
      String password,
      String newUsername,
      String newUserPassword,
      String userRole,
      String userEmail,
      String testService,
      String dsTreeNodeName)
      throws Exception {

    TestlinkCommands.setTestCaseID(testCaseId);

    CommonPage commonPage = new CommonPage();
    DynamicServicesCommon dynamicServicesCommon = new DynamicServicesCommon();
    testService = String.format("%s %d", testService, Utilities.getRandomNumber(1000));
    List<String> path = new ArrayList<String>();
    path.add(0, testService);

    setTestCaseSection(TEST_CASE_SECTION_PRETEST);
    TestlinkCommands.addStepDescription(TEST_CASE_SECTION_PRETEST_LABEL);
    addUserPreTestSteps(
        commonPage, username, password, newUsername, newUserPassword, userRole, userEmail);
    dynamicServicesCommon.addDynamicServicePreTestSteps(
        commonPage, username, password, testService);
    LoginCommon.login(newUsername, newUserPassword);

    setTestCaseSection(TEST_CASE_SECTION_TEST);
    TestlinkCommands.addStepDescription(TEST_CASE_SECTION_TEST_LABEL);

    TestlinkCommands.addStepDescription("- Go to Services Page");
    DynamicServicesPage dynamicServicesPage =
        (DynamicServicesPage) commonPage.navigateTo(SERVICES_PAGE);
    Assert.assertTrue(dynamicServicesPage.checkPage(), "Dynamic Service page is not displayed");

    Assert.assertTrue(
        dynamicServicesPage.isItemInDynamicServiceTreeHighlighted(dsTreeNodeName),
        String.format("Dynamic service root node: %s is not highlighted", dsTreeNodeName));
    functions.waitTime(TIMEOUT_2_SECONDS);

    TestlinkCommands.addStepDescription(
        String.format("- Click on the service called \"%s\"", testService));
    DynamicServicesCommon.reachElementInsideTree(path, dynamicServicesPage, true, true);
    functions.waitTime(TIMEOUT_2_SECONDS);

    // Validation: Service "TestService" is highlighted to show that it is selected.
    Assert.assertTrue(
        dynamicServicesPage.isItemInDynamicServiceTreeHighlighted(testService),
        String.format("Dynamic service: %s is not highlighted", testService));
    functions.waitTime(TIMEOUT_2_SECONDS);

    // Validation: Add and delete buttons are disabled on the right frame.
    Assert.assertFalse(
        dynamicServicesPage.isAddToServiceButtonEnabled(),
        "Add to service (+) button is NOT disabled");

    Assert.assertFalse(
        dynamicServicesPage.isDeleteToServiceButtonEnabled(),
        "Delete to service (-) button is NOT disabled");

    setTestCaseSection(TEST_CASE_SECTION_POSTTEST);
    TestlinkCommands.addStepDescription(TEST_CASE_SECTION_POSTTEST_LABEL);
    LoginPage loginPage = commonPage.signOut();
    Assert.assertTrue(loginPage.checkPage(), "Login page is not displayed");
    dynamicServicesCommon.deleteDynamicServicePostTestSteps(
        commonPage, username, password, testService, path);
    deleteUserPostTestSteps(commonPage, username, password, newUsername);
  }
  /**
   * Test Case Name: Dashboard actions for ZenOperaror role
   *
   * <p>Summary:
   *
   * <p>Pre-requisites: Create a user "zenoperator_user" with "ZenOperator" as role Login as
   * zenoperator_user
   *
   * <p>Post-requisites: User named "zenoperator_user" should be deleted
   *
   * <p>Author: Jennifer Castro
   *
   * @param testCaseId testlink ID
   * @param username zenoss username
   * @param password zenoss password
   * @param role User role
   * @param newUser New user name
   * @param newUserPassword New user password user
   * @param email New user email
   * @param dashboard Dashboard to use
   */
  @Test(groups = {"tc_20651", "dashboard_portlets_tests"})
  @Parameters({
    "tc_20651_testcaseid",
    "tc_20651_username",
    "tc_20651_password",
    "tc_20651_role",
    "tc_20651_useridtoadd",
    "tc_20651_usertoaddnewpassword",
    "tc_20651_email",
    "tc_20651_dashboard"
  })
  public void validateDashboardActionsForZenOperatorRole(
      String testCaseId,
      String username,
      String password,
      String role,
      String newUser,
      String newUserPassword,
      String email,
      String dashboard) {

    TestlinkCommands.setTestCaseID(testCaseId);
    CommonPage commonPage = new CommonPage();

    // ***Pre-Test
    setTestCaseSection(TEST_CASE_SECTION_PRETEST);
    TestlinkCommands.addStepDescription(TEST_CASE_SECTION_PRETEST_LABEL);
    DashboardPage dashboardPage = LoginCommon.login(username, password);

    // Add a Dashboard to modify
    // todo

    // Select a specific Dashboard
    dashboardPage.selectDashboardsDropDownValue(dashboard);

    // Delete all portlets
    DashboardCommon.deleteAllPortlets(dashboardPage, ConstantsClass.PORTLET_DEFAULT_ID);

    // Add 3 portlets
    DashboardCommon.addPortlet(dashboardPage, ConstantsClass.PORTLET_WATCH_LIST_ID);
    Utilities.waitTime(ConstantsClass.TIMEOUT_1_SECONDS);
    Assert.assertTrue(
        dashboardPage.isWatchListPortletDisplayed(""), "Watch List Portlet is not displayed");

    DashboardCommon.addPortlet(dashboardPage, ConstantsClass.PORTLET_DEVICE_ISSUES_ID);
    Utilities.waitTime(ConstantsClass.TIMEOUT_1_SECONDS);
    Assert.assertTrue(
        dashboardPage.isDeviceIssuesPortletDisplayed(""), "Device Issues Portlet is not displayed");

    DashboardCommon.addPortlet(dashboardPage, ConstantsClass.PORTLET_GOOGLE_MAP_ID);
    Utilities.waitTime(ConstantsClass.TIMEOUT_1_SECONDS);
    Assert.assertTrue(
        dashboardPage.isGoogleMapsPortletDisplayed(""), "Google Maps Portlet is not displayed");
    commonPage.signOut();

    // Log in with the new user
    addUserPreTestSteps(commonPage, username, password, newUser, newUserPassword, role, email);
    dashboardPage = LoginCommon.login(newUser, newUserPassword);

    // Select a specific Dashboard
    dashboardPage.selectDashboardsDropDownValue(dashboard);

    // Test
    setTestCaseSection(TEST_CASE_SECTION_TEST);
    TestlinkCommands.addStepDescription(TEST_CASE_SECTION_TEST_LABEL);

    // Validate Dashboard buttons
    Assert.assertFalse(
        dashboardPage.isAddButtonDisplayed(),
        "'+' Add button IS displayed on right-top of Dashboard page");
    Assert.assertFalse(
        dashboardPage.isRemoveButtonDisplayed(),
        "'-' Add button IS displayed on right-top of Dashboard page");
    Assert.assertFalse(
        dashboardPage.isGearButtonDisplayed(),
        "Gear button IS displayed on right-top of Dashboard page");

    // Validation of default portlets
    Assert.assertTrue(
        dashboardPage.isWatchListPortletDisplayed(""), "Watch List Portlet is not displayed");
    Assert.assertTrue(
        dashboardPage.isDeviceIssuesPortletDisplayed(""), "Device Issues Portlet is not displayed");
    Assert.assertTrue(
        dashboardPage.isGoogleMapsPortletDisplayed(""), "Google Maps Portlet is not displayed");

    // Post Test
    setTestCaseSection(TEST_CASE_SECTION_POSTTEST);
    TestlinkCommands.addStepDescription(TEST_CASE_SECTION_POSTTEST_LABEL);
    LoginPage loginPage = commonPage.signOut();
    Assert.assertTrue(loginPage.checkPage(), "Login page is not displayed");
    deleteUserPostTestSteps(commonPage, username, password, newUser);
  }
  /**
   * Test Case Name: Actions for zenoperator role (Add a service)
   *
   * <p>Summary: This test case is intended to verify that user with zenOperator role can view
   * services but cannot execute basicpage actions in the Services page, in this case, adding a
   * service.
   *
   * <p>Pre-requisites: Create a user "zenoperator_user" with "zenoperator" as role Login as
   * zenoperator_user Service "TestService" must be created
   *
   * <p>Post-requisites: User named "zenoperator_user" should be deleted Service "TestService" must
   * be deleted
   *
   * <p>Author: Juan Polanco
   *
   * @param testCaseId testlink ID
   * @param username zenoss username
   * @param password zenoss password
   * @param userRole User role
   * @param newUser New user name
   * @param newUserPassword New user password user
   * @param managerEmail New user email
   * @param serviceName Dynamic service name
   */
  @Test(groups = {"tc_21016", "impact_services_tests"})
  @Parameters({
    "tc_21016_testcaseid",
    "tc_21016_username",
    "tc_21016_password",
    "tc_21016_userrole",
    "tc_21016_newusername",
    "tc_21016_newuserpassword",
    "tc_21016_useremail",
    "tc_21016_servicename"
  })
  public void zenOperatorRoleActionAddService(
      String testCaseId,
      String username,
      String password,
      String userRole,
      String newUser,
      String newUserPassword,
      String managerEmail,
      String serviceName) {

    TestlinkCommands.setTestCaseID(testCaseId);
    CommonPage commonPage = new CommonPage();
    LoginPage loginPage = new LoginPage();
    DynamicServicesCommon dynamicServicesCommon = new DynamicServicesCommon();
    serviceName = String.format("%s %d", serviceName, Utilities.getRandomNumber(1000));
    List<String> path = new ArrayList<String>();
    path.add(0, serviceName);

    setTestCaseSection(TEST_CASE_SECTION_PRETEST);
    TestlinkCommands.addStepDescription(TEST_CASE_SECTION_PRETEST_LABEL);
    addUserPreTestSteps(
        commonPage, username, password, newUser, newUserPassword, userRole, managerEmail);
    dynamicServicesCommon.addDynamicServicePreTestSteps(
        commonPage, username, password, serviceName);
    LoginCommon.login(newUser, newUserPassword);

    setTestCaseSection(TEST_CASE_SECTION_TEST);
    TestlinkCommands.addStepDescription(TEST_CASE_SECTION_TEST_LABEL);

    TestlinkCommands.addStepDescription("-Go to Dynamic Services ");
    DynamicServicesPage dynamicServicesPage =
        (DynamicServicesPage) commonPage.navigateTo(SERVICES_PAGE);
    Assert.assertTrue(dynamicServicesPage.checkPage(), "Dynamic Service page is not displayed");

    Assert.assertFalse(
        dynamicServicesPage.isAddDynamicServicesButtonDisplayed(),
        "Add dynamic services button is displayed");
    Assert.assertFalse(
        dynamicServicesPage.isDynamicServicesGearButtonDisplayed(), "Gears button is displayed");
    Assert.assertFalse(
        dynamicServicesPage.isRemoveDynamicServicesButtonDisplayed(),
        "Remove dynamic services button is displayed");

    setTestCaseSection(TEST_CASE_SECTION_POSTTEST);
    TestlinkCommands.addStepDescription(TEST_CASE_SECTION_POSTTEST_LABEL);
    TestlinkCommands.addStepDescription(String.format("- Logout as a [%s]", newUser));
    commonPage.signOut();
    Assert.assertTrue(loginPage.checkPage(), "Login page is not displayed");
    dynamicServicesCommon.deleteDynamicServicePostTestSteps(
        commonPage, username, password, serviceName, path);
    deleteUserPostTestSteps(commonPage, username, password, newUser);
  }
  /**
   * Test Case Name: Service actions for zenoperator role (Edit a Logical Node)
   *
   * <p>Summary: This test case is intended to verify that user with zenoperator role can view
   * logical nodes but cannot execute basicpage actions in the Logical Nodes page, in this case,
   * editing a logical node.
   *
   * <p>Pre-requisites: Create a user "zenoperator_user" with "zenoperator" as role Login as
   * zenoperator_user Create a logical node with the name "Testnode"
   *
   * <p>Post-requisites: User named "zenoperator_user" must be deleted Logical node with the name
   * "Testnode" must be deleted
   *
   * <p>Author: Jennifer Castro
   *
   * @param testCaseId Test case ID
   * @param username Username to login
   * @param password Password of the user to login
   * @param newUsername Username of the user to add
   * @param newUserPassword Password of the user to add
   * @param userRole Type of the user to add e.g: manager
   * @param userEmail Email of the user
   * @param testNode Logical node name
   */
  @Test(groups = {"tc_21032", "impact_services_tests"})
  @Parameters({
    "tc_21032_testcaseid",
    "tc_21032_username",
    "tc_21032_password",
    "tc_21032_newusername",
    "tc_21032_newuserpassword",
    "tc_21032_userrole",
    "tc_21032_useremail",
    "tc_21032_testnode",
    "tc_21032_nodedescription",
    "ln_root_tree_node_name"
  })
  public void editLogicalNodeAsZenoperator(
      String testCaseId,
      String username,
      String password,
      String newUsername,
      String newUserPassword,
      String userRole,
      String userEmail,
      String testNode,
      String nodeDescription,
      String lnTreeNodeName) {

    TestlinkCommands.setTestCaseID(testCaseId);

    CommonPage commonPage = new CommonPage();
    ServicesSubMenuPage servicesSubMenuPage = new ServicesSubMenuPage();
    LogicalNodesCommon logicalNodesCommon = new LogicalNodesCommon();
    testNode = String.format("%s %d", testNode, Utilities.getRandomNumber(1000));

    List<String> path = new ArrayList<String>();
    path.add(testNode);

    setTestCaseSection(TEST_CASE_SECTION_PRETEST);
    TestlinkCommands.addStepDescription(TEST_CASE_SECTION_PRETEST_LABEL);
    addUserPreTestSteps(
        commonPage, username, password, newUsername, newUserPassword, userRole, userEmail);

    logicalNodesCommon.addLogicalNodePreTestSteps(
        commonPage, servicesSubMenuPage, username, password, testNode, path);

    LoginCommon.login(newUsername, newUserPassword);

    setTestCaseSection(TEST_CASE_SECTION_TEST);
    TestlinkCommands.addStepDescription(TEST_CASE_SECTION_TEST_LABEL);
    TestlinkCommands.addStepDescription("- Go to Services Page");
    DynamicServicesPage dynamicServicesPage =
        (DynamicServicesPage) commonPage.navigateTo(SERVICES_PAGE);
    Assert.assertTrue(dynamicServicesPage.checkPage(), "Dynamic Service page is not displayed");

    TestlinkCommands.addStepDescription("- Go to Logical Nodes Page");
    LogicalNodesPage logicalNodesPage =
        (LogicalNodesPage) servicesSubMenuPage.navigateTo(LOGICAL_NODES_SUBMENU_PAGE);
    Assert.assertTrue(logicalNodesPage.checkPage(), "Logical Node page is not displayed");

    Assert.assertTrue(
        logicalNodesPage.isLogicalNodeHighlighted(lnTreeNodeName),
        String.format("Logical root node: %s is not highlighted", lnTreeNodeName));
    Utilities.waitTime(TIMEOUT_2_SECONDS);

    TestlinkCommands.addStepDescription(
        String.format("- Click on \"%s\" on the left frame", testNode));
    logicalNodesCommon.reachElementInsideTree(path, logicalNodesPage, true, true);

    // Validation: Logical Node is highlighted to show that it is selected.
    Assert.assertTrue(
        logicalNodesPage.isLogicalNodeHighlighted(testNode),
        String.format("Logical node: %s is not highlighted", testNode));

    logicalNodesPage.editBasicLogicalNodeinformation("", nodeDescription);
    functions.waitTime(TIMEOUT_2_SECONDS);

    // Validation: Save button is disabled
    Assert.assertFalse(logicalNodesPage.isSaveButtonEnabled(), "Save button is NOT disabled");

    // Validation: Cancel button is enabled on the right frame of the page.
    Assert.assertTrue(logicalNodesPage.isCancelButtonEnabled(), "Cancel button is NOT enabled");

    setTestCaseSection(TEST_CASE_SECTION_POSTTEST);
    TestlinkCommands.addStepDescription(TEST_CASE_SECTION_POSTTEST_LABEL);
    LoginPage loginPage = commonPage.signOut();
    Assert.assertTrue(loginPage.checkPage(), "Login page is not displayed");

    logicalNodesCommon.deleteLogicalNodePostTestSteps(
        commonPage, servicesSubMenuPage, username, password, testNode, path);

    deleteUserPostTestSteps(commonPage, username, password, newUsername);
  }
 /**
  * This method select trigger at the left panel
  *
  * @param triggersPage Trigger PO
  */
 public static void selectTriggerLeftPanelAndCheckPage(TriggersPage triggersPage) {
   triggersPage.clickOnTriggerLink();
   Assert.assertTrue(triggersPage.checkPage(), "Trigger page is not loaded correctly");
   Utilities.waitTime(ConstantsClass.TIMEOUT_1_SECONDS);
 }