diff --git a/sahara_dashboard/test/integration_tests/pages/project/data_processing/imageregistrypage.py b/sahara_dashboard/test/integration_tests/pages/project/data_processing/imageregistrypage.py index de40f033..49fb6cb3 100644 --- a/sahara_dashboard/test/integration_tests/pages/project/data_processing/imageregistrypage.py +++ b/sahara_dashboard/test/integration_tests/pages/project/data_processing/imageregistrypage.py @@ -10,32 +10,31 @@ # License for the specific language governing permissions and limitations # under the License. -from selenium.webdriver.common import by - from openstack_dashboard.test.integration_tests.pages import basepage from openstack_dashboard.test.integration_tests.regions import forms from openstack_dashboard.test.integration_tests.regions import tables +class ImageRegistryTable(tables.TableRegion): + name = "image_registry" + REGISTER_FORM_FIELDS = ('image_id', 'user_name', 'description') + + @tables.bind_table_action('register') + def register_image(self, register_button): + register_button.click() + return forms.FormRegion(self.driver, self.conf, + field_mappings=self.REGISTER_FORM_FIELDS) + + @tables.bind_table_action('unregister') + def unregister_image(self, unregister_button): + unregister_button.click() + return forms.BaseFormRegion(self.driver, self.conf) + + class ImageregistryPage(basepage.BaseNavigationPage): - _unregister_form_locator = (by.By.CSS_SELECTOR, 'div.modal-dialog') - _register_form_locator = (by.By.CSS_SELECTOR, 'div.modal-dialog') - - IMAGE_TABLE_NAME = "image_registry" - IMAGE_TABLE_ACTIONS = ("register", "unregister") - IMAGE_TABLE_ROW_ACTIONS = { - tables.ComplexActionRowRegion.PRIMARY_ACTION: "edit_tags", - tables.ComplexActionRowRegion.SECONDARY_ACTIONS: ("unregister_image",) - } TABLE_IMAGE_COLUMN = 'name' - REGISTER_FORM_IMAGE = "image_id" - REGISTER_FORM_USER_NAME = "user_name" - REGISTER_FORM_DESCRIPTION = "description" - REGISTER_FORM_FIELDS = (REGISTER_FORM_IMAGE, REGISTER_FORM_USER_NAME, - REGISTER_FORM_DESCRIPTION) - def __init__(self, driver, conf): super(ImageregistryPage, self).__init__(driver, conf) self._page_title = "Data Processing" @@ -45,38 +44,22 @@ class ImageregistryPage(basepage.BaseNavigationPage): @property def image_table(self): - return tables.ComplexActionTableRegion(self.driver, self.conf, - self.IMAGE_TABLE_NAME, - self.IMAGE_TABLE_ACTIONS, - self.IMAGE_TABLE_ROW_ACTIONS) - - @property - def unregister_form(self): - src_elem = self._get_element(*self._unregister_form_locator) - return forms.BaseFormRegion(self.driver, self.conf, src_elem) - - @property - def register_form(self): - src_elem = self._get_element(*self._register_form_locator) - return forms.FormRegion(self.driver, self.conf, src_elem, - self.REGISTER_FORM_FIELDS) + return ImageRegistryTable(self.driver, self.conf) def is_image_registered(self, name): return bool(self._get_row_with_image_name(name)) def unregister_image(self, name): self._get_row_with_image_name(name).mark() - self.image_table.unregister.click() - self.unregister_form.submit.click() - self.wait_till_popups_disappear() + unregister_form = self.image_table.unregister_image() + unregister_form.submit() def register_image(self, image, user_name, description): - self.image_table.register.click() - self.register_form.image_id.text = image - self.register_form.user_name.text = user_name - self.register_form.description.text = description - self.register_form.submit.click() - self.wait_till_popups_disappear() + register_form = self.image_table.register_image() + register_form.image_id.text = image + register_form.user_name.text = user_name + register_form.description.text = description + register_form.submit() def wait_until_image_registered(self, name): self._wait_until(lambda x: self.is_image_registered(name)) diff --git a/sahara_dashboard/test/integration_tests/pages/project/data_processing/jobbinariespage.py b/sahara_dashboard/test/integration_tests/pages/project/data_processing/jobbinariespage.py index 114ed5e7..c4effcf6 100644 --- a/sahara_dashboard/test/integration_tests/pages/project/data_processing/jobbinariespage.py +++ b/sahara_dashboard/test/integration_tests/pages/project/data_processing/jobbinariespage.py @@ -10,57 +10,43 @@ # License for the specific language governing permissions and limitations # under the License. -from selenium.webdriver.common import by - from openstack_dashboard.test.integration_tests.pages import basepage from openstack_dashboard.test.integration_tests.regions import forms from openstack_dashboard.test.integration_tests.regions import tables -class JobbinariesPage(basepage.BaseNavigationPage): - - _create_job_binary_form_locator = (by.By.CSS_SELECTOR, 'div.modal-dialog') - _confirm_job_binary_deletion_form =\ - (by.By.CSS_SELECTOR, 'div.modal-dialog') - - JOB_BINARIES_TABLE_NAME = "job_binaries" - JOB_BINARIES_TABLE_ACTIONS = ("create", "delete") - JOB_BINARIES_ROW_ACTIONS = { - tables.ComplexActionRowRegion.PRIMARY_ACTION: "delete_job_binary", - tables.ComplexActionRowRegion.SECONDARY_ACTIONS: - ("download_job_binary",) +class JobBinariesTable(tables.TableRegion): + name = 'job_binaries' + CREATE_BINARY_FORM_FIELDS = { + "name": "job_binary_name", + "type": "job_binary_type", + "url": "job_binary_url", + "internal": "job_binary_internal", + "file": "job_binary_file", + "script_name": "job_binary_script_name", + "script": "job_binary_script", + "username": "job_binary_username", + "password": "job_binary_password", + "description": "job_binary_description" } - BINARY_NAME = "job_binary_name" - BINARY_STORAGE_TYPE = "job_binary_type" - BINARY_URL = "job_binary_url" - INTERNAL_BINARY = "job_binary_internal" - BINARY_PATH = "job_binary_file" - SCRIPT_NAME = "job_binary_script_name" - SCRIPT_TEXT = "job_binary_script" - USERNAME = "job_binary_username" - PASSWORD = "job_binary_password" - DESCRIPTION = "job_binary_description" + @tables.bind_table_action('create') + def create_job(self, create_button): + create_button.click() + return forms.FormRegion( + self.driver, self.conf, + field_mappings=self.CREATE_BINARY_FORM_FIELDS) - CREATE_BINARY_FORM_FIELDS = ( - BINARY_NAME, - BINARY_STORAGE_TYPE, - BINARY_URL, - INTERNAL_BINARY, - BINARY_PATH, - SCRIPT_NAME, - SCRIPT_TEXT, - USERNAME, - PASSWORD, - DESCRIPTION - ) + @tables.bind_table_action('delete') + def delete_job(self, delete_button): + delete_button.click() + return forms.BaseFormRegion(self.driver, self.conf) + + +class JobbinariesPage(basepage.BaseNavigationPage): - # index of name column in binary jobs table JOB_BINARIES_TABLE_NAME_COLUMN = 'name' - # fields that are set via text setter - _TEXT_FIELDS = (BINARY_NAME, BINARY_STORAGE_TYPE, INTERNAL_BINARY) - def __init__(self, driver, conf): super(JobbinariesPage, self).__init__(driver, conf) self._page_title = "Data Processing" @@ -71,35 +57,24 @@ class JobbinariesPage(basepage.BaseNavigationPage): @property def job_binaries_table(self): - return tables.ComplexActionTableRegion(self.driver, self.conf, - self.JOB_BINARIES_TABLE_NAME, - self.JOB_BINARIES_TABLE_ACTIONS, - self.JOB_BINARIES_ROW_ACTIONS) - - @property - def create_job_binary_form(self): - src_elem = self._get_element(*self._create_job_binary_form_locator) - return forms.FormRegion(self.driver, self.conf, src_elem, - self.CREATE_BINARY_FORM_FIELDS) - - @property - def confirm_delete_job_binaries_form(self): - src_elem = self._get_element(*self._confirm_job_binary_deletion_form) - return forms.BaseFormRegion(self.driver, self.conf, src_elem) + return JobBinariesTable(self.driver, self.conf) def delete_job_binary(self, name): row = self._get_row_with_job_binary_name(name) row.mark() - self.job_binaries_table.delete.click() - self.confirm_delete_job_binaries_form.submit.click() - self.wait_till_popups_disappear() + confirm_delete_form = self.job_binaries_table.delete_job() + confirm_delete_form.submit() - def create_job_binary(self, job_data): - self.job_binaries_table.create.click() + def create_job_binary(self, binary_name, script_name): + create_job_binary_form = self.job_binaries_table.create_job() - self.create_job_binary_form.set_field_values(job_data) - self.create_job_binary_form.submit.click() - self.wait_till_popups_disappear() + create_job_binary_form.name = binary_name + create_job_binary_form.type = "Internal database" + create_job_binary_form.url = "*Create a script" + create_job_binary_form.script_name = script_name + create_job_binary_form.script = "test_script_text" + create_job_binary_form.description = "test description" + create_job_binary_form.submit() def is_job_binary_present(self, name): return bool(self._get_row_with_job_binary_name(name)) diff --git a/sahara_dashboard/test/integration_tests/tests/test_sahara_image_registry.py b/sahara_dashboard/test/integration_tests/tests/test_sahara_image_registry.py index 29bbf6fd..3be06add 100644 --- a/sahara_dashboard/test/integration_tests/tests/test_sahara_image_registry.py +++ b/sahara_dashboard/test/integration_tests/tests/test_sahara_image_registry.py @@ -11,6 +11,7 @@ # under the License. from openstack_dashboard.test.integration_tests import helpers +from openstack_dashboard.test.integration_tests.regions import messages IMAGE_NAME = helpers.gen_random_resource_name("image") @@ -32,10 +33,17 @@ class TestSaharaImageRegistry(helpers.TestCase): image_reg_pg.wait_until_image_registered(IMAGE_NAME) self.assertTrue(image_reg_pg.is_image_registered(IMAGE_NAME), "Image was not registered.") - self.assertFalse(image_reg_pg.is_error_message_present(), - "Error message occurred during image creation.") + self.assertTrue( + image_reg_pg.find_message_and_dismiss(messages.SUCCESS)) + self.assertFalse( + image_reg_pg.find_message_and_dismiss(messages.ERROR), + "Error message occurred during image creation.") + image_reg_pg.unregister_image(IMAGE_NAME) - self.assertFalse(image_reg_pg.is_error_message_present()) + self.assertTrue( + image_reg_pg.find_message_and_dismiss(messages.SUCCESS)) + self.assertFalse( + image_reg_pg.find_message_and_dismiss(messages.ERROR)) self.assertFalse(image_reg_pg.is_image_registered(IMAGE_NAME), "Image was not unregistered.") diff --git a/sahara_dashboard/test/integration_tests/tests/test_sahara_job_binaries.py b/sahara_dashboard/test/integration_tests/tests/test_sahara_job_binaries.py index 41c608a6..682de57b 100644 --- a/sahara_dashboard/test/integration_tests/tests/test_sahara_job_binaries.py +++ b/sahara_dashboard/test/integration_tests/tests/test_sahara_job_binaries.py @@ -10,51 +10,32 @@ # License for the specific language governing permissions and limitations # under the License. -import collections - from openstack_dashboard.test.integration_tests import helpers -from sahara_dashboard.test.integration_tests.pages.project.data_processing \ - import jobbinariespage +from openstack_dashboard.test.integration_tests.regions import messages - -# NOTE(tsufiev): beware, ordering matters here because Sahara UI shows fields -# based on value of previous fields and for Selenium to be able to fill the -# field it's crucial that it's visible -JOB_BINARY_INTERNAL = collections.OrderedDict([ - # Size of binary name is limited to 50 characters - (jobbinariespage.JobbinariesPage.BINARY_NAME, - helpers.gen_random_resource_name(resource='jobbinary', - timestamp=False)[0:50]), - (jobbinariespage.JobbinariesPage.BINARY_STORAGE_TYPE, - "Internal database"), - (jobbinariespage.JobbinariesPage.INTERNAL_BINARY, "*Create a script"), - (jobbinariespage.JobbinariesPage.BINARY_URL, None), - (jobbinariespage.JobbinariesPage.BINARY_PATH, None), - (jobbinariespage.JobbinariesPage.SCRIPT_NAME, - helpers.gen_random_resource_name(resource='scriptname', timestamp=False)), - (jobbinariespage.JobbinariesPage.SCRIPT_TEXT, "test_script_text"), - (jobbinariespage.JobbinariesPage.USERNAME, None), - (jobbinariespage.JobbinariesPage.PASSWORD, None), - (jobbinariespage.JobbinariesPage.DESCRIPTION, "test description") -]) +# Size of binary name is limited to 50 characters +BINARY_NAME = helpers.gen_random_resource_name(resource='jobbinary', + timestamp=False)[0:50] +SCRIPT_NAME = helpers.gen_random_resource_name(resource='scriptname', + timestamp=False) class TestSaharaJobBinary(helpers.TestCase): - def _sahara_create_delete_job_binary(self, job_binary_template): - job_name = \ - job_binary_template[jobbinariespage.JobbinariesPage.BINARY_NAME] - + def _sahara_create_delete_job_binary(self, job_name): # create job binary job_binary_pg = self.home_pg.go_to_dataprocessing_jobbinariespage() self.assertFalse(job_binary_pg.is_job_binary_present(job_name), "Job binary was present in the binaries table" " before its creation.") - job_binary_pg.create_job_binary(job_binary_template) + job_binary_pg.create_job_binary(job_name, SCRIPT_NAME) # verify that job is created without problems - self.assertFalse(job_binary_pg.is_error_message_present(), - "Error message occurred during binary job creation.") + self.assertTrue( + job_binary_pg.find_message_and_dismiss(messages.SUCCESS)) + self.assertFalse( + job_binary_pg.find_message_and_dismiss(messages.ERROR), + "Error message occurred during binary job creation.") self.assertTrue(job_binary_pg.is_job_binary_present(job_name), "Job binary is not in the binaries job table after" " its creation.") @@ -63,11 +44,14 @@ class TestSaharaJobBinary(helpers.TestCase): job_binary_pg.delete_job_binary(job_name) # verify that job was successfully deleted - self.assertFalse(job_binary_pg.is_error_message_present(), - "Error message occurred during binary job deletion.") + self.assertTrue( + job_binary_pg.find_message_and_dismiss(messages.SUCCESS)) + self.assertFalse( + job_binary_pg.find_message_and_dismiss(messages.ERROR), + "Error message occurred during binary job deletion.") self.assertFalse(job_binary_pg.is_job_binary_present(job_name), "Job binary was not removed from binaries job table.") def test_sahara_create_delete_job_binary_internaldb(self): """Test the creation of a Job Binary in the Internal DB.""" - self._sahara_create_delete_job_binary(JOB_BINARY_INTERNAL) + self._sahara_create_delete_job_binary(BINARY_NAME) diff --git a/tools/gate/integration/commons b/tools/gate/integration/commons index 096c165e..13beaa9d 100644 --- a/tools/gate/integration/commons +++ b/tools/gate/integration/commons @@ -2,5 +2,4 @@ set -ex -export SAHARA_DASHBOARD_SCREENSHOTS_DIR=sahara_dashboard/.tox/py27integration/src/horizon/openstack_dashboard/test/integration_tests/integration_tests_screenshots - +export SAHARA_DASHBOARD_SCREENSHOTS_DIR=sahara_dashboard/test/integration_tests/integration_tests_screenshots