Skip to content

Commit

Permalink
Replace all Xpaths with pf-v5 to pf-v6 (#2140)
Browse files Browse the repository at this point in the history
- Also fix global suites failure on login, due to RHOAI image renamed

Signed-off-by: manosnoam <nmanos@redhat.com>
  • Loading branch information
manosnoam authored Dec 19, 2024
1 parent 1ad1975 commit 3a386c2
Show file tree
Hide file tree
Showing 16 changed files with 69 additions and 69 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -163,8 +163,8 @@ Get Memory Requested

Get Requested Resources Tooltip Text
[Documentation] retuns tooltip text of requested resources chart
Wait Until Element Is Visible xpath://*[contains(@style, 'fill: var(--pf-v5-chart-tooltip--Fill')]
${tooltip_text} = Get Text xpath://*[contains(@style, 'fill: var(--pf-v5-chart-tooltip--Fill')]
Wait Until Element Is Visible xpath://*[contains(@style, 'fill: var(--pf-v6-chart-tooltip--Fill')]
${tooltip_text} = Get Text xpath://*[contains(@style, 'fill: var(--pf-v6-chart-tooltip--Fill')]
RETURN ${tooltip_text}

Get Memory Requested Tooltip Text
Expand Down Expand Up @@ -266,7 +266,7 @@ Check Distributed Workload Resource Metrics Status
[Documentation] checks Distributed Workload Resource Metrics Status contents
[Arguments] ${job_name} ${job_status}
Check Expected String Contains //td[@data-label="Name"] ${job_name}
Check Expected String Equals //td[@data-label="Status"]//span[@class="pf-v5-c-label__text"] ${job_status}
Check Expected String Equals //td[@data-label="Status"]//span[@class="pf-v6-c-label__text"] ${job_status}

Compare Workload Created Date With Current Date
[Documentation] Check Workload Created Date To Be Less Than Equal To Current Date
Expand Down Expand Up @@ -310,10 +310,10 @@ Check Distributed Workload Resource Metrics Chart
${cpu_usage_hover_value} ${cpu_requested_hover_value} = Get CPU Requested Tooltip Text
Check Resource Consuming Usage ${cpu_usage} ${cpu_usage_hover_value} CPU
Should Be True ${cpu_requested_hover_value} == ${cpu_requested}
${cpu_consuming} = Get Text xpath:(//*[@style[contains(., 'var(--pf-v5-chart-donut--label--title--Fill')]])[1]
${cpu_consuming} = Get Text xpath:(//*[@style[contains(., 'var(--pf-v6-chart-donut--label--title--Fill')]])[1]
Check Resource Consuming Usage ${cpu_usage} ${cpu_consuming} CPU

Mouse Over (//button[@class="pf-v5-c-table__button"])[1]
Mouse Over (//button[@class="pf-v6-c-table__button"])[1]

Wait Until Element Is Visible xpath=//*[@id="topResourceConsumingMemory-ChartLabel-title"] timeout=120
Wait Until Element Is Visible xpath=//*[@id="topResourceConsumingMemory-ChartLegend-ChartLabel-0"] timeout=120
Expand All @@ -323,7 +323,7 @@ Check Distributed Workload Resource Metrics Chart
${memory_usage_hover_value} ${memory_requested_hover_value} = Get Memory Requested Tooltip Text
Check Resource Consuming Usage ${memory_usage} ${memory_usage_hover_value} Memory
Should Be True ${memory_requested_hover_value} == ${memory_requested}
${memory_consuming} = Get Text xpath:(//*[@style[contains(., 'var(--pf-v5-chart-donut--label--title--Fill')]])[2]
${memory_consuming} = Get Text xpath:(//*[@style[contains(., 'var(--pf-v6-chart-donut--label--title--Fill')]])[2]
Check Resource Consuming Usage ${memory_usage} ${memory_consuming} Memory

Check Distributed Worklaod Status Overview
Expand All @@ -339,7 +339,7 @@ Check Distributed Worklaod Status Overview
${get_created_datetime} = Get Text xpath=//td[@data-label="Created"]
${get_created_date} = Evaluate re.search(r'[^,]+','''${get_created_datetime}''').group(0)
Compare Workload Created Date With Current Date ${get_created_date} ${get_current_date}
Check Expected String Equals //td[@data-label="Status"]//span[@class="pf-v5-c-label__text"] ${job_status}
Check Expected String Equals //td[@data-label="Status"]//span[@class="pf-v6-c-label__text"] ${job_status}
Check Expected String Equals //td[@data-label="Latest Message"] ${job_status_message}

Check Resource Consuming Usage
Expand Down Expand Up @@ -367,7 +367,7 @@ Submit Kueue Workload
Wait For Job With Status
[Documentation] Wait for job status with job name
[Arguments] ${job_name} ${job_status} ${timeout}
Wait Until Element Is Visible //td[@class='pf-v5-c-table__td' and contains(text(), '${job_name}')]/following-sibling::td[@data-label='Status']/span/span/span[@class='pf-v5-c-label__text'and text()='${job_status}'] timeout=${timeout}
Wait Until Element Is Visible //td[@class='pf-v6-c-table__td' and contains(text(), '${job_name}')]/following-sibling::td[@data-label='Status']/span/span/span[@class='pf-v6-c-label__text'and text()='${job_status}'] timeout=${timeout}

Check Warning Threshold Chart
[Documentation] verifies warning threshold of cpu and memory resources
Expand Down
12 changes: 6 additions & 6 deletions ods_ci/tests/Resources/Page/HybridCloudConsole/HCCLogin.robot
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@ Is SSO Login Page Visible
RETURN ${login_prompt_visible}

Wait For HCC Splash Page
Wait Until Page Contains Element xpath://span[contains(@class, 'pf-v5-c-spinner')] timeout=15
Wait Until Page Does Not Contain Element xpath://span[contains(@class, 'pf-v5-c-spinner')] timeout=20
Wait Until Page Contains Element xpath://span[contains(@class, 'pf-v6-c-spinner')] timeout=15
Wait Until Page Does Not Contain Element xpath://span[contains(@class, 'pf-v6-c-spinner')] timeout=20
Sleep 3

Login To HCC
Expand Down Expand Up @@ -69,11 +69,11 @@ Open Cluster By Name
[Documentation] Opens the cluster by name from the list of clusters.
${cluster_id} = Get Cluster ID
${cluster_name}= Get Cluster Name By Cluster ID ${cluster_id}
Wait Until Page Contains Element //input[@class="pf-v5-c-form-control cluster-list-filter"]
Input Text //input[@class="pf-v5-c-form-control cluster-list-filter"] ${cluster_name}
Wait Until Page Contains Element //input[@class="pf-v6-c-form-control cluster-list-filter"]
Input Text //input[@class="pf-v6-c-form-control cluster-list-filter"] ${cluster_name}
Sleep 1s
Wait Until Page Contains Element //table[@class="pf-v5-c-table pf-m-grid-md"]//a 10
Click Link //table[@class="pf-v5-c-table pf-m-grid-md"]//a
Wait Until Page Contains Element //table[@class="pf-v6-c-table pf-m-grid-md"]//a 10
Click Link //table[@class="pf-v6-c-table pf-m-grid-md"]//a

Maybe Skip OCM Tour
${tour_modal} = Run Keyword And Return Status Page Should Contain Element xpath=//div[@id="pendo-guide-container"]
Expand Down
2 changes: 1 addition & 1 deletion ods_ci/tests/Resources/Page/OCPDashboard/Page.robot
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ Delete Project By Name
Wait Until Page Contains Element //input[@data-test-id="item-filter"]
Input Text //input[@data-test-id="item-filter"] ${project_name}
Sleep 5
Click Button //button[@class="pf-v5-c-dropdown__toggle pf-m-plain"]
Click Button //button[@class="pf-v6-c-dropdown__toggle pf-m-plain"]
Sleep 5
Click Button //button[@data-test-action="Delete Project"]
Wait Until Page Contains Element //div[@class="modal-header"] 10
Expand Down
2 changes: 1 addition & 1 deletion ods_ci/tests/Resources/Page/OCPDashboard/Pods/Pods.robot

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ ${JUPYTERHUB_DROPDOWN_XPATH} = //button[@aria-label="Options menu"]
${KFNBC_CONTAINER_SIZE_TITLE} = //div[.="Deployment size"]/..//span[.="Container Size"]
${KFNBC_CONTAINER_SIZE_DROPDOWN_XPATH} = //label[@for="modal-notebook-container-size"]/../..//button[@aria-label="Options menu"]
${KFNBC_ACCELERATOR_HEADER_XPATH} = //span[text()='Accelerator']
${KFNBC_ACCELERATOR_DROPDOWN_XPATH} = //label[@for='modal-notebook-accelerator']/ancestor::div[@class='pf-v5-c-form__group']/descendant::button
${KFNBC_ACCELERATOR_DROPDOWN_XPATH} = //label[@for='modal-notebook-accelerator']/ancestor::div[@class='pf-v6-c-form__group']/descendant::button
${KFNBC_ACCELERATOR_INPUT_XPATH} = //input[@aria-label='Number of accelerators']
${KFNBC_ACCELERATOR_LESS_BUTTON_XPATH} = ${KFNBC_ACCELERATOR_INPUT_XPATH}/parent::*/parent::*/preceding-sibling::*//button
${KFNBC_ACCELERATOR_PLUS_BUTTON_XPATH} = ${KFNBC_ACCELERATOR_INPUT_XPATH}/parent::*/parent::*/following-sibling::*//button
Expand All @@ -29,7 +29,7 @@ ${KFNBC_MODAL_CANCEL_XPATH} = ${KFNBC_MODAL_HEADER_XPATH}//button[.="Cancel"]
${KFNBC_MODAL_CLOSE_XPATH} = ${KFNBC_MODAL_HEADER_XPATH}//button[.="Close"]
${KFNBC_MODAL_X_XPATH} = ${KFNBC_MODAL_HEADER_XPATH}//button[@aria-label="Close"]
${KFNBC_CONTROL_PANEL_HEADER_XPATH} = //h1[.="Notebook server control panel"]
${KFNBC_ENV_VAR_NAME_PRE} = //span[.="Variable name"]/../../../div[@class="pf-v5-c-form__group-control"]
${KFNBC_ENV_VAR_NAME_PRE} = //span[.="Variable name"]/../../../div[@class="pf-v6-c-form__group-control"]
${DEFAULT_PYTHON_VER} = 3.11
${PREVIOUS_PYTHON_VER} = 3.9
${DEFAULT_NOTEBOOK_VER} = 2024.2
Expand Down Expand Up @@ -601,7 +601,7 @@ Fetch Image Tooltip Info
[Documentation] Fetches libraries in image tooltip text
[Arguments] ${img}
${xpath_img_tooltip} = Set Variable //input[contains(@id, "${img}")]/../label//div[@class=""][.=""]
${xpath_tooltip_items} = Set Variable //div[@class='pf-v5-c-popover__body']/p
${xpath_tooltip_items} = Set Variable //div[@class='pf-v6-c-popover__body']/p
@{tmp_list} = Create List
Click Element ${xpath_img_tooltip}
${libs} = Get Element Count ${xpath_tooltip_items}
Expand Down Expand Up @@ -670,7 +670,7 @@ Get List Of All Available Container Size
${size} Create List
#Click Element xpath://div[contains(concat(' ',normalize-space(@class),' '),' jsp-spawner__size_options__select ')]\[1]
Click Element xpath://button[@aria-label="Options menu"][1]
${link_elements} Get WebElements xpath://*[@class="pf-v5-c-select__menu-item-main"]
${link_elements} Get WebElements xpath://*[@class="pf-v6-c-select__menu-item-main"]
FOR ${idx} ${ext_link} IN ENUMERATE @{link_elements} start=1
${text} Get Text ${ext_link}
Append To List ${size} ${text}
Expand Down
48 changes: 24 additions & 24 deletions ods_ci/tests/Resources/Page/ODH/ODHDashboard/ODHDashboard.robot
Original file line number Diff line number Diff line change
Expand Up @@ -13,28 +13,28 @@ Library JupyterLibrary
# This variable is overriden for ODH runs via 'test-variables-odh-overwrite.yml'
${ODH_DASHBOARD_PROJECT_NAME}= Red Hat OpenShift AI
${ODH_DASHBOARD_SPINNER_XP}= xpath://*[@data-id="loading-empty-state" or @aria-valuetext="Loading..."]
${ODH_DASHBOARD_SIDEBAR_HEADER_ENABLE_BUTTON}= //*[@class="pf-v5-c-drawer__panel-main"]//button[.='Enable']
${ODH_DASHBOARD_SIDEBAR_HEADER_GET_STARTED_ELEMENT}= //*[@class="pf-v5-c-drawer__panel-main"]//*[.='Get started']
${CARDS_XP}= //*[(contains(@class, 'odh-card')) and (contains(@class, 'pf-v5-c-card'))]
${ODH_DASHBOARD_SIDEBAR_HEADER_ENABLE_BUTTON}= //*[@class="pf-v6-c-drawer__panel-main"]//button[.='Enable']
${ODH_DASHBOARD_SIDEBAR_HEADER_GET_STARTED_ELEMENT}= //*[@class="pf-v6-c-drawer__panel-main"]//*[.='Get started']
${CARDS_XP}= //*[(contains(@class, 'odh-card')) and (contains(@class, 'pf-v6-c-card'))]
${CARD_BUTTON_XP}= //input[@name="odh-explore-selectable-card"]
${RES_CARDS_XP}= //div[contains(@data-ouia-component-type, "Card")]
${JUPYTER_CARD_XP}= //div[@data-testid="card jupyter"]
${EXPLORE_PANEL_XP}= //div[@data-testid="explore-drawer-panel"]
${HEADER_XP}= div[@class='pf-v5-c-card__header']
${TITLE_XP}= div[@class='pf-v5-c-card__title']//span
${TITLE_XP_OLD}= div[@class='pf-v5-c-card__title']//div/div[1]
${PROVIDER_XP}= div[@class='pf-v5-c-card__title']//span[contains(@class, "provider")]
${DESCR_XP}= div[@class='pf-v5-c-card__body']
${HEADER_XP}= div[@class='pf-v6-c-card__header']
${TITLE_XP}= div[@class='pf-v6-c-card__title']//span
${TITLE_XP_OLD}= div[@class='pf-v6-c-card__title']//div/div[1]
${PROVIDER_XP}= div[@class='pf-v6-c-card__title']//span[contains(@class, "provider")]
${DESCR_XP}= div[@class='pf-v6-c-card__body']
${BADGES_XP}= ${HEADER_XP}//div[contains(@class, 'badge') or contains(@class, 'coming-soon')]
${BADGES_XP_OLD}= ${HEADER_XP}/div[contains(@class, 'badges')]/span[contains(@class, 'badge') or contains(@class, 'coming-soon')]
${OFFICIAL_BADGE_XP}= div[@class='pf-v5-c-card__title']//img
${OFFICIAL_BADGE_XP_OLD}= div[@class='pf-v5-c-card__title']//img[contains(@class, 'supported-image')] # robocop: disable
${OFFICIAL_BADGE_XP}= div[@class='pf-v6-c-card__title']//img
${OFFICIAL_BADGE_XP_OLD}= div[@class='pf-v6-c-card__title']//img[contains(@class, 'supported-image')] # robocop: disable
${FALLBK_IMAGE_XP}= ${HEADER_XP}/svg[contains(@class, 'odh-card__header-fallback-img')]
${IMAGE_XP}= ${HEADER_XP}//picture[contains(@class,'pf-m-picture')]/source
${IMAGE_XP_OLD}= ${HEADER_XP}/img[contains(@class, 'odh-card__header-brand')]
${APPS_DICT_PATH_LATEST}= tests/Resources/Files/AppsInfoDictionary_latest.json
${SIDEBAR_TEXT_CONTAINER_XP}= //div[contains(@class,'odh-markdown-view')]
${SUCCESS_MSG_XP}= //div[@class='pf-v5-c-alert pf-m-success']
${SUCCESS_MSG_XP}= //div[@class='pf-v6-c-alert pf-m-success']
${PAGE_TITLE_XP}= //*[@data-testid="app-page-title"]
${CLUSTER_SETTINGS_XP}= //*[@data-testid="app-page-title" and text()="Cluster settings"]
${PVC_SIZE_INPUT_XP}= xpath=//*[@data-testid="pvc-size-input"]
Expand All @@ -48,11 +48,11 @@ ${CUSTOM_IMAGE_LAST_ROW_NAME}= tr[last()]/td[1]
${CUSTOM_IMAGE_LAST_ROW_VERSION}= tr[last()]/td[2]
${CUSTOM_IMAGE_EDIT_BTN}= button[@id="edit-package-software-button"]
${CUSTOM_IMAGE_REMOVE_BTN}= button[@id="delete-package-software-button"]
${NOTIFICATION_DRAWER_CLOSE_BTN}= //div[@class="pf-v5-c-drawer__panel"]/div/div//button
${NOTIFICATION_DRAWER_CLOSED}= //div[@class="pf-v5-c-drawer__panel" and @hidden=""]
${NOTIFICATION_DRAWER_CLOSE_BTN}= //div[@class="pf-v6-c-drawer__panel"]/div/div//button
${NOTIFICATION_DRAWER_CLOSED}= //div[@class="pf-v6-c-drawer__panel" and @hidden=""]
${GROUPS_CONFIG_CM}= groups-config
${RHODS_GROUPS_CONFIG_CM}= rhods-groups-config
${RHODS_LOGO_XPATH}= //img[@alt="${ODH_DASHBOARD_PROJECT_NAME} Logo"]
${RHODS_LOGO_XPATH}= //img[@alt="${ODH_DASHBOARD_PROJECT_NAME}"]
${USER_MENU_TOGGLE}= //button[@id="user-menu-toggle"]
${LOGOUT_BTN}= //button[.="Log out"]
@{ISV_TO_REMOVE_SELF_MANAGED}= Create List starburst nvidia rhoam
Expand Down Expand Up @@ -122,7 +122,7 @@ Wait For Dashboard Page Title
Wait Until RHODS Dashboard ${dashboard_app} Is Visible
# Ideally the timeout would be an arg but Robot does not allow "normal" and "embedded" arguments
# Setting timeout to 30seconds since anything beyond that should be flagged as a UI bug
Wait Until Element Is Visible xpath://div[contains(@class,'gallery')]/div//div[@class="pf-v5-c-card__title"]//*[text()="${dashboard_app}"]
Wait Until Element Is Visible xpath://div[contains(@class,'gallery')]/div//div[@class="pf-v6-c-card__title"]//*[text()="${dashboard_app}"]
... timeout=30s

Launch ${dashboard_app} From RHODS Dashboard Link
Expand All @@ -134,9 +134,9 @@ Launch ${dashboard_app} From RHODS Dashboard Link
Click Link xpath:${CARDS_XP}//*[text()='${splits[0]} ']/../..//a
ELSE
IF "${dashboard_app}" == "Jupyter"
Click Link xpath://div[contains(@class,'pf-v5-l-gallery')]/div[contains(@class,'pf-v5-c-card')]/div[@class="pf-v5-c-card__title"]//span[text()="${dashboard_app}"]/../../..//div[contains(@class,"pf-v5-c-card__footer")]/a
Click Link xpath://div[contains(@class,'pf-v6-l-gallery')]/div[contains(@class,'pf-v6-c-card')]/div[@class="pf-v6-c-card__title"]//span[text()="${dashboard_app}"]/../../..//div[contains(@class,"pf-v6-c-card__footer")]/a
ELSE
Click Link xpath://div[contains(@class,'pf-v5-l-gallery')]/div[contains(@class,'pf-v5-c-card')]/div[@class="pf-v5-c-card__title"]//span[text()="${dashboard_app}"]/../..//div[contains(@class,"pf-v5-c-card__footer")]/a
Click Link xpath://div[contains(@class,'pf-v6-l-gallery')]/div[contains(@class,'pf-v6-c-card')]/div[@class="pf-v6-c-card__title"]//span[text()="${dashboard_app}"]/../..//div[contains(@class,"pf-v6-c-card__footer")]/a
END
END
IF "${dashboard_app}" != "Jupyter"
Expand All @@ -145,8 +145,8 @@ Launch ${dashboard_app} From RHODS Dashboard Link

Launch ${dashboard_app} From RHODS Dashboard Dropdown
Wait Until RHODS Dashboard ${dashboard_app} Is Visible
Click Button xpath://div[@class="pf-v5-c-card__title" and .="${dashboard_app}"]/..//button[contains(@class,pf-v5-c-dropdown__toggle)]
Click Link xpath://div[@class="pf-v5-c-card__title" and .="${dashboard_app}"]/..//a[.="Launch"]
Click Button xpath://div[@class="pf-v6-c-card__title" and .="${dashboard_app}"]/..//button[contains(@class,pf-v6-c-dropdown__toggle)]
Click Link xpath://div[@class="pf-v6-c-card__title" and .="${dashboard_app}"]/..//a[.="Launch"]
Switch Window NEW

Verify Service Is Enabled
Expand Down Expand Up @@ -347,7 +347,7 @@ Open Get Started Sidebar And Return Status
Mouse Down ${card_locator}
Mouse Up ${card_locator}
${status}= Run Keyword And Return Status Wait Until Page Contains Element
... xpath://div[contains(@class,'pf-v5-c-drawer__panel-main')]
... xpath://div[contains(@class,'pf-v6-c-drawer__panel-main')]
Sleep 1
RETURN ${status}

Expand All @@ -364,7 +364,7 @@ Check Get Started Sidebar Status
END

Get Sidebar Links
${link_elements}= Get WebElements xpath://div[contains(@class,'pf-v5-c-drawer__panel-main')]//a
${link_elements}= Get WebElements xpath://div[contains(@class,'pf-v6-c-drawer__panel-main')]//a
RETURN ${link_elements}

Check Sidebar Links
Expand Down Expand Up @@ -409,7 +409,7 @@ Check Sidebar Header Text
... message=Missing Sidebar Title for App Card ${app_id}
${header}= Get Text xpath:${SIDEBAR_TEXT_CONTAINER_XP}/h1
Run Keyword And Continue On Failure Should Be Equal ${header} ${sidebar_h1}
${getstarted_title}= Get Text xpath://div[contains(@class,'pf-v5-c-drawer__head')]
${getstarted_title}= Get Text xpath://div[contains(@class,'pf-v6-c-drawer__head')]
${titles}= Split String ${getstarted_title} separator=\n max_split=1
Run Keyword And Continue On Failure Should Be Equal ${titles[0]} ${expected_data}[${app_id}][title]
Run Keyword And Continue On Failure Should Be Equal ${titles[1]} ${expected_data}[${app_id}][provider]
Expand Down Expand Up @@ -538,9 +538,9 @@ Search Items In Resources Section
Sleep 5
${version-check}= Is RHODS Version Greater Or Equal Than 1.18.0
IF ${version-check} == True
Input Text xpath://input[@class="pf-v5-c-text-input-group__text-input"] ${element}
Input Text xpath://input[@class="pf-v6-c-text-input-group__text-input"] ${element}
ELSE
Input Text xpath://input[@class="pf-v5-c-search-input__text-input"] ${element}
Input Text xpath://input[@class="pf-v6-c-search-input__text-input"] ${element}
END

Verify Username Displayed On RHODS Dashboard
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -192,7 +192,7 @@ Get Pipeline Run Step Log
# the logs are full loaded when "The log window displays partial content" the message appeared
Wait Until Page Contains Element xpath=//h2[text()='The log window displays partial content']
Capture Page Screenshot
${log_with_tags}= Get Element Attribute xpath://div[@class="pf-v5-c-log-viewer__list"] innerHTML
${log_with_tags}= Get Element Attribute xpath://div[@class="pf-v6-c-log-viewer__list"] innerHTML
Log ${log_with_tags}
# we close the modal otherwise any othe step in the test case will need to close it
Click Element xpath=//button[@aria-label="Close drawer panel"]
Expand All @@ -202,7 +202,7 @@ Verify Pipeline Run Is Completed
[Documentation] Open the Pipeline detail and wait for the Completed Status
[Arguments] ${pipeline_run_name} ${timeout}=10m ${experiment_name}=Default
Open Pipeline Run ${pipeline_run_name} ${experiment_name}
Wait Until Page Contains Element //span[@class='pf-v5-c-label__text' and text()='Succeeded'] timeout=${timeout}
Wait Until Page Contains Element //span[@class='pf-v6-c-label__text' and text()='Succeeded'] timeout=${timeout}
Capture Page Screenshot

# robocop: disable:line-too-long
Expand Down
Loading

0 comments on commit 3a386c2

Please sign in to comment.