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:
parent
600986c204
commit
edcfca1ab2
openstack_dashboard/test/integration_tests
@ -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)
|
||||
|
Loading…
x
Reference in New Issue
Block a user