From efdf40fb462c1df937cbd14e60a31cb40aa30955 Mon Sep 17 00:00:00 2001 From: Jan Jasek Date: Wed, 30 Jul 2025 11:54:06 +0200 Subject: [PATCH] pytest-based tests individual timeout for message check Until now we have used implicit timeout for message checking. It is enough for the majority of the cases. But in cases of overloaded deployment and more consuming actions (like manage volume attachments) this timeout is enough for all the actions except for messages so individual message timeout (adjustable through horizon.conf) seems to be the best solution. Change-Id: I6e43cdfa9fc02c1346b5a8228caacaf154e20ba3 Signed-off-by: Jan Jasek --- .../test/integration_tests/config.py | 6 ++--- .../test/integration_tests/horizon.conf | 4 ++-- openstack_dashboard/test/selenium/conftest.py | 3 ++- .../selenium/integration/test_defaults.py | 4 ++-- .../test/selenium/integration/test_flavors.py | 4 ++-- .../selenium/integration/test_floatingips.py | 8 +++---- .../test/selenium/integration/test_groups.py | 6 ++--- .../selenium/integration/test_grouptypes.py | 4 ++-- .../integration/test_host_aggregates.py | 4 ++-- .../test/selenium/integration/test_images.py | 20 ++++++++-------- .../selenium/integration/test_instances.py | 4 ++-- .../selenium/integration/test_keypairs.py | 4 ++-- .../integration/test_metadata_definitions.py | 4 ++-- .../selenium/integration/test_networks.py | 12 +++++----- .../selenium/integration/test_projects.py | 12 +++++----- .../test/selenium/integration/test_routers.py | 16 ++++++------- .../integration/test_security_groups.py | 8 +++---- .../integration/test_user_credentials.py | 8 +++---- .../test/selenium/integration/test_users.py | 6 ++--- .../integration/test_volume_snapshots.py | 20 ++++++++-------- .../test/selenium/integration/test_volumes.py | 24 +++++++++---------- .../selenium/integration/test_volumetypes.py | 18 +++++++------- .../test/selenium/ui/test_actions.py | 8 +++---- .../test/selenium/ui/test_settings.py | 4 ++-- openstack_dashboard/test/selenium/widgets.py | 6 +++-- 25 files changed, 110 insertions(+), 107 deletions(-) diff --git a/openstack_dashboard/test/integration_tests/config.py b/openstack_dashboard/test/integration_tests/config.py index 962d29b3bd..97f31d5a12 100644 --- a/openstack_dashboard/test/integration_tests/config.py +++ b/openstack_dashboard/test/integration_tests/config.py @@ -108,9 +108,9 @@ AvailableServiceGroup = [ ] SeleniumGroup = [ - cfg.FloatOpt( - 'message_implicit_wait', - default=0.1, + cfg.IntOpt( + 'message_wait', + default=60, help='Timeout in seconds to wait for message confirmation modal'), cfg.IntOpt( 'implicit_wait', diff --git a/openstack_dashboard/test/integration_tests/horizon.conf b/openstack_dashboard/test/integration_tests/horizon.conf index e9ba006716..66be6c1f0b 100644 --- a/openstack_dashboard/test/integration_tests/horizon.conf +++ b/openstack_dashboard/test/integration_tests/horizon.conf @@ -14,8 +14,8 @@ help_url=https://docs.openstack.org/ [selenium] # Timeout in seconds to wait for message confirmation modal -# (float value) -message_implicit_wait=3 +# (integer value) +message_wait=60 # Timeout in seconds to wait for a page to become available # (integer value) diff --git a/openstack_dashboard/test/selenium/conftest.py b/openstack_dashboard/test/selenium/conftest.py index d7579cd120..3af49bf0d4 100644 --- a/openstack_dashboard/test/selenium/conftest.py +++ b/openstack_dashboard/test/selenium/conftest.py @@ -34,6 +34,7 @@ class Session: self.current_user = None self.current_project = None self.driver = driver + self.config = config self.credentials = { 'user': ( config.identity.username, @@ -82,7 +83,7 @@ class Session: selection = project_element.find_element_by_xpath( f'.//*[normalize-space()="{project}"]') selection.click() - widgets.get_and_dismiss_messages(self.driver) + widgets.get_and_dismiss_messages(self.driver, self.config) self.current_project = self.driver.find_element_by_xpath( self.project_name_xpath).text diff --git a/openstack_dashboard/test/selenium/integration/test_defaults.py b/openstack_dashboard/test/selenium/integration/test_defaults.py index 4290ac65db..f25067d81f 100644 --- a/openstack_dashboard/test/selenium/integration/test_defaults.py +++ b/openstack_dashboard/test/selenium/integration/test_defaults.py @@ -64,7 +64,7 @@ def test_update_compute_defaults(login, driver, openstack_admin, config, defaults_form.find_element_by_id("id_cores").clear() defaults_form.find_element_by_id("id_cores").send_keys(number_of_cores) defaults_form.find_element_by_css_selector(".btn-primary").click() - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert 'Success: Default quotas updated.' in messages new_quotas = openstack_admin.compute.get( "/os-quota-class-sets/default").json() @@ -93,7 +93,7 @@ def test_update_volume_defaults(login, driver, openstack_admin, config, defaults_form.find_element_by_id("id_snapshots").send_keys( number_of_snapshots) defaults_form.find_element_by_css_selector(".btn-primary").click() - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert 'Success: Default quotas updated.' in messages new_quotas = openstack_admin.block_storage.get( "/os-quota-class-sets/default").json() diff --git a/openstack_dashboard/test/selenium/integration/test_flavors.py b/openstack_dashboard/test/selenium/integration/test_flavors.py index 2770372589..55349b79f3 100644 --- a/openstack_dashboard/test/selenium/integration/test_flavors.py +++ b/openstack_dashboard/test/selenium/integration/test_flavors.py @@ -60,7 +60,7 @@ def test_create_flavor(login, driver, flavor_name, openstack_admin, flavors_form.find_element_by_id("id_disk_gb").send_keys(flavor_disk) flavors_form.find_element_by_css_selector( ".btn-primary[value='Create Flavor']").click() - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert f'Success: Created new flavor "{flavor_name}".' in messages flavor_sdk = openstack_admin.compute.find_flavor(flavor_name) assert flavor_sdk is not None @@ -84,6 +84,6 @@ def test_delete_flavor(login, driver, flavor_name, new_flavor, config, actions_column = rows[0].find_element_by_css_selector("td.actions_column") widgets.select_from_dropdown(actions_column, "Delete Flavor") widgets.confirm_modal(driver) - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert f"Success: Deleted Flavor: {flavor_name}" in messages assert openstack_admin.compute.find_flavor(flavor_name) is None diff --git a/openstack_dashboard/test/selenium/integration/test_floatingips.py b/openstack_dashboard/test/selenium/integration/test_floatingips.py index 8edfeb738b..ce0b5d35f9 100644 --- a/openstack_dashboard/test/selenium/integration/test_floatingips.py +++ b/openstack_dashboard/test/selenium/integration/test_floatingips.py @@ -70,7 +70,7 @@ def test_allocate_floatingip(login, driver, config, openstack_demo, floatingip_form.find_element_by_id("id_description").send_keys( floatingip_description) floatingip_form.find_element_by_css_selector(".btn-primary").click() - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) if len(messages) > 1: message = [msg for msg in messages if "Success: Allocated Floating IP" in msg][0] @@ -99,7 +99,7 @@ def test_release_floatingip(login, driver, openstack_demo, config, actions_column = rows[0].find_element_by_css_selector("td.actions_column") widgets.select_from_dropdown(actions_column, "Release Floating IP") widgets.confirm_modal(driver) - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert (f"Success: Released Floating IP: " f"{new_floating_ip.floating_ip_address}" in messages) assert openstack_demo.network.find_ip( @@ -128,7 +128,7 @@ def test_associate_floatingip(login, driver, openstack_demo, new_floating_ip, associateip_form, "id_port_id", f"{instance_name}: {new_instance_demo.private_v4}") associateip_form.find_element_by_css_selector(".btn-primary").click() - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert (f"Success: IP address {new_floating_ip.floating_ip_address}" f" associated." in messages) assert (new_instance_demo.id == openstack_demo.network.find_ip( @@ -156,7 +156,7 @@ def test_disassociate_floatingip(login, driver, openstack_demo, config, assert len(rows) == 1 rows[0].find_element_by_css_selector(".data-table-action").click() widgets.confirm_modal(driver) - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert (f"Success: Successfully disassociated Floating IP: " f"{instance_auto_ip}" in messages) instance_sdk = openstack_demo.compute.find_server(new_instance_demo.id) diff --git a/openstack_dashboard/test/selenium/integration/test_groups.py b/openstack_dashboard/test/selenium/integration/test_groups.py index a4dec820a6..b9b75a9c80 100644 --- a/openstack_dashboard/test/selenium/integration/test_groups.py +++ b/openstack_dashboard/test/selenium/integration/test_groups.py @@ -51,7 +51,7 @@ def test_create_group(login, driver, group_name, openstack_admin, config, group_form = driver.find_element_by_css_selector(".modal-dialog form") group_form.find_element_by_id("id_name").send_keys(group_name) group_form.find_element_by_css_selector(".btn-primary").click() - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert (f'Success: Group "{group_name}" was successfully created.' in messages) assert openstack_admin.identity.find_group(group_name) is not None @@ -72,7 +72,7 @@ def test_delete_group(login, driver, group_name, openstack_admin, config, actions_column = rows[0].find_element_by_css_selector("td.actions_column") widgets.select_from_dropdown(actions_column, "Delete Group") widgets.confirm_modal(driver) - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert f"Success: Deleted Group: {group_name}" in messages assert openstack_admin.identity.find_group(group_name) is None @@ -98,7 +98,7 @@ def test_edit_group_name_and_description(login, driver, group_name, group_form.find_element_by_id("id_description").send_keys( f"EDITED_Description for: {group_name}") group_form.find_element_by_css_selector(".btn-primary").click() - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert "Success: Group has been updated successfully." in messages assert (openstack_admin.identity.find_group( f"EDITED_{group_name}") is not None) diff --git a/openstack_dashboard/test/selenium/integration/test_grouptypes.py b/openstack_dashboard/test/selenium/integration/test_grouptypes.py index 24491fa504..c3df561d02 100644 --- a/openstack_dashboard/test/selenium/integration/test_grouptypes.py +++ b/openstack_dashboard/test/selenium/integration/test_grouptypes.py @@ -51,7 +51,7 @@ def test_create_grouptype(login, driver, grouptype_name, openstack_admin, grouptype_form = driver.find_element_by_css_selector(".modal-content form") grouptype_form.find_element_by_id("id_name").send_keys(grouptype_name) grouptype_form.find_element_by_css_selector(".btn-primary").click() - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert (f'Success: Successfully created group type: {grouptype_name}' in messages) assert (openstack_admin.block_storage.find_group_type(grouptype_name) @@ -73,6 +73,6 @@ def test_delete_grouptype(login, driver, grouptype_name, openstack_admin, actions_column = rows[0].find_element_by_css_selector("td.actions_column") widgets.select_from_dropdown(actions_column, "Delete Group Type") widgets.confirm_modal(driver) - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert f"Success: Deleted Group Type: {grouptype_name}" in messages assert openstack_admin.block_storage.find_group_type(grouptype_name) is None diff --git a/openstack_dashboard/test/selenium/integration/test_host_aggregates.py b/openstack_dashboard/test/selenium/integration/test_host_aggregates.py index c8d526639b..e36e99df9b 100644 --- a/openstack_dashboard/test/selenium/integration/test_host_aggregates.py +++ b/openstack_dashboard/test/selenium/integration/test_host_aggregates.py @@ -65,7 +65,7 @@ def test_create_host_aggregate(login, driver, openstack_admin, config, host_aggregate_name) host_aggregate_form.find_element_by_css_selector( ".btn-primary[value='Create Host Aggregate']").click() - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert (f'Success: Created new host aggregate "{host_aggregate_name}".' in messages) is_host_aggregate_created_sdk = False @@ -93,7 +93,7 @@ def test_delete_host_aggregate(login, driver, openstack_admin, config, actions_column = rows[0].find_element_by_css_selector("td.actions_column") widgets.select_from_dropdown(actions_column, "Delete Host Aggregate") widgets.confirm_modal(driver) - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert (f"Success: Deleted Host Aggregate: " f"{new_host_aggregate['aggregate']['name']}" in messages) is_host_aggregate_deleted_sdk = True diff --git a/openstack_dashboard/test/selenium/integration/test_images.py b/openstack_dashboard/test/selenium/integration/test_images.py index a2f16c0bd0..f3dc32d08b 100644 --- a/openstack_dashboard/test/selenium/integration/test_images.py +++ b/openstack_dashboard/test/selenium/integration/test_images.py @@ -163,7 +163,7 @@ def test_image_create_from_local_file_demo(login, driver, image_names, wizard.find_element_by_css_selector( "[label='QCOW2 - QEMU Emulator']").click() wizard.find_element_by_css_selector("button.btn-primary.finish").click() - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert (f"Success: Image {image_name} was successfully" f" created." in messages) assert openstack_demo.compute.find_image(image_name) is not None @@ -185,7 +185,7 @@ def test_image_delete_demo(login, driver, image_names, openstack_demo, ".//ancestor::tr/td[contains(@class,'actions_column')]") widgets.select_from_dropdown(actions_column, "Delete Image") widgets.confirm_modal(driver) - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert f"Success: Deleted Image: {image_name}." in messages assert openstack_demo.compute.find_image(image_name) is None @@ -262,7 +262,7 @@ def test_image_create_from_local_file_admin(login, driver, image_names, wizard.find_element_by_css_selector( "[label='QCOW2 - QEMU Emulator']").click() wizard.find_element_by_css_selector("button.btn-primary.finish").click() - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert (f"Success: Image {image_name} was successfully" f" created." in messages) assert openstack_admin.compute.find_image(image_name) is not None @@ -284,7 +284,7 @@ def test_image_delete_admin(login, driver, image_names, openstack_admin, ".//ancestor::tr/td[contains(@class,'actions_column')]") widgets.select_from_dropdown(actions_column, "Delete Image") widgets.confirm_modal(driver) - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert f"Success: Deleted Image: {image_name}." in messages assert openstack_admin.compute.find_image(image_name) is None @@ -393,7 +393,7 @@ def test_remove_protected_image_admin(login, driver, image_names, image_form.find_element_by_xpath(".//label[text()='No']").click() image_form.find_element_by_xpath( ".//button[@class='btn btn-primary finish']").click() - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert f"Success: Image {image_name} was successfully updated." in messages wait_for_steady_state_of_unprotected_image(openstack_admin, image_name) WebDriverWait(driver, config.selenium.page_timeout).until( @@ -405,7 +405,7 @@ def test_remove_protected_image_admin(login, driver, image_names, ".//ancestor::tr/td[contains(@class,'actions_column')]") widgets.select_from_dropdown(actions_column, "Delete Image") widgets.confirm_modal(driver) - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert f"Success: Deleted Image: {image_name}." in messages assert openstack_admin.compute.find_image(image_name) is None @@ -436,7 +436,7 @@ def test_edit_image_description_admin(login, driver, image_names, desc_field.send_keys(new_description) image_form.find_element_by_xpath( ".//button[@class='btn btn-primary finish']").click() - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert f"Success: Image {image_name} " \ f"was successfully updated." in messages image_id = new_image_admin.id @@ -474,7 +474,7 @@ def test_update_image_metadata_admin(login, driver, f"//span[@title='{name}']/parent::div/input").send_keys(value) # noqa: E231,E501 image_form.find_element_by_xpath( "//button[@ng-click='modal.save()']").click() - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert "Success: Metadata was successfully updated." in messages image_id = new_image_admin.id for name, value in new_metadata.items(): @@ -521,7 +521,7 @@ def test_launch_instance_from_image_admin(complete_default_test_network, login, test_instances.delete_volume_on_instance_delete(source_table, "Yes") wizard.find_element_by_css_selector( "button.btn-primary.finish").click() - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert "Info: Scheduled creation of 1 instance." in messages assert openstack_admin.compute.find_server(instance_name) is not None @@ -550,6 +550,6 @@ def test_create_volume_from_image_admin(login, driver, volume_name, EC.element_to_be_clickable( (By.XPATH, "//button[@class='btn btn-primary finish']"))) create_vol_btn.click() - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert f"Info: Creating volume {volume_name}" in messages assert openstack_admin.block_storage.find_volume(volume_name) is not None diff --git a/openstack_dashboard/test/selenium/integration/test_instances.py b/openstack_dashboard/test/selenium/integration/test_instances.py index 462b6c8fde..414856b120 100644 --- a/openstack_dashboard/test/selenium/integration/test_instances.py +++ b/openstack_dashboard/test/selenium/integration/test_instances.py @@ -246,7 +246,7 @@ def test_delete_instance_demo(login, driver, instance_name, openstack_demo, actions_column = rows[0].find_element_by_css_selector("td.actions_column") widgets.select_from_dropdown(actions_column, "Delete Instance") widgets.confirm_modal(driver) - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert f"Info: Scheduled deletion of Instance: {instance_name}" in messages wait_for_instance_is_deleted(openstack_demo, instance_name) assert openstack_demo.compute.find_server(instance_name) is None @@ -496,7 +496,7 @@ def test_delete_instance_admin(login, driver, instance_name, openstack_admin, actions_column = rows[0].find_element_by_css_selector("td.actions_column") widgets.select_from_dropdown(actions_column, "Delete Instance") widgets.confirm_modal(driver) - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert f"Info: Scheduled deletion of Instance: {instance_name}" in messages wait_for_instance_is_deleted(openstack_admin, instance_name) assert openstack_admin.compute.find_server(instance_name) is None diff --git a/openstack_dashboard/test/selenium/integration/test_keypairs.py b/openstack_dashboard/test/selenium/integration/test_keypairs.py index d2b9606f03..1f12c214b6 100644 --- a/openstack_dashboard/test/selenium/integration/test_keypairs.py +++ b/openstack_dashboard/test/selenium/integration/test_keypairs.py @@ -57,7 +57,7 @@ def test_create_keypair_demo(login, driver, openstack_demo, clear_keypair_demo, type_options.click() type_options.find_element_by_css_selector('option[label="SSH Key"]').click() keypair_form.find_element_by_css_selector(".btn-primary").click() - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert (f'Success: Key pair {keypair_name} was successfully created.' in messages) assert openstack_demo.compute.find_keypair(keypair_name) is not None @@ -78,6 +78,6 @@ def test_delete_keypair_demo(login, driver, openstack_demo, config, rows[0].find_element_by_xpath( ".//ancestor::tr/td[contains(@class,'actions_column')]").click() widgets.confirm_modal(driver) - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert f"Success: Deleted Key Pair: {new_keypair_demo.name}." in messages assert openstack_demo.compute.find_keypair(new_keypair_demo.name) is None diff --git a/openstack_dashboard/test/selenium/integration/test_metadata_definitions.py b/openstack_dashboard/test/selenium/integration/test_metadata_definitions.py index 907ce6803a..60b8e552c6 100644 --- a/openstack_dashboard/test/selenium/integration/test_metadata_definitions.py +++ b/openstack_dashboard/test/selenium/integration/test_metadata_definitions.py @@ -77,7 +77,7 @@ def test_create_metadata_namespace(login, driver, metadata_namespace_name, widgets.select_from_dropdown(namespace_form, "Direct Input") namespace_form.find_element_by_id("id_direct_input").send_keys(namespace) namespace_form.find_element_by_css_selector(".btn-primary").click() - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert (f"Success: Namespace {metadata_namespace_name} " f"has been created." in messages) try: @@ -104,7 +104,7 @@ def test_delete_metadata_namespace(login, driver, new_metadata_namespace, actions_column = rows[0].find_element_by_css_selector("td.actions_column") widgets.select_from_dropdown(actions_column, "Delete Namespace") widgets.confirm_modal(driver) - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert (f"Success: Deleted Namespace: " f"{new_metadata_namespace.namespace}" in messages) try: diff --git a/openstack_dashboard/test/selenium/integration/test_networks.py b/openstack_dashboard/test/selenium/integration/test_networks.py index 4f89746df8..7df9e3280f 100644 --- a/openstack_dashboard/test/selenium/integration/test_networks.py +++ b/openstack_dashboard/test/selenium/integration/test_networks.py @@ -97,7 +97,7 @@ def test_create_network_without_subnet_demo(login, openstack_demo, driver, ensure_checkbox(False, checkbox_element) network_form.find_element_by_css_selector( ".btn-primary.button-final").click() - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert f'Success: Created network "{network_name}".' in messages assert openstack_demo.network.find_network(network_name) is not None @@ -124,7 +124,7 @@ def test_create_network_with_subnet_demo(login, driver, openstack_demo, ".btn-primary.button-next").click() network_form.find_element_by_css_selector( ".btn-primary.button-final").click() - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert f'Success: Created network "{network_name}".' in messages specified_network_sdk = openstack_demo.network.find_network(network_name) assert specified_network_sdk is not None @@ -147,7 +147,7 @@ def test_delete_network_demo(login, driver, network_name, openstack_demo, actions_column = rows[0].find_element_by_css_selector("td.actions_column") widgets.select_from_dropdown(actions_column, "Delete Network") widgets.confirm_modal(driver) - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert f"Success: Deleted Network: {network_name}" in messages assert openstack_demo.network.find_network(network_name) is None @@ -171,7 +171,7 @@ def test_create_network_without_subnet_admin(login, openstack_admin, driver, network_form, 'id_tenant_id', 'admin') network_form.find_element_by_css_selector( ".btn-primary.button-final").click() - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert f'Success: Created network "{network_name}".' in messages assert openstack_admin.network.find_network(network_name) is not None @@ -200,7 +200,7 @@ def test_create_network_with_subnet_admin(login, driver, openstack_admin, ".btn-primary.button-next").click() network_form.find_element_by_css_selector( ".btn-primary.button-final").click() - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert f'Success: Created network "{network_name}".' in messages specified_network_sdk = openstack_admin.network.find_network(network_name) assert specified_network_sdk is not None @@ -223,6 +223,6 @@ def test_delete_network_admin(login, driver, network_name, openstack_admin, actions_column = rows[0].find_element_by_css_selector("td.actions_column") widgets.select_from_dropdown(actions_column, "Delete Network") widgets.confirm_modal(driver) - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert f"Success: Deleted Network: {network_name}" in messages assert openstack_admin.network.find_network(network_name) is None diff --git a/openstack_dashboard/test/selenium/integration/test_projects.py b/openstack_dashboard/test/selenium/integration/test_projects.py index ff62cb4dd6..01895ab101 100644 --- a/openstack_dashboard/test/selenium/integration/test_projects.py +++ b/openstack_dashboard/test/selenium/integration/test_projects.py @@ -79,7 +79,7 @@ def test_create_project(login, driver, project_name, openstack_admin, project_form.find_element_by_id("id_name").send_keys(project_name) project_form.find_element_by_css_selector( ".btn-primary[value='Create Project']").click() - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert f'Success: Created new project "{project_name}".' in messages assert openstack_admin.identity.find_project(project_name) is not None @@ -98,7 +98,7 @@ def test_delete_project(login, driver, project_name, openstack_admin, actions_column = rows[0].find_element_by_css_selector("td.actions_column") widgets.select_from_dropdown(actions_column, "Delete Project") widgets.confirm_modal(driver) - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert f"Success: Deleted Project: {project_name}" in messages assert openstack_admin.identity.find_project(project_name) is None @@ -124,7 +124,7 @@ def test_add_member_to_project(login, driver, project_name, openstack_admin, f"/following-sibling::li/a[@href='#add_remove']").click() # noqa: E231 project_form.find_element_by_css_selector( ".btn-primary[value='Save']").click() - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert f'Success: Modified project "{project_name}".' in messages assert (openstack_admin.identity.validate_user_has_project_role( project=new_project, @@ -156,7 +156,7 @@ def test_add_role_to_project_member(login, driver, openstack_admin, config, widgets.select_from_dropdown(select_roles_dropdown, admin_role_name) project_form.find_element_by_css_selector( ".btn-primary[value='Save']").click() - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert (f'Success: Modified project ' f'"{new_project_with_admin.name}".' in messages) assert (openstack_admin.identity.validate_user_has_project_role( @@ -192,7 +192,7 @@ def test_add_group_to_project(login, driver, openstack_admin, f"/following-sibling::li/a[@href='#add_remove']").click() # noqa: E231 project_form.find_element_by_css_selector( ".btn-primary[value='Save']").click() - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert f'Success: Modified project "{new_project.name}".' in messages assert (openstack_admin.identity.validate_group_has_project_role( project=new_project, @@ -225,7 +225,7 @@ def test_add_role_to_project_group(login, driver, openstack_admin, config, widgets.select_from_dropdown(select_roles_dropdown, admin_role_name) project_form.find_element_by_css_selector( ".btn-primary[value='Save']").click() - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert (f'Success: Modified project ' f'"{new_project_with_group.name}".' in messages) assert (openstack_admin.identity.validate_group_has_project_role( diff --git a/openstack_dashboard/test/selenium/integration/test_routers.py b/openstack_dashboard/test/selenium/integration/test_routers.py index 338924dcf7..c565cb2427 100644 --- a/openstack_dashboard/test/selenium/integration/test_routers.py +++ b/openstack_dashboard/test/selenium/integration/test_routers.py @@ -109,7 +109,7 @@ def test_create_router_demo(login, driver, router_name, openstack_demo, config.network.external_network) router_form.find_element_by_css_selector( ".btn-primary[value='Create Router']").click() - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert (f'Success: Router {router_name} was successfully created.' in messages) assert openstack_demo.network.find_router(router_name) is not None @@ -131,7 +131,7 @@ def test_delete_router_demo(login, driver, router_name, openstack_demo, actions_column = rows[0].find_element_by_css_selector("td.actions_column") widgets.select_from_dropdown(actions_column, "Delete Router") widgets.confirm_modal(driver) - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert f"Success: Deleted Router: {router_name}" in messages assert openstack_demo.network.find_router(router_name) is None @@ -164,7 +164,7 @@ def test_router_add_interface_demo(login, driver, router_name, openstack_demo, add_interface_form.find_element_by_id( "id_ip_address").send_keys(fixed_ip_test) add_interface_form.find_element_by_css_selector(".btn-primary").click() - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert f"Success: Interface added {fixed_ip_test}" in messages is_interface_added_sdk = False @@ -200,7 +200,7 @@ def test_router_delete_interface_demo(login, driver, router_name, assert len(rows) == 1 rows[0].find_element_by_css_selector("td.actions_column").click() widgets.confirm_modal(driver) - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert f"Success: Deleted Interface: {extracted_port_name}" in messages assert (openstack_demo.network.find_port( new_interface['port_id']) is None) @@ -229,7 +229,7 @@ def test_router_set_gateway_demo(login, driver, new_router_demo, widgets.select_from_specific_dropdown_in_form( gateway_form, 'id_network_id', config.network.external_network) gateway_form.find_element_by_css_selector(".btn-primary").click() - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert "Success: Gateway interface is added" in messages router_sdk = openstack_demo.network.get( f"/routers/{new_router_demo.id}" @@ -262,7 +262,7 @@ def test_router_clear_gateway_demo(login, driver, new_router_with_gateway, config.network.external_network).id) rows[0].find_element_by_css_selector(".data-table-action").click() widgets.confirm_modal(driver) - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert (f"Success: Cleared Gateway: {new_router_with_gateway.name}" in messages) router_sdk = openstack_demo.network.get( @@ -290,7 +290,7 @@ def test_create_router_admin(login, driver, router_name, openstack_admin, router_form, "id_external_network", config.network.external_network) router_form.find_element_by_css_selector( ".btn-primary[value='Create Router']").click() - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert (f'Success: Router {router_name} was successfully created.' in messages) assert openstack_admin.network.find_router(router_name) is not None @@ -312,6 +312,6 @@ def test_delete_router_admin(login, driver, router_name, openstack_admin, actions_column = rows[0].find_element_by_css_selector("td.actions_column") widgets.select_from_dropdown(actions_column, "Delete Router") widgets.confirm_modal(driver) - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert f"Success: Deleted Router: {router_name}" in messages assert openstack_admin.network.find_router(router_name) is None diff --git a/openstack_dashboard/test/selenium/integration/test_security_groups.py b/openstack_dashboard/test/selenium/integration/test_security_groups.py index ea9a470e8b..734ec47655 100644 --- a/openstack_dashboard/test/selenium/integration/test_security_groups.py +++ b/openstack_dashboard/test/selenium/integration/test_security_groups.py @@ -66,7 +66,7 @@ def test_create_sec_group_demo(login, driver, config, sec_group_name, sec_group_form = driver.find_element_by_css_selector(".modal-dialog form") sec_group_form.find_element_by_id("id_name").send_keys(sec_group_name) sec_group_form.find_element_by_css_selector(".btn-primary").click() - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert (f'Success: Successfully created security group: {sec_group_name}' in messages) assert (openstack_demo.network.find_security_group(sec_group_name) @@ -88,7 +88,7 @@ def test_delete_sec_group_demo(login, driver, sec_group_name, openstack_demo, actions_column = rows[0].find_element_by_css_selector("td.actions_column") widgets.select_from_dropdown(actions_column, "Delete Security Group") widgets.confirm_modal(driver) - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert f"Success: Deleted Security Group: {sec_group_name}" in messages assert openstack_demo.network.find_security_group(sec_group_name) is None @@ -108,7 +108,7 @@ def test_add_rule_sec_group_demo(login, driver, sec_group_name, openstack_demo, rule_form = driver.find_element_by_css_selector(".modal-dialog form") rule_form.find_element_by_id("id_port").send_keys(rule_port) rule_form.find_element_by_css_selector(".btn-primary").click() - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert (f"Success: Successfully added rule: ALLOW IPv4 {rule_port}" f"/tcp from 0.0.0.0/0" in messages) sec_group_rules_sdk = openstack_demo.network.find_security_group( @@ -138,7 +138,7 @@ def test_delete_rule_sec_group_demo(login, driver, sec_group_name, assert len(rows) == 1 rows[0].find_element_by_css_selector("td.actions_column").click() widgets.confirm_modal(driver) - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert (f"Success: Deleted Rule: ALLOW IPv4 {rule_port}/tcp from 0.0.0.0/0" in messages) sec_group_rules_sdk = openstack_demo.network.find_security_group( diff --git a/openstack_dashboard/test/selenium/integration/test_user_credentials.py b/openstack_dashboard/test/selenium/integration/test_user_credentials.py index 608b576d9e..6370f345b8 100644 --- a/openstack_dashboard/test/selenium/integration/test_user_credentials.py +++ b/openstack_dashboard/test/selenium/integration/test_user_credentials.py @@ -58,7 +58,7 @@ def test_create_user_credential_totp(login, driver, openstack_admin, config, widgets.select_from_specific_dropdown_in_form( user_credential_form, 'id_cred_type', 'TOTP') user_credential_form.find_element_by_css_selector(".btn-primary").click() - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert 'Success: User credential created successfully.' in messages credentials_sdk_after = list(openstack_admin.identity.credentials()) assert (len(credentials_sdk_after) == 1 and @@ -87,7 +87,7 @@ def test_create_user_credential_ec2(login, driver, openstack_admin, config, widgets.select_from_specific_dropdown_in_form( user_credential_form, 'id_project', 'admin') user_credential_form.find_element_by_css_selector(".btn-primary").click() - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert 'Success: User credential created successfully.' in messages credentials_sdk_after = list(openstack_admin.identity.credentials()) assert (len(credentials_sdk_after) == 1 and @@ -113,7 +113,7 @@ def test_delete_user_credential(login, driver, openstack_admin, config, actions_column = rows[0].find_element_by_css_selector("td.actions_column") widgets.select_from_dropdown(actions_column, "Delete User Credential") widgets.confirm_modal(driver) - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert (f"Success: Deleted User Credential: {user_credential_blob}" in messages) credentials_sdk_after = list(openstack_admin.identity.credentials()) @@ -139,7 +139,7 @@ def test_edit_user_credential(login, driver, openstack_admin, config, user_credential_form.find_element_by_id("id_data").send_keys( f"EDITED_{user_credential_blob}") user_credential_form.find_element_by_css_selector(".btn-primary").click() - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert ("Success: User credential updated successfully." in messages) credentials_sdk = list(openstack_admin.identity.credentials()) assert (len(credentials_sdk) == 1 and diff --git a/openstack_dashboard/test/selenium/integration/test_users.py b/openstack_dashboard/test/selenium/integration/test_users.py index 9e6889d447..0e42880925 100644 --- a/openstack_dashboard/test/selenium/integration/test_users.py +++ b/openstack_dashboard/test/selenium/integration/test_users.py @@ -57,7 +57,7 @@ def test_create_user(login, driver, user_name, openstack_admin, user_form.find_element_by_id( "id_confirm_password").send_keys(default_password) user_form.find_element_by_css_selector(".btn-primary").click() - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert f'Success: User "{user_name}" was successfully created.' in messages assert openstack_admin.identity.find_user(user_name) is not None @@ -77,7 +77,7 @@ def test_delete_user(login, driver, user_name, openstack_admin, actions_column = rows[0].find_element_by_css_selector("td.actions_column") widgets.select_from_dropdown(actions_column, "Delete User") widgets.confirm_modal(driver) - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert f"Success: Deleted User: {user_name}" in messages assert openstack_admin.identity.find_user(user_name) is None @@ -101,5 +101,5 @@ def test_change_user_password(login, driver, user_name, new_user, config): password_form.find_element_by_id( "id_confirm_password").send_keys(new_password) password_form.find_element_by_css_selector(".btn-primary").click() - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert "Success: User password has been updated successfully." in messages diff --git a/openstack_dashboard/test/selenium/integration/test_volume_snapshots.py b/openstack_dashboard/test/selenium/integration/test_volume_snapshots.py index b117810ecd..99d15440fd 100644 --- a/openstack_dashboard/test/selenium/integration/test_volume_snapshots.py +++ b/openstack_dashboard/test/selenium/integration/test_volume_snapshots.py @@ -163,7 +163,7 @@ def test_create_volume_snapshot_demo(login, driver, volume_name, create_snap_form.find_element_by_id("id_name").send_keys( volume_snapshot_name) create_snap_form.find_element_by_css_selector(".btn-primary").click() - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert (f'Info: Creating volume snapshot "{volume_snapshot_name}".' in messages) assert (openstack_demo.block_storage.find_snapshot(volume_snapshot_name) @@ -187,7 +187,7 @@ def test_delete_volume_snapshot_demo(login, driver, volume_snapshot_names, actions_column = rows[0].find_element_by_css_selector("td.actions_column") widgets.select_from_dropdown(actions_column, "Delete Volume Snapshot") widgets.confirm_modal(driver) - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert (f"Success: Scheduled deletion of Volume Snapshot: " f"{volume_snapshot_name}" in messages) wait_for_volume_snapshot_is_deleted(openstack_demo, volume_snapshot_name) @@ -216,7 +216,7 @@ def test_edit_volume_snapshot_description_demo(login, driver, openstack_demo, snapshot_form.find_element_by_id("id_description").send_keys( f"EDITED_Description for: {new_volume_snapshot_demo.name}") snapshot_form.find_element_by_css_selector(".btn-primary").click() - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert (f'Info: Updating volume snapshot ' f'"{new_volume_snapshot_demo.name}"' in messages) assert (openstack_demo.block_storage.find_snapshot( @@ -246,7 +246,7 @@ def test_create_volume_from_volume_snapshot_demo(login, driver, openstack_demo, volume_form.find_element_by_id("id_name").send_keys( volume_from_snapshot_name) volume_form.find_element_by_css_selector(".btn-primary").click() - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert (f'Info: Creating volume "{volume_from_snapshot_name}"' in messages) assert (openstack_demo.block_storage.find_volume( volume_from_snapshot_name) is not None) @@ -269,7 +269,7 @@ def test_delete_volume_from_volume_snapshot_demo(login, driver, openstack_demo, actions_column = rows[0].find_element_by_css_selector("td.actions_column") widgets.select_from_dropdown(actions_column, "Delete Volume") widgets.confirm_modal(driver) - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert (f"Info: Scheduled deletion of Volume: " f"{new_volume_from_snapshot_demo.name}" in messages) test_volumes.wait_for_volume_is_deleted( @@ -302,7 +302,7 @@ def test_delete_snapshot_before_volume_demo(login, driver, openstack_demo, widgets.select_from_dropdown(actions_column_snapshot, "Delete Volume Snapshot") widgets.confirm_modal(driver) - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert (f"Success: Scheduled deletion of Volume Snapshot: " f"{volume_snapshot_name}" in messages) wait_for_volume_snapshot_is_deleted(openstack_demo, volume_snapshot_name) @@ -322,7 +322,7 @@ def test_delete_snapshot_before_volume_demo(login, driver, openstack_demo, "td.actions_column") widgets.select_from_dropdown(actions_column_volume, "Delete Volume") widgets.confirm_modal(driver) - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert (f"Info: Scheduled deletion of Volume: " f"{new_volume_from_snapshot_demo.name}" in messages) test_volumes.wait_for_volume_is_deleted( @@ -425,7 +425,7 @@ def test_create_volume_snapshot_admin(login, driver, new_volume_admin, snapshot_form.find_element_by_id("id_name").send_keys( volume_snapshot_name) snapshot_form.find_element_by_css_selector(".btn-primary").click() - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert (f'Info: Creating volume snapshot "{volume_snapshot_name}".' in messages) assert (openstack_admin.block_storage.find_snapshot(volume_snapshot_name) @@ -448,7 +448,7 @@ def test_delete_volume_snapshot_admin(login, driver, openstack_admin, actions_column = rows[0].find_element_by_css_selector("td.actions_column") widgets.select_from_dropdown(actions_column, "Delete Volume Snapshot") widgets.confirm_modal(driver) - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert (f"Success: Scheduled deletion of Volume Snapshot: " f"{new_volume_snapshot_admin.name}" in messages) wait_for_volume_snapshot_is_deleted(openstack_admin, @@ -478,7 +478,7 @@ def test_edit_volume_snapshot_description_admin(login, driver, openstack_admin, snapshot_form.find_element_by_id("id_description").send_keys( f"EDITED_Description for: {new_volume_snapshot_admin.name}") snapshot_form.find_element_by_css_selector(".btn-primary").click() - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert (f'Info: Updating volume snapshot ' f'"{new_volume_snapshot_admin.name}"' in messages) assert (openstack_admin.block_storage.find_snapshot( diff --git a/openstack_dashboard/test/selenium/integration/test_volumes.py b/openstack_dashboard/test/selenium/integration/test_volumes.py index e521ff4cb0..923b1295ce 100644 --- a/openstack_dashboard/test/selenium/integration/test_volumes.py +++ b/openstack_dashboard/test/selenium/integration/test_volumes.py @@ -67,7 +67,7 @@ def test_create_empty_volume_demo(login, driver, volume_name, openstack_demo, volume_form.find_element_by_id("id_name").send_keys(volume_name) volume_form.find_element_by_css_selector( ".btn-primary[value='Create Volume']").click() - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert f'Info: Creating volume "{volume_name}"' in messages assert openstack_demo.block_storage.find_volume(volume_name) is not None @@ -94,7 +94,7 @@ def test_create_volume_via_vol_source_image_demo(login, driver, volume_form, 'id_image_source', image_source_name) volume_form.find_element_by_css_selector( ".btn-primary[value='Create Volume']").click() - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert f'Info: Creating volume "{volume_name}"' in messages assert openstack_demo.block_storage.find_volume(volume_name) is not None @@ -116,7 +116,7 @@ def test_delete_volume_demo(login, driver, volume_name, openstack_demo, actions_column = rows[0].find_element_by_css_selector("td.actions_column") widgets.select_from_dropdown(actions_column, "Delete Volume") widgets.confirm_modal(driver) - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert f"Info: Scheduled deletion of Volume: {volume_name}" in messages wait_for_volume_is_deleted(openstack_demo, volume_name) assert (openstack_demo.block_storage.find_volume(volume_name) is None) @@ -142,7 +142,7 @@ def test_edit_volume_description_demo(login, driver, volume_name, config, volume_form.find_element_by_id("id_description").send_keys( f"EDITED_Description for: {volume_name}") volume_form.find_element_by_css_selector(".btn-primary").click() - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert f'Info: Updating volume "{volume_name}"' in messages assert (openstack_demo.block_storage.find_volume( volume_name).description == f"EDITED_Description for: {volume_name}") @@ -169,7 +169,7 @@ def test_extend_volume_demo(login, driver, openstack_demo, new_volume_demo, volume_form.find_element_by_id("id_new_size").send_keys(2) volume_form.find_element_by_css_selector( ".btn-primary[value='Extend Volume']").click() - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert f'Info: Extending volume: "{new_volume_demo.name}"' in messages wait_for_steady_state_of_volume(openstack_demo, new_volume_demo.name) assert (openstack_demo.block_storage.find_volume( @@ -244,7 +244,7 @@ def test_volume_upload_to_image_demo(login, driver, openstack_demo, volume_form.find_element_by_id("id_image_name").send_keys(image_names[0]) volume_form.find_element_by_css_selector( ".btn-primary[value='Upload']").click() - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert ('Info: Successfully sent the request to upload volume to image for ' f'volume: "{new_volume_demo.name}"' in messages) wait_for_steady_state_of_volume(openstack_demo, new_volume_demo.name) @@ -345,7 +345,7 @@ def test_manage_volume_attachments(login, driver, openstack_demo, f"{new_instance_demo.name} ({new_instance_demo.id})") attach_to_instance_form.find_element_by_css_selector( ".btn-primary[value='Attach Volume']").click() - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert (f"Info: Attaching volume {new_volume_demo.name} to instance " f"{new_instance_demo.name} on /dev/vdb." in messages) wait_for_steady_state_of_volume(openstack_demo, new_volume_demo.name) @@ -368,7 +368,7 @@ def test_manage_volume_attachments(login, driver, openstack_demo, "td.actions_column").click() driver.find_element_by_xpath( ".//a[normalize-space()='Detach Volume']").click() - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert (f"Success: Detaching Volume: Volume {new_volume_demo.name} " f"on instance {new_instance_demo.name}" in messages) wait_for_steady_state_of_volume(openstack_demo, new_volume_demo.name) @@ -394,7 +394,7 @@ def test_create_empty_volume_admin(login, driver, volume_name, openstack_admin, volume_form.find_element_by_id("id_name").send_keys(volume_name) volume_form.find_element_by_css_selector( ".btn-primary[value='Create Volume']").click() - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert f'Info: Creating volume "{volume_name}"' in messages assert openstack_admin.block_storage.find_volume(volume_name) is not None @@ -420,7 +420,7 @@ def test_create_volume_via_vol_source_image_admin(login, driver, volume_name, volume_form, 'id_image_source', image_source_name) volume_form.find_element_by_css_selector( ".btn-primary[value='Create Volume']").click() - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert f'Info: Creating volume "{volume_name}"' in messages assert openstack_admin.block_storage.find_volume(volume_name) is not None @@ -442,7 +442,7 @@ def test_delete_volume_admin(login, driver, volume_name, openstack_admin, actions_column = rows[0].find_element_by_css_selector("td.actions_column") widgets.select_from_dropdown(actions_column, "Delete Volume") widgets.confirm_modal(driver) - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert f"Info: Scheduled deletion of Volume: {volume_name}" in messages wait_for_volume_is_deleted(openstack_admin, volume_name) assert (openstack_admin.block_storage.find_volume(volume_name) is None) @@ -468,7 +468,7 @@ def test_edit_volume_description_admin(login, driver, volume_name, config, volume_form.find_element_by_id("id_description").send_keys( f"EDITED_Description for: {volume_name}") volume_form.find_element_by_css_selector(".btn-primary").click() - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert f'Info: Updating volume "{volume_name}"' in messages assert (openstack_admin.block_storage.find_volume( volume_name).description == f"EDITED_Description for: {volume_name}") diff --git a/openstack_dashboard/test/selenium/integration/test_volumetypes.py b/openstack_dashboard/test/selenium/integration/test_volumetypes.py index 01a702ed31..ef8591a1db 100644 --- a/openstack_dashboard/test/selenium/integration/test_volumetypes.py +++ b/openstack_dashboard/test/selenium/integration/test_volumetypes.py @@ -107,7 +107,7 @@ def test_create_volume_type(login, driver, volume_type_name, openstack_admin, volume_type_form = driver.find_element_by_css_selector(".modal-dialog form") volume_type_form.find_element_by_id("id_name").send_keys(volume_type_name) volume_type_form.find_element_by_css_selector(".btn-primary").click() - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert (f'Success: Successfully created volume ' f'type: {volume_type_name}' in messages) assert openstack_admin.block_storage.find_type(volume_type_name) is not None @@ -128,7 +128,7 @@ def test_delete_volume_type(login, driver, volume_type_name, openstack_admin, actions_column = rows[0].find_element_by_css_selector("td.actions_column") widgets.select_from_dropdown(actions_column, "Delete Volume Type") widgets.confirm_modal(driver) - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert f"Success: Deleted Volume Type: {volume_type_name}" in messages assert openstack_admin.block_storage.find_type(volume_type_name) is None @@ -150,7 +150,7 @@ def test_volume_type_create_encryption(login, driver, openstack_admin, config, volume_type_form.find_element_by_id("id_provider").send_keys("plain") volume_type_form.find_element_by_css_selector( ".btn-primary[value='Create Volume Type Encryption']").click() - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert (f"Success: Successfully created encryption for " f"volume type: {new_volume_type.name}" in messages) assert (openstack_admin.block_storage.get_type_encryption( @@ -176,7 +176,7 @@ def test_volume_type_delete_encryption(login, driver, openstack_admin, config, actions_column = rows[0].find_element_by_css_selector("td.actions_column") widgets.select_from_dropdown(actions_column, "Delete Encryption") widgets.confirm_modal(driver) - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert (f"Success: Deleted Encryption: " f"{new_volume_type_with_encryption.name}" in messages) assert (openstack_admin.block_storage.get_type_encryption( @@ -196,7 +196,7 @@ def test_create_qos_spec(login, driver, qos_spec_name, openstack_admin, volume_qos_form = driver.find_element_by_css_selector(".modal-dialog form") volume_qos_form.find_element_by_id("id_name").send_keys(qos_spec_name) volume_qos_form.find_element_by_css_selector(".btn-primary").click() - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert (f'Success: Successfully created QoS ' f'Spec: {qos_spec_name}' in messages) qos_specs = openstack_admin.block_storage.get( @@ -220,7 +220,7 @@ def test_delete_qos_spec(login, driver, qos_spec_name, openstack_admin, actions_column = rows[0].find_element_by_css_selector("td.actions_column") widgets.select_from_dropdown(actions_column, "Delete QoS Spec") widgets.confirm_modal(driver) - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert f"Success: Deleted QoS Spec: {qos_spec_name}" in messages qos_specs = openstack_admin.block_storage.get( "/qos-specs").json()['qos_specs'] @@ -248,7 +248,7 @@ def test_edit_qos_spec_consumer(login, driver, openstack_admin, config, volume_qos_form = driver.find_element_by_css_selector(".modal-dialog form") widgets.select_from_dropdown(volume_qos_form, 'front-end') volume_qos_form.find_element_by_css_selector(".btn-primary").click() - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert "Success: Successfully modified QoS Spec consumer." in messages assert (openstack_admin.block_storage.get( f"/qos-specs/{new_qos_spec['id']}").json()['qos_specs']['consumer'] == @@ -274,7 +274,7 @@ def test_qos_spec_create_extra_specs(login, driver, openstack_admin, config, extra_specs_form.find_element_by_id("id_key").send_keys('minIOPS') extra_specs_form.find_element_by_id("id_value").send_keys(20) extra_specs_form.find_element_by_css_selector(".btn-primary").click() - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert 'Success: Created spec "minIOPS".' in messages assert (openstack_admin.block_storage.get( f"/qos-specs/{new_qos_spec['id']}").json()['qos_specs']['specs'] == @@ -307,7 +307,7 @@ def test_qos_spec_delete_extra_specs(login, driver, openstack_admin, config, widgets.select_from_dropdown(actions_column, "Delete Spec") driver.find_element_by_css_selector( ".modal-dialog .modal-footer .btn-danger").click() - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert "Success: Deleted Spec: maxIOPS" in messages assert (openstack_admin.block_storage.get( f"/qos-specs/{new_qos_spec_with_extra_specs['id']}").json() diff --git a/openstack_dashboard/test/selenium/ui/test_actions.py b/openstack_dashboard/test/selenium/ui/test_actions.py index e24a62e170..2f2229d9bf 100644 --- a/openstack_dashboard/test/selenium/ui/test_actions.py +++ b/openstack_dashboard/test/selenium/ui/test_actions.py @@ -17,7 +17,7 @@ from openstack_dashboard.test.selenium import widgets def test_delete_multiple_instance_rows(live_server, driver, dashboard_data, - user): + config, user): with mock.patch.object( api.glance, 'image_list_detailed') as mocked_i_l_d, \ mock.patch.object( @@ -52,14 +52,14 @@ def test_delete_multiple_instance_rows(live_server, driver, dashboard_data, server_names.append(str(server)[1:-1].split("Server: ")[1]) string_server_names = ", ".join(server_names) widgets.confirm_modal(driver) - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert (f"Info: Scheduled deletion of Instances: {string_server_names}" in messages) # Test for cover delete multiple rows also for Angular based table def test_delete_multiple_images_rows(live_server, driver, dashboard_data, - user): + config, user): with mock.patch.object( api.glance, 'image_list_detailed') as mocked_i_l_d, \ mock.patch.object( @@ -91,6 +91,6 @@ def test_delete_multiple_images_rows(live_server, driver, dashboard_data, driver.find_element_by_xpath( "//button[normalize-space()='Delete Images']").click() widgets.confirm_modal(driver) - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert (f"Success: Deleted Images: {string_image_names}." in messages) diff --git a/openstack_dashboard/test/selenium/ui/test_settings.py b/openstack_dashboard/test/selenium/ui/test_settings.py index c829f8bcb9..5ba43d322f 100644 --- a/openstack_dashboard/test/selenium/ui/test_settings.py +++ b/openstack_dashboard/test/selenium/ui/test_settings.py @@ -94,14 +94,14 @@ def test_message_after_password_change(live_server, driver, user, 'Password changed. Please log in again to continue.') -def test_languages(live_server, driver, user): +def test_languages(live_server, driver, user, config): driver.get(live_server.url + '/settings') user_settings = driver.find_element_by_id('user_settings_modal') language_options = user_settings.find_element_by_id('id_language') language_options.click() language_options.find_element_by_xpath("//option[@value='de']").click() user_settings.find_element_by_xpath('//*[@class="btn btn-primary"]').click() - messages = widgets.get_and_dismiss_messages(driver) + messages = widgets.get_and_dismiss_messages(driver, config) assert ("Success: Settings saved." in messages or "Erfolg:Einstellungen gespeichert." in messages) assert "Error" not in messages diff --git a/openstack_dashboard/test/selenium/widgets.py b/openstack_dashboard/test/selenium/widgets.py index e85e63d176..4937b918da 100644 --- a/openstack_dashboard/test/selenium/widgets.py +++ b/openstack_dashboard/test/selenium/widgets.py @@ -27,8 +27,10 @@ class TableDefinition: names: list -def get_and_dismiss_messages(element): - messages = element.find_elements_by_css_selector("div.messages div.alert") +def get_and_dismiss_messages(driver, config): + messages = WebDriverWait(driver, config.selenium.message_wait).until( + EC.presence_of_all_elements_located( + (By.CSS_SELECTOR, 'div.messages div.alert'))) collect = [] for message in messages: text = message.find_element_by_css_selector("p, div").text