From f8907f0c4fc0ba4bb97a1d636a50c5b40c2642f2 Mon Sep 17 00:00:00 2001 From: Edan Binshtok Date: Wed, 4 Oct 2017 09:33:23 +0300 Subject: Initial seed Initial upload of django test framework Change-Id: I643a7f4efc52cfafe4cc6d92e3178f36a0c1837c Issue-Id: VVP-1 Signed-off-by: Edan Binshtok --- tests/__init__.py | 38 ++ tests/__init__.pyc | Bin 0 -> 137 bytes tests/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 133 bytes tests/apiTests/__init__.py | 38 ++ tests/apiTests/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 142 bytes .../__pycache__/test_api_base.cpython-36.pyc | Bin 0 -> 2163 bytes .../test_negative_requests.cpython-36.pyc | Bin 0 -> 8936 bytes tests/apiTests/test_api_base.py | 101 ++++ tests/apiTests/test_negative_requests.py | 271 ++++++++++ tests/signalTests/__init__.py | 38 ++ .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 145 bytes .../test_checklist_signal.cpython-36.pyc | Bin 0 -> 1392 bytes .../__pycache__/test_git_signal.cpython-36.pyc | Bin 0 -> 7892 bytes .../__pycache__/test_signal_base.cpython-36.pyc | Bin 0 -> 2218 bytes tests/signalTests/test_checklist_signal.py | 68 +++ tests/signalTests/test_git_signal.py | 320 ++++++++++++ tests/signalTests/test_signal_base.py | 103 ++++ tests/uiTests/__init__.py | 38 ++ tests/uiTests/__init__.pyc | Bin 0 -> 145 bytes tests/uiTests/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 141 bytes .../__pycache__/portalVariables.cpython-36.pyc | Bin 0 -> 301 bytes .../__pycache__/test_admin_dropdown.cpython-36.pyc | Bin 0 -> 5470 bytes .../test_admin_section.cpython-36-PYTEST.pyc | Bin 0 -> 1893 bytes .../__pycache__/test_admin_section.cpython-36.pyc | Bin 0 -> 1910 bytes .../test_checklist_validations.cpython-36.pyc | Bin 0 -> 6956 bytes ...st_cms_news_and_announcementsion.cpython-36.pyc | Bin 0 -> 5211 bytes .../test_dashboard_feature.cpython-36.pyc | Bin 0 -> 5858 bytes .../__pycache__/test_detailed_view.cpython-36.pyc | Bin 0 -> 9396 bytes .../test_edit_checklist_template.cpython-36.pyc | Bin 0 -> 3506 bytes .../__pycache__/test_export_excel.cpython-36.pyc | Bin 0 -> 1561 bytes .../__pycache__/test_feedback_modal.cpython-36.pyc | Bin 0 -> 1303 bytes ...t_invitations_and_throttle_logic.cpython-36.pyc | Bin 0 -> 4509 bytes .../__pycache__/test_left_nav_panel.cpython-36.pyc | Bin 0 -> 6075 bytes .../test_login_with_new_user.cpython-36-PYTEST.pyc | Bin 0 -> 17046 bytes .../test_login_with_new_user.cpython-36.pyc | Bin 0 -> 16051 bytes .../__pycache__/test_next_step.cpython-36.pyc | Bin 0 -> 6496 bytes .../test_next_step_validations.cpython-36.pyc | Bin 0 -> 4699 bytes .../test_notification_for_new_user.cpython-36.pyc | Bin 0 -> 2973 bytes .../test_portal_homepage.cpython-36.pyc | Bin 0 -> 946 bytes .../__pycache__/test_progress_bar.cpython-36.pyc | Bin 0 -> 2301 bytes .../test_remove_user_from_eng.cpython-36.pyc | Bin 0 -> 3793 bytes .../__pycache__/test_reset_password.cpython-36.pyc | Bin 0 -> 1872 bytes .../uiTests/__pycache__/test_sanity.cpython-36.pyc | Bin 0 -> 4685 bytes .../__pycache__/test_set_stage.cpython-36.pyc | Bin 0 -> 3807 bytes .../__pycache__/test_ssh_key.cpython-36.pyc | Bin 0 -> 2614 bytes .../__pycache__/test_ui_base.cpython-36-PYTEST.pyc | Bin 0 -> 2795 bytes .../__pycache__/test_ui_base.cpython-36.pyc | Bin 0 -> 3592 bytes .../test_user_profile_settings.cpython-36.pyc | Bin 0 -> 1962 bytes .../test_validate_signup.cpython-36.pyc | Bin 0 -> 3166 bytes tests/uiTests/geckodriver.log | 392 +++++++++++++++ tests/uiTests/test_admin_dropdown.py | 189 +++++++ tests/uiTests/test_admin_section.py | 73 +++ tests/uiTests/test_bucket_e2e.py | 140 ++++++ tests/uiTests/test_bucket_url.py | 75 +++ tests/uiTests/test_checklist_validations.py | 309 ++++++++++++ .../uiTests/test_cms_news_and_announcementsion.py | 144 ++++++ tests/uiTests/test_dashboard_feature.py | 164 +++++++ tests/uiTests/test_detailed_view.py | 292 +++++++++++ tests/uiTests/test_detailed_view.pyc | Bin 0 -> 6149 bytes tests/uiTests/test_edit_checklist_template.py | 111 +++++ tests/uiTests/test_export_excel.py | 70 +++ tests/uiTests/test_feedback_modal.py | 66 +++ .../uiTests/test_invitations_and_throttle_logic.py | 178 +++++++ tests/uiTests/test_left_nav_panel.py | 200 ++++++++ tests/uiTests/test_login_with_new_user.py | 545 +++++++++++++++++++++ tests/uiTests/test_next_step.py | 245 +++++++++ tests/uiTests/test_notification_for_new_user.py | 108 ++++ tests/uiTests/test_notification_for_new_user.pyc | Bin 0 -> 4743 bytes tests/uiTests/test_overview.py | 68 +++ tests/uiTests/test_portal_homepage.py | 55 +++ tests/uiTests/test_progress_bar.py | 96 ++++ tests/uiTests/test_progress_bar.pyc | Bin 0 -> 2327 bytes tests/uiTests/test_rados_perms.py | 104 ++++ tests/uiTests/test_remove_user_from_eng.py | 116 +++++ tests/uiTests/test_reset_password.py | 77 +++ tests/uiTests/test_reset_password.pyc | Bin 0 -> 3117 bytes tests/uiTests/test_rgwa_credentials.py | 80 +++ tests/uiTests/test_sanity.py | 173 +++++++ tests/uiTests/test_set_stage.py | 115 +++++ tests/uiTests/test_ssh_key.py | 98 ++++ tests/uiTests/test_ssh_key.pyc | Bin 0 -> 3447 bytes tests/uiTests/test_ui_base.py | 146 ++++++ tests/uiTests/test_user_profile_settings.py | 75 +++ tests/uiTests/test_validate_signup.py | 100 ++++ 84 files changed, 5619 insertions(+) create mode 100644 tests/__init__.py create mode 100644 tests/__init__.pyc create mode 100644 tests/__pycache__/__init__.cpython-36.pyc create mode 100644 tests/apiTests/__init__.py create mode 100644 tests/apiTests/__pycache__/__init__.cpython-36.pyc create mode 100644 tests/apiTests/__pycache__/test_api_base.cpython-36.pyc create mode 100644 tests/apiTests/__pycache__/test_negative_requests.cpython-36.pyc create mode 100644 tests/apiTests/test_api_base.py create mode 100644 tests/apiTests/test_negative_requests.py create mode 100644 tests/signalTests/__init__.py create mode 100644 tests/signalTests/__pycache__/__init__.cpython-36.pyc create mode 100644 tests/signalTests/__pycache__/test_checklist_signal.cpython-36.pyc create mode 100644 tests/signalTests/__pycache__/test_git_signal.cpython-36.pyc create mode 100644 tests/signalTests/__pycache__/test_signal_base.cpython-36.pyc create mode 100644 tests/signalTests/test_checklist_signal.py create mode 100644 tests/signalTests/test_git_signal.py create mode 100644 tests/signalTests/test_signal_base.py create mode 100644 tests/uiTests/__init__.py create mode 100644 tests/uiTests/__init__.pyc create mode 100644 tests/uiTests/__pycache__/__init__.cpython-36.pyc create mode 100644 tests/uiTests/__pycache__/portalVariables.cpython-36.pyc create mode 100644 tests/uiTests/__pycache__/test_admin_dropdown.cpython-36.pyc create mode 100755 tests/uiTests/__pycache__/test_admin_section.cpython-36-PYTEST.pyc create mode 100644 tests/uiTests/__pycache__/test_admin_section.cpython-36.pyc create mode 100644 tests/uiTests/__pycache__/test_checklist_validations.cpython-36.pyc create mode 100644 tests/uiTests/__pycache__/test_cms_news_and_announcementsion.cpython-36.pyc create mode 100644 tests/uiTests/__pycache__/test_dashboard_feature.cpython-36.pyc create mode 100644 tests/uiTests/__pycache__/test_detailed_view.cpython-36.pyc create mode 100644 tests/uiTests/__pycache__/test_edit_checklist_template.cpython-36.pyc create mode 100644 tests/uiTests/__pycache__/test_export_excel.cpython-36.pyc create mode 100644 tests/uiTests/__pycache__/test_feedback_modal.cpython-36.pyc create mode 100644 tests/uiTests/__pycache__/test_invitations_and_throttle_logic.cpython-36.pyc create mode 100644 tests/uiTests/__pycache__/test_left_nav_panel.cpython-36.pyc create mode 100755 tests/uiTests/__pycache__/test_login_with_new_user.cpython-36-PYTEST.pyc create mode 100644 tests/uiTests/__pycache__/test_login_with_new_user.cpython-36.pyc create mode 100644 tests/uiTests/__pycache__/test_next_step.cpython-36.pyc create mode 100755 tests/uiTests/__pycache__/test_next_step_validations.cpython-36.pyc create mode 100644 tests/uiTests/__pycache__/test_notification_for_new_user.cpython-36.pyc create mode 100644 tests/uiTests/__pycache__/test_portal_homepage.cpython-36.pyc create mode 100644 tests/uiTests/__pycache__/test_progress_bar.cpython-36.pyc create mode 100644 tests/uiTests/__pycache__/test_remove_user_from_eng.cpython-36.pyc create mode 100644 tests/uiTests/__pycache__/test_reset_password.cpython-36.pyc create mode 100644 tests/uiTests/__pycache__/test_sanity.cpython-36.pyc create mode 100644 tests/uiTests/__pycache__/test_set_stage.cpython-36.pyc create mode 100644 tests/uiTests/__pycache__/test_ssh_key.cpython-36.pyc create mode 100755 tests/uiTests/__pycache__/test_ui_base.cpython-36-PYTEST.pyc create mode 100644 tests/uiTests/__pycache__/test_ui_base.cpython-36.pyc create mode 100644 tests/uiTests/__pycache__/test_user_profile_settings.cpython-36.pyc create mode 100644 tests/uiTests/__pycache__/test_validate_signup.cpython-36.pyc create mode 100644 tests/uiTests/geckodriver.log create mode 100644 tests/uiTests/test_admin_dropdown.py create mode 100644 tests/uiTests/test_admin_section.py create mode 100644 tests/uiTests/test_bucket_e2e.py create mode 100644 tests/uiTests/test_bucket_url.py create mode 100644 tests/uiTests/test_checklist_validations.py create mode 100644 tests/uiTests/test_cms_news_and_announcementsion.py create mode 100644 tests/uiTests/test_dashboard_feature.py create mode 100644 tests/uiTests/test_detailed_view.py create mode 100755 tests/uiTests/test_detailed_view.pyc create mode 100644 tests/uiTests/test_edit_checklist_template.py create mode 100644 tests/uiTests/test_export_excel.py create mode 100644 tests/uiTests/test_feedback_modal.py create mode 100644 tests/uiTests/test_invitations_and_throttle_logic.py create mode 100644 tests/uiTests/test_left_nav_panel.py create mode 100644 tests/uiTests/test_login_with_new_user.py create mode 100644 tests/uiTests/test_next_step.py create mode 100644 tests/uiTests/test_notification_for_new_user.py create mode 100755 tests/uiTests/test_notification_for_new_user.pyc create mode 100644 tests/uiTests/test_overview.py create mode 100644 tests/uiTests/test_portal_homepage.py create mode 100644 tests/uiTests/test_progress_bar.py create mode 100755 tests/uiTests/test_progress_bar.pyc create mode 100644 tests/uiTests/test_rados_perms.py create mode 100644 tests/uiTests/test_remove_user_from_eng.py create mode 100644 tests/uiTests/test_reset_password.py create mode 100755 tests/uiTests/test_reset_password.pyc create mode 100644 tests/uiTests/test_rgwa_credentials.py create mode 100644 tests/uiTests/test_sanity.py create mode 100644 tests/uiTests/test_set_stage.py create mode 100644 tests/uiTests/test_ssh_key.py create mode 100755 tests/uiTests/test_ssh_key.pyc create mode 100644 tests/uiTests/test_ui_base.py create mode 100644 tests/uiTests/test_user_profile_settings.py create mode 100644 tests/uiTests/test_validate_signup.py (limited to 'tests') diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..30d7152 --- /dev/null +++ b/tests/__init__.py @@ -0,0 +1,38 @@ + +# ============LICENSE_START========================================== +# org.onap.vvp/test-engine +# =================================================================== +# Copyright © 2017 AT&T Intellectual Property. All rights reserved. +# =================================================================== +# +# Unless otherwise specified, all software contained herein is licensed +# under the Apache License, Version 2.0 (the “License”); +# you may not use this software except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# Unless otherwise specified, all documentation contained herein is licensed +# under the Creative Commons License, Attribution 4.0 Intl. (the “License”); +# you may not use this documentation except in compliance with the License. +# You may obtain a copy of the License at +# +# https://creativecommons.org/licenses/by/4.0/ +# +# Unless required by applicable law or agreed to in writing, documentation +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ============LICENSE_END============================================ +# +# ECOMP is a trademark and service mark of AT&T Intellectual Property. diff --git a/tests/__init__.pyc b/tests/__init__.pyc new file mode 100644 index 0000000..c67704c Binary files /dev/null and b/tests/__init__.pyc differ diff --git a/tests/__pycache__/__init__.cpython-36.pyc b/tests/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000..0a09804 Binary files /dev/null and b/tests/__pycache__/__init__.cpython-36.pyc differ diff --git a/tests/apiTests/__init__.py b/tests/apiTests/__init__.py new file mode 100644 index 0000000..30d7152 --- /dev/null +++ b/tests/apiTests/__init__.py @@ -0,0 +1,38 @@ + +# ============LICENSE_START========================================== +# org.onap.vvp/test-engine +# =================================================================== +# Copyright © 2017 AT&T Intellectual Property. All rights reserved. +# =================================================================== +# +# Unless otherwise specified, all software contained herein is licensed +# under the Apache License, Version 2.0 (the “License”); +# you may not use this software except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# Unless otherwise specified, all documentation contained herein is licensed +# under the Creative Commons License, Attribution 4.0 Intl. (the “License”); +# you may not use this documentation except in compliance with the License. +# You may obtain a copy of the License at +# +# https://creativecommons.org/licenses/by/4.0/ +# +# Unless required by applicable law or agreed to in writing, documentation +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ============LICENSE_END============================================ +# +# ECOMP is a trademark and service mark of AT&T Intellectual Property. diff --git a/tests/apiTests/__pycache__/__init__.cpython-36.pyc b/tests/apiTests/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000..2647c93 Binary files /dev/null and b/tests/apiTests/__pycache__/__init__.cpython-36.pyc differ diff --git a/tests/apiTests/__pycache__/test_api_base.cpython-36.pyc b/tests/apiTests/__pycache__/test_api_base.cpython-36.pyc new file mode 100644 index 0000000..0b420a1 Binary files /dev/null and b/tests/apiTests/__pycache__/test_api_base.cpython-36.pyc differ diff --git a/tests/apiTests/__pycache__/test_negative_requests.cpython-36.pyc b/tests/apiTests/__pycache__/test_negative_requests.cpython-36.pyc new file mode 100644 index 0000000..c88b8d8 Binary files /dev/null and b/tests/apiTests/__pycache__/test_negative_requests.cpython-36.pyc differ diff --git a/tests/apiTests/test_api_base.py b/tests/apiTests/test_api_base.py new file mode 100644 index 0000000..55269e3 --- /dev/null +++ b/tests/apiTests/test_api_base.py @@ -0,0 +1,101 @@ + +# ============LICENSE_START========================================== +# org.onap.vvp/test-engine +# =================================================================== +# Copyright © 2017 AT&T Intellectual Property. All rights reserved. +# =================================================================== +# +# Unless otherwise specified, all software contained herein is licensed +# under the Apache License, Version 2.0 (the “License”); +# you may not use this software except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# Unless otherwise specified, all documentation contained herein is licensed +# under the Creative Commons License, Attribution 4.0 Intl. (the “License”); +# you may not use this documentation except in compliance with the License. +# You may obtain a copy of the License at +# +# https://creativecommons.org/licenses/by/4.0/ +# +# Unless required by applicable law or agreed to in writing, documentation +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ============LICENSE_END============================================ +# +# ECOMP is a trademark and service mark of AT&T Intellectual Property. +import logging +import sys +from timeit import default_timer as timer + +from django.test import TestCase +import requests +from requests.packages.urllib3.exceptions import InsecureRequestWarning + +from iceci.decorator.logFuncEntry import logFuncEntry +from services.database.db_general import DBGeneral +from services.helper import Helper +from services.logging_service import LoggingServiceFactory +from services.session import session + + +requests.packages.urllib3.disable_warnings(InsecureRequestWarning) + + +logger = LoggingServiceFactory.get_logger() +stream_handler = logging.StreamHandler(sys.stdout) + + +class TestApiBase(TestCase, Helper): + + @logFuncEntry + def setUp(self): + logger.addHandler(stream_handler) + self.fullClassName = __name__ + self.className = self.__class__.__name__ + logger.debug("---------------------- TestCase " + + self.className + " ----------------------") + + self.startTime = timer() + self.funcName = self._testMethodName + self.testName = self.funcName + + @logFuncEntry + def tearDown(self): + self.endTime = timer() + self.testDuration = str(self.endTime - self.startTime) + self.results() + logger.debug("---------------------- TestCase " + + self.className + " ----------------------\n\n") + try: + logging.getLogger().info("BB") + finally: + logger.removeHandler(stream_handler) + session.errorList = "" + session.errorCounter = 0 + + @logFuncEntry + def results(self): + params = {"testType": "E2E Test", "testFeature": self.className, + "testResult": "PASS", "testName": self.funcName, "duration": self.testDuration} + if (session.errorCounter == 0): + DBGeneral.insert_results(params["testType"], params["testFeature"], params[ + "testResult"], params["testName"], params['duration']) + else: + params["testResult"] = "FAIL" # Mark test as fail. + # Add the errors to notes column in table. + params["notes"] = session.errorList + DBGeneral.insert_results(params["testType"], params["testFeature"], params[ + "testResult"], params["testName"], params['duration'], params["notes"]) diff --git a/tests/apiTests/test_negative_requests.py b/tests/apiTests/test_negative_requests.py new file mode 100644 index 0000000..d6f16cd --- /dev/null +++ b/tests/apiTests/test_negative_requests.py @@ -0,0 +1,271 @@ + +# ============LICENSE_START========================================== +# org.onap.vvp/test-engine +# =================================================================== +# Copyright © 2017 AT&T Intellectual Property. All rights reserved. +# =================================================================== +# +# Unless otherwise specified, all software contained herein is licensed +# under the Apache License, Version 2.0 (the “License”); +# you may not use this software except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# Unless otherwise specified, all documentation contained herein is licensed +# under the Creative Commons License, Attribution 4.0 Intl. (the “License”); +# you may not use this documentation except in compliance with the License. +# You may obtain a copy of the License at +# +# https://creativecommons.org/licenses/by/4.0/ +# +# Unless required by applicable law or agreed to in writing, documentation +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ============LICENSE_END============================================ +# +# ECOMP is a trademark and service mark of AT&T Intellectual Property. +from django.conf import settings + +from iceci.decorator.exception_decor import exception +from services.constants import Constants +from services.helper import Helper +from services.logging_service import LoggingServiceFactory +from services.types import API +from tests.apiTests.test_api_base import TestApiBase + + +logger = LoggingServiceFactory.get_logger() + + +class TestNegativeRequests(TestApiBase, Helper): + + @exception() + def test_negative_invite_member(self): + logger.debug( + "This negative test will try to invite team member to an engagement using other auth token.") + user_a = API.VirtualFunction.create_engagement() + user_b = API.VirtualFunction.create_engagement() + user_a['session_token'] = user_b['session_token'] + try: + logger.debug( + "About to invite team member to the engagement of user " + user_a['full_name']) + API.VirtualFunction.invite_team_member(user_a) + raise Exception( + user_a['full_name'] + " has invited user using other auth token.") + except: + logger.debug( + "Success! Test failed to invite user using other auth token.") + + @exception() + def test_negative_add_contact(self): + logger.debug( + "This negative test will try to add contact to an engagement using other auth token.") + user_a = API.VirtualFunction.create_engagement() + user_b = API.VirtualFunction.create_engagement() + user_a['session_token'] = user_b['session_token'] + try: + logger.debug( + "About to invite contact to the engagement of user " + user_a['full_name']) + API.VirtualFunction.add_contact(user_a) + raise Exception( + user_a['full_name'] + " has invited contact user using other auth token.") + except: + logger.debug( + "Success! Test failed to invite contact user using other auth token.") + + @exception() + def test_negative_add_next_step(self): + logger.debug( + "This negative test will try to add a next step to engagement using PR / standard user / admin_ro auth token.") + user_content = API.VirtualFunction.create_engagement() + users = [user_content['email'], user_content[ + 'pr_email'], Constants.Users.AdminRO.EMAIL] + for user in users: + token = "token " + API.User.login_user(user) + user_content['session_token'] = token + try: + logger.debug("About to add a next step to VF " + + user_content['vfName'] + " using " + user + " token.") + API.VirtualFunction.add_next_step(user_content) + raise Exception( + "Next step was added to VF " + user_content['vfName'] + " using " + user + " token.") + except: + logger.debug( + "Success! Test failed to add a new next step to the engagement using other auth token.") + + @exception() + def test_negative_edit_next_step(self): + logger.debug( + "This negative test will try to edit a next step using PR / standard user / admin_ro auth token.") + user_content = API.VirtualFunction.create_engagement() + token = "token " + API.User.login_user(user_content['el_email']) + user_content['session_token'] = token + ns_uuid = API.VirtualFunction.add_next_step(user_content) + users = [user_content['email'], user_content[ + 'pr_email'], Constants.Users.AdminRO.EMAIL] + for user in users: + token = "token " + API.User.login_user(user) + user_content['session_token'] = token + try: + logger.debug( + "About to edit a next step (ns uuid: " + ns_uuid + ") using " + user + " token.") + API.VirtualFunction.edit_next_step(user_content, ns_uuid) + raise Exception( + "Next step was edited using " + user + " token.") + except: + logger.debug( + "Success! Test failed to edit a next step using other auth token.") + + @exception() + def test_negative_create_checklist(self): + user_content = API.VirtualFunction.create_engagement() + logger.debug( + "This negative test will try to create a checklist using PR / standard user / admin_ro auth token.") + users = [user_content['email'], user_content[ + 'pr_email'], Constants.Users.AdminRO.EMAIL] + for user in users: + token = "token " + API.User.login_user(user) + user_content['session_token'] = token + try: + logger.debug( + "About to create checklist for VF " + user_content['vfName']) + API.Checklist.create_checklist(user_content) + raise Exception( + "Checklist was created using " + user + " token.") + except: + logger.debug( + "Success! Test failed to create checklist using other auth token.") + + @exception() + def test_negative_update_checklist(self): + user_content = API.VirtualFunction.create_engagement() + API.GitLab.git_clone_push(user_content) + logger.debug( + "Create checklist with engagement lead (next: try to edit checklist with PR and standard user)") + token = "token " + API.User.login_user(user_content['el_email']) + user_content['session_token'] = token + cl_content = API.Checklist.create_checklist(user_content) + logger.debug( + "This negative test will try to create a checklist using PR / standard user / admin_ro auth token.") + users = [user_content['email'], user_content[ + 'pr_email'], Constants.Users.AdminRO.EMAIL] + for user in users: + token = "token " + API.User.login_user(user) + user_content['session_token'] = token + try: + logger.debug( + "About to update checklist for VF " + user_content['vfName']) + API.Checklist.update_checklist( + user_content, cl_content['uuid']) + raise Exception( + "Checklist was created using " + user + " token.") + except: + logger.debug( + "Success! Test failed to create checklist using other auth token.") + + @exception() + def test_negative_set_checklist_state(self): + user_content = API.VirtualFunction.create_engagement() + API.GitLab.git_clone_push(user_content) + logger.debug( + "Create checklist with engagement lead (next: try to change checklist state with PR, standard user and admin_ro)") + token = "token " + API.User.login_user(user_content['el_email']) + user_content['session_token'] = token + cl_content = API.Checklist.create_checklist(user_content) + logger.debug( + "This negative test will try to change checklist state using PR / standard user / admin_ro auth token.") + users = [user_content['email'], user_content[ + 'pr_email'], Constants.Users.AdminRO.EMAIL] + for user in users: + try: + logger.debug( + "About to change checklist state for VF " + user_content['vfName']) + API.Checklist.jump_state(cl_content['uuid'], user) + raise Exception( + "Checklist state was changed using " + user + " token.") + except: + logger.debug( + "Success! Test failed to change checklist state using other auth token.") + + @exception() + def test_add_checklist_audit_log(self): + user_content = API.VirtualFunction.create_engagement() + logger.debug( + "Create checklist with engagement lead (next: try to add audit log to checklist with standard user and admin_ro)") + token = "token " + API.User.login_user(user_content['el_email']) + user_content['session_token'] = token + cl_content = API.Checklist.create_checklist(user_content, files=[]) + logger.debug( + "This negative test will try to add audit log to checklist using standard user / admin_ro auth token.") + users = [user_content['email'], Constants.Users.AdminRO.EMAIL] + for user in users: + token = "token " + API.User.login_user(user) + user_content['session_token'] = token + try: + logger.debug( + "About to add audit log to checklist uuid " + cl_content['uuid']) + API.Checklist.add_checklist_audit_log( + user_content, cl_content['uuid']) + raise Exception( + "Audit log was added to checklist using " + user + " token.") + except: + logger.debug( + "Success! Test failed to add audit log to checklist using other auth token.") + + @exception() + def test_add_checklist_next_step(self): + user_content = API.VirtualFunction.create_engagement() + API.GitLab.git_clone_push(user_content) + logger.debug( + "Create checklist with engagement lead (next: try to add checklist next step with PR, standard user and admin_ro)") + token = "token " + API.User.login_user(user_content['el_email']) + user_content['session_token'] = token + cl_content = API.Checklist.create_checklist(user_content) + logger.debug( + "This negative test will try to add checklist next step using PR / standard user / admin_ro auth token.") + users = [user_content['email'], user_content[ + 'pr_email'], Constants.Users.AdminRO.EMAIL] + for user in users: + token = "token " + API.User.login_user(user) + user_content['session_token'] = token + try: + logger.debug( + "About to add next step to checklist uuid " + cl_content['uuid']) + API.Checklist.add_checklist_next_step( + user_content, cl_content['uuid']) + raise Exception( + "Next step was added to checklist using " + user + " token.") + except: + logger.debug( + "Success! Test failed to add next steps to checklist using other auth token.") + + @exception() + def test_negative_checklist_files(self): + # Can't run this test locally since locally we have files by default. + if settings.DATABASE_TYPE == 'local': + logger.debug("Local environment, skipping test...") + else: # Test starts here # + user_content = API.VirtualFunction.create_engagement() + logger.debug( + "Trying to create checklist with associated files when git repo is empty") + token = "token " + API.User.login_user(user_content['el_email']) + user_content['session_token'] = token + try: + API.Checklist.create_checklist(user_content) + raise Exception( + "Checklist was created with associated files while git repo is empty.") + except: + logger.debug( + "Success! Test failed to create checklist with associated files while git repo is empty.") diff --git a/tests/signalTests/__init__.py b/tests/signalTests/__init__.py new file mode 100644 index 0000000..30d7152 --- /dev/null +++ b/tests/signalTests/__init__.py @@ -0,0 +1,38 @@ + +# ============LICENSE_START========================================== +# org.onap.vvp/test-engine +# =================================================================== +# Copyright © 2017 AT&T Intellectual Property. All rights reserved. +# =================================================================== +# +# Unless otherwise specified, all software contained herein is licensed +# under the Apache License, Version 2.0 (the “License”); +# you may not use this software except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# Unless otherwise specified, all documentation contained herein is licensed +# under the Creative Commons License, Attribution 4.0 Intl. (the “License”); +# you may not use this documentation except in compliance with the License. +# You may obtain a copy of the License at +# +# https://creativecommons.org/licenses/by/4.0/ +# +# Unless required by applicable law or agreed to in writing, documentation +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ============LICENSE_END============================================ +# +# ECOMP is a trademark and service mark of AT&T Intellectual Property. diff --git a/tests/signalTests/__pycache__/__init__.cpython-36.pyc b/tests/signalTests/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000..6b41906 Binary files /dev/null and b/tests/signalTests/__pycache__/__init__.cpython-36.pyc differ diff --git a/tests/signalTests/__pycache__/test_checklist_signal.cpython-36.pyc b/tests/signalTests/__pycache__/test_checklist_signal.cpython-36.pyc new file mode 100644 index 0000000..ef7bbfe Binary files /dev/null and b/tests/signalTests/__pycache__/test_checklist_signal.cpython-36.pyc differ diff --git a/tests/signalTests/__pycache__/test_git_signal.cpython-36.pyc b/tests/signalTests/__pycache__/test_git_signal.cpython-36.pyc new file mode 100644 index 0000000..7fc5eb1 Binary files /dev/null and b/tests/signalTests/__pycache__/test_git_signal.cpython-36.pyc differ diff --git a/tests/signalTests/__pycache__/test_signal_base.cpython-36.pyc b/tests/signalTests/__pycache__/test_signal_base.cpython-36.pyc new file mode 100644 index 0000000..4713d12 Binary files /dev/null and b/tests/signalTests/__pycache__/test_signal_base.cpython-36.pyc differ diff --git a/tests/signalTests/test_checklist_signal.py b/tests/signalTests/test_checklist_signal.py new file mode 100644 index 0000000..ae22578 --- /dev/null +++ b/tests/signalTests/test_checklist_signal.py @@ -0,0 +1,68 @@ + +# ============LICENSE_START========================================== +# org.onap.vvp/test-engine +# =================================================================== +# Copyright © 2017 AT&T Intellectual Property. All rights reserved. +# =================================================================== +# +# Unless otherwise specified, all software contained herein is licensed +# under the Apache License, Version 2.0 (the “License”); +# you may not use this software except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# Unless otherwise specified, all documentation contained herein is licensed +# under the Creative Commons License, Attribution 4.0 Intl. (the “License”); +# you may not use this documentation except in compliance with the License. +# You may obtain a copy of the License at +# +# https://creativecommons.org/licenses/by/4.0/ +# +# Unless required by applicable law or agreed to in writing, documentation +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ============LICENSE_END============================================ +# +# ECOMP is a trademark and service mark of AT&T Intellectual Property. +''' +Created on 16 Nov 2016 +''' +from django.conf import settings + +from iceci.decorator.exception_decor import exception +from services.constants import Constants +from services.logging_service import LoggingServiceFactory +from services.types import API, DB +from tests.signalTests.test_signal_base import TestSignalBase + + +logger = LoggingServiceFactory.get_logger() + + +class TestChecklistSignal(TestSignalBase): + + @exception() + def test_archive_checklist_after_editing_files(self): + if settings.DATABASE_TYPE == 'local': + logger.debug("Local environment, skipping test...") + else: + user_content = API.VirtualFunction.create_engagement() + API.GitLab.git_clone_push(user_content, yaml=True) + token = "token " + API.User.login_user(user_content['el_email']) + user_content['session_token'] = token + cl_content = API.Checklist.retrieve_heat_checklist(user_content) + API.GitLab.git_push_commit(user_content, yaml=True) + DB.Checklist.state_changed( + "uuid", cl_content['uuid'], Constants.ChecklistStates.Archive.TEXT) diff --git a/tests/signalTests/test_git_signal.py b/tests/signalTests/test_git_signal.py new file mode 100644 index 0000000..d008787 --- /dev/null +++ b/tests/signalTests/test_git_signal.py @@ -0,0 +1,320 @@ + +# ============LICENSE_START========================================== +# org.onap.vvp/test-engine +# =================================================================== +# Copyright © 2017 AT&T Intellectual Property. All rights reserved. +# =================================================================== +# +# Unless otherwise specified, all software contained herein is licensed +# under the Apache License, Version 2.0 (the “License”); +# you may not use this software except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# Unless otherwise specified, all documentation contained herein is licensed +# under the Creative Commons License, Attribution 4.0 Intl. (the “License”); +# you may not use this documentation except in compliance with the License. +# You may obtain a copy of the License at +# +# https://creativecommons.org/licenses/by/4.0/ +# +# Unless required by applicable law or agreed to in writing, documentation +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ============LICENSE_END============================================ +# +# ECOMP is a trademark and service mark of AT&T Intellectual Property. +''' +Created on 16 Nov 2016 + +''' +from django.conf import settings +from iceci.decorator.exception_decor import exception +from services.api.api_virtual_function import APIVirtualFunction +from services.constants import Constants, ServiceProvider +from services.logging_service import LoggingServiceFactory +from services.types import API +from tests.signalTests.test_signal_base import TestSignalBase +from services.helper import Helper + + +logger = LoggingServiceFactory.get_logger() + + +class TestGitSignal(TestSignalBase): + + @exception() + def test_create_eng(self): + + if settings.DATABASE_TYPE == 'local': + logger.debug("Local environment, skipping test...") + else: + user_content = API.VirtualFunction.create_engagement() + path_with_namespace = user_content[ + 'engagement_manual_id'] + "%2F" + user_content['vfName'] + API.GitLab.get_git_project(path_with_namespace) + if not API.GitLab.validate_git_project_members(path_with_namespace, user_content['el_email']): + logger.error("Couldn't find user in GitLab response.") + raise + logger.debug( + "Project was created successfully on GitLab. ELs included") + try: + job_name = user_content[ + 'vfName'] + "_" + user_content['engagement_manual_id'] + API.Jenkins.get_jenkins_job(job_name) + except Exception as e: + logger.error( + "_-_-_-_-_- Unexpected error in test_create_eng: " + str(e)) + raise Exception("Job wasnt created on APIJenkins." + str(e)) + + @exception() + def test_update_account(self): + + if settings.DATABASE_TYPE == 'local': + logger.debug("Local environment, skipping test...") + else: + user_content = API.VirtualFunction.create_engagement() + sshKey = API.User.update_account(user_content) + git_user = API.GitLab.get_git_user(user_content['email']) + git_user_pub_key = API.GitLab.get_git_user_ssh_key(git_user['id']) + if sshKey != git_user_pub_key: + logger.error( + "The SSH Key received does not equal to the one provided! The key from GitLab:\n" + git_user_pub_key) + raise + logger.debug( + "SSH Key for user " + user_content['full_name'] + " added to GitLab.") + + @exception() + def test_set_ssh(self): + + if settings.DATABASE_TYPE == 'local': + logger.debug("Local environment, skipping test...") + else: + user_content = API.VirtualFunction.create_engagement() + sshKey = API.User.set_ssh(user_content) + git_user = API.GitLab.get_git_user(user_content['email']) + git_user_pub_key = API.GitLab.get_git_user_ssh_key(git_user['id']) + if sshKey != git_user_pub_key: + logger.error( + "The SSH Key received does not equal to the one provided! The key from GitLab:\n" + git_user_pub_key) + raise + logger.debug( + "SSH Key for user " + user_content['full_name'] + " added to GitLab.") + + @exception() + def test_invite_member(self): + if settings.DATABASE_TYPE == 'local': + logger.debug("Local environment, skipping test...") + else: + user_content = API.VirtualFunction.create_engagement() + invited_email, invite_token, invite_url = API.VirtualFunction.invite_team_member( + user_content) + second_user = API.User.signup_invited_user( + user_content[ + 'vendor'], invited_email, invite_token, invite_url, + user_content, activate=True) + APIVirtualFunction.set_eng_stage( + user_content, Constants.EngagementStages.ACTIVE) + path_with_namespace = user_content[ + 'engagement_manual_id'] + "%2F" + user_content['vfName'] + if not API.GitLab.validate_git_project_members(path_with_namespace, user_content['email']): + raise Exception( + "Couldn't find the inviter user (%s) in GitLab." % user_content['email']) + if not API.GitLab.validate_git_project_members(path_with_namespace, second_user['email']): + raise Exception( + "Couldn't find the inviter user (%s) in GitLab." % second_user['email']) + logger.debug( + "Inviter and invited users were created successfully on GitLab!") + + @exception() + def test_add_contact(self): + if settings.DATABASE_TYPE == 'local': + logger.debug("Local environment, skipping test...") + else: + user_content = API.VirtualFunction.create_engagement() + APIVirtualFunction.set_eng_stage( + user_content, Constants.EngagementStages.ACTIVE) + path_with_namespace = user_content[ + 'engagement_manual_id'] + "%2F" + user_content['vfName'] + API.GitLab.get_git_project(path_with_namespace) + if not API.GitLab.validate_git_project_members(path_with_namespace, user_content['email']): + raise Exception( + "Couldn't find the inviter user (%s) in GitLab." % user_content['email']) + second_user_email, invite_token, invite_url = API.VirtualFunction.add_contact( + user_content) + second_user = API.User.signup_invited_user(ServiceProvider.MainServiceProvider, second_user_email, invite_token, invite_url, + user_content, "true", True) + if API.GitLab.validate_git_project_members(path_with_namespace, second_user_email): + logger.debug( + "Invited contact user " + second_user['full_name'] + " found in GitLab.") + else: + raise Exception("Couldn't find the invited user in GitLab.") + logger.debug( + "Inviter and invited users were created successfully on GitLab!") + + @exception() + def test_join_of_staff_users_to_new_gitlab_repo(self): + if settings.DATABASE_TYPE == 'local': + logger.debug("Local environment, skipping test...") + else: + user_content = API.VirtualFunction.create_engagement() + path_with_namespace = user_content[ + 'engagement_manual_id'] + "%2F" + user_content['vfName'] + eng_team_users_emails = [ + user_content['el_email'], user_content['pr_email'], Constants.Users.Admin.EMAIL] + API.GitLab.are_all_list_users_registered_as_project_members( + eng_team_users_emails, path_with_namespace) + logger.debug("Staff users were added successfully to GitLab repo!") + + @exception() + def test_join_of_stn_users_to_new_rep_after_active(self): + if settings.DATABASE_TYPE == 'local': + logger.debug("Local environment, skipping test...") + else: + user_content = API.VirtualFunction.create_engagement() + path_with_namespace = user_content[ + 'engagement_manual_id'] + "%2F" + user_content['vfName'] + # invite 2 new users in order to join standard users in the eng + # team + invited_email_address, invite_token, invite_url = API.VirtualFunction.invite_team_member( + user_content) + invited_email_address = API.User.signup_invited_user(user_content['vendor'], invited_email_address, + invite_token, invite_url, user_content) + + second_invited_email, second_invite_token, second_invite_url = API.VirtualFunction.invite_team_member( + user_content) + second_invited_email = API.User.signup_invited_user(user_content['vendor'], second_invited_email, + second_invite_token, second_invite_url, user_content) + + API.VirtualFunction.set_eng_stage( + user_content, Constants.EngagementStages.ACTIVE) + eng_team_users_emails = [invited_email_address['email'], second_invited_email['email'], + user_content['email'], user_content[ + 'el_email'], user_content['pr_email'], + Constants.Users.Admin.EMAIL] + + API.GitLab.are_all_list_users_registered_as_project_members( + eng_team_users_emails, path_with_namespace) + logger.debug( + "Staff, Inviter and invited users were added successfully to GitLab repo!") + + @exception() + def test_rem_users_from_repo_after_active_and_validated(self): + if settings.DATABASE_TYPE == 'local': + logger.debug("Local environment, skipping test...") + else: + user_content = API.VirtualFunction.create_engagement() + # invite 2 new users in order to join standard users in the eng + # team + invited_email_address, invite_token, invite_url = API.VirtualFunction.invite_team_member( + user_content) + invited_email_address = API.User.signup_invited_user( + user_content['vendor'], invited_email_address, invite_token, invite_url, user_content) + + second_invited_email, second_invite_token, second_invite_url = API.VirtualFunction.invite_team_member( + user_content) + second_invited_email = API.User.signup_invited_user( + user_content['vendor'], second_invited_email, second_invite_token, second_invite_url, user_content) + + # change eng stage in order to include all standard users in the + # eng git lab repo + API.VirtualFunction.set_eng_stage( + user_content, Constants.EngagementStages.ACTIVE) + API.VirtualFunction.set_eng_stage( + user_content, Constants.EngagementStages.VALIDATED) + path_with_namespace = user_content[ + 'engagement_manual_id'] + "%2F" + user_content['vfName'] + + # check that all standard users, staff users and admin are in the + # git lab repo + API.GitLab.get_git_project(path_with_namespace) + eng_team_users_emails = [user_content['el_email'], + user_content['pr_email'], Constants.Users.Admin.EMAIL] + should_not_be_in_repo_users_list = [ + invited_email_address['email'], user_content['email']] + for email in eng_team_users_emails: + if not API.GitLab.validate_git_project_members(path_with_namespace, email): + if email not in should_not_be_in_repo_users_list: + raise Exception( + "Couldn't find the invited users: " + email + " in GitLab.") + + logger.debug( + "Invited user: " + email + " and" + second_invited_email['full_name'] + " found in GitLab.") + logger.debug( + "Inviter and invited users were created successfully on GitLab!") + + @exception() + def test_rem_users_from_repo_after_completed(self): + if settings.DATABASE_TYPE == 'local': + logger.debug("Local environment, skipping test...") + else: + user_content = API.VirtualFunction.create_engagement() + # invite 2 new users in order to join standard users in the eng + # team + invited_email, invite_token, invite_url = API.VirtualFunction.invite_team_member( + user_content) + invited_email = API.User.signup_invited_user( + user_content['vendor'], invited_email, invite_token, invite_url, user_content) + + second_invited_email, second_invite_token, second_invite_url = API.VirtualFunction.invite_team_member( + user_content) + second_invited_email = API.User.signup_invited_user( + user_content['vendor'], second_invited_email, second_invite_token, second_invite_url, user_content) + + # change eng stage in order to include all standard users in the + # eng git lab repo + API.VirtualFunction.set_eng_stage( + user_content, Constants.EngagementStages.ACTIVE) + API.VirtualFunction.set_eng_stage( + user_content, Constants.EngagementStages.VALIDATED) + API.VirtualFunction.set_eng_stage( + user_content, Constants.EngagementStages.COMPLETED) + path_with_namespace = user_content[ + 'engagement_manual_id'] + "%2F" + user_content['vfName'] + + # check that all standard users, staff users and admin are in the + # git lab repo + API.GitLab.get_git_project(path_with_namespace) + eng_team_users_emails = [user_content['el_email'], + user_content['pr_email'], Constants.Users.Admin.EMAIL] + should_not_be_in_repo_users_list = [ + invited_email['email'], user_content['email']] + for email in eng_team_users_emails: + if not API.GitLab.validate_git_project_members(path_with_namespace, email): + if email not in should_not_be_in_repo_users_list: + raise Exception( + "Couldn't find the user: " + email + " in GitLab.") + + logger.debug( + "Invited user: " + email + " and" + second_invited_email['full_name'] + " found in GitLab.") + logger.debug( + "Inviter and invited users were created successfully on GitLab!") + + @exception() + def test_push_yaml_files_to_repo_check_decline_of_cl(self): + + if settings.DATABASE_TYPE == 'local': + logger.debug("Local environment, skipping test...") + else: + user_content = API.VirtualFunction.create_engagement() + token = "token " + API.User.login_user(user_content['el_email']) + user_content['session_token'] = token + cl_content_before_push_and_decline = API.Checklist.retrieve_heat_checklist( + user_content) + API.GitLab.git_clone_push(user_content, yaml=True) + cl_content_after_push_and_decline = API.Checklist.retrieve_heat_checklist( + user_content) + Helper.internal_not_equal( + cl_content_before_push_and_decline, cl_content_after_push_and_decline) diff --git a/tests/signalTests/test_signal_base.py b/tests/signalTests/test_signal_base.py new file mode 100644 index 0000000..6caade4 --- /dev/null +++ b/tests/signalTests/test_signal_base.py @@ -0,0 +1,103 @@ + +# ============LICENSE_START========================================== +# org.onap.vvp/test-engine +# =================================================================== +# Copyright © 2017 AT&T Intellectual Property. All rights reserved. +# =================================================================== +# +# Unless otherwise specified, all software contained herein is licensed +# under the Apache License, Version 2.0 (the “License”); +# you may not use this software except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# Unless otherwise specified, all documentation contained herein is licensed +# under the Creative Commons License, Attribution 4.0 Intl. (the “License”); +# you may not use this documentation except in compliance with the License. +# You may obtain a copy of the License at +# +# https://creativecommons.org/licenses/by/4.0/ +# +# Unless required by applicable law or agreed to in writing, documentation +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ============LICENSE_END============================================ +# +# ECOMP is a trademark and service mark of AT&T Intellectual Property. +''' +Created on 15 Nov 2016 + +@author: tomerc +''' +import sys +from timeit import default_timer as timer +import unittest +import logging +import requests +from requests.packages.urllib3.exceptions import InsecureRequestWarning + +from iceci.decorator.logFuncEntry import logFuncEntry +from services.database.db_general import DBGeneral +from services.helper import Helper +from services.logging_service import LoggingServiceFactory +from services.session import session + + +requests.packages.urllib3.disable_warnings(InsecureRequestWarning) + + +logger = LoggingServiceFactory.get_logger() +stream_handler = logging.StreamHandler(sys.stdout) + + +class TestSignalBase(unittest.TestCase, Helper): + + def setUp(self): + logger.addHandler(stream_handler) + self.fullClassName = __name__ + self.className = self.__class__.__name__ + logger.debug("---------------------- TestCase " + + self.className + " ----------------------") + + self.startTime = timer() + self.funcName = self._testMethodName + self.testName = self.funcName + + def tearDown(self): + self.endTime = timer() + self.testDuration = str(self.endTime - self.startTime) + self.results() + logger.debug("---------------------- TestCase " + + self.className + " ----------------------\n\n") + try: + logging.getLogger().info("BB") + finally: + logger.removeHandler(stream_handler) + session.errorList = "" + session.errorCounter = 0 + + @logFuncEntry + def results(self): + params = {"testType": "E2E Test", "testFeature": self.className, + "testResult": "PASS", "testName": self.funcName, "duration": self.testDuration} + if (session.errorCounter == 0): + DBGeneral.insert_results(params["testType"], params["testFeature"], params[ + "testResult"], params["testName"], params['duration']) + else: + params["testResult"] = "FAIL" # Mark test as fail. + # Add the errors to notes column in table. + params["notes"] = session.errorList + DBGeneral.insert_results(params["testType"], params["testFeature"], params[ + "testResult"], params["testName"], params['duration'], params["notes"]) diff --git a/tests/uiTests/__init__.py b/tests/uiTests/__init__.py new file mode 100644 index 0000000..30d7152 --- /dev/null +++ b/tests/uiTests/__init__.py @@ -0,0 +1,38 @@ + +# ============LICENSE_START========================================== +# org.onap.vvp/test-engine +# =================================================================== +# Copyright © 2017 AT&T Intellectual Property. All rights reserved. +# =================================================================== +# +# Unless otherwise specified, all software contained herein is licensed +# under the Apache License, Version 2.0 (the “License”); +# you may not use this software except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# Unless otherwise specified, all documentation contained herein is licensed +# under the Creative Commons License, Attribution 4.0 Intl. (the “License”); +# you may not use this documentation except in compliance with the License. +# You may obtain a copy of the License at +# +# https://creativecommons.org/licenses/by/4.0/ +# +# Unless required by applicable law or agreed to in writing, documentation +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ============LICENSE_END============================================ +# +# ECOMP is a trademark and service mark of AT&T Intellectual Property. diff --git a/tests/uiTests/__init__.pyc b/tests/uiTests/__init__.pyc new file mode 100644 index 0000000..78d42d5 Binary files /dev/null and b/tests/uiTests/__init__.pyc differ diff --git a/tests/uiTests/__pycache__/__init__.cpython-36.pyc b/tests/uiTests/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000..b974ad1 Binary files /dev/null and b/tests/uiTests/__pycache__/__init__.cpython-36.pyc differ diff --git a/tests/uiTests/__pycache__/portalVariables.cpython-36.pyc b/tests/uiTests/__pycache__/portalVariables.cpython-36.pyc new file mode 100644 index 0000000..dd0272e Binary files /dev/null and b/tests/uiTests/__pycache__/portalVariables.cpython-36.pyc differ diff --git a/tests/uiTests/__pycache__/test_admin_dropdown.cpython-36.pyc b/tests/uiTests/__pycache__/test_admin_dropdown.cpython-36.pyc new file mode 100644 index 0000000..0cbe384 Binary files /dev/null and b/tests/uiTests/__pycache__/test_admin_dropdown.cpython-36.pyc differ diff --git a/tests/uiTests/__pycache__/test_admin_section.cpython-36-PYTEST.pyc b/tests/uiTests/__pycache__/test_admin_section.cpython-36-PYTEST.pyc new file mode 100755 index 0000000..01f0a37 Binary files /dev/null and b/tests/uiTests/__pycache__/test_admin_section.cpython-36-PYTEST.pyc differ diff --git a/tests/uiTests/__pycache__/test_admin_section.cpython-36.pyc b/tests/uiTests/__pycache__/test_admin_section.cpython-36.pyc new file mode 100644 index 0000000..0fba059 Binary files /dev/null and b/tests/uiTests/__pycache__/test_admin_section.cpython-36.pyc differ diff --git a/tests/uiTests/__pycache__/test_checklist_validations.cpython-36.pyc b/tests/uiTests/__pycache__/test_checklist_validations.cpython-36.pyc new file mode 100644 index 0000000..9d4f561 Binary files /dev/null and b/tests/uiTests/__pycache__/test_checklist_validations.cpython-36.pyc differ diff --git a/tests/uiTests/__pycache__/test_cms_news_and_announcementsion.cpython-36.pyc b/tests/uiTests/__pycache__/test_cms_news_and_announcementsion.cpython-36.pyc new file mode 100644 index 0000000..3441194 Binary files /dev/null and b/tests/uiTests/__pycache__/test_cms_news_and_announcementsion.cpython-36.pyc differ diff --git a/tests/uiTests/__pycache__/test_dashboard_feature.cpython-36.pyc b/tests/uiTests/__pycache__/test_dashboard_feature.cpython-36.pyc new file mode 100644 index 0000000..ea7cbe0 Binary files /dev/null and b/tests/uiTests/__pycache__/test_dashboard_feature.cpython-36.pyc differ diff --git a/tests/uiTests/__pycache__/test_detailed_view.cpython-36.pyc b/tests/uiTests/__pycache__/test_detailed_view.cpython-36.pyc new file mode 100644 index 0000000..e19d54c Binary files /dev/null and b/tests/uiTests/__pycache__/test_detailed_view.cpython-36.pyc differ diff --git a/tests/uiTests/__pycache__/test_edit_checklist_template.cpython-36.pyc b/tests/uiTests/__pycache__/test_edit_checklist_template.cpython-36.pyc new file mode 100644 index 0000000..e424488 Binary files /dev/null and b/tests/uiTests/__pycache__/test_edit_checklist_template.cpython-36.pyc differ diff --git a/tests/uiTests/__pycache__/test_export_excel.cpython-36.pyc b/tests/uiTests/__pycache__/test_export_excel.cpython-36.pyc new file mode 100644 index 0000000..1c3af2a Binary files /dev/null and b/tests/uiTests/__pycache__/test_export_excel.cpython-36.pyc differ diff --git a/tests/uiTests/__pycache__/test_feedback_modal.cpython-36.pyc b/tests/uiTests/__pycache__/test_feedback_modal.cpython-36.pyc new file mode 100644 index 0000000..087d831 Binary files /dev/null and b/tests/uiTests/__pycache__/test_feedback_modal.cpython-36.pyc differ diff --git a/tests/uiTests/__pycache__/test_invitations_and_throttle_logic.cpython-36.pyc b/tests/uiTests/__pycache__/test_invitations_and_throttle_logic.cpython-36.pyc new file mode 100644 index 0000000..f3ab1a0 Binary files /dev/null and b/tests/uiTests/__pycache__/test_invitations_and_throttle_logic.cpython-36.pyc differ diff --git a/tests/uiTests/__pycache__/test_left_nav_panel.cpython-36.pyc b/tests/uiTests/__pycache__/test_left_nav_panel.cpython-36.pyc new file mode 100644 index 0000000..feee9ab Binary files /dev/null and b/tests/uiTests/__pycache__/test_left_nav_panel.cpython-36.pyc differ diff --git a/tests/uiTests/__pycache__/test_login_with_new_user.cpython-36-PYTEST.pyc b/tests/uiTests/__pycache__/test_login_with_new_user.cpython-36-PYTEST.pyc new file mode 100755 index 0000000..9dc5450 Binary files /dev/null and b/tests/uiTests/__pycache__/test_login_with_new_user.cpython-36-PYTEST.pyc differ diff --git a/tests/uiTests/__pycache__/test_login_with_new_user.cpython-36.pyc b/tests/uiTests/__pycache__/test_login_with_new_user.cpython-36.pyc new file mode 100644 index 0000000..498be23 Binary files /dev/null and b/tests/uiTests/__pycache__/test_login_with_new_user.cpython-36.pyc differ diff --git a/tests/uiTests/__pycache__/test_next_step.cpython-36.pyc b/tests/uiTests/__pycache__/test_next_step.cpython-36.pyc new file mode 100644 index 0000000..9a3849c Binary files /dev/null and b/tests/uiTests/__pycache__/test_next_step.cpython-36.pyc differ diff --git a/tests/uiTests/__pycache__/test_next_step_validations.cpython-36.pyc b/tests/uiTests/__pycache__/test_next_step_validations.cpython-36.pyc new file mode 100755 index 0000000..6830c09 Binary files /dev/null and b/tests/uiTests/__pycache__/test_next_step_validations.cpython-36.pyc differ diff --git a/tests/uiTests/__pycache__/test_notification_for_new_user.cpython-36.pyc b/tests/uiTests/__pycache__/test_notification_for_new_user.cpython-36.pyc new file mode 100644 index 0000000..953335f Binary files /dev/null and b/tests/uiTests/__pycache__/test_notification_for_new_user.cpython-36.pyc differ diff --git a/tests/uiTests/__pycache__/test_portal_homepage.cpython-36.pyc b/tests/uiTests/__pycache__/test_portal_homepage.cpython-36.pyc new file mode 100644 index 0000000..dafb97b Binary files /dev/null and b/tests/uiTests/__pycache__/test_portal_homepage.cpython-36.pyc differ diff --git a/tests/uiTests/__pycache__/test_progress_bar.cpython-36.pyc b/tests/uiTests/__pycache__/test_progress_bar.cpython-36.pyc new file mode 100644 index 0000000..a982e3e Binary files /dev/null and b/tests/uiTests/__pycache__/test_progress_bar.cpython-36.pyc differ diff --git a/tests/uiTests/__pycache__/test_remove_user_from_eng.cpython-36.pyc b/tests/uiTests/__pycache__/test_remove_user_from_eng.cpython-36.pyc new file mode 100644 index 0000000..3825edd Binary files /dev/null and b/tests/uiTests/__pycache__/test_remove_user_from_eng.cpython-36.pyc differ diff --git a/tests/uiTests/__pycache__/test_reset_password.cpython-36.pyc b/tests/uiTests/__pycache__/test_reset_password.cpython-36.pyc new file mode 100644 index 0000000..c37d476 Binary files /dev/null and b/tests/uiTests/__pycache__/test_reset_password.cpython-36.pyc differ diff --git a/tests/uiTests/__pycache__/test_sanity.cpython-36.pyc b/tests/uiTests/__pycache__/test_sanity.cpython-36.pyc new file mode 100644 index 0000000..f39ff09 Binary files /dev/null and b/tests/uiTests/__pycache__/test_sanity.cpython-36.pyc differ diff --git a/tests/uiTests/__pycache__/test_set_stage.cpython-36.pyc b/tests/uiTests/__pycache__/test_set_stage.cpython-36.pyc new file mode 100644 index 0000000..5571ac1 Binary files /dev/null and b/tests/uiTests/__pycache__/test_set_stage.cpython-36.pyc differ diff --git a/tests/uiTests/__pycache__/test_ssh_key.cpython-36.pyc b/tests/uiTests/__pycache__/test_ssh_key.cpython-36.pyc new file mode 100644 index 0000000..042b884 Binary files /dev/null and b/tests/uiTests/__pycache__/test_ssh_key.cpython-36.pyc differ diff --git a/tests/uiTests/__pycache__/test_ui_base.cpython-36-PYTEST.pyc b/tests/uiTests/__pycache__/test_ui_base.cpython-36-PYTEST.pyc new file mode 100755 index 0000000..d6d2b4e Binary files /dev/null and b/tests/uiTests/__pycache__/test_ui_base.cpython-36-PYTEST.pyc differ diff --git a/tests/uiTests/__pycache__/test_ui_base.cpython-36.pyc b/tests/uiTests/__pycache__/test_ui_base.cpython-36.pyc new file mode 100644 index 0000000..ed14311 Binary files /dev/null and b/tests/uiTests/__pycache__/test_ui_base.cpython-36.pyc differ diff --git a/tests/uiTests/__pycache__/test_user_profile_settings.cpython-36.pyc b/tests/uiTests/__pycache__/test_user_profile_settings.cpython-36.pyc new file mode 100644 index 0000000..6b69b26 Binary files /dev/null and b/tests/uiTests/__pycache__/test_user_profile_settings.cpython-36.pyc differ diff --git a/tests/uiTests/__pycache__/test_validate_signup.cpython-36.pyc b/tests/uiTests/__pycache__/test_validate_signup.cpython-36.pyc new file mode 100644 index 0000000..becce33 Binary files /dev/null and b/tests/uiTests/__pycache__/test_validate_signup.cpython-36.pyc differ diff --git a/tests/uiTests/geckodriver.log b/tests/uiTests/geckodriver.log new file mode 100644 index 0000000..bbbd105 --- /dev/null +++ b/tests/uiTests/geckodriver.log @@ -0,0 +1,392 @@ +1499152020601 geckodriver INFO Listening on 127.0.0.1:56804 +1499152021597 geckodriver::marionette INFO Starting browser /Applications/Firefox.app/Contents/MacOS/firefox-bin with args ["-marionette"] +1499152023634 Marionette INFO Listening on port 56817 +1499152023758 Marionette WARN TLS certificate errors will be ignored for this session +1499152023950 Marionette DEBUG loaded listener.js +1499152024007 Marionette DEBUG Received DOM event "beforeunload" for "about:blank" +1499152024010 Marionette DEBUG Received DOM event "pagehide" for "about:blank" +1499152024010 Marionette DEBUG Received DOM event "unload" for "about:blank" +1499152024014 Marionette DEBUG Received DOM event "DOMContentLoaded" for "about:blank" +1499152024015 Marionette DEBUG Received DOM event "pageshow" for "about:blank" +2017-07-04 02:07:04.043 plugin-container[13150:396681] *** CFMessagePort: bootstrap_register(): failed 1100 (0x44c) 'Permission denied', port = 0x9c3b, name = 'com.apple.tsm.portname' +See /usr/include/servers/bootstrap_defs.h for the error codes. +2017-07-04 02:07:04.048 plugin-container[13150:396681] *** CFMessagePort: bootstrap_register(): failed 1100 (0x44c) 'Permission denied', port = 0x9f03, name = 'com.apple.CFPasteboardClient' +See /usr/include/servers/bootstrap_defs.h for the error codes. +1499152024055 Marionette DEBUG Received DOM event "beforeunload" for "about:blank" +1499152024066 Marionette DEBUG Received DOM event "pagehide" for "about:blank" +1499152024066 Marionette DEBUG Received DOM event "unload" for "about:blank" +1499152024689 Marionette DEBUG Received DOM event "DOMContentLoaded" for "http://127.0.0.1:8181/#/login" +1499152024752 Marionette DEBUG Received DOM event "pageshow" for "http://127.0.0.1:8181/#/login" +1499152028171 Marionette DEBUG Canceled page load listener because no navigation has been detected +1499152030426 Marionette DEBUG Canceled page load listener because no navigation has been detected +1499152031027 Marionette DEBUG Received DOM event "hashchange" for "http://127.0.0.1:8181/#/admin" +1499152032461 Marionette DEBUG Received DOM event "hashchange" for "http://127.0.0.1:8181/#/admin/admin/checklist-template" +1499152033280 Marionette DEBUG Canceled page load listener because no navigation has been detected +1499152034836 Marionette DEBUG Canceled page load listener because no navigation has been detected +1499152035163 Marionette DEBUG Canceled page load listener because no navigation has been detected +1499152035991 Marionette DEBUG Canceled page load listener because no navigation has been detected +1499152036175 geckodriver INFO Listening on 127.0.0.1:57055 +1499152037160 geckodriver::marionette INFO Starting browser /Applications/Firefox.app/Contents/MacOS/firefox-bin with args ["-marionette"] +1499152038852 Marionette INFO Listening on port 57069 +1499152038971 Marionette WARN TLS certificate errors will be ignored for this session +1499152039156 Marionette DEBUG loaded listener.js +1499152039183 Marionette DEBUG Received DOM event "beforeunload" for "about:blank" +1499152039208 Marionette DEBUG Received DOM event "pagehide" for "about:blank" +1499152039208 Marionette DEBUG Received DOM event "unload" for "about:blank" +1499152039213 Marionette DEBUG Received DOM event "DOMContentLoaded" for "about:blank" +1499152039215 Marionette DEBUG Received DOM event "pageshow" for "about:blank" +2017-07-04 02:07:19.245 plugin-container[13266:398090] *** CFMessagePort: bootstrap_register(): failed 1100 (0x44c) 'Permission denied', port = 0x9c37, name = 'com.apple.tsm.portname' +See /usr/include/servers/bootstrap_defs.h for the error codes. +2017-07-04 02:07:19.250 plugin-container[13266:398090] *** CFMessagePort: bootstrap_register(): failed 1100 (0x44c) 'Permission denied', port = 0x9f03, name = 'com.apple.CFPasteboardClient' +See /usr/include/servers/bootstrap_defs.h for the error codes. +1499152039258 Marionette DEBUG Received DOM event "beforeunload" for "about:blank" +1499152039265 Marionette DEBUG Received DOM event "pagehide" for "about:blank" +1499152039265 Marionette DEBUG Received DOM event "unload" for "about:blank" +1499152039925 Marionette DEBUG Received DOM event "DOMContentLoaded" for "http://127.0.0.1:8181/#/login" +1499152039990 Marionette DEBUG Received DOM event "pageshow" for "http://127.0.0.1:8181/#/login" +1499152043357 Marionette DEBUG Canceled page load listener because no navigation has been detected +1499152045536 Marionette DEBUG Canceled page load listener because no navigation has been detected +1499152046138 Marionette DEBUG Received DOM event "hashchange" for "http://127.0.0.1:8181/#/admin" +1499152047577 Marionette DEBUG Received DOM event "hashchange" for "http://127.0.0.1:8181/#/admin/admin/checklist-template" +1499152047897 Marionette DEBUG Canceled page load listener because no navigation has been detected +1499152049548 Marionette DEBUG Canceled page load listener because no navigation has been detected +1499152050325 Marionette DEBUG Canceled page load listener because no navigation has been detected +1499152050484 geckodriver INFO Listening on 127.0.0.1:57252 +1499152051476 geckodriver::marionette INFO Starting browser /Applications/Firefox.app/Contents/MacOS/firefox-bin with args ["-marionette"] +1499152053142 Marionette INFO Listening on port 57265 +1499152053262 Marionette WARN TLS certificate errors will be ignored for this session +1499152053485 Marionette DEBUG loaded listener.js +1499152053532 Marionette DEBUG Received DOM event "beforeunload" for "about:blank" +1499152053550 Marionette DEBUG Received DOM event "pagehide" for "about:blank" +1499152053551 Marionette DEBUG Received DOM event "unload" for "about:blank" +1499152053556 Marionette DEBUG Received DOM event "DOMContentLoaded" for "about:blank" +1499152053559 Marionette DEBUG Received DOM event "pageshow" for "about:blank" +2017-07-04 02:07:33.596 plugin-container[13295:399183] *** CFMessagePort: bootstrap_register(): failed 1100 (0x44c) 'Permission denied', port = 0x9c3b, name = 'com.apple.tsm.portname' +See /usr/include/servers/bootstrap_defs.h for the error codes. +2017-07-04 02:07:33.597 plugin-container[13295:399183] *** CFMessagePort: bootstrap_register(): failed 1100 (0x44c) 'Permission denied', port = 0xa003, name = 'com.apple.CFPasteboardClient' +See /usr/include/servers/bootstrap_defs.h for the error codes. +1499152053611 Marionette DEBUG Received DOM event "beforeunload" for "about:blank" +1499152053619 Marionette DEBUG Received DOM event "pagehide" for "about:blank" +1499152053619 Marionette DEBUG Received DOM event "unload" for "about:blank" +1499152054212 Marionette DEBUG Received DOM event "DOMContentLoaded" for "http://127.0.0.1:8181/#/login" +1499152054272 Marionette DEBUG Received DOM event "pageshow" for "http://127.0.0.1:8181/#/login" +1499152077178 geckodriver INFO Listening on 127.0.0.1:57415 +1499152078176 geckodriver::marionette INFO Starting browser /Applications/Firefox.app/Contents/MacOS/firefox-bin with args ["-marionette"] +1499152079886 Marionette INFO Listening on port 57424 +1499152080004 Marionette WARN TLS certificate errors will be ignored for this session +1499152080192 Marionette DEBUG loaded listener.js +2017-07-04 02:08:00.253 plugin-container[13340:400268] *** CFMessagePort: bootstrap_register(): failed 1100 (0x44c) 'Permission denied', port = 0x9c3b, name = 'com.apple.tsm.portname' +See /usr/include/servers/bootstrap_defs.h for the error codes. +2017-07-04 02:08:00.254 plugin-container[13340:400268] *** CFMessagePort: bootstrap_register(): failed 1100 (0x44c) 'Permission denied', port = 0x9f03, name = 'com.apple.CFPasteboardClient' +See /usr/include/servers/bootstrap_defs.h for the error codes. +1499152080885 Marionette DEBUG Received DOM event "beforeunload" for "about:blank" +1499152080888 Marionette DEBUG Received DOM event "pagehide" for "about:blank" +1499152080889 Marionette DEBUG Received DOM event "unload" for "about:blank" +1499152080893 Marionette DEBUG Received DOM event "DOMContentLoaded" for "about:blank" +1499152080894 Marionette DEBUG Received DOM event "pageshow" for "about:blank" +1499152080913 Marionette DEBUG Received DOM event "beforeunload" for "about:blank" +1499152080921 Marionette DEBUG Received DOM event "pagehide" for "about:blank" +1499152080922 Marionette DEBUG Received DOM event "unload" for "about:blank" +1499152081514 Marionette DEBUG Received DOM event "DOMContentLoaded" for "http://127.0.0.1:8181/#/login" +1499152081569 Marionette DEBUG Received DOM event "pageshow" for "http://127.0.0.1:8181/#/login" +1499152082003 Marionette DEBUG Received DOM event "beforeunload" for "http://127.0.0.1:8181/#/login" +1499152082008 Marionette DEBUG Received DOM event "pagehide" for "http://127.0.0.1:8181/#/login" +1499152082008 Marionette DEBUG Received DOM event "unload" for "http://127.0.0.1:8181/#/login" +1499152082015 Marionette DEBUG Received DOM event "DOMContentLoaded" for "http://127.0.0.1:8181/#/login" +1499152082017 Marionette DEBUG Received DOM event "pageshow" for "http://127.0.0.1:8181/#/login" +1499152082030 Marionette DEBUG Received DOM event "beforeunload" for "http://127.0.0.1:8181/#/login" +1499152082034 Marionette DEBUG Received DOM event "pagehide" for "http://127.0.0.1:8181/#/login" +1499152082034 Marionette DEBUG Received DOM event "unload" for "http://127.0.0.1:8181/#/login" +1499152082617 Marionette DEBUG Received DOM event "DOMContentLoaded" for "http://127.0.0.1:8181/#/login" +1499152082655 Marionette DEBUG Received DOM event "pageshow" for "http://127.0.0.1:8181/#/login" +1499152086054 Marionette DEBUG Canceled page load listener because no navigation has been detected +1499152090313 Marionette DEBUG Canceled page load listener because no navigation has been detected +1499152092345 Marionette DEBUG Received DOM event "hashchange" for "http://127.0.0.1:8181/#/dashboard/detailedview" +1499152093177 Marionette DEBUG Canceled page load listener because no navigation has been detected +1499152093483 Marionette DEBUG Canceled page load listener because no navigation has been detected +1499152094244 Marionette DEBUG Canceled page load listener because no navigation has been detected +1499152155116 Marionette DEBUG Received DOM event "beforeunload" for "http://127.0.0.1:8181/#/dashboard/detailedview" +1499152155119 Marionette DEBUG Received DOM event "pagehide" for "http://127.0.0.1:8181/#/dashboard/detailedview" +1499152155120 Marionette DEBUG Received DOM event "unload" for "http://127.0.0.1:8181/#/dashboard/detailedview" +1499152155126 Marionette DEBUG Received DOM event "DOMContentLoaded" for "http://127.0.0.1:8181/#/dashboard/detailedview" +1499152155127 Marionette DEBUG Received DOM event "pageshow" for "http://127.0.0.1:8181/#/dashboard/detailedview" +1499152155145 Marionette DEBUG Received DOM event "beforeunload" for "http://127.0.0.1:8181/#/dashboard/detailedview" +1499152155156 Marionette DEBUG Received DOM event "pagehide" for "http://127.0.0.1:8181/#/dashboard/detailedview" +1499152155156 Marionette DEBUG Received DOM event "unload" for "http://127.0.0.1:8181/#/dashboard/detailedview" +1499152155709 Marionette DEBUG Received DOM event "DOMContentLoaded" for "http://127.0.0.1:8181/#/login" +1499152155739 Marionette DEBUG Received DOM event "pageshow" for "http://127.0.0.1:8181/#/login" +1499152155754 Marionette DEBUG Received DOM event "beforeunload" for "http://127.0.0.1:8181/#/login" +1499152155758 Marionette DEBUG Received DOM event "pagehide" for "http://127.0.0.1:8181/#/login" +1499152155758 Marionette DEBUG Received DOM event "unload" for "http://127.0.0.1:8181/#/login" +1499152155791 Marionette DEBUG Received DOM event "DOMContentLoaded" for "http://127.0.0.1:8181/#/login" +1499152155793 Marionette DEBUG Received DOM event "pageshow" for "http://127.0.0.1:8181/#/login" +1499152155799 Marionette DEBUG Received DOM event "beforeunload" for "http://127.0.0.1:8181/#/login" +1499152155810 Marionette DEBUG Received DOM event "pagehide" for "http://127.0.0.1:8181/#/login" +1499152155811 Marionette DEBUG Received DOM event "unload" for "http://127.0.0.1:8181/#/login" +1499152156412 Marionette DEBUG Received DOM event "DOMContentLoaded" for "http://127.0.0.1:8181/#/login" +1499152156436 Marionette DEBUG Received DOM event "pageshow" for "http://127.0.0.1:8181/#/login" +1499152159358 Marionette DEBUG Canceled page load listener because no navigation has been detected +1499152163542 Marionette DEBUG Canceled page load listener because no navigation has been detected +1499152165477 Marionette DEBUG Received DOM event "hashchange" for "http://127.0.0.1:8181/#/dashboard/detailedview" +1499152166834 Marionette DEBUG Canceled page load listener because no navigation has been detected +1499152167465 Marionette DEBUG Received DOM event "beforeunload" for "http://127.0.0.1:8181/#/dashboard/detailedview" +1499152167468 Marionette DEBUG Received DOM event "pagehide" for "http://127.0.0.1:8181/#/dashboard/detailedview" +1499152167469 Marionette DEBUG Received DOM event "unload" for "http://127.0.0.1:8181/#/dashboard/detailedview" +1499152167479 Marionette DEBUG Received DOM event "DOMContentLoaded" for "http://127.0.0.1:8181/#/dashboard/detailedview" +1499152167481 Marionette DEBUG Received DOM event "pageshow" for "http://127.0.0.1:8181/#/dashboard/detailedview" +1499152167489 Marionette DEBUG Received DOM event "beforeunload" for "http://127.0.0.1:8181/#/dashboard/detailedview" +1499152167495 Marionette DEBUG Received DOM event "pagehide" for "http://127.0.0.1:8181/#/dashboard/detailedview" +1499152167496 Marionette DEBUG Received DOM event "unload" for "http://127.0.0.1:8181/#/dashboard/detailedview" +1499152168065 Marionette DEBUG Received DOM event "DOMContentLoaded" for "http://127.0.0.1:8181/#/login" +1499152168097 Marionette DEBUG Received DOM event "pageshow" for "http://127.0.0.1:8181/#/login" +1499152168113 Marionette DEBUG Received DOM event "beforeunload" for "http://127.0.0.1:8181/#/login" +1499152168115 Marionette DEBUG Received DOM event "pagehide" for "http://127.0.0.1:8181/#/login" +1499152168115 Marionette DEBUG Received DOM event "unload" for "http://127.0.0.1:8181/#/login" +1499152168134 Marionette DEBUG Received DOM event "DOMContentLoaded" for "http://127.0.0.1:8181/#/login" +1499152168137 Marionette DEBUG Received DOM event "pageshow" for "http://127.0.0.1:8181/#/login" +1499152168163 Marionette DEBUG Received DOM event "beforeunload" for "http://127.0.0.1:8181/#/login" +1499152168168 Marionette DEBUG Received DOM event "pagehide" for "http://127.0.0.1:8181/#/login" +1499152168168 Marionette DEBUG Received DOM event "unload" for "http://127.0.0.1:8181/#/login" +1499152168754 Marionette DEBUG Received DOM event "DOMContentLoaded" for "http://127.0.0.1:8181/#/login" +1499152168817 Marionette DEBUG Received DOM event "pageshow" for "http://127.0.0.1:8181/#/login" +1499152171740 Marionette DEBUG Canceled page load listener because no navigation has been detected +1499152175833 Marionette DEBUG Canceled page load listener because no navigation has been detected +1499152177782 Marionette DEBUG Received DOM event "hashchange" for "http://127.0.0.1:8181/#/dashboard/detailedview" +1499152179164 Marionette DEBUG Canceled page load listener because no navigation has been detected +1499152180476 Marionette DEBUG Canceled page load listener because no navigation has been detected +1499152181234 Marionette DEBUG Canceled page load listener because no navigation has been detected +1499152182398 Marionette DEBUG Received DOM event "beforeunload" for "http://127.0.0.1:8181/#/dashboard/detailedview" +1499152182401 Marionette DEBUG Received DOM event "pagehide" for "http://127.0.0.1:8181/#/dashboard/detailedview" +1499152182405 Marionette DEBUG Received DOM event "unload" for "http://127.0.0.1:8181/#/dashboard/detailedview" +1499152182431 Marionette DEBUG Received DOM event "DOMContentLoaded" for "http://127.0.0.1:8181/#/dashboard/detailedview" +1499152182433 Marionette DEBUG Received DOM event "pageshow" for "http://127.0.0.1:8181/#/dashboard/detailedview" +1499152182440 Marionette DEBUG Received DOM event "beforeunload" for "http://127.0.0.1:8181/#/dashboard/detailedview" +1499152182444 Marionette DEBUG Received DOM event "pagehide" for "http://127.0.0.1:8181/#/dashboard/detailedview" +1499152182444 Marionette DEBUG Received DOM event "unload" for "http://127.0.0.1:8181/#/dashboard/detailedview" +1499152183098 Marionette DEBUG Received DOM event "DOMContentLoaded" for "http://127.0.0.1:8181/#/login" +1499152183129 Marionette DEBUG Received DOM event "pageshow" for "http://127.0.0.1:8181/#/login" +1499152183136 Marionette DEBUG Received DOM event "beforeunload" for "http://127.0.0.1:8181/#/login" +1499152183138 Marionette DEBUG Received DOM event "pagehide" for "http://127.0.0.1:8181/#/login" +1499152183138 Marionette DEBUG Received DOM event "unload" for "http://127.0.0.1:8181/#/login" +1499152183157 Marionette DEBUG Received DOM event "DOMContentLoaded" for "http://127.0.0.1:8181/#/login" +1499152183158 Marionette DEBUG Received DOM event "pageshow" for "http://127.0.0.1:8181/#/login" +1499152183167 Marionette DEBUG Received DOM event "beforeunload" for "http://127.0.0.1:8181/#/login" +1499152183173 Marionette DEBUG Received DOM event "pagehide" for "http://127.0.0.1:8181/#/login" +1499152183173 Marionette DEBUG Received DOM event "unload" for "http://127.0.0.1:8181/#/login" +1499152183739 Marionette DEBUG Received DOM event "DOMContentLoaded" for "http://127.0.0.1:8181/#/login" +1499152183775 Marionette DEBUG Received DOM event "pageshow" for "http://127.0.0.1:8181/#/login" +1499152186659 Marionette DEBUG Canceled page load listener because no navigation has been detected +1499152190504 Marionette DEBUG Canceled page load listener because no navigation has been detected +1499152192478 Marionette DEBUG Received DOM event "hashchange" for "http://127.0.0.1:8181/#/dashboard/detailedview" +1499152193839 Marionette DEBUG Canceled page load listener because no navigation has been detected +1499152195145 Marionette DEBUG Canceled page load listener because no navigation has been detected +1499152195905 Marionette DEBUG Canceled page load listener because no navigation has been detected +1499152197079 Marionette DEBUG Received DOM event "beforeunload" for "http://127.0.0.1:8181/#/dashboard/detailedview" +1499152197082 Marionette DEBUG Received DOM event "pagehide" for "http://127.0.0.1:8181/#/dashboard/detailedview" +1499152197084 Marionette DEBUG Received DOM event "unload" for "http://127.0.0.1:8181/#/dashboard/detailedview" +1499152197091 Marionette DEBUG Received DOM event "DOMContentLoaded" for "http://127.0.0.1:8181/#/dashboard/detailedview" +1499152197093 Marionette DEBUG Received DOM event "pageshow" for "http://127.0.0.1:8181/#/dashboard/detailedview" +1499152197104 Marionette DEBUG Received DOM event "beforeunload" for "http://127.0.0.1:8181/#/dashboard/detailedview" +1499152197111 Marionette DEBUG Received DOM event "pagehide" for "http://127.0.0.1:8181/#/dashboard/detailedview" +1499152197111 Marionette DEBUG Received DOM event "unload" for "http://127.0.0.1:8181/#/dashboard/detailedview" +1499152197649 Marionette DEBUG Received DOM event "DOMContentLoaded" for "http://127.0.0.1:8181/#/login" +1499152197684 Marionette DEBUG Received DOM event "pageshow" for "http://127.0.0.1:8181/#/login" +1499152197691 Marionette DEBUG Received DOM event "beforeunload" for "http://127.0.0.1:8181/#/login" +1499152197693 Marionette DEBUG Received DOM event "pagehide" for "http://127.0.0.1:8181/#/login" +1499152197693 Marionette DEBUG Received DOM event "unload" for "http://127.0.0.1:8181/#/login" +1499152197713 Marionette DEBUG Received DOM event "DOMContentLoaded" for "http://127.0.0.1:8181/#/login" +1499152197714 Marionette DEBUG Received DOM event "pageshow" for "http://127.0.0.1:8181/#/login" +1499152197725 Marionette DEBUG Received DOM event "beforeunload" for "http://127.0.0.1:8181/#/login" +1499152197731 Marionette DEBUG Received DOM event "pagehide" for "http://127.0.0.1:8181/#/login" +1499152197731 Marionette DEBUG Received DOM event "unload" for "http://127.0.0.1:8181/#/login" +1499152198263 Marionette DEBUG Received DOM event "DOMContentLoaded" for "http://127.0.0.1:8181/#/login" +1499152198298 Marionette DEBUG Received DOM event "pageshow" for "http://127.0.0.1:8181/#/login" +1499152201102 Marionette DEBUG Canceled page load listener because no navigation has been detected +1499152205152 Marionette DEBUG Canceled page load listener because no navigation has been detected +1499152207069 Marionette DEBUG Received DOM event "hashchange" for "http://127.0.0.1:8181/#/dashboard/detailedview" +1499152209036 Marionette DEBUG Canceled page load listener because no navigation has been detected +1499152209327 Marionette DEBUG Canceled page load listener because no navigation has been detected +1499152210183 Marionette DEBUG Canceled page load listener because no navigation has been detected +1499163847081 geckodriver INFO Listening on 127.0.0.1:64615 +1499163848065 geckodriver::marionette INFO Starting browser /Applications/Firefox.app/Contents/MacOS/firefox-bin with args ["-marionette"] +1499163850042 Marionette INFO Listening on port 64626 +1499163850123 Marionette WARN TLS certificate errors will be ignored for this session +1499163850330 Marionette DEBUG loaded listener.js +2017-07-04 05:24:10.413 plugin-container[27347:830870] *** CFMessagePort: bootstrap_register(): failed 1100 (0x44c) 'Permission denied', port = 0x9e3b, name = 'com.apple.tsm.portname' +See /usr/include/servers/bootstrap_defs.h for the error codes. +2017-07-04 05:24:10.416 plugin-container[27347:830870] *** CFMessagePort: bootstrap_register(): failed 1100 (0x44c) 'Permission denied', port = 0xa103, name = 'com.apple.CFPasteboardClient' +See /usr/include/servers/bootstrap_defs.h for the error codes. +1499163877275 geckodriver INFO Listening on 127.0.0.1:64761 +1499163878267 geckodriver::marionette INFO Starting browser /Applications/Firefox.app/Contents/MacOS/firefox-bin with args ["-marionette"] +1499163880122 Marionette INFO Listening on port 64771 +1499163880198 Marionette WARN TLS certificate errors will be ignored for this session +1499163880395 Marionette DEBUG loaded listener.js +2017-07-04 05:24:40.477 plugin-container[27398:832466] *** CFMessagePort: bootstrap_register(): failed 1100 (0x44c) 'Permission denied', port = 0x9d3b, name = 'com.apple.tsm.portname' +See /usr/include/servers/bootstrap_defs.h for the error codes. +2017-07-04 05:24:40.480 plugin-container[27398:832466] *** CFMessagePort: bootstrap_register(): failed 1100 (0x44c) 'Permission denied', port = 0xa103, name = 'com.apple.CFPasteboardClient' +See /usr/include/servers/bootstrap_defs.h for the error codes. +1499163881587 Marionette DEBUG Received DOM event "beforeunload" for "about:blank" +1499163881591 Marionette DEBUG Received DOM event "pagehide" for "about:blank" +1499163881591 Marionette DEBUG Received DOM event "unload" for "about:blank" +1499163881595 Marionette DEBUG Received DOM event "DOMContentLoaded" for "about:blank" +1499163881597 Marionette DEBUG Received DOM event "pageshow" for "about:blank" +1499163881616 Marionette DEBUG Received DOM event "beforeunload" for "about:blank" +1499163881625 Marionette DEBUG Received DOM event "pagehide" for "about:blank" +1499163881626 Marionette DEBUG Received DOM event "unload" for "about:blank" +1499163882259 Marionette DEBUG Received DOM event "DOMContentLoaded" for "http://127.0.0.1:8181/#/login" +1499163882316 Marionette DEBUG Received DOM event "pageshow" for "http://127.0.0.1:8181/#/login" +1499163886432 Marionette DEBUG Canceled page load listener because no navigation has been detected +1499163890603 Marionette DEBUG Canceled page load listener because no navigation has been detected +1499163892524 Marionette DEBUG Canceled page load listener because no navigation has been detected +1499163892835 Marionette DEBUG Canceled page load listener because no navigation has been detected +1499163894379 Marionette DEBUG Canceled page load listener because no navigation has been detected +1499163894489 Marionette DEBUG Received DOM event "beforeunload" for "http://127.0.0.1:8181/#/dashboard/overview" +1499163894494 Marionette DEBUG Received DOM event "pagehide" for "http://127.0.0.1:8181/#/dashboard/overview" +1499163894500 Marionette DEBUG Received DOM event "unload" for "http://127.0.0.1:8181/#/dashboard/overview" +1499163894513 Marionette DEBUG Received DOM event "DOMContentLoaded" for "http://127.0.0.1:8181/#/dashboard/overview" +1499163894515 Marionette DEBUG Received DOM event "pageshow" for "http://127.0.0.1:8181/#/dashboard/overview" +1499163894528 Marionette DEBUG Received DOM event "beforeunload" for "http://127.0.0.1:8181/#/dashboard/overview" +1499163894534 Marionette DEBUG Received DOM event "pagehide" for "http://127.0.0.1:8181/#/dashboard/overview" +1499163894535 Marionette DEBUG Received DOM event "unload" for "http://127.0.0.1:8181/#/dashboard/overview" +1499163895106 Marionette DEBUG Received DOM event "DOMContentLoaded" for "http://127.0.0.1:8181/#/login" +1499163895134 Marionette DEBUG Received DOM event "pageshow" for "http://127.0.0.1:8181/#/login" +1499163895154 Marionette DEBUG Received DOM event "beforeunload" for "http://127.0.0.1:8181/#/login" +1499163895157 Marionette DEBUG Received DOM event "pagehide" for "http://127.0.0.1:8181/#/login" +1499163895157 Marionette DEBUG Received DOM event "unload" for "http://127.0.0.1:8181/#/login" +1499163895184 Marionette DEBUG Received DOM event "DOMContentLoaded" for "http://127.0.0.1:8181/#/login" +1499163895187 Marionette DEBUG Received DOM event "pageshow" for "http://127.0.0.1:8181/#/login" +1499163895204 Marionette DEBUG Received DOM event "beforeunload" for "http://127.0.0.1:8181/#/login" +1499163895226 Marionette DEBUG Received DOM event "pagehide" for "http://127.0.0.1:8181/#/login" +1499163895226 Marionette DEBUG Received DOM event "unload" for "http://127.0.0.1:8181/#/login" +1499163895851 Marionette DEBUG Received DOM event "DOMContentLoaded" for "http://127.0.0.1:8181/#/login" +1499163895895 Marionette DEBUG Received DOM event "pageshow" for "http://127.0.0.1:8181/#/login" +1499163899489 Marionette DEBUG Canceled page load listener because no navigation has been detected +1499163903430 Marionette DEBUG Canceled page load listener because no navigation has been detected +1499163905198 Marionette DEBUG Canceled page load listener because no navigation has been detected +1499163905517 Marionette DEBUG Canceled page load listener because no navigation has been detected +1499163907094 Marionette DEBUG Canceled page load listener because no navigation has been detected +1499163907202 Marionette DEBUG Received DOM event "beforeunload" for "http://127.0.0.1:8181/#/dashboard/overview" +1499163907205 Marionette DEBUG Received DOM event "pagehide" for "http://127.0.0.1:8181/#/dashboard/overview" +1499163907209 Marionette DEBUG Received DOM event "unload" for "http://127.0.0.1:8181/#/dashboard/overview" +1499163907219 Marionette DEBUG Received DOM event "DOMContentLoaded" for "http://127.0.0.1:8181/#/dashboard/overview" +1499163907222 Marionette DEBUG Received DOM event "pageshow" for "http://127.0.0.1:8181/#/dashboard/overview" +1499163907236 Marionette DEBUG Received DOM event "beforeunload" for "http://127.0.0.1:8181/#/dashboard/overview" +1499163907247 Marionette DEBUG Received DOM event "pagehide" for "http://127.0.0.1:8181/#/dashboard/overview" +1499163907247 Marionette DEBUG Received DOM event "unload" for "http://127.0.0.1:8181/#/dashboard/overview" +1499163907874 Marionette DEBUG Received DOM event "DOMContentLoaded" for "http://127.0.0.1:8181/#/login" +1499163907905 Marionette DEBUG Received DOM event "pageshow" for "http://127.0.0.1:8181/#/login" +1499163907915 Marionette DEBUG Received DOM event "beforeunload" for "http://127.0.0.1:8181/#/login" +1499163907916 Marionette DEBUG Received DOM event "pagehide" for "http://127.0.0.1:8181/#/login" +1499163907916 Marionette DEBUG Received DOM event "unload" for "http://127.0.0.1:8181/#/login" +1499163907939 Marionette DEBUG Received DOM event "DOMContentLoaded" for "http://127.0.0.1:8181/#/login" +1499163907941 Marionette DEBUG Received DOM event "pageshow" for "http://127.0.0.1:8181/#/login" +1499163907949 Marionette DEBUG Received DOM event "beforeunload" for "http://127.0.0.1:8181/#/login" +1499163907962 Marionette DEBUG Received DOM event "pagehide" for "http://127.0.0.1:8181/#/login" +1499163907962 Marionette DEBUG Received DOM event "unload" for "http://127.0.0.1:8181/#/login" +1499163908599 Marionette DEBUG Received DOM event "DOMContentLoaded" for "http://127.0.0.1:8181/#/login" +1499163908769 Marionette DEBUG Received DOM event "pageshow" for "http://127.0.0.1:8181/#/login" +1499163912416 Marionette DEBUG Canceled page load listener because no navigation has been detected +1499163916378 Marionette DEBUG Canceled page load listener because no navigation has been detected +1499163918004 Marionette DEBUG Canceled page load listener because no navigation has been detected +1499163918277 Marionette DEBUG Canceled page load listener because no navigation has been detected +1499163918558 Marionette DEBUG Canceled page load listener because no navigation has been detected +1499163928608 Marionette DEBUG Received DOM event "beforeunload" for "http://127.0.0.1:8181/#/dashboard/overview" +1499163928611 Marionette DEBUG Received DOM event "pagehide" for "http://127.0.0.1:8181/#/dashboard/overview" +1499163928611 Marionette DEBUG Received DOM event "unload" for "http://127.0.0.1:8181/#/dashboard/overview" +1499163928618 Marionette DEBUG Received DOM event "DOMContentLoaded" for "http://127.0.0.1:8181/#/dashboard/overview" +1499163928620 Marionette DEBUG Received DOM event "pageshow" for "http://127.0.0.1:8181/#/dashboard/overview" +1499163928631 Marionette DEBUG Received DOM event "beforeunload" for "http://127.0.0.1:8181/#/dashboard/overview" +1499163928638 Marionette DEBUG Received DOM event "pagehide" for "http://127.0.0.1:8181/#/dashboard/overview" +1499163928638 Marionette DEBUG Received DOM event "unload" for "http://127.0.0.1:8181/#/dashboard/overview" +1499163929238 Marionette DEBUG Received DOM event "DOMContentLoaded" for "http://127.0.0.1:8181/#/login" +1499163929286 Marionette DEBUG Received DOM event "pageshow" for "http://127.0.0.1:8181/#/login" +1499163929299 Marionette DEBUG Received DOM event "beforeunload" for "http://127.0.0.1:8181/#/login" +1499163929301 Marionette DEBUG Received DOM event "pagehide" for "http://127.0.0.1:8181/#/login" +1499163929301 Marionette DEBUG Received DOM event "unload" for "http://127.0.0.1:8181/#/login" +1499163929306 Marionette DEBUG Received DOM event "DOMContentLoaded" for "http://127.0.0.1:8181/#/login" +1499163929307 Marionette DEBUG Received DOM event "pageshow" for "http://127.0.0.1:8181/#/login" +1499163929323 Marionette DEBUG Received DOM event "beforeunload" for "http://127.0.0.1:8181/#/login" +1499163929331 Marionette DEBUG Received DOM event "pagehide" for "http://127.0.0.1:8181/#/login" +1499163929331 Marionette DEBUG Received DOM event "unload" for "http://127.0.0.1:8181/#/login" +1499163929911 Marionette DEBUG Received DOM event "DOMContentLoaded" for "http://127.0.0.1:8181/#/login" +1499163929942 Marionette DEBUG Received DOM event "pageshow" for "http://127.0.0.1:8181/#/login" +1499163933589 Marionette DEBUG Canceled page load listener because no navigation has been detected +1499163937477 Marionette DEBUG Canceled page load listener because no navigation has been detected +1499163939417 Marionette DEBUG Canceled page load listener because no navigation has been detected +1499164000086 Marionette DEBUG Received DOM event "beforeunload" for "http://127.0.0.1:8181/#/dashboard/overview" +1499164000089 Marionette DEBUG Received DOM event "pagehide" for "http://127.0.0.1:8181/#/dashboard/overview" +1499164000089 Marionette DEBUG Received DOM event "unload" for "http://127.0.0.1:8181/#/dashboard/overview" +1499164000095 Marionette DEBUG Received DOM event "DOMContentLoaded" for "http://127.0.0.1:8181/#/dashboard/overview" +1499164000097 Marionette DEBUG Received DOM event "pageshow" for "http://127.0.0.1:8181/#/dashboard/overview" +1499164000110 Marionette DEBUG Received DOM event "beforeunload" for "http://127.0.0.1:8181/#/dashboard/overview" +1499164000118 Marionette DEBUG Received DOM event "pagehide" for "http://127.0.0.1:8181/#/dashboard/overview" +1499164000118 Marionette DEBUG Received DOM event "unload" for "http://127.0.0.1:8181/#/dashboard/overview" +1499164000733 Marionette DEBUG Received DOM event "DOMContentLoaded" for "http://127.0.0.1:8181/#/login" +1499164000775 Marionette DEBUG Received DOM event "pageshow" for "http://127.0.0.1:8181/#/login" +1499164000796 Marionette DEBUG Received DOM event "beforeunload" for "http://127.0.0.1:8181/#/login" +1499164000797 Marionette DEBUG Received DOM event "pagehide" for "http://127.0.0.1:8181/#/login" +1499164000798 Marionette DEBUG Received DOM event "unload" for "http://127.0.0.1:8181/#/login" +1499164000808 Marionette DEBUG Received DOM event "DOMContentLoaded" for "http://127.0.0.1:8181/#/login" +1499164000810 Marionette DEBUG Received DOM event "pageshow" for "http://127.0.0.1:8181/#/login" +1499164000830 Marionette DEBUG Received DOM event "beforeunload" for "http://127.0.0.1:8181/#/login" +1499164000835 Marionette DEBUG Received DOM event "pagehide" for "http://127.0.0.1:8181/#/login" +1499164000835 Marionette DEBUG Received DOM event "unload" for "http://127.0.0.1:8181/#/login" +1499164001442 Marionette DEBUG Received DOM event "DOMContentLoaded" for "http://127.0.0.1:8181/#/login" +1499164001473 Marionette DEBUG Received DOM event "pageshow" for "http://127.0.0.1:8181/#/login" +1499164005002 Marionette DEBUG Canceled page load listener because no navigation has been detected +1499164009125 Marionette DEBUG Canceled page load listener because no navigation has been detected +1499164011222 Marionette DEBUG Canceled page load listener because no navigation has been detected +1499164061184 geckodriver INFO Listening on 127.0.0.1:49840 +1499164062184 geckodriver::marionette INFO Starting browser /Applications/Firefox.app/Contents/MacOS/firefox-bin with args ["-marionette"] +1499164063929 Marionette INFO Listening on port 49853 +1499164064005 Marionette WARN TLS certificate errors will be ignored for this session +1499164064194 Marionette DEBUG loaded listener.js +2017-07-04 05:27:44.263 plugin-container[27664:839177] *** CFMessagePort: bootstrap_register(): failed 1100 (0x44c) 'Permission denied', port = 0x9c3b, name = 'com.apple.tsm.portname' +See /usr/include/servers/bootstrap_defs.h for the error codes. +2017-07-04 05:27:44.265 plugin-container[27664:839177] *** CFMessagePort: bootstrap_register(): failed 1100 (0x44c) 'Permission denied', port = 0xa003, name = 'com.apple.CFPasteboardClient' +See /usr/include/servers/bootstrap_defs.h for the error codes. +1499164064905 Marionette DEBUG Received DOM event "beforeunload" for "about:blank" +1499164064908 Marionette DEBUG Received DOM event "pagehide" for "about:blank" +1499164064909 Marionette DEBUG Received DOM event "unload" for "about:blank" +1499164064912 Marionette DEBUG Received DOM event "DOMContentLoaded" for "about:blank" +1499164064914 Marionette DEBUG Received DOM event "pageshow" for "about:blank" +1499164064938 Marionette DEBUG Received DOM event "beforeunload" for "about:blank" +1499164064945 Marionette DEBUG Received DOM event "pagehide" for "about:blank" +1499164064945 Marionette DEBUG Received DOM event "unload" for "about:blank" +1499164065588 Marionette DEBUG Received DOM event "DOMContentLoaded" for "http://127.0.0.1:8181/#/login" +1499164065656 Marionette DEBUG Received DOM event "pageshow" for "http://127.0.0.1:8181/#/login" +1499164076153 Marionette DEBUG Canceled page load listener because no navigation has been detected +1499164081161 Marionette DEBUG Canceled page load listener because no navigation has been detected +1499164087611 Marionette DEBUG Canceled page load listener because no navigation has been detected +1499164096907 Marionette DEBUG Canceled page load listener because no navigation has been detected +1499164102838 Marionette DEBUG Canceled page load listener because no navigation has been detected +************************* +A coding exception was thrown and uncaught in a Task. + +Full message: TypeError: NetworkError when attempting to fetch resource. +Full stack: +************************* + +###!!! [Child][MessageChannel] Error: (msgtype=0x4400AB,name=PContent::Msg_ConsoleMessage) Channel closing: too late to send/recv, messages will be lost + +2017-07-05 01:29:32.549 plugin-container[69140:2641840] *** CFMessagePort: bootstrap_register(): failed 1100 (0x44c) 'Permission denied', port = 0x9c3b, name = 'com.apple.tsm.portname' +See /usr/include/servers/bootstrap_defs.h for the error codes. +2017-07-05 01:29:32.553 plugin-container[69140:2641840] *** CFMessagePort: bootstrap_register(): failed 1100 (0x44c) 'Permission denied', port = 0x9f03, name = 'com.apple.CFPasteboardClient' +See /usr/include/servers/bootstrap_defs.h for the error codes. +2017-07-05 05:00:06.804 plugin-container[81584:2977711] *** CFMessagePort: bootstrap_register(): failed 1100 (0x44c) 'Permission denied', port = 0x9c3b, name = 'com.apple.tsm.portname' +See /usr/include/servers/bootstrap_defs.h for the error codes. +2017-07-05 05:00:06.808 plugin-container[81584:2977711] *** CFMessagePort: bootstrap_register(): failed 1100 (0x44c) 'Permission denied', port = 0x9f03, name = 'com.apple.CFPasteboardClient' +See /usr/include/servers/bootstrap_defs.h for the error codes. +************************* +A coding exception was thrown and uncaught in a Task. + +Full message: TypeError: NetworkError when attempting to fetch resource. +Full stack: +************************* +************************* +A coding exception was thrown and uncaught in a Task. + +Full message: TypeError: NetworkError when attempting to fetch resource. +Full stack: +************************* +1499513160629 Marionette INFO Ceased listening diff --git a/tests/uiTests/test_admin_dropdown.py b/tests/uiTests/test_admin_dropdown.py new file mode 100644 index 0000000..25621f4 --- /dev/null +++ b/tests/uiTests/test_admin_dropdown.py @@ -0,0 +1,189 @@ + +# ============LICENSE_START========================================== +# org.onap.vvp/test-engine +# =================================================================== +# Copyright © 2017 AT&T Intellectual Property. All rights reserved. +# =================================================================== +# +# Unless otherwise specified, all software contained herein is licensed +# under the Apache License, Version 2.0 (the “License”); +# you may not use this software except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# Unless otherwise specified, all documentation contained herein is licensed +# under the Creative Commons License, Attribution 4.0 Intl. (the “License”); +# you may not use this documentation except in compliance with the License. +# You may obtain a copy of the License at +# +# https://creativecommons.org/licenses/by/4.0/ +# +# Unless required by applicable law or agreed to in writing, documentation +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ============LICENSE_END============================================ +# +# ECOMP is a trademark and service mark of AT&T Intellectual Property. +from django.conf import settings + +from iceci.decorator.exception_decor import exception +from services.constants import Constants +from services.logging_service import LoggingServiceFactory +from services.session import session +from services.types import API, DB, Frontend +from tests.uiTests.test_ui_base import TestUiBase + +logger = LoggingServiceFactory.get_logger() + + +class TestAdminDropdown(TestUiBase): + user_content = None + + @classmethod + def setUpClass(cls): + super(TestAdminDropdown, cls).setUpClass() + + cls.user_content = API.VirtualFunction.create_engagement( + wait_for_gitlab=False) + + @exception() + def test_archive_engagement(self): + Frontend.User.login( + Constants.Users.Admin.EMAIL, Constants.Default.Password.TEXT) + # Creating new engagement because we will archive it + user_content = API.Bridge.create_engagement() + API.VirtualFunction.set_eng_stage( + user_content, Constants.EngagementStages.ACTIVE) + # Verify users were added to git (only after git finishes its work on + # the engagement we are able to archive the engagement) + path_with_namespace = user_content[ + 'engagement_manual_id'] + "%2F" + user_content['vfName'] + if not API.GitLab.validate_git_project_members(path_with_namespace, user_content['email']): + raise Exception( + "Couldn't find the engagement lead user (%s) in GitLab." % user_content['email']) + Frontend.Dashboard.statuses_search_vf( + user_content['engagement_manual_id'], user_content['vfName']) + Frontend.Overview.click_on_archeive_engagement_from_dropdown() + Frontend.Overview.archive_engagement_modal( + user_content['engagement_manual_id'], user_content['vfName']) + + @exception() + def test_change_reviewer(self): + try: + Frontend.User.login( + Constants.Users.Admin.EMAIL, Constants.Default.Password.TEXT) + user_content = API.VirtualFunction.create_engagement( + wait_for_gitlab=False) + other_user = DB.User.select_el_not_in_engagement( + user_content['el_name'], user_content['pr_name']) + Frontend.Dashboard.statuses_search_vf( + user_content['engagement_manual_id'], user_content['vfName']) + Frontend.Overview.click_on_change_reviewer_from_dropdown() + Frontend.Overview.change_engagement_lead_modal(other_user) + finally: + DB.User.rollback_for_el_not_in_engagement() + + @exception() + def test_change_peer_reviewer(self): + try: + Frontend.User.login( + Constants.Users.Admin.EMAIL, Constants.Default.Password.TEXT) + other_user = DB.User.select_el_not_in_engagement( + self.user_content['el_name'], self.user_content['pr_name']) + Frontend.Dashboard.statuses_search_vf( + self.user_content['engagement_manual_id'], self.user_content['vfName']) + Frontend.Overview.click_on_change_peer_reviewer_from_dropdown() + Frontend.Overview.change_engagement_lead_modal( + other_user, is_reviewer=False) + finally: + DB.User.rollback_for_el_not_in_engagement() + + @exception() + def test_update_status(self): + Frontend.User.login( + Constants.Users.Admin.EMAIL, Constants.Default.Password.TEXT) + Frontend.Dashboard.statuses_search_vf( + self.user_content['engagement_manual_id'], self.user_content['vfName']) + Frontend.Overview.click_on_update_status_from_dropdown() + Frontend.Overview.fill_update_status_form_admin_dropdown() + + @exception() + def test_update_status_via_EL(self): + Frontend.User.login( + self.user_content['el_email'], Constants.Default.Password.TEXT) + Frontend.Dashboard.statuses_search_vf( + self.user_content['engagement_manual_id'], self.user_content['vfName']) + Frontend.Overview.click_on_update_status_from_dropdown() + Frontend.Overview.fill_update_status_form_admin_dropdown() + + @exception() + def test_update_status_via_peer_reviewer(self): + user_content = API.VirtualFunction.create_engagement( + wait_for_gitlab=False) + Frontend.User.login( + user_content['pr_email'], Constants.Default.Password.TEXT) + Frontend.Dashboard.statuses_search_vf( + user_content['engagement_manual_id'], user_content['vfName']) + Frontend.Overview.click_on_update_status_from_dropdown() + Frontend.Overview.fill_update_status_form_admin_dropdown() + + @exception() + def test_update_status_via_other_el(self): + try: + Frontend.User.login( + Constants.Users.Admin.EMAIL, Constants.Default.Password.TEXT) + other_el = DB.User.select_el_not_in_engagement( + self.user_content['el_name'], self.user_content['pr_name']) + other_el_email = DB.User.get_email_by_full_name(other_el) + Frontend.Dashboard.statuses_search_vf( + self.user_content['engagement_manual_id'], self.user_content['vfName']) + engName = self.user_content[ + 'engagement_manual_id'] + ": " + self.user_content['vfName'] + vf_left_nav_id = "clickable-" + engName + Frontend.User.open_invite_team_member_form(vf_left_nav_id) + Frontend.User.invite_single_user_to_team(other_el_email) + Frontend.General.re_open(Constants.Default.LoginURL.TEXT) + Frontend.Overview.invite_and_reopen_link( + self.user_content, other_el_email) + Frontend.User.login(other_el_email, Constants.Default.Password.TEXT, + Constants.Dashboard.Default.DASHBOARD_ID) + Frontend.Overview.click_on_update_status_from_dropdown() + Frontend.Overview.fill_update_status_form_admin_dropdown() + finally: + DB.User.rollback_for_el_not_in_engagement() + + @exception() + def test_remove_standard_users_after_archive_engagement(self): + Frontend.User.login( + Constants.Users.Admin.EMAIL, Constants.Default.Password.TEXT) + # Creating new engagement because we will archive it + user_content = API.Bridge.create_engagement() + API.VirtualFunction.set_eng_stage( + user_content, Constants.EngagementStages.ACTIVE) + path_with_namespace = user_content[ + 'engagement_manual_id'] + "%2F" + user_content['vfName'] + if not API.GitLab.validate_git_project_members(path_with_namespace, user_content['email']): + raise Exception( + "Couldn't find the inviter user (%s) in GitLab." % user_content['email']) + if settings.DATABASE_TYPE != 'local': + git_user = API.GitLab.get_git_user(user_content['email']) + git_user_id = str(git_user['id']) + Frontend.Dashboard.statuses_search_vf( + user_content['engagement_manual_id'], user_content['vfName']) + Frontend.Overview.click_on_archeive_engagement_from_dropdown() + Frontend.Overview.archive_engagement_modal( + user_content['engagement_manual_id'], user_content['vfName']) + API.GitLab.negative_validate_git_project_member( + path_with_namespace, user_content['email'], git_user_id) diff --git a/tests/uiTests/test_admin_section.py b/tests/uiTests/test_admin_section.py new file mode 100644 index 0000000..8ec9b44 --- /dev/null +++ b/tests/uiTests/test_admin_section.py @@ -0,0 +1,73 @@ + +# ============LICENSE_START========================================== +# org.onap.vvp/test-engine +# =================================================================== +# Copyright © 2017 AT&T Intellectual Property. All rights reserved. +# =================================================================== +# +# Unless otherwise specified, all software contained herein is licensed +# under the Apache License, Version 2.0 (the “License”); +# you may not use this software except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# Unless otherwise specified, all documentation contained herein is licensed +# under the Creative Commons License, Attribution 4.0 Intl. (the “License”); +# you may not use this documentation except in compliance with the License. +# You may obtain a copy of the License at +# +# https://creativecommons.org/licenses/by/4.0/ +# +# Unless required by applicable law or agreed to in writing, documentation +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ============LICENSE_END============================================ +# +# ECOMP is a trademark and service mark of AT&T Intellectual Property. +from iceci.decorator.exception_decor import exception +from services.constants import Constants +from services.logging_service import LoggingServiceFactory +from services.session import session +from services.types import Frontend, API +from tests.uiTests.test_ui_base import TestUiBase + + +logger = LoggingServiceFactory.get_logger() + + +class TestAdminSection(TestUiBase): + user_content = None + + @classmethod + def setUpClass(cls): + super(TestAdminSection, cls).setUpClass() + + cls.user_content = API.VirtualFunction.create_engagement(wait_for_gitlab=False) + + @exception() + def test_admin_page(self): + Frontend.User.login(Constants.Users.Admin.EMAIL, Constants.Default.Password.TEXT) + Frontend.User.go_to_account() + Frontend.User.go_to_admin() + + @exception() + def test_negative_admin_page(self): + users_email_list = [self.user_content['email'], self.user_content['pr_email'], self.user_content['el_email'], + Constants.Users.AdminRO.EMAIL] + for user_email in users_email_list: + Frontend.User.relogin(user_email, Constants.Default.Password.TEXT) + Frontend.User.click_on_avatar() + session.run_negative(lambda: Frontend.User.click_on_admin(), "Negative test failed at" + " click_on_admin with user %s" % user_email) diff --git a/tests/uiTests/test_bucket_e2e.py b/tests/uiTests/test_bucket_e2e.py new file mode 100644 index 0000000..d72af48 --- /dev/null +++ b/tests/uiTests/test_bucket_e2e.py @@ -0,0 +1,140 @@ + +# ============LICENSE_START========================================== +# org.onap.vvp/test-engine +# =================================================================== +# Copyright © 2017 AT&T Intellectual Property. All rights reserved. +# =================================================================== +# +# Unless otherwise specified, all software contained herein is licensed +# under the Apache License, Version 2.0 (the “License”); +# you may not use this software except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# Unless otherwise specified, all documentation contained herein is licensed +# under the Creative Commons License, Attribution 4.0 Intl. (the “License”); +# you may not use this documentation except in compliance with the License. +# You may obtain a copy of the License at +# +# https://creativecommons.org/licenses/by/4.0/ +# +# Unless required by applicable law or agreed to in writing, documentation +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ============LICENSE_END============================================ +# +# ECOMP is a trademark and service mark of AT&T Intellectual Property. +from pprint import pprint + +from wheel.signatures import assertTrue + +from iceci.decorator.exception_decor import exception +from services.constants import Constants +from services.database.db_user import DBUser +from services.helper import Helper +from services.logging_service import LoggingServiceFactory +from services.types import API +from tests.uiTests.test_ui_base import TestUiBase +from utils.cryptography import CryptographyText + + +logger = LoggingServiceFactory.get_logger() + + +class TestBucketE2E(TestUiBase): + def create_bucket_and_validate_users(self): + user_content = API.VirtualFunction.create_engagement( + wait_for_gitlab=True) + + print("***********STAGE = ",user_content['vfStage']) + API.VirtualFunction.set_eng_stage(user_content, Constants.EngagementStages.ACTIVE) + bucket_id = user_content['engagement_manual_id']+"_"+user_content['vfName'].lower() + print("***********bucket_id = ",bucket_id) + bucket = API.Rados.get_bucket(bucket_id) + assertTrue(API.Rados.is_bucket_ready(bucket_id)) + assertTrue(bucket != "None") + assertTrue(API.Rados.users_of_bucket_ready_after_created(bucket_id,user_content['full_name'])) + #validate users added to bucket + grants = API.Rados.get_bucket_grants(bucket_id) + count = 0 + for g in grants: + if g.id == user_content['full_name']: + count = +1 + + assertTrue(count > 0) + return bucket, user_content + + @exception() + def test_validate_bucket_created(self): + bucket, user_content = self.create_bucket_and_validate_users() + #create upload file + str_content = Helper.rand_string("randomString") + Helper.rand_string("randomNumber") + fileName = Helper.rand_string("randomString") + bucket_id = user_content['engagement_manual_id']+"_"+user_content['vfName'].lower() + bucket = API.Rados.get_bucket(bucket_id) + assertTrue(API.Rados.is_bucket_ready(bucket_id)) + key = bucket.new_key(fileName+'.dat') + key.set_contents_from_string(str_content) + pprint(key.generate_url(expires_in=400)) +# DOWNLOAD AN OBJECT (TO A FILE) + key = bucket.get_key(fileName+'.dat') + key.get_contents_to_filename('/home/'+fileName+'.dat') + key.delete() + + @exception() + def test_validate_bucket_removed(self): + bucket, user_content = self.create_bucket_and_validate_users() + #set Completed Stage + API.VirtualFunction.set_eng_stage( + user_content, Constants.EngagementStages.COMPLETED) + #validate users removed from bucket + bucket_id = user_content['engagement_manual_id']+"_"+user_content['vfName'].lower() + assertTrue(API.Rados.users_of_bucket_ready_after_complete(bucket_id,user_content['full_name'])) + assertTrue(API.Rados.is_bucket_ready(bucket_id)) + assertTrue(bucket != "None") + #try create upload file - must failed + str_content = Helper.rand_string("randomString") + Helper.rand_string("randomNumber") + fileName = Helper.rand_string("randomString") + bucket = API.Rados.get_bucket(bucket_id) + assertTrue(API.Rados.is_bucket_ready(bucket_id)) + key = bucket.new_key(fileName+'.dat') + key.set_contents_from_string(str_content) + pprint(key.generate_url(expires_in=400)) +# DOWNLOAD AN OBJECT (TO A FILE) + key = bucket.get_key(fileName+'.dat') + key.get_contents_to_filename('/home/'+fileName+'.dat') + key.delete() + + @exception() + def test_validate_upload_download_image_with_bucket_user(self): + bucket, user_content = self.create_bucket_and_validate_users() + #connect to bucket with specific user + bucket_id = user_content['engagement_manual_id']+"_"+user_content['vfName'].lower() + access_key = DBUser.get_access_key(user_content['uuid']) + secret_key = DBUser.get_access_secret(user_content['uuid']) + secret = CryptographyText.decrypt(secret_key) + bucket_for_specific_user = API.Rados.get_bucketfor_specific_user(bucket_id,access_key,secret) + assertTrue(bucket_for_specific_user != None) + #create upload file with user + str_content = Helper.rand_string("randomString") + Helper.rand_string("randomNumber") + fileName = Helper.rand_string("randomString") + key = bucket_for_specific_user.new_key(fileName+'.dat') + key.set_contents_from_string(str_content) + pprint(key.generate_url(expires_in=3600)) +# DOWNLOAD AN OBJECT (TO A FILE) + key = bucket_for_specific_user.get_key(fileName+'.dat') + key.get_contents_to_filename('/home/'+fileName+'.dat') + key.delete() + diff --git a/tests/uiTests/test_bucket_url.py b/tests/uiTests/test_bucket_url.py new file mode 100644 index 0000000..05f857f --- /dev/null +++ b/tests/uiTests/test_bucket_url.py @@ -0,0 +1,75 @@ + +# ============LICENSE_START========================================== +# org.onap.vvp/test-engine +# =================================================================== +# Copyright © 2017 AT&T Intellectual Property. All rights reserved. +# =================================================================== +# +# Unless otherwise specified, all software contained herein is licensed +# under the Apache License, Version 2.0 (the “License”); +# you may not use this software except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# Unless otherwise specified, all documentation contained herein is licensed +# under the Creative Commons License, Attribution 4.0 Intl. (the “License”); +# you may not use this documentation except in compliance with the License. +# You may obtain a copy of the License at +# +# https://creativecommons.org/licenses/by/4.0/ +# +# Unless required by applicable law or agreed to in writing, documentation +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ============LICENSE_END============================================ +# +# ECOMP is a trademark and service mark of AT&T Intellectual Property. +from iceci.decorator.exception_decor import exception +from services.constants import Constants +from services.logging_service import LoggingServiceFactory +from services.session import session +from services.types import API, Frontend +from tests.uiTests.test_ui_base import TestUiBase + + +logger = LoggingServiceFactory.get_logger() + + +class TestBucketURL(TestUiBase): + user_content = None + + @exception() + def test_bucket_url_not_appears_stage_intake(self): + user_content = API.VirtualFunction.create_engagement( + wait_for_gitlab=False) + Frontend.User.login( + Constants.Users.Admin.EMAIL, Constants.Default.Password.TEXT) + Frontend.Overview.click_on_vf(user_content) + session.run_negative( + lambda: Frontend.Overview.validate_bucket_url( + user_content['engagement_manual_id'], user_content['vfName']), + "Storage bucket URL appears on stage Intake") + + @exception() + def test_bucket_url(self): + user_content = API.VirtualFunction.create_engagement( + wait_for_gitlab=False) + API.VirtualFunction.set_eng_stage( + user_content, Constants.EngagementStages.ACTIVE) + Frontend.User.login( + Constants.Users.Admin.EMAIL, Constants.Default.Password.TEXT) + Frontend.Overview.click_on_vf(user_content) + Frontend.Overview.validate_bucket_url( + user_content['engagement_manual_id'], user_content['vfName']) diff --git a/tests/uiTests/test_checklist_validations.py b/tests/uiTests/test_checklist_validations.py new file mode 100644 index 0000000..c89fa25 --- /dev/null +++ b/tests/uiTests/test_checklist_validations.py @@ -0,0 +1,309 @@ + +# ============LICENSE_START========================================== +# org.onap.vvp/test-engine +# =================================================================== +# Copyright © 2017 AT&T Intellectual Property. All rights reserved. +# =================================================================== +# +# Unless otherwise specified, all software contained herein is licensed +# under the Apache License, Version 2.0 (the “License”); +# you may not use this software except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# Unless otherwise specified, all documentation contained herein is licensed +# under the Creative Commons License, Attribution 4.0 Intl. (the “License”); +# you may not use this documentation except in compliance with the License. +# You may obtain a copy of the License at +# +# https://creativecommons.org/licenses/by/4.0/ +# +# Unless required by applicable law or agreed to in writing, documentation +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ============LICENSE_END============================================ +# +# ECOMP is a trademark and service mark of AT&T Intellectual Property. +from asyncio.tasks import sleep +import time + +from wheel.signatures import assertTrue + +from iceci.decorator.exception_decor import exception +from services.api.api_bridge import APIBridge +from services.api.api_gitlab import APIGitLab +from services.constants import Constants +from services.frontend.base_actions.get import Get +from services.helper import Helper +from services.logging_service import LoggingServiceFactory +from services.types import Frontend, DB, API +from tests.uiTests.test_ui_base import TestUiBase + + +logger = LoggingServiceFactory.get_logger() + + +class TestChecklistValidations(TestUiBase): + ''' + Name: test_Create_New_Checklist + Steps: + + ''' + + user_content = None + user_content_api = None + + @classmethod + def setUpClass(cls): + super(TestChecklistValidations, cls).setUpClass() + + cls.user_content_api = API.User.create_new_user_content_login_with_api() + cls.user_content = API.VirtualFunction.create_engagement() + + @exception() + def test_create_new_checklist(self): + API.GitLab.git_clone_push(self.user_content) + Frontend.User.login( + self.user_content['email'], Constants.Default.Password.TEXT) + vfName = self.user_content['vfName'] + # Fetch one AT&T user ID. + engagement_id = DB.General.select_where( + "engagement_id", "ice_vf", "name", vfName, 1) + engLeadEmail = DB.User.select_el_email(vfName) + engagement_manual_id = DB.General.select_where( + "engagement_manual_id", "ice_engagement", "uuid", engagement_id, 1) + myVfName = engagement_manual_id + ": " + vfName + actualVfNameid = "clickable-" + myVfName + Frontend.Overview.click_on_vf(self.user_content) + Frontend.Overview.complete_defaults_nextsteps(engagement_id) + Frontend.User.relogin( + engLeadEmail, Constants.Default.Password.TEXT, engagement_manual_id) + Frontend.Overview.click_on_vf(self.user_content) + actualVfName = Get.by_id(actualVfNameid) + checklistName = Frontend.Checklist.create_checklist( + engagement_id, vfName, actualVfName, engagement_manual_id) + Frontend.Checklist.click_on_checklist(self.user_content, checklistName) + + @exception() + def test_e2e_checklist_positive_test(self): + newObj, user_content = API.User.create_new_user_content() + newObjWithChecklist = Frontend.Checklist.create_new_checklist(newObj) + checklistUuid = newObjWithChecklist[0] + engLeadEmail = newObjWithChecklist[1] + engagement_manual_id = newObjWithChecklist[2] + actualVfNameid = newObjWithChecklist[3] + checklistName = newObjWithChecklist[5] + DB.Checklist.state_changed("uuid", checklistUuid, 'review') + DB.Checklist.update_decisions(checklistUuid, checklistName) + + Frontend.User.relogin( + engLeadEmail, Constants.Default.Password.TEXT, engagement_manual_id) + Frontend.Checklist.click_on_checklist(user_content, checklistName) + Frontend.Checklist.validate_reject_is_enabled() + Frontend.Checklist.review_state_actions_and_validations( + checklistName, user_content['vfName'], "review") + + Frontend.Checklist.cl_to_next_stage(actualVfNameid) + engPeerReviewerLeadEmail = DB.Checklist.get_pr_email(checklistUuid) + Frontend.User.relogin(engPeerReviewerLeadEmail, + Constants.Default.Password.TEXT) + Frontend.Checklist.click_on_checklist(user_content, checklistName) + Frontend.Checklist.validate_reject_is_enabled() + Frontend.Checklist.review_state_actions_and_validations( + checklistName, user_content['vfName'], "PEER") + + Frontend.Checklist.cl_to_next_stage(actualVfNameid) + engPeerReviewerLeadEmail = DB.Checklist.get_admin_email(checklistUuid) + Frontend.User.relogin(engPeerReviewerLeadEmail, + Constants.Default.Password.TEXT) + Frontend.Checklist.search_by_vfname_for_not_local(user_content) + Frontend.Checklist.click_on_checklist(user_content, checklistName) + Frontend.Checklist.validate_reject_is_enabled() + Frontend.Checklist.approval_state_actions_and_validations( + checklistName, newObj, "APPROVAL") + + Frontend.Checklist.cl_to_next_stage(actualVfNameid) + Frontend.User.relogin(engLeadEmail, Constants.Default.Password.TEXT) + ownerLeadEmail = DB.Checklist.get_owner_email(checklistUuid) + Helper.internal_assert(engLeadEmail, ownerLeadEmail) + Frontend.Checklist.click_on_checklist(user_content, checklistName) + Frontend.Checklist.approval_state_actions_and_validations( + checklistName, newObj, "HANDOFF") + + Frontend.Checklist.cl_to_next_stage(actualVfNameid) + Frontend.Checklist.click_on_checklist(user_content, checklistName) + + @exception() + def test_e2e_checklist_reject(self): + newObj, user_content = API.User.create_new_user_content() + newObjWithChecklist = Frontend.Checklist.create_new_checklist(newObj) + checklistUuid = newObjWithChecklist[0] + engLeadEmail = newObjWithChecklist[1] + engagement_manual_id = newObjWithChecklist[2] + actualVfNameid = newObjWithChecklist[3] + checklistName = newObjWithChecklist[5] + DB.Checklist.state_changed("uuid", checklistUuid, 'review') + DB.Checklist.update_decisions(checklistUuid, checklistName) + Frontend.User.relogin( + engLeadEmail, Constants.Default.Password.TEXT, engagement_manual_id) + Frontend.Checklist.click_on_checklist(user_content, checklistName) + Frontend.Checklist.validate_reject_is_enabled() + Frontend.Checklist.review_state_actions_and_validations( + checklistName, user_content['vfName'], "review") + Frontend.Checklist.cl_to_next_stage(actualVfNameid) + engPreeRiviewerLeadEmail = DB.Checklist.get_pr_email(checklistUuid) + Frontend.User.relogin(engPreeRiviewerLeadEmail, + Constants.Default.Password.TEXT) + Frontend.Checklist.click_on_checklist(user_content, checklistName) + Frontend.Checklist.validate_reject_is_enabled() + Frontend.Checklist.review_state_actions_and_validations( + checklistName, user_content['vfName'], "PEER") + + Frontend.Checklist.reject_checklist(newObj, checklistName) + + archive = DB.Checklist.is_archive(checklistName) + assertTrue(archive) + + @exception() + def test_e2e_checklist_update_add_next_step(self): + newObj, user_content = API.User.create_new_user_content() + newObjWithChecklist = Frontend.Checklist.create_new_checklist(newObj) + checklistUuid = newObjWithChecklist[0] + engLeadEmail = newObjWithChecklist[1] + engagement_manual_id = newObjWithChecklist[2] + actualVfNameid = newObjWithChecklist[3] + myVfName = newObjWithChecklist[4] + checklistName = newObjWithChecklist[5] + DB.Checklist.state_changed("uuid", checklistUuid, 'review') + DB.Checklist.update_decisions(checklistUuid, checklistName) + + Frontend.User.relogin( + engLeadEmail, Constants.Default.Password.TEXT, engagement_manual_id) + Frontend.Checklist.click_on_checklist(user_content, checklistName) + Frontend.Checklist.validate_reject_is_enabled() + + newFileNames = Frontend.Checklist.update_cl_name_and_associated_files( + engagement_manual_id) + DB.Checklist.update_checklist_to_review_state(newFileNames[0]) + Frontend.General.refresh() + Frontend.Checklist.add_nsteps( + checklistUuid, actualVfNameid, myVfName, checklistName, newFileNames) + + @exception() + def test_multi_el(self): + checklist_content = API.Checklist.create_checklist( + self.user_content_api) + newEL_content = API.VirtualFunction.create_engagement() + Frontend.User.login( + self.user_content_api['email'], Constants.Default.Password.TEXT) + myVfName = self.user_content_api['engagement_manual_id'] + \ + ": " + self.user_content_api['vfName'] + actualVfNameid = "clickable-" + myVfName + DB.Checklist.update_decisions( + checklist_content['uuid'], checklist_content['name']) + Frontend.User.relogin( + self.user_content_api['el_email'], Constants.Default.Password.TEXT) + Frontend.Overview.click_on_vf(self.user_content_api) + Frontend.Checklist.validate_multi_eng( + self.user_content_api, checklist_content, newEL_content, actualVfNameid) + + @exception() + def test_create_checklist_without_files(self): + Frontend.User.login( + self.user_content['el_email'], Constants.Default.Password.TEXT) + Frontend.Checklist.create_cl_without_files(self.user_content) + + @exception() + def test_reject_anytime_checklist(self): + cl_content = API.Checklist.create_checklist(self.user_content_api) + DB.Checklist.state_changed("name", cl_content['name'], 'review') + Frontend.User.login( + self.user_content_api['el_email'], Constants.Default.Password.TEXT) + Frontend.Checklist.search_by_manual_id( + self.user_content_api['engagement_manual_id']) + recent_checklist_uuid = DB.Checklist.get_recent_checklist_uuid( + cl_content['name'])[0] + Frontend.Checklist.click_on_checklist( + self.user_content_api, cl_content['name'], recent_checklist_uuid) + Frontend.Checklist.reject("Reject checklist on review state.") + DB.Checklist.state_changed("uuid", recent_checklist_uuid, 'archive') + + @exception() + def test_clone_decision_auditlogs(self): + cl_content = API.Checklist.create_checklist(self.user_content_api) + DB.Checklist.state_changed( + "name", cl_content['name'], Constants.ChecklistStates.Review.TEXT) + Frontend.User.login(self.user_content_api['el_email'], Constants.Default.Password.TEXT, + self.user_content_api['engagement_manual_id']) + recent_checklist_uuid = DB.Checklist.get_recent_checklist_uuid( + cl_content['name'])[0] + Frontend.Checklist.click_on_checklist( + self.user_content_api, cl_content['name'], recent_checklist_uuid) + log_txt = Frontend.Checklist.add_line_item_audit_log() + Frontend.Checklist.reject( + 'Reject checklist as part of test_clone_decision_auditlogs test') + DB.Checklist.state_changed( + "uuid", recent_checklist_uuid, Constants.ChecklistStates.Archive.TEXT) + recent_checklist_uuid = DB.Checklist.get_recent_checklist_uuid( + cl_content['name'])[0] + Frontend.Checklist.click_on_checklist( + self.user_content_api, cl_content['name'], recent_checklist_uuid) + Frontend.Checklist.validate_audit_log(log_txt) + + @exception() + def test_review_jenkins_log(self): + cl_content = API.Checklist.create_checklist( + self.user_content_api) + DB.Checklist.state_changed( + "name", cl_content['name'], Constants.ChecklistStates.Review.TEXT) + Frontend.User.login(self.user_content_api['el_email'], Constants.Default.Password.TEXT, + self.user_content_api['engagement_manual_id']) + Frontend.Checklist.click_on_checklist( + self.user_content_api, cl_content['name'], cl_content['uuid']) + Frontend.Checklist.get_jenkins_log() + + @exception() + def test_review_jenkins_after_archiving(self): + cl_content = API.Checklist.create_checklist( + self.user_content_api) + DB.Checklist.state_changed( + "name", cl_content['name'], Constants.ChecklistStates.Review.TEXT) + Frontend.User.login(self.user_content_api['el_email'], Constants.Default.Password.TEXT, + self.user_content_api['engagement_manual_id']) + cl_content['uuid'] = DB.Checklist.get_recent_checklist_uuid( + cl_content['name'])[0] + Frontend.Checklist.click_on_checklist( + self.user_content_api, cl_content['name'], cl_content['uuid']) + log_1 = Frontend.Checklist.get_jenkins_log() + build_identifier_1 = API.Jenkins.find_build_num_out_of_jenkins_log( + log_1) + Frontend.Checklist.reject( + 'Reject checklist as part of test_clone_decision_auditlogs test') + DB.Checklist.state_changed( + "uuid", cl_content['uuid'], Constants.ChecklistStates.Archive.TEXT) + + recent_checklist_uuid = DB.Checklist.get_recent_checklist_uuid( + cl_content['name'])[0] + Frontend.Checklist.click_on_checklist( + self.user_content_api, cl_content['name'], recent_checklist_uuid) + Frontend.Checklist.update_cl_associated_files( + self.user_content_api['engagement_manual_id']) + DB.Checklist.state_changed( + "name", cl_content['name'], Constants.ChecklistStates.Review.TEXT) + Frontend.General.refresh() + log_2 = Frontend.Checklist.get_jenkins_log() + build_identifier_2 = API.Jenkins.find_build_num_out_of_jenkins_log( + log_2) + Helper.internal_not_equal(build_identifier_1, build_identifier_2) diff --git a/tests/uiTests/test_cms_news_and_announcementsion.py b/tests/uiTests/test_cms_news_and_announcementsion.py new file mode 100644 index 0000000..b639338 --- /dev/null +++ b/tests/uiTests/test_cms_news_and_announcementsion.py @@ -0,0 +1,144 @@ + +# ============LICENSE_START========================================== +# org.onap.vvp/test-engine +# =================================================================== +# Copyright © 2017 AT&T Intellectual Property. All rights reserved. +# =================================================================== +# +# Unless otherwise specified, all software contained herein is licensed +# under the Apache License, Version 2.0 (the “License”); +# you may not use this software except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# Unless otherwise specified, all documentation contained herein is licensed +# under the Creative Commons License, Attribution 4.0 Intl. (the “License”); +# you may not use this documentation except in compliance with the License. +# You may obtain a copy of the License at +# +# https://creativecommons.org/licenses/by/4.0/ +# +# Unless required by applicable law or agreed to in writing, documentation +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ============LICENSE_END============================================ +# +# ECOMP is a trademark and service mark of AT&T Intellectual Property. +from wheel.signatures import assertTrue + +from iceci.decorator.exception_decor import exception +from services.constants import Constants +from services.frontend.base_actions.click import Click +from services.logging_service import LoggingServiceFactory +from services.session import session +from services.types import * +from tests.uiTests.test_ui_base import TestUiBase +logger = LoggingServiceFactory.get_logger() + + +class TestCMSNewsAndAnnoucements(TestUiBase): + user_content = None + + @classmethod + def setUpClass(cls): + super(TestCMSNewsAndAnnoucements, cls).setUpClass() + + cls.user_content = API.VirtualFunction.create_engagement(wait_for_gitlab=False) + logger.debug("user_conntent = "+str(cls.user_content)) + + def setUp(self): + super(TestCMSNewsAndAnnoucements, self).setUp() + Frontend.User.login(self.user_content['email'], Constants.Default.Password.TEXT) + + @exception() + def test_announcements(self): + categoryId = DB.Cms.get_cms_category_id('News') + assertTrue(len(categoryId) > 0 and not None) + + @exception() + def test_insert_post_Announcement(self): + title, description = DB.Cms.create_announcement() + Frontend.General.refresh() + Frontend.Cms.validae_announcement(title, description) + + @exception() + def test_insert_post_News(self): + title, description = DB.Cms.create_news() + Frontend.General.refresh() + Frontend.Cms.validate_news(title, description) + + @exception() + def test_insert_post_FAQ(self): + title, description = DB.Cms.create_faq() + Frontend.General.refresh() + Frontend.Cms.validate_FAQ(description) + + @exception() + def test_insert_page(self): + title, description = DB.Cms.create_page() + Frontend.Cms.validate_page(title, description) + + @exception() + def test_search_documentation_title(self): + title, description = DB.Cms.create_page() + logger.debug("About to login with EL and add VFC") + users = [self.user_content['el_email'], self.user_content['pr_email'], Constants.Users.AdminRO.EMAIL, + Constants.Users.Admin.EMAIL, self.user_content['email']] + for user in users: + logger.debug("Login with user " + user) + Frontend.User.relogin(user, Constants.Default.Password.TEXT, "documentation") + Frontend.Cms.search_documentation_title(title, self.user_content) + + @exception() + def test_search_documentation_content(self): + title, description = DB.Cms.create_page() + Frontend.Cms.search_documentation_content(title, description) + + ''' + Announcement toast should stay for 2 days after it was published + ''' + @exception() + def test_validate_expired_post_Announcement(self): + title, description = DB.Cms.create_announcement() + Frontend.General.refresh() + Frontend.Cms.validate_expired_post_Announcement(title, description) + + ''' + Announcement toast should stay was published if the user closes the message + ''' + @exception() + def test_Announcement_validate_toast(self): + title, description = DB.Cms.create_announcement() + Frontend.User.relogin(self.user_content['email'], Constants.Default.Password.TEXT, Constants.Toast.CMS_ID) + Frontend.Cms.announcement_validate_toast(title, description, self.user_content) + + ''' + Announcement toast is shown for users even after the entry has disappeared from the widget on the Dashboard + ''' + @exception() + def test_validate_5_last_Announcement_displayed(self): + listOfTitleAnDescriptions = DB.Cms.create_announcements(6) + Frontend.User.relogin(self.user_content['email'], Constants.Default.Password.TEXT) + last_title = listOfTitleAnDescriptions[len(listOfTitleAnDescriptions) - 1][0] + Frontend.Cms.validate_5_last_announcement_displayed(listOfTitleAnDescriptions, self.user_content, last_title) + + @exception() + def test_insert_grandchild_page(self): + parent_title, parent_description = DB.Cms.create_page() + parent_id = DB.Cms.get_last_inserted_page_id() + child_title, child_description = DB.Cms.create_page(parent_id) + child_id = DB.Cms.get_last_inserted_page_id() + grand_child_title, grand_child_description = DB.Cms.create_page(child_id) + Frontend.Cms.validate_grandchild_page(parent_title, child_title, grand_child_title, grand_child_description) diff --git a/tests/uiTests/test_dashboard_feature.py b/tests/uiTests/test_dashboard_feature.py new file mode 100644 index 0000000..2303eb8 --- /dev/null +++ b/tests/uiTests/test_dashboard_feature.py @@ -0,0 +1,164 @@ + +# ============LICENSE_START========================================== +# org.onap.vvp/test-engine +# =================================================================== +# Copyright © 2017 AT&T Intellectual Property. All rights reserved. +# =================================================================== +# +# Unless otherwise specified, all software contained herein is licensed +# under the Apache License, Version 2.0 (the “License”); +# you may not use this software except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# Unless otherwise specified, all documentation contained herein is licensed +# under the Creative Commons License, Attribution 4.0 Intl. (the “License”); +# you may not use this documentation except in compliance with the License. +# You may obtain a copy of the License at +# +# https://creativecommons.org/licenses/by/4.0/ +# +# Unless required by applicable law or agreed to in writing, documentation +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ============LICENSE_END============================================ +# +# ECOMP is a trademark and service mark of AT&T Intellectual Property. +from iceci.decorator.exception_decor import exception +from services.constants import Constants +from services.logging_service import LoggingServiceFactory +from services.session import session +from services.types import API, DB, Frontend +from tests.uiTests.test_ui_base import TestUiBase + + +logger = LoggingServiceFactory.get_logger() + + +class TestDashboardFeature(TestUiBase): + user_content = None + + @classmethod + def setUpClass(cls): + super(TestDashboardFeature, cls).setUpClass() + + cls.user_content = API.VirtualFunction.create_engagement( + wait_for_gitlab=False) + + @exception() + def test_validate_filtering_by_stage_intake(self): + Frontend.User.login( + self.user_content['el_email'], Constants.Default.Password.TEXT) + Frontend.Dashboard.validate_filtering_by_stage( + self.user_content, Constants.EngagementStages.INTAKE) + + @exception() + def test_validate_filtering_by_stage_active(self): + Frontend.User.login( + self.user_content['el_email'], Constants.Default.Password.TEXT) + Frontend.Dashboard.validate_filtering_by_stage_with_page_ids( + self.user_content, Constants.EngagementStages.ACTIVE) + + @exception() + def test_validate_filtering_by_stage_validated(self): + query = "UPDATE ice_engagement SET engagement_stage='Validated' WHERE engagement_manual_id ='" + \ + str(self.user_content['engagement_manual_id']) + "';" + DB.General.update_by_query(query) + Frontend.User.login( + self.user_content['el_email'], Constants.Default.Password.TEXT) + Frontend.Dashboard.validate_filtering_by_stage_with_page_ids( + self.user_content, Constants.EngagementStages.VALIDATED) + + @exception() + def test_validate_filtering_by_stage_completed(self): + Frontend.User.login( + self.user_content['el_email'], Constants.Default.Password.TEXT) + Frontend.Dashboard.validate_filtering_by_stage_with_page_ids( + self.user_content, Constants.EngagementStages.COMPLETED) + + @exception() + def test_validate_filtering_by_stage_all(self): + Frontend.User.login( + self.user_content['el_email'], Constants.Default.Password.TEXT) + Frontend.Dashboard.validate_filtering_by_stage_with_page_ids( + self.user_content, Constants.EngagementStages.ALL) + + @exception() + def test_validate_statistics_by_stages(self): + Frontend.User.login( + self.user_content['el_email'], Constants.Default.Password.TEXT) + Frontend.Dashboard.validate_statistics_by_stages(self.user_content) + + @exception() + def test_assigned_next_steps(self): + Frontend.User.login( + self.user_content['email'], Constants.Default.Password.TEXT) + Frontend.User.assigned_one_NS_to_user(self.user_content) + Frontend.Dashboard.check_if_the_eng_of_NS_is_the_correct_one( + self.user_content) + Frontend.Dashboard.check_if_creator_of_NS_is_the_EL(self.user_content) + Frontend.Overview.go_to_eng_overview_by_clicking_on_the_created_NS( + self.user_content) + + @exception() + def test_search_engagement(self): + Frontend.User.login( + self.user_content['el_email'], Constants.Default.Password.TEXT) + Frontend.DetailedView.search_vf_and_go_to_detailed_view( + self.user_content['engagement_manual_id'], + self.user_content['vfName']) + vfcName = Frontend.DetailedView.add_vfc() + users = [self.user_content['el_email'], self.user_content['pr_email'], + self.user_content['email'], + Constants.Users.Admin.EMAIL, Constants.Users.AdminRO.EMAIL] + session.wait_until_retires = 20 + Frontend.Dashboard.search_in_dashboard( + self.user_content, vfcName, users) + session.wait_until_retires = session.positive_wait_until_retires + + @exception() + def test_validate_statistics_modal_appears_for_peer_re(self): + Frontend.User.login( + self.user_content['pr_email'], Constants.Default.Password.TEXT) + Frontend.Dashboard.click_on_dashboard_and_validate_statistics( + is_negative=False) + + @exception() + def test_validate_statistics_modal_appears_for_el(self): + Frontend.User.login( + self.user_content['el_email'], Constants.Default.Password.TEXT) + Frontend.Dashboard.click_on_dashboard_and_validate_statistics( + is_negative=False) + + @exception() + def test_validate_statistics_modal_appears_for_standart_user(self): + Frontend.User.login( + self.user_content['email'], Constants.Default.Password.TEXT) + Frontend.Dashboard.click_on_dashboard_and_validate_statistics( + is_negative=True) + + @exception() + def test_validate_statistics_modal_appears_for_admin(self): + Frontend.User.login( + Constants.Users.Admin.EMAIL, Constants.Default.Password.TEXT) + Frontend.Dashboard.click_on_dashboard_and_validate_statistics( + is_negative=False) + + @exception() + def test_validate_statistics_modal_appears_for_admin_ro(self): + Frontend.User.login( + Constants.Users.AdminRO.EMAIL, Constants.Default.Password.TEXT) + Frontend.Dashboard.click_on_dashboard_and_validate_statistics( + is_negative=False) diff --git a/tests/uiTests/test_detailed_view.py b/tests/uiTests/test_detailed_view.py new file mode 100644 index 0000000..cc95d7c --- /dev/null +++ b/tests/uiTests/test_detailed_view.py @@ -0,0 +1,292 @@ + +# ============LICENSE_START========================================== +# org.onap.vvp/test-engine +# =================================================================== +# Copyright © 2017 AT&T Intellectual Property. All rights reserved. +# =================================================================== +# +# Unless otherwise specified, all software contained herein is licensed +# under the Apache License, Version 2.0 (the “License”); +# you may not use this software except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# Unless otherwise specified, all documentation contained herein is licensed +# under the Creative Commons License, Attribution 4.0 Intl. (the “License”); +# you may not use this documentation except in compliance with the License. +# You may obtain a copy of the License at +# +# https://creativecommons.org/licenses/by/4.0/ +# +# Unless required by applicable law or agreed to in writing, documentation +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ============LICENSE_END============================================ +# +# ECOMP is a trademark and service mark of AT&T Intellectual Property. +import uuid + +from iceci.decorator.exception_decor import exception +from services.constants import Constants +from services.helper import Helper +from services.logging_service import LoggingServiceFactory +from services.session import session +from services.types import API, DB, Frontend +from tests.uiTests.test_ui_base import TestUiBase + + +logger = LoggingServiceFactory.get_logger() + + +class TestDetailedView(TestUiBase): + ''' + Name: test_detailed_view + Steps: + Create new User via SignUp request-->Login with This One--> build "activationUrl"--> + Validation of successful activate--> + close Wizard --> Logout-->login-->Open Wizard--> fill all fields in all Tab's(4)--> + build inviteURL from email--> reopen browser with inviteURL--> + Validate fields filled's in SignUp form + ''' + + user_content = None + + @classmethod + def setUpClass(cls): + super(TestDetailedView, cls).setUpClass() + cls.user_content = API.VirtualFunction.create_engagement( + wait_for_gitlab=False) + + @exception() + def test_detailed_view(self): + Frontend.User.login( + self.user_content['el_email'], Constants.Default.Password.TEXT) + Frontend.DetailedView.search_vf_and_go_to_detailed_view(self.user_content['engagement_manual_id'], + self.user_content['vfName']) + Frontend.DetailedView.validate_all_titles_on_dv_form() + logger.debug("Add Deployment Target") + Frontend.DetailedView.add_deployment_target(self.user_content) + logger.debug("Add VFC no.1") + Frontend.DetailedView.add_vfcs("djoni", "loka") + Frontend.DetailedView.remove_vfc(self.user_content) + + @exception() + def test_update_aic_version(self): + Frontend.User.login( + self.user_content['email'], Constants.Default.Password.TEXT) + Frontend.DetailedView.search_vf_and_go_to_detailed_view( + self.user_content['engagement_manual_id'], self.user_content['vfName']) + Frontend.DetailedView.update_aic_version() + Frontend.DetailedView.validate_aic_version() + + @exception() + def test_update_vf_version(self): + Frontend.User.login( + self.user_content['email'], Constants.Default.Password.TEXT) + Frontend.DetailedView.search_vf_and_go_to_detailed_view( + self.user_content['engagement_manual_id'], self.user_content['vfName']) + newVFVersionName = Frontend.DetailedView.update_vf_version() + Frontend.DetailedView.validate_vf_version(newVFVersionName) + + ''' + Add new ECOMP release to DB, go to detailed view and change ECOMP release and AIC version. + Verify changes are saved and presented in UI. + ''' + @exception() + def test_edit_ecomp_release(self): + try: + EcompUuid = uuid.uuid4() + EcompName = Helper.rand_string("randomString") + DB.VirtualFunction.insert_ecomp_release(EcompUuid, EcompName) + Frontend.User.login( + self.user_content['email'], Constants.Default.Password.TEXT) + Frontend.DetailedView.search_vf_and_go_to_detailed_view( + self.user_content['engagement_manual_id'], self.user_content['vfName']) + Frontend.DetailedView.update_ecomp_release(EcompName) + Frontend.DetailedView.validate_ecomp_version() + finally: + DB.VirtualFunction.delete_ecomp_release(EcompUuid, EcompName) + + @exception() + def test_role_for_deployment_targets(self): + users = [self.user_content['pr_email'], + self.user_content['el_email'], Constants.Users.Admin.EMAIL] + Frontend.DetailedView.validate_deployment_targets( + self.user_content, users) + + @exception() + def test_add_and_remove_deployment_targets(self): + users = [self.user_content['el_email'], Constants.Users.Admin.EMAIL] + Frontend.DetailedView.add_remove_deployment_targets( + self.user_content, users) + + @exception() + def test_negative_role_for_deployment_targets(self): + users = [self.user_content['email'], Constants.Users.AdminRO.EMAIL] + Frontend.DetailedView.validate_negative_role_for_deployment_targets( + self.user_content, users) + + @exception() + def test_change_target_lab_entry(self): + Frontend.User.login(Constants.Users.Admin.EMAIL, + Constants.Default.Password.TEXT) + Frontend.DetailedView.search_vf_and_go_to_detailed_view( + self.user_content['engagement_manual_id'], self.user_content['vfName']) + date = Frontend.DetailedView.update_target_lab_entry() + Frontend.DetailedView.validate_target_lab_entry(date) + + @exception() + def test_change_target_lab_entry_via_standard_user(self): + Frontend.User.login( + self.user_content['email'], Constants.Default.Password.TEXT) + Frontend.DetailedView.search_vf_and_go_to_detailed_view( + self.user_content['engagement_manual_id'], self.user_content['vfName']) + date = Frontend.DetailedView.update_target_lab_entry() + Frontend.DetailedView.validate_target_lab_entry(date) + + @exception() + def test_aic_dropdown_ordering(self): + new_aic_version = None + try: + DB.VirtualFunction.change_aic_version_weight(10, 0) + new_aic_version = DB.VirtualFunction.insert_aic_version() + Frontend.User.login( + self.user_content['el_email'], Constants.Default.Password.TEXT) + Frontend.DetailedView.search_vf_and_go_to_detailed_view(self.user_content['engagement_manual_id'], + self.user_content['vfName']) + Frontend.DetailedView.click_on_update_aic_version() + Helper.internal_assert(Frontend.General.get_meta_order_of_element( + Constants.Dashboard.DetailedView.AIC.Dropdown.UniversalVersion.ID % new_aic_version['version']), 0) + finally: + if new_aic_version: + DB.VirtualFunction.delete_aic_version(new_aic_version['uuid']) + DB.VirtualFunction.change_aic_version_weight(0, 10) + + @exception() + def test_ecomp_dropdown_ordering(self): + new_ecomp_release = None + try: + new_ecomp_release = { + "uuid": uuid.uuid4(), "name": Helper.rand_string()} + DB.VirtualFunction.change_ecomp_release_weight(10, 0) + DB.VirtualFunction.insert_ecomp_release( + new_ecomp_release['uuid'], new_ecomp_release['name']) + Frontend.User.login( + self.user_content['el_email'], Constants.Default.Password.TEXT) + Frontend.DetailedView.search_vf_and_go_to_detailed_view( + self.user_content['engagement_manual_id'], self.user_content['vfName']) + Frontend.DetailedView.click_on_update_ecomp_release() + Helper.internal_assert(Frontend.General.get_meta_order_of_element( + Constants.Dashboard.DetailedView.ECOMP.Dropdown.UniversalRelease.ID % new_ecomp_release['name']), 0) + finally: + if new_ecomp_release: + DB.VirtualFunction.delete_ecomp_release( + new_ecomp_release['uuid'], new_ecomp_release['name']) + DB.VirtualFunction.change_ecomp_release_weight(0, 10) + + @exception() + def test_retire_aic_version(self): + new_aic_version = None + try: + new_aic_version = DB.VirtualFunction.insert_aic_version("FALSE") + Frontend.User.login( + self.user_content['el_email'], Constants.Default.Password.TEXT) + Frontend.DetailedView.search_vf_and_go_to_detailed_view( + self.user_content['engagement_manual_id'], self.user_content['vfName']) + Frontend.DetailedView.click_on_update_aic_version() + session.run_negative(lambda: Frontend.General.get_meta_order_of_element( + Constants.Dashboard.DetailedView.AIC.Dropdown.UniversalVersion.ID % new_aic_version['version']), + "New AIC version was found in dropdown.") + finally: + if new_aic_version: + DB.VirtualFunction.delete_aic_version(new_aic_version['uuid']) + + @exception() + def test_retire_ecomp_release(self): + new_ecomp_release = None + try: + new_ecomp_release = { + "uuid": uuid.uuid4(), "name": Helper.rand_string(), "ui_visibility": "FALSE"} + DB.VirtualFunction.insert_ecomp_release( + new_ecomp_release['uuid'], new_ecomp_release['name'], new_ecomp_release['ui_visibility']) + Frontend.User.login( + self.user_content['el_email'], Constants.Default.Password.TEXT) + Frontend.DetailedView.search_vf_and_go_to_detailed_view( + self.user_content['engagement_manual_id'], self.user_content['vfName']) + Frontend.DetailedView.click_on_update_ecomp_release() + session.run_negative(lambda: Frontend.General.get_meta_order_of_element( + Constants.Dashboard.DetailedView.ECOMP.Dropdown.UniversalRelease.ID % new_ecomp_release['name']), "New ECOMP release was found in dropdown.") + finally: + if new_ecomp_release: + DB.VirtualFunction.delete_ecomp_release( + new_ecomp_release['uuid'], new_ecomp_release['name']) + + @exception() + def test_retire_selected_aic_version(self): + old_aic_version_uuid = new_aic_version = None + try: + old_aic_version_uuid = DB.VirtualFunction.select_aic_version_uuid( + self.user_content['target_aic']) + new_aic_version = DB.VirtualFunction.insert_aic_version("FALSE") + self.user_content['session_token'] = "token " + \ + API.User.login_user(self.user_content['el_email']) + API.VirtualFunction.update_aic_version( + self.user_content['engagement_uuid'], new_aic_version['uuid'], self.user_content['session_token']) + Frontend.User.login( + self.user_content['el_email'], Constants.Default.Password.TEXT) + Frontend.DetailedView.search_vf_and_go_to_detailed_view( + self.user_content['engagement_manual_id'], self.user_content['vfName']) + Frontend.DetailedView.compare_aic_selected_version( + new_aic_version['version']) + Frontend.DetailedView.click_on_update_aic_version() + Frontend.DetailedView.validate_deprecated_aic_version_in_dropdown( + new_aic_version['version']) + finally: + if old_aic_version_uuid: + API.VirtualFunction.update_aic_version( + self.user_content['engagement_uuid'], old_aic_version_uuid, self.user_content['session_token']) + if new_aic_version: + DB.VirtualFunction.delete_aic_version( + new_aic_version['uuid']) + + @exception() + def test_retire_selected_ecomp_release(self): + old_ecomp_release_uuid = new_ecomp_release = None + try: + old_ecomp_release_uuid = DB.VirtualFunction.select_ecomp_release_uuid( + self.user_content['ecomp_release']) + new_ecomp_release = {"uuid": str( + uuid.uuid4()), "name": Helper.rand_string(), "ui_visibility": "FALSE"} + DB.VirtualFunction.insert_ecomp_release( + new_ecomp_release['uuid'], new_ecomp_release['name'], new_ecomp_release['ui_visibility']) + self.user_content['session_token'] = "token " + \ + API.User.login_user(self.user_content['el_email']) + API.VirtualFunction.update_ecomp_release( + self.user_content['engagement_uuid'], new_ecomp_release['uuid'], self.user_content['session_token']) + Frontend.User.login( + self.user_content['el_email'], Constants.Default.Password.TEXT) + Frontend.DetailedView.search_vf_and_go_to_detailed_view( + self.user_content['engagement_manual_id'], self.user_content['vfName']) + Frontend.DetailedView.compare_selected_ecomp_release( + new_ecomp_release['name']) + Frontend.DetailedView.click_on_update_ecomp_release() + Frontend.DetailedView.validate_deprecated_ecomp_release_in_dropdown( + new_ecomp_release['name']) + finally: + if self.user_content and old_ecomp_release_uuid: + API.VirtualFunction.update_ecomp_release( + self.user_content['engagement_uuid'], old_ecomp_release_uuid, self.user_content['session_token']) + DB.VirtualFunction.delete_ecomp_release( + new_ecomp_release['uuid'], new_ecomp_release['name']) diff --git a/tests/uiTests/test_detailed_view.pyc b/tests/uiTests/test_detailed_view.pyc new file mode 100755 index 0000000..b4faa20 Binary files /dev/null and b/tests/uiTests/test_detailed_view.pyc differ diff --git a/tests/uiTests/test_edit_checklist_template.py b/tests/uiTests/test_edit_checklist_template.py new file mode 100644 index 0000000..62130e3 --- /dev/null +++ b/tests/uiTests/test_edit_checklist_template.py @@ -0,0 +1,111 @@ + +# ============LICENSE_START========================================== +# org.onap.vvp/test-engine +# =================================================================== +# Copyright © 2017 AT&T Intellectual Property. All rights reserved. +# =================================================================== +# +# Unless otherwise specified, all software contained herein is licensed +# under the Apache License, Version 2.0 (the “License”); +# you may not use this software except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# Unless otherwise specified, all documentation contained herein is licensed +# under the Creative Commons License, Attribution 4.0 Intl. (the “License”); +# you may not use this documentation except in compliance with the License. +# You may obtain a copy of the License at +# +# https://creativecommons.org/licenses/by/4.0/ +# +# Unless required by applicable law or agreed to in writing, documentation +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ============LICENSE_END============================================ +# +# ECOMP is a trademark and service mark of AT&T Intellectual Property. +from iceci.decorator.exception_decor import exception +from services.constants import Constants +from services.logging_service import LoggingServiceFactory +from services.types import Frontend, DB +from tests.uiTests.test_ui_base import TestUiBase + + +logger = LoggingServiceFactory.get_logger() + + +class TestChecklistTemplate(TestUiBase): + one_web_driver_enabled = False + + @classmethod + def setUpClass(cls): + super(TestChecklistTemplate, cls).setUpClass() + DB.Checklist.create_editing_cl_template_if_not_exist() + + @exception() + def test_save_checklist_tamplate_without_changes(self): + Frontend.ChecklistTemplate.basic_admin_navigation() + Frontend.ChecklistTemplate.click_on_template_name_on_navigation( + Constants.Dashboard.LeftPanel.EditChecklistTemplate.HEAT, + Constants.Dashboard.LeftPanel.EditChecklistTemplate.HEAT) + Frontend.ChecklistTemplate.save_with_no_changes() + + @exception() + def test_discard_checklist_tamplate_with_changes(self): + Frontend.ChecklistTemplate.basic_admin_navigation() + Frontend.ChecklistTemplate.click_on_template_name_on_navigation( + Constants.Dashboard.LeftPanel.EditChecklistTemplate.HEAT, + Constants.Dashboard.LeftPanel.EditChecklistTemplate.HEAT) + Frontend.ChecklistTemplate.discard_checklist_after_modification() + + @exception() + def test_save_checklist_tamplate_after_edit_section_name(self): + Frontend.ChecklistTemplate.basic_admin_navigation() + Frontend.ChecklistTemplate.click_on_template_name_on_navigation( + Constants.Dashboard.LeftPanel.EditChecklistTemplate.HEAT, + Constants.Dashboard.LeftPanel.EditChecklistTemplate.HEAT) + Frontend.ChecklistTemplate.edit_template_and_save() + + @exception() + def test_save_checklist_tamplate_after_lineitem_delete(self): + Frontend.ChecklistTemplate.basic_admin_navigation() + Frontend.ChecklistTemplate.click_on_template_name_on_navigation( + Constants.Dashboard.LeftPanel.EditChecklistTemplate.HEAT, + Constants.Dashboard.LeftPanel.EditChecklistTemplate.HEAT) + Frontend.ChecklistTemplate.del_lineitem_and_save() + + @exception() + def test_save_checklist_tamplate_after_lineitem_added(self): + Frontend.ChecklistTemplate.basic_admin_navigation() + Frontend.ChecklistTemplate.click_on_template_name_on_navigation( + Constants.Dashboard.LeftPanel.EditChecklistTemplate.HEAT, + Constants.Dashboard.LeftPanel.EditChecklistTemplate.HEAT) + Frontend.ChecklistTemplate.add_lineitem_and_save() + + @exception() + def test_lineitem_added_and_verify_cl_changed(self): + Frontend.ChecklistTemplate.basic_admin_navigation() + Frontend.ChecklistTemplate.click_on_template_name_on_navigation( + Constants.Dashboard.LeftPanel.EditChecklistTemplate.HEAT, + Constants.Dashboard.LeftPanel.EditChecklistTemplate.HEAT) + Frontend.ChecklistTemplate.add_lineitem_and_check_db() + + @exception() + def test_save_checklist_tamplate_after_edit_lineitem(self): + Frontend.ChecklistTemplate.basic_admin_navigation() + Frontend.ChecklistTemplate.click_on_template_name_on_navigation( + Constants.Dashboard.LeftPanel.EditChecklistTemplate.HEAT, + Constants.Dashboard.LeftPanel.EditChecklistTemplate.HEAT) + Frontend.ChecklistTemplate.edit_description_lineitem_and_save() diff --git a/tests/uiTests/test_export_excel.py b/tests/uiTests/test_export_excel.py new file mode 100644 index 0000000..faad489 --- /dev/null +++ b/tests/uiTests/test_export_excel.py @@ -0,0 +1,70 @@ + +# ============LICENSE_START========================================== +# org.onap.vvp/test-engine +# =================================================================== +# Copyright © 2017 AT&T Intellectual Property. All rights reserved. +# =================================================================== +# +# Unless otherwise specified, all software contained herein is licensed +# under the Apache License, Version 2.0 (the “License”); +# you may not use this software except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# Unless otherwise specified, all documentation contained herein is licensed +# under the Creative Commons License, Attribution 4.0 Intl. (the “License”); +# you may not use this documentation except in compliance with the License. +# You may obtain a copy of the License at +# +# https://creativecommons.org/licenses/by/4.0/ +# +# Unless required by applicable law or agreed to in writing, documentation +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ============LICENSE_END============================================ +# +# ECOMP is a trademark and service mark of AT&T Intellectual Property. +from selenium.common.exceptions import TimeoutException + +from iceci.decorator.exception_decor import exception +from services.constants import Constants +from services.logging_service import LoggingServiceFactory +from services.types import API, Frontend +from tests.uiTests.test_ui_base import TestUiBase + + +logger = LoggingServiceFactory.get_logger() + + +class TestFeatureExportToExcel(TestUiBase): + user_content = None + + @classmethod + def setUpClass(cls): + super(TestFeatureExportToExcel, cls).setUpClass() + + cls.user_content = API.VirtualFunction.create_engagement(wait_for_gitlab=False) + + @exception() + def test_validate_export_to_csv(self): + Frontend.User.login(self.user_content['email'], Constants.Default.Password.TEXT) + Frontend.User.click_on_export_excel(self.user_content) + try: + token = "token " + API.Bridge.login_user(self.user_content['email']) + content = API.VirtualFunction.get_export_dasboard_excel(token) + if not content: + raise Exception("content is empty.") + except TimeoutException: + logger.error("TimeoutException Not Appear") diff --git a/tests/uiTests/test_feedback_modal.py b/tests/uiTests/test_feedback_modal.py new file mode 100644 index 0000000..d47ed2f --- /dev/null +++ b/tests/uiTests/test_feedback_modal.py @@ -0,0 +1,66 @@ + +# ============LICENSE_START========================================== +# org.onap.vvp/test-engine +# =================================================================== +# Copyright © 2017 AT&T Intellectual Property. All rights reserved. +# =================================================================== +# +# Unless otherwise specified, all software contained herein is licensed +# under the Apache License, Version 2.0 (the “License”); +# you may not use this software except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# Unless otherwise specified, all documentation contained herein is licensed +# under the Creative Commons License, Attribution 4.0 Intl. (the “License”); +# you may not use this documentation except in compliance with the License. +# You may obtain a copy of the License at +# +# https://creativecommons.org/licenses/by/4.0/ +# +# Unless required by applicable law or agreed to in writing, documentation +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ============LICENSE_END============================================ +# +# ECOMP is a trademark and service mark of AT&T Intellectual Property. +from iceci.decorator.exception_decor import exception +from services.constants import Constants +from services.logging_service import LoggingServiceFactory +from services.types import Frontend, API +from tests.uiTests.test_ui_base import TestUiBase + + +logger = LoggingServiceFactory.get_logger() + + +class TestFeedbackModal(TestUiBase): + user_content = None + + @classmethod + def setUpClass(cls): + super(TestFeedbackModal, cls).setUpClass() + + cls.user_content = API.VirtualFunction.create_engagement(wait_for_gitlab=False) + + + @exception() + def test_add_feedback(self): + Frontend.User.login(self.user_content['email'], Constants.Default.Password.TEXT) + Frontend.User.click_on_avatar() + Frontend.User.click_on_feedback() + description = Frontend.User.add_feedback() + Frontend.User.validate_feedback(description, self.user_content['email']) + diff --git a/tests/uiTests/test_invitations_and_throttle_logic.py b/tests/uiTests/test_invitations_and_throttle_logic.py new file mode 100644 index 0000000..f5742fc --- /dev/null +++ b/tests/uiTests/test_invitations_and_throttle_logic.py @@ -0,0 +1,178 @@ + +# ============LICENSE_START========================================== +# org.onap.vvp/test-engine +# =================================================================== +# Copyright © 2017 AT&T Intellectual Property. All rights reserved. +# =================================================================== +# +# Unless otherwise specified, all software contained herein is licensed +# under the Apache License, Version 2.0 (the “License”); +# you may not use this software except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# Unless otherwise specified, all documentation contained herein is licensed +# under the Creative Commons License, Attribution 4.0 Intl. (the “License”); +# you may not use this documentation except in compliance with the License. +# You may obtain a copy of the License at +# +# https://creativecommons.org/licenses/by/4.0/ +# +# Unless required by applicable law or agreed to in writing, documentation +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ============LICENSE_END============================================ +# +# ECOMP is a trademark and service mark of AT&T Intellectual Property. +from iceci.decorator.exception_decor import exception +from services.constants import Constants +from services.frontend.base_actions.click import Click +from services.frontend.base_actions.enter import Enter +from services.frontend.base_actions.get import Get +from services.frontend.base_actions.wait import Wait +from services.helper import Helper +from services.logging_service import LoggingServiceFactory +from services.types import API, DB, Frontend +from tests.uiTests.test_ui_base import TestUiBase + + +logger = LoggingServiceFactory.get_logger() + + +class TestInvitationsLogic(TestUiBase): + ''' + Check that there is not an invitation entry in the table for a specific + email and engagement_uuid. If an entry exists, do not send an email. + ''' + + @exception() + def test_validate_duplicate_invite(self): + user_content = [] + for _ in range(3): + user_content.append( + API.VirtualFunction.create_engagement(wait_for_gitlab=False)) + Frontend.User.login( + user_content[0]['email'], Constants.Default.Password.TEXT) + engName = user_content[0][ + 'engagement_manual_id'] + ": " + user_content[0]['vfName'] + vf_left_nav_id = "clickable-" + engName + Click.id(vf_left_nav_id) + Frontend.Wizard.invite_team_members_modal(user_content[1]['email']) + enguuid = DB.General.select_where( + "uuid", "ice_engagement", "engagement_manual_id", user_content[0]['engagement_manual_id'], 1) + invitation_token = DB.User.select_invitation_token( + "invitation_token", "ice_invitation", "engagement_uuid", enguuid, user_content[1]['email'], 1) + inviterURL = Constants.Default.InviteURL.Login.TEXT + invitation_token + Frontend.General.re_open(inviterURL) + title_id = "title-id-" + engName + Frontend.User.login( + user_content[1]['email'], Constants.Default.Password.TEXT, title_id) + vf_left_nav_id = "clickable-" + engName + Click.id(vf_left_nav_id) + actualVfName = Get.by_id(vf_left_nav_id) + Helper.internal_assert(engName, actualVfName) + Wait.text_by_id(Constants.Dashboard.Overview.Title.ID, engName) + Frontend.User.logout() + Frontend.User.login( + user_content[0]['email'], Constants.Default.Password.TEXT) + engName = user_content[0][ + 'engagement_manual_id'] + ": " + user_content[0]['vfName'] + vf_left_nav_id = "clickable-" + engName + Click.id(vf_left_nav_id) + Click.id(Constants.Dashboard.Overview.TeamMember.ID) + Wait.text_by_css(Constants.Dashboard.Wizard.Title.CSS, + Constants.Dashboard.Wizard.InviteTeamMembers.Title.TEXT) + Enter.text_by_name("email", user_content[1]['email']) + Wait.text_by_css(Constants.SubmitButton.CSS, + Constants.Dashboard.Wizard.InviteTeamMembers.Button.TEXT) + Click.css(Constants.SubmitButton.CSS) + Wait.id(Constants.Toast.ID) + Helper.internal_assert( + Get.by_id(Constants.Toast.ID), "Invite couldn't be created") + + ''' + If there are 5 invitations for a specific email in the last 24 hours for a particular standard user + and/or email do not send an email. Note: ELs and admins do not have a limit for how many invitations + they can get per 24 hours. + ''' + @exception() + def test_5_invitations_for_specific_SU_last_24_hours(self): + user_content = [] + for _ in range(2): + user_content.append( + API.Bridge.create_engagement(wait_for_gitlab=False)) + # Login with 1st user # + Frontend.User.login( + user_content[0]['email'], Constants.Default.Password.TEXT) + vf_left_nav_id = Frontend.Invite.invite_users(user_content) + # Login with 1st user # + Frontend.User.login( + user_content[0]['email'], Constants.Default.Password.TEXT) + x = 4 + Frontend.Invite.invite_x_users(user_content, vf_left_nav_id, x) + # Invite 6 # + Frontend.Invite.invite_and_validate_limit(user_content, vf_left_nav_id) + + ''' + If there are more than 25 invitations for an invited_by_user_uuid + corresponding to an normal standard users and read only admins, + do not send the invite. + ''' + @exception() + def test_25_invitations_for_an_invited_by_user_uuid(self): + user_content = API.VirtualFunction.create_engagement( + wait_for_gitlab=False) + list_of_invite_emails = [] + list_of_invite_emails.append( + Constants.Users.LongEmailLengthStandardUser.EMAIL) + for _ in range(29): + list_of_invite_emails.append(Helper.rand_string("email")) + Frontend.User.login( + user_content['email'], Constants.Default.Password.TEXT) + engName = user_content[ + 'engagement_manual_id'] + ": " + user_content['vfName'] + vf_left_nav_id = "clickable-" + engName + Frontend.User.open_invite_team_member_form(vf_left_nav_id) + countOfem = 2 + countofUser = 0 + Frontend.Invite.invite_x_users_from_tm( + list_of_invite_emails, countofUser, countOfem, 9) + # Next 10 Users # + countOfem2 = 2 + countofUser2 = 10 + Click.id( + Constants.Dashboard.Overview.TeamMember.ID, wait_for_page=True) + Wait.text_by_css(Constants.Dashboard.Wizard.Title.CSS, + Constants.Dashboard.Wizard.InviteTeamMembers.Title.TEXT) + Frontend.Invite.invite_x_users_from_tm( + list_of_invite_emails, countofUser2, countOfem2, 9) + countOfem3 = 2 + countofUser3 = 20 + Click.id( + Constants.Dashboard.Overview.TeamMember.ID, wait_for_page=True) + Wait.text_by_css(Constants.Dashboard.Wizard.Title.CSS, + Constants.Dashboard.Wizard.InviteTeamMembers.Title.TEXT) + Frontend.Invite.invite_x_users_from_tm( + list_of_invite_emails, countofUser3, countOfem3, 5) + Wait.text_by_id(Constants.Toast.ID, + "Invite couldn't be created", wait_for_page=True) + + def test_3_invitations_new_user_to_3_vfs(self): + user_content = API.VirtualFunction.create_engagement( + wait_for_gitlab=False) + engName = user_content[ + 'engagement_manual_id'] + ": " + user_content['vfName'] + Frontend.Invite.invite_x_users_and_verify_VF_appers_for_invited( + user_content, engName) diff --git a/tests/uiTests/test_left_nav_panel.py b/tests/uiTests/test_left_nav_panel.py new file mode 100644 index 0000000..74a78ad --- /dev/null +++ b/tests/uiTests/test_left_nav_panel.py @@ -0,0 +1,200 @@ + +# ============LICENSE_START========================================== +# org.onap.vvp/test-engine +# =================================================================== +# Copyright © 2017 AT&T Intellectual Property. All rights reserved. +# =================================================================== +# +# Unless otherwise specified, all software contained herein is licensed +# under the Apache License, Version 2.0 (the “License”); +# you may not use this software except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# Unless otherwise specified, all documentation contained herein is licensed +# under the Creative Commons License, Attribution 4.0 Intl. (the “License”); +# you may not use this documentation except in compliance with the License. +# You may obtain a copy of the License at +# +# https://creativecommons.org/licenses/by/4.0/ +# +# Unless required by applicable law or agreed to in writing, documentation +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ============LICENSE_END============================================ +# +# ECOMP is a trademark and service mark of AT&T Intellectual Property. +from selenium.webdriver.support.select import Select + +from iceci.decorator.exception_decor import exception +from services.constants import Constants +from services.frontend.base_actions.click import Click +from services.frontend.base_actions.enter import Enter +from services.frontend.base_actions.get import Get +from services.frontend.base_actions.wait import Wait +from services.helper import Helper +from services.logging_service import LoggingServiceFactory +from services.session import session +from services.types import API, Frontend, DB +from tests.uiTests.test_ui_base import TestUiBase + + +logger = LoggingServiceFactory.get_logger() + + +class TestLeftNavPanel(TestUiBase): + user_content = None + + @classmethod + def setUpClass(cls): + super(TestLeftNavPanel, cls).setUpClass() + cls.user_content = API.VirtualFunction.create_engagement( + wait_for_gitlab=False) + cls.eng_title = "%s: %s" % ( + cls.user_content['engagement_manual_id'], cls.user_content['vfName']) + cls.left_panel_eng_id = "clickable-%s" % (cls.eng_title) + + def setUp(self): + super(TestLeftNavPanel, self).setUp() + Frontend.User.login( + self.user_content['el_email'], Constants.Default.Password.TEXT) + + @exception() + def test_starred_recent_searchbar(self): + actualVfName = Get.by_id(self.left_panel_eng_id) + Helper.internal_assert(self.eng_title, actualVfName) + Click.id(self.left_panel_eng_id) + Wait.id("title-id-" + self.eng_title) + Helper.internal_assert( + self.user_content['engagement_manual_id'] + ":", Get.by_id("title-id-" + self.eng_title)) + Click.id(Constants.Dashboard.Overview.Star.ID, wait_for_page=True) + Wait.id("title-id-" + self.eng_title) + Click.id(Constants.Dashboard.Overview.Star.ID, wait_for_page=True) + Wait.id("title-id-" + self.eng_title, wait_for_page=True) + Helper.internal_assert( + self.eng_title, Get.by_id(self.left_panel_eng_id)) + Enter.text_by_xpath( + "//input[@type='text']", self.user_content['engagement_manual_id'], wait_for_page=True) + Wait.text_by_css( + Constants.Dashboard.LeftPanel.SearchBox.Results.CSS, self.eng_title) + Click.css( + Constants.Dashboard.LeftPanel.SearchBox.Results.CSS, wait_for_page=True) + + @exception() + def test_search_bar(self): + """ Create user and VF, log in, add VFC, search by EID, VF and VFC """ + vfFullName = self.user_content[ + 'engagement_manual_id'] + ": " + self.user_content['vfName'] + try: + Enter.text_by_id( + Constants.Dashboard.LeftPanel.SearchBox.ID, self.user_content['vfName']) + Wait.css(Constants.Dashboard.LeftPanel.SearchBox.Results.CSS) + Click.css(Constants.Dashboard.LeftPanel.SearchBox.Results.CSS) + Wait.text_by_id( + Constants.Dashboard.Overview.Title.ID, vfFullName) + except: + errorMsg = "Failed to search by VF name." + raise Exception(errorMsg) + + try: + Enter.text_by_id(Constants.Dashboard.LeftPanel.SearchBox.ID, self.user_content[ + 'engagement_manual_id']) + Enter.text_by_id(Constants.Dashboard.LeftPanel.SearchBox.ID, self.user_content[ + 'engagement_manual_id']) + Wait.css(Constants.Dashboard.LeftPanel.SearchBox.Results.CSS) + Click.css(Constants.Dashboard.LeftPanel.SearchBox.Results.CSS) + Wait.text_by_id( + Constants.Dashboard.Overview.Title.ID, vfFullName) + except: + errorMsg = "Failed to search by Engagement Manual ID." + raise Exception(errorMsg) + Frontend.Overview.click_on_vf(self.user_content) + detailedViewID = Constants.Dashboard.DetailedView.ID + vfFullName + Wait.text_by_id(detailedViewID, "Detailed View", wait_for_page=True) + Click.id(detailedViewID, wait_for_page=True) + Click.id( + Constants.Dashboard.DetailedView.VFC.Add.ID, wait_for_page=True) + vfcName = Helper.rand_string("randomString") + extRefID = Helper.rand_string("randomNumber") + Enter.text_by_name("name", vfcName) + Enter.text_by_name("extRefID", extRefID, wait_for_page=True) + Select(session.ice_driver.find_element_by_id(Constants.Dashboard.DetailedView.VFC.Choose_Company.ID)).select_by_visible_text( + self.user_content['vendor']) + Click.id( + Constants.Dashboard.DetailedView.VFC.Save_button.ID, wait_for_page=True) + try: + Enter.text_by_id( + Constants.Dashboard.LeftPanel.SearchBox.ID, vfcName, wait_for_page=True) + Click.id( + "search-" + self.user_content['vfName'], wait_for_page=True) + Wait.id("clickable-" + vfFullName, wait_for_page=True) + except Exception as e: + errorMsg = "Failed to search by VFC name." + raise Exception(errorMsg + str(e)) + + @exception() + def test_recent_bar_by_last_updated(self): + countIdsActive = 0 + myVfName = self.user_content[ + 'engagement_manual_id'] + ": " + self.user_content['vfName'] + actualVfNameid = "clickable-" + myVfName + actualVfName = Get.by_id(actualVfNameid) + Helper.internal_assert(myVfName, actualVfName) + Click.id(actualVfNameid) + uuid = DB.General.select_where_email( + "uuid", "ice_user_profile", self.user_content['el_email']) + ids2 = DB.User.select_recent_vf_of_user(uuid, 0) + part_of_id_to_find = "clickable-" + ids1 = session.ice_driver.find_elements_by_css_selector( + '[id*="%s"]' % part_of_id_to_find) + for ii in ids1: + if "clickable-" in ii.get_attribute('id'): + logger.debug("Fetched ID: " + ii.get_attribute('id')) + vf_name = ii.get_attribute('id').split(" ")[1] + vf_uuid = DB.General.select_where( + "uuid", "ice_vf", "name", vf_name, 1) + if vf_uuid in ids2: + countIdsActive += 1 + if(countIdsActive == len(ids2.split())): + logger.debug("Right result") + + @exception() + def test_entering_engagement_from_dashboard(self): + Wait.text_by_id(self.left_panel_eng_id, self.eng_title) + DB.VirtualFunction.remove_engagement_from_recent( + self.user_content['vf_uuid']) + Frontend.General.refresh() + Wait.id_to_dissappear(self.left_panel_eng_id) + Frontend.Dashboard.statuses_search_vf( + self.user_content['engagement_manual_id'], self.user_content['vfName']) + Wait.text_by_id(self.left_panel_eng_id, self.eng_title) + + @exception() + def test_search_by_email(self): + user_content = API.VirtualFunction.create_engagement( + wait_for_gitlab=False) + Frontend.User.relogin( + user_content['email'], Constants.Default.Password.TEXT) + Frontend.Dashboard.search_in_left_searchbox_by_param( + user_content['engagement_manual_id'], user_content['vfName'], user_content['email']) + + @exception() + def test_search_by_username(self): + user_content = API.VirtualFunction.create_engagement( + wait_for_gitlab=False) + Frontend.User.relogin( + user_content['email'], Constants.Default.Password.TEXT) + Frontend.Dashboard.search_in_left_searchbox_by_param( + user_content['engagement_manual_id'], user_content['vfName'], user_content['full_name']) diff --git a/tests/uiTests/test_login_with_new_user.py b/tests/uiTests/test_login_with_new_user.py new file mode 100644 index 0000000..8018b1a --- /dev/null +++ b/tests/uiTests/test_login_with_new_user.py @@ -0,0 +1,545 @@ + +# ============LICENSE_START========================================== +# org.onap.vvp/test-engine +# =================================================================== +# Copyright © 2017 AT&T Intellectual Property. All rights reserved. +# =================================================================== +# +# Unless otherwise specified, all software contained herein is licensed +# under the Apache License, Version 2.0 (the “License”); +# you may not use this software except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# Unless otherwise specified, all documentation contained herein is licensed +# under the Creative Commons License, Attribution 4.0 Intl. (the “License”); +# you may not use this documentation except in compliance with the License. +# You may obtain a copy of the License at +# +# https://creativecommons.org/licenses/by/4.0/ +# +# Unless required by applicable law or agreed to in writing, documentation +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ============LICENSE_END============================================ +# +# ECOMP is a trademark and service mark of AT&T Intellectual Property. +from wheel.signatures import assertTrue +from iceci.decorator.exception_decor import exception +from services.constants import Constants +from services.frontend.base_actions.click import Click +from services.frontend.base_actions.enter import Enter +from services.frontend.base_actions.get import Get +from services.frontend.base_actions.wait import Wait +from services.helper import Helper +from services.logging_service import LoggingServiceFactory +from services.types import API, Frontend, DB +from tests.uiTests.test_ui_base import TestUiBase + +logger = LoggingServiceFactory.get_logger() + + +class TestLoginPageWithNewUser(TestUiBase): + + @exception() + def test_login_positive(self): + ''' Create new user login. ''' + user_content = API.User.create_new_user() + Frontend.User.login( + user_content['email'], Constants.Default.Password.TEXT, Constants.Toast.ID) + logger.debug("Resend Activation Email Page Opened ") + Wait.text_by_id( + Constants.Toast.ID, Constants.ActivateAccount.Toast.TEXT) + + @exception() + def test_login_negative(self): + ''' Negative: Type wrong password in login page. ''' + user_content = API.User.create_new_user(activate=True) + Frontend.User.login( + user_content['email'], Helper.rand_string("randomString"), Constants.Toast.ID) + Wait.text_by_id(Constants.Toast.ID, Constants.Login.Toast.TEXT) + logger.debug( + "Message Error(APIUser or Password does not match) Displayed") + + @exception() + def test_login_negative_email_valid(self): + ''' Negative: Type wrong password in login page. ''' + user_content = API.User.create_new_user(activate=True) + Frontend.User.login( + user_content['email'] + "s", Constants.Default.Password.TEXT, Constants.Toast.ID) + Wait.text_by_id(Constants.Toast.ID, Constants.Login.Toast.TEXT) + logger.debug( + "Message Error(APIUser or Password does not match) Displayed") + + @exception() + def test_login_negative_required_password(self): + ''' Check that password is a required field on login page. ''' + user_content = API.User.create_new_user() + logger.debug("Verifying and Insert Login page elements:") + Enter.text_by_name(Constants.Login.Email.NAME, user_content['email']) + Enter.text_by_name(Constants.Login.Password.NAME, "1") + Enter.text_by_name(Constants.Login.Password.NAME, "") + Wait.text_by_css( + Constants.Login.Password.Error.CSS, Constants.Login.Password.Error.TEXT) + + @exception() + def test_login_page_dont_have_accaunt_button(self): + ''' Go to login page, click_on on "Don't have an account", verify user is redirected to signup page. ''' + Click.id(Constants.Login.DontHaveAccount.ID) + Wait.text_by_css( + Constants.Signup.Title.CSS, Constants.Signup.Title.TEXT) + + @exception() + def test_login_page_home_button(self): + ''' Open login page, verify home button works correctly. ''' + Click.id(Constants.Home.Logo.ID) + Wait.text_by_id(Constants.Home.Title.ID, Constants.Home.Title.TEXT) + + @exception() + def test_create_and_activate_user(self): + ''' Create user and activate by log-in. ''' + user_content = API.User.create_new_user() + Frontend.User.login( + user_content['email'], Constants.Default.Password.TEXT, Constants.Toast.ID) + ''' Resend Activation Email Page Opened ''' + Wait.text_by_id( + Constants.Toast.ID, Constants.ActivateAccount.Toast.TEXT) + activationUrl = DB.User.get_activation_url(user_content['email']) + Frontend.General.re_open(activationUrl) + Frontend.User.login( + user_content['email'], Constants.Default.Password.TEXT) + Wait.text_by_id( + Constants.Toast.ID, Constants.Dashboard.ActivateMsg.Success.TEXT) + + @exception() + def test_invite_existing_user(self): + ''' Create user and VF, login, invite existing user, login with second user and verify user has joined to engagement ''' + user_content = API.VirtualFunction.create_engagement( + wait_for_gitlab=False) + second_user_content = API.VirtualFunction.create_engagement( + wait_for_gitlab=False) + activationUrl = DB.User.get_activation_url(user_content['email']) + Frontend.General.re_open(activationUrl) + Frontend.User.login( + user_content['email'], Constants.Default.Password.TEXT) + vfFullName = user_content[ + 'engagement_manual_id'] + ": " + user_content['vfName'] + actualVfNameid = "clickable-" + vfFullName + Click.id(actualVfNameid,wait_for_page=True) + Wait.id(Constants.Dashboard.Overview.TeamMember.ID) + Frontend.Wizard.invite_team_members_modal(second_user_content['email']) + enguuid = DB.General.select_where("uuid", "ice_engagement", "engagement_manual_id", user_content[ + 'engagement_manual_id'], 1) # Fetch one is_service_provider_contact user ID. + invitation_token = DB.User.select_invitation_token("invitation_token", "ice_invitation", "engagement_uuid", + enguuid, second_user_content['email'], 1) + inviterURL = Constants.Default.InviteURL.Login.TEXT + invitation_token + Frontend.General.re_open(inviterURL) + actualVfNameid = "clickable-" + vfFullName + Frontend.User.login( + second_user_content['email'], Constants.Default.Password.TEXT, actualVfNameid) + Wait.modal_to_dissappear() + Frontend.Overview.click_on_vf(user_content) + Wait.text_by_id(Constants.Dashboard.Overview.Title.ID, vfFullName) + + @exception() + def test_invite_new_user_of_service_provider_internal(self): + ''' + TC Name: test_invite_new_user_aservice_provider_internal + Steps: + Create new NOT-MainServiceProvider APIUser via SignUp request-->Login with This One--> build "activationUrl"--> + Validation of successful activate--> + close Wizard --> Logout from Dashboard -->login-->Open Wizard--> fill all fields in all Tab's(4)--> + validate second Tab is a "add_service_provider_internal"--> + build inviteURL from email--> reopen browser with inviteURL--> + Validate Login Form opened --> + Login--> Validate Dashboard Form opened + ''' + user_content = API.User.create_new_user(company="Amdocs") + uuid = DB.General.select_where_email( + "uuid", "ice_user_profile", user_content['email']) + activationUrl = DB.User.get_activation_url(user_content['email']) + Frontend.General.re_open(activationUrl) + Frontend.User.login( + user_content['email'], Constants.Default.Password.TEXT) # new + Wait.text_by_id( + Constants.Toast.ID, Constants.Dashboard.ActivateMsg.Success.TEXT) + Click.id(Constants.Dashboard.Wizard.CloseButton.ID) + Wait.modal_to_dissappear() + Frontend.User.logout() + Frontend.User.login( + user_content['email'], Constants.Default.Password.TEXT) + Wait.text_by_css( + Constants.Dashboard.LeftPanel.Title.CSS, Constants.Dashboard.LeftPanel.Title.TEXT) + Wait.id(Constants.Dashboard.Statuses.Title.ID) + Click.id(Constants.Dashboard.LeftPanel.AddEngagement.ID) + # Wizard + vfName = Frontend.Wizard.add_vf() + service_provider_internal = Frontend.Wizard.add_service_provider_internal() + inviteEmail = Helper.rand_invite_email() + Frontend.Wizard.invite_team_members(inviteEmail) + Frontend.Wizard.add_ssh_key() + enguuid = DB.General.select_where("uuid", "ice_vf", "name", vfName, 1) + invitation_token = DB.User.select_invitation_token("invitation_token", "ice_invitation", "engagement_uuid", + enguuid, inviteEmail, 1) + inviterURL = Constants.Default.InviteURL.Signup.TEXT + \ + invitation_token + "&email=" + inviteEmail + + Frontend.General.re_open(inviterURL) + actualInvitedEmail = Get.value_by_name(Constants.Signup.Email.NAME) + Helper.internal_assert(inviteEmail, actualInvitedEmail) + signUpURLforContact = DB.User.get_contact_signup_url(invitation_token, uuid, service_provider_internal["email"], + service_provider_internal["full_name"], service_provider_internal["phone"], service_provider_internal["company"]) + Frontend.General.re_open(signUpURLforContact) + actualInvitedEmail = Get.value_by_name(Constants.Signup.Email.NAME) + Helper.internal_assert(service_provider_internal["email"], actualInvitedEmail) + Helper.internal_assert( + "+" + service_provider_internal["phone"], Get.value_by_name(Constants.Signup.Phone.NAME)) + Helper.internal_assert( + service_provider_internal["full_name"], Get.value_by_name(Constants.Signup.FullName.NAME)) + Helper.internal_assert( + service_provider_internal["company"], Get.value_by_name(Constants.Signup.Company.NAME)) + + @exception() + def test_create_2_new_users(self): + ''' + Login and activate new user, than reopen browser and loging with new other user - + check wizard appears for both Frontend.User. + ''' + # First APIUser + user_content = API.User.create_new_user() + logger.debug(user_content['email']) + activationUrl = DB.User.get_activation_url(user_content['email']) + logger.debug(activationUrl) + Frontend.General.re_open(activationUrl) + Frontend.User.login( + user_content['email'], Constants.Default.Password.TEXT) + Wait.text_by_id( + Constants.Toast.ID, Constants.Dashboard.ActivateMsg.Success.TEXT) + Click.id(Constants.Dashboard.Wizard.CloseButton.ID) + Wait.modal_to_dissappear() + Frontend.User.logout() + # Second APIUser + user_content = API.User.create_new_user() + logger.debug(user_content['email']) + activationUrl2 = DB.User.get_activation_url(user_content['email']) + logger.debug(activationUrl2) + Frontend.General.re_open_not_clean_cache(activationUrl2) + Frontend.User.login( + user_content['email'], Constants.Default.Password.TEXT) # new + Wait.text_by_id( + Constants.Toast.ID, Constants.Dashboard.ActivateMsg.Success.TEXT) + Click.id(Constants.Dashboard.Wizard.CloseButton.ID) + Wait.modal_to_dissappear() + Click.id(Constants.Dashboard.Avatar.ID) + + @exception() + def test_validate_account_form(self): + '''Go to Account page and validate details.''' + user_content = API.VirtualFunction.create_engagement( + wait_for_gitlab=False) + ssh_key = API.User.set_ssh(user_content) + Frontend.User.login( + user_content['email'], Constants.Default.Password.TEXT) + Frontend.User.go_to_account() + Frontend.User.validate_account_details( + user_content['full_name'], user_content['phone_number'], ssh_key) + + @exception() + def test_add_vendor_contact(self): + ''' + TC Name: test_add_vendor_contact + Steps: + Invite vendor contact and activate the invited user. Validate the invited user has the right VF. + ''' + user_content = API.User.create_new_user() + # Fetch one user ID. + uuid = DB.General.select_where_email( + "uuid", "ice_user_profile", user_content['email']) + activationUrl = DB.User.get_activation_url(user_content['email']) + Frontend.General.re_open(activationUrl) + Frontend.User.login( + user_content['email'], Constants.Default.Password.TEXT) # new + Wait.text_by_id( + Constants.Toast.ID, Constants.Dashboard.ActivateMsg.Success.TEXT) + Click.id(Constants.Dashboard.Wizard.CloseButton.ID) + Wait.modal_to_dissappear() + Frontend.User.logout() + Frontend.User.login( + user_content['email'], Constants.Default.Password.TEXT) + Wait.text_by_css( + Constants.Dashboard.LeftPanel.Title.CSS, Constants.Dashboard.LeftPanel.Title.TEXT) + Wait.id(Constants.Dashboard.Statuses.Title.ID) + logger.debug("click_on on + Dashboard") + Click.id(Constants.Dashboard.LeftPanel.AddEngagement.ID) + # Wizard + vfName = Frontend.Wizard.add_vf() + vendor_contact = Frontend.Wizard.add_vendor_contact() + inviteEmail = "automationqatt" + \ + Helper.rand_string("randomString") + "@gmail.com" + Frontend.Wizard.invite_team_members(inviteEmail) + Frontend.Wizard.add_ssh_key() + engagement_id = DB.General.select_where( + "engagement_id", "ice_vf", "name", vfName, 1) + engLeadEmail = DB.User.select_el_email(vfName) + engagement_manual_id = DB.General.select_where( + "engagement_manual_id", "ice_engagement", "uuid", engagement_id, 1) + # Fetch one is_service_provider_contact user ID. + enguuid = DB.General.select_where( + "uuid", "ice_engagement", "engagement_manual_id", engagement_manual_id, 1) + invitation_token = DB.User.select_invitation_token("invitation_token", "ice_invitation", "engagement_uuid", + enguuid, vendor_contact["email"], 1) + signUpURLforContact = DB.User.get_contact_signup_url(invitation_token, uuid, vendor_contact["email"], + vendor_contact["full_name"], vendor_contact["phone"], vendor_contact["company"]) + Frontend.General.re_open(signUpURLforContact) + actualInvitedEmail = Get.value_by_name(Constants.Signup.Email.NAME) + Helper.internal_assert(vendor_contact["email"], actualInvitedEmail) + Helper.internal_assert( + "+" + vendor_contact["phone"], Get.value_by_name(Constants.Signup.Phone.NAME)) + Helper.internal_assert( + vendor_contact["full_name"], Get.value_by_name(Constants.Signup.FullName.NAME)) + Helper.internal_assert( + vendor_contact["company"], Get.value_by_name(Constants.Signup.Company.NAME)) + # SignUp for VendorContact + user_content['engagement_uuid'] = engagement_id + user_content['el_email'] = engLeadEmail + API.User.signup_invited_user(vendor_contact["company"], vendor_contact["email"], invitation_token, + signUpURLforContact, user_content, True) + activationUrl2 = DB.User.get_activation_url(vendor_contact["email"]) + # Activate for VendorContact + myVfName = engagement_manual_id + ": " + vfName + actualVfNameid = "clickable-" + myVfName + Frontend.General.re_open(activationUrl2) + Frontend.User.login( + vendor_contact["email"], Constants.Default.Password.TEXT, actualVfNameid) + # Validate opened right VF for VendorContact + actualVfName = Get.by_id(actualVfNameid) + Helper.internal_assert(myVfName, actualVfName) + + @exception() + def test_add_service_provider_internal(self): + ''' + TC Name: test_add_service_provider_internal + Steps: + Invite is_service_provider_contact Sponsor and activate the invited user. Validate sponsor has the right VF. + ''' + user_content = API.User.create_new_user(company="Amdocs") + uuid = DB.General.select_where_email( + "uuid", "ice_user_profile", user_content['email']) + activationUrl = DB.User.get_activation_url(user_content['email']) + Frontend.General.re_open(activationUrl) + Frontend.User.login( + user_content['email'], Constants.Default.Password.TEXT) # new + Wait.text_by_id( + Constants.Toast.ID, Constants.Dashboard.ActivateMsg.Success.TEXT) + Click.id(Constants.Dashboard.Wizard.CloseButton.ID) + Wait.modal_to_dissappear() + Frontend.User.logout() + Frontend.User.login( + user_content['email'], Constants.Default.Password.TEXT) + Wait.text_by_css( + Constants.Dashboard.LeftPanel.Title.CSS, Constants.Dashboard.LeftPanel.Title.TEXT) + Wait.id(Constants.Dashboard.Statuses.Title.ID) + logger.debug("click_on on + Dashboard") + Click.id(Constants.Dashboard.LeftPanel.AddEngagement.ID) + # Wizard + vfName = Frontend.Wizard.add_vf() + service_provider_internal = Frontend.Wizard.add_service_provider_internal() + inviteEmail = "automationqatt" + \ + Helper.rand_string("randomString") + "@gmail.com" + Frontend.Wizard.invite_team_members(inviteEmail) + Frontend.Wizard.add_ssh_key() + enguuid = DB.General.select_where("uuid", "ice_vf", "name", vfName, 1) + invitation_token = DB.User.select_invitation_token("invitation_token", "ice_invitation", "engagement_uuid", + enguuid, inviteEmail, 1) + inviterURL = Constants.Default.InviteURL.Signup.TEXT + \ + invitation_token + "&email=" + inviteEmail + Frontend.General.re_open(inviterURL) + actualInvitedEmail = Get.value_by_name("email") + Helper.internal_assert(inviteEmail, actualInvitedEmail) + signUpURLforContact = DB.User.get_contact_signup_url(invitation_token, uuid, service_provider_internal["email"], + service_provider_internal["full_name"], service_provider_internal["phone"], service_provider_internal["company"]) + Frontend.General.re_open(signUpURLforContact) + actualInvitedEmail = Get.value_by_name(Constants.Signup.Email.NAME) + Helper.internal_assert( + str("+" + service_provider_internal["phone"]), Get.value_by_name(Constants.Signup.Phone.NAME)) + Helper.internal_assert( + service_provider_internal["full_name"], Get.value_by_name(Constants.Signup.FullName.NAME)) + Helper.internal_assert( + service_provider_internal["company"], Get.value_by_name(Constants.Signup.Company.NAME)) + # Fetch one is_service_provider_contact user ID. + engagement_id = DB.General.select_where( + "engagement_id", "ice_vf", "name", vfName, 1) + # SignUp for MainServiceProviderSponsorContact + engagement_manual_id = DB.General.select_where( + "engagement_manual_id", "ice_engagement", "uuid", engagement_id, 1) + # Fetch one is_service_provider_contact user ID. + enguuid = DB.General.select_where( + "uuid", "ice_engagement", "engagement_manual_id", engagement_manual_id, 1) + invitation_token = DB.User.select_invitation_token("invitation_token", "ice_invitation", "engagement_uuid", + enguuid, service_provider_internal["email"], 1) + engLeadEmail = DB.User.select_el_email(vfName) + user_content['engagement_uuid'] = engagement_id + user_content['el_email'] = engLeadEmail + API.User.signup_invited_user(service_provider_internal["company"], service_provider_internal["email"], invitation_token, + signUpURLforContact, user_content, True) + activationUrl2 = DB.User.get_activation_url(service_provider_internal["email"]) + # Activate for VendorContact + engagement_manual_id = DB.General.select_where( + "engagement_manual_id", "ice_engagement", "uuid", engagement_id, 1) + # Validate opened right VF for VendorContact + myVfName = engagement_manual_id + ": " + vfName + actualVfNameid = "clickable-" + myVfName + Frontend.General.re_open(activationUrl2) + Frontend.User.login( + service_provider_internal["email"], Constants.Default.Password.TEXT, actualVfNameid) + actualVfName = Get.by_id(actualVfNameid, wait_for_page=True) + Helper.internal_assert(myVfName, actualVfName) + + @exception() + def test_Validate_SSHkeyNS(self): + ''' Insert a valid ssh key in wizard, validate "add ssh key" next step marked as completed. ''' + user_content = API.User.create_new_user() + activationUrl = DB.User.get_activation_url(user_content['email']) + Frontend.General.re_open(activationUrl) + Frontend.User.login( + user_content['email'], Constants.Default.Password.TEXT) + Wait.text_by_id( + Constants.Toast.ID, Constants.Dashboard.ActivateMsg.Success.TEXT) + Click.id(Constants.Dashboard.Wizard.CloseButton.ID) + Wait.modal_to_dissappear() + Frontend.User.logout() + Frontend.User.login( + user_content['email'], Constants.Default.Password.TEXT) + Wait.text_by_css( + Constants.Dashboard.LeftPanel.Title.CSS, Constants.Dashboard.LeftPanel.Title.TEXT) + logger.debug("click_on on + Dashboard") + Click.id(Constants.Dashboard.LeftPanel.AddEngagement.ID) + # Wizard + vfName = Frontend.Wizard.add_vf() + Frontend.Wizard.add_vendor_contact() + inviteEmail = Helper.rand_invite_email() + Frontend.Wizard.invite_team_members(inviteEmail) + sshKey = Frontend.Wizard.add_ssh_key() + Frontend.User.go_to_account() + Wait.id(user_content['email']) + actualFullName = Get.value_by_name( + Constants.Dashboard.Avatar.Account.FullName.NAME) + Helper.internal_assert(user_content['full_name'], actualFullName) + actualSSHkey = Get.value_by_name( + Constants.Dashboard.Avatar.Account.SSHKey.NAME) + Helper.internal_assert(sshKey, actualSSHkey) + Click.id(Constants.Dashboard.Statuses.ID) + # VALIDATION FOR CONFIRMED BY ENG. LEAD + engLeadEmail = DB.User.select_el_email(vfName) + engagement_id = DB.General.select_where( + "engagement_id", "ice_vf", "name", vfName, 1) + engagement_manual_id = DB.General.select_where( + "engagement_manual_id", "ice_engagement", "uuid", engagement_id, 1) + myVfName = engagement_manual_id + ": " + vfName + actualVfNameid = "clickable-" + myVfName + Click.id(actualVfNameid) + Click.id("overview-" + myVfName) + Click.css("span.engagement_detail_menu_name") + Click.xpath("//span[2]/multiselect/div/button") + Click.link_text("Completed") + elFullName = DB.General.select_where( + "full_name", "ice_user_profile", "email", engLeadEmail, 1) + idNs = elFullName + "_Completed" + actualConfirmBy = str(Get.by_id(idNs)) + expectedConfirmBy = "System Next Step Completed: " + Helper.internal_assert(expectedConfirmBy, actualConfirmBy) + + @exception() + def test_current_status(self): + user_content = API.VirtualFunction.create_engagement( + wait_for_gitlab=False) + vfName = user_content['vfName'] + Frontend.User.login( + user_content['email'], Constants.Default.Password.TEXT) # new + Frontend.Overview.click_on_vf(user_content) + Frontend.User.go_to_account() + Wait.id(user_content['email']) + actualFullName = Get.value_by_name("fullname") + Helper.internal_assert(user_content['full_name'], actualFullName) + Click.id(Constants.Dashboard.Statuses.ID) + Frontend.Overview.click_on_vf(user_content) + Helper.internal_assert( + "Current Status", Get.by_css(Constants.Dashboard.Overview.Status.Header.ID)) + Wait.text_by_id(Constants.Dashboard.Overview.Status.Description.ID, + "No status update has been provided yet.") + Click.id(Constants.Dashboard.Avatar.ID) + Click.link_text("Logout") + engLeadEmail = DB.User.select_el_email(vfName) + Frontend.User.relogin(engLeadEmail, Constants.Default.Password.TEXT) + Frontend.Overview.click_on_vf(user_content) + Click.css(Constants.Dashboard.Overview.Status.Add.CSS) + Helper.internal_assert( + "Add Status", Get.by_css("h3.modal-title.ng-binding")) + Helper.internal_assert( + "Use the form below to add the current status of the engagement.", Get.by_css("span.ng-binding")) + Click.css("textarea[name=\"description\"]") + Enter.text_by_css( + "textarea[name=\"description\"]", "Add new Status", wait_for_page=True) + Helper.internal_assert( + "Add status", Get.by_id(Constants.Dashboard.DetailedView.VFC.Save_button.ID)) + Click.id( + Constants.Dashboard.DetailedView.VFC.Save_button.ID, wait_for_page=True) + Helper.assertTrue("Last updated" in Get.by_id("status-update-details")) + Wait.text_by_id( + Constants.Dashboard.Overview.Status.Description.ID, "Add new Status") + Wait.css(Constants.Dashboard.Overview.Status.Edit.CSS) + Wait.modal_to_dissappear() + Click.css(Constants.Dashboard.Overview.Status.Edit.CSS) + Helper.internal_assert( + "Current Status", Get.by_css("h3.modal-title.ng-binding")) + Click.css("textarea[name=\"description\"]") + Enter.text_by_css("textarea[name=\"description\"]", "Update Status") + Click.id(Constants.Dashboard.DetailedView.VFC.Save_button.ID) + Wait.modal_to_dissappear() + Wait.text_by_id( + Constants.Dashboard.Overview.Status.Description.ID, "Update Status") + Frontend.User.logout() + Frontend.User.relogin( + user_content['email'], Constants.Default.Password.TEXT) # new + Frontend.Overview.click_on_vf(user_content) + Helper.internal_assert( + "Current Status", Get.by_css(Constants.Dashboard.Overview.Status.Header.ID)) + Wait.text_by_id( + Constants.Dashboard.Overview.Status.Description.ID, "Update Status") + + @exception() + def test_XSS_script(self): + user_content = API.VirtualFunction.create_engagement( + wait_for_gitlab=False) + validate = API.User.update_account_injec_script(user_content) + assertTrue(validate) + Frontend.User.login( + user_content['email'], Constants.Default.Password.TEXT) + Frontend.User.open_account_form() + script = "" + Enter.text_by_name("fullname", script, wait_for_page=True) + Wait.text_by_css(Constants.SubmitButton.CSS, "Update") + Click.css(Constants.SubmitButton.CSS, wait_for_page=True) + Wait.text_by_css( + Constants.Toast.CSS, "Account was updated successfully!") + + @exception() + def test_add_vf(self): + user_content = API.User.create_new_user_content_login_with_api() + Frontend.User.login( + user_content['email'], Constants.Default.Password.TEXT) + Frontend.Overview.click_on_vf(user_content) + # Wizard + Frontend.Overview.create_and_verify_VF_with_VFversion() diff --git a/tests/uiTests/test_next_step.py b/tests/uiTests/test_next_step.py new file mode 100644 index 0000000..036d466 --- /dev/null +++ b/tests/uiTests/test_next_step.py @@ -0,0 +1,245 @@ + +# ============LICENSE_START========================================== +# org.onap.vvp/test-engine +# =================================================================== +# Copyright © 2017 AT&T Intellectual Property. All rights reserved. +# =================================================================== +# +# Unless otherwise specified, all software contained herein is licensed +# under the Apache License, Version 2.0 (the “License”); +# you may not use this software except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# Unless otherwise specified, all documentation contained herein is licensed +# under the Creative Commons License, Attribution 4.0 Intl. (the “License”); +# you may not use this documentation except in compliance with the License. +# You may obtain a copy of the License at +# +# https://creativecommons.org/licenses/by/4.0/ +# +# Unless required by applicable law or agreed to in writing, documentation +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ============LICENSE_END============================================ +# +# ECOMP is a trademark and service mark of AT&T Intellectual Property. +from iceci.decorator.exception_decor import exception +from services.constants import Constants +from services.frontend.base_actions.click import Click +from services.frontend.base_actions.wait import Wait +from services.frontend.fe_general import FEGeneral +from services.frontend.fe_next_step import FENextStep +from services.frontend.fe_overview import FEOverview +from services.frontend.fe_user import FEUser +from services.helper import Helper +from services.logging_service import LoggingServiceFactory +from services.types import API, DB, Frontend +from tests.uiTests.test_ui_base import TestUiBase + + +logger = LoggingServiceFactory.get_logger() + + +class TestNextStep(TestUiBase): + user_content = None + + @classmethod + def setUpClass(cls): + super(TestNextStep, cls).setUpClass() + + cls.user_content = API.VirtualFunction.create_engagement( + wait_for_gitlab=False) + + @exception() + def test_add_next_step(self): + user_content = API.VirtualFunction.create_engagement( + wait_for_gitlab=False) + Frontend.User.login( + user_content['el_email'], Constants.Default.Password.TEXT) + Frontend.Overview.click_on_vf(user_content) + Frontend.Overview.add_next_step() + + @exception() + def test_add_next_step_via_pr(self): + user_content = API.VirtualFunction.create_engagement( + wait_for_gitlab=False) + Frontend.User.login( + user_content['pr_email'], Constants.Default.Password.TEXT) + Frontend.Overview.click_on_vf(user_content) + Frontend.Overview.add_next_step() + + @exception() + def test_complete_next_steps(self): + user_content = API.VirtualFunction.create_engagement( + wait_for_gitlab=False) + steps_uuids = DB.VirtualFunction.return_expected_steps(user_content['engagement_uuid'], + Constants.EngagementStages.INTAKE, user_content['email']) + Frontend.User.login( + user_content['email'], Constants.Default.Password.TEXT) + Frontend.Overview.click_on_vf(user_content) + for step_uuid in steps_uuids: + Frontend.Overview.complete_next_step_and_wait_for_it_to_disappear( + step_uuid) + Helper.internal_assert(Frontend.Overview.get_list_of_next_steps(), []) + + @exception() + def test_filter_next_steps_by_associated_files(self): + user_content = API.VirtualFunction.create_engagement() + API.GitLab.git_clone_push(user_content) + user_content['session_token'] = "token " + \ + API.User.login_user(user_content['el_email']) + + # Create a checklist in order for the files to be viewed in the Overview. when + # we want to filter next steps by files in the Overview - EM shows us + # files that relate to the VF's CLs) + API.Checklist.create_checklist(user_content) + next_step_uuid = API.VirtualFunction.add_next_step( + user_content, [Constants.Dashboard.Overview.NextSteps.FilterByFileDropDown.FILE0_LINK_TEXT]) + Frontend.User.login( + user_content['el_email'], Constants.Default.Password.TEXT) + Frontend.Overview.click_on_vf(user_content) + Frontend.Overview.next_steps_filter_by_files() + Helper.internal_assert(Frontend.Overview.get_next_step_description(0), + DB.VirtualFunction.select_next_step_description(next_step_uuid)) + + @exception() + def test_filter_next_steps_by_associated_files_via_pr(self): + user_content = API.VirtualFunction.create_engagement() + API.GitLab.git_clone_push(user_content) + user_content['session_token'] = "token " + \ + API.User.login_user(user_content['el_email']) + API.Checklist.create_checklist(user_content) + next_step_uuid = API.VirtualFunction.add_next_step( + user_content, [Constants.Dashboard.Overview.NextSteps.FilterByFileDropDown.FILE0_LINK_TEXT]) + Frontend.User.login( + user_content['pr_email'], Constants.Default.Password.TEXT) + Frontend.Overview.click_on_vf(user_content) + Frontend.Overview.next_steps_filter_by_files() + Helper.internal_assert(Frontend.Overview.get_next_step_description(0), + DB.VirtualFunction.select_next_step_description(next_step_uuid)) + + @exception() + def test_delete_next_step(self): + user_content = API.VirtualFunction.create_engagement( + wait_for_gitlab=False) + Frontend.User.login( + user_content['el_email'], Constants.Default.Password.TEXT) + Frontend.Overview.click_on_vf(user_content) + steps_uuids = DB.VirtualFunction.select_next_steps_uuids_by_stage(user_content['engagement_uuid'], + Constants.EngagementStages.INTAKE) + for idx, step_uuid in enumerate(steps_uuids): + Frontend.Overview.delete_next_step(step_uuid) + logger.debug("Next step deleted! (%s of %s)" % + (idx + 1, len(steps_uuids))) + + @exception() + def test_delete_next_step_via_pr(self): + user_content = API.VirtualFunction.create_engagement( + wait_for_gitlab=False) + Frontend.User.login( + user_content['pr_email'], Constants.Default.Password.TEXT) + Frontend.Overview.click_on_vf(user_content) + steps_uuids = DB.VirtualFunction.select_next_steps_uuids_by_stage(user_content['engagement_uuid'], + Constants.EngagementStages.INTAKE) + for idx, step_uuid in enumerate(steps_uuids): + Frontend.Overview.delete_next_step(step_uuid) + logger.debug("Next step deleted! (%s of %s)" % + (idx + 1, len(steps_uuids))) + + @exception() + def test_next_steps_ordering(self): + user_content = API.VirtualFunction.create_engagement( + wait_for_gitlab=False) + user_content['session_token'] = "token " + \ + API.User.login_user(user_content['email']) + steps_uuids = DB.VirtualFunction.return_expected_steps(user_content['engagement_uuid'], + Constants.EngagementStages.INTAKE, user_content['email']) + Frontend.User.login( + user_content['email'], Constants.Default.Password.TEXT) + Frontend.Overview.click_on_vf(user_content) + Click.id(Constants.Dashboard.Overview.NextSteps.StateDropDown.ID) + Click.link_text( + Constants.Dashboard.Overview.NextSteps.StateDropDown.COMPLETED_LINK_TEXT) + Click.id(Constants.Dashboard.Overview.NextSteps.StateDropDown.ID, + wait_for_page=True) + Frontend.Overview.validate_next_steps_order(steps_uuids) + for idx, step_uuid in enumerate(steps_uuids): + DB.VirtualFunction.update_next_step_position( + step_uuid, len(steps_uuids) - idx) + Frontend.General.refresh() + Click.id(Constants.Dashboard.Overview.NextSteps.StateDropDown.ID, + wait_for_page=True) + Click.link_text( + Constants.Dashboard.Overview.NextSteps.StateDropDown.COMPLETED_LINK_TEXT, wait_for_page=True) + Click.id(Constants.Dashboard.Overview.NextSteps.StateDropDown.ID, + wait_for_page=True) + Frontend.Overview.validate_next_steps_order( + list(reversed(steps_uuids))) + + @exception() + def test_next_step_with_empty_associated_files(self): + Frontend.User.login( + self.user_content['el_email'], Constants.Default.Password.TEXT) + Frontend.Overview.click_on_vf(self.user_content) + Frontend.Overview.validate_empty_associated_files() + + @exception() + def test_next_step_with_associated_files(self): + user_content = API.VirtualFunction.create_engagement() + API.GitLab.git_clone_push(user_content) + user_content['session_token'] = "token " + \ + API.User.login_user(user_content['el_email']) + Wait.page_has_loaded() + cl_content = API.Checklist.create_checklist(user_content) + DB.Checklist.state_changed("name", cl_content['name'], 'review') + new_cl_uuid = DB.Checklist.get_recent_checklist_uuid(cl_content['name'])[ + 0] + API.Checklist.add_checklist_next_step(user_content, new_cl_uuid) + Frontend.User.login( + user_content['pr_email'], Constants.Default.Password.TEXT) + Frontend.Overview.click_on_vf(user_content) + Frontend.Overview.next_steps_filter_by_files() + Frontend.Overview.validate_associated_files( + Constants.Dashboard.Overview.NextSteps.FilterByFileDropDown.FILE0_LINK_TEXT) + + @exception() + def test_all_vf_gitlab_repo_files_can_be_chosen_in_new_ns(self): + newObj, user_content = API.User.create_new_user_content() + user_content['session_token'] = "token " + \ + API.User.login_user(user_content['el_email']) + checklist = API.Checklist.create_checklist(user_content) + DB.Checklist.state_changed("uuid", checklist['uuid'], 'review') + Frontend.User.relogin( + user_content['el_email'], 'iceusers') + eng_id = "clickable-%s: %s" % ( + user_content['engagement_manual_id'], user_content['vfName']) + Frontend.Checklist.go_to_checklist(eng_id, checklist['uuid']) + Frontend.Checklist.get_to_create_new_ns_modal() + files = API.VirtualFunction.get_engagement(user_content)["files"] + FEGeneral.verify_existing_files_in_list( + files, 'associated-files-list') + + @exception() + def test_ns_choose_all_vf_gitlab_repo_files_via_select_all(self): + self.user_content['session_token'] = "token " + \ + API.User.login_user(self.user_content['el_email']) + API.GitLab.git_clone_push(self.user_content) + cl_content = API.Checklist.create_checklist(self.user_content) + FEUser.login(self.user_content['el_email'], + Constants.Default.Password.TEXT) + FEOverview.click_on_vf(self.user_content) + Frontend.Checklist.get_to_create_new_ns_modal_via_overview() + FENextStep.check_select_deselect_all_files() diff --git a/tests/uiTests/test_notification_for_new_user.py b/tests/uiTests/test_notification_for_new_user.py new file mode 100644 index 0000000..720caab --- /dev/null +++ b/tests/uiTests/test_notification_for_new_user.py @@ -0,0 +1,108 @@ + +# ============LICENSE_START========================================== +# org.onap.vvp/test-engine +# =================================================================== +# Copyright © 2017 AT&T Intellectual Property. All rights reserved. +# =================================================================== +# +# Unless otherwise specified, all software contained herein is licensed +# under the Apache License, Version 2.0 (the “License”); +# you may not use this software except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# Unless otherwise specified, all documentation contained herein is licensed +# under the Creative Commons License, Attribution 4.0 Intl. (the “License”); +# you may not use this documentation except in compliance with the License. +# You may obtain a copy of the License at +# +# https://creativecommons.org/licenses/by/4.0/ +# +# Unless required by applicable law or agreed to in writing, documentation +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ============LICENSE_END============================================ +# +# ECOMP is a trademark and service mark of AT&T Intellectual Property. +import logging + +from django.conf import settings + +from iceci.decorator.exception_decor import exception +from services.constants import Constants +from services.logging_service import LoggingServiceFactory +from services.session import session +from services.types import API, DB, Frontend +from tests.uiTests.test_ui_base import TestUiBase + + +logger = LoggingServiceFactory.get_logger() + + +class TestNotificationForNewUser(TestUiBase): + user_content = None + + @classmethod + def setUpClass(cls): + super(TestNotificationForNewUser, cls).setUpClass() + + cls.user_content = API.VirtualFunction.create_engagement( + wait_for_gitlab=False) + + @exception() + def test_notification_page_sanity(self): + Frontend.User.login( + self.user_content['email'], Constants.Default.Password.TEXT) + logger.debug("Go to notifications page") + Frontend.User.go_to_notifications() + logger.debug("Remove one notification") + notificationIDs = DB.User.get_notification_id_by_email( + self.user_content['email']) + Frontend.User.delete_notification(notificationIDs[0]) + + @exception() + def test_validate_notifications(self): + user_content = API.VirtualFunction.create_engagement() + user_content['session_token'] = "token " + \ + API.User.login_user(user_content['el_email']) + Frontend.User.relogin( + user_content['email'], Constants.Default.Password.TEXT) + Frontend.User.go_to_notifications() + notificationIDs = DB.User.get_notification_id_by_email( + user_content['email']) + notification_list = [user_content['full_name'] + " joined " + user_content['vfName'], + user_content['el_name'] + + " joined " + user_content['vfName'], + user_content['pr_name'] + " joined " + user_content['vfName']] + Frontend.User.validate_notifications( + notificationIDs, notification_list) + + @exception() + def test_num_of_notifications_for_user(self): + Frontend.User.login( + self.user_content['el_email'], Constants.Default.Password.TEXT) + notifications_num = DB.User.get_not_seen_notifications_number_by_email( + self.user_content['el_email']) + Frontend.User.compare_notifications_count_for_user(notifications_num) + + @exception() + def test_zero_notifications_for_user(self): + Frontend.User.login( + self.user_content['pr_email'], Constants.Default.Password.TEXT) + Frontend.User.go_to_notifications() + notifications_num = DB.User.get_not_seen_notifications_number_by_email( + self.user_content['pr_email'], is_negative=True) + assert(notifications_num == "0") + Frontend.User.check_notification_number_is_not_presented() diff --git a/tests/uiTests/test_notification_for_new_user.pyc b/tests/uiTests/test_notification_for_new_user.pyc new file mode 100755 index 0000000..189ed72 Binary files /dev/null and b/tests/uiTests/test_notification_for_new_user.pyc differ diff --git a/tests/uiTests/test_overview.py b/tests/uiTests/test_overview.py new file mode 100644 index 0000000..2045acc --- /dev/null +++ b/tests/uiTests/test_overview.py @@ -0,0 +1,68 @@ + +# ============LICENSE_START========================================== +# org.onap.vvp/test-engine +# =================================================================== +# Copyright © 2017 AT&T Intellectual Property. All rights reserved. +# =================================================================== +# +# Unless otherwise specified, all software contained herein is licensed +# under the Apache License, Version 2.0 (the “License”); +# you may not use this software except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# Unless otherwise specified, all documentation contained herein is licensed +# under the Creative Commons License, Attribution 4.0 Intl. (the “License”); +# you may not use this documentation except in compliance with the License. +# You may obtain a copy of the License at +# +# https://creativecommons.org/licenses/by/4.0/ +# +# Unless required by applicable law or agreed to in writing, documentation +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ============LICENSE_END============================================ +# +# ECOMP is a trademark and service mark of AT&T Intellectual Property. +''' +Created on 25 Jul 2017 +''' +from iceci.decorator.exception_decor import exception +from services.constants import Constants +from services.logging_service import LoggingServiceFactory +from services.types import API, Frontend, DB +from tests.uiTests.test_ui_base import TestUiBase + + +logger = LoggingServiceFactory.get_logger() + + +class TestOverview(TestUiBase): + + @exception() + def test_engagement_validation_details_update_when_cl_closed(self): + user_content = API.VirtualFunction.create_engagement() + API.GitLab.git_clone_push(user_content) + cl_uuid = DB.General.select_where_and('uuid', Constants.DBConstants.IceTables.CHECKLIST, 'engagement_id', user_content['engagement_uuid'], + 'name', Constants.Dashboard.Checklist.ChecklistDefaultNames.AIC_INSTANTIATION, 1) + vf_staff_emails = [user_content['el_email'], user_content[ + 'pr_email'], Constants.Users.Admin.EMAIL] + API.Checklist.move_cl_to_closed(cl_uuid, vf_staff_emails) + Frontend.User.login( + user_content['el_email'], Constants.Default.Password.TEXT) + Frontend.Overview.click_on_vf(user_content) + Frontend.Overview.change_engagement_stage( + Constants.EngagementStages.ACTIVE) + Frontend.Overview.verify_validation_dates() diff --git a/tests/uiTests/test_portal_homepage.py b/tests/uiTests/test_portal_homepage.py new file mode 100644 index 0000000..19846c8 --- /dev/null +++ b/tests/uiTests/test_portal_homepage.py @@ -0,0 +1,55 @@ + +# ============LICENSE_START========================================== +# org.onap.vvp/test-engine +# =================================================================== +# Copyright © 2017 AT&T Intellectual Property. All rights reserved. +# =================================================================== +# +# Unless otherwise specified, all software contained herein is licensed +# under the Apache License, Version 2.0 (the “License”); +# you may not use this software except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# Unless otherwise specified, all documentation contained herein is licensed +# under the Creative Commons License, Attribution 4.0 Intl. (the “License”); +# you may not use this documentation except in compliance with the License. +# You may obtain a copy of the License at +# +# https://creativecommons.org/licenses/by/4.0/ +# +# Unless required by applicable law or agreed to in writing, documentation +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ============LICENSE_END============================================ +# +# ECOMP is a trademark and service mark of AT&T Intellectual Property. +from django.conf import settings + +from iceci.decorator.exception_decor import exception +from services.logging_service import LoggingServiceFactory +from services.types import Frontend +from tests.uiTests.test_ui_base import TestUiBase + + +logger = LoggingServiceFactory.get_logger() + +class TestPortalHomepage(TestUiBase): + @exception() + def test_homepage(self): + ''' Portal home page sanity, click on links, varify buttons and headlines. ''' + Frontend.General.re_open(settings.ICE_PORTAL_URL) + Frontend.General.verify_home_elements() + Frontend.General.go_to_signup_from_homepage() diff --git a/tests/uiTests/test_progress_bar.py b/tests/uiTests/test_progress_bar.py new file mode 100644 index 0000000..bb5fa21 --- /dev/null +++ b/tests/uiTests/test_progress_bar.py @@ -0,0 +1,96 @@ + +# ============LICENSE_START========================================== +# org.onap.vvp/test-engine +# =================================================================== +# Copyright © 2017 AT&T Intellectual Property. All rights reserved. +# =================================================================== +# +# Unless otherwise specified, all software contained herein is licensed +# under the Apache License, Version 2.0 (the “License”); +# you may not use this software except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# Unless otherwise specified, all documentation contained herein is licensed +# under the Creative Commons License, Attribution 4.0 Intl. (the “License”); +# you may not use this documentation except in compliance with the License. +# You may obtain a copy of the License at +# +# https://creativecommons.org/licenses/by/4.0/ +# +# Unless required by applicable law or agreed to in writing, documentation +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ============LICENSE_END============================================ +# +# ECOMP is a trademark and service mark of AT&T Intellectual Property. +from iceci.decorator.exception_decor import exception +from services.constants import Constants +from services.logging_service import LoggingServiceFactory +from services.types import API, Frontend +from tests.uiTests.test_ui_base import TestUiBase + + +logger = LoggingServiceFactory.get_logger() + + +class TestProgressBar(TestUiBase): + user_content = None + + @exception() + def test_progress_bar_ui(self): + user_content = API.VirtualFunction.create_engagement( + wait_for_gitlab=False) + Frontend.User.login( + user_content['el_email'], Constants.Default.Password.TEXT) + logger.debug("Validate and check progress with engagement lead") + Frontend.Overview.click_on_vf(user_content) + Frontend.Overview.change_engagement_stage( + Constants.EngagementStages.ACTIVE) + Frontend.Overview.check_progress( + Constants.Dashboard.Overview.Progress.Percent.TEXT) + Frontend.Overview.set_progress( + Constants.Dashboard.Overview.Progress.Change.NUMBER) + Frontend.Overview.check_progress( + Constants.Dashboard.Overview.Progress.Change.TEXT) + logger.debug("Validate progress with standard user") + Frontend.User.relogin( + user_content['email'], Constants.Default.Password.TEXT) + Frontend.Overview.click_on_vf(user_content) + Frontend.Overview.check_progress( + Constants.Dashboard.Overview.Progress.Change.TEXT) + + @exception() + def test_vnf_version_with_value_appears_in_overview_progress_bar(self): + user_content = API.VirtualFunction.create_engagement( + wait_for_gitlab=False) + Frontend.User.login( + user_content['el_email'], Constants.Default.Password.TEXT) + Frontend.Overview.click_on_vf(user_content) + Frontend.Overview.change_engagement_stage( + Constants.EngagementStages.ACTIVE) + Frontend.Overview.check_vnf_version(user_content['vnf_version']) + + @exception() + def test_vnf_version_with_value_appears_in_dashboard_progress_bar(self): + user_content = API.VirtualFunction.create_engagement( + wait_for_gitlab=False) + Frontend.User.login( + user_content['el_email'], Constants.Default.Password.TEXT) + Frontend.Overview.click_on_vf(user_content) + Frontend.Overview.change_engagement_stage( + Constants.EngagementStages.ACTIVE) + Frontend.Dashboard.search_by_vf(user_content) + Frontend.Dashboard.check_vnf_version(user_content) diff --git a/tests/uiTests/test_progress_bar.pyc b/tests/uiTests/test_progress_bar.pyc new file mode 100755 index 0000000..be7ff94 Binary files /dev/null and b/tests/uiTests/test_progress_bar.pyc differ diff --git a/tests/uiTests/test_rados_perms.py b/tests/uiTests/test_rados_perms.py new file mode 100644 index 0000000..6143edc --- /dev/null +++ b/tests/uiTests/test_rados_perms.py @@ -0,0 +1,104 @@ + +# ============LICENSE_START========================================== +# org.onap.vvp/test-engine +# =================================================================== +# Copyright © 2017 AT&T Intellectual Property. All rights reserved. +# =================================================================== +# +# Unless otherwise specified, all software contained herein is licensed +# under the Apache License, Version 2.0 (the “License”); +# you may not use this software except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# Unless otherwise specified, all documentation contained herein is licensed +# under the Creative Commons License, Attribution 4.0 Intl. (the “License”); +# you may not use this documentation except in compliance with the License. +# You may obtain a copy of the License at +# +# https://creativecommons.org/licenses/by/4.0/ +# +# Unless required by applicable law or agreed to in writing, documentation +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ============LICENSE_END============================================ +# +# ECOMP is a trademark and service mark of AT&T Intellectual Property. +from wheel.signatures import assertTrue + +from iceci.decorator.exception_decor import exception +from services.constants import Constants +from services.logging_service import LoggingServiceFactory +from services.types import API +from tests.uiTests.test_ui_base import TestUiBase + +logger = LoggingServiceFactory.get_logger() + + +class TestRadosPermissions(TestUiBase): + + def create_bucket_and_validate_users(self): + user_content = API.VirtualFunction.create_engagement( + wait_for_gitlab=True) + + print("***********STAGE = ",user_content['vfStage']) + API.VirtualFunction.set_eng_stage(user_content, Constants.EngagementStages.ACTIVE) + bucket_id = user_content['engagement_manual_id'] + "_" + user_content['vfName'].lower() + bucket = API.Rados.get_bucket(bucket_id) + assertTrue(API.Rados.is_bucket_ready(bucket_id)) + assertTrue(bucket != "None") + #validate users added to bucket + grants = API.Rados.get_bucket_grants(bucket_id) + count = 0 + for g in grants: + if g.id == user_content['full_name']: + count = +1 + + assertTrue(count > 0) + return bucket, user_content + + @exception() + def test_permissions_stage_validated(self): + bucket, user_content = self.create_bucket_and_validate_users() + API.VirtualFunction.set_eng_stage(user_content, Constants.EngagementStages.VALIDATED) + bucket_id = user_content['engagement_manual_id'] + "_" + user_content['vfName'].lower() + assertTrue(API.Rados.users_of_bucket_ready_after_complete(bucket_id, user_content['full_name'])) + bucket = API.Rados.get_bucket(bucket_id) + assertTrue(API.Rados.is_bucket_ready(bucket_id)) + assertTrue(bucket != "None") + assertTrue(API.Rados.is_bucket_ready(bucket_id)) + bucket = API.Rados.get_bucket(bucket_id) + grants = API.Rados.get_bucket_grants(bucket_id) + print("\nBucket:", bucket) + print("\nBucket Type:", type(bucket)) + print("\nGrants:", grants) + print("\nGrants Type:", type(grants)) + print("done") + + @exception() + def test_permissions_stage_completed(self): + bucket, user_content = self.create_bucket_and_validate_users() + API.VirtualFunction.set_eng_stage( + user_content, Constants.EngagementStages.COMPLETED) + bucket_id = user_content['engagement_manual_id'] + "_" + user_content['vfName'].lower() + assertTrue(API.Rados.users_of_bucket_ready_after_complete(bucket_id, user_content['full_name'])) + assertTrue(API.Rados.is_bucket_ready(bucket_id)) + bucket = API.Rados.get_bucket(bucket_id) + grants = API.Rados.get_bucket_grants(bucket_id) + print("\nBucket:", bucket) + print("\nBucket Type:", type(bucket)) + print("\nGrants:", grants) + print("\nGrants Type:", type(grants)) + print("done") diff --git a/tests/uiTests/test_remove_user_from_eng.py b/tests/uiTests/test_remove_user_from_eng.py new file mode 100644 index 0000000..dd76d31 --- /dev/null +++ b/tests/uiTests/test_remove_user_from_eng.py @@ -0,0 +1,116 @@ + +# ============LICENSE_START========================================== +# org.onap.vvp/test-engine +# =================================================================== +# Copyright © 2017 AT&T Intellectual Property. All rights reserved. +# =================================================================== +# +# Unless otherwise specified, all software contained herein is licensed +# under the Apache License, Version 2.0 (the “License”); +# you may not use this software except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# Unless otherwise specified, all documentation contained herein is licensed +# under the Creative Commons License, Attribution 4.0 Intl. (the “License”); +# you may not use this documentation except in compliance with the License. +# You may obtain a copy of the License at +# +# https://creativecommons.org/licenses/by/4.0/ +# +# Unless required by applicable law or agreed to in writing, documentation +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ============LICENSE_END============================================ +# +# ECOMP is a trademark and service mark of AT&T Intellectual Property. +from iceci.decorator.exception_decor import exception +from services.constants import Constants, ServiceProvider +from services.logging_service import LoggingServiceFactory +from services.types import API, Frontend +from tests.uiTests.test_ui_base import TestUiBase + + +logger = LoggingServiceFactory.get_logger() + + +class TestRemoveUserFromEng(TestUiBase): + user_content = None + + @classmethod + def setUpClass(cls): + super(TestRemoveUserFromEng, cls).setUpClass() + + cls.user_content = API.VirtualFunction.create_engagement(wait_for_gitlab=False) + + @exception() + def test_remove_user_with_admin(self): + second_user_email, invite_token, invite_url = API.VirtualFunction.invite_team_member(self.user_content) + invited_user = API.User.signup_invited_user(ServiceProvider.MainServiceProvider, second_user_email, invite_token, invite_url, + self.user_content) + Frontend.User.login(Constants.Users.Admin.EMAIL, Constants.Default.Password.TEXT) + Frontend.Dashboard.statuses_search_vf(self.user_content['engagement_manual_id'], self.user_content['vfName']) + Frontend.Overview.remove_user_from_eng_team(invited_user["full_name"]) + + + @exception() + def test_remove_user_with_reviewer(self): + second_user_email, invite_token, invite_url = API.VirtualFunction.invite_team_member(self.user_content) + invited_user = API.User.signup_invited_user(ServiceProvider.MainServiceProvider, second_user_email, invite_token, invite_url, + self.user_content) + Frontend.User.login(self.user_content['el_email'], Constants.Default.Password.TEXT) + Frontend.Overview.click_on_vf(self.user_content) + Frontend.Overview.remove_user_from_eng_team(invited_user["full_name"]) + + + @exception() + def test_remove_user_with_peer_reviewer(self): + second_user_email, invite_token, invite_url = API.VirtualFunction.invite_team_member(self.user_content) + invited_user = API.User.signup_invited_user(ServiceProvider.MainServiceProvider, second_user_email, invite_token, invite_url, + self.user_content) + Frontend.User.login(self.user_content['pr_email'], Constants.Default.Password.TEXT) + Frontend.Overview.click_on_vf(self.user_content) + Frontend.Overview.remove_user_from_eng_team(invited_user["full_name"]) + + + @exception() + def test_negative_remove_reviewer_from_eng(self): + Frontend.User.login(self.user_content["pr_email"], Constants.Default.Password.TEXT) + Frontend.Overview.click_on_vf(self.user_content) + Frontend.Overview.remove_user_from_eng_team(self.user_content["el_name"], True) + + + @exception() + def test_negative_remove_peer_reviewer_from_eng(self): + Frontend.User.login(self.user_content['el_email'], Constants.Default.Password.TEXT) + Frontend.Overview.click_on_vf(self.user_content) + Frontend.Overview.remove_user_from_eng_team(self.user_content["pr_name"], True) + + + @exception() + def test_negative_remove_creator_from_eng(self): + Frontend.User.login(self.user_content['el_email'], Constants.Default.Password.TEXT) + Frontend.Overview.click_on_vf(self.user_content) + Frontend.Overview.remove_user_from_eng_team(self.user_content["full_name"], True) + + + @exception() + def test_negative_remove_contact_user_from_eng(self): + second_user_email, invite_token, invite_url = API.VirtualFunction.add_contact(self.user_content) + invited_user = API.User.signup_invited_user(ServiceProvider.MainServiceProvider, second_user_email, invite_token, invite_url, + self.user_content, "true", True) + Frontend.User.login(second_user_email, Constants.Default.Password.TEXT) + Frontend.Overview.click_on_vf(self.user_content) + Frontend.Overview.remove_user_from_eng_team(invited_user["full_name"], True) diff --git a/tests/uiTests/test_reset_password.py b/tests/uiTests/test_reset_password.py new file mode 100644 index 0000000..abdaa69 --- /dev/null +++ b/tests/uiTests/test_reset_password.py @@ -0,0 +1,77 @@ + +# ============LICENSE_START========================================== +# org.onap.vvp/test-engine +# =================================================================== +# Copyright © 2017 AT&T Intellectual Property. All rights reserved. +# =================================================================== +# +# Unless otherwise specified, all software contained herein is licensed +# under the Apache License, Version 2.0 (the “License”); +# you may not use this software except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# Unless otherwise specified, all documentation contained herein is licensed +# under the Creative Commons License, Attribution 4.0 Intl. (the “License”); +# you may not use this documentation except in compliance with the License. +# You may obtain a copy of the License at +# +# https://creativecommons.org/licenses/by/4.0/ +# +# Unless required by applicable law or agreed to in writing, documentation +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ============LICENSE_END============================================ +# +# ECOMP is a trademark and service mark of AT&T Intellectual Property. +from iceci.decorator.exception_decor import exception +from services.constants import Constants +from services.helper import Helper +from services.logging_service import LoggingServiceFactory +from services.types import API, Frontend, DB +from tests.uiTests.test_ui_base import TestUiBase + + +logger = LoggingServiceFactory.get_logger() + + +class TestResetPassword(TestUiBase): + user_content = None + + @classmethod + def setUpClass(cls): + super(TestResetPassword, cls).setUpClass() + + cls.user_content = API.VirtualFunction.create_engagement(wait_for_gitlab=False) + + @exception() + def test_reset_password(self): + Frontend.General.send_reset_password(self.user_content['email']) + DB.User.set_new_temp_password(self.user_content['email']) + resetPasswURL = Helper.get_reset_passw_url(self.user_content['email']) + Frontend.General.re_open(resetPasswURL) + Frontend.User.login(self.user_content['email'], Constants.Default.Password.TEXT, + Constants.UpdatePassword.Title.CSS, "css") + logger.debug("\nReset URL: %s \nTemp Password: %s \nUser Email: %s" % (resetPasswURL, + Constants.Default.Password.TEXT, self.user_content['email'])) + Frontend.User.reset_password() + logger.debug("Logout and verify new password works") + Frontend.User.logout() + logger.debug("Login with updated password") + Frontend.User.login(self.user_content['email'], Constants.Default.Password.NewPass.TEXT) + Frontend.User.logout() + logger.debug("Logout and change password back to 'iceusers'") + DB.User.set_password_to_default(self.user_content['email']) + Frontend.User.login(self.user_content['email'], Constants.Default.Password.TEXT) diff --git a/tests/uiTests/test_reset_password.pyc b/tests/uiTests/test_reset_password.pyc new file mode 100755 index 0000000..13789bb Binary files /dev/null and b/tests/uiTests/test_reset_password.pyc differ diff --git a/tests/uiTests/test_rgwa_credentials.py b/tests/uiTests/test_rgwa_credentials.py new file mode 100644 index 0000000..334b818 --- /dev/null +++ b/tests/uiTests/test_rgwa_credentials.py @@ -0,0 +1,80 @@ + +# ============LICENSE_START========================================== +# org.onap.vvp/test-engine +# =================================================================== +# Copyright © 2017 AT&T Intellectual Property. All rights reserved. +# =================================================================== +# +# Unless otherwise specified, all software contained herein is licensed +# under the Apache License, Version 2.0 (the “License”); +# you may not use this software except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# Unless otherwise specified, all documentation contained herein is licensed +# under the Creative Commons License, Attribution 4.0 Intl. (the “License”); +# you may not use this documentation except in compliance with the License. +# You may obtain a copy of the License at +# +# https://creativecommons.org/licenses/by/4.0/ +# +# Unless required by applicable law or agreed to in writing, documentation +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ============LICENSE_END============================================ +# +# ECOMP is a trademark and service mark of AT&T Intellectual Property. +from iceci.decorator.exception_decor import exception +from services.constants import Constants +from services.logging_service import LoggingServiceFactory +from services.types import API, DB, Frontend +from tests.uiTests.test_ui_base import TestUiBase +from utils.cryptography import CryptographyText + + +logger = LoggingServiceFactory.get_logger() + +class TestRGWACredentials(TestUiBase): + user_content = None + access_key = None + access_secret = None + + @classmethod + def setUpClass(cls): + super(TestRGWACredentials, cls).setUpClass() + cls.user_content = API.User.create_new_user(activate=True) + cls.access_key = DB.User.get_access_key(cls.user_content['uuid']) + cls.access_secret = DB.User.get_access_secret(cls.user_content['uuid']) + + def setUp(self): + super(TestRGWACredentials, self).setUp() + Frontend.User.login( + self.user_content['email'], Constants.Default.Password.TEXT) + + @exception() + def test_access_key(self): + Frontend.User.go_to_account() + Frontend.User.check_rgwa_access_key(self.access_key) + + @exception() + def test_access_secret(self): + Frontend.User.go_to_account() + access_secret = CryptographyText.decrypt(self.access_secret) + Frontend.User.check_rgwa_access_secret(access_secret) + + @exception() + def test_access_secret_not_presented(self): + Frontend.User.go_to_account() + Frontend.User.check_rgwa_access_secret_not_presented() diff --git a/tests/uiTests/test_sanity.py b/tests/uiTests/test_sanity.py new file mode 100644 index 0000000..8399e12 --- /dev/null +++ b/tests/uiTests/test_sanity.py @@ -0,0 +1,173 @@ + +# ============LICENSE_START========================================== +# org.onap.vvp/test-engine +# =================================================================== +# Copyright © 2017 AT&T Intellectual Property. All rights reserved. +# =================================================================== +# +# Unless otherwise specified, all software contained herein is licensed +# under the Apache License, Version 2.0 (the “License”); +# you may not use this software except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# Unless otherwise specified, all documentation contained herein is licensed +# under the Creative Commons License, Attribution 4.0 Intl. (the “License”); +# you may not use this documentation except in compliance with the License. +# You may obtain a copy of the License at +# +# https://creativecommons.org/licenses/by/4.0/ +# +# Unless required by applicable law or agreed to in writing, documentation +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ============LICENSE_END============================================ +# +# ECOMP is a trademark and service mark of AT&T Intellectual Property. +from iceci.decorator.exception_decor import exception +from services.constants import Constants +from services.frontend.base_actions.click import Click +from services.frontend.base_actions.get import Get +from services.frontend.base_actions.wait import Wait +from services.helper import Helper +from services.logging_service import LoggingServiceFactory +from services.types import Frontend, DB, API +from tests.uiTests.test_ui_base import TestUiBase + + +logger = LoggingServiceFactory.get_logger() + + +class TestSanity(TestUiBase): + + user_content = None + user_content_api = None + + @classmethod + def setUpClass(cls): + super(TestSanity, cls).setUpClass() + + cls.user_content_api = API.User.create_new_user_content_login_with_api() + cls.user_content = API.VirtualFunction.create_engagement() + + @exception() + def test_e2e_checklist_add_next_step(self): + newObj, user_content = API.User.create_new_user_content() + newObjWithChecklist = Frontend.Checklist.create_new_checklist(newObj) + checklistUuid = newObjWithChecklist[0] + engLeadEmail = newObjWithChecklist[1] + engagement_manual_id = newObjWithChecklist[2] + actualVfNameid = newObjWithChecklist[3] + checklistName = newObjWithChecklist[5] + DB.Checklist.state_changed("uuid", checklistUuid, 'review') + DB.Checklist.update_decisions(checklistUuid, checklistName) + + Frontend.User.relogin( + engLeadEmail, Constants.Default.Password.TEXT, engagement_manual_id) + Frontend.Checklist.click_on_checklist(user_content, checklistName) + Frontend.Checklist.validate_reject_is_enabled() + Frontend.Checklist.review_state_actions_and_validations( + checklistName, user_content['vfName'], "review") + + Frontend.Checklist.cl_to_next_stage(actualVfNameid) + engPreeRiviewerLeadEmail = DB.Checklist.get_pr_email(checklistUuid) + Frontend.User.relogin(engPreeRiviewerLeadEmail, + Constants.Default.Password.TEXT) + Frontend.Checklist.click_on_checklist(user_content, checklistName) + Frontend.Checklist.validate_reject_is_enabled() + Frontend.Checklist.review_state_actions_and_validations( + checklistName, user_content['vfName'], "PEER") + + Frontend.Checklist.cl_to_next_stage(actualVfNameid) + engPreeRiviewerLeadEmail = DB.Checklist.get_admin_email(checklistUuid) + Frontend.User.relogin(engPreeRiviewerLeadEmail, + Constants.Default.Password.TEXT) + Frontend.Checklist.search_by_vfname_for_not_local(user_content) + Frontend.Checklist.click_on_checklist(user_content, checklistName) + Frontend.Checklist.validate_reject_is_enabled() + Frontend.Checklist.approval_state_actions_and_validations( + checklistName, newObj, "APPROVAL") + Frontend.Checklist.add_next_step(checklistName, newObj) + Frontend.Overview.click_on_vf(user_content) + + @exception() + def test_admin_set_stage(self): + user_content = API.VirtualFunction.create_engagement( + wait_for_gitlab=False) + stages = [Constants.EngagementStages.INTAKE, Constants.EngagementStages.ACTIVE, + Constants.EngagementStages.VALIDATED, Constants.EngagementStages.COMPLETED] + Frontend.User.login( + Constants.Users.Admin.EMAIL, Constants.Default.Password.TEXT) + Frontend.Dashboard.statuses_search_vf( + user_content['engagement_manual_id'], user_content['vfName']) + for idx, stage in enumerate(stages[:-1]): + next_stage = stages[(idx + 1) % len(stages)] + Frontend.Overview.check_stage_next_steps( + stage, user_content['engagement_uuid']) + Frontend.Overview.change_engagement_stage(next_stage) + + @exception() + def test_invite_new_user(self): + """ + Name: + test_invite_new_user + Steps: + Create new APIUser via SignUp request-->Login with This One--> build "activationUrl"--> + Validation of successful activate--> + close Wizard --> Logout-->login-->Open Wizard--> fill all fields in all Tab's(4)--> + build inviteURL from email--> reopen browser with inviteURL--> + Validate fields filled's in SignUp form + """ + user_content = API.User.create_new_user() + # Fetch one user ID. + uuid = DB.General.select_where_email( + "uuid", "ice_user_profile", user_content['email']) + Frontend.User.activate_and_login( + user_content['email'], Constants.Default.Password.TEXT) + Wait.text_by_id( + Constants.Toast.ID, Constants.Dashboard.ActivateMsg.Success.TEXT) + Click.id(Constants.Dashboard.Wizard.CloseButton.ID) + Wait.modal_to_dissappear() + Frontend.User.logout() + Frontend.User.login( + user_content['email'], Constants.Default.Password.TEXT) + Wait.text_by_css( + Constants.Dashboard.LeftPanel.Title.CSS, Constants.Dashboard.LeftPanel.Title.TEXT) + logger.debug("click_on on + Dashboard") + Click.id(Constants.Dashboard.LeftPanel.AddEngagement.ID) + # Wizard + vfName = Frontend.Wizard.add_vf() + vendor_contact = Frontend.Wizard.add_vendor_contact() + inviteEmail = Helper.rand_invite_email() + Frontend.Wizard.invite_team_members(inviteEmail) + Frontend.Wizard.add_ssh_key() + enguuid = DB.General.select_where("uuid", "ice_vf", "name", vfName, 1) + inviterURL = Constants.Default.InviteURL.Signup.TEXT + \ + enguuid + "&inviter_uuid=" + uuid + "&email=" + inviteEmail + Frontend.General.re_open(inviterURL) + actualInvitedEmail = Get.value_by_name("email") + Helper.internal_assert(inviteEmail, actualInvitedEmail) + signUpURLforContact = DB.User.get_contact_signup_url(enguuid, uuid, vendor_contact["email"], + vendor_contact["full_name"], vendor_contact["phone"], vendor_contact["company"]) + Frontend.General.re_open(signUpURLforContact) + + actualInvitedEmail = Get.value_by_name(Constants.Signup.Email.NAME) + Helper.internal_assert(vendor_contact["email"], actualInvitedEmail) + Helper.internal_assert( + "+" + vendor_contact["phone"], Get.value_by_name(Constants.Signup.Phone.NAME)) + Helper.internal_assert( + vendor_contact["full_name"], Get.value_by_name(Constants.Signup.FullName.NAME)) + Helper.internal_assert( + vendor_contact["company"], Get.value_by_name(Constants.Signup.Company.NAME)) diff --git a/tests/uiTests/test_set_stage.py b/tests/uiTests/test_set_stage.py new file mode 100644 index 0000000..b9dc7de --- /dev/null +++ b/tests/uiTests/test_set_stage.py @@ -0,0 +1,115 @@ + +# ============LICENSE_START========================================== +# org.onap.vvp/test-engine +# =================================================================== +# Copyright © 2017 AT&T Intellectual Property. All rights reserved. +# =================================================================== +# +# Unless otherwise specified, all software contained herein is licensed +# under the Apache License, Version 2.0 (the “License”); +# you may not use this software except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# Unless otherwise specified, all documentation contained herein is licensed +# under the Creative Commons License, Attribution 4.0 Intl. (the “License”); +# you may not use this documentation except in compliance with the License. +# You may obtain a copy of the License at +# +# https://creativecommons.org/licenses/by/4.0/ +# +# Unless required by applicable law or agreed to in writing, documentation +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ============LICENSE_END============================================ +# +# ECOMP is a trademark and service mark of AT&T Intellectual Property. +from iceci.decorator.exception_decor import exception +from services.constants import Constants +from services.logging_service import LoggingServiceFactory +from services.types import API, Frontend +from tests.uiTests.test_ui_base import TestUiBase + + +logger = LoggingServiceFactory.get_logger() + + +class TestSetStage(TestUiBase): + @exception() + def test_set_eng_stages(self): + user_content = API.VirtualFunction.create_engagement(wait_for_gitlab=False) + Frontend.User.login(user_content['el_email'], Constants.Default.Password.TEXT) + stages = [Constants.EngagementStages.INTAKE, Constants.EngagementStages.ACTIVE, Constants.EngagementStages.VALIDATED, + Constants.EngagementStages.COMPLETED] + Frontend.Overview.click_on_vf(user_content) + for idx, stage in enumerate(stages[:-1]): + next_stage = stages[(idx + 1) % len(stages)] + Frontend.Overview.check_stage_next_steps(stage, user_content['engagement_uuid']) + Frontend.Overview.change_engagement_stage(next_stage) + Frontend.General.refresh() + if Frontend.Overview.check_stage_notifications(next_stage) is False: + raise Exception("Activity log for set stage wasn't found for stage %s" % next_stage) + + @exception() + def test_set_eng_stages_via_pr_reviewer(self): + user_content = API.VirtualFunction.create_engagement(wait_for_gitlab=False) + Frontend.User.login(user_content['pr_email'], Constants.Default.Password.TEXT) + stages = [Constants.EngagementStages.INTAKE, Constants.EngagementStages.ACTIVE, Constants.EngagementStages.VALIDATED, + Constants.EngagementStages.COMPLETED] + Frontend.Overview.click_on_vf(user_content) + for idx, stage in enumerate(stages[:-1]): + next_stage = stages[(idx + 1) % len(stages)] + Frontend.Overview.check_stage_next_steps(stage, user_content['engagement_uuid']) + Frontend.Overview.change_engagement_stage(next_stage) + Frontend.General.refresh() + if Frontend.Overview.check_stage_notifications(next_stage) is False: + raise Exception("Activity log for set stage wasn't found for stage %s" % next_stage) + + + @exception() + def test_admin_ro_set_stage_negative(self): + user_content = API.VirtualFunction.create_engagement(wait_for_gitlab=False) + stages = [Constants.EngagementStages.INTAKE, Constants.EngagementStages.ACTIVE, Constants.EngagementStages.VALIDATED, + Constants.EngagementStages.COMPLETED] + Frontend.User.login(Constants.Users.AdminRO.EMAIL, Constants.Default.Password.TEXT) + Frontend.Dashboard.statuses_search_vf(user_content['engagement_manual_id'], user_content['vfName']) + for idx, stage in enumerate(stages[:-1]): + next_stage = stages[(idx + 1) % len(stages)] + Frontend.Overview.change_engagement_stage(next_stage, is_negative=True) + logger.debug("Admin_ro failed to change stage to %s" % stage) + + @exception() + def test_set_eng_stages_negative(self): + user_content = API.VirtualFunction.create_engagement(wait_for_gitlab=False) + stages = [Constants.EngagementStages.INTAKE, Constants.EngagementStages.ACTIVE, Constants.EngagementStages.VALIDATED, + Constants.EngagementStages.COMPLETED] + Frontend.User.login(user_content['email'], Constants.Default.Password.TEXT) + Frontend.Overview.click_on_vf(user_content) + for idx, stage in enumerate(stages[:-1]): + next_stage = stages[(idx + 1) % len(stages)] + Frontend.Overview.change_engagement_stage(next_stage, is_negative=True) + logger.debug("User %s failed to change stage to %s" % (user_content['email'], stage)) + + @exception() + def test_set_eng_stages_negative_via_pr(self): + user_content = API.VirtualFunction.create_engagement(wait_for_gitlab=False) + stages = [Constants.EngagementStages.INTAKE, Constants.EngagementStages.ACTIVE, Constants.EngagementStages.VALIDATED, + Constants.EngagementStages.COMPLETED] + Frontend.User.login(user_content['pr_email'], Constants.Default.Password.TEXT) + Frontend.Overview.click_on_vf(user_content) + for idx, stage in enumerate(stages[:-1]): + next_stage = stages[(idx + 1) % len(stages)] + Frontend.Overview.change_engagement_stage(next_stage, is_negative=False) + logger.debug("User %s failed to change stage to %s" % (user_content['pr_email'], stage)) diff --git a/tests/uiTests/test_ssh_key.py b/tests/uiTests/test_ssh_key.py new file mode 100644 index 0000000..24db555 --- /dev/null +++ b/tests/uiTests/test_ssh_key.py @@ -0,0 +1,98 @@ + +# ============LICENSE_START========================================== +# org.onap.vvp/test-engine +# =================================================================== +# Copyright © 2017 AT&T Intellectual Property. All rights reserved. +# =================================================================== +# +# Unless otherwise specified, all software contained herein is licensed +# under the Apache License, Version 2.0 (the “License”); +# you may not use this software except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# Unless otherwise specified, all documentation contained herein is licensed +# under the Creative Commons License, Attribution 4.0 Intl. (the “License”); +# you may not use this documentation except in compliance with the License. +# You may obtain a copy of the License at +# +# https://creativecommons.org/licenses/by/4.0/ +# +# Unless required by applicable law or agreed to in writing, documentation +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ============LICENSE_END============================================ +# +# ECOMP is a trademark and service mark of AT&T Intellectual Property. +''' + Created on Sep 19, 2016 + @author: Tomer Cohen + + Purpose: Test SSH Public Key validation, positive and negative. + Steps: + - Create user and activate the user account. + - Modal window: add VF, add vendor contact, invite team member, add a valid SSH key. + - Go to account page. + - Clear SSH key text-box and add an invalid SSH key. + - Verify error message. + - Change the invalid key to a valid one (RSA). + - Verify success message. +''' + +from iceci.decorator.exception_decor import exception +from services.constants import Constants +from services.helper import Helper +from services.logging_service import LoggingServiceFactory +from services.types import API, Frontend +from tests.uiTests.test_ui_base import TestUiBase + + +logger = LoggingServiceFactory.get_logger() + + +class TestSSHKey(TestUiBase): + user_content = None + + @classmethod + def setUpClass(cls): + super(TestSSHKey, cls).setUpClass() + + cls.user_content = API.Bridge.create_engagement(wait_for_gitlab=False) + + def setUp(self): + super(TestSSHKey, self).setUp() + Frontend.User.login(self.user_content['email'], Constants.Default.Password.TEXT) + + @exception() + def test_ssh_key_valid(self): + validSSHKey = Helper.generate_sshpub_key() + logger.debug(validSSHKey) + Frontend.User.set_ssh_key_from_account(validSSHKey) + + @exception() + def test_ssh_key_invalid(self): + Frontend.Overview.click_on_vf(self.user_content) + validSSHKey = Helper.generate_sshpub_key() + invalidSSHKey = validSSHKey[8:] + logger.debug(invalidSSHKey) + Frontend.User.set_ssh_key_from_account(invalidSSHKey, is_negative=True) + + @exception() + def test_set_invalid_ssh_key_in_wizard(self): + Frontend.Dashboard.click_on_create_vf() + Frontend.Wizard.add_vf() + Frontend.Wizard.add_vendor_contact() + Frontend.Wizard.invite_team_members(Helper.rand_invite_email()) + Frontend.Wizard.add_ssh_key(is_negative=True) diff --git a/tests/uiTests/test_ssh_key.pyc b/tests/uiTests/test_ssh_key.pyc new file mode 100755 index 0000000..13fba44 Binary files /dev/null and b/tests/uiTests/test_ssh_key.pyc differ diff --git a/tests/uiTests/test_ui_base.py b/tests/uiTests/test_ui_base.py new file mode 100644 index 0000000..d4f1a62 --- /dev/null +++ b/tests/uiTests/test_ui_base.py @@ -0,0 +1,146 @@ + +# ============LICENSE_START========================================== +# org.onap.vvp/test-engine +# =================================================================== +# Copyright © 2017 AT&T Intellectual Property. All rights reserved. +# =================================================================== +# +# Unless otherwise specified, all software contained herein is licensed +# under the Apache License, Version 2.0 (the “License”); +# you may not use this software except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# Unless otherwise specified, all documentation contained herein is licensed +# under the Creative Commons License, Attribution 4.0 Intl. (the “License”); +# you may not use this documentation except in compliance with the License. +# You may obtain a copy of the License at +# +# https://creativecommons.org/licenses/by/4.0/ +# +# Unless required by applicable law or agreed to in writing, documentation +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ============LICENSE_END============================================ +# +# ECOMP is a trademark and service mark of AT&T Intellectual Property. +import logging +import platform +import sys +from timeit import default_timer as timer +import unittest + +from pyvirtualdisplay import Display # For Linux only +import requests +from requests.packages.urllib3.exceptions import InsecureRequestWarning +from selenium.webdriver.common.action_chains import ActionChains + +from iceci.decorator.logFuncEntry import logFuncEntry +from services.constants import Constants +from services.database.db_general import DBGeneral +from services.logging_service import LoggingServiceFactory +from services.session import session + +requests.packages.urllib3.disable_warnings(InsecureRequestWarning) +logger = LoggingServiceFactory.get_logger() +stream_handler = logging.StreamHandler(sys.stdout) + + +class TestUiBase(unittest.TestCase): + windows = [] + one_web_driver_enabled = True + + @classmethod + def setUpClass(cls): + super(TestUiBase, cls).setUpClass() + cls.display = None + if platform.system() == 'Linux': + cls.display = Display(visible=0, size=(1920, 1080)) + cls.display.start() + + if cls.one_web_driver_enabled: + session.setup_driver() + + def go_to_web_page(self, address): + self.websiteUrl = address + + session.ice_driver.get("about:blank") + session.ice_driver.get(self.websiteUrl) + + @logFuncEntry + def setUp(self): + logger.addHandler(stream_handler) + + self.fullClassName = __name__ + self.className = self.__class__.__name__ + logger.debug("---------------------- TestCase - Start - Class " + + self.className + " Function " + self._testMethodName + " ----------------------") + + self.ice_driver = session.get_driver() + + if not self.one_web_driver_enabled: + self.ice_driver = session.setup_driver() + elif self.ice_driver is None: + self.ice_driver = session.setup_driver() + + self.go_to_web_page(Constants.Default.LoginURL.TEXT) + + session.ice_driver.implicitly_wait(session.wait_until_implicit_time) + self.actions = ActionChains(self.ice_driver) + self.windows.append(session.ice_driver.window_handles[0]) + session.ice_driver.maximize_window() + + self.startTime = timer() + self.funcName = self._testMethodName + self.testName = self.funcName + + @logFuncEntry + def tearDown(self): + self.endTime = timer() + self.testDuration = str(self.endTime - self.startTime) + self.results() + if self.one_web_driver_enabled is None or not self.one_web_driver_enabled: + session.ice_driver.quit() + else: + self.go_to_web_page(Constants.Default.LoginURL.TEXT) + logger.debug("---------------------- TestCase - End - Class " + self.className + + " Function " + self._testMethodName + " ----------------------\n") + try: + logging.getLogger().info("BB") + finally: + logger.removeHandler(stream_handler) + session.errorList = "" + session.errorCounter = 0 + + @classmethod + def tearDownClass(cls): + session.close_driver() + if cls.display: + cls.display.stop() + super(TestUiBase, cls).tearDownClass() + + @logFuncEntry + def results(self): + params = {"testType": "E2E Test", "testFeature": self.className, + "testResult": "PASS", "testName": self.funcName, "duration": self.testDuration} + if (session.errorCounter == 0): + DBGeneral.insert_results(params["testType"], params["testFeature"], params[ + "testResult"], params["testName"], params['duration']) + else: + params["testResult"] = "FAIL" # Mark test as fail. + # Add the errors to notes column in table. + params["notes"] = session.errorList + DBGeneral.insert_results(params["testType"], params["testFeature"], params[ + "testResult"], params["testName"], params['duration'], params["notes"]) diff --git a/tests/uiTests/test_user_profile_settings.py b/tests/uiTests/test_user_profile_settings.py new file mode 100644 index 0000000..9b5952e --- /dev/null +++ b/tests/uiTests/test_user_profile_settings.py @@ -0,0 +1,75 @@ + +# ============LICENSE_START========================================== +# org.onap.vvp/test-engine +# =================================================================== +# Copyright © 2017 AT&T Intellectual Property. All rights reserved. +# =================================================================== +# +# Unless otherwise specified, all software contained herein is licensed +# under the Apache License, Version 2.0 (the “License”); +# you may not use this software except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# Unless otherwise specified, all documentation contained herein is licensed +# under the Creative Commons License, Attribution 4.0 Intl. (the “License”); +# you may not use this documentation except in compliance with the License. +# You may obtain a copy of the License at +# +# https://creativecommons.org/licenses/by/4.0/ +# +# Unless required by applicable law or agreed to in writing, documentation +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ============LICENSE_END============================================ +# +# ECOMP is a trademark and service mark of AT&T Intellectual Property. +from iceci.decorator.exception_decor import exception +from services.constants import Constants +from services.frontend.base_actions.wait import Wait +from services.logging_service import LoggingServiceFactory +from services.types import API, Frontend, DB +from tests.uiTests.test_ui_base import TestUiBase + + +logger = LoggingServiceFactory.get_logger() + + +class TestUserProfileSettings(TestUiBase): + user_content = None + + @classmethod + def setUpClass(cls): + super(TestUserProfileSettings, cls).setUpClass() + + cls.user_content = API.VirtualFunction.create_engagement(wait_for_gitlab=False) + + def setUp(self): + super(TestUserProfileSettings, self).setUp() + Frontend.User.login(self.user_content['email'], Constants.Default.Password.TEXT) + + @exception() + def test_user_profile_settings_page_exists(self): + Frontend.User.go_to_user_profile_settings() + + @exception() + def test_user_profile_checkboxes(self): + Frontend.User.go_to_user_profile_settings() + Frontend.User.check_user_profile_settings_checkboxes() + DB.User.validate_user_profile_settings_in_db(self.user_content['email'], False) + Frontend.General.refresh() + Frontend.User.validate_user_profile_settings_checkboxes(False) + Frontend.User.check_user_profile_settings_checkboxes() + DB.User.validate_user_profile_settings_in_db(self.user_content['email'], True) diff --git a/tests/uiTests/test_validate_signup.py b/tests/uiTests/test_validate_signup.py new file mode 100644 index 0000000..424239c --- /dev/null +++ b/tests/uiTests/test_validate_signup.py @@ -0,0 +1,100 @@ + +# ============LICENSE_START========================================== +# org.onap.vvp/test-engine +# =================================================================== +# Copyright © 2017 AT&T Intellectual Property. All rights reserved. +# =================================================================== +# +# Unless otherwise specified, all software contained herein is licensed +# under the Apache License, Version 2.0 (the “License”); +# you may not use this software except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# Unless otherwise specified, all documentation contained herein is licensed +# under the Creative Commons License, Attribution 4.0 Intl. (the “License”); +# you may not use this documentation except in compliance with the License. +# You may obtain a copy of the License at +# +# https://creativecommons.org/licenses/by/4.0/ +# +# Unless required by applicable law or agreed to in writing, documentation +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ============LICENSE_END============================================ +# +# ECOMP is a trademark and service mark of AT&T Intellectual Property. +from iceci.decorator.exception_decor import exception +from services.constants import Constants +from services.types import API, Frontend, DB +from services.helper import Helper +from tests.uiTests.test_ui_base import TestUiBase + + +class TestValidateSignup(TestUiBase): + user_content = None + + @classmethod + def setUpClass(cls): + super(TestValidateSignup, cls).setUpClass() + + cls.user_content = API.VirtualFunction.create_engagement(wait_for_gitlab=False) + + @exception() + def test_create_and_activateUser(self): + '''Create user with rest API, login and activate.''' + user_data = API.User.create_new_user() + Frontend.User.login(user_data['email'], Constants.Default.Password.TEXT, Constants.Toast.ID) + Frontend.General.verify_toast_message(Constants.Dashboard.ActivateMsg.Fail.TEXT) + activationUrl = DB.User.get_activation_url(user_data['email']) + Frontend.General.re_open(activationUrl) + Frontend.User.login(user_data['email'], Constants.Default.Password.TEXT) + Frontend.General.verify_toast_message(Constants.Dashboard.ActivateMsg.Success.TEXT) + + @exception() + def test_activate_user_and_validate_account(self): + '''Go to Account page and validate details after signup and login.''' + Frontend.User.login(self.user_content['email'], Constants.Default.Password.TEXT) + Frontend.User.go_to_account() + Frontend.General.form_validate_company(self.user_content['vendor']) + Frontend.General.form_validate_name(self.user_content['full_name']) + Frontend.General.form_validate_email(self.user_content['email']) + Frontend.General.form_validate_phone(Constants.Default.Phone.TEXT) + Frontend.General.form_validate_ssh("") # No SSH key. + + @exception() + def test_signup_page_sanity(self): + ''' + Purpose: Sanity test for sign-up page. + Steps: + - Go to sign-up page + - Verify all approved vendors are listed + - Verify all form fields exist. + - Submit form without reCAPTCHA and verify error message. + - Click on "Already have an account" and verify link. + ''' + Frontend.General.go_to_signup_from_login() + vendors_list = DB.General.get_vendors_list() + for vendor in vendors_list: + Frontend.General.select_vendor_from_list(vendor) + Frontend.General.form_enter_name(Helper.rand_string("randomString")) + Frontend.General.form_enter_email(Helper.rand_string("email")) + Frontend.General.form_enter_phone(Constants.Default.Phone.TEXT) + Frontend.General.form_enter_password(Helper.rand_string("randomString")) + Frontend.General.form_check_checkbox(Constants.Signup.RegularEmail.XPATH) + Frontend.General.form_check_checkbox(Constants.Signup.AcceptTerms.XPATH) + Frontend.General.click_on_submit() + Frontend.General.verify_toast_message(Constants.Signup.Toast.Captcha.TEXT) + Frontend.General.go_to_login_from_signup() -- cgit 1.2.3-korg