Fix grafana UI tests
Fix dashboards test (regression: 98bedc5de31e1c236f81fb73718aeb59c0b93595). Fix ldap menu items test (incorrect list of panels). Refactor tests to deal with dropdown menus properly (added base class for dropdown menus). Fix single quotes to double for consistency. Change-Id: Ife07ae892564b1056d47a117c29d07b9183b2ed2
This commit is contained in:
parent
038cfb9cd8
commit
bdb8c236a8
@ -161,3 +161,32 @@ class PageObject(BaseWebObject):
|
||||
|
||||
def refresh_page(self):
|
||||
self.driver.refresh()
|
||||
|
||||
|
||||
class DropDownMenu(BaseWebObject):
|
||||
|
||||
_default_src_locator = None
|
||||
|
||||
_options_list_locator = None
|
||||
|
||||
_items_locator = None
|
||||
|
||||
def __init__(self, driver):
|
||||
super(DropDownMenu, self).__init__(driver)
|
||||
self.src_elem = self._get_element(*self._default_src_locator)
|
||||
|
||||
def is_opened(self):
|
||||
return self._is_element_present(*self._options_list_locator)
|
||||
|
||||
def open(self):
|
||||
if not self.is_opened():
|
||||
self.src_elem.click()
|
||||
|
||||
@property
|
||||
def options(self):
|
||||
self.open()
|
||||
return self._get_element(*self._options_list_locator)
|
||||
|
||||
@property
|
||||
def items(self):
|
||||
return self.options.find_elements(*self._items_locator)
|
||||
|
@ -14,19 +14,26 @@
|
||||
from fuelweb_test import logger
|
||||
from proboscis import asserts
|
||||
|
||||
from stacklight_tests.helpers.ui_tester import ui_driver
|
||||
from stacklight_tests.helpers import ui_tester
|
||||
from stacklight_tests.influxdb_grafana.grafana_ui import pages
|
||||
|
||||
|
||||
def check_grafana_dashboards(grafana_url):
|
||||
login_key_xpath = '//form[1]//button[1]'
|
||||
|
||||
login_key_xpath = '/html/body/div/div[2]/div/div/div[2]/form/div[2]/button'
|
||||
|
||||
with ui_driver(grafana_url, "Grafana", login_key_xpath) as driver:
|
||||
login_page = pages.LoginPage(driver)
|
||||
login_page.is_login_page()
|
||||
home_page = login_page.login("grafana", "grafanapass")
|
||||
home_page.is_main_page()
|
||||
def _get_main_page(driver, auth_data):
|
||||
login_page = pages.LoginPage(driver)
|
||||
login_page.is_login_page()
|
||||
home_page = login_page.login(*auth_data)
|
||||
home_page.is_main_page()
|
||||
return home_page
|
||||
|
||||
|
||||
def check_grafana_dashboards(url):
|
||||
|
||||
with ui_tester.ui_driver(url, "Grafana", login_key_xpath) as driver:
|
||||
user = ("grafana", "grafanapass")
|
||||
home_page = _get_main_page(driver, user)
|
||||
dashboard_names = {
|
||||
"Apache", "Cinder", "Elasticsearch", "Glance", "HAProxy", "Heat",
|
||||
"Hypervisor", "InfluxDB", "Keystone", "LMA self-monitoring",
|
||||
@ -35,7 +42,8 @@ def check_grafana_dashboards(grafana_url):
|
||||
dashboard_names = {
|
||||
panel_name.lower() for panel_name in dashboard_names}
|
||||
available_dashboards_names = {
|
||||
dashboard.text.lower() for dashboard in home_page.dashboards}
|
||||
dashboard.text.lower()
|
||||
for dashboard in home_page.dashboard_menu.items}
|
||||
msg = ("There is not enough panels in available panels, "
|
||||
"panels that are not presented: {}")
|
||||
# NOTE(rpromyshlennikov): should there be 'elasticsearch'
|
||||
@ -48,29 +56,25 @@ def check_grafana_dashboards(grafana_url):
|
||||
dashboard_page.get_back_to_home()
|
||||
|
||||
|
||||
def check_grafana_ldap(grafana_url, authz=False, uadmin=("uadmin", "uadmin"),
|
||||
uviewer=("uviewer", "uviewer")):
|
||||
|
||||
_check_available_menu_items_for_user(uadmin, grafana_url, authz)
|
||||
_check_available_menu_items_for_user(uviewer, grafana_url, authz)
|
||||
|
||||
|
||||
def _check_available_menu_items_for_user(user, url, authz):
|
||||
logger.info("Checking Grafana service at {} with LDAP authorization "
|
||||
"for {} user".format(url, user[0]))
|
||||
login_key_xpath = '//form[1]//button[1]'
|
||||
admin_panels = ["Dashboards", "Data Sources", "Plugins"]
|
||||
viewer_panel = list(admin_panels[1]) if authz else admin_panels
|
||||
admin_panels = ["Dashboards", "Data Sources", "Plugins", "Admin"]
|
||||
viewer_panel = admin_panels[:1] if authz else admin_panels
|
||||
|
||||
with ui_driver(url, "Grafana", login_key_xpath) as driver:
|
||||
login_page = pages.LoginPage(driver)
|
||||
login_page.is_login_page()
|
||||
home_page = login_page.login(*user)
|
||||
home_page.is_main_page()
|
||||
menu_items = [name.text for name in home_page.main_menu_items]
|
||||
with ui_tester.ui_driver(url, "Grafana", login_key_xpath) as driver:
|
||||
home_page = _get_main_page(driver, user)
|
||||
menu_items = [name.text for name in home_page.main_menu.items]
|
||||
msg = "Not all required panels are available in main menu."
|
||||
asserts.assert_true(
|
||||
(admin_panels if ("uadmin" in user)
|
||||
else viewer_panel) == menu_items,
|
||||
msg
|
||||
)
|
||||
|
||||
|
||||
def check_grafana_ldap(grafana_url, authz=False,
|
||||
uadmin=("uadmin", "uadmin"),
|
||||
uviewer=("uviewer", "uviewer")):
|
||||
_check_available_menu_items_for_user(uadmin, grafana_url, authz)
|
||||
_check_available_menu_items_for_user(uviewer, grafana_url, authz)
|
||||
|
@ -25,22 +25,38 @@ class DashboardPage(base_pages.PageObject):
|
||||
|
||||
|
||||
class MainPage(base_pages.PageObject):
|
||||
_dropdown_menu_locator = (
|
||||
_main_menu_locator = (
|
||||
by.By.CLASS_NAME,
|
||||
'navbar-brand-btn')
|
||||
|
||||
_dashboards_list_locator = (
|
||||
by.By.CLASS_NAME,
|
||||
'sidemenu'
|
||||
"navbar-brand-btn"
|
||||
)
|
||||
|
||||
_dashboard_locator = (by.By.CLASS_NAME,
|
||||
"search-item-dash-db")
|
||||
class MainDropDownMenu(base_pages.DropDownMenu):
|
||||
_default_src_locator = (
|
||||
by.By.CLASS_NAME,
|
||||
"navbar-brand-btn"
|
||||
)
|
||||
_options_list_locator = (
|
||||
by.By.CLASS_NAME,
|
||||
"sidemenu"
|
||||
)
|
||||
_items_locator = (
|
||||
by.By.CLASS_NAME,
|
||||
"dropdown"
|
||||
)
|
||||
|
||||
_dashboard_main_locator = (
|
||||
by.By.CLASS_NAME,
|
||||
"dropdown"
|
||||
)
|
||||
class DashboardDropDownMenu(base_pages.DropDownMenu):
|
||||
_default_src_locator = (
|
||||
by.By.CLASS_NAME,
|
||||
"icon-gf-dashboard"
|
||||
)
|
||||
_options_list_locator = (
|
||||
by.By.CLASS_NAME,
|
||||
"search-results-container"
|
||||
)
|
||||
_items_locator = (
|
||||
by.By.CLASS_NAME,
|
||||
"search-item-dash-db"
|
||||
)
|
||||
|
||||
def __init__(self, driver):
|
||||
super(MainPage, self).__init__(driver)
|
||||
@ -48,37 +64,19 @@ class MainPage(base_pages.PageObject):
|
||||
|
||||
def is_main_page(self):
|
||||
return (self.is_the_current_page() and
|
||||
self._is_element_visible(*self._dropdown_menu_locator))
|
||||
self._is_element_visible(*self._main_menu_locator))
|
||||
|
||||
@property
|
||||
def dropdown_menu(self):
|
||||
return self._get_element(*self._dropdown_menu_locator)
|
||||
def main_menu(self):
|
||||
return self.MainDropDownMenu(self.driver)
|
||||
|
||||
@property
|
||||
def dashboards_list(self):
|
||||
self.open_dropdown_menu()
|
||||
return self._get_element(*self._dashboards_list_locator)
|
||||
|
||||
@property
|
||||
def main_menu_items(self):
|
||||
return self.dashboards_list.find_elements(
|
||||
*self._dashboard_main_locator
|
||||
)
|
||||
|
||||
@property
|
||||
def dashboards(self):
|
||||
return self.dashboards_list.find_elements(*self._dashboard_locator)
|
||||
|
||||
def is_dropdown_menu_opened(self):
|
||||
return self._is_element_present(*self._dashboards_list_locator)
|
||||
|
||||
def open_dropdown_menu(self):
|
||||
if not self.is_dropdown_menu_opened():
|
||||
self.dropdown_menu.click()
|
||||
def dashboard_menu(self):
|
||||
return self.DashboardDropDownMenu(self.driver)
|
||||
|
||||
def open_dashboard(self, dashboard_name):
|
||||
dashboards_mapping = {dashboard.text.lower(): dashboard
|
||||
for dashboard in self.dashboards}
|
||||
for dashboard in self.dashboard_menu.items}
|
||||
dashboards_mapping[dashboard_name.lower()].click()
|
||||
dashboard_page = DashboardPage(self.driver, dashboard_name)
|
||||
dashboard_page.is_dashboards_page()
|
||||
@ -86,8 +84,8 @@ class MainPage(base_pages.PageObject):
|
||||
|
||||
|
||||
class LoginPage(base_pages.PageObject):
|
||||
_login_username_field_locator = (by.By.NAME, 'username')
|
||||
_login_password_field_locator = (by.By.NAME, 'password')
|
||||
_login_username_field_locator = (by.By.NAME, "username")
|
||||
_login_password_field_locator = (by.By.NAME, "password")
|
||||
_login_submit_button_locator = (by.By.CLASS_NAME, "btn")
|
||||
|
||||
def __init__(self, driver):
|
||||
|
Loading…
x
Reference in New Issue
Block a user