URL: https://github.com/freeipa/freeipa/pull/1740 Author: Rezney Title: #1740: test_webui: user life-cycles Action: opened
PR body: """ Add user life-cycles test cases. https://pagure.io/freeipa/issue/7463 """ To pull the PR as Git branch: git remote add ghfreeipa https://github.com/freeipa/freeipa git fetch ghfreeipa pull/1740/head:pr1740 git checkout pr1740
From da41318adea1ab733b4eaf0dd6a866d7e2f0552c Mon Sep 17 00:00:00 2001 From: Michal Reznik <mrez...@redhat.com> Date: Mon, 26 Mar 2018 12:32:29 +0200 Subject: [PATCH 1/3] test_webui: add user life-cycles tests Add user life-cycles test cases. https://pagure.io/freeipa/issue/7463 --- ipatests/test_webui/test_user.py | 100 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) diff --git a/ipatests/test_webui/test_user.py b/ipatests/test_webui/test_user.py index bf3d359408..7a1f7a47a2 100644 --- a/ipatests/test_webui/test_user.py +++ b/ipatests/test_webui/test_user.py @@ -37,6 +37,10 @@ pass +USR_EXIST = 'user with name "{}" already exists' +ENTRY_EXIST = 'This entry already exists' +ACTIVE_ERR = 'active user with name "{}" already exists' + @pytest.mark.tier1 class user_tasks(UI_driver): def load_file(self, path): @@ -408,3 +412,99 @@ def test_noprivate_gidnumber(self): self.add_record(user.ENTITY, user.DATA4, combobox_input='gidnumber') self.delete(user.ENTITY, [user.DATA4]) + +@pytest.mark.tier1 +class TestLifeCycles(UI_driver): + + def test_life_cycles(self): + """ + Test user life-cycles + """ + + self.init_app() + + # create "itest-user" and send him to preserved + self.add_record(user.ENTITY, user.DATA) + self.delete_record(user.DATA.get('pkey'), confirm_btn=None) + self.check_option('preserve', value='true') + self.dialog_button_click('ok') + + # try to add the same user again (should fail) + self.add_record(user.ENTITY, user.DATA, assert_on=False) + err_dialog_txt = self.get_last_error_dialog().text + assert USR_EXIST.format(user.DATA.get('pkey')) in err_dialog_txt + self.close_all_dialogs() + self.wait() + + # restore "itest-user" user + self.switch_to_facet('search_preserved') + self.select_record(user.DATA.get('pkey')) + self.button_click('undel') + self.dialog_button_click('ok') + self.assert_no_error_dialog() + self.assert_notification(assert_text='1 user(s) restored') + self.wait() + + # add already existing user "itest-user" to stage and try to activate + # the latter (should fail) + self.add_record('stageuser', user.DATA) + self.select_record(user.DATA.get('pkey')) + self.button_click('activate') + self.dialog_button_click('ok') + + err_msg = ACTIVE_ERR.format(user.DATA.get('pkey')) + self.assert_last_dialog_details(err_msg) + self.dialog_button_click('ok') + + # delete "itest-user" staged user + self.delete_record(user.DATA.get('pkey')) + self.assert_record(user.DATA.get('pkey'), negative=True) + + # add "itest-user2" and send him to staged (through preserved) + self.close_all_dialogs() + self.add_record(user.ENTITY, user.DATA2) + self.delete_record(user.DATA2.get('pkey'), confirm_btn=None) + self.check_option('preserve', value='true') + self.dialog_button_click('ok') + + self.switch_to_facet('search_preserved') + self.select_record(user.DATA2.get('pkey')) + self.button_click('batch_stage') + self.dialog_button_click('ok') + self.assert_no_error_dialog() + self.wait(0.7) + self.assert_notification(assert_text='1 users(s) staged') + + # add new "itest-user2" - one is already staged (should pass) + self.add_record(user.ENTITY, user.DATA2) + self.assert_record(user.DATA2.get('pkey')) + + # send active "itest-user2" to preserved + self.delete_record(user.DATA2.get('pkey'), confirm_btn=None) + self.check_option('preserve', value='true') + self.dialog_button_click('ok') + + # try to activate staged "itest-user2" while one is already preserved + # (should fail) + self.navigate_to_entity('stageuser') + self.select_record(user.DATA2.get('pkey')) + self.button_click('activate') + self.dialog_button_click('ok') + self.assert_last_dialog_details(ENTRY_EXIST) + self.dialog_button_click('ok') + + # delete preserved "itest-user2" and activate the staged one + # (should pass) + self.switch_to_facet('search_preserved') + self.delete_record(user.DATA2.get('pkey')) + + self.navigate_to_entity('stageuser') + self.select_record(user.DATA2.get('pkey')) + self.button_click('activate') + self.wait() + self.dialog_button_click('ok') + + # cleanup + self.navigate_to_entity('user') + self.delete_record(user.DATA2.get('pkey')) + self.delete_record(user.DATA.get('pkey')) From 000839ac85a0c67bd4f4e8d28f5a5ae0fa6ce7a8 Mon Sep 17 00:00:00 2001 From: Michal Reznik <mrez...@redhat.com> Date: Mon, 26 Mar 2018 12:34:25 +0200 Subject: [PATCH 2/3] test_web_ui: extend ui_driver methods Add close_all_dialogs(), assert_last_dialog_details() methods and tweak add_record() method to skip asserts so we can assert later. https://pagure.io/freeipa/issue/7463 --- ipatests/test_webui/ui_driver.py | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/ipatests/test_webui/ui_driver.py b/ipatests/test_webui/ui_driver.py index 6b42218be1..e17809f5d7 100644 --- a/ipatests/test_webui/ui_driver.py +++ b/ipatests/test_webui/ui_driver.py @@ -727,6 +727,20 @@ def close_notifications(self): else: break + def close_all_dialogs(self): + """ + Close all currently opened dialogs + """ + self.wait() + while True: + s = ".modal.fade.in .modal-header button.close" + btn = self.find(s, By.CSS_SELECTOR) + if btn: + btn.click() + self.wait(0.5) + else: + break + def get_form(self): """ Get last dialog or visible facet @@ -1241,6 +1255,8 @@ def find_record(self, entity, data, facet='search', dummy='XXXXXXX'): def add_record(self, entity, data, facet='search', facet_btn='add', dialog_btn='add', delete=False, pre_delete=True, dialog_name='add', navigate=True, combobox_input=None): + dialog_name='add', navigate=True, combobox_input=None, + assert_on=True): """ Add records. @@ -1289,6 +1305,9 @@ def add_record(self, entity, data, facet='search', facet_btn='add', self.dialog_button_click('ok') self.wait_for_request() + if not assert_on: + return + # check for error self.assert_no_error_dialog() self.wait_for_request() @@ -1969,3 +1988,19 @@ def assert_notification(self, type='success', assert_text=None): assert is_present, "Notification not present" if assert_text: assert assert_text in is_present.text + + def assert_last_dialog_details(self, text_tba): + """ + Assert clickable "Show details" paragraph text of last opened dialog + """ + + err_dialog = self.get_last_error_dialog() + + # open "Show details" paragraph + s = 'a[title="Show details"]' + details = self.find(s, By.CSS_SELECTOR) + details.click() + + s = 'ul li p' + err_msg = self.find(s, By.CSS_SELECTOR, context=err_dialog).text + assert text_tba in err_msg From 785fb48a5d9a5cf4974f4b2a4fc262fe175c7a68 Mon Sep 17 00:00:00 2001 From: Michal Reznik <mrez...@redhat.com> Date: Mon, 26 Mar 2018 13:21:08 +0200 Subject: [PATCH 3/3] temp commit: activate WebUI tests --- .freeipa-pr-ci.yaml | 158 +++------------------------------------------------- 1 file changed, 9 insertions(+), 149 deletions(-) diff --git a/.freeipa-pr-ci.yaml b/.freeipa-pr-ci.yaml index c95bef79e2..7de92aab11 100644 --- a/.freeipa-pr-ci.yaml +++ b/.freeipa-pr-ci.yaml @@ -3,6 +3,10 @@ topologies: name: build cpu: 2 memory: 3800 + ipaserver: &ipaserver + name: ipaserver + cpu: 1 + memory: 2400 master_1repl: &master_1repl name: master_1repl cpu: 4 @@ -27,158 +31,14 @@ jobs: timeout: 1800 topology: *build - fedora-27/simple_replication: + fedora-27/test_webui: requires: [fedora-27/build] priority: 50 job: - class: RunPytest + class: RunWebuiTests args: build_url: '{fedora-27/build_url}' - test_suite: test_integration/test_simple_replication.py + test_suite: test_webui template: *ci-master-f27 - timeout: 3600 - topology: *master_1repl - - fedora-27/caless: - requires: [fedora-27/build] - priority: 50 - job: - class: RunPytest - args: - build_url: '{fedora-27/build_url}' - test_suite: test_integration/test_caless.py::TestServerReplicaCALessToCAFull - template: *ci-master-f27 - timeout: 3600 - topology: *master_1repl - - fedora-27/external_ca: - requires: [fedora-27/build] - priority: 50 - job: - class: RunPytest - args: - build_url: '{fedora-27/build_url}' - test_suite: test_integration/test_external_ca.py - template: *ci-master-f27 - timeout: 3600 - topology: *master_1repl - - fedora-27/test_topologies: - requires: [fedora-27/build] - priority: 50 - job: - class: RunPytest - args: - build_url: '{fedora-27/build_url}' - test_suite: test_integration/test_topologies.py - template: *ci-master-f27 - timeout: 3600 - topology: *master_1repl - - fedora-27/test_sudo: - requires: [fedora-27/build] - priority: 50 - job: - class: RunPytest - args: - build_url: '{fedora-27/build_url}' - test_suite: test_integration/test_sudo.py - template: *ci-master-f27 - timeout: 3600 - topology: *master_1repl_1client - - fedora-27/test_kerberos_flags: - requires: [fedora-27/build] - priority: 50 - job: - class: RunPytest - args: - build_url: '{fedora-27/build_url}' - test_suite: test_integration/test_kerberos_flags.py - template: *ci-master-f27 - timeout: 3600 - topology: *master_1repl_1client - - fedora-27/test_http_kdc_proxy: - requires: [fedora-27/build] - priority: 50 - job: - class: RunPytest - args: - build_url: '{fedora-27/build_url}' - test_suite: test_integration/test_http_kdc_proxy.py - template: *ci-master-f27 - timeout: 3600 - topology: *master_1repl_1client - - fedora-27/test_forced_client_enrolment: - requires: [fedora-27/build] - priority: 50 - job: - class: RunPytest - args: - build_url: '{fedora-27/build_url}' - test_suite: test_integration/test_forced_client_reenrollment.py - template: *ci-master-f27 - timeout: 3600 - topology: *master_1repl_1client - - fedora-27/test_advise: - requires: [fedora-27/build] - priority: 50 - job: - class: RunPytest - args: - build_url: '{fedora-27/build_url}' - test_suite: test_integration/test_advise.py - template: *ci-master-f27 - timeout: 3600 - topology: *master_1repl - - fedora-27/test_testconfig: - requires: [fedora-27/build] - priority: 50 - job: - class: RunPytest - args: - build_url: '{fedora-27/build_url}' - test_suite: test_integration/test_testconfig.py - template: *ci-master-f27 - timeout: 3600 - topology: *master_1repl - - fedora-27/test_service_permissions: - requires: [fedora-27/build] - priority: 50 - job: - class: RunPytest - args: - build_url: '{fedora-27/build_url}' - test_suite: test_integration/test_service_permissions.py - template: *ci-master-f27 - timeout: 3600 - topology: *master_1repl - - fedora-27/test_netgroup: - requires: [fedora-27/build] - priority: 50 - job: - class: RunPytest - args: - build_url: '{fedora-27/build_url}' - test_suite: test_integration/test_netgroup.py - template: *ci-master-f27 - timeout: 3600 - topology: *master_1repl - - fedora-27/test_vault: - requires: [fedora-27/build] - priority: 50 - job: - class: RunPytest - args: - build_url: '{fedora-27/build_url}' - test_suite: test_integration/test_vault.py - template: *ci-master-f27 - timeout: 3600 - topology: *master_1repl + timeout: 7200 + topology: *ipaserver
_______________________________________________ FreeIPA-devel mailing list -- freeipa-devel@lists.fedorahosted.org To unsubscribe send an email to freeipa-devel-le...@lists.fedorahosted.org