diff --git a/ipatests/test_webui/data_hostgroup.py b/ipatests/test_webui/data_hostgroup.py index 9b8740429..8946a9892 100644 --- a/ipatests/test_webui/data_hostgroup.py +++ b/ipatests/test_webui/data_hostgroup.py @@ -20,6 +20,15 @@ ENTITY = 'hostgroup' DEFAULT_FACET = 'member_host' +LEADING_SPACE = ' leading-space' +TRAILING_SPACE = 'trailign-space ' +NAME_SPACE = 'name space' + +CHAR_WARNING_MSG = "may only include letters, numbers, _, -, and ." +EMPTY_WARNING_MSG = "Required field" +DUPLICATE_WARNING_MSG = 'already exists' +DESCRIPTION_ERROR_DIALOG = 'Leading and trailing spaces are not allowed' + PKEY = 'itest-hostgroup' DATA = { 'pkey': PKEY, @@ -79,3 +88,31 @@ DATA5 = { ('textarea', 'description', 'test-hostgroup5 desc modified'), ], } + +PKEY6 = 'ITEST-HOSTGROUP6' +DATA6 = { + 'pkey': PKEY6, + 'add': [ + ('textbox', 'cn', PKEY6), + ('textarea', 'description', 'TEST-HOSTGROUP6 DESC'), + ], +} + +PKEY7 = 'Itest-hostGROUP7' +DATA7 = { + 'pkey': PKEY7, + 'add': [ + ('textbox', 'cn', PKEY7), + ('textarea', 'description', 'TesT-HosTGroUP7 DESC'), + ], +} + +PKEY8 = 16 * 'long-name-hostgroup8' +DKEY8 = 16 * 'long hostgroup description' +DATA8 = { + 'pkey': PKEY8, + 'add': [ + ('textbox', 'cn', PKEY8), + ('textarea', 'description', DKEY8), + ], +} diff --git a/ipatests/test_webui/test_hostgroup.py b/ipatests/test_webui/test_hostgroup.py index 9b10de276..565598615 100644 --- a/ipatests/test_webui/test_hostgroup.py +++ b/ipatests/test_webui/test_hostgroup.py @@ -31,6 +31,15 @@ import ipatests.test_webui.data_sudo as sudo import pytest +def check_invalid_names(self, names, error_link): + self.navigate_to_entity(hostgroup.ENTITY) + for name in names: + self.button_click(name='add') + self.fill_input('cn', name) + text_warning = self.get_text('.help-block', parent=self.get_dialog()) + assert text_warning in error_link + self.dialog_button_click(name='cancel') + @pytest.mark.tier1 class test_hostgroup(UI_driver): @@ -142,7 +151,108 @@ class test_hostgroup(UI_driver): ## cleanup ## ------- self.delete(hostgroup.ENTITY, [hostgroup.DATA, hostgroup.DATA2, - hostgroup.DATA3, hostgroup.DATA4, hostgroup.DATA5]) + hostgroup.DATA3, hostgroup.DATA4, + hostgroup.DATA5]) self.delete(HOST_ENTITY, [host.data2]) self.delete(hbac.RULE_ENTITY, [hbac.RULE_DATA]) self.delete(sudo.RULE_ENTITY, [sudo.RULE_DATA]) + + def test_names_and_button(self): + """ + Hostgroup names and buttons + """ + self.init_app() + host = host_tasks() + host.setup(self.driver, self.config) + + self.add_record(hostgroup.ENTITY, hostgroup.DATA6) + self.add_record(hostgroup.ENTITY, hostgroup.DATA7, navigate=False) + self.add_record(hostgroup.ENTITY, hostgroup.DATA8, navigate=False) + + # test invalid names + invalid_names = [hostgroup.LEADING_SPACE, + hostgroup.TRAILING_SPACE, + hostgroup.NAME_SPACE] + check_invalid_names(self, invalid_names, hostgroup.CHAR_WARNING_MSG) + + invalid_names = [hostgroup.PKEY6] + check_invalid_names(self, invalid_names, + hostgroup.DUPLICATE_WARNING_MSG) + + # test invalid description + self.button_click(name='add') + self.fill_input('cn', hostgroup.PKEY) + self.fill_textarea('description', hostgroup.LEADING_SPACE) + self.dialog_button_click('add') + assert hostgroup.DESCRIPTION_ERROR_DIALOG in \ + self.get_last_error_dialog().text + self.dialog_button_click('cancel') + self.wait() + + self.fill_textarea('description', hostgroup.TRAILING_SPACE) + self.dialog_button_click('add') + assert hostgroup.DESCRIPTION_ERROR_DIALOG in \ + self.get_last_error_dialog().text + self.dialog_button_click('cancel') + self.dialog_button_click('cancel') + + # duplicate + self.button_click(name='add') + self.fill_input('cn', hostgroup.PKEY6) + self.dialog_button_click('add') + assert hostgroup.DUPLICATE_WARNING_MSG in \ + self.get_last_error_dialog().text + self.dialog_button_click('cancel') + self.dialog_button_click('cancel') + + self.button_click(name='add') + self.fill_input('cn', "") + self.dialog_button_click('add') + text_warning = self.get_text('.help-block', parent=self.get_dialog()) + assert text_warning in hostgroup.EMPTY_WARNING_MSG + self.dialog_button_click(name='cancel') + + # test buttons + self.button_click('add') + self.fill_input('cn', hostgroup.DATA['pkey']) + self.dialog_button_click(name='add_and_add_another') + self.wait_for_request(n=3) + + self.fill_input('cn', hostgroup.DATA2['pkey']) + self.dialog_button_click(name='add_and_edit') + self.wait_for_request(n=4) + + self.navigate_to_entity(hostgroup.ENTITY) + self.button_click('add') + self.fill_input('cn', hostgroup.DATA['pkey']) + self.dialog_button_click('cancel') + + self.select_record(hostgroup.PKEY) + self.button_click('remove') + self.dialog_button_click('cancel') + self.wait() + self.select_record(hostgroup.PKEY, unselect=True) + + # test to rewrite invalid input_type + self.button_click('add') + self.fill_input('cn', hostgroup.LEADING_SPACE) + self.fill_input('cn', hostgroup.PKEY3) + self.dialog_button_click('add') + self.wait_for_request(n=3) + + self.button_click('add') + self.fill_input('cn', hostgroup.TRAILING_SPACE) + self.fill_input('cn', hostgroup.PKEY4) + self.dialog_button_click('add') + self.wait_for_request(n=3) + + # multiple delete clean up + self.select_record(hostgroup.PKEY6.lower()) + self.select_record(hostgroup.PKEY7.lower()) + self.button_click('remove') + self.dialog_button_click('ok') + + # clean up + self.delete(hostgroup.ENTITY, [hostgroup.DATA, hostgroup.DATA2, + hostgroup.DATA3, hostgroup.DATA4, + hostgroup.DATA8]) diff --git a/ipatests/test_webui/ui_driver.py b/ipatests/test_webui/ui_driver.py index 6b42218be..ad0a7893b 100644 --- a/ipatests/test_webui/ui_driver.py +++ b/ipatests/test_webui/ui_driver.py @@ -1009,7 +1009,8 @@ class UI_driver(object): s += '.table' return s - def select_record(self, pkey, parent=None, table_name=None): + def select_record(self, pkey, parent=None, + table_name=None, unselect=False): """ Select record with given pkey in search table. """ @@ -1025,8 +1026,13 @@ class UI_driver(object): except WebDriverException as e: assert False, 'Can\'t click on checkbox label: %s \n%s' % (s, e) self.wait() - assert checkbox.is_selected(), 'Record was not checked: %s' % input_s - self.wait() + if unselect: + assert checkbox.is_selected() is not True + self.wait() + else: + assert checkbox.is_selected(), \ + 'Record was not checked: %s' % input_s + self.wait() def get_record_value(self, pkey, column, parent=None, table_name=None): """