api: creation of pull_request now honor additional reviewers when using reviewer rules.

This commit is contained in:
Marcin Kuzminski 2018-07-12 14:10:29 +02:00
parent 1b0ed3831f
commit d576848d4a
3 changed files with 50 additions and 23 deletions

View file

@ -113,11 +113,13 @@ class TestCreatePullRequestApi(object):
data = self._prepare_data(backend) data = self._prepare_data(backend)
reviewers = [ reviewers = [
{'username': TEST_USER_REGULAR_LOGIN, {'username': TEST_USER_REGULAR_LOGIN,
'reasons': ['added manually']}, 'reasons': ['{} added manually'.format(TEST_USER_REGULAR_LOGIN)]},
{'username': TEST_USER_ADMIN_LOGIN, {'username': TEST_USER_ADMIN_LOGIN,
'reasons': ['added manually']}, 'reasons': ['{} added manually'.format(TEST_USER_ADMIN_LOGIN)],
'mandatory': True},
] ]
data['reviewers'] = reviewers data['reviewers'] = reviewers
id_, params = build_data( id_, params = build_data(
self.apikey_regular, 'create_pull_request', **data) self.apikey_regular, 'create_pull_request', **data)
response = api_call(self.app, params) response = api_call(self.app, params)
@ -128,12 +130,24 @@ class TestCreatePullRequestApi(object):
assert result['result']['msg'] == expected_message assert result['result']['msg'] == expected_message
pull_request_id = result['result']['pull_request_id'] pull_request_id = result['result']['pull_request_id']
pull_request = PullRequestModel().get(pull_request_id) pull_request = PullRequestModel().get(pull_request_id)
actual_reviewers = [
{'username': r.user.username, actual_reviewers = []
'reasons': ['added manually'], for rev in pull_request.reviewers:
} for r in pull_request.reviewers entry = {
] 'username': rev.user.username,
assert sorted(actual_reviewers) == sorted(reviewers) 'reasons': rev.reasons,
}
if rev.mandatory:
entry['mandatory'] = rev.mandatory
actual_reviewers.append(entry)
# default reviewer will be added who is an owner of the repo
reviewers.append(
{'username': pull_request.author.username,
'reasons': [u'Default reviewer', u'Repository owner']},
)
assert sorted(actual_reviewers, key=lambda e: e['username']) \
== sorted(reviewers, key=lambda e: e['username'])
@pytest.mark.backends("git", "hg") @pytest.mark.backends("git", "hg")
def test_create_with_reviewers_specified_by_ids( def test_create_with_reviewers_specified_by_ids(
@ -159,12 +173,23 @@ class TestCreatePullRequestApi(object):
assert result['result']['msg'] == expected_message assert result['result']['msg'] == expected_message
pull_request_id = result['result']['pull_request_id'] pull_request_id = result['result']['pull_request_id']
pull_request = PullRequestModel().get(pull_request_id) pull_request = PullRequestModel().get(pull_request_id)
actual_reviewers = [
{'username': r.user.user_id, actual_reviewers = []
'reasons': ['added manually'], for rev in pull_request.reviewers:
} for r in pull_request.reviewers entry = {
] 'username': rev.user.user_id,
assert sorted(actual_reviewers) == sorted(reviewers) 'reasons': rev.reasons,
}
if rev.mandatory:
entry['mandatory'] = rev.mandatory
actual_reviewers.append(entry)
# default reviewer will be added who is an owner of the repo
reviewers.append(
{'username': pull_request.author.user_id,
'reasons': [u'Default reviewer', u'Repository owner']},
)
assert sorted(actual_reviewers, key=lambda e: e['username']) \
== sorted(reviewers, key=lambda e: e['username'])
@pytest.mark.backends("git", "hg") @pytest.mark.backends("git", "hg")
def test_create_fails_when_the_reviewer_is_not_found(self, backend): def test_create_fails_when_the_reviewer_is_not_found(self, backend):
@ -270,10 +295,11 @@ class TestCreatePullRequestApi(object):
@pytest.mark.backends("git", "hg") @pytest.mark.backends("git", "hg")
def test_create_fails_when_no_permissions(self, backend): def test_create_fails_when_no_permissions(self, backend):
data = self._prepare_data(backend) data = self._prepare_data(backend)
RepoModel().revoke_user_permission(
self.source.repo_name, User.DEFAULT_USER)
RepoModel().revoke_user_permission( RepoModel().revoke_user_permission(
self.source.repo_name, self.test_user) self.source.repo_name, self.test_user)
RepoModel().revoke_user_permission(
self.source.repo_name, User.DEFAULT_USER)
id_, params = build_data( id_, params = build_data(
self.apikey_regular, 'create_pull_request', **data) self.apikey_regular, 'create_pull_request', **data)
response = api_call(self.app, params) response = api_call(self.app, params)

View file

@ -641,6 +641,7 @@ def create_pull_request(
reviewer_objects = Optional.extract(reviewers) or [] reviewer_objects = Optional.extract(reviewers) or []
# serialize and validate passed in given reviewers
if reviewer_objects: if reviewer_objects:
schema = ReviewerListSchema() schema = ReviewerListSchema()
try: try:
@ -653,20 +654,19 @@ def create_pull_request(
user = get_user_or_error(reviewer_object['username']) user = get_user_or_error(reviewer_object['username'])
reviewer_object['user_id'] = user.user_id reviewer_object['user_id'] = user.user_id
get_default_reviewers_data, get_validated_reviewers = \ get_default_reviewers_data, validate_default_reviewers = \
PullRequestModel().get_reviewer_functions() PullRequestModel().get_reviewer_functions()
# recalculate reviewers logic, to make sure we can validate this
reviewer_rules = get_default_reviewers_data( reviewer_rules = get_default_reviewers_data(
apiuser.get_instance(), source_db_repo, apiuser.get_instance(), source_db_repo,
source_commit, target_db_repo, target_commit) source_commit, target_db_repo, target_commit)
# specified rules are later re-validated, thus we can assume users will # now MERGE our given with the calculated
# eventually provide those that meet the reviewer criteria. reviewer_objects = reviewer_rules['reviewers'] + reviewer_objects
if not reviewer_objects:
reviewer_objects = reviewer_rules['reviewers']
try: try:
reviewers = get_validated_reviewers( reviewers = validate_default_reviewers(
reviewer_objects, reviewer_rules) reviewer_objects, reviewer_rules)
except ValueError as e: except ValueError as e:
raise JSONRPCError('Reviewers Validation: {}'.format(e)) raise JSONRPCError('Reviewers Validation: {}'.format(e))

View file

@ -881,7 +881,8 @@ class RepoPullRequestsView(RepoAppView, DataGridAppView):
source_commit, target_db_repo, target_commit) source_commit, target_db_repo, target_commit)
given_reviewers = _form['review_members'] given_reviewers = _form['review_members']
reviewers = validate_default_reviewers(given_reviewers, reviewer_rules) reviewers = validate_default_reviewers(
given_reviewers, reviewer_rules)
pullrequest_title = _form['pullrequest_title'] pullrequest_title = _form['pullrequest_title']
title_source_ref = source_ref.split(':', 2)[1] title_source_ref = source_ref.split(':', 2)[1]