URL: https://github.com/freeipa/freeipa/pull/1868 Author: Rezney Title: #1868: [Backport][ipa-4-6] WebUI tests: Extend netgroup tests with more scenarios Action: opened
PR body: """ This PR was opened automatically because PR #1839 was pushed to master and backport to ipa-4-6 is required. """ To pull the PR as Git branch: git remote add ghfreeipa https://github.com/freeipa/freeipa git fetch ghfreeipa pull/1868/head:pr1868 git checkout pr1868
From 41f8788199fc904d7c22b8334da58280b6c26b3d Mon Sep 17 00:00:00 2001 From: Varun Mylaraiah <mva...@redhat.com> Date: Wed, 18 Apr 2018 17:29:17 +0530 Subject: [PATCH] WebUI tests: Extend netgroup tests with more scenarios Extended webui group automation test with below scenarios Scenarios *add netgroup with invalid names *add and delete records in various scenarios *verify button's action in various scenarios. https://pagure.io/freeipa/issue/7505 Signed-off-by: Varun Mylaraiah <mva...@redhat.com> --- ipatests/test_webui/data_netgroup.py | 59 ++++++++ ipatests/test_webui/test_netgroup.py | 281 +++++++++++++++++++++++++++++++++++ ipatests/test_webui/ui_driver.py | 9 +- 3 files changed, 347 insertions(+), 2 deletions(-) diff --git a/ipatests/test_webui/data_netgroup.py b/ipatests/test_webui/data_netgroup.py index 8484ba9e14..71feaccc9e 100644 --- a/ipatests/test_webui/data_netgroup.py +++ b/ipatests/test_webui/data_netgroup.py @@ -41,3 +41,62 @@ ('textarea', 'description', 'test-netgroup2 desc modified'), ], } + +PKEY3 = 'itest-netgroup3' +DATA3 = { + 'pkey': PKEY3, + 'add': [ + ('textbox', 'cn', PKEY3), + ('textarea', 'description', 'test-netgroup3 desc'), + ] +} + +PKEY4 = 'itest-netgroup4' +DATA4 = { + 'pkey': PKEY4, + 'add': [ + ('textbox', 'cn', PKEY4), + ('textarea', 'description', 'test-netgroup4 desc'), + ] +} + +PKEY5 = 'NewNetGroup' +DATA_MIXED_CASE = { + 'pkey': PKEY5, + 'add': [ + ('textbox', 'cn', PKEY5), + ('textarea', 'description', 'Trying to add mixed case netgroup name'), + ] +} + +PKEY6 = 'long-netgroup-name_{}'.format('long' * 15) +DATA_LONG_NAME = { + 'pkey': PKEY6, + 'add': [ + ('textbox', 'cn', PKEY6), + ('textarea', 'description', 'Trying to add long netgroup name'), + ] +} + +PKEY7 = 'a' +DATA_SINGLE_CHAR = { + 'pkey': PKEY7, + 'add': [ + ('textbox', 'cn', PKEY7), + ('textarea', 'description', 'Trying to add single character netgroup' + ' name'), + ] +} + +PKEY8 = 'itest-netgroup8' +DATA8 = { + 'pkey': PKEY8, + 'add': [ + ('textbox', 'cn', PKEY8), + ('textarea', 'description', 'test-netgroup8 desc'), + ], + 'mod': [ + ('textarea', 'description', 'description modified for testing buttons' + ), + ], +} diff --git a/ipatests/test_webui/test_netgroup.py b/ipatests/test_webui/test_netgroup.py index 05036366ec..bc29cfc587 100644 --- a/ipatests/test_webui/test_netgroup.py +++ b/ipatests/test_webui/test_netgroup.py @@ -30,6 +30,12 @@ from ipatests.test_webui.test_host import host_tasks, ENTITY as HOST_ENTITY import pytest +try: + from selenium.webdriver.common.keys import Keys + from selenium.webdriver.common.action_chains import ActionChains +except ImportError: + pass + @pytest.mark.tier1 class test_netgroup(UI_driver): @@ -42,6 +48,242 @@ def test_crud(self): self.init_app() self.basic_crud(netgroup.ENTITY, netgroup.DATA) + @screenshot + def test_basic_workflows(self): + """ + add and delete netgroup with various scenarios. + """ + self.init_app() + + # add mixed case netgroup name + self.add_record(netgroup.ENTITY, netgroup.DATA_MIXED_CASE) + pkey = netgroup.DATA_MIXED_CASE['pkey'].lower() + self.delete_record(pkey) + + # add long netgroup name + self.add_record(netgroup.ENTITY, netgroup.DATA_LONG_NAME, delete=True) + + # add single character netgroup name ticket#2671 + self.add_record(netgroup.ENTITY, netgroup.DATA_SINGLE_CHAR, + delete=True) + + # add netgroup using enter + self.add_record(netgroup.ENTITY, netgroup.DATA, negative=True) + actions = ActionChains(self.driver) + actions.send_keys(Keys.ENTER).perform() + self.wait_for_request() + self.assert_record(netgroup.PKEY) + self.close_notifications() + + # delete netgroup using enter + self.select_record(netgroup.PKEY) + self.facet_button_click('remove') + self.wait_for_request() + actions.send_keys(Keys.ENTER).perform() + self.wait_for_request() + self.assert_record(netgroup.PKEY, negative=True) + self.close_all_dialogs() + + # delete and cancel + self.add_record(netgroup.ENTITY, netgroup.DATA) + self.select_record(netgroup.PKEY) + self.facet_button_click('remove') + self.dialog_button_click('cancel') + self.assert_record(netgroup.PKEY) + self.select_record(netgroup.PKEY, unselect=True) + self.delete_record(netgroup.PKEY) + + # add multiple records using add_and_another button + self.add_record(netgroup.ENTITY, [netgroup.DATA, netgroup.DATA2, + netgroup.DATA3, netgroup.DATA4]) + # search record + pkey = netgroup.DATA2['pkey'] + self.search_pkey(pkey) + self.assert_record(pkey) + + # Negative search + pkey = netgroup.DATA_MIXED_CASE['pkey'] + self.search_pkey(pkey) + self.assert_record(pkey, negative=True) + + # delete multiple records + records = [netgroup.DATA, netgroup.DATA2, netgroup.DATA3] + self.navigate_to_entity(netgroup.ENTITY) + self.select_multiple_records(records) + self.facet_button_click('remove') + self.dialog_button_click('ok') + + # Find and delete + pkey = netgroup.DATA4['pkey'] + self.search_pkey(pkey) + self.select_record(pkey) + self.facet_button_click('remove') + self.dialog_button_click('ok') + + def search_pkey(self, pkey): + search_field_s = '.search-filter input[name=filter]' + self.fill_text(search_field_s, pkey) + self.action_button_click('find', parent=None) + self.wait_for_request(n=2) + + @screenshot + def test_add_netgroup_negative(self): + """ + Negative test for adding netgroup + """ + self.init_app() + + # add then cancel + self.add_record(netgroup.ENTITY, netgroup.DATA, dialog_btn='cancel') + + # add duplicate + self.add_record(netgroup.ENTITY, netgroup.DATA) + expected_error = 'group with name "%s" already exists' % netgroup.PKEY + self.navigate_to_entity(netgroup.ENTITY) + self.facet_button_click('add') + self.fill_input('cn', netgroup.PKEY) + self.cancel_retry_dialog(expected_error) + self.delete_record(netgroup.PKEY) + + # empty netgroup + self.navigate_to_entity(netgroup.ENTITY) + self.facet_button_click('add') + self.dialog_button_click('add') + elem = self.find(".widget[name='cn']") + self.assert_field_validation_required(elem) + self.dialog_button_click('cancel') + + # invalid_group_name + expected_error = 'may only include letters, numbers, _, -, and .' + pkey = ';test-gr@up' + self.navigate_to_entity(netgroup.ENTITY) + self.facet_button_click('add') + self.fill_input('cn', pkey) + elem = self.find(".widget[name='cn']") + self.assert_field_validation(expected_error, parent=elem) + self.dialog_button_click('cancel') + + def cancel_retry_dialog(self, expected_error): + self.dialog_button_click('add') + dialog = self.get_last_error_dialog() + assert (expected_error in dialog.text) + self.wait_for_request() + # Key press for Retry + actions = ActionChains(self.driver) + actions.send_keys(Keys.ENTER).perform() + self.wait_for_request(n=2) + self.dialog_button_click('cancel') + self.wait_for_request(n=2) + self.dialog_button_click('cancel') + + @screenshot + def test_unsaved_changes(self): + """ + verifying unsaved changes dialog ticket#2075 + """ + self.init_app() + self.add_record(netgroup.ENTITY, netgroup.DATA8, + dialog_btn='add_and_edit') + mod_description = (netgroup.DATA8['mod'][0][2]) + + # verifying Cancel button + self.fill_fields(netgroup.DATA8['mod']) + self.click_on_link('Netgroups') + self.assert_dialog() + self.dialog_button_click('cancel') + self.assert_facet_button_enabled('save') + + # verifying Revert button + self.click_on_link('Netgroups') + self.assert_dialog() + self.dialog_button_click('revert') + self.navigate_to_record(netgroup.PKEY8) + self.verify_btn_action(mod_description) + + # verifying Save button + self.fill_fields(netgroup.DATA8['mod']) + self.click_on_link('Netgroups') + self.assert_dialog() + self.dialog_button_click('save') + self.navigate_to_record(netgroup.PKEY8) + self.verify_btn_action(mod_description, negative=True) + + @screenshot + def test_add_and_edit_group(self): + """ + 1. add and switch to edit mode + 2. verifying Save, Revert, Refresh and Undo button + """ + self.init_app() + + # add and edit record + self.add_record(netgroup.ENTITY, netgroup.DATA8, + dialog_btn='add_and_edit') + mod_description = (netgroup.DATA8['mod'][0][2]) + + # verifying undo button + self.fill_fields(netgroup.DATA8['mod']) + self.undo_click() + self.verify_btn_action(mod_description) + self.wait_for_request(n=2) + + # verifying revert button + self.mod_record(netgroup.ENTITY, netgroup.DATA8, facet_btn='revert') + self.wait_for_request() + self.verify_btn_action(mod_description) + self.wait_for_request(n=2) + + # verifying refresh button + self.fill_fields(netgroup.DATA8['mod'], undo=True) + self.facet_button_click('refresh') + self.verify_btn_action(mod_description) + self.wait_for_request(n=2) + + # verifying Save button + self.mod_record(netgroup.ENTITY, netgroup.DATA8) + self.wait_for_request() + self.verify_btn_action(mod_description, negative=True) + self.wait_for_request(n=2) + + # clean up + self.navigate_to_entity(netgroup.ENTITY) + self.delete_record(netgroup.PKEY8) + + def undo_click(self): + facet = self.get_facet() + s = ".textarea-widget button[name='undo']" + self._button_click(s, facet) + + def verify_btn_action(self, mod_description, negative=False): + """ + camparing current description with modified description + """ + current_description = self.get_field_value("description", + element="textarea") + if negative: + assert current_description == mod_description + else: + assert current_description != mod_description + + @screenshot + def test_add_members(self): + """ + Adding members and membersof + """ + self.init_app() + + records = [netgroup.DATA, netgroup.DATA2, netgroup.DATA3, + netgroup.DATA4, netgroup.DATA8] + self.add_record(netgroup.ENTITY, records) + # adding netgroup "members" + self.navigate_to_record(netgroup.PKEY2) + self.add_associations([netgroup.PKEY3, netgroup.PKEY4], + 'member_netgroup', delete=True, search=True) + # adding netgroup "memberof" + self.add_associations([netgroup.PKEY, netgroup.PKEY8], + 'memberof_netgroup', delete=True) + self.delete(netgroup.ENTITY, records) + @screenshot def test_mod(self): """ @@ -78,6 +320,45 @@ def test_mod(self): self.mod_rule_tables(tables, categories, []) + # add associations then cancel + def get_t_vals(t): + table = t[0] + k = t[1] + e = [] + if len(t) > 2: + e = t[2] + return table, k, e + + for t in tables: + table, keys, _exts = get_t_vals(t) + self.add_table_associations(table, [keys[0]], negative=True) + + # verifying members listed as links ticket#2670 + self.add_table_associations(table, [keys[0]]) + self.wait_for_request(n=2) + self.navigate_to_record(keys[0], table_name=table) + page_pkey = self.get_text('.facet-pkey') + assert keys[0] in page_pkey + self.navigate_to_record(netgroup.PKEY, entity=netgroup.ENTITY) + + for cat in categories: + # verifying undo on memberships + self.check_option(cat, 'all') + self.assert_facet_button_enabled('save', enabled=True) + undo = "div[name = %s] > button[name='undo']" % cat + self._button_click(undo, parent=None) + self.assert_facet_button_enabled('save', enabled=False) + + # verifying Revert on memberships + self.check_option(cat, 'all') + self.facet_button_click('revert') + self.assert_facet_button_enabled('save', enabled=False) + + # verifying refresh on memberships + self.check_option(cat, 'all') + self.facet_button_click('refresh') + self.assert_facet_button_enabled('save', enabled=False) + # cleanup # ------- self.delete(netgroup.ENTITY, [netgroup.DATA, netgroup.DATA2]) diff --git a/ipatests/test_webui/ui_driver.py b/ipatests/test_webui/ui_driver.py index 70fe570352..2244bb1359 100644 --- a/ipatests/test_webui/ui_driver.py +++ b/ipatests/test_webui/ui_driver.py @@ -1540,7 +1540,7 @@ def delete_associations( self.assert_record(key, negative=True) def add_table_associations(self, table_name, pkeys, parent=False, - delete=False): + delete=False, negative=False): """ Add value to table (association|rule|...) """ @@ -1560,7 +1560,12 @@ def add_table_associations(self, table_name, pkeys, parent=False, self.button_click('add') self.wait() - self.dialog_button_click('add') + if negative: + self.dialog_button_click('cancel') + self.assert_record(key, parent, table_name, negative=True) + return + else: + self.dialog_button_click('add') self.wait_for_request(n=2) for key in pkeys:
_______________________________________________ FreeIPA-devel mailing list -- freeipa-devel@lists.fedorahosted.org To unsubscribe send an email to freeipa-devel-le...@lists.fedorahosted.org