diff --git a/manila_ui/tests/selenium/conftest.py b/manila_ui/tests/selenium/conftest.py index 3e416f00..25e06366 100644 --- a/manila_ui/tests/selenium/conftest.py +++ b/manila_ui/tests/selenium/conftest.py @@ -10,9 +10,18 @@ # License for the specific language governing permissions and limitations # under the License. +import pytest + from openstack_dashboard.test.selenium.conftest import config # noqa: F401 from openstack_dashboard.test.selenium.conftest import driver # noqa: F401 from openstack_dashboard.test.selenium.conftest import login # noqa: F401 from openstack_dashboard.test.selenium.conftest import xdisplay # noqa: F401 +from openstack_dashboard.test.selenium.integration.conftest import \ + openstack_admin # noqa: F401 from openstack_dashboard.test.selenium.integration.conftest import \ openstack_demo # noqa: F401 + + +@pytest.fixture +def openstack_client(request): + return request.getfixturevalue(request.param) diff --git a/manila_ui/tests/selenium/integration/test_shares.py b/manila_ui/tests/selenium/integration/test_shares.py index 0e9aa6d8..68819be2 100644 --- a/manila_ui/tests/selenium/integration/test_shares.py +++ b/manila_ui/tests/selenium/integration/test_shares.py @@ -14,6 +14,7 @@ import time from oslo_utils import uuidutils import pytest +from selenium.webdriver.support.ui import Select from openstack_dashboard.test.selenium import widgets @@ -24,24 +25,28 @@ def share_name(): @pytest.fixture -def new_share(share_name, openstack_demo): - share = openstack_demo.shared_file_system.create_share( +def new_share(request, share_name): + client_fixture_name = request.param + openstack_client = request.getfixturevalue(client_fixture_name) + share = openstack_client.shared_file_system.create_share( name=share_name, size=1, share_protocol="NFS", wait=True, ) - wait_for_steady_state_of_share(openstack_demo, share_name) + wait_for_steady_state_of_share(openstack_client, share_name) yield share - openstack_demo.shared_file_system.delete_share(share) + openstack_client.shared_file_system.delete_share(share) @pytest.fixture -def clear_share(share_name, openstack_demo): +def clear_share(request, share_name): + client_fixture_name = request.param + openstack_client = request.getfixturevalue(client_fixture_name) yield None - wait_for_steady_state_of_share(openstack_demo, share_name) - openstack_demo.shared_file_system.delete_share( - openstack_demo.shared_file_system.find_share(share_name).id) + wait_for_steady_state_of_share(openstack_client, share_name) + openstack_client.shared_file_system.delete_share( + openstack_client.shared_file_system.find_share(share_name).id) def wait_for_steady_state_of_share(openstack, share_name): @@ -49,7 +54,7 @@ def wait_for_steady_state_of_share(openstack, share_name): if (openstack.shared_file_system.get_share( openstack.shared_file_system.find_share( share_name).id).status in - ["available", "error", "inactive"]): + ["available", "error"]): break else: time.sleep(3) @@ -63,10 +68,15 @@ def wait_for_share_is_deleted(openstack, share_name): time.sleep(3) -def test_create_share_demo(login, driver, share_name, - openstack_demo, - config, clear_share): - login('user') +@pytest.mark.parametrize( + "clear_share, openstack_client, user_type", + [ + ("openstack_demo", "openstack_demo", "user"), + ("openstack_admin", "openstack_admin", "admin"), + ], indirect=["clear_share", "openstack_client"]) +def test_create_share(login, driver, share_name, openstack_client, + config, clear_share, user_type): + login(user_type) url = '/'.join(( config.dashboard.dashboard_url, 'project', @@ -77,16 +87,27 @@ def test_create_share_demo(login, driver, share_name, share_form = driver.find_element_by_css_selector(".modal-content form") share_form.find_element_by_id("id_name").send_keys(share_name) share_form.find_element_by_id("id_size").send_keys("1") +# select share_type required only for UI based on 2023.1 and previous. +# in newer versions there is set initial non-empty choice. + select_element = share_form.find_element_by_id("id_share_type") + Select(select_element).select_by_value('default') share_form.find_element_by_css_selector( ".btn-primary[value='Create']").click() messages = widgets.get_and_dismiss_messages(driver, config) assert f'Success: Creating share "{share_name}"' in messages - assert openstack_demo.shared_file_system.find_share(share_name) is not None + assert openstack_client.shared_file_system.find_share( + share_name) is not None -def test_delete_share_demo(login, driver, openstack_demo, - config, new_share): - login('user') +@pytest.mark.parametrize( + "new_share, openstack_client, user_type", + [ + ("openstack_demo", "openstack_demo", "user"), + ("openstack_admin", "openstack_admin", "admin"), + ], indirect=["new_share", "openstack_client"]) +def test_delete_share(login, driver, config, new_share, + openstack_client, user_type): + login(user_type) url = '/'.join(( config.dashboard.dashboard_url, 'project', @@ -101,13 +122,20 @@ def test_delete_share_demo(login, driver, openstack_demo, widgets.confirm_modal(driver) messages = widgets.get_and_dismiss_messages(driver, config) assert f"Success: Deleted Share: {new_share.name}" in messages - wait_for_share_is_deleted(openstack_demo, new_share.name) - assert openstack_demo.shared_file_system.find_share(new_share.name) is None + wait_for_share_is_deleted(openstack_client, new_share.name) + assert openstack_client.shared_file_system.find_share( + new_share.name) is None -def test_edit_share_demo(login, driver, openstack_demo, - config, new_share): - login('user') +@pytest.mark.parametrize( + "new_share, openstack_client, user_type", + [ + ("openstack_demo", "openstack_demo", "user"), + ("openstack_admin", "openstack_admin", "admin"), + ], indirect=["new_share", "openstack_client"]) +def test_edit_share_description(login, driver, openstack_client, + config, new_share, user_type): + login(user_type) url = '/'.join(( config.dashboard.dashboard_url, 'project', @@ -125,7 +153,72 @@ def test_edit_share_demo(login, driver, openstack_demo, ".btn-primary[value='Edit']").click() messages = widgets.get_and_dismiss_messages(driver, config) assert f'Success: Updating share "{new_share.name}"' in messages - assert (openstack_demo.shared_file_system.get_share( - openstack_demo.shared_file_system.find_share( - new_share.name).id).description == - f"EDITED_Description for: {new_share.name}") + assert (openstack_client.shared_file_system.get_share( + new_share.id).description == + f"EDITED_Description for: {new_share.name}") + + +@pytest.mark.parametrize( + "new_share, openstack_client, user_type", + [ + ("openstack_demo", "openstack_demo", "user"), + ("openstack_admin", "openstack_admin", "admin"), + ], indirect=["new_share", "openstack_client"]) +def test_resize_share_demo(login, driver, openstack_client, + config, new_share, user_type): + login(user_type) + url = '/'.join(( + config.dashboard.dashboard_url, + 'project', + 'shares', + )) + driver.get(url) + rows = driver.find_elements_by_css_selector( + f"table#shares tr[data-display='{new_share.name}']") + assert len(rows) == 1 + assert (openstack_client.shared_file_system.get_share( + new_share.id).size == 1) + actions_column = rows[0].find_element_by_css_selector("td.actions_column") + widgets.select_from_dropdown(actions_column, "Resize Share") + share_form = driver.find_element_by_css_selector(".modal-content form") + share_form.find_element_by_id("id_new_size").clear() + share_form.find_element_by_id("id_new_size").send_keys("2") + share_form.find_element_by_css_selector( + ".btn-primary[value='Resize']").click() + messages = widgets.get_and_dismiss_messages(driver, config) + assert f'Success: Resized share "{new_share.name}"' in messages + assert (openstack_client.shared_file_system.get_share( + new_share.id).size == 2) + + +@pytest.mark.parametrize( + "new_share, openstack_client, user_type", + [ + ("openstack_demo", "openstack_demo", "user"), + ("openstack_admin", "openstack_admin", "admin"), + ], indirect=["new_share", "openstack_client"]) +def test_edit_share_metadata(login, driver, openstack_client, + config, new_share, user_type): + login(user_type) + url = '/'.join(( + config.dashboard.dashboard_url, + 'project', + 'shares', + )) + driver.get(url) + rows = driver.find_elements_by_css_selector( + f"table#shares tr[data-display='{new_share.name}']") + assert len(rows) == 1 + actions_column = rows[0].find_element_by_css_selector("td.actions_column") + widgets.select_from_dropdown(actions_column, "Edit Share Metadata") + share_form = driver.find_element_by_css_selector(".modal-content form") + share_form.find_element_by_id("id_metadata").clear() + share_form.find_element_by_id("id_metadata").send_keys( + "test_value=integration_tests") + share_form.find_element_by_css_selector( + ".btn-primary[value='Save Changes']").click() + messages = widgets.get_and_dismiss_messages(driver, config) + assert (f'Success: Updating share metadata "{new_share.name}"' + in messages) + assert (openstack_client.shared_file_system.get_share( + new_share.id).metadata == {'test_value': 'integration_tests'})