# -*- coding: utf-8 -*- """ (c) 2017 - Copyright Red Hat Inc Authors: Pierre-Yves Chibon """ from __future__ import unicode_literals, absolute_import import datetime 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.lib.query # noqa: E402 import tests # noqa: E402 class PagureFlaskApiIssueCreatetests(tests.Modeltests): """ Tests for the flask API of pagure for creating an issue """ @patch('pagure.lib.notify.send_email', MagicMock(return_value=True)) def setUp(self): """ Set up the environnment, ran before every tests. """ super(PagureFlaskApiIssueCreatetests, self).setUp() pagure.config.config['TICKETS_FOLDER'] = None tests.create_projects(self.session) tests.create_projects_git(os.path.join(self.path, 'tickets')) tests.create_tokens(self.session) tests.create_tokens_acl(self.session) # Create project-less token for user foo item = pagure.lib.model.Token( id='project-less-foo', user_id=2, project_id=None, expiration=datetime.datetime.utcnow() + datetime.timedelta(days=30) ) self.session.add(item) self.session.commit() tests.create_tokens_acl(self.session, token_id='project-less-foo') # Create project-specific token for user foo item = pagure.lib.model.Token( id='project-specific-foo', user_id=2, project_id=1, expiration=datetime.datetime.utcnow() + datetime.timedelta(days=30) ) self.session.add(item) self.session.commit() tests.create_tokens_acl( self.session, token_id='project-specific-foo') def test_create_issue_own_project_no_data(self): """ Test creating a new ticket on a project for which you're the main maintainer. """ # pingou's token with all the ACLs headers = {'Authorization': 'token aaabbbcccddd'} # Create an issue on /test/ where pingou is the main admin output = self.app.post('/api/0/test/new_issue', headers=headers) self.assertEqual(output.status_code, 400) data = json.loads(output.get_data(as_text=True)) self.assertEqual( pagure.api.APIERROR.EINVALIDREQ.name, data['error_code']) self.assertEqual( pagure.api.APIERROR.EINVALIDREQ.value, data['error']) self.assertEqual( data['errors'], { 'issue_content': ['This field is required.'], 'title': ['This field is required.'] } ) def test_create_issue_own_project_incomplete_data(self): """ Test creating a new ticket on a project for which you're the main maintainer. """ # pingou's token with all the ACLs headers = {'Authorization': 'token aaabbbcccddd'} # complete data set data = { 'title': 'test issue', } # Create an issue on /test/ where pingou is the main admin output = self.app.post( '/api/0/test/new_issue', headers=headers, data=data) self.assertEqual(output.status_code, 400) data = json.loads(output.get_data(as_text=True)) self.assertEqual( pagure.api.APIERROR.EINVALIDREQ.name, data['error_code']) self.assertEqual( pagure.api.APIERROR.EINVALIDREQ.value, data['error']) self.assertEqual( data['errors'], { 'issue_content': ['This field is required.'] } ) def test_create_issue_own_project(self): """ Test creating a new ticket on a project for which you're the main maintainer. """ # pingou's token with all the ACLs headers = {'Authorization': 'token aaabbbcccddd'} # complete data set data = { 'title': 'test issue', 'issue_content': 'This issue needs attention', } # Create an issue on /test/ where pingou is the main admin output = self.app.post( '/api/0/test/new_issue', headers=headers, data=data) self.assertEqual(output.status_code, 200) data = json.loads(output.get_data(as_text=True)) data['issue']['date_created'] = '1431414800' data['issue']['last_updated'] = '1431414800' self.assertEqual( data, { "issue": { "assignee": None, "blocks": [], "close_status": None, "closed_at": None, "closed_by": None, "comments": [], "content": "This issue needs attention", "custom_fields": [], "date_created": "1431414800", "depends": [], "id": 1, "last_updated": "1431414800", "milestone": None, "priority": None, "private": False, "status": "Open", "tags": [], "title": "test issue", "user": { "fullname": "PY C", "name": "pingou" } }, "message": "Issue created" } ) @patch('pagure.lib.notify.send_email', MagicMock(return_value=True)) def test_create_issue_someone_else_project_project_less_token(self): """ Test creating a new ticket on a project with which you have nothing to do. """ # pingou's token with all the ACLs headers = {'Authorization': 'token project-less-foo'} # complete data set data = { 'title': 'test issue', 'issue_content': 'This issue needs attention', } # Create an issue on /test/ where pingou is the main admin output = self.app.post( '/api/0/test/new_issue', headers=headers, data=data) self.assertEqual(output.status_code, 200) data = json.loads(output.get_data(as_text=True)) data['issue']['date_created'] = '1431414800' data['issue']['last_updated'] = '1431414800' self.assertEqual( data, { "issue": { "assignee": None, "blocks": [], "close_status": None, "closed_at": None, "closed_by": None, "comments": [], "content": "This issue needs attention", "custom_fields": [], "date_created": "1431414800", "depends": [], "id": 1, "last_updated": "1431414800", "milestone": None, "priority": None, "private": False, "status": "Open", "tags": [], "title": "test issue", "user": { "fullname": "foo bar", "name": "foo" } }, "message": "Issue created" } ) @patch('pagure.lib.notify.send_email', MagicMock(return_value=True)) def test_create_issue_project_specific_token(self): """ Test creating a new ticket on a project with a regular project-specific token. """ # pingou's token with all the ACLs headers = {'Authorization': 'token project-specific-foo'} # complete data set data = { 'title': 'test issue', 'issue_content': 'This issue needs attention', } # Create an issue on /test/ where pingou is the main admin output = self.app.post( '/api/0/test/new_issue', headers=headers, data=data) self.assertEqual(output.status_code, 200) data = json.loads(output.get_data(as_text=True)) data['issue']['date_created'] = '1431414800' data['issue']['last_updated'] = '1431414800' self.assertEqual( data, { "issue": { "assignee": None, "blocks": [], "close_status": None, "closed_at": None, "closed_by": None, "comments": [], "content": "This issue needs attention", "custom_fields": [], "date_created": "1431414800", "depends": [], "id": 1, "last_updated": "1431414800", "milestone": None, "priority": None, "private": False, "status": "Open", "tags": [], "title": "test issue", "user": { "fullname": "foo bar", "name": "foo" } }, "message": "Issue created" } ) @patch('pagure.lib.notify.send_email', MagicMock(return_value=True)) def test_create_issue_invalid_project_specific_token(self): """ Test creating a new ticket on a project with a regular project-specific token but for another project. """ # pingou's token with all the ACLs headers = {'Authorization': 'token project-specific-foo'} # complete data set data = { 'title': 'test issue', 'issue_content': 'This issue needs attention', } # Create an issue on /test/ where pingou is the main admin output = self.app.post( '/api/0/test2/new_issue', headers=headers, data=data) 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']) if __name__ == '__main__': unittest.main(verbosity=2)