From 24ee71f94e7a3215f86c3f9a7bc672cab6047ebf Mon Sep 17 00:00:00 2001 From: Felipe Monteiro Date: Fri, 16 Dec 2016 17:07:37 -0500 Subject: [PATCH] Add UI Tests for Deleting Multiple Images. Added new scenario for deleting multiple images. The scenario tests that each image is deleted separately. Afterward, it tests that all the images are deleted together. Change-Id: Ib5292e3347101a19f5cc01dbc4999584508186c4 Partial-Bug: #1596196 --- muranodashboard/tests/functional/base.py | 11 +-- .../tests/functional/sanity_check.py | 69 ++++++++++++++++++- 2 files changed, 74 insertions(+), 6 deletions(-) diff --git a/muranodashboard/tests/functional/base.py b/muranodashboard/tests/functional/base.py index 6685a1bd8..77a346c38 100644 --- a/muranodashboard/tests/functional/base.py +++ b/muranodashboard/tests/functional/base.py @@ -275,7 +275,7 @@ class UITestCase(BaseDeps): ui.WebDriverWait(self.driver, sec).until( EC.presence_of_element_located((method, value))) except exc.TimeoutException: - self.fail("Element {0} is not preset on the page".format(value)) + self.fail("Element {0} is not present on the page".format(value)) def check_element_not_on_page(self, method, value): self.driver.implicitly_wait(3) @@ -284,7 +284,7 @@ class UITestCase(BaseDeps): self.driver.find_element(method, value) except (exc.NoSuchElementException, exc.ElementNotVisibleException): present = False - self.assertFalse(present, u"Element {0} is preset on the page" + self.assertFalse(present, u"Element {0} is present on the page" " while it should't".format(value)) self.driver.implicitly_wait(30) @@ -294,7 +294,7 @@ class UITestCase(BaseDeps): ui.WebDriverWait(self.driver, sec).until( EC.presence_of_element_located(locator)) except exc.TimeoutException: - self.fail("Alert is not preset on the page") + self.fail("Alert is not present on the page") self.assertIn(message, self.driver.find_element(*locator).text) @@ -427,13 +427,15 @@ class ImageTestCase(PackageBase): glance_endpoint = cls.service_catalog.url_for(service_type='image') cls.glance = gclient.Client('1', endpoint=glance_endpoint, session=cls.keystone_client.session) + cls.images = [] cls.image_title = 'New Image ' + str(time.time()) cls.image = cls.upload_image(cls.image_title) @classmethod def tearDownClass(cls): super(ImageTestCase, cls).tearDownClass() - cls.glance.images.delete(cls.image.id) + for image in cls.images: + cls.glance.images.delete(image.id) @classmethod def upload_image(cls, title): @@ -449,6 +451,7 @@ class ImageTestCase(PackageBase): except Exception: logger.error("Unable to create or update image in Glance") raise + cls.images.append(image) return image def select_and_click_element(self, element): diff --git a/muranodashboard/tests/functional/sanity_check.py b/muranodashboard/tests/functional/sanity_check.py index ec7a33030..36be2b8c2 100644 --- a/muranodashboard/tests/functional/sanity_check.py +++ b/muranodashboard/tests/functional/sanity_check.py @@ -476,12 +476,77 @@ class TestSuiteImage(base.ImageTestCase): self.go_to_submenu('Images') self.driver.find_element_by_xpath( c.DeleteImageMeta.format(self.image_title)).click() - self.driver.find_element_by_xpath(c.ConfirmDeletion).click() + with self.wait_for_page_reload(): + self.driver.find_element_by_xpath(c.ConfirmDeletion).click() + self.wait_for_alert_message() self.check_element_not_on_page(by.By.XPATH, c.TestImage.format(self.image_title)) - self.repair_image() + def test_delete_multiple_images(self): + """Test ability to delete multiple images. + + Scenario: + 1. Create 3 randomly named images. + 2. Navigate to Images page. + 3. For each randomly created image: + a. Select current image and click on "Delete Metadata". Each + image is deleted separately. + 4. Re-create 3 randomly named images. + 5. Refresh page. + 6. Select topmost checkbox and click on "Delete Metadata". All + images are deleted together. + 7. For each randomly created image: + a. Check that the current image was deleted. + 8. Check that ``self.image_title`` was also deleted. + """ + default_image_title = self.image_title + image_titles = [] + for i in range(3): + image_title = self.gen_random_resource_name('image') + image_titles.append(image_title) + self.upload_image(image_title) + + self.navigate_to('Manage') + self.go_to_submenu('Images') + + # Check each checkbox in the table and delete each image one by one. + for image_title in image_titles: + self.wait_element_is_clickable( + by.By.XPATH, c.DeleteImageMeta.format(image_title)).click() + with self.wait_for_page_reload(): + self.driver.find_element_by_xpath(c.ConfirmDeletion).click() + self.wait_for_alert_message() + self.check_element_not_on_page( + by.By.XPATH, c.TestImage.format(image_title)) + self.check_element_on_page( + by.By.XPATH, c.TestImage.format(default_image_title)) + + # Re-create 3 randomly named images. + image_titles = [] + for i in range(3): + image_title = self.gen_random_resource_name('image') + image_titles.append(image_title) + self.upload_image(image_title) + + # Check the topmost checkbox, then delete all images at the same time. + self.go_to_submenu('Images') + self.wait_element_is_clickable(by.By.CSS_SELECTOR, + 'label[for="ui-id-1"]').click() + self.wait_element_is_clickable(by.By.ID, + 'marked_images__action_delete').click() + with self.wait_for_page_reload(): + self.driver.find_element_by_xpath(c.ConfirmDeletion).click() + self.wait_for_alert_message() + + for image_title in image_titles: + self.check_element_not_on_page( + by.By.XPATH, c.TestImage.format(image_title)) + self.check_element_not_on_page( + by.By.XPATH, c.TestImage.format(default_image_title)) + + self.repair_image() # Restore the class-level image that was deleted. + class TestSuiteFields(base.FieldsTestCase): def test_check_domain_name_field_validation(self):