# -*- 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, "related_prs": [], "status": "Open", "tags": [], "title": "test issue", "user": { "fullname": "PY C", "name": "pingou", "url_path": "user/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, "related_prs": [], "status": "Open", "tags": [], "title": "test issue", "user": { "fullname": "foo bar", "name": "foo", "url_path": "user/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, "related_prs": [], "status": "Open", "tags": [], "title": "test issue", "user": { "fullname": "foo bar", "name": "foo", "url_path": "user/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)