From a7717f0a1fbbfcd147c2e7bbc2d14bb549521daf Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Nov 14 2018 14:30:07 +0000 Subject: [PATCH 1/2] Let any contributor to a project update the PR meta-data Before this we were considering that only people with commit access could work on PR, but that's not quite true, we should let people with ticket access be able to triage PR as well and thus edit their meta-data. Fixes https://pagure.io/pagure/issue/3967 Signed-off-by: Pierre-Yves Chibon --- diff --git a/pagure/templates/repo_pull_request.html b/pagure/templates/repo_pull_request.html index 2f1bef1..da8d9a2 100644 --- a/pagure/templates/repo_pull_request.html +++ b/pagure/templates/repo_pull_request.html @@ -477,7 +477,7 @@
Metadata
{% if g.authenticated and mergeform - and (g.repo_committer + and (g.repo_user or g.fas_user.username == pull_request.user.user) %}
@@ -485,7 +485,7 @@
{% endif %}
- {% if g.authenticated and mergeform and g.repo_committer %} + {% if g.authenticated and mergeform and g.repo_user %} diff --git a/pagure/ui/fork.py b/pagure/ui/fork.py index c0c743e..9cdd84b 100644 --- a/pagure/ui/fork.py +++ b/pagure/ui/fork.py @@ -1377,7 +1377,7 @@ def update_pull_requests(repo, requestid, username=None, namespace=None): flask.abort(404, "Pull-request not found") if ( - not flask.g.repo_committer + not flask.g.repo_user and flask.g.fas_user.username != request.user.username ): flask.abort(403, "You are not allowed to update this pull-request") @@ -1401,7 +1401,7 @@ def update_pull_requests(repo, requestid, username=None, namespace=None): ) messages = messages.union(set(msgs)) - if flask.g.repo_committer: + if flask.g.repo_user: # Assign or update assignee of the ticket msg = pagure.lib.query.add_pull_request_assignee( flask.g.session, From 36bbd1e163107c29fa92352d1a4ae8f2a8e0ca59 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Nov 14 2018 14:30:07 +0000 Subject: [PATCH 2/2] Add tests to ensure any contributors can edit PR metadata For this we created a dedicated class of tests (for convenience) which led to moving the set_up_git_repo from being within the PagureFlaskForktests class to being accessible to the entire file. Signed-off-by: Pierre-Yves Chibon --- diff --git a/tests/test_pagure_flask_ui_fork.py b/tests/test_pagure_flask_ui_fork.py index 56231c0..957672e 100644 --- a/tests/test_pagure_flask_ui_fork.py +++ b/tests/test_pagure_flask_ui_fork.py @@ -56,36 +56,94 @@ def _get_commits(output): return commits -class PagureFlaskForktests(tests.Modeltests): - """ Tests for flask fork controller of pagure """ - - def set_up_git_repo( - self, new_project=None, branch_from='feature', mtype='FF', - prid=1, name_from='test'): - """ Set up the git repo and create the corresponding PullRequest - object. - """ - - # Create a git repo to play with - gitrepo = os.path.join(self.path, 'repos', '%s.git' % name_from) - repo = pygit2.init_repository(gitrepo, bare=True) +def set_up_git_repo( + session, path, new_project=None, branch_from='feature', mtype='FF', + prid=1, name_from='test'): + """ Set up the git repo and create the corresponding PullRequest + object. + """ + + # Create a git repo to play with + gitrepo = os.path.join(path, 'repos', '%s.git' % name_from) + repo = pygit2.init_repository(gitrepo, bare=True) + + newpath = tempfile.mkdtemp(prefix='pagure-fork-test') + repopath = os.path.join(newpath, 'test') + clone_repo = pygit2.clone_repository(gitrepo, repopath) + + # Create a file in that git repo + with open(os.path.join(repopath, 'sources'), 'w') as stream: + stream.write('foo\n bar') + clone_repo.index.add('sources') + clone_repo.index.write() + + try: + com = repo.revparse_single('HEAD') + prev_commit = [com.oid.hex] + except: + prev_commit = [] + + # Commits the files added + tree = clone_repo.index.write_tree() + author = pygit2.Signature( + 'Alice Author', 'alice@authors.tld') + committer = pygit2.Signature( + 'Cecil Committer', 'cecil@committers.tld') + clone_repo.create_commit( + 'refs/heads/master', # the name of the reference to update + author, + committer, + 'Add sources file for testing', + # binary string representing the tree object ID + tree, + # list of binary strings representing parents of the new commit + prev_commit + ) + time.sleep(1) + refname = 'refs/heads/master:refs/heads/master' + ori_remote = clone_repo.remotes[0] + PagureRepo.push(ori_remote, refname) + + first_commit = repo.revparse_single('HEAD') + + def compatible_signature(name, email): + if six.PY2: + name = name.encode("utf-8") + email = email.encode("utf-8") + return pygit2.Signature(name, email) + + if mtype == 'merge': + with open(os.path.join(repopath, '.gitignore'), 'w') as stream: + stream.write('*~') + clone_repo.index.add('.gitignore') + clone_repo.index.write() - newpath = tempfile.mkdtemp(prefix='pagure-fork-test') - repopath = os.path.join(newpath, 'test') - clone_repo = pygit2.clone_repository(gitrepo, repopath) + # Commits the files added + tree = clone_repo.index.write_tree() + author = compatible_signature( + 'Alice Äuthòr', 'alice@äuthòrs.tld') + comitter = compatible_signature( + 'Cecil Cõmmîttër', 'cecil@cõmmîttërs.tld') + clone_repo.create_commit( + 'refs/heads/master', + author, + committer, + 'Add .gitignore file for testing', + # binary string representing the tree object ID + tree, + # list of binary strings representing parents of the new commit + [first_commit.oid.hex] + ) + refname = 'refs/heads/master:refs/heads/master' + ori_remote = clone_repo.remotes[0] + PagureRepo.push(ori_remote, refname) - # Create a file in that git repo + if mtype == 'conflicts': with open(os.path.join(repopath, 'sources'), 'w') as stream: - stream.write('foo\n bar') + stream.write('foo\n bar\nbaz') clone_repo.index.add('sources') clone_repo.index.write() - try: - com = repo.revparse_single('HEAD') - prev_commit = [com.oid.hex] - except: - prev_commit = [] - # Commits the files added tree = clone_repo.index.write_tree() author = pygit2.Signature( @@ -93,133 +151,76 @@ class PagureFlaskForktests(tests.Modeltests): committer = pygit2.Signature( 'Cecil Committer', 'cecil@committers.tld') clone_repo.create_commit( - 'refs/heads/master', # the name of the reference to update + 'refs/heads/master', author, committer, - 'Add sources file for testing', + 'Add sources conflicting', # binary string representing the tree object ID tree, # list of binary strings representing parents of the new commit - prev_commit + [first_commit.oid.hex] ) - time.sleep(1) refname = 'refs/heads/master:refs/heads/master' ori_remote = clone_repo.remotes[0] PagureRepo.push(ori_remote, refname) - first_commit = repo.revparse_single('HEAD') + # Set the second repo - def compatible_signature(name, email): - if six.PY2: - name = name.encode("utf-8") - email = email.encode("utf-8") - return pygit2.Signature(name, email) + new_gitrepo = repopath + if new_project: + # Create a new git repo to play with + new_gitrepo = os.path.join(newpath, new_project.fullname) + if not os.path.exists(new_gitrepo): + os.makedirs(new_gitrepo) + new_repo = pygit2.clone_repository(gitrepo, new_gitrepo) - if mtype == 'merge': - with open(os.path.join(repopath, '.gitignore'), 'w') as stream: - stream.write('*~') - clone_repo.index.add('.gitignore') - clone_repo.index.write() - - # Commits the files added - tree = clone_repo.index.write_tree() - author = compatible_signature( - 'Alice Äuthòr', 'alice@äuthòrs.tld') - comitter = compatible_signature( - 'Cecil Cõmmîttër', 'cecil@cõmmîttërs.tld') - clone_repo.create_commit( - 'refs/heads/master', - author, - committer, - 'Add .gitignore file for testing', - # binary string representing the tree object ID - tree, - # list of binary strings representing parents of the new commit - [first_commit.oid.hex] - ) - refname = 'refs/heads/master:refs/heads/master' - ori_remote = clone_repo.remotes[0] - PagureRepo.push(ori_remote, refname) - - if mtype == 'conflicts': - with open(os.path.join(repopath, 'sources'), 'w') as stream: - stream.write('foo\n bar\nbaz') - clone_repo.index.add('sources') - clone_repo.index.write() - - # Commits the files added - tree = clone_repo.index.write_tree() - author = pygit2.Signature( - 'Alice Author', 'alice@authors.tld') - committer = pygit2.Signature( - 'Cecil Committer', 'cecil@committers.tld') - clone_repo.create_commit( - 'refs/heads/master', - author, - committer, - 'Add sources conflicting', - # binary string representing the tree object ID - tree, - # list of binary strings representing parents of the new commit - [first_commit.oid.hex] - ) - refname = 'refs/heads/master:refs/heads/master' - ori_remote = clone_repo.remotes[0] - PagureRepo.push(ori_remote, refname) - - # Set the second repo - - new_gitrepo = repopath - if new_project: - # Create a new git repo to play with - new_gitrepo = os.path.join(newpath, new_project.fullname) - if not os.path.exists(new_gitrepo): - os.makedirs(new_gitrepo) - new_repo = pygit2.clone_repository(gitrepo, new_gitrepo) - - repo = pygit2.Repository(new_gitrepo) - - if mtype != 'nochanges': - # Edit the sources file again - with open(os.path.join(new_gitrepo, 'sources'), 'w') as stream: - stream.write('foo\n bar\nbaz\n boose') - repo.index.add('sources') - repo.index.write() - - # Commits the files added - tree = repo.index.write_tree() - author = pygit2.Signature( - 'Alice Author', 'alice@authors.tld') - committer = pygit2.Signature( - 'Cecil Committer', 'cecil@committers.tld') - repo.create_commit( - 'refs/heads/%s' % branch_from, - author, - committer, - 'A commit on branch %s\n\nMore information' % branch_from, - tree, - [first_commit.oid.hex] - ) - refname = 'refs/heads/%s' % (branch_from) - ori_remote = repo.remotes[0] - PagureRepo.push(ori_remote, refname) + repo = pygit2.Repository(new_gitrepo) - # Create a PR for these changes - project = pagure.lib.query.get_authorized_project(self.session, 'test') - req = pagure.lib.query.new_pull_request( - session=self.session, - repo_from=project, - branch_from=branch_from, - repo_to=project, - branch_to='master', - title='PR from the %s branch' % branch_from, - user='pingou', + if mtype != 'nochanges': + # Edit the sources file again + with open(os.path.join(new_gitrepo, 'sources'), 'w') as stream: + stream.write('foo\n bar\nbaz\n boose') + repo.index.add('sources') + repo.index.write() + + # Commits the files added + tree = repo.index.write_tree() + author = pygit2.Signature( + 'Alice Author', 'alice@authors.tld') + committer = pygit2.Signature( + 'Cecil Committer', 'cecil@committers.tld') + repo.create_commit( + 'refs/heads/%s' % branch_from, + author, + committer, + 'A commit on branch %s\n\nMore information' % branch_from, + tree, + [first_commit.oid.hex] ) - self.session.commit() - self.assertEqual(req.id, prid) - self.assertEqual(req.title, 'PR from the %s branch' % branch_from) + refname = 'refs/heads/%s' % (branch_from) + ori_remote = repo.remotes[0] + PagureRepo.push(ori_remote, refname) - shutil.rmtree(newpath) + # Create a PR for these changes + project = pagure.lib.query.get_authorized_project(session, 'test') + req = pagure.lib.query.new_pull_request( + session=session, + repo_from=project, + branch_from=branch_from, + repo_to=project, + branch_to='master', + title='PR from the %s branch' % branch_from, + user='pingou', + ) + session.commit() + assert req.id == prid + assert req.title == 'PR from the %s branch' % branch_from + + shutil.rmtree(newpath) + + +class PagureFlaskForktests(tests.Modeltests): + """ Tests for flask fork controller of pagure """ def test_request_pull_reference(self): """ Test if there is a reference created for a new PR. """ @@ -228,7 +229,8 @@ class PagureFlaskForktests(tests.Modeltests): tests.create_projects_git( os.path.join(self.path, 'requests'), bare=True) - self.set_up_git_repo(new_project=None, branch_from='feature') + set_up_git_repo( + self.session, self.path, new_project=None, branch_from='feature') project = pagure.lib.query.get_authorized_project(self.session, 'test') self.assertEqual(len(project.requests), 1) @@ -237,9 +239,6 @@ class PagureFlaskForktests(tests.Modeltests): output = self.app.get('/test/pull-request/1') self.assertEqual(output.status_code, 200) - # Give time to the worker to process the task - time.sleep(1) - gitrepo = os.path.join(self.path, 'repos', 'test.git') repo = pygit2.Repository(gitrepo) self.assertEqual( @@ -264,7 +263,8 @@ class PagureFlaskForktests(tests.Modeltests): output = self.app.get('/test/pull-request/1') self.assertEqual(output.status_code, 404) - self.set_up_git_repo(new_project=None, branch_from='feature') + set_up_git_repo( + self.session, self.path, new_project=None, branch_from='feature') project = pagure.lib.query.get_authorized_project(self.session, 'test') self.assertEqual(len(project.requests), 1) @@ -302,7 +302,8 @@ class PagureFlaskForktests(tests.Modeltests): tests.create_projects_git( os.path.join(self.path, 'requests'), bare=True) - self.set_up_git_repo(new_project=None, branch_from='feature') + set_up_git_repo( + self.session, self.path, new_project=None, branch_from='feature') self.session = pagure.lib.query.create_session(self.dbpath) project = pagure.lib.query.get_authorized_project(self.session, 'test') @@ -385,7 +386,8 @@ class PagureFlaskForktests(tests.Modeltests): tests.create_projects(self.session) tests.create_projects_git( os.path.join(self.path, 'requests'), bare=True) - self.set_up_git_repo(new_project=None, branch_from='feature') + set_up_git_repo( + self.session, self.path, new_project=None, branch_from='feature') user = tests.FakeUser() user.username = 'pingou' @@ -480,7 +482,8 @@ class PagureFlaskForktests(tests.Modeltests): tests.create_projects(self.session) tests.create_projects_git( os.path.join(self.path, 'requests'), bare=True) - self.set_up_git_repo(new_project=None, branch_from='feature') + set_up_git_repo( + self.session, self.path, new_project=None, branch_from='feature') user = tests.FakeUser() user.username = 'pingou' project = pagure.lib.query.get_authorized_project(self.session, 'test') @@ -711,8 +714,9 @@ class PagureFlaskForktests(tests.Modeltests): tests.create_projects(self.session) tests.create_projects_git( os.path.join(self.path, 'requests'), bare=True) - self.set_up_git_repo( - new_project=None, branch_from='feature', mtype='merge') + set_up_git_repo( + self.session, self.path, new_project=None, + branch_from='feature', mtype='merge') user = tests.FakeUser() user.username = 'pingou' @@ -749,8 +753,9 @@ class PagureFlaskForktests(tests.Modeltests): tests.create_projects(self.session) tests.create_projects_git( os.path.join(self.path, 'requests'), bare=True) - self.set_up_git_repo( - new_project=None, branch_from='feature-branch', mtype='merge') + set_up_git_repo( + self.session, self.path, new_project=None, + branch_from='feature-branch', mtype='merge') user = tests.FakeUser() user.username = 'pingou' @@ -782,8 +787,9 @@ class PagureFlaskForktests(tests.Modeltests): tests.create_projects(self.session) tests.create_projects_git( os.path.join(self.path, 'requests'), bare=True) - self.set_up_git_repo( - new_project=None, branch_from='feature', mtype='conflicts') + set_up_git_repo( + self.session, self.path, new_project=None, + branch_from='feature', mtype='conflicts') user = tests.FakeUser() user.username = 'pingou' @@ -820,8 +826,9 @@ class PagureFlaskForktests(tests.Modeltests): tests.create_projects(self.session) tests.create_projects_git( os.path.join(self.path, 'requests'), bare=True) - self.set_up_git_repo( - new_project=None, branch_from='feature-branch', mtype='conflicts') + set_up_git_repo( + self.session, self.path, new_project=None, + branch_from='feature-branch', mtype='conflicts') user = tests.FakeUser() user.username = 'pingou' @@ -859,8 +866,9 @@ class PagureFlaskForktests(tests.Modeltests): tests.create_projects(self.session) tests.create_projects_git( os.path.join(self.path, 'requests'), bare=True) - self.set_up_git_repo( - new_project=None, branch_from='master', mtype='nochanges') + set_up_git_repo( + self.session, self.path, new_project=None, + branch_from='master', mtype='nochanges') user = tests.FakeUser() user.username = 'pingou' @@ -915,7 +923,8 @@ class PagureFlaskForktests(tests.Modeltests): tests.create_projects(self.session) tests.create_projects_git( os.path.join(self.path, 'requests'), bare=True) - self.set_up_git_repo(new_project=None, branch_from='feature') + set_up_git_repo( + self.session, self.path, new_project=None, branch_from='feature') # Project w/o pull-request repo = pagure.lib.query.get_authorized_project(self.session, 'test') @@ -1248,7 +1257,8 @@ class PagureFlaskForktests(tests.Modeltests): ' 0 Open PRs\n', output_text) - self.set_up_git_repo(new_project=None, branch_from='feature') + set_up_git_repo( + self.session, self.path, new_project=None, branch_from='feature') output = self.app.get('/test/pull-requests') self.assertEqual(output.status_code, 200) @@ -1315,8 +1325,9 @@ class PagureFlaskForktests(tests.Modeltests): tests.create_projects(self.session) tests.create_projects_git( os.path.join(self.path, 'requests'), bare=True) - self.set_up_git_repo( - new_project=None, branch_from='feature', mtype='merge') + set_up_git_repo( + self.session, self.path, new_project=None, + branch_from='feature', mtype='merge') output = self.app.get('/test/pull-request/100.patch') self.assertEqual(output.status_code, 404) @@ -1389,8 +1400,9 @@ index 9f44358..2a552bb 100644 tests.create_projects(self.session) tests.create_projects_git( os.path.join(self.path, 'requests'), bare=True) - self.set_up_git_repo( - new_project=None, branch_from='feature', mtype='merge') + set_up_git_repo( + self.session, self.path, new_project=None, + branch_from='feature', mtype='merge') output = self.app.get('/test/pull-request/100.diff') self.assertEqual(output.status_code, 404) @@ -1668,8 +1680,9 @@ index 0000000..2a552bb tests.create_projects(self.session) tests.create_projects_git( os.path.join(self.path, 'requests'), bare=True) - self.set_up_git_repo( - new_project=None, branch_from='feature', mtype='merge') + set_up_git_repo( + self.session, self.path, new_project=None, + branch_from='feature', mtype='merge') user = tests.FakeUser() with tests.user_set(self.app.application, user): @@ -1755,8 +1768,9 @@ index 0000000..2a552bb tests.create_projects(self.session) tests.create_projects_git( os.path.join(self.path, 'requests'), bare=True) - self.set_up_git_repo( - new_project=None, branch_from='feature', mtype='merge') + set_up_git_repo( + self.session, self.path, new_project=None, + branch_from='feature', mtype='merge') user = tests.FakeUser() with tests.user_set(self.app.application, user): @@ -1847,7 +1861,8 @@ index 0000000..2a552bb tests.create_projects(self.session) tests.create_projects_git( os.path.join(self.path, 'requests'), bare=True) - self.set_up_git_repo(new_project=None, branch_from='feature') + set_up_git_repo( + self.session, self.path, new_project=None, branch_from='feature') user = tests.FakeUser() user.username = 'pingou' @@ -2001,7 +2016,8 @@ index 0000000..2a552bb tests.create_projects(self.session) tests.create_projects_git( os.path.join(self.path, 'requests'), bare=True) - self.set_up_git_repo(new_project=None, branch_from='feature') + set_up_git_repo( + self.session, self.path, new_project=None, branch_from='feature') user = tests.FakeUser() user.username = 'pingou' @@ -2188,8 +2204,9 @@ index 0000000..2a552bb repo = pagure.lib.query.get_authorized_project(self.session, 'test') fork = pagure.lib.query.get_authorized_project(self.session, 'test', user='foo') - self.set_up_git_repo( - new_project=fork, branch_from='feature', mtype='FF') + set_up_git_repo( + self.session, self.path, new_project=fork, + branch_from='feature', mtype='FF') user = tests.FakeUser(username = 'pingou') with tests.user_set(self.app.application, user): @@ -2212,8 +2229,9 @@ index 0000000..2a552bb repo = pagure.lib.query.get_authorized_project(self.session, 'test') fork = pagure.lib.query.get_authorized_project(self.session, 'test', user='foo') - self.set_up_git_repo( - new_project=fork, branch_from='feature', mtype='FF') + set_up_git_repo( + self.session, self.path, new_project=fork, + branch_from='feature', mtype='FF') user = tests.FakeUser() user.username = 'foo' @@ -2334,8 +2352,9 @@ More information self.session.add(repo) self.session.commit() - self.set_up_git_repo( - new_project=fork, branch_from='feature', mtype='FF') + set_up_git_repo( + self.session, self.path, new_project=fork, + branch_from='feature', mtype='FF') user = tests.FakeUser() user.username = 'foo' @@ -2377,8 +2396,9 @@ More information self.session.add(repo) self.session.commit() - self.set_up_git_repo( - new_project=fork, branch_from='feature', mtype='FF') + set_up_git_repo( + self.session, self.path, new_project=fork, + branch_from='feature', mtype='FF') user = tests.FakeUser() user.username = 'pingou' @@ -2438,8 +2458,9 @@ More information repo = pagure.lib.query.get_authorized_project(self.session, 'test') fork = pagure.lib.query.get_authorized_project(self.session, 'test', user='foo') - self.set_up_git_repo( - new_project=fork, branch_from='feature', mtype='FF') + set_up_git_repo( + self.session, self.path, new_project=fork, + branch_from='feature', mtype='FF') user = tests.FakeUser() user.username = 'pingou' @@ -2529,8 +2550,9 @@ More information fork = pagure.lib.query.get_authorized_project( self.session, 'test', user='ralph') - self.set_up_git_repo( - new_project=fork, branch_from='feature', mtype='FF') + set_up_git_repo( + self.session, self.path, new_project=fork, + branch_from='feature', mtype='FF') # Try opening a pull-request output = self.app.get( @@ -2598,16 +2620,17 @@ More information self.session.commit() # Add some content to the parent - self.set_up_git_repo( - new_project=repo, branch_from='master', mtype='FF', - name_from=repo.fullname) + set_up_git_repo( + self.session, self.path, new_project=repo, + branch_from='master', mtype='FF', name_from=repo.fullname) fork = pagure.lib.query.get_authorized_project( self.session, 'test', user='ralph') - self.set_up_git_repo( - new_project=fork, branch_from='feature', mtype='FF', - prid=2, name_from=fork.fullname) + set_up_git_repo( + self.session, self.path, new_project=fork, + branch_from='feature', mtype='FF', prid=2, + name_from=fork.fullname) # Try opening a pull-request output = self.app.get( @@ -2691,16 +2714,19 @@ More information self.session.commit() # Add some content to the parents - self.set_up_git_repo( - new_project=repo, branch_from='master', mtype='FF') - self.set_up_git_repo( - new_project=repo, branch_from='master', mtype='FF', + set_up_git_repo( + self.session, self.path, new_project=repo, + branch_from='master', mtype='FF') + set_up_git_repo( + self.session, self.path, new_project=repo, + branch_from='master', mtype='FF', name_from=repo.fullname, prid=2) fork = pagure.lib.query.get_authorized_project( self.session, 'test', user='ralph') - self.set_up_git_repo( + set_up_git_repo( + self.session, self.path, new_project=fork, branch_from='feature', mtype='FF', prid=3, name_from=fork.fullname) @@ -2799,14 +2825,16 @@ More information self.session.commit() # Add some content to the parent - self.set_up_git_repo( + set_up_git_repo( + self.session, self.path, new_project=repo, branch_from='master', mtype='FF', name_from=repo.fullname) fork = pagure.lib.query.get_authorized_project( self.session, 'test2', user='ralph') - self.set_up_git_repo( + set_up_git_repo( + self.session, self.path, new_project=fork, branch_from='feature', mtype='FF', prid=2, name_from=fork.fullname) @@ -3258,9 +3286,8 @@ More information tests.create_projects_git( os.path.join(self.path, 'requests'), bare=True) - self.set_up_git_repo( - new_project=None, - branch_from='feature') + set_up_git_repo( + self.session, self.path, new_project=None, branch_from='feature') gitrepo = os.path.join(self.path, 'repos', 'test.git') repo = pygit2.init_repository(gitrepo, bare=True) @@ -3720,7 +3747,8 @@ More information tests.create_projects(self.session) tests.create_projects_git( os.path.join(self.path, 'requests'), bare=True) - self.set_up_git_repo(new_project=None, branch_from='feature') + set_up_git_repo( + self.session, self.path, new_project=None, branch_from='feature') pagure.lib.query.get_authorized_project(self.session, 'test') request = pagure.lib.query.search_pull_requests( self.session, requestid=1, project_id=1, @@ -3795,5 +3823,151 @@ More information self.assertIn('/login/', output.headers['Location']) +class TestTicketAccessEditPRMetadata(tests.Modeltests): + """ Tests that people with ticket access on a project can edit the + meta-data of a PR """ + + def setUp(self): + """ Set up the environnment, ran before every tests. """ + super(TestTicketAccessEditPRMetadata, self).setUp() + tests.create_projects(self.session) + tests.create_projects_git( + os.path.join(self.path, 'requests'), bare=True) + set_up_git_repo( + self.session, self.path, new_project=None, branch_from='feature') + + # Add user "foo" to the project "test" + repo = pagure.lib.query._get_project(self.session, 'test') + msg = pagure.lib.query.add_user_to_project( + session=self.session, + project=repo, + new_user='foo', + user='pingou', + access='ticket', + ) + self.session.commit() + self.assertEqual(msg, 'User added') + + def test_unauth_cannot_view_edit_metadata_ui(self): + """ Test that unauthenticated users cannot view the edit the + metadata fields in the UI. """ + + output = self.app.get('/test/pull-request/1') + self.assertEqual(output.status_code, 200) + output_text = output.get_data(as_text=True) + self.assertIn( + 'PR#1: PR from the feature branch - test\n' + ' - Pagure', output_text) + self.assertNotIn( + '', output_text) + self.assertNotIn( + '
', + output_text) + + def test_admin_can_view_edit_metadata_ui(self): + """ Test that admin users can view the edit the metadata fields in + the UI. """ + + user = tests.FakeUser(username='pingou') + with tests.user_set(self.app.application, user): + output = self.app.get('/test/pull-request/1') + self.assertEqual(output.status_code, 200) + output_text = output.get_data(as_text=True) + self.assertIn( + 'PR#1: PR from the feature branch - test\n' + ' - Pagure', output_text) + self.assertIn( + '', output_text) + self.assertIn( + '', + output_text) + + def test_admin_can_edit_metadata_ui(self): + """ Test that admin users can edit the metadata in the UI. """ + + user = tests.FakeUser(username='pingou') + with tests.user_set(self.app.application, user): + data = { + 'csrf_token': self.get_csrf(), + 'user': 'foo', + } + output = self.app.post( + '/test/pull-request/1/update', data=data, + follow_redirects=True) + self.assertEqual(output.status_code, 200) + output_text = output.get_data(as_text=True) + self.assertIn( + 'PR#1: PR from the feature branch - test\n' + ' - Pagure', output_text) + self.assertIn( + '', output_text) + self.assertIn( + '', + output_text) + self.assertIn( + '', output_text) + + def test_ticket_can_view_edit_metadata_ui(self): + """ Test that users with ticket access can view the edit the + metadata fields in the UI. """ + + user = tests.FakeUser(username='foo') + with tests.user_set(self.app.application, user): + output = self.app.get('/test/pull-request/1') + self.assertEqual(output.status_code, 200) + output_text = output.get_data(as_text=True) + self.assertIn( + 'PR#1: PR from the feature branch - test\n' + ' - Pagure', output_text) + self.assertIn( + '', output_text) + self.assertIn( + '', + output_text) + + def test_ticket_can_edit_metadata_ui(self): + """ Test that users with ticket access can edit the metadata in the + UI. """ + + user = tests.FakeUser(username='foo') + with tests.user_set(self.app.application, user): + data = { + 'csrf_token': self.get_csrf(), + 'user': 'pingou', + } + output = self.app.post( + '/test/pull-request/1/update', data=data, + follow_redirects=True) + self.assertEqual(output.status_code, 200) + output_text = output.get_data(as_text=True) + self.assertIn( + 'PR#1: PR from the feature branch - test\n' + ' - Pagure', output_text) + self.assertIn( + '', output_text) + self.assertIn( + '', + output_text) + self.assertIn( + '', output_text) + + if __name__ == '__main__': unittest.main(verbosity=2)