Improve working with messages in integration tests

Check for presence of expected messages in integration tests (and
absense of unexpected) and dismiss expected messages at once. The
latter change should make tests to pass a bit faster.

Implements blueprint: integration-tests-improvements-part1

Change-Id: I78fe771d8d650145080b68d14ac9ef91640d0f80
This commit is contained in:
Timur Sufiev 2015-12-27 19:50:14 +03:00
parent 600986c204
commit edcfca1ab2
11 changed files with 126 additions and 28 deletions

@ -24,9 +24,7 @@ class BasePage(pageobject.PageObject):
"""Base class for all dashboard page objects."""
_heading_locator = (by.By.CSS_SELECTOR, 'div.page-header > h2')
_error_msg_locator = (by.By.CSS_SELECTOR, 'div.alert-danger.alert')
_spinner_locator = (by.By.CSS_SELECTOR, 'div.modal-backdrop')
_message_locator = (by.By.CSS_SELECTOR, 'div.alert-success')
@property
def heading(self):
@ -44,14 +42,6 @@ class BasePage(pageobject.PageObject):
def navaccordion(self):
return menus.NavigationAccordionRegion(self.driver, self.conf)
@property
def error_message(self):
src_elem = self._get_element(*self._error_msg_locator)
return messages.ErrorMessageRegion(self.driver, self.conf, src_elem)
def is_error_message_present(self):
return self._is_element_present(*self._error_msg_locator)
def go_to_login_page(self):
self.driver.get(self.login_url)
@ -81,13 +71,14 @@ class BasePage(pageobject.PageObject):
getter = lambda: self._get_element(*self._spinner_locator)
self.wait_till_element_disappears(getter)
def wait_till_message_disappears(self):
getter = lambda: self._get_element(*self._message_locator)
self.wait_till_element_disappears(getter)
def find_message_and_dismiss(self, message_level=messages.SUCCESS):
message = messages.MessageRegion(self.driver, self.conf, message_level)
if message.exists():
message.close()
return message.exists()
def wait_till_popups_disappear(self):
self.wait_till_spinner_disappears()
self.wait_till_message_disappears()
def change_project(self, name):
self.topbar.user_dropdown_project.click_on_project(name)

@ -10,14 +10,36 @@
# License for the specific language governing permissions and limitations
# under the License.
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common import by
from openstack_dashboard.test.integration_tests.regions import baseregion
ERROR = 'alert-danger'
INFO = 'alert-info'
SUCCESS = 'alert-success'
class ErrorMessageRegion(baseregion.BaseRegion):
class MessageRegion(baseregion.BaseRegion):
_close_locator = (by.By.CSS_SELECTOR, 'a.close')
def _msg_locator(self, level):
return (by.By.CSS_SELECTOR, 'div.alert.%s' % level)
def __init__(self, driver, conf, level=SUCCESS):
self._default_src_locator = self._msg_locator(level)
# NOTE(tsufiev): we cannot use self._turn_off_implicit_wait() at this
# point, because the instance is not initialized by ancestor's __init__
driver.implicitly_wait(0)
try:
super(MessageRegion, self).__init__(driver, conf)
except NoSuchElementException:
self.src_elem = None
finally:
self._turn_on_implicit_wait()
def exists(self):
return bool(self.src_elem)
def close(self):
self._get_element(*self._close_locator).click()

@ -11,6 +11,7 @@
# under the License.
from openstack_dashboard.test.integration_tests import helpers
from openstack_dashboard.test.integration_tests.regions import messages
class TestFlavors(helpers.AdminTestCase):
@ -29,7 +30,13 @@ class TestFlavors(helpers.AdminTestCase):
flavors_page.create_flavor(name=self.FLAVOR_NAME, vcpus=1, ram=1024,
root_disk=20, ephemeral_disk=0,
swap_disk=0)
self.assertTrue(
flavors_page.find_message_and_dismiss(messages.SUCCESS))
self.assertFalse(flavors_page.find_message_and_dismiss(messages.ERROR))
self.assertTrue(flavors_page.is_flavor_present(self.FLAVOR_NAME))
flavors_page.delete_flavor(self.FLAVOR_NAME)
self.assertTrue(
flavors_page.find_message_and_dismiss(messages.SUCCESS))
self.assertFalse(flavors_page.find_message_and_dismiss(messages.ERROR))
self.assertFalse(flavors_page.is_flavor_present(self.FLAVOR_NAME))

@ -14,6 +14,7 @@
# under the License.
from openstack_dashboard.test.integration_tests import helpers
from openstack_dashboard.test.integration_tests.regions import messages
class TestFloatingip(helpers.TestCase):
@ -23,7 +24,15 @@ class TestFloatingip(helpers.TestCase):
floatingip_page = \
self.home_pg.go_to_compute_accessandsecurity_floatingipspage()
floating_ip = floatingip_page.allocate_floatingip()
self.assertTrue(
floatingip_page.find_message_and_dismiss(messages.SUCCESS))
self.assertFalse(
floatingip_page.find_message_and_dismiss(messages.ERROR))
self.assertTrue(floatingip_page.is_floatingip_present(floating_ip))
floatingip_page.release_floatingip(floating_ip)
self.assertTrue(
floatingip_page.find_message_and_dismiss(messages.SUCCESS))
self.assertFalse(
floatingip_page.find_message_and_dismiss(messages.ERROR))
self.assertFalse(floatingip_page.is_floatingip_present(floating_ip))

@ -11,6 +11,7 @@
# under the License.
from openstack_dashboard.test.integration_tests import helpers
from openstack_dashboard.test.integration_tests.regions import messages
class TestImage(helpers.TestCase):
@ -27,8 +28,12 @@ class TestImage(helpers.TestCase):
images_page = self.home_pg.go_to_compute_imagespage()
images_page.create_image(self.IMAGE_NAME)
self.assertTrue(images_page.find_message_and_dismiss(messages.SUCCESS))
self.assertFalse(images_page.find_message_and_dismiss(messages.ERROR))
self.assertTrue(images_page.is_image_present(self.IMAGE_NAME))
self.assertTrue(images_page.is_image_active(self.IMAGE_NAME))
images_page.delete_image(self.IMAGE_NAME)
self.assertTrue(images_page.find_message_and_dismiss(messages.SUCCESS))
self.assertFalse(images_page.find_message_and_dismiss(messages.ERROR))
self.assertFalse(images_page.is_image_present(self.IMAGE_NAME))

@ -10,6 +10,7 @@
# License for the specific language governing permissions and limitations
# under the License.
from openstack_dashboard.test.integration_tests import helpers
from openstack_dashboard.test.integration_tests.regions import messages
INSTANCES_NAME = helpers.gen_random_resource_name('instance',
timestamp=False)
@ -23,6 +24,15 @@ class TestInstances(helpers.AdminTestCase):
def test_create_delete_instance(self):
instances_page = self.home_pg.go_to_compute_instancespage()
instances_page.create_instance(INSTANCES_NAME)
self.assertTrue(
instances_page.find_message_and_dismiss(messages.SUCCESS))
self.assertFalse(
instances_page.find_message_and_dismiss(messages.ERROR))
self.assertTrue(instances_page.is_instance_active(INSTANCES_NAME))
instances_page.delete_instance(INSTANCES_NAME)
self.assertTrue(
instances_page.find_message_and_dismiss(messages.SUCCESS))
self.assertFalse(
instances_page.find_message_and_dismiss(messages.ERROR))
self.assertTrue(instances_page.is_instance_deleted(INSTANCES_NAME))

@ -15,6 +15,7 @@
from openstack_dashboard.test.integration_tests import decorators
from openstack_dashboard.test.integration_tests import helpers
from openstack_dashboard.test.integration_tests.regions import messages
@decorators.skip_because(bugs=["1526791"])
@ -26,10 +27,16 @@ class TestKeypair(helpers.TestCase):
keypair_page = self.home_pg.\
go_to_compute_accessandsecurity_keypairspage()
keypair_page.create_keypair(self.KEYPAIR_NAME)
self.assertTrue(
keypair_page.find_message_and_dismiss(messages.SUCCESS))
self.assertFalse(keypair_page.find_message_and_dismiss(messages.ERROR))
keypair_page = self.home_pg.\
go_to_compute_accessandsecurity_keypairspage()
self.assertTrue(keypair_page.is_keypair_present(self.KEYPAIR_NAME))
keypair_page.delete_keypair(self.KEYPAIR_NAME)
self.assertTrue(
keypair_page.find_message_and_dismiss(messages.SUCCESS))
self.assertFalse(keypair_page.find_message_and_dismiss(messages.ERROR))
self.assertFalse(keypair_page.is_keypair_present(self.KEYPAIR_NAME))

@ -10,6 +10,7 @@
# License for the specific language governing permissions and limitations
# under the License.
from openstack_dashboard.test.integration_tests import helpers
from openstack_dashboard.test.integration_tests.regions import messages
PROJECT_NAME = helpers.gen_random_resource_name("project")
@ -23,6 +24,15 @@ class TestCreateDeleteProject(helpers.AdminTestCase):
def test_create_delete_project(self):
self.projects_page.create_project(PROJECT_NAME)
self.assertTrue(
self.projects_page.find_message_and_dismiss(messages.SUCCESS))
self.assertFalse(
self.projects_page.find_message_and_dismiss(messages.ERROR))
self.assertTrue(self.projects_page.is_project_present(PROJECT_NAME))
self.projects_page.delete_project(PROJECT_NAME)
self.assertTrue(
self.projects_page.find_message_and_dismiss(messages.SUCCESS))
self.assertFalse(
self.projects_page.find_message_and_dismiss(messages.ERROR))
self.assertFalse(self.projects_page.is_project_present(PROJECT_NAME))

@ -11,6 +11,7 @@
# under the License.
from openstack_dashboard.test.integration_tests import helpers
from openstack_dashboard.test.integration_tests.regions import messages
class TestSecuritygroup(helpers.TestCase):
@ -29,9 +30,17 @@ class TestSecuritygroup(helpers.TestCase):
self.home_pg.go_to_compute_accessandsecurity_securitygroupspage()
securitygroups_page.create_securitygroup(self.SECURITYGROUP_NAME)
self.assertTrue(
securitygroups_page.find_message_and_dismiss(messages.SUCCESS))
self.assertFalse(
securitygroups_page.find_message_and_dismiss(messages.ERROR))
self.assertTrue(securitygroups_page.is_securitygroup_present(
self.SECURITYGROUP_NAME))
securitygroups_page.delete_securitygroup(self.SECURITYGROUP_NAME)
self.assertTrue(
securitygroups_page.find_message_and_dismiss(messages.SUCCESS))
self.assertFalse(
securitygroups_page.find_message_and_dismiss(messages.ERROR))
self.assertFalse(securitygroups_page.is_securitygroup_present(
self.SECURITYGROUP_NAME))

@ -11,6 +11,7 @@
# under the License.
from openstack_dashboard.test.integration_tests import helpers
from openstack_dashboard.test.integration_tests.regions import messages
class TestUser(helpers.AdminTestCase):
@ -20,8 +21,14 @@ class TestUser(helpers.AdminTestCase):
def test_create_delete_user(self):
users_page = self.home_pg.go_to_identity_userspage()
password = self.TEST_PASSWORD
users_page.create_user(self.USER_NAME, password=password,
project='admin', role='admin')
self.assertTrue(users_page.find_message_and_dismiss(messages.SUCCESS))
self.assertFalse(users_page.find_message_and_dismiss(messages.ERROR))
self.assertTrue(users_page.is_user_present(self.USER_NAME))
users_page.delete_user(self.USER_NAME)
self.assertTrue(users_page.find_message_and_dismiss(messages.SUCCESS))
self.assertFalse(users_page.find_message_and_dismiss(messages.ERROR))
self.assertFalse(users_page.is_user_present(self.USER_NAME))

@ -11,15 +11,16 @@
# under the License.
from openstack_dashboard.test.integration_tests import helpers
from openstack_dashboard.test.integration_tests.regions import messages
class TestUserSettings(helpers.TestCase):
def verify_user_settings_change(self, changed_settings):
language = self.settings_page.settings_form.language.value
timezone = self.settings_page.settings_form.timezone.value
pagesize = self.settings_page.settings_form.pagesize.value
loglines = self.settings_page.settings_form.instance_log_length.value
def verify_user_settings_change(self, settings_page, changed_settings):
language = settings_page.settings_form.language.value
timezone = settings_page.settings_form.timezone.value
pagesize = settings_page.settings_form.pagesize.value
loglines = settings_page.settings_form.instance_log_length.value
user_settings = (("Language", changed_settings["language"], language),
("Timezone", changed_settings["timezone"], timezone),
@ -39,16 +40,36 @@ class TestUserSettings(helpers.TestCase):
* changes the number of log lines to be shown per instance
* verifies all changes were successfully executed
"""
self.settings_page = self.home_pg.go_to_settings_usersettingspage()
settings_page = self.home_pg.go_to_settings_usersettingspage()
self.settings_page.change_language("es")
self.settings_page.change_timezone("Asia/Jerusalem")
self.settings_page.change_pagesize("30")
self.settings_page.change_loglines("50")
settings_page.change_language("es")
self.assertTrue(
settings_page.find_message_and_dismiss(messages.SUCCESS))
self.assertFalse(
settings_page.find_message_and_dismiss(messages.ERROR))
settings_page.change_timezone("Asia/Jerusalem")
self.assertTrue(
settings_page.find_message_and_dismiss(messages.SUCCESS))
self.assertFalse(
settings_page.find_message_and_dismiss(messages.ERROR))
settings_page.change_pagesize("30")
self.assertTrue(
settings_page.find_message_and_dismiss(messages.SUCCESS))
self.assertFalse(
settings_page.find_message_and_dismiss(messages.ERROR))
settings_page.change_loglines("50")
self.assertTrue(
settings_page.find_message_and_dismiss(messages.SUCCESS))
self.assertFalse(
settings_page.find_message_and_dismiss(messages.ERROR))
changed_settings = {"language": "es", "timezone": "Asia/Jerusalem",
"pagesize": "30", "loglines": "50"}
self.verify_user_settings_change(changed_settings)
self.verify_user_settings_change(settings_page, changed_settings)
self.settings_page.return_to_default_settings()
self.verify_user_settings_change(self.settings_page.DEFAULT_SETTINGS)
settings_page.return_to_default_settings()
self.verify_user_settings_change(settings_page,
settings_page.DEFAULT_SETTINGS)