summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorEdan Binshtok <eb578m@intl.att.com>2017-10-04 09:33:23 +0300
committerEdan Binshtok <eb578m@intl.att.com>2017-10-04 09:36:04 +0300
commitf8907f0c4fc0ba4bb97a1d636a50c5b40c2642f2 (patch)
tree3d04d86910c93e42c055e5ed699ab1919482d5be /tests
parent733e00df0a6fa19dd92ec7392966340345dd1885 (diff)
Initial seed
Initial upload of django test framework Change-Id: I643a7f4efc52cfafe4cc6d92e3178f36a0c1837c Issue-Id: VVP-1 Signed-off-by: Edan Binshtok <eb578m@intl.att.com>
Diffstat (limited to 'tests')
-rw-r--r--tests/__init__.py38
-rw-r--r--tests/__init__.pycbin0 -> 137 bytes
-rw-r--r--tests/__pycache__/__init__.cpython-36.pycbin0 -> 133 bytes
-rw-r--r--tests/apiTests/__init__.py38
-rw-r--r--tests/apiTests/__pycache__/__init__.cpython-36.pycbin0 -> 142 bytes
-rw-r--r--tests/apiTests/__pycache__/test_api_base.cpython-36.pycbin0 -> 2163 bytes
-rw-r--r--tests/apiTests/__pycache__/test_negative_requests.cpython-36.pycbin0 -> 8936 bytes
-rw-r--r--tests/apiTests/test_api_base.py101
-rw-r--r--tests/apiTests/test_negative_requests.py271
-rw-r--r--tests/signalTests/__init__.py38
-rw-r--r--tests/signalTests/__pycache__/__init__.cpython-36.pycbin0 -> 145 bytes
-rw-r--r--tests/signalTests/__pycache__/test_checklist_signal.cpython-36.pycbin0 -> 1392 bytes
-rw-r--r--tests/signalTests/__pycache__/test_git_signal.cpython-36.pycbin0 -> 7892 bytes
-rw-r--r--tests/signalTests/__pycache__/test_signal_base.cpython-36.pycbin0 -> 2218 bytes
-rw-r--r--tests/signalTests/test_checklist_signal.py68
-rw-r--r--tests/signalTests/test_git_signal.py320
-rw-r--r--tests/signalTests/test_signal_base.py103
-rw-r--r--tests/uiTests/__init__.py38
-rw-r--r--tests/uiTests/__init__.pycbin0 -> 145 bytes
-rw-r--r--tests/uiTests/__pycache__/__init__.cpython-36.pycbin0 -> 141 bytes
-rw-r--r--tests/uiTests/__pycache__/portalVariables.cpython-36.pycbin0 -> 301 bytes
-rw-r--r--tests/uiTests/__pycache__/test_admin_dropdown.cpython-36.pycbin0 -> 5470 bytes
-rwxr-xr-xtests/uiTests/__pycache__/test_admin_section.cpython-36-PYTEST.pycbin0 -> 1893 bytes
-rw-r--r--tests/uiTests/__pycache__/test_admin_section.cpython-36.pycbin0 -> 1910 bytes
-rw-r--r--tests/uiTests/__pycache__/test_checklist_validations.cpython-36.pycbin0 -> 6956 bytes
-rw-r--r--tests/uiTests/__pycache__/test_cms_news_and_announcementsion.cpython-36.pycbin0 -> 5211 bytes
-rw-r--r--tests/uiTests/__pycache__/test_dashboard_feature.cpython-36.pycbin0 -> 5858 bytes
-rw-r--r--tests/uiTests/__pycache__/test_detailed_view.cpython-36.pycbin0 -> 9396 bytes
-rw-r--r--tests/uiTests/__pycache__/test_edit_checklist_template.cpython-36.pycbin0 -> 3506 bytes
-rw-r--r--tests/uiTests/__pycache__/test_export_excel.cpython-36.pycbin0 -> 1561 bytes
-rw-r--r--tests/uiTests/__pycache__/test_feedback_modal.cpython-36.pycbin0 -> 1303 bytes
-rw-r--r--tests/uiTests/__pycache__/test_invitations_and_throttle_logic.cpython-36.pycbin0 -> 4509 bytes
-rw-r--r--tests/uiTests/__pycache__/test_left_nav_panel.cpython-36.pycbin0 -> 6075 bytes
-rwxr-xr-xtests/uiTests/__pycache__/test_login_with_new_user.cpython-36-PYTEST.pycbin0 -> 17046 bytes
-rw-r--r--tests/uiTests/__pycache__/test_login_with_new_user.cpython-36.pycbin0 -> 16051 bytes
-rw-r--r--tests/uiTests/__pycache__/test_next_step.cpython-36.pycbin0 -> 6496 bytes
-rwxr-xr-xtests/uiTests/__pycache__/test_next_step_validations.cpython-36.pycbin0 -> 4699 bytes
-rw-r--r--tests/uiTests/__pycache__/test_notification_for_new_user.cpython-36.pycbin0 -> 2973 bytes
-rw-r--r--tests/uiTests/__pycache__/test_portal_homepage.cpython-36.pycbin0 -> 946 bytes
-rw-r--r--tests/uiTests/__pycache__/test_progress_bar.cpython-36.pycbin0 -> 2301 bytes
-rw-r--r--tests/uiTests/__pycache__/test_remove_user_from_eng.cpython-36.pycbin0 -> 3793 bytes
-rw-r--r--tests/uiTests/__pycache__/test_reset_password.cpython-36.pycbin0 -> 1872 bytes
-rw-r--r--tests/uiTests/__pycache__/test_sanity.cpython-36.pycbin0 -> 4685 bytes
-rw-r--r--tests/uiTests/__pycache__/test_set_stage.cpython-36.pycbin0 -> 3807 bytes
-rw-r--r--tests/uiTests/__pycache__/test_ssh_key.cpython-36.pycbin0 -> 2614 bytes
-rwxr-xr-xtests/uiTests/__pycache__/test_ui_base.cpython-36-PYTEST.pycbin0 -> 2795 bytes
-rw-r--r--tests/uiTests/__pycache__/test_ui_base.cpython-36.pycbin0 -> 3592 bytes
-rw-r--r--tests/uiTests/__pycache__/test_user_profile_settings.cpython-36.pycbin0 -> 1962 bytes
-rw-r--r--tests/uiTests/__pycache__/test_validate_signup.cpython-36.pycbin0 -> 3166 bytes
-rw-r--r--tests/uiTests/geckodriver.log392
-rw-r--r--tests/uiTests/test_admin_dropdown.py189
-rw-r--r--tests/uiTests/test_admin_section.py73
-rw-r--r--tests/uiTests/test_bucket_e2e.py140
-rw-r--r--tests/uiTests/test_bucket_url.py75
-rw-r--r--tests/uiTests/test_checklist_validations.py309
-rw-r--r--tests/uiTests/test_cms_news_and_announcementsion.py144
-rw-r--r--tests/uiTests/test_dashboard_feature.py164
-rw-r--r--tests/uiTests/test_detailed_view.py292
-rwxr-xr-xtests/uiTests/test_detailed_view.pycbin0 -> 6149 bytes
-rw-r--r--tests/uiTests/test_edit_checklist_template.py111
-rw-r--r--tests/uiTests/test_export_excel.py70
-rw-r--r--tests/uiTests/test_feedback_modal.py66
-rw-r--r--tests/uiTests/test_invitations_and_throttle_logic.py178
-rw-r--r--tests/uiTests/test_left_nav_panel.py200
-rw-r--r--tests/uiTests/test_login_with_new_user.py545
-rw-r--r--tests/uiTests/test_next_step.py245
-rw-r--r--tests/uiTests/test_notification_for_new_user.py108
-rwxr-xr-xtests/uiTests/test_notification_for_new_user.pycbin0 -> 4743 bytes
-rw-r--r--tests/uiTests/test_overview.py68
-rw-r--r--tests/uiTests/test_portal_homepage.py55
-rw-r--r--tests/uiTests/test_progress_bar.py96
-rwxr-xr-xtests/uiTests/test_progress_bar.pycbin0 -> 2327 bytes
-rw-r--r--tests/uiTests/test_rados_perms.py104
-rw-r--r--tests/uiTests/test_remove_user_from_eng.py116
-rw-r--r--tests/uiTests/test_reset_password.py77
-rwxr-xr-xtests/uiTests/test_reset_password.pycbin0 -> 3117 bytes
-rw-r--r--tests/uiTests/test_rgwa_credentials.py80
-rw-r--r--tests/uiTests/test_sanity.py173
-rw-r--r--tests/uiTests/test_set_stage.py115
-rw-r--r--tests/uiTests/test_ssh_key.py98
-rwxr-xr-xtests/uiTests/test_ssh_key.pycbin0 -> 3447 bytes
-rw-r--r--tests/uiTests/test_ui_base.py146
-rw-r--r--tests/uiTests/test_user_profile_settings.py75
-rw-r--r--tests/uiTests/test_validate_signup.py100
84 files changed, 5619 insertions, 0 deletions
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
--- /dev/null
+++ b/tests/__init__.pyc
Binary files differ
diff --git a/tests/__pycache__/__init__.cpython-36.pyc b/tests/__pycache__/__init__.cpython-36.pyc
new file mode 100644
index 0000000..0a09804
--- /dev/null
+++ b/tests/__pycache__/__init__.cpython-36.pyc
Binary files 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
--- /dev/null
+++ b/tests/apiTests/__pycache__/__init__.cpython-36.pyc
Binary files 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
--- /dev/null
+++ b/tests/apiTests/__pycache__/test_api_base.cpython-36.pyc
Binary files 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
--- /dev/null
+++ b/tests/apiTests/__pycache__/test_negative_requests.cpython-36.pyc
Binary files 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
--- /dev/null
+++ b/tests/signalTests/__pycache__/__init__.cpython-36.pyc
Binary files 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
--- /dev/null
+++ b/tests/signalTests/__pycache__/test_checklist_signal.cpython-36.pyc
Binary files 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
--- /dev/null
+++ b/tests/signalTests/__pycache__/test_git_signal.cpython-36.pyc
Binary files 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
--- /dev/null
+++ b/tests/signalTests/__pycache__/test_signal_base.cpython-36.pyc
Binary files 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
--- /dev/null
+++ b/tests/uiTests/__init__.pyc
Binary files 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
--- /dev/null
+++ b/tests/uiTests/__pycache__/__init__.cpython-36.pyc
Binary files 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
--- /dev/null
+++ b/tests/uiTests/__pycache__/portalVariables.cpython-36.pyc
Binary files 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
--- /dev/null
+++ b/tests/uiTests/__pycache__/test_admin_dropdown.cpython-36.pyc
Binary files 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
--- /dev/null
+++ b/tests/uiTests/__pycache__/test_admin_section.cpython-36-PYTEST.pyc
Binary files 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
--- /dev/null
+++ b/tests/uiTests/__pycache__/test_admin_section.cpython-36.pyc
Binary files 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
--- /dev/null
+++ b/tests/uiTests/__pycache__/test_checklist_validations.cpython-36.pyc
Binary files 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
--- /dev/null
+++ b/tests/uiTests/__pycache__/test_cms_news_and_announcementsion.cpython-36.pyc
Binary files 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
--- /dev/null
+++ b/tests/uiTests/__pycache__/test_dashboard_feature.cpython-36.pyc
Binary files 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
--- /dev/null
+++ b/tests/uiTests/__pycache__/test_detailed_view.cpython-36.pyc
Binary files 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
--- /dev/null
+++ b/tests/uiTests/__pycache__/test_edit_checklist_template.cpython-36.pyc
Binary files 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
--- /dev/null
+++ b/tests/uiTests/__pycache__/test_export_excel.cpython-36.pyc
Binary files 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
--- /dev/null
+++ b/tests/uiTests/__pycache__/test_feedback_modal.cpython-36.pyc
Binary files 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
--- /dev/null
+++ b/tests/uiTests/__pycache__/test_invitations_and_throttle_logic.cpython-36.pyc
Binary files 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
--- /dev/null
+++ b/tests/uiTests/__pycache__/test_left_nav_panel.cpython-36.pyc
Binary files 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
--- /dev/null
+++ b/tests/uiTests/__pycache__/test_login_with_new_user.cpython-36-PYTEST.pyc
Binary files 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
--- /dev/null
+++ b/tests/uiTests/__pycache__/test_login_with_new_user.cpython-36.pyc
Binary files 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
--- /dev/null
+++ b/tests/uiTests/__pycache__/test_next_step.cpython-36.pyc
Binary files 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
--- /dev/null
+++ b/tests/uiTests/__pycache__/test_next_step_validations.cpython-36.pyc
Binary files 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
--- /dev/null
+++ b/tests/uiTests/__pycache__/test_notification_for_new_user.cpython-36.pyc
Binary files 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
--- /dev/null
+++ b/tests/uiTests/__pycache__/test_portal_homepage.cpython-36.pyc
Binary files 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
--- /dev/null
+++ b/tests/uiTests/__pycache__/test_progress_bar.cpython-36.pyc
Binary files 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
--- /dev/null
+++ b/tests/uiTests/__pycache__/test_remove_user_from_eng.cpython-36.pyc
Binary files 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
--- /dev/null
+++ b/tests/uiTests/__pycache__/test_reset_password.cpython-36.pyc
Binary files 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
--- /dev/null
+++ b/tests/uiTests/__pycache__/test_sanity.cpython-36.pyc
Binary files 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
--- /dev/null
+++ b/tests/uiTests/__pycache__/test_set_stage.cpython-36.pyc
Binary files 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
--- /dev/null
+++ b/tests/uiTests/__pycache__/test_ssh_key.cpython-36.pyc
Binary files 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
--- /dev/null
+++ b/tests/uiTests/__pycache__/test_ui_base.cpython-36-PYTEST.pyc
Binary files 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
--- /dev/null
+++ b/tests/uiTests/__pycache__/test_ui_base.cpython-36.pyc
Binary files 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
--- /dev/null
+++ b/tests/uiTests/__pycache__/test_user_profile_settings.cpython-36.pyc
Binary files 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
--- /dev/null
+++ b/tests/uiTests/__pycache__/test_validate_signup.cpython-36.pyc
Binary files 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
--- /dev/null
+++ b/tests/uiTests/test_detailed_view.pyc
Binary files 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 = "<script>;</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
--- /dev/null
+++ b/tests/uiTests/test_notification_for_new_user.pyc
Binary files 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
--- /dev/null
+++ b/tests/uiTests/test_progress_bar.pyc
Binary files 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
--- /dev/null
+++ b/tests/uiTests/test_reset_password.pyc
Binary files 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
--- /dev/null
+++ b/tests/uiTests/test_ssh_key.pyc
Binary files 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()