Allow configuring tests for different themes
Allow configuring of locators/parts of the tests that are theme specific, using a config file. Change-Id: I7650ed4cff95674845c8613d424b76d296bf1a56
This commit is contained in:
parent
4d990a0d25
commit
a87ad750ea
@ -96,6 +96,9 @@ NetworkGroup = [
|
|||||||
# can be changed as per available external network.
|
# can be changed as per available external network.
|
||||||
default='public',
|
default='public',
|
||||||
help='The external network for a router creation.'),
|
help='The external network for a router creation.'),
|
||||||
|
cfg.StrOpt('subnet_name',
|
||||||
|
default='public-subnet',
|
||||||
|
help='Default public network subnet name'),
|
||||||
]
|
]
|
||||||
|
|
||||||
AvailableServiceGroup = [
|
AvailableServiceGroup = [
|
||||||
@ -189,6 +192,16 @@ PluginGroup = [
|
|||||||
help=('JSON string to define the page structure for the plugin')),
|
help=('JSON string to define the page structure for the plugin')),
|
||||||
]
|
]
|
||||||
|
|
||||||
|
ThemeGroup = [
|
||||||
|
cfg.StrOpt('project_name_xpath',
|
||||||
|
default='.//*[@class="context-project"]',
|
||||||
|
help='Default xpath for project name dropdown button'),
|
||||||
|
cfg.ListOpt('help_sequence',
|
||||||
|
default=['.//*[@class="dropdown user-menu"]',
|
||||||
|
'.//*[normalize-space()="Help"]'],
|
||||||
|
help='Default steps for redirect to help URL'),
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
def _get_config_files():
|
def _get_config_files():
|
||||||
conf_dir = os.path.join(
|
conf_dir = os.path.join(
|
||||||
@ -216,6 +229,7 @@ def get_config():
|
|||||||
cfg.CONF.register_opts(InstancesGroup, group="launch_instances")
|
cfg.CONF.register_opts(InstancesGroup, group="launch_instances")
|
||||||
cfg.CONF.register_opts(PluginGroup, group="plugin")
|
cfg.CONF.register_opts(PluginGroup, group="plugin")
|
||||||
cfg.CONF.register_opts(VolumeGroup, group="volume")
|
cfg.CONF.register_opts(VolumeGroup, group="volume")
|
||||||
|
cfg.CONF.register_opts(ThemeGroup, group="theme")
|
||||||
|
|
||||||
return cfg.CONF
|
return cfg.CONF
|
||||||
|
|
||||||
@ -233,4 +247,5 @@ def list_opts():
|
|||||||
("launch_instances", InstancesGroup),
|
("launch_instances", InstancesGroup),
|
||||||
("plugin", PluginGroup),
|
("plugin", PluginGroup),
|
||||||
("volume", VolumeGroup),
|
("volume", VolumeGroup),
|
||||||
|
("theme", ThemeGroup),
|
||||||
]
|
]
|
||||||
|
@ -87,6 +87,8 @@ network_cidr=10.100.0.0/16
|
|||||||
# Devstack default external network is 'public' but it can be changed
|
# Devstack default external network is 'public' but it can be changed
|
||||||
# as per available external network.
|
# as per available external network.
|
||||||
external_network=public
|
external_network=public
|
||||||
|
#public subnet name
|
||||||
|
subnet_name=public-subnet
|
||||||
|
|
||||||
[service_available]
|
[service_available]
|
||||||
# Whether is Neutron expected to be available (boolean value)
|
# Whether is Neutron expected to be available (boolean value)
|
||||||
@ -108,3 +110,11 @@ flavor=m1.tiny
|
|||||||
volume_type=lvmdriver-1
|
volume_type=lvmdriver-1
|
||||||
volume_size=1
|
volume_size=1
|
||||||
allow_delete_snapshot_before_volume=True
|
allow_delete_snapshot_before_volume=True
|
||||||
|
|
||||||
|
#configuration for different theme
|
||||||
|
[theme]
|
||||||
|
#xpath for project name (dropdown button)
|
||||||
|
project_name_xpath=//*[@class="context-project"]//ancestor::ul
|
||||||
|
|
||||||
|
#sequence for redirect to help URL
|
||||||
|
help_sequence=.//*[@class="dropdown user-menu"],.//*[normalize-space()="Help"]
|
||||||
|
@ -22,6 +22,7 @@ import xvfbwrapper
|
|||||||
|
|
||||||
from horizon.test import webdriver
|
from horizon.test import webdriver
|
||||||
from openstack_dashboard.test.integration_tests import config as horizon_config
|
from openstack_dashboard.test.integration_tests import config as horizon_config
|
||||||
|
from openstack_dashboard.test.selenium import widgets
|
||||||
|
|
||||||
|
|
||||||
STASH_FAILED = pytest.StashKey[bool]()
|
STASH_FAILED = pytest.StashKey[bool]()
|
||||||
@ -44,6 +45,7 @@ class Session:
|
|||||||
config.identity.admin_home_project,
|
config.identity.admin_home_project,
|
||||||
),
|
),
|
||||||
}
|
}
|
||||||
|
self.project_name_xpath = config.theme.project_name_xpath
|
||||||
self.logout_url = '/'.join((
|
self.logout_url = '/'.join((
|
||||||
config.dashboard.dashboard_url,
|
config.dashboard.dashboard_url,
|
||||||
'auth',
|
'auth',
|
||||||
@ -64,17 +66,17 @@ class Session:
|
|||||||
'.btn-primary')
|
'.btn-primary')
|
||||||
button.click()
|
button.click()
|
||||||
self.current_user = user
|
self.current_user = user
|
||||||
self.current_project = self.driver.find_element_by_class_name(
|
project_element = self.driver.find_element_by_xpath(
|
||||||
'context-project').text
|
self.project_name_xpath)
|
||||||
|
self.current_project = project_element.text
|
||||||
if self.current_project != project:
|
if self.current_project != project:
|
||||||
dropdown_project = self.driver.find_element_by_xpath(
|
project_element.click()
|
||||||
'//*[@class="context-project"]//ancestor::ul')
|
selection = project_element.find_element_by_xpath(
|
||||||
dropdown_project.click()
|
|
||||||
selection = dropdown_project.find_element_by_xpath(
|
|
||||||
f'.//*[normalize-space()="{project}"]')
|
f'.//*[normalize-space()="{project}"]')
|
||||||
selection.click()
|
selection.click()
|
||||||
self.current_project = self.driver.find_element_by_class_name(
|
widgets.get_and_dismiss_messages(self.driver)
|
||||||
'context-project').text
|
self.current_project = self.driver.find_element_by_xpath(
|
||||||
|
self.project_name_xpath).text
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(scope='session')
|
@pytest.fixture(scope='session')
|
||||||
|
@ -151,9 +151,11 @@ def new_default_test_subnet(new_default_test_network, openstack_admin):
|
|||||||
|
|
||||||
|
|
||||||
@pytest.fixture(scope='session')
|
@pytest.fixture(scope='session')
|
||||||
def new_default_test_router(openstack_admin):
|
def new_default_test_router(openstack_admin, config):
|
||||||
public_network = openstack_admin.network.find_network('public')
|
public_network = openstack_admin.network.find_network(
|
||||||
public_subnet = openstack_admin.network.find_subnet('public-subnet')
|
config.network.external_network)
|
||||||
|
public_subnet = openstack_admin.network.find_subnet(
|
||||||
|
config.network.subnet_name)
|
||||||
router = openstack_admin.network.post("/routers", json={
|
router = openstack_admin.network.post("/routers", json={
|
||||||
"router": {
|
"router": {
|
||||||
"name": "default_test_router",
|
"name": "default_test_router",
|
||||||
|
@ -79,8 +79,10 @@ def new_interface(new_router_demo, new_network_demo, new_subnet_demo,
|
|||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
def new_router_with_gateway(new_router_demo, openstack_demo, openstack_admin):
|
def new_router_with_gateway(new_router_demo, openstack_demo, openstack_admin,
|
||||||
network_id = openstack_admin.network.find_network('public').id
|
config):
|
||||||
|
network_id = openstack_admin.network.find_network(
|
||||||
|
config.network.external_network).id
|
||||||
|
|
||||||
openstack_demo.network.put(
|
openstack_demo.network.put(
|
||||||
f"/routers/{new_router_demo.id}",
|
f"/routers/{new_router_demo.id}",
|
||||||
@ -103,7 +105,8 @@ def test_create_router_demo(login, driver, router_name, openstack_demo,
|
|||||||
driver.find_element_by_link_text("Create Router").click()
|
driver.find_element_by_link_text("Create Router").click()
|
||||||
router_form = driver.find_element_by_css_selector(".modal-dialog form")
|
router_form = driver.find_element_by_css_selector(".modal-dialog form")
|
||||||
router_form.find_element_by_id("id_name").send_keys(router_name)
|
router_form.find_element_by_id("id_name").send_keys(router_name)
|
||||||
widgets.select_from_dropdown(router_form, "public")
|
widgets.select_from_dropdown(router_form,
|
||||||
|
config.network.external_network)
|
||||||
router_form.find_element_by_css_selector(
|
router_form.find_element_by_css_selector(
|
||||||
".btn-primary[value='Create Router']").click()
|
".btn-primary[value='Create Router']").click()
|
||||||
messages = widgets.get_and_dismiss_messages(driver)
|
messages = widgets.get_and_dismiss_messages(driver)
|
||||||
@ -224,7 +227,7 @@ def test_router_set_gateway_demo(login, driver, new_router_demo,
|
|||||||
rows[0].find_element_by_css_selector(".data-table-action").click()
|
rows[0].find_element_by_css_selector(".data-table-action").click()
|
||||||
gateway_form = driver.find_element_by_css_selector(".modal-dialog form")
|
gateway_form = driver.find_element_by_css_selector(".modal-dialog form")
|
||||||
widgets.select_from_specific_dropdown_in_form(
|
widgets.select_from_specific_dropdown_in_form(
|
||||||
gateway_form, 'id_network_id', 'public')
|
gateway_form, 'id_network_id', config.network.external_network)
|
||||||
gateway_form.find_element_by_css_selector(".btn-primary").click()
|
gateway_form.find_element_by_css_selector(".btn-primary").click()
|
||||||
messages = widgets.get_and_dismiss_messages(driver)
|
messages = widgets.get_and_dismiss_messages(driver)
|
||||||
assert f"Success: Gateway interface is added" in messages
|
assert f"Success: Gateway interface is added" in messages
|
||||||
@ -233,7 +236,8 @@ def test_router_set_gateway_demo(login, driver, new_router_demo,
|
|||||||
f"?fields=id&fields=name&fields="
|
f"?fields=id&fields=name&fields="
|
||||||
f"external_gateway_info").json()['router']
|
f"external_gateway_info").json()['router']
|
||||||
assert(router_sdk["external_gateway_info"]["network_id"] ==
|
assert(router_sdk["external_gateway_info"]["network_id"] ==
|
||||||
openstack_demo.network.find_network('public').id)
|
openstack_demo.network.find_network(
|
||||||
|
config.network.external_network).id)
|
||||||
|
|
||||||
|
|
||||||
def test_router_clear_gateway_demo(login, driver, new_router_with_gateway,
|
def test_router_clear_gateway_demo(login, driver, new_router_with_gateway,
|
||||||
@ -254,7 +258,8 @@ def test_router_clear_gateway_demo(login, driver, new_router_with_gateway,
|
|||||||
f"?fields=id&fields=name&fields="
|
f"?fields=id&fields=name&fields="
|
||||||
f"external_gateway_info").json()['router']
|
f"external_gateway_info").json()['router']
|
||||||
assert(router_sdk["external_gateway_info"]["network_id"] ==
|
assert(router_sdk["external_gateway_info"]["network_id"] ==
|
||||||
openstack_demo.network.find_network('public').id)
|
openstack_demo.network.find_network(
|
||||||
|
config.network.external_network).id)
|
||||||
rows[0].find_element_by_css_selector(".data-table-action").click()
|
rows[0].find_element_by_css_selector(".data-table-action").click()
|
||||||
widgets.confirm_modal(driver)
|
widgets.confirm_modal(driver)
|
||||||
messages = widgets.get_and_dismiss_messages(driver)
|
messages = widgets.get_and_dismiss_messages(driver)
|
||||||
@ -282,7 +287,7 @@ def test_create_router_admin(login, driver, router_name, openstack_admin,
|
|||||||
widgets.select_from_specific_dropdown_in_form(
|
widgets.select_from_specific_dropdown_in_form(
|
||||||
router_form, "id_tenant_id", "admin")
|
router_form, "id_tenant_id", "admin")
|
||||||
widgets.select_from_specific_dropdown_in_form(
|
widgets.select_from_specific_dropdown_in_form(
|
||||||
router_form, "id_external_network", "public")
|
router_form, "id_external_network", config.network.external_network)
|
||||||
router_form.find_element_by_css_selector(
|
router_form.find_element_by_css_selector(
|
||||||
".btn-primary[value='Create Router']").click()
|
".btn-primary[value='Create Router']").click()
|
||||||
messages = widgets.get_and_dismiss_messages(driver)
|
messages = widgets.get_and_dismiss_messages(driver)
|
||||||
|
@ -14,8 +14,6 @@ from selenium.webdriver.common.by import By
|
|||||||
from selenium.webdriver.support import expected_conditions as EC
|
from selenium.webdriver.support import expected_conditions as EC
|
||||||
from selenium.webdriver.support.wait import WebDriverWait
|
from selenium.webdriver.support.wait import WebDriverWait
|
||||||
|
|
||||||
from openstack_dashboard.test.selenium import widgets
|
|
||||||
|
|
||||||
|
|
||||||
def test_dashboard_help_redirection(login, driver, config):
|
def test_dashboard_help_redirection(login, driver, config):
|
||||||
login('user')
|
login('user')
|
||||||
@ -24,9 +22,8 @@ def test_dashboard_help_redirection(login, driver, config):
|
|||||||
'settings',
|
'settings',
|
||||||
))
|
))
|
||||||
driver.get(url)
|
driver.get(url)
|
||||||
user_dropdown_menu = driver.find_element_by_css_selector(
|
for step in config.theme.help_sequence:
|
||||||
'.nav.navbar-nav.navbar-right')
|
driver.find_element_by_xpath(step).click()
|
||||||
widgets.select_from_dropdown(user_dropdown_menu, "Help")
|
|
||||||
available_windows = driver.window_handles
|
available_windows = driver.window_handles
|
||||||
assert len(available_windows) == 2
|
assert len(available_windows) == 2
|
||||||
driver.switch_to.window(available_windows[-1])
|
driver.switch_to.window(available_windows[-1])
|
||||||
|
Loading…
Reference in New Issue
Block a user