*** Settings ***

Documentation  Test OpenBMC GUI "Manage user account" sub-menu  of
...            "Users".

Resource        ../../lib/resource.robot

Test Setup      Test Setup Execution
Test Teardown   Close Browser


*** Variables ***

${xpath_input_username}               //input[@name='UserName']
${xpath_input_password}               //input[@name='Password']
${xpath_input_retype_password}        //input[@name='VerifyPassword']
${xpath_input_user_role}              //select[@id='role']
${xpath_input_enabled_checkbox}       //label[@for="user-manage__enabled"]
${xpath_input_lockout_time}           //input[@id='lockoutTime']
${xpath_input_failed_login_attempts}  //input[@id='lockoutThreshold']
${xpath_select_manage_users}          //a[contains(text(), "Manage user account")]
${xpath_select_users}                 //button[contains(@class, "users")]
${xpath_save_setting_button}          //button[text() ="Save settings"]
${xpath_create_user_button}           //button[text() ="Create user"]
${xpath_edit_button}                  //button[text() ="Edit"]
${xpath_delete_button}                //button[text() ="Delete"]
${label}                              //label[@class="control-check"]
${xpath_edit_save_button}             //*[@id="user-accounts"]/form/section/div[7]/button[2]
&{user_password}                      testUser1=testUserPwd1  root=0penBmc
&{action_msg_relation}                add=User has been created successfully
                  ...                 modify=User has been updated successfully
                  ...                 add_dup=Username exists
&{user_invalid_password}              root=rootPwd1
${max_num_users}                      ${15}
${xpath_table_base}                   //*[@id="user-accounts"]/div[4]/div[2]
&{user_table_column_xpath_mapping}    Username=/div[1]
                              ...     Enabled=/div[2]
                              ...     Role=/div[3]
                              ...     Edit=/div[5]/button[1]
                              ...     Delete=/div[5]/button[2]


*** Test Cases ***

Verify Existence Of All Section In User Page
    [Documentation]  Verify existence of all sections in user page.
    [Tags]  Verify_Existence_Of_All_Section_In_User_Page

    Page should contain  User account properties
    Page should contain  User account information
    Page should contain  User account settings


Verify Existence Of All Input Boxes In User Page
    [Documentation]  Verify existence of all input boxes in user page.
    [Tags]  Verify_Existence_Of_All_Input_Boxes_In_User_Page

    # Input boxes under user account settings
    Page Should Contain Element  ${xpath_input_username}
    Page Should Contain Element  ${xpath_input_password}
    Page Should Contain Element  ${xpath_input_retype_password}
    Page Should Contain Element  ${xpath_input_user_role}
    Page Should Contain Element  ${xpath_input_enabled_checkbox}

    # Input boxes under user account properties
    Page Should Contain Element  ${xpath_input_lockout_time}
    Page Should Contain Element  ${xpath_input_failed_login_attempts}


Verify Existence Of All Button In User Page
    [Documentation]  Verify existence of all button in user page.
    [Tags]  Verify_Existence_Of_All_Button_In_User_Page

    # Buttons under user account properties
    Page Should Contain Element  ${xpath_save_setting_button}

    # Buttons under user account settings
    Page Should Contain Element  ${xpath_create_user_button}

    # Buttons under user account properties
    Page Should Contain Element  ${xpath_edit_button}
    Page Should Contain Element  ${xpath_delete_button}


Verify Error When Duplicate User Is Created
    [Documentation]  Verify error when duplicate user is created.
    [Tags]  Verify_Error_When_Duplicate_User_Is_Created
    [Setup]  Run Keywords  Test Setup Execution  AND  Delete Given Users

    Add Or Modify User  root  &{user_password}[root]  action=add_dup


Delete User And Verify
    [Documentation]  Delete user and verify.
    [Tags]  Delete_User_And_Verify
    [Setup]  Run Keywords  Test Setup Execution  AND  Delete Given Users

    Add Or Modify User  testUser1  &{user_password}[testUser1]
    Delete Given Users  delete_user=testUser1
    Page Should Not Contain  testUser1


Verify Invalid Password Error
    [Documentation]  Verify the error message when user logs in with invalid password.
    [Tags]  Verify_Invalid_Password_Error
    [Setup]  Run Keywords  Test Setup Execution  AND  Delete Given Users

    LogOut OpenBMC GUI
    Login And Verify Message  root  &{user_invalid_password}[root]  Invalid username or password


Edit And Verify User Property
    [Documentation]  Edit and verify the user property.
    [Tags]  Edit_And_Verify_User_Property
    [Setup]  Run Keywords  Test Setup Execution  AND  Delete Given Users

    Add Or Modify User  testUser1  &{user_password}[testUser1]  User
    Reload Page
    Edit User Role  testUser1  &{user_password}[testUser1]  Callback
    ${user_role}=  Get User Property Value  testUser1  Role
    Should Be Equal  ${user_role}  Callback


*** Keywords ***

Test Setup Execution
    [Documentation]  Do test case setup tasks.

    Launch Browser And Login OpenBMC GUI
    Click Button  ${xpath_select_users}
    Sleep  2s
    Wait Until Page Contains Element  ${xpath_select_manage_users}
    Click Element  ${xpath_select_manage_users}
    Wait Until Page Contains  User account information

Add Or Modify User
   [Documentation]  Create or edit user.
   [Arguments]  ${username}  ${password}  ${role}=Administrator  ${enabled}=${True}
   ...          ${action}=add

   # Description of argument(s):
   # username  Name of the user to be created.
   # role      Role of the new user.
   # enabled   If True, User is enabled (Default), False, User is disabled.
   # action    add - Creates a new user.
   #           modify - Edits an existing user.
   #           add_dup - Tries to add a duplicate user and verifies the error message.

   Run Keyword If  '${action}' == 'add' or '${action}' == 'add_dup'
              ...  Input Text  ${xpath_input_username}  ${username}
   Input Password  ${xpath_input_password}  ${password}
   Input Password  ${xpath_input_retype_password}  ${password}
   Select From List By Value  ${xpath_input_user_role}  ${role}
   Run Keyword If  '${enabled}' == 'True'  Click Element  ${xpath_input_enabled_checkbox}
   Run Keyword If  '${action}' == 'modify'
   ...  Click Button  ${xpath_edit_save_button}
   ...  ELSE  Click Button  ${xpath_create_user_button}
   Capture Page Screenshot
   Page Should Contain  &{action_msg_relation}[${action}]

Delete Given Users
   [Documentation]  Delete given users.
   [Arguments]  ${delete_user}=nonRoot

   # Description of argument(s):
   # delete_user  values - nonRoot/username
   #              If nonRoot - Deletes all non-root users,
   #                 username - Deletes the given user.

   Wait Until Page Contains  root
   Run Keyword If  '${delete_user}' != 'nonRoot'  Page Should Contain  ${delete_user}
   # Row id that gets deleted in every iteration.
   ${deleting_row_id}=  Set Variable  1
   :FOR  ${row}  IN RANGE  1  ${max_num_users+1}
   \    ${xpath_user}=  Get Xpath For User Table Attribute  Username  ${row}
   \    ${status}=  Run Keyword And Return Status  Page Should Contain Element  ${xpath_user}
   \    Exit For Loop If  '${status}' == 'False'
   \    ${user}=  Get Text  ${xpath_user}
   \    ${deleting_row_id}  Set Variable If  '${user}' == 'root' or '${deleting_row_id}' == '2'
   \    ...    2  1
   \    Continue For Loop If  '${user}' == 'root'
   \    ${xpath_delete_user}  Run Keyword If  '${user}' == '${delete_user}' or '${delete_user}' == 'nonRoot'
   \    ...    Get Xpath For User Table Attribute  Delete  ${deleting_row_id}
   \    Run Keyword If  '${user}' == '${delete_user}' or '${delete_user}' == 'nonRoot'
   \    ...  Run Keywords  Click Button  ${xpath_delete_user}
   \    ...  AND  Page Should Contain  User has been deleted successfully
   \    ...  AND  Reload Page
   \    ...  AND  Exit For Loop If  '${user}' == '${delete_user}'

Get User Property Value
   [Documentation]  Return property value for the given user.
   [Arguments]  ${username}  ${property}=Role

   # Description of argument(s):
   # username  BMC Username.
   # property  User property (e.g. "Role" or "Enabled").

   # Maximum user limit is 15. Hence iterating only 15 times.
   :FOR  ${row_num}  IN RANGE  1  ${max_num_users+1}
   \    ${xpath_user}=  Get Xpath For User Table Attribute  Username  ${row_num}
   \    Page Should Contain Element  ${xpath_user}
   \    ${xpath_property}=  Get Xpath For User Table Attribute  ${property}  ${row_num}
   \    ${user}=  Get Text  ${xpath_user}
   \    Run Keyword And Return If  '${user}' == '${username}'  Get Text  ${xpath_property}

Login And Verify Message
    [Documentation]  Verifies the error message displayed on screen while logging in.
    [Arguments]  ${username}  ${password}  ${msg}

    # Description of argument(s):
    # username  BMC Username.
    # password  BMC Password.
    # msg       Message which is expected to be found on login page after login attempt.

    Input Text  ${xpath_textbox_username}  ${username}
    Input Password  ${xpath_textbox_password}  ${password}
    Click Element  ${xpath_button_login}
    Page Should Contain  ${msg}

Edit User Role
   [Documentation]  Change the role of user to the given value.
   [Arguments]  ${username}  ${password}  ${user_role}

   # Description of argument(s):
   # username   BMC Username.
   # password   BMC Password.
   # user_role  The user role to be assigned ("Administrator", "User", "Operator", "Callback").

   # Maximum user limit is 15. Hence iterating only 15 times.
   :FOR  ${row_num}  IN RANGE  1  ${max_num_users+1}
   \    ${xpath_user}=  Get Xpath For User Table Attribute  Username  ${row_num}
   \    Page Should Contain Element  ${xpath_user}
   \    ${xpath_edit_user}=  Get Xpath For User Table Attribute  Edit  ${row_num}
   \    ${user}=  Get Text  ${xpath_user}
   \    Run Keyword If  '${user}' == '${username}'  Run Keywords  Click Element  ${xpath_edit_user}
   \    ...    AND  Add Or Modify user  ${username}  ${password}  ${user_role}  action=modify
   \    ...    AND  Exit For Loop

Get Xpath For User Table Attribute
   [Documentation]  Get xpath for given user table attribute.
   [Arguments]  ${attribute}  ${row_num}

   # Description of argument(s):
   # attribute  User table attribute ("Username", "Enabled", "Role", "Edit", "Delete").
   # row_num    Row number.

   [Return]  ${xpath_table_base}/div[${row_num}]&{user_table_column_xpath_mapping}[${attribute}]
