# -*- encoding: UTF8 -*-
# Test harness for CheckSubmitHasReview.py
from __future__ import print_function
import sys
import unittest
import os
from p4testutils import TestCase, P4Server, localDirectory, create_file, append_to_file
parent_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.insert(0, parent_dir)
from CheckSubmitHasReview import CheckSubmitHasReview
os.environ["LOGS"] = "."
LOGGER_NAME = "TestCheckSubmitHasReview"
LOG_FILE = "log-CheckSubmitHasReview.log"
python3 = sys.version_info[0] >= 3
if python3:
from unittest.mock import patch, Mock
else:
from mock import patch, Mock
class TestCheckSubmitHasReview(TestCase):
def __init__(self, methodName='runTest'):
super(TestCheckSubmitHasReview, self).__init__(LOGGER_NAME, LOG_FILE, methodName=methodName)
def setUp(self):
pass
def tearDown(self):
pass
@patch('CheckSubmitHasReview.requests')
def testCheckSubmitHasReview(self, requests_mock):
"""trigger fires and sends expected info to Swarm"""
self.server = P4Server()
config_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "~test_config.yaml")
p4 = self.server.p4
p4.logger = self.logger
inside = localDirectory(self.server.client_root, "inside")
outside = localDirectory(self.server.client_root, "outside")
inside_file1 = os.path.join(inside, "inside_file1")
outside_file1 = os.path.join(outside, "outside_file1")
create_file(inside_file1, 'Test content')
create_file(outside_file1, 'Test content')
p4.run('add', inside_file1)
result = p4.run('submit', '-d', 'inside_file1 added')
self.assertEqual("1", result[-1]['submittedChange'])
p4.run('add', outside_file1)
result = p4.run('submit', '-d', 'outside_file1 added')
self.assertEqual("2", result[-1]['submittedChange'])
# Test exclusionary mapping
with open(config_path, "w") as f:
f.write("""
api: "api/v6"
user: swarmtest
ticket: A123453
submit_without_review_users:
- jenkins
msg_submit_requires_review:
- "You are not allowed to submit without a review - please shelve for review first!"
msg_submit_test_must_pass:
- "You are not allowed to submit without a Jenkins build/test passing successfully!"
projects:
- name: ProjectA
pre_submit_require_review: y
pre_submit_test_must_pass: y
post_submit_create_review: n
require_job: y
update_review: n
depot_paths:
- //depot/inside/...
default_reviewers:
- user1
""")
# For change 2 which is outside, we don't expect trigger to fire
trig_args = ["-p", p4.port, "-u", p4.user, "-c", config_path, "--test-mode", "2"]
get_call_count = 0
post_call_count = 0
patch_call_count = 0
trig = CheckSubmitHasReview(*trig_args)
result = trig.run()
self.assertEqual(0, result)
# Hasn't been called
self.assertEqual(get_call_count, requests_mock.get.call_count)
self.assertEqual(post_call_count, requests_mock.post.call_count)
self.assertEqual(patch_call_count, requests_mock.patch.call_count)
#----------------------------------------
# For a path config file defines as inside we should call.
# Return a review or more
mock_response = Mock()
review_response = {"lastSeen":813,
"reviews":[
{"id":815,"author":"perforce","changes":[814,816,817],"comments":[0,0],"commits":[817],
"commitStatus":[],"created":1509095267,"deployDetails":[],"deployStatus":None,
"description":"asdfasdf","groups":["longlived"],
"participants":{"perforce":[]},"pending":False,"projects":[],"state":"approved",
"stateLabel":"Approved","testDetails":[],"testStatus":None,"type":"default",
"updated":1509096701,"updateDate":"2017-10-27T09:31:41+00:00"}],
"totalCount":1}
mock_response.json.return_value = review_response
requests_mock.get.return_value = mock_response
trig_args[-1] = "1"
trig = CheckSubmitHasReview(*trig_args)
result = trig.run()
self.assertEqual(1, result)
get_call_count += 1 # Expect an update
self.assertEqual(get_call_count, requests_mock.get.call_count)
self.assertEqual(post_call_count, requests_mock.post.call_count)
self.assertEqual(patch_call_count, requests_mock.patch.call_count)
# Now we make testStatus pass
review_response = {"lastSeen":813,
"reviews":[
{"id":815,"author":"perforce","changes":[814,816,817],"comments":[0,0],"commits":[817],
"commitStatus":[],"created":1509095267,"deployDetails":[],"deployStatus":None,
"description":"asdfasdf","groups":["longlived"],
"participants":{"perforce":[]},"pending":False,"projects":[],"state":"approved",
"stateLabel":"Approved","testDetails":[],"testStatus":"pass","type":"default",
"updated":1509096701,"updateDate":"2017-10-27T09:31:41+00:00"}],
"totalCount":1}
mock_response.json.return_value = review_response
requests_mock.get.return_value = mock_response
trig_args[-1] = "1"
trig = CheckSubmitHasReview(*trig_args)
result = trig.run()
self.assertEqual(0, result)
get_call_count += 1 # Expect an update
self.assertEqual(get_call_count, requests_mock.get.call_count)
self.assertEqual(post_call_count, requests_mock.post.call_count)
self.assertEqual(patch_call_count, requests_mock.patch.call_count)
# If review is blank then still a problem
# Return a review or more
mock_response = Mock()
review_response = {"lastSeen":813,
"reviews":[],
"totalCount":0}
mock_response.json.return_value = review_response
requests_mock.get.return_value = mock_response
trig_args[-1] = "1"
trig = CheckSubmitHasReview(*trig_args)
result = trig.run()
self.assertEqual(1, result)
get_call_count += 1 # Expect an update
self.assertEqual(get_call_count, requests_mock.get.call_count)
self.assertEqual(post_call_count, requests_mock.post.call_count)
self.assertEqual(patch_call_count, requests_mock.patch.call_count)
# ------------------------------
# Test that some users can submit directly without reviews.
p4.user = "jenkins"
p4.run('edit', inside_file1)
append_to_file(inside_file1, "Extra text")
result = p4.run('submit', '-d', 'inside_file1 edited')
self.assertEqual("3", result[-1]['submittedChange'])
trig_args[-1] = "3"
trig = CheckSubmitHasReview(*trig_args)
result = trig.run()
self.assertEqual(0, result)
# Mock should not be called in this case
self.assertEqual(get_call_count, requests_mock.get.call_count)
self.assertEqual(post_call_count, requests_mock.post.call_count)
self.assertEqual(patch_call_count, requests_mock.patch.call_count)
if __name__ == '__main__':
unittest.main()
| # | Change | User | Description | Committed | |
|---|---|---|---|---|---|
| #1 | 31397 | C. Thomas Tyler | Populate -b SDP_Classic_to_Streams -s //guest/perforce_software/sdp/...@31368. | ||
| //guest/perforce_software/sdp/dev/Unsupported/Samples/triggers/tests/TestCheckSubmitHasReview.py | |||||
| #1 | 26652 | Robert Cowham |
This is Tom's change: Introduced new 'Unsupported' directory to clarify that some files in the SDP are not officially supported. These files are samples for illustration, to provide examples, or are deprecated but not yet ready for removal from the package. The Maintenance and many SDP triggers have been moved under here, along with other SDP scripts and triggers. Added comments to p4_vars indicating that it should not be edited directly. Added reference to an optional site_global_vars file that, if it exists, will be sourced to provide global user settings without needing to edit p4_vars. As an exception to the refactoring, the totalusers.py Maintenance script will be moved to indicate that it is supported. Removed settings to support long-sunset P4Web from supported structure. Structure under new .../Unsupported folder is: Samples/bin Sample scripts. Samples/triggers Sample trigger scripts. Samples/triggers/tests Sample trigger script tests. Samples/broker Sample broker filter scripts. Deprecated/triggers Deprecated triggers. To Do in a subsequent change: Make corresponding doc changes. |
||
| //guest/perforce_software/sdp/dev/Server/Unix/p4/common/bin/triggers/tests/TestCheckSubmitHasReview.py | |||||
| #4 | 24624 | Robert Cowham |
Add new feature/test for CheckSubmitHasReview: - pre_submit_test_must_pass When set, the Swarm testStatus config must equal 'pass' |
||
| #3 | 23662 | Robert Cowham |
Allow one or more users to bypass trigger, e.g. jenkins user |
||
| #2 | 23574 | Robert Cowham | Fix deprecation warnings in Python3 | ||
| #1 | 23418 | Robert Cowham |
New trigger with test. Reworked sample yaml file to Workflow.yaml |
||