# -*- coding: utf-8 -*-
"""
(c) 2018 - Copyright Red Hat Inc
Authors:
Pierre-Yves Chibon <pingou@pingoured.fr>
"""
from __future__ import unicode_literals, absolute_import
import unittest
import sys
import os
import json
from mock import patch, MagicMock
sys.path.insert(0, os.path.join(os.path.dirname(
os.path.abspath(__file__)), '..'))
import pagure.config # noqa
import pagure.lib.query # noqa
import tests # noqa
class PagureFlaskApiPRFlagtests(tests.Modeltests):
""" Tests for the flask API of pagure for flagging pull-requests """
maxDiff = None
@patch('pagure.lib.notify.send_email', MagicMock(return_value=True))
def setUp(self):
""" Set up the environnment, ran before every tests. """
super(PagureFlaskApiPRFlagtests, self).setUp()
pagure.config.config['REQUESTS_FOLDER'] = None
tests.create_projects(self.session)
tests.create_tokens(self.session)
tests.create_tokens_acl(self.session)
# Create a pull-request
repo = pagure.lib.query.get_authorized_project(self.session, 'test')
forked_repo = pagure.lib.query.get_authorized_project(self.session, 'test')
req = pagure.lib.query.new_pull_request(
session=self.session,
repo_from=forked_repo,
branch_from='master',
repo_to=repo,
branch_to='master',
title='test pull-request',
user='pingou',
)
self.session.commit()
self.assertEqual(req.id, 1)
self.assertEqual(req.title, 'test pull-request')
# Check flags before
self.session.commit()
request = pagure.lib.query.search_pull_requests(
self.session, project_id=1, requestid=1)
self.assertEqual(len(request.flags), 0)
def test_invalid_project(self):
""" Test the flagging a PR on an invalid project. """
headers = {'Authorization': 'token aaabbbcccddd'}
# Invalid project
output = self.app.post(
'/api/0/foo/pull-request/1/flag', headers=headers)
self.assertEqual(output.status_code, 404)
data = json.loads(output.get_data(as_text=True))
self.assertDictEqual(
data,
{
"error": "Project not found",
"error_code": "ENOPROJECT",
}
)
def test_incorrect_project(self):
""" Test the flagging a PR on the wrong project. """
headers = {'Authorization': 'token aaabbbcccddd'}
# Valid token, wrong project
output = self.app.post(
'/api/0/test2/pull-request/1/flag', headers=headers)
self.assertEqual(output.status_code, 401)
data = json.loads(output.get_data(as_text=True))
self.assertEqual(pagure.api.APIERROR.EINVALIDTOK.name,
data['error_code'])
self.assertEqual(pagure.api.APIERROR.EINVALIDTOK.value, data['error'])
def test_pr_disabled(self):
""" Test the flagging a PR when PRs are disabled. """
repo = pagure.lib.query.get_authorized_project(self.session, 'test')
settings = repo.settings
settings['pull_requests'] = False
repo.settings = settings
self.session.add(repo)
self.session.commit()
headers = {'Authorization': 'token aaabbbcccddd'}
# PRs disabled
output = self.app.post(
'/api/0/test/pull-request/1/flag', headers=headers)
self.assertEqual(output.status_code, 404)
data = json.loads(output.get_data(as_text=True))
self.assertDictEqual(
data,
{
u'error': u'Pull-Request have been deactivated for this project',
u'error_code': u'EPULLREQUESTSDISABLED'
}
)
def test_no_pr(self):
""" Test the flagging a PR when the PR doesn't exist. """
headers = {'Authorization': 'token aaabbbcccddd'}
# No PR
output = self.app.post(
'/api/0/test/pull-request/10/flag', headers=headers)
self.assertEqual(output.status_code, 404)
data = json.loads(output.get_data(as_text=True))
self.assertDictEqual(
data,
{
"error": "Pull-Request not found",
"error_code": "ENOREQ",
}
)
def test_no_input(self):
""" Test the flagging an existing PR but with no data. """
headers = {'Authorization': 'token aaabbbcccddd'}
# No input
output = self.app.post(
'/api/0/test/pull-request/1/flag', headers=headers)
self.assertEqual(output.status_code, 400)
data = json.loads(output.get_data(as_text=True))
self.assertDictEqual(
data,
{
'error': 'Invalid or incomplete input submitted',
'error_code': 'EINVALIDREQ',
'errors': {
'comment': ['This field is required.'],
'url': ['This field is required.'],
'username': ['This field is required.']
}
}
)
def test_no_comment(self):
""" Test the flagging an existing PR but with incomplete data. """
headers = {'Authorization': 'token aaabbbcccddd'}
data = {
'username': 'Jenkins',
'percent': 100,
'url': 'http://jenkins.cloud.fedoraproject.org/',
'uid': 'jenkins_build_pagure_100+seed',
}
# Incomplete request
output = self.app.post(
'/api/0/test/pull-request/1/flag', data=data, headers=headers)
self.assertEqual(output.status_code, 400)
data = json.loads(output.get_data(as_text=True))
self.assertDictEqual(
data,
{
"error": "Invalid or incomplete input submitted",
"error_code": "EINVALIDREQ",
"errors": {"comment": ["This field is required."]}
}
)
# No change
self.session.commit()
request = pagure.lib.query.search_pull_requests(
self.session, project_id=1, requestid=1)
self.assertEqual(len(request.flags), 0)
@patch(
'pagure.lib.query.add_pull_request_flag',
MagicMock(side_effect=pagure.exceptions.PagureException('error')))
def test_raise_exception(self):
""" Test the flagging a PR when adding a flag raises an exception. """
headers = {'Authorization': 'token aaabbbcccddd'}
data = {
'username': 'Jenkins',
'comment': 'Tests running',
'url': 'http://jenkins.cloud.fedoraproject.org/',
'uid': 'jenkins_build_pagure_100+seed',
}
# Adding a flag raises an exception
output = self.app.post(
'/api/0/test/pull-request/1/flag', headers=headers, data=data)
self.assertEqual(output.status_code, 400)
data = json.loads(output.get_data(as_text=True))
self.assertDictEqual(
data, {u'error': u'error', u'error_code': u'ENOCODE'})
@patch('pagure.lib.notify.send_email')
def test_flagging_a_pul_request_with_notification(self, mock_email):
""" Test the flagging a PR. """
headers = {'Authorization': 'token aaabbbcccddd'}
# Enable PR notifications
repo = pagure.lib.query.get_authorized_project(self.session, 'test')
settings = repo.settings
settings['notify_on_pull-request_flag'] = True
repo.settings = settings
self.session.add(repo)
self.session.commit()
data = {
'username': 'Jenkins',
'comment': 'Tests running',
'url': 'http://jenkins.cloud.fedoraproject.org/',
'uid': 'jenkins_build_pagure_100+seed',
}
# Valid request
output = self.app.post(
'/api/0/test/pull-request/1/flag', data=data, headers=headers)
self.assertEqual(output.status_code, 200)
data = json.loads(output.get_data(as_text=True))
data['flag']['date_created'] = '1510742565'
data['flag']['date_updated'] = '1510742565'
pr_uid = data['flag']['pull_request_uid']
data['flag']['pull_request_uid'] = '62b49f00d489452994de5010565fab81'
data["avatar_url"] = "https://seccdn.libravatar.org/avatar/..."
self.assertDictEqual(
data,
{
'flag': {
'comment': 'Tests running',
'date_created': '1510742565',
'date_updated': '1510742565',
'percent': None,
'pull_request_uid': '62b49f00d489452994de5010565fab81',
'status': 'pending',
'url': 'http://jenkins.cloud.fedoraproject.org/',
'user': {
'default_email': 'bar@pingou.com',
'emails': ['bar@pingou.com', 'foo@pingou.com'],
'fullname': 'PY C',
'name': 'pingou'
},
'username': 'Jenkins'},
'message': 'Flag added',
'uid': 'jenkins_build_pagure_100+seed',
'avatar_url': 'https://seccdn.libravatar.org/avatar/...',
'user': 'pingou'
}
)
# One flag added
self.session.commit()
request = pagure.lib.query.search_pull_requests(
self.session, project_id=1, requestid=1)
self.assertEqual(len(request.flags), 1)
self.assertEqual(request.flags[0].comment, 'Tests running')
self.assertEqual(request.flags[0].percent, None)
# Check the notification sent
mock_email.assert_called_once_with(
'\nJenkins flagged the pull-request `test pull-request` '
'as pending: Tests running\n\n'
'http://localhost.localdomain/test/pull-request/1\n',
'PR #1 - Jenkins: pending',
'bar@pingou.com',
assignee=None,
in_reply_to='test-pull-request-' + pr_uid,
mail_id='test-pull-request-' + pr_uid + '-1',
project_name='test',
reporter='pingou',
user_from='Jenkins'
)
def test_updating_flag(self):
""" Test the updating the flag of a PR. """
headers = {'Authorization': 'token aaabbbcccddd'}
data = {
'username': 'Jenkins',
'comment': 'Tests running',
'url': 'http://jenkins.cloud.fedoraproject.org/',
'uid': 'jenkins_build_pagure_100+seed',
}
# Valid request
output = self.app.post(
'/api/0/test/pull-request/1/flag', data=data, headers=headers)
self.assertEqual(output.status_code, 200)
data = json.loads(output.get_data(as_text=True))
data['flag']['date_created'] = '1510742565'
data['flag']['date_updated'] = '1510742565'
data['flag']['pull_request_uid'] = '62b49f00d489452994de5010565fab81'
data["avatar_url"] = "https://seccdn.libravatar.org/avatar/..."
self.assertDictEqual(
data,
{
'flag': {
'comment': 'Tests running',
'date_created': '1510742565',
'date_updated': '1510742565',
'percent': None,
'pull_request_uid': '62b49f00d489452994de5010565fab81',
'status': 'pending',
'url': 'http://jenkins.cloud.fedoraproject.org/',
'user': {
'default_email': 'bar@pingou.com',
'emails': ['bar@pingou.com', 'foo@pingou.com'],
'fullname': 'PY C',
'name': 'pingou'
},
'username': 'Jenkins'},
'message': 'Flag added',
'uid': 'jenkins_build_pagure_100+seed',
'avatar_url': 'https://seccdn.libravatar.org/avatar/...',
'user': 'pingou'
}
)
# One flag added
self.session.commit()
request = pagure.lib.query.search_pull_requests(
self.session, project_id=1, requestid=1)
self.assertEqual(len(request.flags), 1)
self.assertEqual(request.flags[0].comment, 'Tests running')
self.assertEqual(request.flags[0].percent, None)
# Update flag - w/o providing the status
data = {
'username': 'Jenkins',
'percent': 100,
'comment': 'Tests passed',
'url': 'http://jenkins.cloud.fedoraproject.org/',
'uid': 'jenkins_build_pagure_100+seed',
}
output = self.app.post(
'/api/0/test/pull-request/1/flag', data=data, headers=headers)
self.assertEqual(output.status_code, 200)
data = json.loads(output.get_data(as_text=True))
data['flag']['date_created'] = '1510742565'
data['flag']['date_updated'] = '1510742565'
data['flag']['pull_request_uid'] = '62b49f00d489452994de5010565fab81'
data["avatar_url"] = "https://seccdn.libravatar.org/avatar/..."
self.assertDictEqual(
data,
{
'flag': {
'comment': 'Tests passed',
'date_created': '1510742565',
'date_updated': '1510742565',
'percent': 100,
'pull_request_uid': '62b49f00d489452994de5010565fab81',
'status': 'success',
'url': 'http://jenkins.cloud.fedoraproject.org/',
'user': {
'default_email': 'bar@pingou.com',
'emails': ['bar@pingou.com', 'foo@pingou.com'],
'fullname': 'PY C',
'name': 'pingou'
},
'username': 'Jenkins'},
'message': 'Flag updated',
'uid': 'jenkins_build_pagure_100+seed',
'avatar_url': 'https://seccdn.libravatar.org/avatar/...',
'user': 'pingou'
}
)
# One flag added
self.session.commit()
request = pagure.lib.query.search_pull_requests(
self.session, project_id=1, requestid=1)
self.assertEqual(len(request.flags), 1)
self.assertEqual(request.flags[0].comment, 'Tests passed')
self.assertEqual(request.flags[0].percent, 100)
def test_adding_two_flags(self):
""" Test the adding two flags to a PR. """
headers = {'Authorization': 'token aaabbbcccddd'}
data = {
'username': 'Jenkins',
'comment': 'Tests passed',
'status': 'success',
'percent': '100',
'url': 'http://jenkins.cloud.fedoraproject.org/',
'uid': 'jenkins_build_pagure_100+seed',
}
# Valid request
output = self.app.post(
'/api/0/test/pull-request/1/flag', data=data, headers=headers)
self.assertEqual(output.status_code, 200)
data = json.loads(output.get_data(as_text=True))
data['flag']['date_created'] = '1510742565'
data['flag']['date_updated'] = '1510742565'
data['flag']['pull_request_uid'] = '62b49f00d489452994de5010565fab81'
data["avatar_url"] = "https://seccdn.libravatar.org/avatar/..."
self.assertDictEqual(
data,
{
'flag': {
'comment': 'Tests passed',
'date_created': '1510742565',
'date_updated': '1510742565',
'percent': 100,
'pull_request_uid': '62b49f00d489452994de5010565fab81',
'status': 'success',
'url': 'http://jenkins.cloud.fedoraproject.org/',
'user': {
'default_email': 'bar@pingou.com',
'emails': ['bar@pingou.com', 'foo@pingou.com'],
'fullname': 'PY C',
'name': 'pingou'
},
'username': 'Jenkins'},
'message': 'Flag added',
'uid': 'jenkins_build_pagure_100+seed',
'avatar_url': 'https://seccdn.libravatar.org/avatar/...',
'user': 'pingou'
}
)
# One flag added
self.session.commit()
request = pagure.lib.query.search_pull_requests(
self.session, project_id=1, requestid=1)
self.assertEqual(len(request.flags), 1)
self.assertEqual(request.flags[0].comment, 'Tests passed')
self.assertEqual(request.flags[0].percent, 100)
data = {
'username': 'Jenkins',
'comment': 'Tests running again',
'url': 'http://jenkins.cloud.fedoraproject.org/',
}
# Valid request
output = self.app.post(
'/api/0/test/pull-request/1/flag', data=data, headers=headers)
self.assertEqual(output.status_code, 200)
data = json.loads(output.get_data(as_text=True))
data['flag']['date_created'] = '1510742565'
data['flag']['date_updated'] = '1510742565'
data['flag']['pull_request_uid'] = '62b49f00d489452994de5010565fab81'
self.assertNotEqual(
data['uid'], 'jenkins_build_pagure_100+seed')
data['uid'] = 'jenkins_build_pagure_100+seed'
data["avatar_url"] = "https://seccdn.libravatar.org/avatar/..."
self.assertDictEqual(
data,
{
'flag': {
'comment': 'Tests running again',
'date_created': '1510742565',
'date_updated': '1510742565',
'percent': None,
'pull_request_uid': '62b49f00d489452994de5010565fab81',
'status': 'pending',
'url': 'http://jenkins.cloud.fedoraproject.org/',
'user': {
'default_email': 'bar@pingou.com',
'emails': ['bar@pingou.com', 'foo@pingou.com'],
'fullname': 'PY C',
'name': 'pingou'
},
'username': 'Jenkins'},
'message': 'Flag added',
'uid': 'jenkins_build_pagure_100+seed',
'avatar_url': 'https://seccdn.libravatar.org/avatar/...',
'user': 'pingou'
}
)
# Two flag added
self.session.commit()
request = pagure.lib.query.search_pull_requests(
self.session, project_id=1, requestid=1)
self.assertEqual(len(request.flags), 2)
self.assertEqual(request.flags[0].comment, 'Tests running again')
self.assertEqual(request.flags[0].percent, None)
self.assertEqual(request.flags[1].comment, 'Tests passed')
self.assertEqual(request.flags[1].percent, 100)
@patch.dict('pagure.config.config',
{
'FLAG_STATUSES_LABELS':
{
'pend!': 'label-info',
'succeed!': 'label-success',
'fail!': 'label-danger',
'what?': 'label-warning',
},
'FLAG_PENDING': 'pend!',
'FLAG_SUCCESS': 'succeed!',
'FLAG_FAILURE': 'fail!',
})
def test_flagging_a_pull_request_while_having_custom_statuses(self):
""" Test flagging a PR while having custom statuses. """
headers = {'Authorization': 'token aaabbbcccddd'}
# No status and no percent => should use FLAG_PENDING
send_data = {
'username': 'Jenkins',
'comment': 'Tests running',
'url': 'http://jenkins.cloud.fedoraproject.org/',
'uid': 'jenkins_build_pagure_100+seed',
}
output = self.app.post(
'/api/0/test/pull-request/1/flag', data=send_data, headers=headers)
data = json.loads(output.get_data(as_text=True))
self.assertEqual(output.status_code, 200)
self.assertEqual(data['flag']['status'], 'pend!')
# No status and 50 % => should use FLAG_SUCCESS
send_data['percent'] = 50
output = self.app.post(
'/api/0/test/pull-request/1/flag', data=send_data, headers=headers)
data = json.loads(output.get_data(as_text=True))
self.assertEqual(output.status_code, 200)
self.assertEqual(data['flag']['status'], 'succeed!')
# No status and 0 % => should use FLAG_FAILURE
send_data['percent'] = 0
output = self.app.post(
'/api/0/test/pull-request/1/flag', data=send_data, headers=headers)
data = json.loads(output.get_data(as_text=True))
self.assertEqual(output.status_code, 200)
self.assertEqual(data['flag']['status'], 'fail!')
# Explicitly set status
send_data['status'] = 'what?'
output = self.app.post(
'/api/0/test/pull-request/1/flag', data=send_data, headers=headers)
data = json.loads(output.get_data(as_text=True))
self.assertEqual(output.status_code, 200)
self.assertEqual(data['flag']['status'], 'what?')
# Explicitly set wrong status
send_data['status'] = 'nooo.....'
output = self.app.post(
'/api/0/test/pull-request/1/flag', data=send_data, headers=headers)
data = json.loads(output.get_data(as_text=True))
self.assertEqual(output.status_code, 400)
self.assertDictEqual(
data,
{
"error": "Invalid or incomplete input submitted",
"error_code": "EINVALIDREQ",
"errors": {"status": ["Not a valid choice"]}
}
)
class PagureFlaskApiPRFlagUserTokentests(tests.Modeltests):
""" Tests for the flask API of pagure for flagging pull-requests using
an user token (ie: not restricted to a specific project).
"""
maxDiff = None
@patch('pagure.lib.notify.send_email', MagicMock(return_value=True))
def setUp(self):
""" Set up the environnment, ran before every tests. """
super(PagureFlaskApiPRFlagUserTokentests, self).setUp()
pagure.config.config['REQUESTS_FOLDER'] = None
tests.create_projects(self.session)
tests.create_tokens(self.session, project_id=None)
tests.create_tokens_acl(self.session)
# Create a pull-request
repo = pagure.lib.query.get_authorized_project(self.session, 'test')
forked_repo = pagure.lib.query.get_authorized_project(self.session, 'test')
req = pagure.lib.query.new_pull_request(
session=self.session,
repo_from=forked_repo,
branch_from='master',
repo_to=repo,
branch_to='master',
title='test pull-request',
user='pingou',
)
self.session.commit()
self.assertEqual(req.id, 1)
self.assertEqual(req.title, 'test pull-request')
# Check flags before
self.session.commit()
request = pagure.lib.query.search_pull_requests(
self.session, project_id=1, requestid=1)
self.assertEqual(len(request.flags), 0)
def test_no_pr(self):
""" Test flagging a non-existing PR. """
headers = {'Authorization': 'token aaabbbcccddd'}
# Invalid project
output = self.app.post(
'/api/0/foo/pull-request/1/flag', headers=headers)
self.assertEqual(output.status_code, 404)
data = json.loads(output.get_data(as_text=True))
self.assertDictEqual(
data,
{
"error": "Project not found",
"error_code": "ENOPROJECT",
}
)
def test_no_pr_other_project(self):
""" Test flagging a non-existing PR on a different project. """
headers = {'Authorization': 'token aaabbbcccddd'}
# Valid token, wrong project
output = self.app.post(
'/api/0/test2/pull-request/1/flag', headers=headers)
self.assertEqual(output.status_code, 404)
data = json.loads(output.get_data(as_text=True))
self.assertDictEqual(
data,
{
"error": "Pull-Request not found",
"error_code": "ENOREQ",
}
)
def test_no_input(self):
""" Test flagging an existing PR but without submitting any data. """
headers = {'Authorization': 'token aaabbbcccddd'}
# No input
output = self.app.post(
'/api/0/test/pull-request/1/flag', headers=headers)
self.assertEqual(output.status_code, 400)
data = json.loads(output.get_data(as_text=True))
self.assertDictEqual(
data,
{
'error': 'Invalid or incomplete input submitted',
'error_code': 'EINVALIDREQ',
'errors': {
'comment': ['This field is required.'],
'url': ['This field is required.'],
'username': ['This field is required.']
}
}
)
def test_no_comment(self):
""" Test flagging an existing PR but without all the required info.
"""
headers = {'Authorization': 'token aaabbbcccddd'}
data = {
'username': 'Jenkins',
'percent': 100,
'url': 'http://jenkins.cloud.fedoraproject.org/',
'uid': 'jenkins_build_pagure_100+seed',
}
# Incomplete request
output = self.app.post(
'/api/0/test/pull-request/1/flag', data=data, headers=headers)
self.assertEqual(output.status_code, 400)
data = json.loads(output.get_data(as_text=True))
self.assertDictEqual(
data,
{
"error": "Invalid or incomplete input submitted",
"error_code": "EINVALIDREQ",
"errors": {"comment": ["This field is required."]}
}
)
# No change
self.session.commit()
request = pagure.lib.query.search_pull_requests(
self.session, project_id=1, requestid=1)
self.assertEqual(len(request.flags), 0)
def test_invalid_status(self):
""" Test flagging an existing PR but with an invalid status.
"""
headers = {'Authorization': 'token aaabbbcccddd'}
data = {
'username': 'Jenkins',
'status': 'failed',
'comment': 'Failed to run the tests',
'url': 'http://jenkins.cloud.fedoraproject.org/',
'uid': 'jenkins_build_pagure_100+seed',
}
# Invalid status submitted
output = self.app.post(
'/api/0/test/pull-request/1/flag', data=data, headers=headers)
self.assertEqual(output.status_code, 400)
data = json.loads(output.get_data(as_text=True))
self.assertDictEqual(
data,
{
"error": "Invalid or incomplete input submitted",
"error_code": "EINVALIDREQ",
"errors": {"status": ["Not a valid choice"]}
}
)
# No change
self.session.commit()
request = pagure.lib.query.search_pull_requests(
self.session, project_id=1, requestid=1)
self.assertEqual(len(request.flags), 0)
@patch('pagure.lib.notify.send_email')
def test_flag_pr_no_status(self, mock_email):
""" Test flagging an existing PR without providing a status.
Also check that no notifications have been sent.
"""
headers = {'Authorization': 'token aaabbbcccddd'}
data = {
'username': 'Jenkins',
'percent': 0,
'comment': 'Tests failed',
'url': 'http://jenkins.cloud.fedoraproject.org/',
'uid': 'jenkins_build_pagure_100+seed',
}
# Valid request - w/o providing the status
output = self.app.post(
'/api/0/test/pull-request/1/flag', data=data, headers=headers)
self.assertEqual(output.status_code, 200)
data = json.loads(output.get_data(as_text=True))
data['flag']['date_created'] = '1510742565'
data['flag']['date_updated'] = '1510742565'
data['flag']['pull_request_uid'] = '62b49f00d489452994de5010565fab81'
data["avatar_url"] = "https://seccdn.libravatar.org/avatar/..."
self.assertDictEqual(
data,
{
'flag': {
'comment': 'Tests failed',
'date_created': '1510742565',
'date_updated': '1510742565',
'percent': 0,
'pull_request_uid': '62b49f00d489452994de5010565fab81',
'status': 'failure',
'url': 'http://jenkins.cloud.fedoraproject.org/',
'user': {
'default_email': 'bar@pingou.com',
'emails': ['bar@pingou.com', 'foo@pingou.com'],
'fullname': 'PY C',
'name': 'pingou'
},
'username': 'Jenkins'},
'message': 'Flag added',
'uid': 'jenkins_build_pagure_100+seed',
'avatar_url': 'https://seccdn.libravatar.org/avatar/...',
'user': 'pingou'
}
)
# One flag added
self.session.commit()
request = pagure.lib.query.search_pull_requests(
self.session, project_id=1, requestid=1)
self.assertEqual(len(request.flags), 1)
self.assertEqual(request.flags[0].comment, 'Tests failed')
self.assertEqual(request.flags[0].percent, 0)
# no notifications sent
mock_email.assert_not_called()
def test_editing_flag(self):
""" Test flagging an existing PR without providing a status.
"""
headers = {'Authorization': 'token aaabbbcccddd'}
data = {
'username': 'Jenkins',
'status': 'failure',
'comment': 'Tests failed',
'url': 'http://jenkins.cloud.fedoraproject.org/',
'uid': 'jenkins_build_pagure_100+seed',
}
# Valid request - w/o providing the status
output = self.app.post(
'/api/0/test/pull-request/1/flag', data=data, headers=headers)
self.assertEqual(output.status_code, 200)
data = json.loads(output.get_data(as_text=True))
data['flag']['date_created'] = '1510742565'
data['flag']['date_updated'] = '1510742565'
data['flag']['pull_request_uid'] = '62b49f00d489452994de5010565fab81'
data["avatar_url"] = "https://seccdn.libravatar.org/avatar/..."
self.assertDictEqual(
data,
{
'flag': {
'comment': 'Tests failed',
'date_created': '1510742565',
'date_updated': '1510742565',
'percent': None,
'pull_request_uid': '62b49f00d489452994de5010565fab81',
'status': 'failure',
'url': 'http://jenkins.cloud.fedoraproject.org/',
'user': {
'default_email': 'bar@pingou.com',
'emails': ['bar@pingou.com', 'foo@pingou.com'],
'fullname': 'PY C',
'name': 'pingou'
},
'username': 'Jenkins'},
'message': 'Flag added',
'uid': 'jenkins_build_pagure_100+seed',
'avatar_url': 'https://seccdn.libravatar.org/avatar/...',
'user': 'pingou'
}
)
# One flag added
self.session.commit()
request = pagure.lib.query.search_pull_requests(
self.session, project_id=1, requestid=1)
self.assertEqual(len(request.flags), 1)
self.assertEqual(request.flags[0].comment, 'Tests failed')
self.assertEqual(request.flags[0].percent, None)
# Update flag
data = {
'username': 'Jenkins',
'percent': 100,
'comment': 'Tests passed',
'url': 'http://jenkins.cloud.fedoraproject.org/',
'uid': 'jenkins_build_pagure_100+seed',
'status': 'success',
}
output = self.app.post(
'/api/0/test/pull-request/1/flag', data=data, headers=headers)
self.assertEqual(output.status_code, 200)
data = json.loads(output.get_data(as_text=True))
data['flag']['date_created'] = '1510742565'
data['flag']['date_updated'] = '1510742565'
data['flag']['pull_request_uid'] = '62b49f00d489452994de5010565fab81'
data["avatar_url"] = "https://seccdn.libravatar.org/avatar/..."
self.assertDictEqual(
data,
{
'flag': {
'comment': 'Tests passed',
'date_created': '1510742565',
'date_updated': '1510742565',
'percent': 100,
'pull_request_uid': '62b49f00d489452994de5010565fab81',
'status': 'success',
'url': 'http://jenkins.cloud.fedoraproject.org/',
'user': {
'default_email': 'bar@pingou.com',
'emails': ['bar@pingou.com', 'foo@pingou.com'],
'fullname': 'PY C',
'name': 'pingou'
},
'username': 'Jenkins'},
'message': 'Flag updated',
'uid': 'jenkins_build_pagure_100+seed',
'avatar_url': 'https://seccdn.libravatar.org/avatar/...',
'user': 'pingou'
}
)
# Still only one flag
self.session.commit()
request = pagure.lib.query.search_pull_requests(
self.session, project_id=1, requestid=1)
self.assertEqual(len(request.flags), 1)
self.assertEqual(request.flags[0].comment, 'Tests passed')
self.assertEqual(request.flags[0].percent, 100)
class PagureFlaskApiGetPRFlagtests(tests.Modeltests):
""" Tests for the flask API of pagure for retrieving pull-requests flags
"""
maxDiff = None
@patch('pagure.lib.notify.send_email', MagicMock(return_value=True))
def setUp(self):
""" Set up the environnment, ran before every tests. """
super(PagureFlaskApiGetPRFlagtests, self).setUp()
pagure.config.config['REQUESTS_FOLDER'] = None
tests.create_projects(self.session)
tests.create_tokens(self.session)
tests.create_tokens_acl(self.session)
# Create a pull-request
repo = pagure.lib.query.get_authorized_project(self.session, 'test')
forked_repo = pagure.lib.query.get_authorized_project(self.session, 'test')
req = pagure.lib.query.new_pull_request(
session=self.session,
repo_from=forked_repo,
branch_from='master',
repo_to=repo,
branch_to='master',
title='test pull-request',
user='pingou',
)
self.session.commit()
self.assertEqual(req.id, 1)
self.assertEqual(req.title, 'test pull-request')
# Check flags before
self.session.commit()
request = pagure.lib.query.search_pull_requests(
self.session, project_id=1, requestid=1)
self.assertEqual(len(request.flags), 0)
def test_invalid_project(self):
""" Test the retrieving the flags of a PR on an invalid project. """
# Invalid project
output = self.app.get('/api/0/foo/pull-request/1/flag')
self.assertEqual(output.status_code, 404)
data = json.loads(output.get_data(as_text=True))
self.assertDictEqual(
data,
{
"error": "Project not found",
"error_code": "ENOPROJECT",
}
)
def test_pr_disabled(self):
""" Test the retrieving the flags of a PR when PRs are disabled. """
repo = pagure.lib.query.get_authorized_project(self.session, 'test')
settings = repo.settings
settings['pull_requests'] = False
repo.settings = settings
self.session.add(repo)
self.session.commit()
# PRs disabled
output = self.app.get('/api/0/test/pull-request/1/flag')
self.assertEqual(output.status_code, 404)
data = json.loads(output.get_data(as_text=True))
self.assertDictEqual(
data,
{
u'error': u'Pull-Request have been deactivated for this project',
u'error_code': u'EPULLREQUESTSDISABLED'
}
)
def test_no_pr(self):
""" Test the retrieving the flags of a PR when the PR doesn't exist. """
# No PR
output = self.app.get('/api/0/test/pull-request/10/flag')
self.assertEqual(output.status_code, 404)
data = json.loads(output.get_data(as_text=True))
self.assertDictEqual(
data,
{
"error": "Pull-Request not found",
"error_code": "ENOREQ",
}
)
def test_no_flag(self):
""" Test the retrieving the flags of a PR when the PR has no flags. """
# No flag
output = self.app.get('/api/0/test/pull-request/1/flag')
self.assertEqual(output.status_code, 200)
data = json.loads(output.get_data(as_text=True))
self.assertDictEqual(
data,
{"flags": []}
)
def test_get_flag(self):
""" Test the retrieving the flags of a PR when the PR has one flag. """
# Add a flag to the PR
request = pagure.lib.query.search_pull_requests(
self.session, project_id=1, requestid=1)
msg = pagure.lib.query.add_pull_request_flag(
session=self.session,
request=request,
username="jenkins",
percent=None,
comment="Build passes",
status='success',
url="http://jenkins.cloud.fedoraproject.org",
uid="jenkins_build_pagure_34",
user='foo',
token='aaabbbcccddd',
)
self.assertEqual(msg, ('Flag added', 'jenkins_build_pagure_34'))
self.session.commit()
self.assertEqual(len(request.flags), 1)
self.assertEqual(request.flags[0].token_id, 'aaabbbcccddd')
# 1 flag
output = self.app.get('/api/0/test/pull-request/1/flag')
self.assertEqual(output.status_code, 200)
data = json.loads(output.get_data(as_text=True))
data['flags'][0]['date_created'] = '1541413645'
data['flags'][0]['date_updated'] = '1541413645'
data['flags'][0]['pull_request_uid'] = '72a61033c2fc464aa9ef514c057aa62c'
self.assertDictEqual(
data,
{
'flags': [
{
'comment': 'Build passes',
'date_created': '1541413645',
'date_updated': '1541413645',
'percent': None,
'pull_request_uid': '72a61033c2fc464aa9ef514c057aa62c',
'status': 'success',
'url': 'http://jenkins.cloud.fedoraproject.org',
'user': {'fullname': 'foo bar', 'name': 'foo'},
'username': 'jenkins'
}
]
}
)
def test_get_flags(self):
""" Test the retrieving the flags of a PR when the PR has one flag. """
# Add two flags to the PR
request = pagure.lib.query.search_pull_requests(
self.session, project_id=1, requestid=1)
msg = pagure.lib.query.add_pull_request_flag(
session=self.session,
request=request,
username="jenkins",
percent=None,
comment="Build passes",
status='success',
url="http://jenkins.cloud.fedoraproject.org",
uid="jenkins_build_pagure_34",
user='foo',
token='aaabbbcccddd',
)
self.assertEqual(msg, ('Flag added', 'jenkins_build_pagure_34'))
self.session.commit()
msg = pagure.lib.query.add_pull_request_flag(
session=self.session,
request=request,
username="travis",
percent=None,
comment="Build pending",
status='pending',
url="http://travis.io",
uid="travis_build_pagure_34",
user='foo',
token='aaabbbcccddd',
)
self.assertEqual(msg, ('Flag added', 'travis_build_pagure_34'))
self.session.commit()
self.assertEqual(len(request.flags), 2)
self.assertEqual(request.flags[1].token_id, 'aaabbbcccddd')
self.assertEqual(request.flags[0].token_id, 'aaabbbcccddd')
# 1 flag
output = self.app.get('/api/0/test/pull-request/1/flag')
self.assertEqual(output.status_code, 200)
data = json.loads(output.get_data(as_text=True))
data['flags'][0]['date_created'] = '1541413645'
data['flags'][0]['date_updated'] = '1541413645'
data['flags'][0]['pull_request_uid'] = '72a61033c2fc464aa9ef514c057aa62c'
data['flags'][1]['date_created'] = '1541413645'
data['flags'][1]['date_updated'] = '1541413645'
data['flags'][1]['pull_request_uid'] = '72a61033c2fc464aa9ef514c057aa62c'
self.assertDictEqual(
data,
{
'flags': [
{
'comment': 'Build pending',
'date_created': '1541413645',
'date_updated': '1541413645',
'percent': None,
'pull_request_uid': '72a61033c2fc464aa9ef514c057aa62c',
'status': 'pending',
'url': 'http://travis.io',
'user': {'fullname': 'foo bar', 'name': 'foo'},
'username': 'travis'
},
{
'comment': 'Build passes',
'date_created': '1541413645',
'date_updated': '1541413645',
'percent': None,
'pull_request_uid': '72a61033c2fc464aa9ef514c057aa62c',
'status': 'success',
'url': 'http://jenkins.cloud.fedoraproject.org',
'user': {'fullname': 'foo bar', 'name': 'foo'},
'username': 'jenkins'
}
]
}
)
if __name__ == '__main__':
unittest.main(verbosity=2)