From 404b9e56496b20f38c6ce4e87d6b2389801a3ae7 Mon Sep 17 00:00:00 2001 From: Ashish Gupta Date: Mon, 9 Oct 2023 21:23:07 +0530 Subject: [PATCH] Pytest based selenium test : Add volumes pagination tests - Modifies existing fixtures for creating and deleting multiple volumes - Added pagination test for admin and demo user Change-Id: I36f0d86bffd40232e4ecca839504f065b4f664f5 --- .../selenium/integration/test_instances.py | 5 +- .../integration/test_volume_snapshots.py | 2 + .../test/selenium/integration/test_volumes.py | 187 +++++++++++++++--- 3 files changed, 169 insertions(+), 25 deletions(-) diff --git a/openstack_dashboard/test/selenium/integration/test_instances.py b/openstack_dashboard/test/selenium/integration/test_instances.py index 8d1f580ba9..af3e32dc0e 100644 --- a/openstack_dashboard/test/selenium/integration/test_instances.py +++ b/openstack_dashboard/test/selenium/integration/test_instances.py @@ -179,6 +179,7 @@ def test_create_instance_from_volume_demo(login, driver, instance_name, openstack_demo): network = config.network.external_network flavor = config.launch_instances.flavor + volume_name = volume_name[0] login('user') url = '/'.join(( @@ -264,7 +265,7 @@ def test_instance_pagination_demo(login, driver, instance_name, """ items_per_page = 1 instance_count = 2 - instance_list = ["{0}-{1}".format(instance_name, item) + instance_list = [f"{instance_name}-{item}" for item in range(1, instance_count + 1)] first_page_definition = widgets.TableDefinition(next=True, prev=False, count=items_per_page, @@ -383,7 +384,7 @@ def test_instance_pagination_admin(login, driver, instance_name, """ items_per_page = 1 instance_count = 2 - instance_list = ["{0}-{1}".format(instance_name, item) + instance_list = [f"{instance_name}-{item}" for item in range(1, instance_count + 1)] first_page_definition = widgets.TableDefinition(next=True, prev=False, count=items_per_page, diff --git a/openstack_dashboard/test/selenium/integration/test_volume_snapshots.py b/openstack_dashboard/test/selenium/integration/test_volume_snapshots.py index 3c171ec20f..f715e75e28 100644 --- a/openstack_dashboard/test/selenium/integration/test_volume_snapshots.py +++ b/openstack_dashboard/test/selenium/integration/test_volume_snapshots.py @@ -29,6 +29,7 @@ def volume_snapshot_name(): @pytest.fixture def new_volume_snapshot_demo(new_volume_demo, volume_snapshot_name, openstack_demo): + volume_snapshot = openstack_demo.create_volume_snapshot( volume_id=new_volume_demo.id, name=volume_snapshot_name, @@ -52,6 +53,7 @@ def test_create_volume_snapshot_demo(login, driver, volume_name, config, clear_volume_snapshot_demo, openstack_demo): + volume_name = volume_name[0] login('user') volumes_url = '/'.join(( config.dashboard.dashboard_url, diff --git a/openstack_dashboard/test/selenium/integration/test_volumes.py b/openstack_dashboard/test/selenium/integration/test_volumes.py index 87e95902e9..8f512d012f 100644 --- a/openstack_dashboard/test/selenium/integration/test_volumes.py +++ b/openstack_dashboard/test/selenium/integration/test_volumes.py @@ -16,42 +16,51 @@ import pytest from openstack_dashboard.test.selenium import widgets -@pytest.fixture -def volume_name(): - return 'horizon_volume_%s' % uuidutils.generate_uuid(dashed=False) +@pytest.fixture(params=[1]) +def volume_name(request): + count = request.param + vol_name_list = ['horizon_vol_%s' % uuidutils.generate_uuid(dashed=False)] + if count > 1: + vol_name_list = [f"{vol_name_list[0]}-{item}" + for item in range(1, count + 1)] + return vol_name_list @pytest.fixture def new_volume_demo(volume_name, openstack_demo, config): - volume = openstack_demo.create_volume( - name=volume_name, - image=config.image.images_list[0], - size=1, - wait=True, - ) + for vol in volume_name: + volume = openstack_demo.create_volume( + name=vol, + image=config.image.images_list[0], + size=1, + wait=True, + ) yield volume - openstack_demo.delete_volume(volume_name) + for vol in volume_name: + openstack_demo.delete_volume(vol) @pytest.fixture def new_volume_admin(volume_name, openstack_admin, config): - volume = openstack_admin.create_volume( - name=volume_name, - image=config.image.images_list[0], - size=1, - wait=True, - ) + for vol in volume_name: + volume = openstack_admin.create_volume( + name=vol, + image=config.image.images_list[0], + size=1, + wait=True, + ) yield volume - openstack_admin.delete_volume(volume_name) + for vol in volume_name: + openstack_admin.delete_volume(vol) @pytest.fixture def clear_volume_demo(volume_name, openstack_demo): yield None - openstack_demo. delete_volume( - volume_name, + openstack_demo.delete_volume( + volume_name[0], wait=True, ) @@ -59,8 +68,8 @@ def clear_volume_demo(volume_name, openstack_demo): @pytest.fixture def clear_volume_admin(volume_name, openstack_admin): yield None - openstack_admin. delete_volume( - volume_name, + openstack_admin.delete_volume( + volume_name[0], wait=True, ) @@ -76,7 +85,7 @@ def select_from_dropdown_volume_tab(driver, dropdown_id, label): def test_create_empty_volume_demo(login, driver, volume_name, openstack_demo, clear_volume_demo, config): - + volume_name = volume_name[0] login('user') url = '/'.join(( config.dashboard.dashboard_url, @@ -97,7 +106,7 @@ def test_create_empty_volume_demo(login, driver, volume_name, openstack_demo, def test_create_volume_from_image_demo(login, driver, volume_name, config, clear_volume_demo, openstack_demo): image_source_name = config.launch_instances.image_name - + volume_name = volume_name[0] login('user') url = '/'.join(( config.dashboard.dashboard_url, @@ -121,6 +130,7 @@ def test_create_volume_from_image_demo(login, driver, volume_name, config, def test_delete_volume_demo(login, driver, volume_name, openstack_demo, new_volume_demo, config): + volume_name = volume_name[0] login('user') url = '/'.join(( config.dashboard.dashboard_url, @@ -138,3 +148,134 @@ def test_delete_volume_demo(login, driver, volume_name, openstack_demo, messages = widgets.get_and_dismiss_messages(driver) assert f"Info: Scheduled deletion of Volume: {volume_name}" in messages assert openstack_demo.block_storage.find_volume(volume_name) is None + + +@pytest.mark.parametrize('volume_name', [3], indirect=True) +def test_volumes_pagination_demo(login, driver, volume_name, + change_page_size_demo, + new_volume_demo, config): + """This test checks volumes pagination for demo + + Steps: + 1) Login to Horizon Dashboard as demo user + 2) create 3 Volumes + 3) Navigate to user settings page + 4) Change 'Items Per Page' value to 1 + 5) Go to Project -> Volumes page + 6) Check that only 'Next' link is available, only one volume is + available (and it has correct name) on the first page + 7) Click 'Next' and check that both 'Prev' and 'Next' links are + available, only one volume is available (and it has correct name) + 8) Click 'Next' and check that only 'Prev' link is available, + only one volume is visible (and it has correct name) on page 3 + 9) Click 'Prev' and check result (should be the same as for step7) + 10) Click 'Prev' and check result (should be the same as for step6) + 11) Go to user settings page and restore 'Items Per Page' + 12) Delete created volumes + """ + items_per_page = 1 + first_page_definition = widgets.TableDefinition(next=True, prev=False, + count=items_per_page, + names=[volume_name[2]]) + second_page_definition = widgets.TableDefinition(next=True, prev=True, + count=items_per_page, + names=[volume_name[1]]) + third_page_definition = widgets.TableDefinition(next=False, prev=True, + count=items_per_page, + names=[volume_name[0]]) + url = '/'.join(( + config.dashboard.dashboard_url, + 'project', + 'volumes' + )) + driver.get(url) + actual_page1_definition = widgets.get_table_definition(driver, + sorting=True) + assert first_page_definition == actual_page1_definition + # Turning to next page(page2) + driver.find_element_by_link_text("Next »").click() + actual_page2_definition = widgets.get_table_definition(driver, + sorting=True) + assert second_page_definition == actual_page2_definition + # Turning to next page(page3) + driver.find_element_by_link_text("Next »").click() + actual_page3_definition = widgets.get_table_definition(driver, + sorting=True) + assert third_page_definition == actual_page3_definition + # Turning back to previous page(page2) + driver.find_element_by_link_text("« Prev").click() + actual_page2_definition = widgets.get_table_definition(driver, + sorting=True) + assert second_page_definition == actual_page2_definition + # Turning back to previous page(page1) + driver.find_element_by_link_text("« Prev").click() + actual_page1_definition = widgets.get_table_definition(driver, + sorting=True) + assert first_page_definition == actual_page1_definition + + +# Admin tests + + +@pytest.mark.parametrize('volume_name', [3], indirect=True) +def test_volumes_pagination_admin(login, driver, volume_name, + change_page_size_admin, + new_volume_admin, config): + """This test checks volumes pagination for demo + + Steps: + 1) Login to Horizon Dashboard as admin user + 2) create 3 Volumes + 3) Navigate to user settings page + 4) Change 'Items Per Page' value to 1 + 5) Go to Project -> Volumes page + 6) Check that only 'Next' link is available, only one volume is + available (and it has correct name) on the first page + 7) Click 'Next' and check that both 'Prev' and 'Next' links are + available, only one volume is available (and it has correct name) + 8) Click 'Next' and check that only 'Prev' link is available, + only one volume is visible (and it has correct name) on page 3 + 9) Click 'Prev' and check result (should be the same as for step7) + 10) Click 'Prev' and check result (should be the same as for step6) + 11) Go to user settings page and restore 'Items Per Page' + 12) Delete created volumes + """ + items_per_page = 1 + first_page_definition = widgets.TableDefinition(next=True, prev=False, + count=items_per_page, + names=[volume_name[2]]) + second_page_definition = widgets.TableDefinition(next=True, prev=True, + count=items_per_page, + names=[volume_name[1]]) + third_page_definition = widgets.TableDefinition(next=False, prev=True, + count=items_per_page, + names=[volume_name[0]]) + url = '/'.join(( + config.dashboard.dashboard_url, + 'project', + 'volumes' + )) + driver.get(url) + actual_page1_definition = widgets.get_table_definition(driver, + sorting=True) + assert first_page_definition == actual_page1_definition + # Turning to next page(page2) + driver.find_element_by_link_text("Next »").click() + actual_page2_definition = widgets.get_table_definition(driver, + sorting=True) + assert second_page_definition == actual_page2_definition + # Turning to next page(page3) + driver.find_element_by_link_text("Next »").click() + actual_page3_definition = widgets.get_table_definition(driver, + sorting=True) + assert third_page_definition == actual_page3_definition + # Turning back to previous page(page2) + driver.find_element_by_link_text("« Prev").click() + actual_page2_definition = widgets.get_table_definition(driver, + sorting=True) + assert second_page_definition == actual_page2_definition + # Turning back to previous page(page1) + driver.find_element_by_link_text("« Prev").click() + actual_page1_definition = widgets.get_table_definition(driver, + sorting=True) + assert first_page_definition == actual_page1_definition