From b44e73974ab1e2e0a6f4b654f3c33086ac037f70 Mon Sep 17 00:00:00 2001 From: farhaanbukhsh Date: Apr 14 2017 10:32:36 +0000 Subject: [PATCH 1/94] Add Private Repo UI --- diff --git a/pagure/forms.py b/pagure/forms.py index 0ecae8a..25a0f30 100644 --- a/pagure/forms.py +++ b/pagure/forms.py @@ -130,6 +130,12 @@ class ProjectFormSimplified(PagureForm): wtforms.validators.Length(max=255), ] ) + private = wtforms.BooleanField( + 'Private', + [wtforms.validators.Optional()] + ) + + class ProjectForm(ProjectFormSimplified): diff --git a/pagure/templates/new_project.html b/pagure/templates/new_project.html index f7f67f5..b141ac9 100644 --- a/pagure/templates/new_project.html +++ b/pagure/templates/new_project.html @@ -20,6 +20,7 @@ {{ render_bootstrap_field(form.namespace, field_description="namespace of the project") }} {{ render_bootstrap_field(form.url, field_description="url of the project's website") }} {{ render_bootstrap_field(form.avatar_email, field_description="libravatar email address avatar email") }} + {{ render_bootstrap_field(form.private, field_description="To mark the repo private") }} {{ render_bootstrap_field(form.create_readme, field_description="Create a README file automatically") }} Date: Apr 14 2017 10:32:36 +0000 Subject: [PATCH 2/94] Add private repo support --- diff --git a/pagure/lib/__init__.py b/pagure/lib/__init__.py index de7815f..07e3d14 100644 --- a/pagure/lib/__init__.py +++ b/pagure/lib/__init__.py @@ -1328,6 +1328,7 @@ def new_project(session, user, name, blacklist, allowed_prefix, avatar_email=avatar_email if avatar_email else None, user_id=user_obj.id, parent_id=parent_id, + private=private, hook_token=pagure.lib.login.id_generator(40) ) session.add(project) @@ -1897,7 +1898,7 @@ def search_projects( session, username=None, fork=None, tags=None, namespace=None, pattern=None, start=None, limit=None, count=False, sort=None, - exclude_groups=None): + exclude_groups=None, private=None): '''List existing projects ''' projects = session.query( @@ -2015,6 +2016,24 @@ def search_projects( model.Project.id.in_(projects.subquery()) ) + if private is False: + query = query.filter( + model.Project.private == False + ) + elif isinstance(private, basestring): + user2 = aliased(model.User) + query = query.filter( + sqlalchemy.or_( + model.Project.private == False, + sqlalchemy.and_( + model.Project.private == True, + model.Project.user_id == user2.id, + user2.user == private, + ) + ) + ) + + if sort == 'latest': query = query.order_by( model.Project.date_created.desc() diff --git a/pagure/lib/model.py b/pagure/lib/model.py index 3bbf258..c60bb90 100644 --- a/pagure/lib/model.py +++ b/pagure/lib/model.py @@ -376,6 +376,7 @@ class Project(BASE): parent = relation('Project', remote_side=[id], backref='forks') user = relation('User', foreign_keys=[user_id], remote_side=[User.id], backref='projects') + private = sa.Column(sa.Boolean, nullable=False, default=False) users = relation( 'User', diff --git a/pagure/ui/app.py b/pagure/ui/app.py index ce0e38d..8ca08e0 100644 --- a/pagure/ui/app.py +++ b/pagure/ui/app.py @@ -47,6 +47,7 @@ def index(): fork=False, start=start, limit=limit, + private=False, sort=sorting) num_repos = pagure.lib.search_projects( @@ -93,27 +94,28 @@ def index_auth(): except ValueError: forkpage = 1 + private = flask.g.fas_user.username repos = pagure.lib.search_projects( SESSION, username=flask.g.fas_user.username, exclude_groups=APP.config.get('EXCLUDE_GROUP_INDEX'), - fork=False) + fork=False, private=private) repos_length = pagure.lib.search_projects( SESSION, username=flask.g.fas_user.username, exclude_groups=APP.config.get('EXCLUDE_GROUP_INDEX'), fork=False, - count=True) + count=True, private=private) forks = pagure.lib.search_projects( SESSION, username=flask.g.fas_user.username, - fork=True) + fork=True, private=private) forks_length = pagure.lib.search_projects( SESSION, username=flask.g.fas_user.username, fork=True, - count=True) + count=True, private=private) watch_list = pagure.lib.user_watch_list( SESSION, From 4e0a2c0dd5aebcb70b72f5622164f888dfe2daac Mon Sep 17 00:00:00 2001 From: farhaanbukhsh Date: Apr 14 2017 10:32:36 +0000 Subject: [PATCH 3/94] Fix more conditions --- diff --git a/pagure/ui/app.py b/pagure/ui/app.py index 8ca08e0..109128f 100644 --- a/pagure/ui/app.py +++ b/pagure/ui/app.py @@ -42,12 +42,17 @@ def index(): limit = APP.config['ITEM_PER_PAGE'] start = limit * (page - 1) + if authenticated(): + private = flask.g.fas_user.username + else: + private = False + repos = pagure.lib.search_projects( SESSION, fork=False, start=start, limit=limit, - private=False, + private=private, sort=sorting) num_repos = pagure.lib.search_projects( @@ -177,6 +182,11 @@ def view_users(username=None): users = pagure.lib.search_user(SESSION, pattern=username) + if authenticated(): + private = flask.g.fas_user.username + else: + private = False + if len(users) == 1: flask.flash('Only one result found, redirecting you to it') return flask.redirect( @@ -195,7 +205,7 @@ def view_users(username=None): SESSION, username=user.user, fork=False, - count=True) + count=True, private=private) forks_length = pagure.lib.search_projects( SESSION, @@ -240,12 +250,17 @@ def view_projects(pattern=None, namespace=None): else: forks = False + if authenticated(): + private = flask.g.fas_user.username + else: + private = False + limit = APP.config['ITEM_PER_PAGE'] start = limit * (page - 1) projects = pagure.lib.search_projects( SESSION, pattern=pattern, namespace=namespace, - fork=forks, start=start, limit=limit) + fork=forks, start=start, limit=limit, private=private) if len(projects) == 1: flask.flash('Only one result found, redirecting you to it') @@ -301,19 +316,26 @@ def view_user(username): repo_start = limit * (repopage - 1) fork_start = limit * (forkpage - 1) + if authenticated(): + private = flask.g.fas_user.username + else: + private = False + repos = pagure.lib.search_projects( SESSION, username=username, fork=False, exclude_groups=APP.config.get('EXCLUDE_GROUP_INDEX'), start=repo_start, - limit=limit) + limit=limit, + private=private) repos_length = pagure.lib.search_projects( SESSION, username=username, fork=False, exclude_groups=APP.config.get('EXCLUDE_GROUP_INDEX'), - count=True) + count=True, + private=private) forks = pagure.lib.search_projects( SESSION, @@ -426,7 +448,7 @@ def new_project(): pagure.lib.new_project( SESSION, name=name, - private = private, + private=private, description=description, namespace=namespace, url=url, From 3f2e6f7ac17ee42643a929b7cbea796c1872ac43 Mon Sep 17 00:00:00 2001 From: farhaanbukhsh Date: Apr 14 2017 10:32:36 +0000 Subject: [PATCH 4/94] Fix update project and update project UI --- diff --git a/pagure/templates/settings.html b/pagure/templates/settings.html index 80f9dc3..8894d29 100644 --- a/pagure/templates/settings.html +++ b/pagure/templates/settings.html @@ -41,6 +41,12 @@ tags for project (separated by commas) +
+
diff --git a/pagure/ui/app.py b/pagure/ui/app.py index 109128f..c58c5fc 100644 --- a/pagure/ui/app.py +++ b/pagure/ui/app.py @@ -211,7 +211,7 @@ def view_users(username=None): SESSION, username=user.user, fork=True, - count=True) + count=True, private=private) user.repos_length = repos_length user.forks_length = forks_length @@ -342,12 +342,14 @@ def view_user(username): username=username, fork=True, start=fork_start, - limit=limit) + limit=limit, + private=private) forks_length = pagure.lib.search_projects( SESSION, username=username, fork=True, - count=True) + count=True, + private=private) total_page_repos = int(ceil(repos_length / float(limit))) total_page_forks = int(ceil(forks_length / float(limit))) diff --git a/pagure/ui/repo.py b/pagure/ui/repo.py index afa0a17..cc71402 100644 --- a/pagure/ui/repo.py +++ b/pagure/ui/repo.py @@ -1140,6 +1140,7 @@ def update_project(repo, username=None, namespace=None): repo.description = form.description.data repo.avatar_email = form.avatar_email.data.strip() repo.url = form.url.data.strip() + repo.private = form.private.data pagure.lib.update_tags( SESSION, repo, tags=[t.strip() for t in form.tags.data.split(',')], From b25a08ffb62f9653e9c2d3cc65ce653c0e9f78c1 Mon Sep 17 00:00:00 2001 From: farhaanbukhsh Date: Apr 14 2017 10:32:36 +0000 Subject: [PATCH 5/94] Add alembic migration and clean code --- diff --git a/alembic/versions/4255158a6913_create_private_column_in_project_table.py b/alembic/versions/4255158a6913_create_private_column_in_project_table.py new file mode 100644 index 0000000..2e8211e --- /dev/null +++ b/alembic/versions/4255158a6913_create_private_column_in_project_table.py @@ -0,0 +1,30 @@ +"""Create private column in project table + +Revision ID: 4255158a6913 +Revises: 317a285e04a8 +Create Date: 2016-06-06 14:33:47.039207 + +""" + +# revision identifiers, used by Alembic. +revision = '4255158a6913' +down_revision = '317a285e04a8' + +from alembic import op +import sqlalchemy as sa + + +def upgrade(): + ''' Add a pivate column in the project table + ''' + op.add_column( + 'projects', + sa.Column('private', sa.Boolean, nullable=False, default=False) + ) + + + +def downgrade(): + ''' Remove the private column + ''' + op.drop_column('projects', 'private') diff --git a/pagure/forms.py b/pagure/forms.py index 25a0f30..2f27c05 100644 --- a/pagure/forms.py +++ b/pagure/forms.py @@ -136,8 +136,6 @@ class ProjectFormSimplified(PagureForm): ) - - class ProjectForm(ProjectFormSimplified): ''' Form to create or edit project. ''' name = wtforms.TextField( diff --git a/pagure/ui/app.py b/pagure/ui/app.py index c58c5fc..8dad4f6 100644 --- a/pagure/ui/app.py +++ b/pagure/ui/app.py @@ -110,17 +110,20 @@ def index_auth(): username=flask.g.fas_user.username, exclude_groups=APP.config.get('EXCLUDE_GROUP_INDEX'), fork=False, - count=True, private=private) + count=True, + private=private) forks = pagure.lib.search_projects( SESSION, username=flask.g.fas_user.username, - fork=True, private=private) + fork=True, + private=private) forks_length = pagure.lib.search_projects( SESSION, username=flask.g.fas_user.username, fork=True, - count=True, private=private) + count=True, + private=private) watch_list = pagure.lib.user_watch_list( SESSION, @@ -205,13 +208,15 @@ def view_users(username=None): SESSION, username=user.user, fork=False, - count=True, private=private) + count=True, + private=private) forks_length = pagure.lib.search_projects( SESSION, username=user.user, fork=True, - count=True, private=private) + count=True, + private=private) user.repos_length = repos_length user.forks_length = forks_length @@ -262,6 +267,7 @@ def view_projects(pattern=None, namespace=None): SESSION, pattern=pattern, namespace=namespace, fork=forks, start=start, limit=limit, private=private) + if len(projects) == 1: flask.flash('Only one result found, redirecting you to it') return flask.redirect(flask.url_for( From 4918203f84204cfa6f340036a4fb3bfbb7b27ae1 Mon Sep 17 00:00:00 2001 From: farhaanbukhsh Date: Apr 14 2017 10:32:36 +0000 Subject: [PATCH 6/94] Fix alembic script --- diff --git a/alembic/versions/4255158a6913_create_private_column_in_project_table.py b/alembic/versions/4255158a6913_create_private_column_in_project_table.py index 2e8211e..f489113 100644 --- a/alembic/versions/4255158a6913_create_private_column_in_project_table.py +++ b/alembic/versions/4255158a6913_create_private_column_in_project_table.py @@ -19,9 +19,15 @@ def upgrade(): ''' op.add_column( 'projects', - sa.Column('private', sa.Boolean, nullable=False, default=False) + sa.Column('_private', sa.Boolean, nullable=True, default=False) ) + op.execute('''UPDATE "projects" ''' + '''SET _private=False;''') + op.alter_column( + 'projects', + column_name='_private', new_column_name='private', + nullable=False, existing_nullable=True) def downgrade(): From a31ab32b332af1b3006a0e2bcdf0667e0e1c20b2 Mon Sep 17 00:00:00 2001 From: farhaanbukhsh Date: Apr 14 2017 10:32:36 +0000 Subject: [PATCH 7/94] Fix repo controller --- diff --git a/pagure/lib/__init__.py b/pagure/lib/__init__.py index 07e3d14..b94b72b 100644 --- a/pagure/lib/__init__.py +++ b/pagure/lib/__init__.py @@ -2088,6 +2088,23 @@ def get_project(session, name, user=None, namespace=None): model.Project.is_fork == False ) + if private is False: + query = query.filter( + model.Project.private == False + ) + elif isinstance(private, basestring): + user2 = aliased(model.User) + query = query.filter( + sqlalchemy.or_( + model.Project.private == False, + sqlalchemy.and_( + model.Project.private == True, + model.Project.user_id == user2.id, + user2.user == private, + ) + ) + ) + return query.first() diff --git a/pagure/ui/repo.py b/pagure/ui/repo.py index cc71402..4567e2a 100644 --- a/pagure/ui/repo.py +++ b/pagure/ui/repo.py @@ -79,6 +79,20 @@ def view_repo(repo, username=None, namespace=None): repo_db = flask.g.repo repo_obj = flask.g.repo_obj + if authenticated(): + private = flask.g.fas_user.username + else: + private = False + + repo = pagure.lib.get_project(SESSION, repo, user=username, private=private) + + if repo is None: + flask.abort(404, 'Project not found') + + reponame = pagure.get_repo_path(repo) + + repo_obj = pygit2.Repository(reponame) + if not repo_obj.is_empty and not repo_obj.head_is_unborn: head = repo_obj.head.shorthand else: @@ -140,10 +154,15 @@ def view_repo(repo, username=None, namespace=None): @APP.route('/fork////branch/') def view_repo_branch(repo, branchname, username=None, namespace=None): ''' Returns the list of branches in the repo. ''' + if authenticated(): + private = flask.g.fas_user.username + else: + private = False repo = flask.g.repo repo_obj = flask.g.repo_obj + if branchname not in repo_obj.listall_branches(): flask.abort(404, 'Branch not found') From 40a4ed615dfd62e2bf01606a1f027d8001ec8f7d Mon Sep 17 00:00:00 2001 From: farhaanbukhsh Date: Apr 14 2017 10:32:36 +0000 Subject: [PATCH 8/94] Fix repo controller --- diff --git a/pagure/lib/__init__.py b/pagure/lib/__init__.py index b94b72b..07e3d14 100644 --- a/pagure/lib/__init__.py +++ b/pagure/lib/__init__.py @@ -2088,23 +2088,6 @@ def get_project(session, name, user=None, namespace=None): model.Project.is_fork == False ) - if private is False: - query = query.filter( - model.Project.private == False - ) - elif isinstance(private, basestring): - user2 = aliased(model.User) - query = query.filter( - sqlalchemy.or_( - model.Project.private == False, - sqlalchemy.and_( - model.Project.private == True, - model.Project.user_id == user2.id, - user2.user == private, - ) - ) - ) - return query.first() diff --git a/pagure/ui/repo.py b/pagure/ui/repo.py index 4567e2a..dac407b 100644 --- a/pagure/ui/repo.py +++ b/pagure/ui/repo.py @@ -79,16 +79,23 @@ def view_repo(repo, username=None, namespace=None): repo_db = flask.g.repo repo_obj = flask.g.repo_obj - if authenticated(): - private = flask.g.fas_user.username - else: - private = False - - repo = pagure.lib.get_project(SESSION, repo, user=username, private=private) + repo = pagure.lib.get_project(SESSION, repo, user=username) if repo is None: flask.abort(404, 'Project not found') + users = [] + users.append(repo.user.username) + for user in repo.users: + users.append(user.username) + + auth_user = None + if authenticated(): + auth_user = flask.g.fas_user.username + + if repo.private and auth_user not in users: + flask.abort(403, 'Forbidden') + reponame = pagure.get_repo_path(repo) repo_obj = pygit2.Repository(reponame) @@ -154,15 +161,10 @@ def view_repo(repo, username=None, namespace=None): @APP.route('/fork////branch/') def view_repo_branch(repo, branchname, username=None, namespace=None): ''' Returns the list of branches in the repo. ''' - if authenticated(): - private = flask.g.fas_user.username - else: - private = False repo = flask.g.repo repo_obj = flask.g.repo_obj - if branchname not in repo_obj.listall_branches(): flask.abort(404, 'Branch not found') @@ -900,6 +902,9 @@ def view_forks(repo, username=None, namespace=None): """ repo = flask.g.repo + if not repo: + flask.abort(404, 'Project not found') + return flask.render_template( 'forks.html', select='forks', From 354dc10f97d408a19a5a9b78e0ba4ffe0357a85f Mon Sep 17 00:00:00 2001 From: farhaanbukhsh Date: Apr 14 2017 10:32:36 +0000 Subject: [PATCH 9/94] Fix UI issuses and authorization issues --- diff --git a/pagure/lib/__init__.py b/pagure/lib/__init__.py index 07e3d14..ec4f932 100644 --- a/pagure/lib/__init__.py +++ b/pagure/lib/__init__.py @@ -1994,6 +1994,7 @@ def search_projects( model.TagProject.tag.in_(tags) ) + if pattern: pattern = pattern.replace('*', '%') if '%' in pattern: @@ -2015,7 +2016,6 @@ def search_projects( ).filter( model.Project.id.in_(projects.subquery()) ) - if private is False: query = query.filter( model.Project.private == False @@ -2029,6 +2029,11 @@ def search_projects( model.Project.private == True, model.Project.user_id == user2.id, user2.user == private, + ), + sqlalchemy.and_( + model.Project.private == True, + model.Project.id == model.ProjectUser.project_id, + model.ProjectUser.user_id == user2.id, ) ) ) diff --git a/pagure/ui/app.py b/pagure/ui/app.py index 8dad4f6..38eb61e 100644 --- a/pagure/ui/app.py +++ b/pagure/ui/app.py @@ -20,7 +20,7 @@ import pagure.lib.git import pagure.forms import pagure.ui.filters from pagure import (APP, SESSION, login_required, - authenticated, + authenticated, is_repo_admin, admin_session_timedout) @@ -42,10 +42,7 @@ def index(): limit = APP.config['ITEM_PER_PAGE'] start = limit * (page - 1) - if authenticated(): - private = flask.g.fas_user.username - else: - private = False + private = False repos = pagure.lib.search_projects( SESSION, @@ -99,31 +96,30 @@ def index_auth(): except ValueError: forkpage = 1 - private = flask.g.fas_user.username repos = pagure.lib.search_projects( SESSION, username=flask.g.fas_user.username, exclude_groups=APP.config.get('EXCLUDE_GROUP_INDEX'), - fork=False, private=private) + fork=False, private=flask.g.fas_user.username) + repos_length = pagure.lib.search_projects( SESSION, username=flask.g.fas_user.username, exclude_groups=APP.config.get('EXCLUDE_GROUP_INDEX'), fork=False, - count=True, - private=private) + count=True) forks = pagure.lib.search_projects( SESSION, username=flask.g.fas_user.username, fork=True, - private=private) + private=flask.g.fas_user.username) + forks_length = pagure.lib.search_projects( SESSION, username=flask.g.fas_user.username, fork=True, - count=True, - private=private) + count=True) watch_list = pagure.lib.user_watch_list( SESSION, @@ -185,10 +181,9 @@ def view_users(username=None): users = pagure.lib.search_user(SESSION, pattern=username) + private = False if authenticated(): private = flask.g.fas_user.username - else: - private = False if len(users) == 1: flask.flash('Only one result found, redirecting you to it') @@ -254,11 +249,10 @@ def view_projects(pattern=None, namespace=None): select = 'projects_forks' else: forks = False + private = False if authenticated(): private = flask.g.fas_user.username - else: - private = False limit = APP.config['ITEM_PER_PAGE'] start = limit * (page - 1) @@ -322,10 +316,9 @@ def view_user(username): repo_start = limit * (repopage - 1) fork_start = limit * (forkpage - 1) + private = False if authenticated(): private = flask.g.fas_user.username - else: - private = False repos = pagure.lib.search_projects( SESSION, diff --git a/pagure/ui/repo.py b/pagure/ui/repo.py index dac407b..945c3e4 100644 --- a/pagure/ui/repo.py +++ b/pagure/ui/repo.py @@ -84,17 +84,8 @@ def view_repo(repo, username=None, namespace=None): if repo is None: flask.abort(404, 'Project not found') - users = [] - users.append(repo.user.username) - for user in repo.users: - users.append(user.username) - - auth_user = None - if authenticated(): - auth_user = flask.g.fas_user.username - - if repo.private and auth_user not in users: - flask.abort(403, 'Forbidden') + if repo.private and not is_repo_admin(repo): + flask.abort(401, 'Forbidden') reponame = pagure.get_repo_path(repo) @@ -902,9 +893,12 @@ def view_forks(repo, username=None, namespace=None): """ repo = flask.g.repo - if not repo: + if repo is None: flask.abort(404, 'Project not found') + if repo.private and not is_repo_admin(repo): + flask.abort(401, 'Forbidden') + return flask.render_template( 'forks.html', select='forks', @@ -1150,7 +1144,6 @@ def update_project(repo, username=None, namespace=None): flask.url_for('auth_login', next=url)) repo = flask.g.repo - if not flask.g.repo_admin: flask.abort( 403, @@ -1203,6 +1196,9 @@ def update_priorities(repo, username=None, namespace=None): repo = flask.g.repo + if repo.private and not is_repo_admin(repo): + flask.abort(401, 'Forbidden') + if not repo.settings.get('issue_tracker', True): flask.abort(404, 'No issue tracker found for this project') @@ -2238,6 +2234,9 @@ def view_docs(repo, username=None, filename=None, namespace=None): """ repo = flask.g.repo + if repo.private and not is_repo_admin(repo): + flask.abort(401, 'Forbidden') + if not APP.config.get('DOC_APP_URL'): flask.abort(404, 'This pagure instance has no doc server') @@ -2264,6 +2263,9 @@ def view_project_activity(repo, namespace=None): repo = flask.g.repo + if repo.private and not is_repo_admin(repo): + flask.abort(401, 'Forbidden') + return flask.render_template( 'activity.html', repo=repo, From 83ccf71700f060937c6f0518d3a3a78e631f230e Mon Sep 17 00:00:00 2001 From: farhaanbukhsh Date: Apr 14 2017 10:32:36 +0000 Subject: [PATCH 10/94] Fix variable change and default private --- diff --git a/pagure/ui/app.py b/pagure/ui/app.py index 38eb61e..bccbb16 100644 --- a/pagure/ui/app.py +++ b/pagure/ui/app.py @@ -42,14 +42,11 @@ def index(): limit = APP.config['ITEM_PER_PAGE'] start = limit * (page - 1) - private = False - repos = pagure.lib.search_projects( SESSION, fork=False, start=start, limit=limit, - private=private, sort=sorting) num_repos = pagure.lib.search_projects( @@ -107,7 +104,8 @@ def index_auth(): username=flask.g.fas_user.username, exclude_groups=APP.config.get('EXCLUDE_GROUP_INDEX'), fork=False, - count=True) + count=True, + private=flask.g.fas_user.usernam) forks = pagure.lib.search_projects( SESSION, @@ -119,7 +117,8 @@ def index_auth(): SESSION, username=flask.g.fas_user.username, fork=True, - count=True) + count=True, + private=flask.g.fas_user.username) watch_list = pagure.lib.user_watch_list( SESSION, diff --git a/pagure/ui/repo.py b/pagure/ui/repo.py index 945c3e4..8b34fd0 100644 --- a/pagure/ui/repo.py +++ b/pagure/ui/repo.py @@ -81,7 +81,7 @@ def view_repo(repo, username=None, namespace=None): repo = pagure.lib.get_project(SESSION, repo, user=username) - if repo is None: + if not repo: flask.abort(404, 'Project not found') if repo.private and not is_repo_admin(repo): @@ -893,7 +893,7 @@ def view_forks(repo, username=None, namespace=None): """ repo = flask.g.repo - if repo is None: + if not repo: flask.abort(404, 'Project not found') if repo.private and not is_repo_admin(repo): @@ -1144,6 +1144,7 @@ def update_project(repo, username=None, namespace=None): flask.url_for('auth_login', next=url)) repo = flask.g.repo + if not flask.g.repo_admin: flask.abort( 403, @@ -1714,9 +1715,10 @@ def add_user(repo, username=None, namespace=None): repo = flask.g.repo if not flask.g.repo_admin: - flask.abort( - 403, - 'You are not allowed to add users to this project') + flask.abort(404, 'Project not found') + + if repo.private and not is_repo_admin(repo): + flask.abort(401, 'Forbidden') user_to_update = flask.request.args.get('user', '').strip() user_to_update_obj = None @@ -2120,6 +2122,9 @@ def edit_file(repo, branchname, filename, username=None, namespace=None): 403, 'You are not allowed to change the settings for this project') + if repo.private and not is_repo_admin(repo): + flask.abort(401, 'Forbidden') + user = pagure.lib.search_user( SESSION, username=flask.g.fas_user.username) @@ -2234,7 +2239,7 @@ def view_docs(repo, username=None, filename=None, namespace=None): """ repo = flask.g.repo - if repo.private and not is_repo_admin(repo): + if repo.private and not is_repo_admin(repo_obj): flask.abort(401, 'Forbidden') if not APP.config.get('DOC_APP_URL'): From 2e21199c6277e8045051b93bfec7bab68336e757 Mon Sep 17 00:00:00 2001 From: farhaanbukhsh Date: Apr 14 2017 10:32:36 +0000 Subject: [PATCH 11/94] Fix variable change --- diff --git a/pagure/ui/repo.py b/pagure/ui/repo.py index 8b34fd0..d3175b6 100644 --- a/pagure/ui/repo.py +++ b/pagure/ui/repo.py @@ -2239,7 +2239,7 @@ def view_docs(repo, username=None, filename=None, namespace=None): """ repo = flask.g.repo - if repo.private and not is_repo_admin(repo_obj): + if repo_obj.private and not is_repo_admin(repo_obj): flask.abort(401, 'Forbidden') if not APP.config.get('DOC_APP_URL'): @@ -2268,7 +2268,7 @@ def view_project_activity(repo, namespace=None): repo = flask.g.repo - if repo.private and not is_repo_admin(repo): + if repo_obj.private and not is_repo_admin(repo_obj): flask.abort(401, 'Forbidden') return flask.render_template( From 4595eddf7f4e3c90c3b53a062f30eb1f102d4138 Mon Sep 17 00:00:00 2001 From: farhaanbukhsh Date: Apr 14 2017 10:32:36 +0000 Subject: [PATCH 12/94] Fix parameter --- diff --git a/pagure/ui/repo.py b/pagure/ui/repo.py index d3175b6..e47d172 100644 --- a/pagure/ui/repo.py +++ b/pagure/ui/repo.py @@ -893,12 +893,6 @@ def view_forks(repo, username=None, namespace=None): """ repo = flask.g.repo - if not repo: - flask.abort(404, 'Project not found') - - if repo.private and not is_repo_admin(repo): - flask.abort(401, 'Forbidden') - return flask.render_template( 'forks.html', select='forks', @@ -931,7 +925,6 @@ def view_tags(repo, username=None, namespace=None): @APP.route('//upload/', methods=('GET', 'POST')) -@APP.route('//upload', methods=('GET', 'POST')) @APP.route('///upload/', methods=('GET', 'POST')) @APP.route('///upload', methods=('GET', 'POST')) @APP.route('/fork///upload/', methods=('GET', 'POST')) @@ -1197,9 +1190,6 @@ def update_priorities(repo, username=None, namespace=None): repo = flask.g.repo - if repo.private and not is_repo_admin(repo): - flask.abort(401, 'Forbidden') - if not repo.settings.get('issue_tracker', True): flask.abort(404, 'No issue tracker found for this project') @@ -1715,10 +1705,9 @@ def add_user(repo, username=None, namespace=None): repo = flask.g.repo if not flask.g.repo_admin: - flask.abort(404, 'Project not found') - - if repo.private and not is_repo_admin(repo): - flask.abort(401, 'Forbidden') + flask.abort( + 403, + 'You are not allowed to add users to this project') user_to_update = flask.request.args.get('user', '').strip() user_to_update_obj = None @@ -2239,9 +2228,6 @@ def view_docs(repo, username=None, filename=None, namespace=None): """ repo = flask.g.repo - if repo_obj.private and not is_repo_admin(repo_obj): - flask.abort(401, 'Forbidden') - if not APP.config.get('DOC_APP_URL'): flask.abort(404, 'This pagure instance has no doc server') @@ -2268,9 +2254,6 @@ def view_project_activity(repo, namespace=None): repo = flask.g.repo - if repo_obj.private and not is_repo_admin(repo_obj): - flask.abort(401, 'Forbidden') - return flask.render_template( 'activity.html', repo=repo, From 141da6145aef0eb95e3e68cca92777cc564a8fcc Mon Sep 17 00:00:00 2001 From: farhaanbukhsh Date: Apr 14 2017 10:32:36 +0000 Subject: [PATCH 13/94] Fix header --- diff --git a/pagure/lib/__init__.py b/pagure/lib/__init__.py index ec4f932..ab72e7d 100644 --- a/pagure/lib/__init__.py +++ b/pagure/lib/__init__.py @@ -5,6 +5,7 @@ Authors: Pierre-Yves Chibon + Farhaan Bukhsh """ diff --git a/pagure/ui/app.py b/pagure/ui/app.py index bccbb16..a3df553 100644 --- a/pagure/ui/app.py +++ b/pagure/ui/app.py @@ -5,6 +5,7 @@ Authors: Pierre-Yves Chibon + Farhaan Bukhsh """ diff --git a/pagure/ui/repo.py b/pagure/ui/repo.py index e47d172..8df21a8 100644 --- a/pagure/ui/repo.py +++ b/pagure/ui/repo.py @@ -5,6 +5,7 @@ Authors: Pierre-Yves Chibon + Farhaan Bukhsh """ From e34335fac78286c36420d881ce71f35426394d1e Mon Sep 17 00:00:00 2001 From: farhaanbukhsh Date: Apr 14 2017 10:32:36 +0000 Subject: [PATCH 14/94] Fix typo --- diff --git a/pagure/ui/app.py b/pagure/ui/app.py index a3df553..3203a6e 100644 --- a/pagure/ui/app.py +++ b/pagure/ui/app.py @@ -106,7 +106,7 @@ def index_auth(): exclude_groups=APP.config.get('EXCLUDE_GROUP_INDEX'), fork=False, count=True, - private=flask.g.fas_user.usernam) + private=flask.g.fas_user.username) forks = pagure.lib.search_projects( SESSION, From 2e797aab1e25dafd09c828be9bd5fce60fc6a371 Mon Sep 17 00:00:00 2001 From: farhaanbukhsh Date: Apr 14 2017 10:32:36 +0000 Subject: [PATCH 15/94] Fix test delete_repo endpoint The changes in lib/__init__.py is to avoid the collision when `private` and `username` both are supplied the query was getting modified in such a way that fork was counted in fork and repo owned, this commit fix that by having a condition in which `username` is same as `private` --- diff --git a/pagure/lib/__init__.py b/pagure/lib/__init__.py index ab72e7d..e649192 100644 --- a/pagure/lib/__init__.py +++ b/pagure/lib/__init__.py @@ -1975,6 +1975,31 @@ def search_projects( projects = projects.union(sub_q2).union(sub_q3).union(sub_q4) + if private is False: + projects = projects.filter( + model.Project.private == False + ) + elif username == private: + projects = projects.filter( + sqlalchemy.or_( + model.Project.private == False, + model.Project.private == True, + ) + ) + elif isinstance(private, basestring): + projects = projects.filter( + sqlalchemy.or_( + model.Project.private == False, + sqlalchemy.and_( + model.User.user == private, + model.User.id == model.ProjectUser.user_id, + model.ProjectUser.project_id == model.Project.id, + model.Project.private == True, + ) + ) + + ) + if fork is not None: if fork is True: projects = projects.filter( @@ -2017,28 +2042,6 @@ def search_projects( ).filter( model.Project.id.in_(projects.subquery()) ) - if private is False: - query = query.filter( - model.Project.private == False - ) - elif isinstance(private, basestring): - user2 = aliased(model.User) - query = query.filter( - sqlalchemy.or_( - model.Project.private == False, - sqlalchemy.and_( - model.Project.private == True, - model.Project.user_id == user2.id, - user2.user == private, - ), - sqlalchemy.and_( - model.Project.private == True, - model.Project.id == model.ProjectUser.project_id, - model.ProjectUser.user_id == user2.id, - ) - ) - ) - if sort == 'latest': query = query.order_by( From 31df5156f2ab18849c370e53e8b34feeca0233b2 Mon Sep 17 00:00:00 2001 From: farhaanbukhsh Date: Apr 14 2017 10:32:36 +0000 Subject: [PATCH 16/94] Fix conditions --- diff --git a/pagure/lib/__init__.py b/pagure/lib/__init__.py index e649192..df4ebde 100644 --- a/pagure/lib/__init__.py +++ b/pagure/lib/__init__.py @@ -1975,11 +1975,11 @@ def search_projects( projects = projects.union(sub_q2).union(sub_q3).union(sub_q4) - if private is False: + if not private: projects = projects.filter( model.Project.private == False ) - elif username == private: + elif private == username: projects = projects.filter( sqlalchemy.or_( model.Project.private == False, From 3061f34ab39dd3eb5cdda73d1f1e02f5688e46c0 Mon Sep 17 00:00:00 2001 From: farhaanbukhsh Date: Apr 14 2017 10:32:36 +0000 Subject: [PATCH 17/94] Fix trailing space --- diff --git a/pagure/lib/__init__.py b/pagure/lib/__init__.py index df4ebde..0237880 100644 --- a/pagure/lib/__init__.py +++ b/pagure/lib/__init__.py @@ -1975,7 +1975,7 @@ def search_projects( projects = projects.union(sub_q2).union(sub_q3).union(sub_q4) - if not private: + if not private: projects = projects.filter( model.Project.private == False ) From 1df65f0a721ff75ac25cc2d9b61df362581170f9 Mon Sep 17 00:00:00 2001 From: farhaanbukhsh Date: Apr 14 2017 10:32:36 +0000 Subject: [PATCH 18/94] Add test for private repo --- diff --git a/tests/test_pagure_private_repo.py b/tests/test_pagure_private_repo.py new file mode 100644 index 0000000..796bb11 --- /dev/null +++ b/tests/test_pagure_private_repo.py @@ -0,0 +1,174 @@ +# -*- coding: utf-8 -*- + +__requires__ = ['SQLAlchemy >= 0.8'] +import pkg_resources + +import unittest +import shutil +import sys +import os + +import json +from mock import patch + +sys.path.insert(0, os.path.join(os.path.dirname( + os.path.abspath(__file__)), '..')) + +import pagure.lib +import tests + + +class PagurePrivateRepotest(tests.Modeltests): + """ Tests for private repo in pagure """ + + def setUp(self): + """ Set up the environnment, ran before every tests. """ + super(PagurePrivateRepotest, self).setUp() + + pagure.APP.config['TESTING'] = True + pagure.SESSION = self.session + pagure.ui.SESSION = self.session + pagure.ui.app.SESSION = self.session + pagure.ui.filters.SESSION = self.session + pagure.ui.repo.SESSION = self.session + + pagure.APP.config['GIT_FOLDER'] = tests.HERE + pagure.APP.config['FORK_FOLDER'] = os.path.join( + tests.HERE, 'forks') + pagure.APP.config['TICKETS_FOLDER'] = os.path.join( + tests.HERE, 'tickets') + pagure.APP.config['DOCS_FOLDER'] = os.path.join( + tests.HERE, 'docs') + pagure.APP.config['REQUESTS_FOLDER'] = os.path.join( + tests.HERE, 'requests') + self.app = pagure.APP.test_client() + + def test_index(self): + """ Test the index endpoint. """ + + output = self.app.get('/') + self.assertEqual(output.status_code, 200) + self.assertIn( + '

All Projects ' + '0

', output.data) + + tests.create_projects(self.session) + + # Add a private project + item = pagure.lib.model.Project( + user_id=2, # foo + name='test3', + description='test project description', + hook_token='aaabbbeee', + private=True, + ) + + self.session.add(item) + + # Add a public project + item = pagure.lib.model.Project( + user_id=2, # foo + name='test4', + description='test project description', + hook_token='aaabbbeeeccceee', + ) + + self.session.add(item) + self.session.commit() + + output = self.app.get('/?page=abc') + self.assertEqual(output.status_code, 200) + self.assertIn( + '

All Projects ' + '3

', output.data) + + user = tests.FakeUser(username='foo') + with tests.user_set(pagure.APP, user): + output = self.app.get('/?repopage=abc&forkpage=def') + self.assertIn( + 'Projects 2', + output.data) + self.assertIn( + 'Forks 0', + output.data) + self.assertEqual( + output.data.count('

No group found

'), 1) + self.assertEqual( + output.data.count('
'), 3) + + def test_view_user(self): + """ Test the view_user endpoint. """ + + output = self.app.get('/user/foo?repopage=abc&forkpage=def') + self.assertEqual(output.status_code, 200) + self.assertIn( + 'Projects 0', + output.data) + self.assertIn( + 'Forks 0', + output.data) + + # Add a private project + item = pagure.lib.model.Project( + user_id=2, # foo + name='test3', + description='test project description', + hook_token='aaabbbeee', + private=True, + ) + + self.session.add(item) + + # Add a public project + item = pagure.lib.model.Project( + user_id=2, # foo + name='test4', + description='test project description', + hook_token='aaabbbeeeccceee', + ) + + self.session.add(item) + self.session.commit() + + self.gitrepos = tests.create_projects_git( + pagure.APP.config['GIT_FOLDER']) + + output = self.app.get('/user/foo?repopage=abc&forkpage=def') + self.assertEqual(output.status_code, 200) + self.assertIn( + 'Projects 1', + output.data) + self.assertIn( + 'Forks 0', output.data) + + user = tests.FakeUser(username='foo') + with tests.user_set(pagure.APP, user): + output = self.app.get('/user/foo?repopage=abc&forkpage=def') + self.assertIn( + 'Projects 2', + output.data) + self.assertIn( + 'Forks 0', + output.data) + self.assertEqual( + output.data.count('

No group found

'), 1) + self.assertEqual( + output.data.count('
'), 3) + + user.username='pingou' + with tests.user_set(pagure.APP, user): + output = self.app.get('/user/foo?repopage=abc&forkpage=def') + self.assertIn( + 'Projects 1', + output.data) + self.assertIn( + 'Forks 0', + output.data) + self.assertEqual( + output.data.count('

No group found

'), 1) + self.assertEqual( + output.data.count('
'), 3) + +if __name__ == '__main__': + SUITE = unittest.TestLoader().loadTestsFromTestCase(PagurePrivateRepotest) + unittest.TextTestRunner(verbosity=2).run(SUITE) From 3604c1d967a3b4e3edc4cb9ea31f6144dc0df9c3 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Apr 14 2017 10:32:36 +0000 Subject: [PATCH 19/94] Check if the user authenticated is the one for whom we're viewing the repos Otherwise we do not want to include the private repos and those should remain hidden. This fixes the tests that we clean up a little as they also contained some checks that aren't needed since they are already elsewhere and here were cluttering a little the code. --- diff --git a/pagure/ui/app.py b/pagure/ui/app.py index 3203a6e..c145dae 100644 --- a/pagure/ui/app.py +++ b/pagure/ui/app.py @@ -182,7 +182,7 @@ def view_users(username=None): users = pagure.lib.search_user(SESSION, pattern=username) private = False - if authenticated(): + if authenticated() and username == flask.g.fas_user.username: private = flask.g.fas_user.username if len(users) == 1: @@ -317,7 +317,7 @@ def view_user(username): fork_start = limit * (forkpage - 1) private = False - if authenticated(): + if authenticated() and username == flask.g.fas_user.username: private = flask.g.fas_user.username repos = pagure.lib.search_projects( diff --git a/tests/test_pagure_private_repo.py b/tests/test_pagure_private_repo.py index 796bb11..343a3e1 100644 --- a/tests/test_pagure_private_repo.py +++ b/tests/test_pagure_private_repo.py @@ -26,6 +26,7 @@ class PagurePrivateRepotest(tests.Modeltests): super(PagurePrivateRepotest, self).setUp() pagure.APP.config['TESTING'] = True + pagure.APP.config['DATAGREPPER_URL'] = None pagure.SESSION = self.session pagure.ui.SESSION = self.session pagure.ui.app.SESSION = self.session @@ -84,9 +85,9 @@ class PagurePrivateRepotest(tests.Modeltests): user = tests.FakeUser(username='foo') with tests.user_set(pagure.APP, user): - output = self.app.get('/?repopage=abc&forkpage=def') + output = self.app.get('/') self.assertIn( - 'Projects 2', + 'My Projects 2', output.data) self.assertIn( 'Forks 0', @@ -133,7 +134,7 @@ class PagurePrivateRepotest(tests.Modeltests): self.gitrepos = tests.create_projects_git( pagure.APP.config['GIT_FOLDER']) - output = self.app.get('/user/foo?repopage=abc&forkpage=def') + output = self.app.get('/user/foo') self.assertEqual(output.status_code, 200) self.assertIn( 'Projects 1', @@ -143,7 +144,7 @@ class PagurePrivateRepotest(tests.Modeltests): user = tests.FakeUser(username='foo') with tests.user_set(pagure.APP, user): - output = self.app.get('/user/foo?repopage=abc&forkpage=def') + output = self.app.get('/user/foo') self.assertIn( 'Projects 2', output.data) @@ -157,7 +158,7 @@ class PagurePrivateRepotest(tests.Modeltests): user.username='pingou' with tests.user_set(pagure.APP, user): - output = self.app.get('/user/foo?repopage=abc&forkpage=def') + output = self.app.get('/user/foo') self.assertIn( 'Projects 1', output.data) @@ -169,6 +170,7 @@ class PagurePrivateRepotest(tests.Modeltests): self.assertEqual( output.data.count('
'), 3) + if __name__ == '__main__': SUITE = unittest.TestLoader().loadTestsFromTestCase(PagurePrivateRepotest) unittest.TextTestRunner(verbosity=2).run(SUITE) From c4f3294c5dfd4c6f4e3da1f3f2136c2a595bc7c4 Mon Sep 17 00:00:00 2001 From: farhaanbukhsh Date: Apr 14 2017 10:32:36 +0000 Subject: [PATCH 20/94] Add Test for UI and Pull request to Private Repo The following changes test if the Private repo checkbox is present in the UI for , the test for the Pull request is failing though. --- diff --git a/tests/test_pagure_private_repo.py b/tests/test_pagure_private_repo.py index 343a3e1..74e2b58 100644 --- a/tests/test_pagure_private_repo.py +++ b/tests/test_pagure_private_repo.py @@ -6,9 +6,11 @@ import pkg_resources import unittest import shutil import sys +import tempfile import os import json +import pygit2 from mock import patch sys.path.insert(0, os.path.join(os.path.dirname( @@ -16,6 +18,7 @@ sys.path.insert(0, os.path.join(os.path.dirname( import pagure.lib import tests +from pagure.lib.repo import PagureRepo class PagurePrivateRepotest(tests.Modeltests): @@ -44,6 +47,156 @@ class PagurePrivateRepotest(tests.Modeltests): tests.HERE, 'requests') self.app = pagure.APP.test_client() + def set_up_git_repo( + self, new_project=None, branch_from='feature', mtype='FF'): + """ Set up the git repo and create the corresponding PullRequest + object. + """ + + # Create a git repo to play with + gitrepo = os.path.join(tests.HERE, 'repos', 'test.git') + 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() + + # 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 + [] + ) + refname = 'refs/heads/master:refs/heads/master' + ori_remote = clone_repo.remotes[0] + PagureRepo.push(ori_remote, refname) + + first_commit = repo.revparse_single('HEAD') + + 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 = pygit2.Signature( + 'Alice Äuthòr', 'alice@äuthòrs.tld') + committer = pygit2.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' % branch_from, + tree, + [first_commit.oid.hex] + ) + refname = 'refs/heads/%s' % (branch_from) + ori_remote = repo.remotes[0] + PagureRepo.push(ori_remote, refname) + + # Create a PR for these changes + project = pagure.lib.get_project(self.session, 'pmc') + req = pagure.lib.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', + requestfolder=None, + ) + self.session.commit() + self.assertEqual(req.id, 1) + self.assertEqual(req.title, 'PR from the %s branch' % branch_from) + + shutil.rmtree(newpath) + + def test_index(self): """ Test the index endpoint. """ @@ -170,6 +323,73 @@ class PagurePrivateRepotest(tests.Modeltests): self.assertEqual( output.data.count('
'), 3) + @patch('pagure.ui.repo.admin_session_timedout') + def test_private_settings_ui(self, ast): + """ Test UI for private repo""" + + user = tests.FakeUser(username='pingou') + with tests.user_set(pagure.APP, user): + tests.create_projects(self.session) + tests.create_projects_git(tests.HERE) + + ast.return_value = False + output = self.app.post('/test/settings') + + self.assertEqual(output.status_code, 200) + self.assertIn( + '\n Projects 1', output.data) + self.assertIn( + 'Forks 0', + output.data) + + self.set_up_git_repo(new_project=None, branch_from='feature') + project = pagure.lib.get_project(self.session, 'pmc') + self.assertEqual(len(project.requests), 1) + + + output = self.app.get('/pmc/pull-request/1') + self.assertEqual(output.status_code, 200) + + # Check repo was created + user = tests.FakeUser() + with tests.user_set(pagure.APP, user): + output = self.app.get('/pmc/pull-requests') + self.assertEqual(output.status_code, 401) + + user = tests.FakeUser(username='pingou') + with tests.user_set(pagure.APP, user): + output = self.app.get('/pmc/pull-requests') + self.assertEqual(output.status_code, 401) + if __name__ == '__main__': SUITE = unittest.TestLoader().loadTestsFromTestCase(PagurePrivateRepotest) From 0163a133c02b46235f1b6a67c0601d48abc6b42f Mon Sep 17 00:00:00 2001 From: farhaanbukhsh Date: Apr 14 2017 10:32:36 +0000 Subject: [PATCH 21/94] Fix test private repo UI Priviously it was checking only the unchecked box, test condition is added to check if 'private repo' has the 'private' checkbox checked. --- diff --git a/tests/test_pagure_private_repo.py b/tests/test_pagure_private_repo.py index 74e2b58..a6db00c 100644 --- a/tests/test_pagure_private_repo.py +++ b/tests/test_pagure_private_repo.py @@ -327,6 +327,23 @@ class PagurePrivateRepotest(tests.Modeltests): def test_private_settings_ui(self, ast): """ Test UI for private repo""" + #Add private repo + item = pagure.lib.model.Project( + user_id=1, # pingou + name='test4', + description='test project description', + hook_token='aaabbbeeeceee', + private=True, + ) + self.session.add(item) + self.session.commit() + + # Add a git repo + repo_path = os.path.join(tests.HERE, 'test4.git') + if not os.path.exists(repo_path): + os.makedirs(repo_path) + pygit2.init_repository(repo_path) + user = tests.FakeUser(username='pingou') with tests.user_set(pagure.APP, user): tests.create_projects(self.session) @@ -335,10 +352,20 @@ class PagurePrivateRepotest(tests.Modeltests): ast.return_value = False output = self.app.post('/test/settings') + # Check for a public repo self.assertEqual(output.status_code, 200) self.assertIn( '', output.data) + + def test_private_pr(self): """Test pull request made to the private repo""" From fc046c334928b0c7ccef108c09fec61b96b10826 Mon Sep 17 00:00:00 2001 From: farhaanbukhsh Date: Apr 14 2017 10:32:36 +0000 Subject: [PATCH 22/94] Add test to check private checkbox UI --- diff --git a/tests/test_pagure_private_repo.py b/tests/test_pagure_private_repo.py index a6db00c..d0b52f4 100644 --- a/tests/test_pagure_private_repo.py +++ b/tests/test_pagure_private_repo.py @@ -365,6 +365,11 @@ class PagurePrivateRepotest(tests.Modeltests): self.assertIn( '', output.data) + # Check the new project form has 'private' checkbox + output = self.app.get('/new') + self.assertEqual(output.status_code, 200) + self.assertIn( + '', output.data) def test_private_pr(self): """Test pull request made to the private repo""" From 4ea512cdf6769e6fa6649c99a1d23bb86ed1c4da Mon Sep 17 00:00:00 2001 From: farhaanbukhsh Date: Apr 14 2017 10:32:36 +0000 Subject: [PATCH 23/94] Add change for PR --- diff --git a/tests/test_pagure_private_repo.py b/tests/test_pagure_private_repo.py index d0b52f4..b00072c 100644 --- a/tests/test_pagure_private_repo.py +++ b/tests/test_pagure_private_repo.py @@ -54,11 +54,11 @@ class PagurePrivateRepotest(tests.Modeltests): """ # Create a git repo to play with - gitrepo = os.path.join(tests.HERE, 'repos', 'test.git') + gitrepo = os.path.join(tests.HERE, 'repos', 'pmc.git') repo = pygit2.init_repository(gitrepo, bare=True) - newpath = tempfile.mkdtemp(prefix='pagure-fork-test') - repopath = os.path.join(newpath, 'test') + newpath = tempfile.mkdtemp(prefix='pagure-private-test') + repopath = os.path.join(newpath, 'pmc') clone_repo = pygit2.clone_repository(gitrepo, repopath) # Create a file in that git repo @@ -371,9 +371,11 @@ class PagurePrivateRepotest(tests.Modeltests): self.assertIn( '', output.data) - def test_private_pr(self): + @patch('pagure.lib.notify.send_email') + def test_private_pr(self, send_email): """Test pull request made to the private repo""" + send_email.return_value = True # Add a private project item = pagure.lib.model.Project( user_id=1, # pingou From 4858f8757ab4aca632c40095419bb54035d6007f Mon Sep 17 00:00:00 2001 From: farhaanbukhsh Date: Apr 14 2017 10:32:36 +0000 Subject: [PATCH 24/94] Fix GIT_FOLDER in test for private repo 'GIT_FOLDER' has to be set up properly to make 'repos' in a proper directoty --- diff --git a/tests/test_pagure_private_repo.py b/tests/test_pagure_private_repo.py index b00072c..e4d6f92 100644 --- a/tests/test_pagure_private_repo.py +++ b/tests/test_pagure_private_repo.py @@ -29,14 +29,22 @@ class PagurePrivateRepotest(tests.Modeltests): super(PagurePrivateRepotest, self).setUp() pagure.APP.config['TESTING'] = True - pagure.APP.config['DATAGREPPER_URL'] = None pagure.SESSION = self.session pagure.ui.SESSION = self.session + pagure.ui.repo.SESSION = self.session + pagure.ui.fork.SESSION = self.session + + pagure.APP.config['TESTING'] = True + pagure.SESSION = self.session + pagure.lib.SESSION = self.session + pagure.ui.SESSION = self.session pagure.ui.app.SESSION = self.session pagure.ui.filters.SESSION = self.session + pagure.ui.fork.SESSION = self.session pagure.ui.repo.SESSION = self.session + pagure.ui.issues.SESSION = self.session - pagure.APP.config['GIT_FOLDER'] = tests.HERE + pagure.APP.config['GIT_FOLDER'] = os.path.join(tests.HERE, 'repos') pagure.APP.config['FORK_FOLDER'] = os.path.join( tests.HERE, 'forks') pagure.APP.config['TICKETS_FOLDER'] = os.path.join( @@ -58,7 +66,7 @@ class PagurePrivateRepotest(tests.Modeltests): repo = pygit2.init_repository(gitrepo, bare=True) newpath = tempfile.mkdtemp(prefix='pagure-private-test') - repopath = os.path.join(newpath, 'pmc') + repopath = os.path.join(newpath, 'test') clone_repo = pygit2.clone_repository(gitrepo, repopath) # Create a file in that git repo @@ -339,7 +347,7 @@ class PagurePrivateRepotest(tests.Modeltests): self.session.commit() # Add a git repo - repo_path = os.path.join(tests.HERE, 'test4.git') + repo_path = os.path.join(pagure.APP.config.get('GIT_FOLDER'), 'test4.git') if not os.path.exists(repo_path): os.makedirs(repo_path) pygit2.init_repository(repo_path) @@ -347,7 +355,7 @@ class PagurePrivateRepotest(tests.Modeltests): user = tests.FakeUser(username='pingou') with tests.user_set(pagure.APP, user): tests.create_projects(self.session) - tests.create_projects_git(tests.HERE) + tests.create_projects_git(pagure.APP.config.get('GIT_FOLDER')) ast.return_value = False output = self.app.post('/test/settings') From 1432c14aeef6efa103c5d82b1962a8c67f4ee3ae Mon Sep 17 00:00:00 2001 From: farhaanbukhsh Date: Apr 14 2017 10:32:36 +0000 Subject: [PATCH 25/94] Fix test for pull-request for private repo This adds a repo in the 'tests/requests' and git init to make diff to the changes --- diff --git a/tests/test_pagure_private_repo.py b/tests/test_pagure_private_repo.py index e4d6f92..cbf48f7 100644 --- a/tests/test_pagure_private_repo.py +++ b/tests/test_pagure_private_repo.py @@ -400,6 +400,12 @@ class PagurePrivateRepotest(tests.Modeltests): tests.create_projects_git( os.path.join(tests.HERE, 'requests'), bare=True) + # Add a git repo + repo_path = os.path.join(pagure.APP.config.get('REQUESTS_FOLDER'), 'pmc.git') + if not os.path.exists(repo_path): + os.makedirs(repo_path) + pygit2.init_repository(repo_path, bare=True) + # Check repo was created user = tests.FakeUser(username='pingou') with tests.user_set(pagure.APP, user): @@ -430,7 +436,7 @@ class PagurePrivateRepotest(tests.Modeltests): user = tests.FakeUser(username='pingou') with tests.user_set(pagure.APP, user): output = self.app.get('/pmc/pull-requests') - self.assertEqual(output.status_code, 401) + self.assertEqual(output.status_code, 200) if __name__ == '__main__': From b6711ed43f839b646182120c2cf387a9d5812e43 Mon Sep 17 00:00:00 2001 From: farhaanbukhsh Date: Apr 14 2017 10:32:36 +0000 Subject: [PATCH 26/94] Add test for adding user to the private repo --- diff --git a/tests/test_pagure_private_repo.py b/tests/test_pagure_private_repo.py index cbf48f7..ae4705c 100644 --- a/tests/test_pagure_private_repo.py +++ b/tests/test_pagure_private_repo.py @@ -292,6 +292,7 @@ class PagurePrivateRepotest(tests.Modeltests): self.session.add(item) self.session.commit() + self.gitrepos = tests.create_projects_git( pagure.APP.config['GIT_FOLDER']) @@ -331,6 +332,30 @@ class PagurePrivateRepotest(tests.Modeltests): self.assertEqual( output.data.count('
'), 3) + repo = pagure.lib.get_project(self.session, 'test3') + msg = pagure.lib.add_user_to_project( + session=self.session, + project=repo, + new_user='pingou', + user='foo', + ) + self.assertEqual(msg, 'User added') + + # New user added to private projects + user.username='pingou' + with tests.user_set(pagure.APP, user): + output = self.app.get('/') + self.assertIn( + 'My Projects 1', + output.data) + self.assertIn( + 'Forks 0', + output.data) + self.assertEqual( + output.data.count('

No group found

'), 1) + self.assertEqual( + output.data.count('
'), 3) + @patch('pagure.ui.repo.admin_session_timedout') def test_private_settings_ui(self, ast): """ Test UI for private repo""" @@ -352,6 +377,7 @@ class PagurePrivateRepotest(tests.Modeltests): os.makedirs(repo_path) pygit2.init_repository(repo_path) + user = tests.FakeUser(username='pingou') with tests.user_set(pagure.APP, user): tests.create_projects(self.session) From fa203eeeb4ea5d8f0a370d2c050bedadb56cc871 Mon Sep 17 00:00:00 2001 From: farhaanbukhsh Date: Apr 14 2017 10:32:36 +0000 Subject: [PATCH 27/94] Fix duplicate lines --- diff --git a/tests/test_pagure_private_repo.py b/tests/test_pagure_private_repo.py index ae4705c..2a942a8 100644 --- a/tests/test_pagure_private_repo.py +++ b/tests/test_pagure_private_repo.py @@ -28,11 +28,6 @@ class PagurePrivateRepotest(tests.Modeltests): """ Set up the environnment, ran before every tests. """ super(PagurePrivateRepotest, self).setUp() - pagure.APP.config['TESTING'] = True - pagure.SESSION = self.session - pagure.ui.SESSION = self.session - pagure.ui.repo.SESSION = self.session - pagure.ui.fork.SESSION = self.session pagure.APP.config['TESTING'] = True pagure.SESSION = self.session From b909de9811c90b08f6e0035ce6baf0aff8658265 Mon Sep 17 00:00:00 2001 From: farhaanbukhsh Date: Apr 14 2017 10:32:36 +0000 Subject: [PATCH 28/94] Fix pep8 conventions --- diff --git a/tests/test_pagure_private_repo.py b/tests/test_pagure_private_repo.py index 2a942a8..0e4daa8 100644 --- a/tests/test_pagure_private_repo.py +++ b/tests/test_pagure_private_repo.py @@ -28,7 +28,6 @@ class PagurePrivateRepotest(tests.Modeltests): """ Set up the environnment, ran before every tests. """ super(PagurePrivateRepotest, self).setUp() - pagure.APP.config['TESTING'] = True pagure.SESSION = self.session pagure.lib.SESSION = self.session @@ -199,7 +198,6 @@ class PagurePrivateRepotest(tests.Modeltests): shutil.rmtree(newpath) - def test_index(self): """ Test the index endpoint. """ @@ -287,7 +285,6 @@ class PagurePrivateRepotest(tests.Modeltests): self.session.add(item) self.session.commit() - self.gitrepos = tests.create_projects_git( pagure.APP.config['GIT_FOLDER']) @@ -313,7 +310,7 @@ class PagurePrivateRepotest(tests.Modeltests): self.assertEqual( output.data.count('
'), 3) - user.username='pingou' + user.username = 'pingou' with tests.user_set(pagure.APP, user): output = self.app.get('/user/foo') self.assertIn( @@ -328,16 +325,17 @@ class PagurePrivateRepotest(tests.Modeltests): output.data.count('
'), 3) repo = pagure.lib.get_project(self.session, 'test3') - msg = pagure.lib.add_user_to_project( + + msg = pagure.lib.add_user_to_project( session=self.session, project=repo, new_user='pingou', user='foo', ) - self.assertEqual(msg, 'User added') + self.assertEqual(msg, 'User added') # New user added to private projects - user.username='pingou' + user.username = 'pingou' with tests.user_set(pagure.APP, user): output = self.app.get('/') self.assertIn( @@ -355,7 +353,7 @@ class PagurePrivateRepotest(tests.Modeltests): def test_private_settings_ui(self, ast): """ Test UI for private repo""" - #Add private repo + # Add private repo item = pagure.lib.model.Project( user_id=1, # pingou name='test4', @@ -367,12 +365,12 @@ class PagurePrivateRepotest(tests.Modeltests): self.session.commit() # Add a git repo - repo_path = os.path.join(pagure.APP.config.get('GIT_FOLDER'), 'test4.git') + repo_path = os.path.join( + pagure.APP.config.get('GIT_FOLDER'), 'test4.git') if not os.path.exists(repo_path): os.makedirs(repo_path) pygit2.init_repository(repo_path) - user = tests.FakeUser(username='pingou') with tests.user_set(pagure.APP, user): tests.create_projects(self.session) @@ -422,7 +420,8 @@ class PagurePrivateRepotest(tests.Modeltests): os.path.join(tests.HERE, 'requests'), bare=True) # Add a git repo - repo_path = os.path.join(pagure.APP.config.get('REQUESTS_FOLDER'), 'pmc.git') + repo_path = os.path.join( + pagure.APP.config.get('REQUESTS_FOLDER'), 'pmc.git') if not os.path.exists(repo_path): os.makedirs(repo_path) pygit2.init_repository(repo_path, bare=True) @@ -444,7 +443,6 @@ class PagurePrivateRepotest(tests.Modeltests): project = pagure.lib.get_project(self.session, 'pmc') self.assertEqual(len(project.requests), 1) - output = self.app.get('/pmc/pull-request/1') self.assertEqual(output.status_code, 200) From 420a97f4907da0e57adb813685f3587fd9cd93c7 Mon Sep 17 00:00:00 2001 From: farhaanbukhsh Date: Apr 14 2017 10:32:36 +0000 Subject: [PATCH 29/94] Add test for issues to private repo and changes to fix those test The test ensures that issues made to private repo are viewed by only the owner or added user to the repo. Changes in 'ui/issues.py' are made to put a check that new issues can only be created by the authorize owner and all CRUD operation on issues to a private repo can and should only be carried out by the authorize owner of the repo. --- diff --git a/tests/test_pagure_private_repo.py b/tests/test_pagure_private_repo.py index 0e4daa8..efec9b4 100644 --- a/tests/test_pagure_private_repo.py +++ b/tests/test_pagure_private_repo.py @@ -457,6 +457,82 @@ class PagurePrivateRepotest(tests.Modeltests): output = self.app.get('/pmc/pull-requests') self.assertEqual(output.status_code, 200) + @patch('pagure.lib.git.update_git') + @patch('pagure.lib.notify.send_email') + def test_private_repo_issues_ui(self, p_send_email, p_ugt): + """ Test issues made to private repo""" + p_send_email.return_value = True + p_ugt.return_value = True + + # Add private repo + item = pagure.lib.model.Project( + user_id=1, # pingou + name='test4', + description='test project description', + hook_token='aaabbbeeeceee', + private=True, + ) + self.session.add(item) + self.session.commit() + + # Add a git repo + repo_path = os.path.join( + pagure.APP.config.get('GIT_FOLDER'), 'test4.git') + if not os.path.exists(repo_path): + os.makedirs(repo_path) + pygit2.init_repository(repo_path) + + # Add a git repo + repo_path = os.path.join( + pagure.APP.config.get('TICKETS_FOLDER'), 'test4.git') + if not os.path.exists(repo_path): + os.makedirs(repo_path) + pygit2.init_repository(repo_path, bare=True) + + # Check if the private repo issues are publicly accesible + output = self.app.get('/test4/issues') + self.assertEqual(output.status_code, 401) + + # Create issues to play with + repo = pagure.lib.get_project(self.session, 'test4') + msg = pagure.lib.new_issue( + session=self.session, + repo=repo, + title='Test issue', + content='We should work on this', + user='pingou', + ticketfolder=None + ) + self.session.commit() + self.assertEqual(msg.title, 'Test issue') + + user = tests.FakeUser() + with tests.user_set(pagure.APP, user): + + # Whole list + output = self.app.get('/test4/issues') + self.assertEqual(output.status_code, 401) + + # Check single issue + output = self.app.get('/test4/issue/1') + self.assertEqual(output.status_code, 401) + + + + user = tests.FakeUser(username='pingou') + with tests.user_set(pagure.APP, user): + + # Whole list + output = self.app.get('/test4/issues') + self.assertEqual(output.status_code, 200) + self.assertIn('Issues - test4 - Pagure', output.data) + self.assertTrue( + '

\n 1 Open Issues' in output.data) + + # Check single issue + output = self.app.get('/test4/issue/1') + self.assertEqual(output.status_code, 200) + if __name__ == '__main__': SUITE = unittest.TestLoader().loadTestsFromTestCase(PagurePrivateRepotest) From f889f7b41be8294f9d185c59e9ed1bcde964211b Mon Sep 17 00:00:00 2001 From: farhaanbukhsh Date: Apr 14 2017 10:32:36 +0000 Subject: [PATCH 30/94] Add test to check issues and pull-request This change specifically test the view of issue and pull-request when a user is added a private repo. --- diff --git a/tests/test_pagure_private_repo.py b/tests/test_pagure_private_repo.py index efec9b4..c183aa0 100644 --- a/tests/test_pagure_private_repo.py +++ b/tests/test_pagure_private_repo.py @@ -415,6 +415,17 @@ class PagurePrivateRepotest(tests.Modeltests): self.session.add(item) self.session.commit() + repo = pagure.lib.get_project(self.session, 'pmc') + + msg = pagure.lib.add_user_to_project( + session=self.session, + project=repo, + new_user='foo', + user='pingou', + ) + self.session.commit() + self.assertEqual(msg, 'User added') + # Create all the git repos tests.create_projects_git( os.path.join(tests.HERE, 'requests'), bare=True) @@ -457,6 +468,11 @@ class PagurePrivateRepotest(tests.Modeltests): output = self.app.get('/pmc/pull-requests') self.assertEqual(output.status_code, 200) + user = tests.FakeUser(username='foo') + with tests.user_set(pagure.APP, user): + output = self.app.get('/pmc/pull-requests') + self.assertEqual(output.status_code, 200) + @patch('pagure.lib.git.update_git') @patch('pagure.lib.notify.send_email') def test_private_repo_issues_ui(self, p_send_email, p_ugt): @@ -533,6 +549,31 @@ class PagurePrivateRepotest(tests.Modeltests): output = self.app.get('/test4/issue/1') self.assertEqual(output.status_code, 200) + repo = pagure.lib.get_project(self.session, 'test4') + + msg = pagure.lib.add_user_to_project( + session=self.session, + project=repo, + new_user='foo', + user='pingou', + ) + self.session.commit() + self.assertEqual(msg, 'User added') + + user.username='foo' + with tests.user_set(pagure.APP, user): + + # Whole list + output = self.app.get('/test4/issues') + self.assertEqual(output.status_code, 200) + self.assertIn('Issues - test4 - Pagure', output.data) + self.assertTrue( + '

\n 1 Open Issues' in output.data) + + # Check single issue + output = self.app.get('/test4/issue/1') + self.assertEqual(output.status_code, 200) + if __name__ == '__main__': SUITE = unittest.TestLoader().loadTestsFromTestCase(PagurePrivateRepotest) From 9ea58a1b7aa841342c7da59394ba8c8b928f9bb9 Mon Sep 17 00:00:00 2001 From: farhaanbukhsh Date: Apr 14 2017 10:32:36 +0000 Subject: [PATCH 31/94] Add check for repo admin when repo is private These changes in 'ui/fork' and 'ui/issue' puts a check to the user that he/she has to be a repo_admin to view the project when repo is private. Hence all the functionalities specified will work only when user is the owner of the project. --- diff --git a/pagure/ui/fork.py b/pagure/ui/fork.py index 45befbc..99b1779 100644 --- a/pagure/ui/fork.py +++ b/pagure/ui/fork.py @@ -260,6 +260,9 @@ def request_pull_patch(repo, requestid, username=None, namespace=None): """ repo = flask.g.repo + if repo.private and not is_repo_admin(repo): + flask.abort(401, 'Forbidden') + if not repo.settings.get('pull_requests', True): flask.abort(404, 'No pull-requests found for this project') @@ -350,6 +353,9 @@ def request_pull_edit(repo, requestid, username=None, namespace=None): repo = flask.g.repo + if repo.private and not is_repo_admin(repo): + flask.abort(401, 'Forbidden') + if not repo.settings.get('pull_requests', True): flask.abort(404, 'No pull-requests found for this project') @@ -424,6 +430,9 @@ def pull_request_add_comment( """ repo = flask.g.repo + if repo.private and not is_repo_admin(repo): + flask.abort(401, 'Forbidden') + if not repo.settings.get('pull_requests', True): flask.abort(404, 'No pull-requests found for this project') @@ -519,6 +528,9 @@ def pull_request_drop_comment( """ repo = flask.g.repo + if repo.private and not is_repo_admin(repo): + flask.abort(401, 'Forbidden') + if not repo.settings.get('pull_requests', True): flask.abort(404, 'No pull-requests found for this project') @@ -591,6 +603,9 @@ def pull_request_edit_comment( project = flask.g.repo + if project.private and not is_repo_admin(project): + flask.abort(401, 'Forbidden') + if not project.settings.get('pull_requests', True): flask.abort(404, 'No pull-requests found for this project') @@ -691,6 +706,9 @@ def merge_request_pull(repo, requestid, username=None, namespace=None): repo = flask.g.repo + if repo.private and not is_repo_admin(repo): + flask.abort(401, 'Forbidden') + if not repo.settings.get('pull_requests', True): flask.abort(404, 'No pull-requests found for this project') @@ -822,6 +840,9 @@ def set_assignee_requests(repo, requestid, username=None, namespace=None): ''' Assign a pull-request. ''' repo = flask.g.repo + if repo.private and not is_repo_admin(repo): + flask.abort(401, 'Forbidden') + if not repo.settings.get('pull_requests', True): flask.abort(404, 'No pull-request allowed on this project') @@ -952,6 +973,9 @@ def new_request_pull( repo = flask.g.repo + if repo.private and not is_repo_admin(repo): + flask.abort(401, 'Forbidden') + parent = repo if repo.parent: parent = repo.parent @@ -1104,6 +1128,9 @@ def new_remote_request_pull(repo, username=None, namespace=None): repo = flask.g.repo + if repo.private and not is_repo_admin(repo): + flask.abort(401, 'Forbidden') + if not repo.settings.get('pull_requests', True): flask.abort(404, 'No pull-request allowed on this project') diff --git a/pagure/ui/issues.py b/pagure/ui/issues.py index e90937b..c52f290 100644 --- a/pagure/ui/issues.py +++ b/pagure/ui/issues.py @@ -73,6 +73,9 @@ def update_issue(repo, issueid, username=None, namespace=None): repo = flask.g.repo + if repo.private and not is_repo_admin(repo): + flask.abort(401, 'Forbidden') + if flask.request.method == 'GET': if not is_js: flask.flash('Invalid method: GET', 'error') @@ -625,6 +628,9 @@ def view_issues(repo, username=None, namespace=None): repo = flask.g.repo + if repo.private and not is_repo_admin(repo): + flask.abort(401, 'Forbidden') + if not repo.settings.get('issue_tracker', True): flask.abort(404, 'No issue tracker found for this project') @@ -759,6 +765,9 @@ def view_roadmap(repo, username=None, namespace=None): repo = flask.g.repo + if repo.private and is_repo_admin(repo): + flask.abort(401, 'Forbidden') + if not repo.settings.get('issue_tracker', True): flask.abort(404, 'No issue tracker found for this project') @@ -877,6 +886,9 @@ def new_issue(repo, username=None, namespace=None): """ repo = flask.g.repo + if repo.private and is_repo_admin(repo): + flask.abort(401, 'Forbidden') + if not repo.settings.get('issue_tracker', True): flask.abort(404, 'No issue tracker found for this project') @@ -1000,6 +1012,9 @@ def view_issue(repo, issueid, username=None, namespace=None): repo = flask.g.repo + if repo.private and not is_repo_admin(repo): + flask.abort(401, 'Forbidden') + if not repo.settings.get('issue_tracker', True): flask.abort(404, 'No issue tracker found for this project') @@ -1064,6 +1079,9 @@ def delete_issue(repo, issueid, username=None, namespace=None): repo = flask.g.repo + if repo.private and not is_repo_admin(repo): + flask.abort(401, 'Forbidden') + if not repo.settings.get('issue_tracker', True): flask.abort(404, 'No issue tracker found for this project') @@ -1122,6 +1140,9 @@ def edit_issue(repo, issueid, username=None, namespace=None): """ repo = flask.g.repo + if repo.private and not is_repo_admin(repo): + flask.abort(401, 'Forbidden') + if not repo.settings.get('issue_tracker', True): flask.abort(404, 'No issue tracker found for this project') @@ -1247,6 +1268,9 @@ def upload_issue(repo, issueid, username=None, namespace=None): ''' repo = flask.g.repo + if repo.private and not is_repo_admin(repo): + flask.abort(401, 'Forbidden') + if not repo.settings.get('issue_tracker', True): flask.abort(404, 'No issue tracker found for this project') @@ -1312,6 +1336,9 @@ def view_issue_raw_file( repo = flask.g.repo + if repo.private and not is_repo_admin(repo): + flask.abort(401, 'Forbidden') + if not repo.settings.get('issue_tracker', True): flask.abort(404, 'No issue tracker found for this project') @@ -1399,6 +1426,9 @@ def edit_comment_issue( project = flask.g.repo + if project.private and not is_repo_admin(project): + flask.abort(401, 'Forbidden') + if not project.settings.get('issue_tracker', True): flask.abort(404, 'No issue tracker found for this project') From 60d4459a46e17d9226ccae0490962dfc241119e6 Mon Sep 17 00:00:00 2001 From: farhaanbukhsh Date: Apr 14 2017 10:32:36 +0000 Subject: [PATCH 32/94] Add check for api endpoint for private repo The check in api endpoint to fetch tags of a repo, a condition is introducet keeping the nature of the request as 'GET' and test case is written accordingly. Basically to fetch tag of a private user user needs to be logged in. If not then the is_repo_condition will fail and no projects will be returned. A new error code needs to be introduced since now we have projecsts which can or cannot be accessible to the user. --- diff --git a/pagure/api/project.py b/pagure/api/project.py index d866029..e2477c7 100644 --- a/pagure/api/project.py +++ b/pagure/api/project.py @@ -15,7 +15,7 @@ from sqlalchemy.exc import SQLAlchemyError import pagure import pagure.exceptions import pagure.lib -from pagure import SESSION, APP +from pagure import SESSION, APP, is_repo_admin from pagure.api import API, api_method, APIERROR, api_login_required @@ -54,6 +54,9 @@ def api_git_tags(repo, username=None, namespace=None): repo = pagure.lib.get_project( SESSION, repo, user=username, namespace=namespace) + if repo.private and not is_repo_admin(repo): + raise pagure.exceptions.APIError(403, error_code=APIERROR.EPROJECTNOTALLOWED) + if repo is None: raise pagure.exceptions.APIError(404, error_code=APIERROR.ENOPROJECT) diff --git a/tests/test_pagure_private_repo.py b/tests/test_pagure_private_repo.py index c183aa0..d6d6694 100644 --- a/tests/test_pagure_private_repo.py +++ b/tests/test_pagure_private_repo.py @@ -3,6 +3,7 @@ __requires__ = ['SQLAlchemy >= 0.8'] import pkg_resources +import datetime import unittest import shutil import sys @@ -37,6 +38,8 @@ class PagurePrivateRepotest(tests.Modeltests): pagure.ui.fork.SESSION = self.session pagure.ui.repo.SESSION = self.session pagure.ui.issues.SESSION = self.session + pagure.api.SESSION = self.session + pagure.api.project.SESSION = self.session pagure.APP.config['GIT_FOLDER'] = os.path.join(tests.HERE, 'repos') pagure.APP.config['FORK_FOLDER'] = os.path.join( @@ -574,6 +577,95 @@ class PagurePrivateRepotest(tests.Modeltests): output = self.app.get('/test4/issue/1') self.assertEqual(output.status_code, 200) + def test_api_private_repo(self): + """ Test api points for private repo""" + + # Add private repo + item = pagure.lib.model.Project( + user_id=1, # pingou + name='test4', + description='test project description', + hook_token='aaabbbeeeceee', + private=True, + ) + self.session.add(item) + self.session.commit() + + # Create a git repo to play with + gitrepo = os.path.join(tests.HERE, 'repos', 'test4.git') + repo = pygit2.init_repository(gitrepo, bare=True) + + newpath = tempfile.mkdtemp(prefix='pagure-fork-test') + repopath = os.path.join(newpath, 'test4') + 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() + + # 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 + [] + ) + refname = 'refs/heads/master:refs/heads/master' + ori_remote = clone_repo.remotes[0] + PagureRepo.push(ori_remote, refname) + + # Tag our first commit + first_commit = repo.revparse_single('HEAD') + tagger = pygit2.Signature('Alice Doe', 'adoe@example.com', 12347, 0) + repo.create_tag( + "0.0.1", first_commit.oid.hex, pygit2.GIT_OBJ_COMMIT, tagger, + "Release 0.0.1") + + # Create a token for foo for this project + item = pagure.lib.model.Token( + id='foobar_token', + user_id=1, + project_id=1, + expiration=datetime.datetime.utcnow() + datetime.timedelta( + days=30) + ) + self.session.add(item) + self.session.commit() + item = pagure.lib.model.TokenAcl( + token_id='foobar_token', + acl_id=3, + ) + self.session.add(item) + self.session.commit() + + + # Check tags + output = self.app.get('/api/0/test4/git/tags') + self.assertEqual(output.status_code, 403) + + user = tests.FakeUser(username='pingou') + with tests.user_set(pagure.APP, user): + + output = self.app.get('/api/0/test4/git/tags') + self.assertEqual(output.status_code, 200) + data = json.loads(output.data) + self.assertDictEqual( + data, + {'tags': ['0.0.1'], 'total_tags': 1} + ) + + shutil.rmtree(newpath) if __name__ == '__main__': SUITE = unittest.TestLoader().loadTestsFromTestCase(PagurePrivateRepotest) From d5992203aee5cc63ec63324cd4d14202b959f675 Mon Sep 17 00:00:00 2001 From: farhaanbukhsh Date: Apr 14 2017 10:32:36 +0000 Subject: [PATCH 33/94] Fix pep 8 issues and remove duplication --- diff --git a/pagure/api/project.py b/pagure/api/project.py index e2477c7..e60ba1f 100644 --- a/pagure/api/project.py +++ b/pagure/api/project.py @@ -54,12 +54,12 @@ def api_git_tags(repo, username=None, namespace=None): repo = pagure.lib.get_project( SESSION, repo, user=username, namespace=namespace) - if repo.private and not is_repo_admin(repo): - raise pagure.exceptions.APIError(403, error_code=APIERROR.EPROJECTNOTALLOWED) - if repo is None: raise pagure.exceptions.APIError(404, error_code=APIERROR.ENOPROJECT) + if repo.private and not is_repo_admin(repo): + raise pagure.exceptions.APIError(404, error_code=APIERROR.ENOPROJECT) + tags = pagure.lib.git.get_git_tags(repo) jsonout = flask.jsonify({ diff --git a/tests/test_pagure_private_repo.py b/tests/test_pagure_private_repo.py index d6d6694..61d0d9f 100644 --- a/tests/test_pagure_private_repo.py +++ b/tests/test_pagure_private_repo.py @@ -327,6 +327,21 @@ class PagurePrivateRepotest(tests.Modeltests): self.assertEqual( output.data.count('
'), 3) + # Check pingou has 0 projects + user.username = 'pingou' + with tests.user_set(pagure.APP, user): + output = self.app.get('/') + self.assertIn( + 'My Projects 0', + output.data) + self.assertIn( + 'Forks 0', + output.data) + self.assertEqual( + output.data.count('

No group found

'), 1) + self.assertEqual( + output.data.count('
'), 3) + repo = pagure.lib.get_project(self.session, 'test3') msg = pagure.lib.add_user_to_project( @@ -494,19 +509,13 @@ class PagurePrivateRepotest(tests.Modeltests): self.session.add(item) self.session.commit() - # Add a git repo - repo_path = os.path.join( - pagure.APP.config.get('GIT_FOLDER'), 'test4.git') - if not os.path.exists(repo_path): - os.makedirs(repo_path) - pygit2.init_repository(repo_path) - - # Add a git repo - repo_path = os.path.join( - pagure.APP.config.get('TICKETS_FOLDER'), 'test4.git') - if not os.path.exists(repo_path): - os.makedirs(repo_path) - pygit2.init_repository(repo_path, bare=True) + for repo in ['GIT_FOLDER', 'TICKETS_FOLDER']: + # Add a git repo + repo_path = os.path.join( + pagure.APP.config.get(repo), 'test4.git') + if not os.path.exists(repo_path): + os.makedirs(repo_path) + pygit2.init_repository(repo_path) # Check if the private repo issues are publicly accesible output = self.app.get('/test4/issues') @@ -536,17 +545,16 @@ class PagurePrivateRepotest(tests.Modeltests): output = self.app.get('/test4/issue/1') self.assertEqual(output.status_code, 401) - - user = tests.FakeUser(username='pingou') with tests.user_set(pagure.APP, user): # Whole list output = self.app.get('/test4/issues') self.assertEqual(output.status_code, 200) - self.assertIn('Issues - test4 - Pagure', output.data) + self.assertIn( + 'Issues - test4 - Pagure', output.data) self.assertTrue( - '

\n 1 Open Issues' in output.data) + '

\n 1 Open Issues' in output.data) # Check single issue output = self.app.get('/test4/issue/1') @@ -563,15 +571,16 @@ class PagurePrivateRepotest(tests.Modeltests): self.session.commit() self.assertEqual(msg, 'User added') - user.username='foo' + user.username = 'foo' with tests.user_set(pagure.APP, user): # Whole list output = self.app.get('/test4/issues') self.assertEqual(output.status_code, 200) - self.assertIn('Issues - test4 - Pagure', output.data) + self.assertIn( + 'Issues - test4 - Pagure', output.data) self.assertTrue( - '

\n 1 Open Issues' in output.data) + '

\n 1 Open Issues' in output.data) # Check single issue output = self.app.get('/test4/issue/1') @@ -644,26 +653,26 @@ class PagurePrivateRepotest(tests.Modeltests): self.session.commit() item = pagure.lib.model.TokenAcl( token_id='foobar_token', - acl_id=3, + acl_id=1, ) self.session.add(item) self.session.commit() - + # Check if you are admin + headers = {'Authorization': 'token foobar_token'} # Check tags - output = self.app.get('/api/0/test4/git/tags') - self.assertEqual(output.status_code, 403) - - user = tests.FakeUser(username='pingou') - with tests.user_set(pagure.APP, user): + output = self.app.get('/api/0/test4/git/tags', headers=headers) + self.assertEqual(output.status_code, 200) + data = json.loads(output.data) + self.assertDictEqual( + data, + {'tags': ['0.0.1'], 'total_tags': 1} + ) - output = self.app.get('/api/0/test4/git/tags') - self.assertEqual(output.status_code, 200) - data = json.loads(output.data) - self.assertDictEqual( - data, - {'tags': ['0.0.1'], 'total_tags': 1} - ) + # Check with wrong token + headers = {'Authorization': 'token hello'} + output = self.app.get('/api/0/test4/git/tags', headers=headers) + self.assertEqual(output.status_code, 403) shutil.rmtree(newpath) From e9261ead62574ccf8a12ffff34a46539b302f95d Mon Sep 17 00:00:00 2001 From: farhaanbukhsh Date: Apr 14 2017 10:32:36 +0000 Subject: [PATCH 34/94] Add `is_repo_admin` parameter to `get_project` To refactor code and save repeating code everywhere the repo is checked in `get_project` function itself that if the project is private then the logged in user should have the authority to view project and related features likw issues and pull-request --- diff --git a/pagure/lib/__init__.py b/pagure/lib/__init__.py index 0237880..ca699e6 100644 --- a/pagure/lib/__init__.py +++ b/pagure/lib/__init__.py @@ -2097,7 +2097,13 @@ def get_project(session, name, user=None, namespace=None): model.Project.is_fork == False ) - return query.first() + project = query.first() + + if project and is_repo_admin: + if project.private and not is_repo_admin(project): + return None + + return project def search_issues( diff --git a/pagure/ui/fork.py b/pagure/ui/fork.py index 99b1779..bdada35 100644 --- a/pagure/ui/fork.py +++ b/pagure/ui/fork.py @@ -260,9 +260,6 @@ def request_pull_patch(repo, requestid, username=None, namespace=None): """ repo = flask.g.repo - if repo.private and not is_repo_admin(repo): - flask.abort(401, 'Forbidden') - if not repo.settings.get('pull_requests', True): flask.abort(404, 'No pull-requests found for this project') @@ -353,9 +350,6 @@ def request_pull_edit(repo, requestid, username=None, namespace=None): repo = flask.g.repo - if repo.private and not is_repo_admin(repo): - flask.abort(401, 'Forbidden') - if not repo.settings.get('pull_requests', True): flask.abort(404, 'No pull-requests found for this project') @@ -430,9 +424,6 @@ def pull_request_add_comment( """ repo = flask.g.repo - if repo.private and not is_repo_admin(repo): - flask.abort(401, 'Forbidden') - if not repo.settings.get('pull_requests', True): flask.abort(404, 'No pull-requests found for this project') @@ -528,8 +519,8 @@ def pull_request_drop_comment( """ repo = flask.g.repo - if repo.private and not is_repo_admin(repo): - flask.abort(401, 'Forbidden') + if not repo: + flask.abort(404, 'Project not found') if not repo.settings.get('pull_requests', True): flask.abort(404, 'No pull-requests found for this project') @@ -603,9 +594,6 @@ def pull_request_edit_comment( project = flask.g.repo - if project.private and not is_repo_admin(project): - flask.abort(401, 'Forbidden') - if not project.settings.get('pull_requests', True): flask.abort(404, 'No pull-requests found for this project') @@ -706,9 +694,6 @@ def merge_request_pull(repo, requestid, username=None, namespace=None): repo = flask.g.repo - if repo.private and not is_repo_admin(repo): - flask.abort(401, 'Forbidden') - if not repo.settings.get('pull_requests', True): flask.abort(404, 'No pull-requests found for this project') @@ -840,9 +825,6 @@ def set_assignee_requests(repo, requestid, username=None, namespace=None): ''' Assign a pull-request. ''' repo = flask.g.repo - if repo.private and not is_repo_admin(repo): - flask.abort(401, 'Forbidden') - if not repo.settings.get('pull_requests', True): flask.abort(404, 'No pull-request allowed on this project') @@ -973,9 +955,6 @@ def new_request_pull( repo = flask.g.repo - if repo.private and not is_repo_admin(repo): - flask.abort(401, 'Forbidden') - parent = repo if repo.parent: parent = repo.parent @@ -1128,9 +1107,6 @@ def new_remote_request_pull(repo, username=None, namespace=None): repo = flask.g.repo - if repo.private and not is_repo_admin(repo): - flask.abort(401, 'Forbidden') - if not repo.settings.get('pull_requests', True): flask.abort(404, 'No pull-request allowed on this project') diff --git a/pagure/ui/issues.py b/pagure/ui/issues.py index c52f290..e90937b 100644 --- a/pagure/ui/issues.py +++ b/pagure/ui/issues.py @@ -73,9 +73,6 @@ def update_issue(repo, issueid, username=None, namespace=None): repo = flask.g.repo - if repo.private and not is_repo_admin(repo): - flask.abort(401, 'Forbidden') - if flask.request.method == 'GET': if not is_js: flask.flash('Invalid method: GET', 'error') @@ -628,9 +625,6 @@ def view_issues(repo, username=None, namespace=None): repo = flask.g.repo - if repo.private and not is_repo_admin(repo): - flask.abort(401, 'Forbidden') - if not repo.settings.get('issue_tracker', True): flask.abort(404, 'No issue tracker found for this project') @@ -765,9 +759,6 @@ def view_roadmap(repo, username=None, namespace=None): repo = flask.g.repo - if repo.private and is_repo_admin(repo): - flask.abort(401, 'Forbidden') - if not repo.settings.get('issue_tracker', True): flask.abort(404, 'No issue tracker found for this project') @@ -886,9 +877,6 @@ def new_issue(repo, username=None, namespace=None): """ repo = flask.g.repo - if repo.private and is_repo_admin(repo): - flask.abort(401, 'Forbidden') - if not repo.settings.get('issue_tracker', True): flask.abort(404, 'No issue tracker found for this project') @@ -1012,9 +1000,6 @@ def view_issue(repo, issueid, username=None, namespace=None): repo = flask.g.repo - if repo.private and not is_repo_admin(repo): - flask.abort(401, 'Forbidden') - if not repo.settings.get('issue_tracker', True): flask.abort(404, 'No issue tracker found for this project') @@ -1079,9 +1064,6 @@ def delete_issue(repo, issueid, username=None, namespace=None): repo = flask.g.repo - if repo.private and not is_repo_admin(repo): - flask.abort(401, 'Forbidden') - if not repo.settings.get('issue_tracker', True): flask.abort(404, 'No issue tracker found for this project') @@ -1140,9 +1122,6 @@ def edit_issue(repo, issueid, username=None, namespace=None): """ repo = flask.g.repo - if repo.private and not is_repo_admin(repo): - flask.abort(401, 'Forbidden') - if not repo.settings.get('issue_tracker', True): flask.abort(404, 'No issue tracker found for this project') @@ -1268,9 +1247,6 @@ def upload_issue(repo, issueid, username=None, namespace=None): ''' repo = flask.g.repo - if repo.private and not is_repo_admin(repo): - flask.abort(401, 'Forbidden') - if not repo.settings.get('issue_tracker', True): flask.abort(404, 'No issue tracker found for this project') @@ -1336,9 +1312,6 @@ def view_issue_raw_file( repo = flask.g.repo - if repo.private and not is_repo_admin(repo): - flask.abort(401, 'Forbidden') - if not repo.settings.get('issue_tracker', True): flask.abort(404, 'No issue tracker found for this project') @@ -1426,9 +1399,6 @@ def edit_comment_issue( project = flask.g.repo - if project.private and not is_repo_admin(project): - flask.abort(401, 'Forbidden') - if not project.settings.get('issue_tracker', True): flask.abort(404, 'No issue tracker found for this project') diff --git a/pagure/ui/repo.py b/pagure/ui/repo.py index 8df21a8..64a02be 100644 --- a/pagure/ui/repo.py +++ b/pagure/ui/repo.py @@ -80,18 +80,6 @@ def view_repo(repo, username=None, namespace=None): repo_db = flask.g.repo repo_obj = flask.g.repo_obj - repo = pagure.lib.get_project(SESSION, repo, user=username) - - if not repo: - flask.abort(404, 'Project not found') - - if repo.private and not is_repo_admin(repo): - flask.abort(401, 'Forbidden') - - reponame = pagure.get_repo_path(repo) - - repo_obj = pygit2.Repository(reponame) - if not repo_obj.is_empty and not repo_obj.head_is_unborn: head = repo_obj.head.shorthand else: diff --git a/tests/test_pagure_private_repo.py b/tests/test_pagure_private_repo.py index 61d0d9f..661c43e 100644 --- a/tests/test_pagure_private_repo.py +++ b/tests/test_pagure_private_repo.py @@ -21,7 +21,6 @@ import pagure.lib import tests from pagure.lib.repo import PagureRepo - class PagurePrivateRepotest(tests.Modeltests): """ Tests for private repo in pagure """ @@ -479,7 +478,7 @@ class PagurePrivateRepotest(tests.Modeltests): user = tests.FakeUser() with tests.user_set(pagure.APP, user): output = self.app.get('/pmc/pull-requests') - self.assertEqual(output.status_code, 401) + self.assertEqual(output.status_code, 404) user = tests.FakeUser(username='pingou') with tests.user_set(pagure.APP, user): @@ -519,7 +518,7 @@ class PagurePrivateRepotest(tests.Modeltests): # Check if the private repo issues are publicly accesible output = self.app.get('/test4/issues') - self.assertEqual(output.status_code, 401) + self.assertEqual(output.status_code, 404) # Create issues to play with repo = pagure.lib.get_project(self.session, 'test4') @@ -539,11 +538,11 @@ class PagurePrivateRepotest(tests.Modeltests): # Whole list output = self.app.get('/test4/issues') - self.assertEqual(output.status_code, 401) + self.assertEqual(output.status_code, 404) # Check single issue output = self.app.get('/test4/issue/1') - self.assertEqual(output.status_code, 401) + self.assertEqual(output.status_code, 404) user = tests.FakeUser(username='pingou') with tests.user_set(pagure.APP, user): From 22ed40b7a90026fa3b6eeb0486f4a22c8e7bf0fe Mon Sep 17 00:00:00 2001 From: farhaanbukhsh Date: Apr 14 2017 10:32:36 +0000 Subject: [PATCH 35/94] Add a different method to fetch project `get_authorized_project()` is introduced in `pagure/__init__.py` to get project and filter it in a way to only return project which the logged in user is authorized to view. Previous approach of passing a function to the as a parameter may fail in some aspect hence it is avoided. --- diff --git a/pagure/__init__.py b/pagure/__init__.py index 511e09a..c67a703 100644 --- a/pagure/__init__.py +++ b/pagure/__init__.py @@ -374,6 +374,16 @@ def is_repo_user(repo_obj): ) or (user in usergrps) +def get_authorized_project(session, repo, user=None): + """ Return the projects for which the logged in user is authorize to view. """ + repo = pagure.lib.get_project(session, repo, user) + + if repo and repo.private and not is_repo_admin(repo): + return None + + return repo + + def generate_user_key_files(): """ Regenerate the key files used by gitolite. """ diff --git a/pagure/lib/__init__.py b/pagure/lib/__init__.py index ca699e6..0237880 100644 --- a/pagure/lib/__init__.py +++ b/pagure/lib/__init__.py @@ -2097,13 +2097,7 @@ def get_project(session, name, user=None, namespace=None): model.Project.is_fork == False ) - project = query.first() - - if project and is_repo_admin: - if project.private and not is_repo_admin(project): - return None - - return project + return query.first() def search_issues( diff --git a/pagure/ui/repo.py b/pagure/ui/repo.py index 64a02be..2846362 100644 --- a/pagure/ui/repo.py +++ b/pagure/ui/repo.py @@ -49,9 +49,10 @@ import pagure.lib.plugins import pagure.forms import pagure import pagure.ui.plugins -from pagure import (APP, SESSION, LOG, __get_file_in_tree, login_required, - admin_session_timedout) from pagure.lib import encoding_utils +from pagure import (APP, SESSION, LOG, __get_file_in_tree, login_required, + is_repo_admin, admin_session_timedout, authenticated, + get_authorized_project) @APP.route('/.git') From 753ee784d63c84d4a234085a3d491ff5d117b158 Mon Sep 17 00:00:00 2001 From: farhaanbukhsh Date: Apr 14 2017 10:32:36 +0000 Subject: [PATCH 36/94] Fix api point to fetch tags Test for api point to fetch tags from a private repo, it will only fetch tags from the private repo only if the user is authorized to view the repo. --- diff --git a/tests/test_pagure_private_repo.py b/tests/test_pagure_private_repo.py index 661c43e..5dcb96a 100644 --- a/tests/test_pagure_private_repo.py +++ b/tests/test_pagure_private_repo.py @@ -21,6 +21,7 @@ import pagure.lib import tests from pagure.lib.repo import PagureRepo + class PagurePrivateRepotest(tests.Modeltests): """ Tests for private repo in pagure """ @@ -657,21 +658,26 @@ class PagurePrivateRepotest(tests.Modeltests): self.session.add(item) self.session.commit() - # Check if you are admin - headers = {'Authorization': 'token foobar_token'} - # Check tags - output = self.app.get('/api/0/test4/git/tags', headers=headers) - self.assertEqual(output.status_code, 200) - data = json.loads(output.data) - self.assertDictEqual( - data, - {'tags': ['0.0.1'], 'total_tags': 1} - ) + # Check if the admin requests + user = tests.FakeUser(username='pingou') + with tests.user_set(pagure.APP, user): + # Check tags + output = self.app.get('/api/0/test4/git/tags') + self.assertEqual(output.status_code, 200) + data = json.loads(output.data) + self.assertDictEqual( + data, + {'tags': ['0.0.1'], 'total_tags': 1} + ) + + output = self.app.get('/api/0/test4/git/tags') + self.assertEqual(output.status_code, 404) - # Check with wrong token - headers = {'Authorization': 'token hello'} - output = self.app.get('/api/0/test4/git/tags', headers=headers) - self.assertEqual(output.status_code, 403) + # Chekc if user is not admin + user = tests.FakeUser() + with tests.user_set(pagure.APP, user): + output = self.app.get('/api/0/test4/git/tags') + self.assertEqual(output.status_code, 404) shutil.rmtree(newpath) From 7ca1b18d09a797ff0f96b7cb84cd437b66ffe804 Mon Sep 17 00:00:00 2001 From: farhaanbukhsh Date: Apr 14 2017 10:32:36 +0000 Subject: [PATCH 37/94] Add test for api end point to get projects The changes in `api/project.py` make it a compulsion to pass `username` for requesting information for private repo. The tests are written in a way to check the same. --- diff --git a/pagure/api/project.py b/pagure/api/project.py index e60ba1f..52d993a 100644 --- a/pagure/api/project.py +++ b/pagure/api/project.py @@ -15,7 +15,7 @@ from sqlalchemy.exc import SQLAlchemyError import pagure import pagure.exceptions import pagure.lib -from pagure import SESSION, APP, is_repo_admin +from pagure import SESSION, APP, is_repo_admin, authenticated from pagure.api import API, api_method, APIERROR, api_login_required @@ -57,9 +57,6 @@ def api_git_tags(repo, username=None, namespace=None): if repo is None: raise pagure.exceptions.APIError(404, error_code=APIERROR.ENOPROJECT) - if repo.private and not is_repo_admin(repo): - raise pagure.exceptions.APIError(404, error_code=APIERROR.ENOPROJECT) - tags = pagure.lib.git.get_git_tags(repo) jsonout = flask.jsonify({ @@ -164,8 +161,12 @@ def api_projects(): elif str(fork).lower() in ['0', 'false']: fork = False + private = False + if authenticated() and username == flask.g.fas_user.username: + private = flask.g.fas_user.username + projects = pagure.lib.search_projects( - SESSION, username=username, fork=fork, tags=tags, pattern=pattern) + SESSION, username=username, fork=fork, tags=tags, pattern=pattern, private=private) if not projects: raise pagure.exceptions.APIError( diff --git a/tests/test_pagure_private_repo.py b/tests/test_pagure_private_repo.py index 5dcb96a..a15f775 100644 --- a/tests/test_pagure_private_repo.py +++ b/tests/test_pagure_private_repo.py @@ -586,8 +586,9 @@ class PagurePrivateRepotest(tests.Modeltests): output = self.app.get('/test4/issue/1') self.assertEqual(output.status_code, 200) - def test_api_private_repo(self): - """ Test api points for private repo""" + # API checks + def test_api_private_repo_projects(self): + """ Test api points for private repo for projects""" # Add private repo item = pagure.lib.model.Project( @@ -681,6 +682,99 @@ class PagurePrivateRepotest(tests.Modeltests): shutil.rmtree(newpath) + # Check before adding + repo = pagure.lib.get_project(self.session, 'test4') + self.assertEqual(repo.tags, []) + + # Adding a tag + output = pagure.lib.update_tags( + self.session, repo, 'infra', 'pingou', + ticketfolder=None) + self.assertEqual(output, ['Tag added: infra']) + + # Check after adding + repo = pagure.lib.get_project(self.session, 'test4') + self.assertEqual(len(repo.tags), 1) + self.assertEqual(repo.tags_text, ['infra']) + + # Check the API + output = self.app.get('/api/0/projects?tags=inf') + self.assertEqual(output.status_code, 404) + data = json.loads(output.data) + self.assertDictEqual( + data, + {'error_code': 'ENOPROJECTS', 'error': 'No projects found'} + ) + + # Request by not a loggged in user + output = self.app.get('/api/0/projects?tags=infra') + self.assertEqual(output.status_code, 404) + + user = tests.FakeUser() + with tests.user_set(pagure.APP, user): + # Request by a non authorized user + output = self.app.get('/api/0/projects?tags=infra') + self.assertEqual(output.status_code, 404) + + user.username = 'pingou' + with tests.user_set(pagure.APP, user): + # Private repo username is compulsion to pass + output = self.app.get('/api/0/projects?tags=infra') + self.assertEqual(output.status_code, 404) + + output = self.app.get('/api/0/projects?username=pingou') + self.assertEqual(output.status_code, 200) + data = json.loads(output.data) + data['projects'][0]['date_created'] = "1436527638" + self.assertDictEqual( + data, + { + "total_projects": 1, + "projects": [ + { + "date_created": "1436527638", + "description": "test project description", + "id": 1, + "name": "test4", + "parent": None, + "priorities": {}, + "tags": ["infra"], + "user": { + "fullname": "PY C", + "name": "pingou" + } + }, + ] + } + ) + + output = self.app.get('/api/0/projects?username=pingou&tags=infra') + self.assertEqual(output.status_code, 200) + data = json.loads(output.data) + data['projects'][0]['date_created'] = "1436527638" + self.assertDictEqual( + data, + { + "total_projects": 1, + "projects": [ + { + "date_created": "1436527638", + "description": "test project description", + "id": 1, + "name": "test4", + "parent": None, + "priorities": {}, + "tags": ["infra"], + "user": { + "fullname": "PY C", + "name": "pingou" + } + } + ] + } + ) + + if __name__ == '__main__': SUITE = unittest.TestLoader().loadTestsFromTestCase(PagurePrivateRepotest) unittest.TextTestRunner(verbosity=2).run(SUITE) From 44a97a958f80e3f7ab9d587ff5cbde85d0491226 Mon Sep 17 00:00:00 2001 From: farhaanbukhsh Date: Apr 14 2017 10:32:36 +0000 Subject: [PATCH 38/94] Add test for pull request api and condition for pull request api(private repo) Changes in `api/fork.py` ensures that user don't bypass `private repo` and the tests are added to ensure this behaviour. Few tests are modified to ensure better test condition. --- diff --git a/pagure/api/fork.py b/pagure/api/fork.py index 925a86c..0d450cd 100644 --- a/pagure/api/fork.py +++ b/pagure/api/fork.py @@ -500,6 +500,7 @@ def api_pull_request_add_comment( """ # noqa repo = pagure.lib.get_project( SESSION, repo, user=username, namespace=namespace) + output = {} if repo is None: @@ -643,6 +644,7 @@ def api_pull_request_add_flag(repo, requestid, username=None, namespace=None): """ # noqa repo = pagure.lib.get_project( SESSION, repo, user=username, namespace=namespace) + output = {} if repo is None: diff --git a/tests/test_pagure_private_repo.py b/tests/test_pagure_private_repo.py index a15f775..7434b7e 100644 --- a/tests/test_pagure_private_repo.py +++ b/tests/test_pagure_private_repo.py @@ -40,6 +40,7 @@ class PagurePrivateRepotest(tests.Modeltests): pagure.ui.issues.SESSION = self.session pagure.api.SESSION = self.session pagure.api.project.SESSION = self.session + pagure.api.fork.SESSION = self.session pagure.APP.config['GIT_FOLDER'] = os.path.join(tests.HERE, 'repos') pagure.APP.config['FORK_FOLDER'] = os.path.join( @@ -210,7 +211,6 @@ class PagurePrivateRepotest(tests.Modeltests): '

All Projects ' '0

', output.data) - tests.create_projects(self.session) # Add a private project item = pagure.lib.model.Project( @@ -238,7 +238,7 @@ class PagurePrivateRepotest(tests.Modeltests): self.assertEqual(output.status_code, 200) self.assertIn( '

All Projects ' - '3

', output.data) + '1

', output.data) user = tests.FakeUser(username='foo') with tests.user_set(pagure.APP, user): @@ -517,7 +517,7 @@ class PagurePrivateRepotest(tests.Modeltests): os.makedirs(repo_path) pygit2.init_repository(repo_path) - # Check if the private repo issues are publicly accesible + # Check if the private repo issues are publicly not accesible output = self.app.get('/test4/issues') self.assertEqual(output.status_code, 404) @@ -545,6 +545,13 @@ class PagurePrivateRepotest(tests.Modeltests): output = self.app.get('/test4/issue/1') self.assertEqual(output.status_code, 404) + user = tests.FakeUser() + with tests.user_set(pagure.APP, user): + + # Whole list + output = self.app.get('/test4/issues') + self.assertEqual(output.status_code, 404) + user = tests.FakeUser(username='pingou') with tests.user_set(pagure.APP, user): @@ -775,6 +782,142 @@ class PagurePrivateRepotest(tests.Modeltests): ) + # Api pull-request views + @patch('pagure.lib.notify.send_email') + def test_api_private_repo_fork(self,send_email): + """ Test api endpoints in api/fork""" + + send_email.return_value = True + # Add private repo + item = pagure.lib.model.Project( + user_id=1, # pingou + name='test4', + description='test project description', + hook_token='aaabbbeeeceee', + private=True, + ) + self.session.add(item) + self.session.commit() + + # Create a token for pingou for this project + item = pagure.lib.model.Token( + id='foobar_token', + user_id=1, + project_id=1, + expiration=datetime.datetime.utcnow() + datetime.timedelta( + days=30) + ) + self.session.add(item) + self.session.commit() + item = pagure.lib.model.TokenAcl( + token_id='foobar_token', + acl_id=1, + ) + self.session.add(item) + self.session.commit() + + # Create a pull-request + repo = pagure.lib.get_project(self.session, 'test4') + forked_repo = pagure.lib.get_project(self.session, 'test4') + req = pagure.lib.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', + requestfolder=None, + ) + self.session.commit() + self.assertEqual(req.id, 1) + self.assertEqual(req.title, 'test pull-request') + output = self.app.get('/api/0/test4/pull-requests') + self.assertEqual(output.status_code, 404) + + user = tests.FakeUser(username='pingou') + with tests.user_set(pagure.APP, user): + # List pull-requests + output = self.app.get('/api/0/test4/pull-requests') + self.assertEqual(output.status_code, 200) + data = json.loads(output.data) + data['requests'][0]['date_created'] = '1431414800' + data['requests'][0]['updated_on'] = '1431414800' + data['requests'][0]['project']['date_created'] = '1431414800' + data['requests'][0]['repo_from']['date_created'] = '1431414800' + data['requests'][0]['uid'] = '1431414800' + self.assertDictEqual( + data, + { + 'args': { + 'assignee': None, + 'author': None, + 'status': True + }, + 'requests': [{ + 'assignee': None, + 'branch': 'master', + 'branch_from': 'master', + 'closed_at': None, + 'closed_by': None, + 'comments': [], + 'commit_start': None, + 'commit_stop': None, + 'date_created': '1431414800', + 'id': 1, + 'initial_comment': None, + 'project': { + 'date_created': '1431414800', + 'description': 'test project description', + 'id': 1, + 'name': 'test4', + 'parent': None, + 'priorities': {}, + 'tags': [], + 'user': { + 'fullname': 'PY C', + 'name': 'pingou' + } + }, + 'remote_git': None, + 'repo_from': { + 'date_created': '1431414800', + 'description': 'test project description', + 'id': 1, + 'name': 'test4', + 'parent': None, + 'priorities': {}, + 'tags': [], + 'user': { + 'fullname': 'PY C', + 'name': 'pingou' + } + }, + 'status': 'Open', + 'title': 'test pull-request', + 'uid': '1431414800', + 'updated_on': '1431414800', + 'user': { + 'fullname': 'PY C', + 'name': 'pingou' + } + }], + 'total_requests': 1 + } + ) + headers = {'Authorization': 'token foobar_token'} + + # Access Pull-Request authenticated + output = self.app.get('/api/0/test4/pull-requests', headers=headers) + self.assertEqual(output.status_code, 200) + data2 = json.loads(output.data) + data2['requests'][0]['date_created'] = '1431414800' + data2['requests'][0]['updated_on'] = '1431414800' + data2['requests'][0]['project']['date_created'] = '1431414800' + data2['requests'][0]['repo_from']['date_created'] = '1431414800' + data2['requests'][0]['uid'] = '1431414800' + self.assertDictEqual(data, data2) + if __name__ == '__main__': SUITE = unittest.TestLoader().loadTestsFromTestCase(PagurePrivateRepotest) unittest.TextTestRunner(verbosity=2).run(SUITE) From f693ef1c361c5da6500fca52e56b0e941a308eec Mon Sep 17 00:00:00 2001 From: farhaanbukhsh Date: Apr 14 2017 10:32:36 +0000 Subject: [PATCH 39/94] Add test a single PR retrival --- diff --git a/tests/test_pagure_private_repo.py b/tests/test_pagure_private_repo.py index 7434b7e..9b44725 100644 --- a/tests/test_pagure_private_repo.py +++ b/tests/test_pagure_private_repo.py @@ -918,6 +918,80 @@ class PagurePrivateRepotest(tests.Modeltests): data2['requests'][0]['uid'] = '1431414800' self.assertDictEqual(data, data2) + + # Valid issue + output = self.app.get('/api/0/test4/pull-request/1') + self.assertEqual(output.status_code, 200) + data = json.loads(output.data) + data['date_created'] = '1431414800' + data['updated_on'] = '1431414800' + data['project']['date_created'] = '1431414800' + data['repo_from']['date_created'] = '1431414800' + data['uid'] = '1431414800' + self.assertDictEqual( + data, + { + "assignee": None, + "branch": "master", + "branch_from": "master", + "closed_at": None, + "closed_by": None, + "comments": [], + "commit_start": None, + "commit_stop": None, + "date_created": "1431414800", + "id": 1, + "initial_comment": None, + "project": { + "date_created": "1431414800", + "description": "test project description", + "id": 1, + "name": "test4", + "parent": None, + "priorities": {}, + "tags": [], + "user": { + "fullname": "PY C", + "name": "pingou" + } + }, + "remote_git": None, + "repo_from": { + "date_created": "1431414800", + "description": "test project description", + "id": 1, + "name": "test4", + "parent": None, + "priorities": {}, + "tags": [], + "user": { + "fullname": "PY C", + "name": "pingou" + } + }, + "status": 'Open', + "title": "test pull-request", + "uid": "1431414800", + "updated_on": "1431414800", + "user": { + "fullname": "PY C", + "name": "pingou" + } + } + ) + + # Access Pull-Request authenticated + output = self.app.get('/api/0/test4/pull-request/1', headers=headers) + self.assertEqual(output.status_code, 200) + data2 = json.loads(output.data) + data2['date_created'] = '1431414800' + data2['project']['date_created'] = '1431414800' + data2['repo_from']['date_created'] = '1431414800' + data2['uid'] = '1431414800' + data2['date_created'] = '1431414800' + data2['updated_on'] = '1431414800' + self.assertDictEqual(data, data2) + if __name__ == '__main__': SUITE = unittest.TestLoader().loadTestsFromTestCase(PagurePrivateRepotest) unittest.TextTestRunner(verbosity=2).run(SUITE) From fd8d2a2f7361bc19be6c31754a97fbe221c12e89 Mon Sep 17 00:00:00 2001 From: farhaanbukhsh Date: Apr 14 2017 10:32:36 +0000 Subject: [PATCH 40/94] Add test private repo api endpoit for adding comment to PR --- diff --git a/tests/test_pagure_private_repo.py b/tests/test_pagure_private_repo.py index 9b44725..ee71781 100644 --- a/tests/test_pagure_private_repo.py +++ b/tests/test_pagure_private_repo.py @@ -788,6 +788,7 @@ class PagurePrivateRepotest(tests.Modeltests): """ Test api endpoints in api/fork""" send_email.return_value = True + # Add private repo item = pagure.lib.model.Project( user_id=1, # pingou @@ -799,23 +800,10 @@ class PagurePrivateRepotest(tests.Modeltests): self.session.add(item) self.session.commit() - # Create a token for pingou for this project - item = pagure.lib.model.Token( - id='foobar_token', - user_id=1, - project_id=1, - expiration=datetime.datetime.utcnow() + datetime.timedelta( - days=30) - ) - self.session.add(item) - self.session.commit() - item = pagure.lib.model.TokenAcl( - token_id='foobar_token', - acl_id=1, - ) - self.session.add(item) - self.session.commit() + tests.create_tokens(self.session) + tests.create_tokens_acl(self.session) + headers = {'Authorization': 'token aaabbbcccddd'} # Create a pull-request repo = pagure.lib.get_project(self.session, 'test4') forked_repo = pagure.lib.get_project(self.session, 'test4') @@ -832,9 +820,15 @@ class PagurePrivateRepotest(tests.Modeltests): self.session.commit() self.assertEqual(req.id, 1) self.assertEqual(req.title, 'test pull-request') + + # Check list of PR output = self.app.get('/api/0/test4/pull-requests') self.assertEqual(output.status_code, 404) + # Check single PR + output = self.app.get('/api/0/test/pull-request/1') + self.assertEqual(output.status_code, 404) + user = tests.FakeUser(username='pingou') with tests.user_set(pagure.APP, user): # List pull-requests @@ -919,7 +913,7 @@ class PagurePrivateRepotest(tests.Modeltests): self.assertDictEqual(data, data2) - # Valid issue + # For single PR output = self.app.get('/api/0/test4/pull-request/1') self.assertEqual(output.status_code, 200) data = json.loads(output.data) @@ -992,6 +986,92 @@ class PagurePrivateRepotest(tests.Modeltests): data2['updated_on'] = '1431414800' self.assertDictEqual(data, data2) + + @patch('pagure.lib.notify.send_email') + def test_api_pr_private_repo_add_comment(self, mockemail): + """ Test the api_pull_request_add_comment method of the flask api. """ + mockemail.return_value = True + pagure.APP.config['REQUESTS_FOLDER'] = None + + # Add private repo + item = pagure.lib.model.Project( + user_id=1, # pingou + name='test4', + description='test project description', + hook_token='aaabbbeeeceee', + private=True, + ) + self.session.add(item) + self.session.commit() + tests.create_tokens(self.session) + tests.create_tokens_acl(self.session) + + headers = {'Authorization': 'token aaabbbcccddd'} + # Create a pull-request + repo = pagure.lib.get_project(self.session, 'test4') + forked_repo = pagure.lib.get_project(self.session, 'test4') + req = pagure.lib.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', + requestfolder=None, + ) + self.session.commit() + self.assertEqual(req.id, 1) + self.assertEqual(req.title, 'test pull-request') + + # Check comments before + request = pagure.lib.search_pull_requests( + self.session, project_id=1, requestid=1) + self.assertEqual(len(request.comments), 0) + + data = { + 'title': 'test issue', + } + + # Incomplete request + output = self.app.post( + '/api/0/test4/pull-request/1/comment', data=data, headers=headers) + self.assertEqual(output.status_code, 400) + data = json.loads(output.data) + self.assertDictEqual( + data, + { + "error": "Invalid or incomplete input submited", + "error_code": "EINVALIDREQ", + } + ) + + # No change + request = pagure.lib.search_pull_requests( + self.session, project_id=1, requestid=1) + self.assertEqual(len(request.comments), 0) + + data = { + 'comment': 'This is a very interesting question', + } + + # Valid request + output = self.app.post( + '/api/0/test4/pull-request/1/comment', data=data, headers=headers) + self.assertEqual(output.status_code, 200) + data = json.loads(output.data) + self.assertDictEqual( + data, + {'message': 'Comment added'} + ) + + # One comment added + request = pagure.lib.search_pull_requests( + self.session, project_id=1, requestid=1) + self.assertEqual(len(request.comments), 1) + + + if __name__ == '__main__': SUITE = unittest.TestLoader().loadTestsFromTestCase(PagurePrivateRepotest) unittest.TextTestRunner(verbosity=2).run(SUITE) From a0d3dc09d3e6c4ea0d836d64e957c8db24deb375 Mon Sep 17 00:00:00 2001 From: farhaanbukhsh Date: Apr 14 2017 10:32:36 +0000 Subject: [PATCH 41/94] Add test to flag PR in private repo --- diff --git a/tests/test_pagure_private_repo.py b/tests/test_pagure_private_repo.py index ee71781..5f73842 100644 --- a/tests/test_pagure_private_repo.py +++ b/tests/test_pagure_private_repo.py @@ -1070,6 +1070,176 @@ class PagurePrivateRepotest(tests.Modeltests): self.session, project_id=1, requestid=1) self.assertEqual(len(request.comments), 1) + @patch('pagure.lib.notify.send_email') + def test_api_private_repo_pr_add_flag(self, mockemail): + """ Test the api_pull_request_add_flag method of the flask api. """ + mockemail.return_value = True + pagure.APP.config['REQUESTS_FOLDER'] = None + + # Add private repo + item = pagure.lib.model.Project( + user_id=1, # pingou + name='test4', + description='test project description', + hook_token='aaabbbeeeceee', + private=True, + ) + self.session.add(item) + self.session.commit() + + # Add private repo + item = pagure.lib.model.Project( + user_id=1, # pingou + name='test2', + description='test project description', + hook_token='foo_bar', + private=True, + ) + self.session.add(item) + self.session.commit() + + tests.create_tokens(self.session) + tests.create_tokens_acl(self.session) + + 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.data) + self.assertDictEqual( + data, + { + "error": "Project not found", + "error_code": "ENOPROJECT", + } + ) + + # 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.data) + self.assertDictEqual( + data, + { + "error": "Invalid or expired token. Please visit " \ + "https://pagure.org/ to get or renew your API token.", + "error_code": "EINVALIDTOK", + } + ) + + # No input + output = self.app.post( + '/api/0/test4/pull-request/1/flag', headers=headers) + self.assertEqual(output.status_code, 404) + data = json.loads(output.data) + self.assertDictEqual( + data, + { + "error": "Pull-Request not found", + "error_code": "ENOREQ", + } + ) + + # Create a pull-request + repo = pagure.lib.get_project(self.session, 'test4') + forked_repo = pagure.lib.get_project(self.session, 'test4') + req = pagure.lib.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', + requestfolder=None, + ) + self.session.commit() + self.assertEqual(req.id, 1) + self.assertEqual(req.title, 'test pull-request') + + # Check comments before + request = pagure.lib.search_pull_requests( + self.session, project_id=1, requestid=1) + self.assertEqual(len(request.flags), 0) + + 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/test4/pull-request/1/flag', data=data, headers=headers) + self.assertEqual(output.status_code, 400) + data = json.loads(output.data) + self.assertDictEqual( + data, + { + "error": "Invalid or incomplete input submited", + "error_code": "EINVALIDREQ", + } + ) + + # No change + request = pagure.lib.search_pull_requests( + self.session, project_id=1, requestid=1) + self.assertEqual(len(request.flags), 0) + + data = { + 'username': 'Jenkins', + 'percent': 0, + 'comment': 'Tests failed', + 'url': 'http://jenkins.cloud.fedoraproject.org/', + 'uid': 'jenkins_build_pagure_100+seed', + } + + # Valid request + output = self.app.post( + '/api/0/test4/pull-request/1/flag', data=data, headers=headers) + self.assertEqual(output.status_code, 200) + data = json.loads(output.data) + self.assertDictEqual( + data, + {'message': 'Flag added'} + ) + + # One flag added + request = pagure.lib.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) + + # Update flag + 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/test4/pull-request/1/flag', data=data, headers=headers) + self.assertEqual(output.status_code, 200) + data = json.loads(output.data) + self.assertDictEqual( + data, + {'message': 'Flag updated'} + ) + + # One flag added + request = pagure.lib.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) + if __name__ == '__main__': From 6d10ff4b9c27c793f0b6220f9e57d06c0a5cfd0c Mon Sep 17 00:00:00 2001 From: farhaanbukhsh Date: Apr 14 2017 10:32:37 +0000 Subject: [PATCH 42/94] Add test for Pr merge and close in private repo --- diff --git a/tests/test_pagure_private_repo.py b/tests/test_pagure_private_repo.py index 5f73842..459fc91 100644 --- a/tests/test_pagure_private_repo.py +++ b/tests/test_pagure_private_repo.py @@ -1240,6 +1240,271 @@ class PagurePrivateRepotest(tests.Modeltests): self.assertEqual(request.flags[0].comment, 'Tests passed') self.assertEqual(request.flags[0].percent, 100) + @patch('pagure.lib.notify.send_email') + def test_api_private_repo_pr_close(self, send_email): + """ Test the api_pull_request_close method of the flask api. """ + send_email.return_value = True + + pagure.APP.config['REQUESTS_FOLDER'] = None + + # Add private repo + item = pagure.lib.model.Project( + user_id=1, # pingou + name='test4', + description='test project description', + hook_token='aaabbbeeeceee', + private=True, + ) + self.session.add(item) + self.session.commit() + + tests.create_tokens(self.session) + tests.create_tokens_acl(self.session) + + # Add private repo + item = pagure.lib.model.Project( + user_id=1, # pingou + name='test2', + description='test project description', + hook_token='foo_bar', + private=True, + ) + self.session.add(item) + self.session.commit() + + # Create the pull-request to close + repo = pagure.lib.get_project(self.session, 'test4') + forked_repo = pagure.lib.get_project(self.session, 'test4') + req = pagure.lib.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', + requestfolder=None, + ) + self.session.commit() + self.assertEqual(req.id, 1) + self.assertEqual(req.title, 'test pull-request') + + headers = {'Authorization': 'token aaabbbcccddd'} + + # Invalid project + output = self.app.post( + '/api/0/foo/pull-request/1/close', headers=headers) + self.assertEqual(output.status_code, 404) + data = json.loads(output.data) + self.assertDictEqual( + data, + { + "error": "Project not found", + "error_code": "ENOPROJECT", + } + ) + + # Valid token, wrong project + output = self.app.post( + '/api/0/test2/pull-request/1/close', headers=headers) + self.assertEqual(output.status_code, 401) + data = json.loads(output.data) + self.assertDictEqual( + data, + { + "error": "Invalid or expired token. Please visit " \ + "https://pagure.org/ to get or renew your API token.", + "error_code": "EINVALIDTOK", + } + ) + + # Invalid PR + output = self.app.post( + '/api/0/test4/pull-request/2/close', headers=headers) + self.assertEqual(output.status_code, 404) + data = json.loads(output.data) + self.assertDictEqual( + data, + {'error': 'Pull-Request not found', 'error_code': "ENOREQ"} + ) + + # Create a token for foo for this project + item = pagure.lib.model.Token( + id='foobar_token', + user_id=2, + project_id=1, + expiration=datetime.datetime.utcnow() + datetime.timedelta( + days=30) + ) + self.session.add(item) + self.session.commit() + item = pagure.lib.model.TokenAcl( + token_id='foobar_token', + acl_id=2, + ) + self.session.add(item) + self.session.commit() + + headers = {'Authorization': 'token foobar_token'} + + # User not admin + output = self.app.post( + '/api/0/test4/pull-request/1/close', headers=headers) + self.assertEqual(output.status_code, 404) + data = json.loads(output.data) + self.assertDictEqual( + data, + { + "error": "Project not found", + "error_code": "ENOPROJECT", + } + ) + + headers = {'Authorization': 'token aaabbbcccddd'} + + # Close PR + output = self.app.post( + '/api/0/test4/pull-request/1/close', headers=headers) + self.assertEqual(output.status_code, 200) + data = json.loads(output.data) + self.assertDictEqual( + data, + {"message": "Pull-request closed!"} + ) + + @patch('pagure.lib.notify.send_email') + @patch('pagure.lib.git.merge_pull_request') + def test_api_pull_request_merge(self, mpr, send_email): + """ Test the api_pull_request_merge method of the flask api. """ + mpr.return_value = 'Changes merged!' + send_email.return_value = True + + pagure.APP.config['REQUESTS_FOLDER'] = None + + # Add private repo + item = pagure.lib.model.Project( + user_id=1, # pingou + name='test4', + description='test project description', + hook_token='aaabbbeeeceee', + private=True, + ) + self.session.add(item) + self.session.commit() + + tests.create_tokens(self.session) + tests.create_tokens_acl(self.session) + + # Add private repo + item = pagure.lib.model.Project( + user_id=1, # pingou + name='test2', + description='test project description', + hook_token='foo_bar', + private=True, + ) + self.session.add(item) + self.session.commit() + + # Create the pull-request to close + repo = pagure.lib.get_project(self.session, 'test4') + forked_repo = pagure.lib.get_project(self.session, 'test4') + req = pagure.lib.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', + requestfolder=None, + ) + self.session.commit() + self.assertEqual(req.id, 1) + self.assertEqual(req.title, 'test pull-request') + + headers = {'Authorization': 'token aaabbbcccddd'} + + # Invalid project + output = self.app.post( + '/api/0/foo/pull-request/1/merge', headers=headers) + self.assertEqual(output.status_code, 404) + data = json.loads(output.data) + self.assertDictEqual( + data, + { + "error": "Project not found", + "error_code": "ENOPROJECT", + } + ) + + # Valid token, wrong project + output = self.app.post( + '/api/0/test2/pull-request/1/merge', headers=headers) + self.assertEqual(output.status_code, 401) + data = json.loads(output.data) + self.assertDictEqual( + data, + { + "error": "Invalid or expired token. Please visit " \ + "https://pagure.org/ to get or renew your API token.", + "error_code": "EINVALIDTOK", + } + ) + + # Invalid PR + output = self.app.post( + '/api/0/test4/pull-request/2/merge', headers=headers) + self.assertEqual(output.status_code, 404) + data = json.loads(output.data) + self.assertDictEqual( + data, + {'error': 'Pull-Request not found', 'error_code': "ENOREQ"} + ) + + # Create a token for foo for this project + item = pagure.lib.model.Token( + id='foobar_token', + user_id=2, + project_id=1, + expiration=datetime.datetime.utcnow() + datetime.timedelta( + days=30) + ) + self.session.add(item) + self.session.commit() + item = pagure.lib.model.TokenAcl( + token_id='foobar_token', + acl_id=3, + ) + self.session.add(item) + self.session.commit() + + headers = {'Authorization': 'token foobar_token'} + + # User not admin + output = self.app.post( + '/api/0/test4/pull-request/1/merge', headers=headers) + self.assertEqual(output.status_code, 404) + data = json.loads(output.data) + self.assertDictEqual( + data, + { + "error": "Project not found", + "error_code": "ENOPROJECT", + } + ) + + headers = {'Authorization': 'token aaabbbcccddd'} + + # Merge PR + output = self.app.post( + '/api/0/test4/pull-request/1/merge', headers=headers) + self.assertEqual(output.status_code, 200) + data = json.loads(output.data) + self.assertDictEqual( + data, + {"message": "Changes merged!"} + ) if __name__ == '__main__': From 48869c44b34930a8570a0142edeb6a5f8aac7f35 Mon Sep 17 00:00:00 2001 From: farhaanbukhsh Date: Apr 14 2017 10:32:37 +0000 Subject: [PATCH 43/94] Add tests to test issues api for private repo --- diff --git a/tests/test_pagure_private_repo.py b/tests/test_pagure_private_repo.py index 459fc91..1f14519 100644 --- a/tests/test_pagure_private_repo.py +++ b/tests/test_pagure_private_repo.py @@ -41,6 +41,7 @@ class PagurePrivateRepotest(tests.Modeltests): pagure.api.SESSION = self.session pagure.api.project.SESSION = self.session pagure.api.fork.SESSION = self.session + pagure.api.issue.SESSION = self.session pagure.APP.config['GIT_FOLDER'] = os.path.join(tests.HERE, 'repos') pagure.APP.config['FORK_FOLDER'] = os.path.join( @@ -781,7 +782,6 @@ class PagurePrivateRepotest(tests.Modeltests): } ) - # Api pull-request views @patch('pagure.lib.notify.send_email') def test_api_private_repo_fork(self,send_email): @@ -986,7 +986,6 @@ class PagurePrivateRepotest(tests.Modeltests): data2['updated_on'] = '1431414800' self.assertDictEqual(data, data2) - @patch('pagure.lib.notify.send_email') def test_api_pr_private_repo_add_comment(self, mockemail): """ Test the api_pull_request_add_comment method of the flask api. """ @@ -1374,7 +1373,7 @@ class PagurePrivateRepotest(tests.Modeltests): @patch('pagure.lib.notify.send_email') @patch('pagure.lib.git.merge_pull_request') - def test_api_pull_request_merge(self, mpr, send_email): + def test_api_private_repo_pr_merge(self, mpr, send_email): """ Test the api_pull_request_merge method of the flask api. """ mpr.return_value = 'Changes merged!' send_email.return_value = True @@ -1506,6 +1505,495 @@ class PagurePrivateRepotest(tests.Modeltests): {"message": "Changes merged!"} ) + def test_api_private_repo_new_issue(self): + """ Test the api_new_issue method of the flask api. """ + # Add private repo + item = pagure.lib.model.Project( + user_id=1, # pingou + name='test4', + description='test project description', + hook_token='aaabbbeeeceee', + private=True, + ) + self.session.add(item) + self.session.commit() + + for repo in ['GIT_FOLDER', 'TICKETS_FOLDER']: + # Add a git repo + repo_path = os.path.join( + pagure.APP.config.get(repo), 'test4.git') + if not os.path.exists(repo_path): + os.makedirs(repo_path) + pygit2.init_repository(repo_path, bare=True) + + tests.create_tokens(self.session) + tests.create_tokens_acl(self.session) + + # Add private repo + item = pagure.lib.model.Project( + user_id=1, # pingou + name='test2', + description='test project description', + hook_token='foo_bar', + private=True, + ) + self.session.add(item) + self.session.commit() + + headers = {'Authorization': 'token aaabbbcccddd'} + + # Valid token, wrong project + output = self.app.post('/api/0/test2/new_issue', headers=headers) + self.assertEqual(output.status_code, 401) + data = json.loads(output.data) + self.assertDictEqual( + data, + { + "error": "Invalid or expired token. Please visit " \ + "https://pagure.org/ to get or renew your API token.", + "error_code": "EINVALIDTOK", + } + ) + + # No input + output = self.app.post('/api/0/test4/new_issue', headers=headers) + self.assertEqual(output.status_code, 400) + data = json.loads(output.data) + self.assertDictEqual( + data, + { + "error": "Invalid or incomplete input submited", + "error_code": "EINVALIDREQ", + } + ) + + data = { + 'title': 'test issue', + } + + # Invalid repo + output = self.app.post( + '/api/0/foo/new_issue', data=data, headers=headers) + self.assertEqual(output.status_code, 404) + data = json.loads(output.data) + self.assertDictEqual( + data, + { + "error": "Project not found", + "error_code": "ENOPROJECT", + } + ) + + # Incomplete request + output = self.app.post( + '/api/0/test4/new_issue', data=data, headers=headers) + self.assertEqual(output.status_code, 400) + data = json.loads(output.data) + self.assertDictEqual( + data, + { + "error": "Invalid or incomplete input submited", + "error_code": "EINVALIDREQ", + } + ) + + data = { + 'title': 'test issue', + 'issue_content': 'This issue needs attention', + } + + # Valid request + output = self.app.post( + '/api/0/test4/new_issue', data=data, headers=headers) + self.assertEqual(output.status_code, 200) + data = json.loads(output.data) + self.assertDictEqual( + data, + {'message': 'Issue created'} + ) + + def test_api_priavte_repo_view_issues(self): + """ Test the api_view_issues method of the flask api. """ + self.test_api_private_repo_new_issue() + + # Invalid repo + output = self.app.get('/api/0/foo/issues') + self.assertEqual(output.status_code, 404) + data = json.loads(output.data) + self.assertDictEqual( + data, + { + "error": "Project not found", + "error_code": "ENOPROJECT", + } + ) + + # List all opened issues + user = tests.FakeUser(username='pingou') + with tests.user_set(pagure.APP, user): + output = self.app.get('/api/0/test4/issues') + self.assertEqual(output.status_code, 200) + data = json.loads(output.data) + data['issues'][0]['date_created'] = '1431414800' + self.assertDictEqual( + data, + { + "args": { + "assignee": None, + "author": None, + "status": None, + "tags": [] + }, + "total_issues": 1, + "issues": [ + { + "assignee": None, + "blocks": [], + "comments": [], + "content": "This issue needs attention", + "date_created": "1431414800", + "depends": [], + "id": 1, + "priority": None, + "private": False, + "status": "Open", + "tags": [], + "title": "test issue", + "user": { + "fullname": "PY C", + "name": "pingou" + } + } + ] + } + ) + + # Create private issue + repo = pagure.lib.get_project(self.session, 'test4') + msg = pagure.lib.new_issue( + session=self.session, + repo=repo, + title='Test issue', + content='We should work on this', + user='pingou', + ticketfolder=None, + private=True, + ) + self.session.commit() + self.assertEqual(msg.title, 'Test issue') + + # Private issues are retrieved + user = tests.FakeUser(username='pingou') + with tests.user_set(pagure.APP, user): + output = self.app.get('/api/0/test4/issues') + self.assertEqual(output.status_code, 200) + data = json.loads(output.data) + data['issues'][0]['date_created'] = '1431414800' + data['issues'][1]['date_created'] = '1431414800' + self.assertDictEqual( + data, + {'args': + {'assignee': None, 'author': None, 'status': None, 'tags': []}, + 'issues': [{u'assignee': None, + 'blocks': [], + 'comments': [], + 'content': 'This issue needs attention', + 'date_created': '1431414800', + 'depends': [], + 'id': 1, + 'priority': None, + 'private': False, + 'status': 'Open', + 'tags': [], + 'title': u'test issue', + 'user': {'fullname': 'PY C', 'name': 'pingou'}}, + {'assignee': None, + 'blocks': [], + 'comments': [], + 'content': 'We should work on this', + 'date_created': '1431414800', + 'depends': [], + 'id': 2, + 'priority': None, + 'private': True, + 'status': 'Open', + 'tags': [], + 'title': 'Test issue', + 'user': {'fullname': 'PY C', 'name': 'pingou'}}], + 'total_issues': 2} + ) + + # Access issues authenticated but non-existing token + headers = {'Authorization': 'token aaabbbccc'} + output = self.app.get('/api/0/test4/issues', headers=headers) + self.assertEqual(output.status_code, 401) + + headers = {'Authorization': 'token aaabbbcccddd'} + + # Access issues authenticated correctly + output = self.app.get('/api/0/test4/issues', headers=headers) + self.assertEqual(output.status_code, 200) + data = json.loads(output.data) + data['issues'][0]['date_created'] = '1431414800' + data['issues'][1]['date_created'] = '1431414800' + self.assertDictEqual( + data, + { + "args": { + "assignee": None, + "author": None, + "status": None, + "tags": [] + }, + "total_issues": 2, + "issues": [ + { + "assignee": None, + "blocks": [], + "comments": [], + "content": "This issue needs attention", + "date_created": "1431414800", + "depends": [], + "id": 1, + "priority": None, + "private": False, + "status": "Open", + "tags": [], + "title": "test issue", + "user": { + "fullname": "PY C", + "name": "pingou" + } + }, + { + "assignee": None, + "blocks": [], + "comments": [], + "content": "We should work on this", + "date_created": "1431414800", + "depends": [], + "id": 2, + "priority": None, + "private": True, + "status": "Open", + "tags": [], + "title": "Test issue", + "user": { + "fullname": "PY C", + "name": "pingou" + } + } + ] + } + ) + + # List closed issue + output = self.app.get('/api/0/test4/issues?status=Closed', headers=headers) + self.assertEqual(output.status_code, 200) + data = json.loads(output.data) + self.assertDictEqual( + data, + { + "args": { + "assignee": None, + "author": None, + "status": "Closed", + "tags": [] + }, + "total_issues": 0, + "issues": [] + } + ) + + # List closed issue + output = self.app.get('/api/0/test4/issues?status=Invalid', headers=headers) + self.assertEqual(output.status_code, 200) + data = json.loads(output.data) + self.assertDictEqual( + data, + { + "args": { + "assignee": None, + "author": None, + "status": "Invalid", + "tags": [] + }, + "total_issues": 0, + "issues": [] + } + ) + + # List all issues + output = self.app.get('/api/0/test4/issues?status=All', headers=headers) + self.assertEqual(output.status_code, 200) + data = json.loads(output.data) + data['issues'][0]['date_created'] = '1431414800' + data['issues'][1]['date_created'] = '1431414800' + self.assertDictEqual( + data, + { + "args": { + "assignee": None, + "author": None, + "status": "All", + "tags": [] + }, + "total_issues": 2, + "issues": [ + { + "assignee": None, + "blocks": [], + "comments": [], + "content": "This issue needs attention", + "date_created": "1431414800", + "depends": [], + "id": 1, + "priority": None, + "private": False, + "status": "Open", + "tags": [], + "title": "test issue", + "user": { + "fullname": "PY C", + "name": "pingou" + } + }, + { + "assignee": None, + "blocks": [], + "comments": [], + "content": "We should work on this", + "date_created": "1431414800", + "depends": [], + "id": 2, + "priority": None, + "private": True, + "status": "Open", + "tags": [], + "title": "Test issue", + "user": { + "fullname": "PY C", + "name": "pingou" + } + } + ], + } + ) + + def test_api_pivate_repo_view_issue(self): + """ Test the api_view_issue method of the flask api. """ + self.test_api_private_repo_new_issue() + + # Invalid repo + output = self.app.get('/api/0/foo/issue/1') + self.assertEqual(output.status_code, 404) + data = json.loads(output.data) + self.assertDictEqual( + data, + { + "error": "Project not found", + "error_code": "ENOPROJECT", + } + ) + + # Invalid issue for this repo + output = self.app.get('/api/0/test4/issue/1') + self.assertEqual(output.status_code, 404) + data = json.loads(output.data) + self.assertDictEqual( + data, + { + "error": "Project not found", + "error_code": "ENOPROJECT", + } + ) + + # Un-authorized user + user = tests.FakeUser() + with tests.user_set(pagure.APP, user): + output = self.app.get('/api/0/test4/issue/1') + self.assertEqual(output.status_code, 404) + data = json.loads(output.data) + self.assertDictEqual( + data, + { + "error": "Project not found", + "error_code": "ENOPROJECT", + } + ) + + # Valid issue + user = tests.FakeUser(username='pingou') + with tests.user_set(pagure.APP, user): + output = self.app.get('/api/0/test4/issue/1') + self.assertEqual(output.status_code, 200) + data = json.loads(output.data) + data['date_created'] = '1431414800' + self.assertDictEqual( + data, + { + "assignee": None, + "blocks": [], + "comments": [], + "content": "This issue needs attention", + "date_created": "1431414800", + "depends": [], + "id": 1, + "priority": None, + "private": False, + "status": "Open", + "tags": [], + "title": "test issue", + "user": { + "fullname": "PY C", + "name": "pingou" + } + } + ) + + + headers = {'Authorization': 'token aaabbbccc'} + + # Access issue authenticated but non-existing token + output = self.app.get('/api/0/test4/issue/1', headers=headers) + self.assertEqual(output.status_code, 401) + data = json.loads(output.data) + self.assertDictEqual( + data, + { + "error": "Invalid or expired token. Please visit https://pagure.org/ to get or renew your API token.", + "error_code": "EINVALIDTOK" + } + ) + + headers = {'Authorization': 'token aaabbbcccddd'} + + # Access issue authenticated correctly + output = self.app.get('/api/0/test4/issue/1', headers=headers) + self.assertEqual(output.status_code, 200) + data = json.loads(output.data) + data['date_created'] = '1431414800' + self.assertDictEqual( + data, + { + "assignee": None, + "blocks": [], + "comments": [], + "content": "This issue needs attention", + "date_created": "1431414800", + "depends": [], + "id": 1, + "priority": None, + "private": False, + "status": "Open", + "tags": [], + "title": "test issue", + "user": { + "fullname": "PY C", + "name": "pingou" + } + } + ) if __name__ == '__main__': SUITE = unittest.TestLoader().loadTestsFromTestCase(PagurePrivateRepotest) From bf482e356724ca7320a85bd4eedf0cb270eb1297 Mon Sep 17 00:00:00 2001 From: farhaanbukhsh Date: Apr 14 2017 10:32:37 +0000 Subject: [PATCH 44/94] Add test for changing status through api point in private repo --- diff --git a/tests/test_pagure_private_repo.py b/tests/test_pagure_private_repo.py index 1f14519..574ae34 100644 --- a/tests/test_pagure_private_repo.py +++ b/tests/test_pagure_private_repo.py @@ -1995,6 +1995,147 @@ class PagurePrivateRepotest(tests.Modeltests): } ) + def test_api_change_status_issue(self): + """ Test the api_change_status_issue method of the flask api. """ + item = pagure.lib.model.Project( + user_id=1, # pingou + name='test4', + description='test project description', + hook_token='aaabbbeeeceee', + private=True, + ) + self.session.add(item) + self.session.commit() + + for repo in ['GIT_FOLDER', 'TICKETS_FOLDER']: + # Add a git repo + repo_path = os.path.join( + pagure.APP.config.get(repo), 'test4.git') + if not os.path.exists(repo_path): + os.makedirs(repo_path) + pygit2.init_repository(repo_path, bare=True) + + tests.create_tokens(self.session) + tests.create_tokens_acl(self.session) + + headers = {'Authorization': 'token aaabbbcccddd'} + + # Invalid project + output = self.app.post('/api/0/foo/issue/1/status', headers=headers) + self.assertEqual(output.status_code, 404) + data = json.loads(output.data) + self.assertDictEqual( + data, + { + "error": "Project not found", + "error_code": "ENOPROJECT", + } + ) + + # Valid token, wrong project + user = tests.FakeUser(username='pingou') + with tests.user_set(pagure.APP, user): + output = self.app.post('/api/0/test2/issue/1/status', headers=headers) + self.assertEqual(output.status_code, 404) + data = json.loads(output.data) + self.assertDictEqual( + data, + { + "error": "Project not found", + "error_code": "ENOPROJECT", + } + ) + + # No input + output = self.app.post('/api/0/test4/issue/1/status', headers=headers) + self.assertEqual(output.status_code, 404) + data = json.loads(output.data) + self.assertDictEqual( + data, + { + "error": "Issue not found", + "error_code": "ENOISSUE", + } + ) + + # Create normal issue + repo = pagure.lib.get_project(self.session, 'test4') + msg = pagure.lib.new_issue( + session=self.session, + repo=repo, + title='Test issue #1', + content='We should work on this', + user='pingou', + ticketfolder=None, + private=False, + ) + self.session.commit() + self.assertEqual(msg.title, 'Test issue #1') + + + # Check status before + repo = pagure.lib.get_project(self.session, 'test4') + issue = pagure.lib.search_issues(self.session, repo, issueid=1) + self.assertEqual(issue.status, 'Open') + + data = { + 'title': 'test issue', + } + + user = tests.FakeUser(username='pingou') + with tests.user_set(pagure.APP, user): + # Incomplete request + output = self.app.post( + '/api/0/test4/issue/1/status', data=data, headers=headers) + self.assertEqual(output.status_code, 400) + data = json.loads(output.data) + self.assertDictEqual( + data, + { + "error": "Invalid or incomplete input submited", + "error_code": "EINVALIDREQ", + } + ) + + # No change + repo = pagure.lib.get_project(self.session, 'test4') + issue = pagure.lib.search_issues(self.session, repo, issueid=1) + self.assertEqual(issue.status, 'Open') + + data = { + 'status': 'Open', + } + + # Valid request but no change + output = self.app.post( + '/api/0/test4/issue/1/status', data=data, headers=headers) + self.assertEqual(output.status_code, 200) + data = json.loads(output.data) + self.assertDictEqual( + data, + {'message': 'No changes'} + ) + + # No change + repo = pagure.lib.get_project(self.session, 'test4') + issue = pagure.lib.search_issues(self.session, repo, issueid=1) + self.assertEqual(issue.status, 'Open') + + data = { + 'status': 'Fixed', + } + + # Valid request + output = self.app.post( + '/api/0/test4/issue/1/status', data=data, headers=headers) + self.assertEqual(output.status_code, 200) + data = json.loads(output.data) + self.assertDictEqual( + data, + {'message': 'Successfully edited issue #1'} + ) + + if __name__ == '__main__': SUITE = unittest.TestLoader().loadTestsFromTestCase(PagurePrivateRepotest) unittest.TextTestRunner(verbosity=2).run(SUITE) From f15bdfd4fef63e6e80481b7e42aff3cb92325adb Mon Sep 17 00:00:00 2001 From: farhaanbukhsh Date: Apr 14 2017 10:32:37 +0000 Subject: [PATCH 45/94] Add test for adding comment to issue api endpoint --- diff --git a/tests/test_pagure_private_repo.py b/tests/test_pagure_private_repo.py index 574ae34..a557880 100644 --- a/tests/test_pagure_private_repo.py +++ b/tests/test_pagure_private_repo.py @@ -1995,7 +1995,7 @@ class PagurePrivateRepotest(tests.Modeltests): } ) - def test_api_change_status_issue(self): + def test_api_private_repo_change_status_issue(self): """ Test the api_change_status_issue method of the flask api. """ item = pagure.lib.model.Project( user_id=1, # pingou @@ -2135,6 +2135,128 @@ class PagurePrivateRepotest(tests.Modeltests): {'message': 'Successfully edited issue #1'} ) + @patch('pagure.lib.git.update_git') + @patch('pagure.lib.notify.send_email') + def test_api_private_repo_comment_issue(self, p_send_email, p_ugt): + """ Test the api_comment_issue method of the flask api. """ + p_send_email.return_value = True + p_ugt.return_value = True + + item = pagure.lib.model.Project( + user_id=1, # pingou + name='test4', + description='test project description', + hook_token='aaabbbeeeceee', + private=True, + ) + self.session.add(item) + self.session.commit() + tests.create_tokens(self.session) + tests.create_tokens_acl(self.session) + + headers = {'Authorization': 'token aaabbbcccddd'} + + # Invalid project + output = self.app.post('/api/0/foo/issue/1/comment', headers=headers) + self.assertEqual(output.status_code, 404) + data = json.loads(output.data) + self.assertDictEqual( + data, + { + "error": "Project not found", + "error_code": "ENOPROJECT", + } + ) + + # Invalid token, right project + headers = {'Authorization': 'token aaabbbccc'} + output = self.app.post('/api/0/test4/issue/1/comment', headers=headers) + self.assertEqual(output.status_code, 401) + data = json.loads(output.data) + self.assertDictEqual( + data, + { + "error": "Invalid or expired token. Please visit " \ + "https://pagure.org/ to get or renew your API token.", + "error_code": "EINVALIDTOK", + } + ) + + headers = {'Authorization': 'token aaabbbcccddd'} + # No input + output = self.app.post('/api/0/test4/issue/1/comment', headers=headers) + self.assertEqual(output.status_code, 404) + data = json.loads(output.data) + self.assertDictEqual( + data, + { + "error": "Issue not found", + "error_code": "ENOISSUE", + } + ) + + # Create normal issue + repo = pagure.lib.get_project(self.session, 'test4') + msg = pagure.lib.new_issue( + session=self.session, + repo=repo, + title='Test issue #1', + content='We should work on this', + user='pingou', + ticketfolder=None, + private=False, + issue_uid='aaabbbccc#1', + ) + self.session.commit() + self.assertEqual(msg.title, 'Test issue #1') + + # Check comments before + repo = pagure.lib.get_project(self.session, 'test4') + issue = pagure.lib.search_issues(self.session, repo, issueid=1) + self.assertEqual(len(issue.comments), 0) + + data = { + 'title': 'test issue', + } + + # Incomplete request + output = self.app.post( + '/api/0/test4/issue/1/comment', data=data, headers=headers) + self.assertEqual(output.status_code, 400) + data = json.loads(output.data) + self.assertDictEqual( + data, + { + "error": "Invalid or incomplete input submited", + "error_code": "EINVALIDREQ", + } + ) + + # No change + repo = pagure.lib.get_project(self.session, 'test4') + issue = pagure.lib.search_issues(self.session, repo, issueid=1) + self.assertEqual(issue.status, 'Open') + + data = { + 'comment': 'This is a very interesting question', + } + + # Valid request + output = self.app.post( + '/api/0/test4/issue/1/comment', data=data, headers=headers) + self.assertEqual(output.status_code, 200) + data = json.loads(output.data) + self.assertDictEqual( + data, + {'message': 'Comment added'} + ) + + # One comment added + repo = pagure.lib.get_project(self.session, 'test4') + issue = pagure.lib.search_issues(self.session, repo, issueid=1) + self.assertEqual(len(issue.comments), 1) + + if __name__ == '__main__': SUITE = unittest.TestLoader().loadTestsFromTestCase(PagurePrivateRepotest) From d9fa21236a1b17f3159a060ce190b4d5fb38e535 Mon Sep 17 00:00:00 2001 From: farhaanbukhsh Date: Apr 14 2017 10:32:37 +0000 Subject: [PATCH 46/94] Test for private repo view issue comment api endpoint --- diff --git a/tests/test_pagure_private_repo.py b/tests/test_pagure_private_repo.py index a557880..28c094d 100644 --- a/tests/test_pagure_private_repo.py +++ b/tests/test_pagure_private_repo.py @@ -2256,6 +2256,78 @@ class PagurePrivateRepotest(tests.Modeltests): issue = pagure.lib.search_issues(self.session, repo, issueid=1) self.assertEqual(len(issue.comments), 1) + @patch('pagure.lib.git.update_git') + @patch('pagure.lib.notify.send_email') + def test_api_view_issue_comment(self, p_send_email, p_ugt): + """ Test the api_view_issue_comment endpoint. """ + p_send_email.return_value = True + p_ugt.return_value = True + + self.test_api_private_repo_comment_issue() + + # View a comment that does not exist + output = self.app.get('/api/0/foo/issue/100/comment/2') + self.assertEqual(output.status_code, 404) + + # Issue exists but not the comment + output = self.app.get('/api/0/test/issue/1/comment/2') + self.assertEqual(output.status_code, 404) + + # Issue and comment exists + output = self.app.get('/api/0/test/issue/1/comment/1') + self.assertEqual(output.status_code, 404) + + user = tests.FakeUser(username='pingou') + with tests.user_set(pagure.APP, user): + output = self.app.get('/api/0/test/issue/1/comment/1') + self.assertEqual(output.status_code, 200) + data = json.loads(output.data) + data['date_created'] = '1435821770' + data["comment_date"] = "2015-07-02 09:22" + data["avatar_url"] = "https://seccdn.libravatar.org/avatar/..." + self.assertDictEqual( + data, + { + "avatar_url": "https://seccdn.libravatar.org/avatar/...", + "comment": "This is a very interesting question", + "comment_date": "2015-07-02 09:22", + "date_created": "1435821770", + "edited_on": None, + "editor": None, + "id": 1, + "parent": None, + "user": { + "fullname": "PY C", + "name": "pingou" + } + } + ) + + # Issue and comment exists, using UID + output = self.app.get('/api/0/test/issue/aaabbbccc#1/comment/1') + self.assertEqual(output.status_code, 200) + data = json.loads(output.data) + data['date_created'] = '1435821770' + data["comment_date"] = "2015-07-02 09:22" + data["avatar_url"] = "https://seccdn.libravatar.org/avatar/..." + self.assertDictEqual( + data, + { + "avatar_url": "https://seccdn.libravatar.org/avatar/...", + "comment": "This is a very interesting question", + "comment_date": "2015-07-02 09:22", + "date_created": "1435821770", + "edited_on": None, + "editor": None, + "id": 1, + "parent": None, + "user": { + "fullname": "PY C", + "name": "pingou" + } + } + ) + if __name__ == '__main__': From e3c47c767ddd6d43c33854e6814651706af1de30 Mon Sep 17 00:00:00 2001 From: farhaanbukhsh Date: Apr 14 2017 10:32:37 +0000 Subject: [PATCH 47/94] Fix missing import and pep 8 --- diff --git a/tests/test_pagure_private_repo.py b/tests/test_pagure_private_repo.py index 28c094d..0d35522 100644 --- a/tests/test_pagure_private_repo.py +++ b/tests/test_pagure_private_repo.py @@ -212,7 +212,6 @@ class PagurePrivateRepotest(tests.Modeltests): '

All Projects ' '0

', output.data) - # Add a private project item = pagure.lib.model.Project( user_id=2, # foo @@ -784,7 +783,7 @@ class PagurePrivateRepotest(tests.Modeltests): # Api pull-request views @patch('pagure.lib.notify.send_email') - def test_api_private_repo_fork(self,send_email): + def test_api_private_repo_fork(self, send_email): """ Test api endpoints in api/fork""" send_email.return_value = True @@ -844,37 +843,23 @@ class PagurePrivateRepotest(tests.Modeltests): data, { 'args': { - 'assignee': None, - 'author': None, - 'status': True - }, - 'requests': [{ - 'assignee': None, - 'branch': 'master', - 'branch_from': 'master', - 'closed_at': None, - 'closed_by': None, - 'comments': [], - 'commit_start': None, - 'commit_stop': None, - 'date_created': '1431414800', - 'id': 1, - 'initial_comment': None, - 'project': { - 'date_created': '1431414800', - 'description': 'test project description', - 'id': 1, - 'name': 'test4', - 'parent': None, - 'priorities': {}, - 'tags': [], - 'user': { - 'fullname': 'PY C', - 'name': 'pingou' - } - }, - 'remote_git': None, - 'repo_from': { + 'assignee': None, + 'author': None, + 'status': True + }, + 'requests': [{ + 'assignee': None, + 'branch': 'master', + 'branch_from': 'master', + 'closed_at': None, + 'closed_by': None, + 'comments': [], + 'commit_start': None, + 'commit_stop': None, + 'date_created': '1431414800', + 'id': 1, + 'initial_comment': None, + 'project': { 'date_created': '1431414800', 'description': 'test project description', 'id': 1, @@ -885,24 +870,39 @@ class PagurePrivateRepotest(tests.Modeltests): 'user': { 'fullname': 'PY C', 'name': 'pingou' - } - }, - 'status': 'Open', - 'title': 'test pull-request', - 'uid': '1431414800', - 'updated_on': '1431414800', - 'user': { - 'fullname': 'PY C', - 'name': 'pingou' + } + }, + 'remote_git': None, + 'repo_from': { + 'date_created': '1431414800', + 'description': 'test project description', + 'id': 1, + 'name': 'test4', + 'parent': None, + 'priorities': {}, + 'tags': [], + 'user': { + 'fullname': 'PY C', + 'name': 'pingou' } - }], - 'total_requests': 1 + }, + 'status': 'Open', + 'title': 'test pull-request', + 'uid': '1431414800', + 'updated_on': '1431414800', + 'user': { + 'fullname': 'PY C', + 'name': 'pingou' + } + }], + 'total_requests': 1 } ) headers = {'Authorization': 'token foobar_token'} # Access Pull-Request authenticated - output = self.app.get('/api/0/test4/pull-requests', headers=headers) + output = self.app.get( + '/api/0/test4/pull-requests', headers=headers) self.assertEqual(output.status_code, 200) data2 = json.loads(output.data) data2['requests'][0]['date_created'] = '1431414800' @@ -912,7 +912,6 @@ class PagurePrivateRepotest(tests.Modeltests): data2['requests'][0]['uid'] = '1431414800' self.assertDictEqual(data, data2) - # For single PR output = self.app.get('/api/0/test4/pull-request/1') self.assertEqual(output.status_code, 200) @@ -925,57 +924,58 @@ class PagurePrivateRepotest(tests.Modeltests): self.assertDictEqual( data, { - "assignee": None, - "branch": "master", - "branch_from": "master", - "closed_at": None, - "closed_by": None, - "comments": [], - "commit_start": None, - "commit_stop": None, - "date_created": "1431414800", - "id": 1, - "initial_comment": None, - "project": { - "date_created": "1431414800", - "description": "test project description", - "id": 1, - "name": "test4", - "parent": None, - "priorities": {}, - "tags": [], - "user": { - "fullname": "PY C", - "name": "pingou" - } - }, - "remote_git": None, - "repo_from": { + "assignee": None, + "branch": "master", + "branch_from": "master", + "closed_at": None, + "closed_by": None, + "comments": [], + "commit_start": None, + "commit_stop": None, "date_created": "1431414800", - "description": "test project description", "id": 1, - "name": "test4", - "parent": None, - "priorities": {}, - "tags": [], + "initial_comment": None, + "project": { + "date_created": "1431414800", + "description": "test project description", + "id": 1, + "name": "test4", + "parent": None, + "priorities": {}, + "tags": [], + "user": { + "fullname": "PY C", + "name": "pingou" + } + }, + "remote_git": None, + "repo_from": { + "date_created": "1431414800", + "description": "test project description", + "id": 1, + "name": "test4", + "parent": None, + "priorities": {}, + "tags": [], + "user": { + "fullname": "PY C", + "name": "pingou" + } + }, + "status": 'Open', + "title": "test pull-request", + "uid": "1431414800", + "updated_on": "1431414800", "user": { - "fullname": "PY C", - "name": "pingou" + "fullname": "PY C", + "name": "pingou" } - }, - "status": 'Open', - "title": "test pull-request", - "uid": "1431414800", - "updated_on": "1431414800", - "user": { - "fullname": "PY C", - "name": "pingou" - } } ) # Access Pull-Request authenticated - output = self.app.get('/api/0/test4/pull-request/1', headers=headers) + output = self.app.get( + '/api/0/test4/pull-request/1', headers=headers) self.assertEqual(output.status_code, 200) data2 = json.loads(output.data) data2['date_created'] = '1431414800' @@ -1040,8 +1040,8 @@ class PagurePrivateRepotest(tests.Modeltests): self.assertDictEqual( data, { - "error": "Invalid or incomplete input submited", - "error_code": "EINVALIDREQ", + "error": "Invalid or incomplete input submited", + "error_code": "EINVALIDREQ", } ) @@ -1110,8 +1110,8 @@ class PagurePrivateRepotest(tests.Modeltests): self.assertDictEqual( data, { - "error": "Project not found", - "error_code": "ENOPROJECT", + "error": "Project not found", + "error_code": "ENOPROJECT", } ) @@ -1123,9 +1123,9 @@ class PagurePrivateRepotest(tests.Modeltests): self.assertDictEqual( data, { - "error": "Invalid or expired token. Please visit " \ - "https://pagure.org/ to get or renew your API token.", - "error_code": "EINVALIDTOK", + "error": "Invalid or expired token. Please visit " + "https://pagure.org/ to get or renew your API token.", + "error_code": "EINVALIDTOK", } ) @@ -1137,8 +1137,8 @@ class PagurePrivateRepotest(tests.Modeltests): self.assertDictEqual( data, { - "error": "Pull-Request not found", - "error_code": "ENOREQ", + "error": "Pull-Request not found", + "error_code": "ENOREQ", } ) @@ -1179,8 +1179,8 @@ class PagurePrivateRepotest(tests.Modeltests): self.assertDictEqual( data, { - "error": "Invalid or incomplete input submited", - "error_code": "EINVALIDREQ", + "error": "Invalid or incomplete input submited", + "error_code": "EINVALIDREQ", } ) @@ -1298,8 +1298,8 @@ class PagurePrivateRepotest(tests.Modeltests): self.assertDictEqual( data, { - "error": "Project not found", - "error_code": "ENOPROJECT", + "error": "Project not found", + "error_code": "ENOPROJECT", } ) @@ -1311,9 +1311,9 @@ class PagurePrivateRepotest(tests.Modeltests): self.assertDictEqual( data, { - "error": "Invalid or expired token. Please visit " \ - "https://pagure.org/ to get or renew your API token.", - "error_code": "EINVALIDTOK", + "error": "Invalid or expired token. Please visit " + "https://pagure.org/ to get or renew your API token.", + "error_code": "EINVALIDTOK", } ) @@ -1354,8 +1354,8 @@ class PagurePrivateRepotest(tests.Modeltests): self.assertDictEqual( data, { - "error": "Project not found", - "error_code": "ENOPROJECT", + "error": "Project not found", + "error_code": "ENOPROJECT", } ) @@ -1432,8 +1432,8 @@ class PagurePrivateRepotest(tests.Modeltests): self.assertDictEqual( data, { - "error": "Project not found", - "error_code": "ENOPROJECT", + "error": "Project not found", + "error_code": "ENOPROJECT", } ) @@ -1445,9 +1445,9 @@ class PagurePrivateRepotest(tests.Modeltests): self.assertDictEqual( data, { - "error": "Invalid or expired token. Please visit " \ - "https://pagure.org/ to get or renew your API token.", - "error_code": "EINVALIDTOK", + "error": "Invalid or expired token. Please visit " + "https://pagure.org/ to get or renew your API token.", + "error_code": "EINVALIDTOK", } ) @@ -1488,8 +1488,8 @@ class PagurePrivateRepotest(tests.Modeltests): self.assertDictEqual( data, { - "error": "Project not found", - "error_code": "ENOPROJECT", + "error": "Project not found", + "error_code": "ENOPROJECT", } ) @@ -1549,9 +1549,9 @@ class PagurePrivateRepotest(tests.Modeltests): self.assertDictEqual( data, { - "error": "Invalid or expired token. Please visit " \ - "https://pagure.org/ to get or renew your API token.", - "error_code": "EINVALIDTOK", + "error": "Invalid or expired token. Please visit " + "https://pagure.org/ to get or renew your API token.", + "error_code": "EINVALIDTOK", } ) @@ -1562,8 +1562,8 @@ class PagurePrivateRepotest(tests.Modeltests): self.assertDictEqual( data, { - "error": "Invalid or incomplete input submited", - "error_code": "EINVALIDREQ", + "error": "Invalid or incomplete input submited", + "error_code": "EINVALIDREQ", } ) @@ -1579,8 +1579,8 @@ class PagurePrivateRepotest(tests.Modeltests): self.assertDictEqual( data, { - "error": "Project not found", - "error_code": "ENOPROJECT", + "error": "Project not found", + "error_code": "ENOPROJECT", } ) @@ -1592,8 +1592,8 @@ class PagurePrivateRepotest(tests.Modeltests): self.assertDictEqual( data, { - "error": "Invalid or incomplete input submited", - "error_code": "EINVALIDREQ", + "error": "Invalid or incomplete input submited", + "error_code": "EINVALIDREQ", } ) @@ -1623,8 +1623,8 @@ class PagurePrivateRepotest(tests.Modeltests): self.assertDictEqual( data, { - "error": "Project not found", - "error_code": "ENOPROJECT", + "error": "Project not found", + "error_code": "ENOPROJECT", } ) @@ -1638,33 +1638,33 @@ class PagurePrivateRepotest(tests.Modeltests): self.assertDictEqual( data, { - "args": { - "assignee": None, - "author": None, - "status": None, - "tags": [] - }, - "total_issues": 1, - "issues": [ - { - "assignee": None, - "blocks": [], - "comments": [], - "content": "This issue needs attention", - "date_created": "1431414800", - "depends": [], - "id": 1, - "priority": None, - "private": False, - "status": "Open", - "tags": [], - "title": "test issue", - "user": { - "fullname": "PY C", - "name": "pingou" - } - } - ] + "args": { + "assignee": None, + "author": None, + "status": None, + "tags": [] + }, + "total_issues": 1, + "issues": [ + { + "assignee": None, + "blocks": [], + "comments": [], + "content": "This issue needs attention", + "date_created": "1431414800", + "depends": [], + "id": 1, + "priority": None, + "private": False, + "status": "Open", + "tags": [], + "title": "test issue", + "user": { + "fullname": "PY C", + "name": "pingou" + } + } + ] } ) @@ -1693,35 +1693,35 @@ class PagurePrivateRepotest(tests.Modeltests): self.assertDictEqual( data, {'args': - {'assignee': None, 'author': None, 'status': None, 'tags': []}, - 'issues': [{u'assignee': None, - 'blocks': [], - 'comments': [], - 'content': 'This issue needs attention', - 'date_created': '1431414800', - 'depends': [], - 'id': 1, - 'priority': None, - 'private': False, - 'status': 'Open', - 'tags': [], - 'title': u'test issue', - 'user': {'fullname': 'PY C', 'name': 'pingou'}}, - {'assignee': None, - 'blocks': [], - 'comments': [], - 'content': 'We should work on this', - 'date_created': '1431414800', - 'depends': [], - 'id': 2, - 'priority': None, - 'private': True, - 'status': 'Open', - 'tags': [], - 'title': 'Test issue', - 'user': {'fullname': 'PY C', 'name': 'pingou'}}], + {'assignee': None, 'author': None, 'status': None, 'tags': []}, + 'issues': [{u'assignee': None, + 'blocks': [], + 'comments': [], + 'content': 'This issue needs attention', + 'date_created': '1431414800', + 'depends': [], + 'id': 1, + 'priority': None, + 'private': False, + 'status': 'Open', + 'tags': [], + 'title': u'test issue', + 'user': {'fullname': 'PY C', 'name': 'pingou'}}, + {'assignee': None, + 'blocks': [], + 'comments': [], + 'content': 'We should work on this', + 'date_created': '1431414800', + 'depends': [], + 'id': 2, + 'priority': None, + 'private': True, + 'status': 'Open', + 'tags': [], + 'title': 'Test issue', + 'user': {'fullname': 'PY C', 'name': 'pingou'}}], 'total_issues': 2} - ) + ) # Access issues authenticated but non-existing token headers = {'Authorization': 'token aaabbbccc'} @@ -1739,92 +1739,95 @@ class PagurePrivateRepotest(tests.Modeltests): self.assertDictEqual( data, { - "args": { - "assignee": None, - "author": None, - "status": None, - "tags": [] - }, - "total_issues": 2, - "issues": [ - { - "assignee": None, - "blocks": [], - "comments": [], - "content": "This issue needs attention", - "date_created": "1431414800", - "depends": [], - "id": 1, - "priority": None, - "private": False, - "status": "Open", - "tags": [], - "title": "test issue", - "user": { - "fullname": "PY C", - "name": "pingou" - } + "args": { + "assignee": None, + "author": None, + "status": None, + "tags": [] }, - { - "assignee": None, - "blocks": [], - "comments": [], - "content": "We should work on this", - "date_created": "1431414800", - "depends": [], - "id": 2, - "priority": None, - "private": True, - "status": "Open", - "tags": [], - "title": "Test issue", - "user": { - "fullname": "PY C", - "name": "pingou" - } - } - ] + "total_issues": 2, + "issues": [ + { + "assignee": None, + "blocks": [], + "comments": [], + "content": "This issue needs attention", + "date_created": "1431414800", + "depends": [], + "id": 1, + "priority": None, + "private": False, + "status": "Open", + "tags": [], + "title": "test issue", + "user": { + "fullname": "PY C", + "name": "pingou" + } + }, + { + "assignee": None, + "blocks": [], + "comments": [], + "content": "We should work on this", + "date_created": "1431414800", + "depends": [], + "id": 2, + "priority": None, + "private": True, + "status": "Open", + "tags": [], + "title": "Test issue", + "user": { + "fullname": "PY C", + "name": "pingou" + } + } + ] } ) # List closed issue - output = self.app.get('/api/0/test4/issues?status=Closed', headers=headers) + output = self.app.get( + '/api/0/test4/issues?status=Closed', headers=headers) self.assertEqual(output.status_code, 200) data = json.loads(output.data) self.assertDictEqual( data, { - "args": { - "assignee": None, - "author": None, - "status": "Closed", - "tags": [] - }, - "total_issues": 0, - "issues": [] + "args": { + "assignee": None, + "author": None, + "status": "Closed", + "tags": [] + }, + "total_issues": 0, + "issues": [] } ) # List closed issue - output = self.app.get('/api/0/test4/issues?status=Invalid', headers=headers) + output = self.app.get( + '/api/0/test4/issues?status=Invalid', headers=headers) self.assertEqual(output.status_code, 200) data = json.loads(output.data) self.assertDictEqual( data, { - "args": { - "assignee": None, - "author": None, - "status": "Invalid", - "tags": [] - }, - "total_issues": 0, - "issues": [] + "args": { + "assignee": None, + "author": None, + "status": "Invalid", + "tags": [] + }, + "total_issues": 0, + "issues": [] } ) # List all issues - output = self.app.get('/api/0/test4/issues?status=All', headers=headers) + output = self.app.get( + '/api/0/test4/issues?status=All', headers=headers) self.assertEqual(output.status_code, 200) data = json.loads(output.data) data['issues'][0]['date_created'] = '1431414800' @@ -1891,8 +1894,8 @@ class PagurePrivateRepotest(tests.Modeltests): self.assertDictEqual( data, { - "error": "Project not found", - "error_code": "ENOPROJECT", + "error": "Project not found", + "error_code": "ENOPROJECT", } ) @@ -1903,8 +1906,8 @@ class PagurePrivateRepotest(tests.Modeltests): self.assertDictEqual( data, { - "error": "Project not found", - "error_code": "ENOPROJECT", + "error": "Project not found", + "error_code": "ENOPROJECT", } ) @@ -1917,8 +1920,8 @@ class PagurePrivateRepotest(tests.Modeltests): self.assertDictEqual( data, { - "error": "Project not found", - "error_code": "ENOPROJECT", + "error": "Project not found", + "error_code": "ENOPROJECT", } ) @@ -1932,26 +1935,25 @@ class PagurePrivateRepotest(tests.Modeltests): self.assertDictEqual( data, { - "assignee": None, - "blocks": [], - "comments": [], - "content": "This issue needs attention", - "date_created": "1431414800", - "depends": [], - "id": 1, - "priority": None, - "private": False, - "status": "Open", - "tags": [], - "title": "test issue", - "user": { - "fullname": "PY C", - "name": "pingou" - } + "assignee": None, + "blocks": [], + "comments": [], + "content": "This issue needs attention", + "date_created": "1431414800", + "depends": [], + "id": 1, + "priority": None, + "private": False, + "status": "Open", + "tags": [], + "title": "test issue", + "user": { + "fullname": "PY C", + "name": "pingou" + } } ) - headers = {'Authorization': 'token aaabbbccc'} # Access issue authenticated but non-existing token @@ -1961,8 +1963,8 @@ class PagurePrivateRepotest(tests.Modeltests): self.assertDictEqual( data, { - "error": "Invalid or expired token. Please visit https://pagure.org/ to get or renew your API token.", - "error_code": "EINVALIDTOK" + "error": "Invalid or expired token. Please visit https://pagure.org/ to get or renew your API token.", + "error_code": "EINVALIDTOK" } ) @@ -1976,22 +1978,22 @@ class PagurePrivateRepotest(tests.Modeltests): self.assertDictEqual( data, { - "assignee": None, - "blocks": [], - "comments": [], - "content": "This issue needs attention", - "date_created": "1431414800", - "depends": [], - "id": 1, - "priority": None, - "private": False, - "status": "Open", - "tags": [], - "title": "test issue", - "user": { - "fullname": "PY C", - "name": "pingou" - } + "assignee": None, + "blocks": [], + "comments": [], + "content": "This issue needs attention", + "date_created": "1431414800", + "depends": [], + "id": 1, + "priority": None, + "private": False, + "status": "Open", + "tags": [], + "title": "test issue", + "user": { + "fullname": "PY C", + "name": "pingou" + } } ) @@ -2027,22 +2029,23 @@ class PagurePrivateRepotest(tests.Modeltests): self.assertDictEqual( data, { - "error": "Project not found", - "error_code": "ENOPROJECT", + "error": "Project not found", + "error_code": "ENOPROJECT", } ) # Valid token, wrong project user = tests.FakeUser(username='pingou') with tests.user_set(pagure.APP, user): - output = self.app.post('/api/0/test2/issue/1/status', headers=headers) + output = self.app.post( + '/api/0/test2/issue/1/status', headers=headers) self.assertEqual(output.status_code, 404) data = json.loads(output.data) self.assertDictEqual( data, { - "error": "Project not found", - "error_code": "ENOPROJECT", + "error": "Project not found", + "error_code": "ENOPROJECT", } ) @@ -2053,8 +2056,8 @@ class PagurePrivateRepotest(tests.Modeltests): self.assertDictEqual( data, { - "error": "Issue not found", - "error_code": "ENOISSUE", + "error": "Issue not found", + "error_code": "ENOISSUE", } ) @@ -2072,7 +2075,6 @@ class PagurePrivateRepotest(tests.Modeltests): self.session.commit() self.assertEqual(msg.title, 'Test issue #1') - # Check status before repo = pagure.lib.get_project(self.session, 'test4') issue = pagure.lib.search_issues(self.session, repo, issueid=1) @@ -2092,8 +2094,8 @@ class PagurePrivateRepotest(tests.Modeltests): self.assertDictEqual( data, { - "error": "Invalid or incomplete input submited", - "error_code": "EINVALIDREQ", + "error": "Invalid or incomplete input submited", + "error_code": "EINVALIDREQ", } ) @@ -2163,8 +2165,8 @@ class PagurePrivateRepotest(tests.Modeltests): self.assertDictEqual( data, { - "error": "Project not found", - "error_code": "ENOPROJECT", + "error": "Project not found", + "error_code": "ENOPROJECT", } ) @@ -2176,9 +2178,9 @@ class PagurePrivateRepotest(tests.Modeltests): self.assertDictEqual( data, { - "error": "Invalid or expired token. Please visit " \ - "https://pagure.org/ to get or renew your API token.", - "error_code": "EINVALIDTOK", + "error": "Invalid or expired token. Please visit " + "https://pagure.org/ to get or renew your API token.", + "error_code": "EINVALIDTOK", } ) @@ -2190,8 +2192,8 @@ class PagurePrivateRepotest(tests.Modeltests): self.assertDictEqual( data, { - "error": "Issue not found", - "error_code": "ENOISSUE", + "error": "Issue not found", + "error_code": "ENOISSUE", } ) @@ -2227,8 +2229,8 @@ class PagurePrivateRepotest(tests.Modeltests): self.assertDictEqual( data, { - "error": "Invalid or incomplete input submited", - "error_code": "EINVALIDREQ", + "error": "Invalid or incomplete input submited", + "error_code": "EINVALIDREQ", } ) @@ -2279,7 +2281,7 @@ class PagurePrivateRepotest(tests.Modeltests): user = tests.FakeUser(username='pingou') with tests.user_set(pagure.APP, user): - output = self.app.get('/api/0/test/issue/1/comment/1') + output = self.app.get('/api/0/test4/issue/1/comment/1') self.assertEqual(output.status_code, 200) data = json.loads(output.data) data['date_created'] = '1435821770' @@ -2288,46 +2290,45 @@ class PagurePrivateRepotest(tests.Modeltests): self.assertDictEqual( data, { - "avatar_url": "https://seccdn.libravatar.org/avatar/...", - "comment": "This is a very interesting question", - "comment_date": "2015-07-02 09:22", - "date_created": "1435821770", - "edited_on": None, - "editor": None, - "id": 1, - "parent": None, - "user": { - "fullname": "PY C", - "name": "pingou" - } + "avatar_url": "https://seccdn.libravatar.org/avatar/...", + "comment": "This is a very interesting question", + "comment_date": "2015-07-02 09:22", + "date_created": "1435821770", + "edited_on": None, + "editor": None, + "id": 1, + "parent": None, + "user": { + "fullname": "PY C", + "name": "pingou" + } } ) - # Issue and comment exists, using UID - output = self.app.get('/api/0/test/issue/aaabbbccc#1/comment/1') - self.assertEqual(output.status_code, 200) - data = json.loads(output.data) - data['date_created'] = '1435821770' - data["comment_date"] = "2015-07-02 09:22" - data["avatar_url"] = "https://seccdn.libravatar.org/avatar/..." - self.assertDictEqual( - data, - { - "avatar_url": "https://seccdn.libravatar.org/avatar/...", - "comment": "This is a very interesting question", - "comment_date": "2015-07-02 09:22", - "date_created": "1435821770", - "edited_on": None, - "editor": None, - "id": 1, - "parent": None, - "user": { - "fullname": "PY C", - "name": "pingou" - } - } - ) - + # Issue and comment exists, using UID + output = self.app.get('/api/0/test4/issue/aaabbbccc#1/comment/1') + self.assertEqual(output.status_code, 200) + data = json.loads(output.data) + data['date_created'] = '1435821770' + data["comment_date"] = "2015-07-02 09:22" + data["avatar_url"] = "https://seccdn.libravatar.org/avatar/..." + self.assertDictEqual( + data, + { + "avatar_url": "https://seccdn.libravatar.org/avatar/...", + "comment": "This is a very interesting question", + "comment_date": "2015-07-02 09:22", + "date_created": "1435821770", + "edited_on": None, + "editor": None, + "id": 1, + "parent": None, + "user": { + "fullname": "PY C", + "name": "pingou" + } + } + ) if __name__ == '__main__': From b24eb0dc9985e1e8344ede6c65803e6c21f2fbfe Mon Sep 17 00:00:00 2001 From: farhaanbukhsh Date: Apr 14 2017 10:32:37 +0000 Subject: [PATCH 48/94] Fix test for repo and fork ui `get_project` function was left in the file which got caught because of tests and the other function an extra parameter `username` was passed which was not there. --- diff --git a/pagure/ui/repo.py b/pagure/ui/repo.py index 2846362..9814caf 100644 --- a/pagure/ui/repo.py +++ b/pagure/ui/repo.py @@ -49,10 +49,11 @@ import pagure.lib.plugins import pagure.forms import pagure import pagure.ui.plugins -from pagure.lib import encoding_utils from pagure import (APP, SESSION, LOG, __get_file_in_tree, login_required, is_repo_admin, admin_session_timedout, authenticated, get_authorized_project) +from pagure.lib import encoding_utils + @APP.route('/.git') From 971e0602b7e7cea28475c7157845cedc91cc3a65 Mon Sep 17 00:00:00 2001 From: farhaanbukhsh Date: Apr 14 2017 10:32:37 +0000 Subject: [PATCH 49/94] Fix docstring for get_authorized_project --- diff --git a/pagure/__init__.py b/pagure/__init__.py index c67a703..9b36c4e 100644 --- a/pagure/__init__.py +++ b/pagure/__init__.py @@ -375,7 +375,10 @@ def is_repo_user(repo_obj): def get_authorized_project(session, repo, user=None): - """ Return the projects for which the logged in user is authorize to view. """ + """ Return repo object if repo is public, + if repo is private and user is authorized to + view repo object is returned else None + """ repo = pagure.lib.get_project(session, repo, user) if repo and repo.private and not is_repo_admin(repo): From c879857b673c74a1d82a50d4b2e48ed08278d9f2 Mon Sep 17 00:00:00 2001 From: farhaanbukhsh Date: Apr 14 2017 10:32:37 +0000 Subject: [PATCH 50/94] Fix test failling for card-header count and py3 compatibility `datagrepper` config has to be introduce to avoid graph being shown for the test and `output.data` been replaced by `output.get_data()` for python 3 support. --- diff --git a/tests/test_pagure_flask_api_ui_private_repo.py b/tests/test_pagure_flask_api_ui_private_repo.py new file mode 100644 index 0000000..22b454b --- /dev/null +++ b/tests/test_pagure_flask_api_ui_private_repo.py @@ -0,0 +1,2337 @@ +# -*- coding: utf-8 -*- + +__requires__ = ['SQLAlchemy >= 0.8'] +import pkg_resources + +import datetime +import unittest +import shutil +import sys +import tempfile +import os + +import json +import pygit2 +from mock import patch + +sys.path.insert(0, os.path.join(os.path.dirname( + os.path.abspath(__file__)), '..')) + +import pagure.lib +import tests +from pagure.lib.repo import PagureRepo + + +class PagurePrivateRepotest(tests.Modeltests): + """ Tests for private repo in pagure """ + + def setUp(self): + """ Set up the environnment, ran before every tests. """ + super(PagurePrivateRepotest, self).setUp() + + pagure.APP.config['TESTING'] = True + pagure.APP.config['DATAGREPPER_URL'] = None + pagure.SESSION = self.session + pagure.lib.SESSION = self.session + pagure.ui.SESSION = self.session + pagure.ui.app.SESSION = self.session + pagure.ui.filters.SESSION = self.session + pagure.ui.fork.SESSION = self.session + pagure.ui.repo.SESSION = self.session + pagure.ui.issues.SESSION = self.session + pagure.api.SESSION = self.session + pagure.api.project.SESSION = self.session + pagure.api.fork.SESSION = self.session + pagure.api.issue.SESSION = self.session + + pagure.APP.config['GIT_FOLDER'] = os.path.join(tests.HERE, 'repos') + pagure.APP.config['FORK_FOLDER'] = os.path.join( + tests.HERE, 'forks') + pagure.APP.config['TICKETS_FOLDER'] = os.path.join( + tests.HERE, 'tickets') + pagure.APP.config['DOCS_FOLDER'] = os.path.join( + tests.HERE, 'docs') + pagure.APP.config['REQUESTS_FOLDER'] = os.path.join( + tests.HERE, 'requests') + self.app = pagure.APP.test_client() + + def set_up_git_repo( + self, new_project=None, branch_from='feature', mtype='FF'): + """ Set up the git repo and create the corresponding PullRequest + object. + """ + + # Create a git repo to play with + gitrepo = os.path.join(tests.HERE, 'repos', 'pmc.git') + repo = pygit2.init_repository(gitrepo, bare=True) + + newpath = tempfile.mkdtemp(prefix='pagure-private-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() + + # 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 + [] + ) + refname = 'refs/heads/master:refs/heads/master' + ori_remote = clone_repo.remotes[0] + PagureRepo.push(ori_remote, refname) + + first_commit = repo.revparse_single('HEAD') + + 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 = pygit2.Signature( + 'Alice Äuthòr', 'alice@äuthòrs.tld') + committer = pygit2.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' % branch_from, + tree, + [first_commit.oid.hex] + ) + refname = 'refs/heads/%s' % (branch_from) + ori_remote = repo.remotes[0] + PagureRepo.push(ori_remote, refname) + + # Create a PR for these changes + project = pagure.lib.get_project(self.session, 'pmc') + req = pagure.lib.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', + requestfolder=None, + ) + self.session.commit() + self.assertEqual(req.id, 1) + self.assertEqual(req.title, 'PR from the %s branch' % branch_from) + + shutil.rmtree(newpath) + + def test_index(self): + """ Test the index endpoint. """ + + output = self.app.get('/') + self.assertEqual(output.status_code, 200) + self.assertIn( + '

All Projects ' + '0

', output.get_data(as_text=True)) + + # Add a private project + item = pagure.lib.model.Project( + user_id=2, # foo + name='test3', + description='test project description', + hook_token='aaabbbeee', + private=True, + ) + + self.session.add(item) + + # Add a public project + item = pagure.lib.model.Project( + user_id=2, # foo + name='test4', + description='test project description', + hook_token='aaabbbeeeccceee', + ) + + self.session.add(item) + self.session.commit() + + output = self.app.get('/?page=abc') + self.assertEqual(output.status_code, 200) + self.assertIn( + '

All Projects ' + '1

', output.get_data(as_text=True)) + + user = tests.FakeUser(username='foo') + with tests.user_set(pagure.APP, user): + output = self.app.get('/') + self.assertIn( + 'My Projects 2', + output.get_data(as_text=True)) + self.assertIn( + 'Forks 0', + output.get_data(as_text=True)) + self.assertEqual( + output.get_data(as_text=True).count('

No group found

'), 1) + self.assertEqual( + output.get_data(as_text=True).count('
'), 3) + + def test_view_user(self): + """ Test the view_user endpoint. """ + + output = self.app.get('/user/foo?repopage=abc&forkpage=def') + self.assertEqual(output.status_code, 200) + self.assertIn( + 'Projects 0', + output.get_data(as_text=True)) + self.assertIn( + 'Forks 0', + output.get_data(as_text=True)) + + # Add a private project + item = pagure.lib.model.Project( + user_id=2, # foo + name='test3', + description='test project description', + hook_token='aaabbbeee', + private=True, + ) + + self.session.add(item) + + # Add a public project + item = pagure.lib.model.Project( + user_id=2, # foo + name='test4', + description='test project description', + hook_token='aaabbbeeeccceee', + ) + + self.session.add(item) + self.session.commit() + + self.gitrepos = tests.create_projects_git( + pagure.APP.config['GIT_FOLDER']) + + output = self.app.get('/user/foo') + self.assertEqual(output.status_code, 200) + self.assertIn( + 'Projects 1', + output.get_data(as_text=True)) + self.assertIn( + 'Forks 0', output.get_data(as_text=True)) + + user = tests.FakeUser(username='foo') + with tests.user_set(pagure.APP, user): + output = self.app.get('/user/foo') + self.assertIn( + 'Projects 2', + output.get_data(as_text=True)) + self.assertIn( + 'Forks 0', + output.get_data(as_text=True)) + self.assertEqual( + output.get_data(as_text=True).count('

No group found

'), 1) + self.assertEqual( + output.get_data(as_text=True).count('
'), 3) + + user.username = 'pingou' + with tests.user_set(pagure.APP, user): + output = self.app.get('/user/foo') + self.assertIn( + 'Projects 1', + output.get_data(as_text=True)) + self.assertIn( + 'Forks 0', + output.get_data(as_text=True)) + self.assertEqual( + output.get_data(as_text=True).count('

No group found

'), 1) + self.assertEqual( + output.get_data(as_text=True).count('
'), 3) + + # Check pingou has 0 projects + user.username = 'pingou' + with tests.user_set(pagure.APP, user): + output = self.app.get('/') + self.assertIn( + 'My Projects 0', + output.get_data(as_text=True)) + self.assertIn( + 'Forks 0', + output.get_data(as_text=True)) + self.assertEqual( + output.get_data(as_text=True).count('

No group found

'), 1) + self.assertEqual( + output.get_data(as_text=True).count('
'), 3) + + repo = pagure.lib.get_project(self.session, 'test3') + + msg = pagure.lib.add_user_to_project( + session=self.session, + project=repo, + new_user='pingou', + user='foo', + ) + self.assertEqual(msg, 'User added') + + # New user added to private projects + user.username = 'pingou' + with tests.user_set(pagure.APP, user): + output = self.app.get('/') + self.assertIn( + 'My Projects 1', + output.get_data(as_text=True)) + self.assertIn( + 'Forks 0', + output.get_data(as_text=True)) + self.assertEqual( + output.get_data(as_text=True).count('

No group found

'), 1) + self.assertEqual( + output.get_data(as_text=True).count('
'), 3) + + @patch('pagure.ui.repo.admin_session_timedout') + def test_private_settings_ui(self, ast): + """ Test UI for private repo""" + + # Add private repo + item = pagure.lib.model.Project( + user_id=1, # pingou + name='test4', + description='test project description', + hook_token='aaabbbeeeceee', + private=True, + ) + self.session.add(item) + self.session.commit() + + # Add a git repo + repo_path = os.path.join( + pagure.APP.config.get('GIT_FOLDER'), 'test4.git') + if not os.path.exists(repo_path): + os.makedirs(repo_path) + pygit2.init_repository(repo_path) + + user = tests.FakeUser(username='pingou') + with tests.user_set(pagure.APP, user): + tests.create_projects(self.session) + tests.create_projects_git(pagure.APP.config.get('GIT_FOLDER')) + + ast.return_value = False + output = self.app.post('/test/settings') + + # Check for a public repo + self.assertEqual(output.status_code, 200) + self.assertIn( + '', output.get_data(as_text=True)) + + # Check the new project form has 'private' checkbox + output = self.app.get('/new') + self.assertEqual(output.status_code, 200) + self.assertIn( + '', output.get_data(as_text=True)) + + @patch('pagure.lib.notify.send_email') + def test_private_pr(self, send_email): + """Test pull request made to the private repo""" + + send_email.return_value = True + # Add a private project + item = pagure.lib.model.Project( + user_id=1, # pingou + name='pmc', + description='test project description', + hook_token='aaabbbeeeceee', + private=True, + ) + + self.session.add(item) + self.session.commit() + + repo = pagure.lib.get_project(self.session, 'pmc') + + msg = pagure.lib.add_user_to_project( + session=self.session, + project=repo, + new_user='foo', + user='pingou', + ) + self.session.commit() + self.assertEqual(msg, 'User added') + + # Create all the git repos + tests.create_projects_git( + os.path.join(tests.HERE, 'requests'), bare=True) + + # Add a git repo + repo_path = os.path.join( + pagure.APP.config.get('REQUESTS_FOLDER'), 'pmc.git') + if not os.path.exists(repo_path): + os.makedirs(repo_path) + pygit2.init_repository(repo_path, bare=True) + + # Check repo was created + user = tests.FakeUser(username='pingou') + with tests.user_set(pagure.APP, user): + + output = self.app.get('/user/pingou/') + self.assertEqual(output.status_code, 200) + self.assertIn( + '
\n Projects 1', output.get_data(as_text=True)) + self.assertIn( + 'Forks 0', + output.get_data(as_text=True)) + + self.set_up_git_repo(new_project=None, branch_from='feature') + project = pagure.lib.get_project(self.session, 'pmc') + self.assertEqual(len(project.requests), 1) + + output = self.app.get('/pmc/pull-request/1') + self.assertEqual(output.status_code, 200) + + # Check repo was created + user = tests.FakeUser() + with tests.user_set(pagure.APP, user): + output = self.app.get('/pmc/pull-requests') + self.assertEqual(output.status_code, 404) + + user = tests.FakeUser(username='pingou') + with tests.user_set(pagure.APP, user): + output = self.app.get('/pmc/pull-requests') + self.assertEqual(output.status_code, 200) + + user = tests.FakeUser(username='foo') + with tests.user_set(pagure.APP, user): + output = self.app.get('/pmc/pull-requests') + self.assertEqual(output.status_code, 200) + + @patch('pagure.lib.git.update_git') + @patch('pagure.lib.notify.send_email') + def test_private_repo_issues_ui(self, p_send_email, p_ugt): + """ Test issues made to private repo""" + p_send_email.return_value = True + p_ugt.return_value = True + + # Add private repo + item = pagure.lib.model.Project( + user_id=1, # pingou + name='test4', + description='test project description', + hook_token='aaabbbeeeceee', + private=True, + ) + self.session.add(item) + self.session.commit() + + for repo in ['GIT_FOLDER', 'TICKETS_FOLDER']: + # Add a git repo + repo_path = os.path.join( + pagure.APP.config.get(repo), 'test4.git') + if not os.path.exists(repo_path): + os.makedirs(repo_path) + pygit2.init_repository(repo_path) + + # Check if the private repo issues are publicly not accesible + output = self.app.get('/test4/issues') + self.assertEqual(output.status_code, 404) + + # Create issues to play with + repo = pagure.lib.get_project(self.session, 'test4') + msg = pagure.lib.new_issue( + session=self.session, + repo=repo, + title='Test issue', + content='We should work on this', + user='pingou', + ticketfolder=None + ) + self.session.commit() + self.assertEqual(msg.title, 'Test issue') + + user = tests.FakeUser() + with tests.user_set(pagure.APP, user): + + # Whole list + output = self.app.get('/test4/issues') + self.assertEqual(output.status_code, 404) + + # Check single issue + output = self.app.get('/test4/issue/1') + self.assertEqual(output.status_code, 404) + + user = tests.FakeUser() + with tests.user_set(pagure.APP, user): + + # Whole list + output = self.app.get('/test4/issues') + self.assertEqual(output.status_code, 404) + + user = tests.FakeUser(username='pingou') + with tests.user_set(pagure.APP, user): + + # Whole list + output = self.app.get('/test4/issues') + self.assertEqual(output.status_code, 200) + self.assertIn( + 'Issues - test4 - Pagure', output.get_data(as_text=True)) + self.assertTrue( + '

\n 1 Open Issues' in output.get_data(as_text=True)) + + # Check single issue + output = self.app.get('/test4/issue/1') + self.assertEqual(output.status_code, 200) + + repo = pagure.lib.get_project(self.session, 'test4') + + msg = pagure.lib.add_user_to_project( + session=self.session, + project=repo, + new_user='foo', + user='pingou', + ) + self.session.commit() + self.assertEqual(msg, 'User added') + + user.username = 'foo' + with tests.user_set(pagure.APP, user): + + # Whole list + output = self.app.get('/test4/issues') + self.assertEqual(output.status_code, 200) + self.assertIn( + 'Issues - test4 - Pagure', output.get_data(as_text=True)) + self.assertTrue( + '

\n 1 Open Issues' in output.get_data(as_text=True)) + + # Check single issue + output = self.app.get('/test4/issue/1') + self.assertEqual(output.status_code, 200) + + # API checks + def test_api_private_repo_projects(self): + """ Test api points for private repo for projects""" + + # Add private repo + item = pagure.lib.model.Project( + user_id=1, # pingou + name='test4', + description='test project description', + hook_token='aaabbbeeeceee', + private=True, + ) + self.session.add(item) + self.session.commit() + + # Create a git repo to play with + gitrepo = os.path.join(tests.HERE, 'repos', 'test4.git') + repo = pygit2.init_repository(gitrepo, bare=True) + + newpath = tempfile.mkdtemp(prefix='pagure-fork-test') + repopath = os.path.join(newpath, 'test4') + 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() + + # 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 + [] + ) + refname = 'refs/heads/master:refs/heads/master' + ori_remote = clone_repo.remotes[0] + PagureRepo.push(ori_remote, refname) + + # Tag our first commit + first_commit = repo.revparse_single('HEAD') + tagger = pygit2.Signature('Alice Doe', 'adoe@example.com', 12347, 0) + repo.create_tag( + "0.0.1", first_commit.oid.hex, pygit2.GIT_OBJ_COMMIT, tagger, + "Release 0.0.1") + + # Create a token for foo for this project + item = pagure.lib.model.Token( + id='foobar_token', + user_id=1, + project_id=1, + expiration=datetime.datetime.utcnow() + datetime.timedelta( + days=30) + ) + self.session.add(item) + self.session.commit() + item = pagure.lib.model.TokenAcl( + token_id='foobar_token', + acl_id=1, + ) + self.session.add(item) + self.session.commit() + + # Check if the admin requests + user = tests.FakeUser(username='pingou') + with tests.user_set(pagure.APP, user): + # Check tags + output = self.app.get('/api/0/test4/git/tags') + self.assertEqual(output.status_code, 200) + data = json.loads(output.get_data(as_text=True)) + self.assertDictEqual( + data, + {'tags': ['0.0.1'], 'total_tags': 1} + ) + + output = self.app.get('/api/0/test4/git/tags') + self.assertEqual(output.status_code, 404) + + # Chekc if user is not admin + user = tests.FakeUser() + with tests.user_set(pagure.APP, user): + output = self.app.get('/api/0/test4/git/tags') + self.assertEqual(output.status_code, 404) + + shutil.rmtree(newpath) + + # Check before adding + repo = pagure.lib.get_project(self.session, 'test4') + self.assertEqual(repo.tags, []) + + # Adding a tag + output = pagure.lib.update_tags( + self.session, repo, 'infra', 'pingou', + ticketfolder=None) + self.assertEqual(output, ['Tag added: infra']) + + # Check after adding + repo = pagure.lib.get_project(self.session, 'test4') + self.assertEqual(len(repo.tags), 1) + self.assertEqual(repo.tags_text, ['infra']) + + # Check the API + output = self.app.get('/api/0/projects?tags=inf') + self.assertEqual(output.status_code, 404) + data = json.loads(output.get_data(as_text=True)) + self.assertDictEqual( + data, + {'error_code': 'ENOPROJECTS', 'error': 'No projects found'} + ) + + # Request by not a loggged in user + output = self.app.get('/api/0/projects?tags=infra') + self.assertEqual(output.status_code, 404) + + user = tests.FakeUser() + with tests.user_set(pagure.APP, user): + # Request by a non authorized user + output = self.app.get('/api/0/projects?tags=infra') + self.assertEqual(output.status_code, 404) + + user.username = 'pingou' + with tests.user_set(pagure.APP, user): + # Private repo username is compulsion to pass + output = self.app.get('/api/0/projects?tags=infra') + self.assertEqual(output.status_code, 404) + + output = self.app.get('/api/0/projects?username=pingou') + self.assertEqual(output.status_code, 200) + data = json.loads(output.get_data(as_text=True)) + data['projects'][0]['date_created'] = "1436527638" + self.assertDictEqual( + data, + { + "total_projects": 1, + "projects": [ + { + "date_created": "1436527638", + "description": "test project description", + "id": 1, + "name": "test4", + "parent": None, + "priorities": {}, + "tags": ["infra"], + "user": { + "fullname": "PY C", + "name": "pingou" + } + }, + ] + } + ) + + output = self.app.get('/api/0/projects?username=pingou&tags=infra') + self.assertEqual(output.status_code, 200) + data = json.loads(output.get_data(as_text=True)) + data['projects'][0]['date_created'] = "1436527638" + self.assertDictEqual( + data, + { + "total_projects": 1, + "projects": [ + { + "date_created": "1436527638", + "description": "test project description", + "id": 1, + "name": "test4", + "parent": None, + "priorities": {}, + "tags": ["infra"], + "user": { + "fullname": "PY C", + "name": "pingou" + } + } + ] + } + ) + + # Api pull-request views + @patch('pagure.lib.notify.send_email') + def test_api_private_repo_fork(self, send_email): + """ Test api endpoints in api/fork""" + + send_email.return_value = True + + # Add private repo + item = pagure.lib.model.Project( + user_id=1, # pingou + name='test4', + description='test project description', + hook_token='aaabbbeeeceee', + private=True, + ) + self.session.add(item) + self.session.commit() + + tests.create_tokens(self.session) + tests.create_tokens_acl(self.session) + + headers = {'Authorization': 'token aaabbbcccddd'} + # Create a pull-request + repo = pagure.lib.get_project(self.session, 'test4') + forked_repo = pagure.lib.get_project(self.session, 'test4') + req = pagure.lib.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', + requestfolder=None, + ) + self.session.commit() + self.assertEqual(req.id, 1) + self.assertEqual(req.title, 'test pull-request') + + # Check list of PR + output = self.app.get('/api/0/test4/pull-requests') + self.assertEqual(output.status_code, 404) + + # Check single PR + output = self.app.get('/api/0/test/pull-request/1') + self.assertEqual(output.status_code, 404) + + user = tests.FakeUser(username='pingou') + with tests.user_set(pagure.APP, user): + # List pull-requests + output = self.app.get('/api/0/test4/pull-requests') + self.assertEqual(output.status_code, 200) + data = json.loads(output.get_data(as_text=True)) + data['requests'][0]['date_created'] = '1431414800' + data['requests'][0]['updated_on'] = '1431414800' + data['requests'][0]['project']['date_created'] = '1431414800' + data['requests'][0]['repo_from']['date_created'] = '1431414800' + data['requests'][0]['uid'] = '1431414800' + self.assertDictEqual( + data, + { + 'args': { + 'assignee': None, + 'author': None, + 'status': True + }, + 'requests': [{ + 'assignee': None, + 'branch': 'master', + 'branch_from': 'master', + 'closed_at': None, + 'closed_by': None, + 'comments': [], + 'commit_start': None, + 'commit_stop': None, + 'date_created': '1431414800', + 'id': 1, + 'initial_comment': None, + 'project': { + 'date_created': '1431414800', + 'description': 'test project description', + 'id': 1, + 'name': 'test4', + 'parent': None, + 'priorities': {}, + 'tags': [], + 'user': { + 'fullname': 'PY C', + 'name': 'pingou' + } + }, + 'remote_git': None, + 'repo_from': { + 'date_created': '1431414800', + 'description': 'test project description', + 'id': 1, + 'name': 'test4', + 'parent': None, + 'priorities': {}, + 'tags': [], + 'user': { + 'fullname': 'PY C', + 'name': 'pingou' + } + }, + 'status': 'Open', + 'title': 'test pull-request', + 'uid': '1431414800', + 'updated_on': '1431414800', + 'user': { + 'fullname': 'PY C', + 'name': 'pingou' + } + }], + 'total_requests': 1 + } + ) + headers = {'Authorization': 'token foobar_token'} + + # Access Pull-Request authenticated + output = self.app.get( + '/api/0/test4/pull-requests', headers=headers) + self.assertEqual(output.status_code, 200) + data2 = json.loads(output.get_data(as_text=True)) + data2['requests'][0]['date_created'] = '1431414800' + data2['requests'][0]['updated_on'] = '1431414800' + data2['requests'][0]['project']['date_created'] = '1431414800' + data2['requests'][0]['repo_from']['date_created'] = '1431414800' + data2['requests'][0]['uid'] = '1431414800' + self.assertDictEqual(data, data2) + + # For single PR + output = self.app.get('/api/0/test4/pull-request/1') + self.assertEqual(output.status_code, 200) + data = json.loads(output.get_data(as_text=True)) + data['date_created'] = '1431414800' + data['updated_on'] = '1431414800' + data['project']['date_created'] = '1431414800' + data['repo_from']['date_created'] = '1431414800' + data['uid'] = '1431414800' + self.assertDictEqual( + data, + { + "assignee": None, + "branch": "master", + "branch_from": "master", + "closed_at": None, + "closed_by": None, + "comments": [], + "commit_start": None, + "commit_stop": None, + "date_created": "1431414800", + "id": 1, + "initial_comment": None, + "project": { + "date_created": "1431414800", + "description": "test project description", + "id": 1, + "name": "test4", + "parent": None, + "priorities": {}, + "tags": [], + "user": { + "fullname": "PY C", + "name": "pingou" + } + }, + "remote_git": None, + "repo_from": { + "date_created": "1431414800", + "description": "test project description", + "id": 1, + "name": "test4", + "parent": None, + "priorities": {}, + "tags": [], + "user": { + "fullname": "PY C", + "name": "pingou" + } + }, + "status": 'Open', + "title": "test pull-request", + "uid": "1431414800", + "updated_on": "1431414800", + "user": { + "fullname": "PY C", + "name": "pingou" + } + } + ) + + # Access Pull-Request authenticated + output = self.app.get( + '/api/0/test4/pull-request/1', headers=headers) + self.assertEqual(output.status_code, 200) + data2 = json.loads(output.get_data(as_text=True)) + data2['date_created'] = '1431414800' + data2['project']['date_created'] = '1431414800' + data2['repo_from']['date_created'] = '1431414800' + data2['uid'] = '1431414800' + data2['date_created'] = '1431414800' + data2['updated_on'] = '1431414800' + self.assertDictEqual(data, data2) + + @patch('pagure.lib.notify.send_email') + def test_api_pr_private_repo_add_comment(self, mockemail): + """ Test the api_pull_request_add_comment method of the flask api. """ + mockemail.return_value = True + pagure.APP.config['REQUESTS_FOLDER'] = None + + # Add private repo + item = pagure.lib.model.Project( + user_id=1, # pingou + name='test4', + description='test project description', + hook_token='aaabbbeeeceee', + private=True, + ) + self.session.add(item) + self.session.commit() + tests.create_tokens(self.session) + tests.create_tokens_acl(self.session) + + headers = {'Authorization': 'token aaabbbcccddd'} + # Create a pull-request + repo = pagure.lib.get_project(self.session, 'test4') + forked_repo = pagure.lib.get_project(self.session, 'test4') + req = pagure.lib.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', + requestfolder=None, + ) + self.session.commit() + self.assertEqual(req.id, 1) + self.assertEqual(req.title, 'test pull-request') + + # Check comments before + request = pagure.lib.search_pull_requests( + self.session, project_id=1, requestid=1) + self.assertEqual(len(request.comments), 0) + + data = { + 'title': 'test issue', + } + + # Incomplete request + output = self.app.post( + '/api/0/test4/pull-request/1/comment', 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 submited", + "error_code": "EINVALIDREQ", + } + ) + + # No change + request = pagure.lib.search_pull_requests( + self.session, project_id=1, requestid=1) + self.assertEqual(len(request.comments), 0) + + data = { + 'comment': 'This is a very interesting question', + } + + # Valid request + output = self.app.post( + '/api/0/test4/pull-request/1/comment', data=data, headers=headers) + self.assertEqual(output.status_code, 200) + data = json.loads(output.get_data(as_text=True)) + self.assertDictEqual( + data, + {'message': 'Comment added'} + ) + + # One comment added + request = pagure.lib.search_pull_requests( + self.session, project_id=1, requestid=1) + self.assertEqual(len(request.comments), 1) + + @patch('pagure.lib.notify.send_email') + def test_api_private_repo_pr_add_flag(self, mockemail): + """ Test the api_pull_request_add_flag method of the flask api. """ + mockemail.return_value = True + pagure.APP.config['REQUESTS_FOLDER'] = None + + # Add private repo + item = pagure.lib.model.Project( + user_id=1, # pingou + name='test4', + description='test project description', + hook_token='aaabbbeeeceee', + private=True, + ) + self.session.add(item) + self.session.commit() + + # Add private repo + item = pagure.lib.model.Project( + user_id=1, # pingou + name='test2', + description='test project description', + hook_token='foo_bar', + private=True, + ) + self.session.add(item) + self.session.commit() + + tests.create_tokens(self.session) + tests.create_tokens_acl(self.session) + + 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", + } + ) + + # 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.assertDictEqual( + data, + { + "error": "Invalid or expired token. Please visit " + "https://pagure.org/ to get or renew your API token.", + "error_code": "EINVALIDTOK", + } + ) + + # No input + output = self.app.post( + '/api/0/test4/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", + } + ) + + # Create a pull-request + repo = pagure.lib.get_project(self.session, 'test4') + forked_repo = pagure.lib.get_project(self.session, 'test4') + req = pagure.lib.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', + requestfolder=None, + ) + self.session.commit() + self.assertEqual(req.id, 1) + self.assertEqual(req.title, 'test pull-request') + + # Check comments before + request = pagure.lib.search_pull_requests( + self.session, project_id=1, requestid=1) + self.assertEqual(len(request.flags), 0) + + 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/test4/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 submited", + "error_code": "EINVALIDREQ", + } + ) + + # No change + request = pagure.lib.search_pull_requests( + self.session, project_id=1, requestid=1) + self.assertEqual(len(request.flags), 0) + + data = { + 'username': 'Jenkins', + 'percent': 0, + 'comment': 'Tests failed', + 'url': 'http://jenkins.cloud.fedoraproject.org/', + 'uid': 'jenkins_build_pagure_100+seed', + } + + # Valid request + output = self.app.post( + '/api/0/test4/pull-request/1/flag', data=data, headers=headers) + self.assertEqual(output.status_code, 200) + data = json.loads(output.get_data(as_text=True)) + self.assertDictEqual( + data, + {'message': 'Flag added'} + ) + + # One flag added + request = pagure.lib.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) + + # Update flag + 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/test4/pull-request/1/flag', data=data, headers=headers) + self.assertEqual(output.status_code, 200) + data = json.loads(output.get_data(as_text=True)) + self.assertDictEqual( + data, + {'message': 'Flag updated'} + ) + + # One flag added + request = pagure.lib.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) + + @patch('pagure.lib.notify.send_email') + def test_api_private_repo_pr_close(self, send_email): + """ Test the api_pull_request_close method of the flask api. """ + send_email.return_value = True + + pagure.APP.config['REQUESTS_FOLDER'] = None + + # Add private repo + item = pagure.lib.model.Project( + user_id=1, # pingou + name='test4', + description='test project description', + hook_token='aaabbbeeeceee', + private=True, + ) + self.session.add(item) + self.session.commit() + + tests.create_tokens(self.session) + tests.create_tokens_acl(self.session) + + # Add private repo + item = pagure.lib.model.Project( + user_id=1, # pingou + name='test2', + description='test project description', + hook_token='foo_bar', + private=True, + ) + self.session.add(item) + self.session.commit() + + # Create the pull-request to close + repo = pagure.lib.get_project(self.session, 'test4') + forked_repo = pagure.lib.get_project(self.session, 'test4') + req = pagure.lib.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', + requestfolder=None, + ) + self.session.commit() + self.assertEqual(req.id, 1) + self.assertEqual(req.title, 'test pull-request') + + headers = {'Authorization': 'token aaabbbcccddd'} + + # Invalid project + output = self.app.post( + '/api/0/foo/pull-request/1/close', 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", + } + ) + + # Valid token, wrong project + output = self.app.post( + '/api/0/test2/pull-request/1/close', headers=headers) + self.assertEqual(output.status_code, 401) + data = json.loads(output.get_data(as_text=True)) + self.assertDictEqual( + data, + { + "error": "Invalid or expired token. Please visit " + "https://pagure.org/ to get or renew your API token.", + "error_code": "EINVALIDTOK", + } + ) + + # Invalid PR + output = self.app.post( + '/api/0/test4/pull-request/2/close', 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"} + ) + + # Create a token for foo for this project + item = pagure.lib.model.Token( + id='foobar_token', + user_id=2, + project_id=1, + expiration=datetime.datetime.utcnow() + datetime.timedelta( + days=30) + ) + self.session.add(item) + self.session.commit() + item = pagure.lib.model.TokenAcl( + token_id='foobar_token', + acl_id=2, + ) + self.session.add(item) + self.session.commit() + + headers = {'Authorization': 'token foobar_token'} + + # User not admin + output = self.app.post( + '/api/0/test4/pull-request/1/close', 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", + } + ) + + headers = {'Authorization': 'token aaabbbcccddd'} + + # Close PR + output = self.app.post( + '/api/0/test4/pull-request/1/close', headers=headers) + self.assertEqual(output.status_code, 200) + data = json.loads(output.get_data(as_text=True)) + self.assertDictEqual( + data, + {"message": "Pull-request closed!"} + ) + + @patch('pagure.lib.notify.send_email') + @patch('pagure.lib.git.merge_pull_request') + def test_api_private_repo_pr_merge(self, mpr, send_email): + """ Test the api_pull_request_merge method of the flask api. """ + mpr.return_value = 'Changes merged!' + send_email.return_value = True + + pagure.APP.config['REQUESTS_FOLDER'] = None + + # Add private repo + item = pagure.lib.model.Project( + user_id=1, # pingou + name='test4', + description='test project description', + hook_token='aaabbbeeeceee', + private=True, + ) + self.session.add(item) + self.session.commit() + + tests.create_tokens(self.session) + tests.create_tokens_acl(self.session) + + # Add private repo + item = pagure.lib.model.Project( + user_id=1, # pingou + name='test2', + description='test project description', + hook_token='foo_bar', + private=True, + ) + self.session.add(item) + self.session.commit() + + # Create the pull-request to close + repo = pagure.lib.get_project(self.session, 'test4') + forked_repo = pagure.lib.get_project(self.session, 'test4') + req = pagure.lib.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', + requestfolder=None, + ) + self.session.commit() + self.assertEqual(req.id, 1) + self.assertEqual(req.title, 'test pull-request') + + headers = {'Authorization': 'token aaabbbcccddd'} + + # Invalid project + output = self.app.post( + '/api/0/foo/pull-request/1/merge', 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", + } + ) + + # Valid token, wrong project + output = self.app.post( + '/api/0/test2/pull-request/1/merge', headers=headers) + self.assertEqual(output.status_code, 401) + data = json.loads(output.get_data(as_text=True)) + self.assertDictEqual( + data, + { + "error": "Invalid or expired token. Please visit " + "https://pagure.org/ to get or renew your API token.", + "error_code": "EINVALIDTOK", + } + ) + + # Invalid PR + output = self.app.post( + '/api/0/test4/pull-request/2/merge', 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"} + ) + + # Create a token for foo for this project + item = pagure.lib.model.Token( + id='foobar_token', + user_id=2, + project_id=1, + expiration=datetime.datetime.utcnow() + datetime.timedelta( + days=30) + ) + self.session.add(item) + self.session.commit() + item = pagure.lib.model.TokenAcl( + token_id='foobar_token', + acl_id=3, + ) + self.session.add(item) + self.session.commit() + + headers = {'Authorization': 'token foobar_token'} + + # User not admin + output = self.app.post( + '/api/0/test4/pull-request/1/merge', 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", + } + ) + + headers = {'Authorization': 'token aaabbbcccddd'} + + # Merge PR + output = self.app.post( + '/api/0/test4/pull-request/1/merge', headers=headers) + self.assertEqual(output.status_code, 200) + data = json.loads(output.get_data(as_text=True)) + self.assertDictEqual( + data, + {"message": "Changes merged!"} + ) + + def test_api_private_repo_new_issue(self): + """ Test the api_new_issue method of the flask api. """ + # Add private repo + item = pagure.lib.model.Project( + user_id=1, # pingou + name='test4', + description='test project description', + hook_token='aaabbbeeeceee', + private=True, + ) + self.session.add(item) + self.session.commit() + + for repo in ['GIT_FOLDER', 'TICKETS_FOLDER']: + # Add a git repo + repo_path = os.path.join( + pagure.APP.config.get(repo), 'test4.git') + if not os.path.exists(repo_path): + os.makedirs(repo_path) + pygit2.init_repository(repo_path, bare=True) + + tests.create_tokens(self.session) + tests.create_tokens_acl(self.session) + + # Add private repo + item = pagure.lib.model.Project( + user_id=1, # pingou + name='test2', + description='test project description', + hook_token='foo_bar', + private=True, + ) + self.session.add(item) + self.session.commit() + + headers = {'Authorization': 'token aaabbbcccddd'} + + # Valid token, wrong project + output = self.app.post('/api/0/test2/new_issue', headers=headers) + self.assertEqual(output.status_code, 401) + data = json.loads(output.get_data(as_text=True)) + self.assertDictEqual( + data, + { + "error": "Invalid or expired token. Please visit " + "https://pagure.org/ to get or renew your API token.", + "error_code": "EINVALIDTOK", + } + ) + + # No input + output = self.app.post('/api/0/test4/new_issue', 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 submited", + "error_code": "EINVALIDREQ", + } + ) + + data = { + 'title': 'test issue', + } + + # Invalid repo + output = self.app.post( + '/api/0/foo/new_issue', data=data, 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", + } + ) + + # Incomplete request + output = self.app.post( + '/api/0/test4/new_issue', 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 submited", + "error_code": "EINVALIDREQ", + } + ) + + data = { + 'title': 'test issue', + 'issue_content': 'This issue needs attention', + } + + # Valid request + output = self.app.post( + '/api/0/test4/new_issue', data=data, headers=headers) + self.assertEqual(output.status_code, 200) + data = json.loads(output.get_data(as_text=True)) + self.assertDictEqual( + data, + {'message': 'Issue created'} + ) + + def test_api_priavte_repo_view_issues(self): + """ Test the api_view_issues method of the flask api. """ + self.test_api_private_repo_new_issue() + + # Invalid repo + output = self.app.get('/api/0/foo/issues') + 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", + } + ) + + # List all opened issues + user = tests.FakeUser(username='pingou') + with tests.user_set(pagure.APP, user): + output = self.app.get('/api/0/test4/issues') + self.assertEqual(output.status_code, 200) + data = json.loads(output.get_data(as_text=True)) + data['issues'][0]['date_created'] = '1431414800' + self.assertDictEqual( + data, + { + "args": { + "assignee": None, + "author": None, + "status": None, + "tags": [] + }, + "total_issues": 1, + "issues": [ + { + "assignee": None, + "blocks": [], + "comments": [], + "content": "This issue needs attention", + "date_created": "1431414800", + "depends": [], + "id": 1, + "priority": None, + "private": False, + "status": "Open", + "tags": [], + "title": "test issue", + "user": { + "fullname": "PY C", + "name": "pingou" + } + } + ] + } + ) + + # Create private issue + repo = pagure.lib.get_project(self.session, 'test4') + msg = pagure.lib.new_issue( + session=self.session, + repo=repo, + title='Test issue', + content='We should work on this', + user='pingou', + ticketfolder=None, + private=True, + ) + self.session.commit() + self.assertEqual(msg.title, 'Test issue') + + # Private issues are retrieved + user = tests.FakeUser(username='pingou') + with tests.user_set(pagure.APP, user): + output = self.app.get('/api/0/test4/issues') + self.assertEqual(output.status_code, 200) + data = json.loads(output.get_data(as_text=True)) + data['issues'][0]['date_created'] = '1431414800' + data['issues'][1]['date_created'] = '1431414800' + self.assertDictEqual( + data, + {'args': + {'assignee': None, 'author': None, 'status': None, 'tags': []}, + 'issues': [{u'assignee': None, + 'blocks': [], + 'comments': [], + 'content': 'This issue needs attention', + 'date_created': '1431414800', + 'depends': [], + 'id': 1, + 'priority': None, + 'private': False, + 'status': 'Open', + 'tags': [], + 'title': u'test issue', + 'user': {'fullname': 'PY C', 'name': 'pingou'}}, + {'assignee': None, + 'blocks': [], + 'comments': [], + 'content': 'We should work on this', + 'date_created': '1431414800', + 'depends': [], + 'id': 2, + 'priority': None, + 'private': True, + 'status': 'Open', + 'tags': [], + 'title': 'Test issue', + 'user': {'fullname': 'PY C', 'name': 'pingou'}}], + 'total_issues': 2} + ) + + # Access issues authenticated but non-existing token + headers = {'Authorization': 'token aaabbbccc'} + output = self.app.get('/api/0/test4/issues', headers=headers) + self.assertEqual(output.status_code, 401) + + headers = {'Authorization': 'token aaabbbcccddd'} + + # Access issues authenticated correctly + output = self.app.get('/api/0/test4/issues', headers=headers) + self.assertEqual(output.status_code, 200) + data = json.loads(output.get_data(as_text=True)) + data['issues'][0]['date_created'] = '1431414800' + data['issues'][1]['date_created'] = '1431414800' + self.assertDictEqual( + data, + { + "args": { + "assignee": None, + "author": None, + "status": None, + "tags": [] + }, + "total_issues": 2, + "issues": [ + { + "assignee": None, + "blocks": [], + "comments": [], + "content": "This issue needs attention", + "date_created": "1431414800", + "depends": [], + "id": 1, + "priority": None, + "private": False, + "status": "Open", + "tags": [], + "title": "test issue", + "user": { + "fullname": "PY C", + "name": "pingou" + } + }, + { + "assignee": None, + "blocks": [], + "comments": [], + "content": "We should work on this", + "date_created": "1431414800", + "depends": [], + "id": 2, + "priority": None, + "private": True, + "status": "Open", + "tags": [], + "title": "Test issue", + "user": { + "fullname": "PY C", + "name": "pingou" + } + } + ] + } + ) + + # List closed issue + output = self.app.get( + '/api/0/test4/issues?status=Closed', headers=headers) + self.assertEqual(output.status_code, 200) + data = json.loads(output.get_data(as_text=True)) + self.assertDictEqual( + data, + { + "args": { + "assignee": None, + "author": None, + "status": "Closed", + "tags": [] + }, + "total_issues": 0, + "issues": [] + } + ) + + # List closed issue + output = self.app.get( + '/api/0/test4/issues?status=Invalid', headers=headers) + self.assertEqual(output.status_code, 200) + data = json.loads(output.get_data(as_text=True)) + self.assertDictEqual( + data, + { + "args": { + "assignee": None, + "author": None, + "status": "Invalid", + "tags": [] + }, + "total_issues": 0, + "issues": [] + } + ) + + # List all issues + output = self.app.get( + '/api/0/test4/issues?status=All', headers=headers) + self.assertEqual(output.status_code, 200) + data = json.loads(output.get_data(as_text=True)) + data['issues'][0]['date_created'] = '1431414800' + data['issues'][1]['date_created'] = '1431414800' + self.assertDictEqual( + data, + { + "args": { + "assignee": None, + "author": None, + "status": "All", + "tags": [] + }, + "total_issues": 2, + "issues": [ + { + "assignee": None, + "blocks": [], + "comments": [], + "content": "This issue needs attention", + "date_created": "1431414800", + "depends": [], + "id": 1, + "priority": None, + "private": False, + "status": "Open", + "tags": [], + "title": "test issue", + "user": { + "fullname": "PY C", + "name": "pingou" + } + }, + { + "assignee": None, + "blocks": [], + "comments": [], + "content": "We should work on this", + "date_created": "1431414800", + "depends": [], + "id": 2, + "priority": None, + "private": True, + "status": "Open", + "tags": [], + "title": "Test issue", + "user": { + "fullname": "PY C", + "name": "pingou" + } + } + ], + } + ) + + def test_api_pivate_repo_view_issue(self): + """ Test the api_view_issue method of the flask api. """ + self.test_api_private_repo_new_issue() + + # Invalid repo + output = self.app.get('/api/0/foo/issue/1') + 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", + } + ) + + # Invalid issue for this repo + output = self.app.get('/api/0/test4/issue/1') + 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", + } + ) + + # Un-authorized user + user = tests.FakeUser() + with tests.user_set(pagure.APP, user): + output = self.app.get('/api/0/test4/issue/1') + 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", + } + ) + + # Valid issue + user = tests.FakeUser(username='pingou') + with tests.user_set(pagure.APP, user): + output = self.app.get('/api/0/test4/issue/1') + self.assertEqual(output.status_code, 200) + data = json.loads(output.get_data(as_text=True)) + data['date_created'] = '1431414800' + self.assertDictEqual( + data, + { + "assignee": None, + "blocks": [], + "comments": [], + "content": "This issue needs attention", + "date_created": "1431414800", + "depends": [], + "id": 1, + "priority": None, + "private": False, + "status": "Open", + "tags": [], + "title": "test issue", + "user": { + "fullname": "PY C", + "name": "pingou" + } + } + ) + + headers = {'Authorization': 'token aaabbbccc'} + + # Access issue authenticated but non-existing token + output = self.app.get('/api/0/test4/issue/1', headers=headers) + self.assertEqual(output.status_code, 401) + data = json.loads(output.get_data(as_text=True)) + self.assertDictEqual( + data, + { + "error": "Invalid or expired token. Please visit https://pagure.org/ to get or renew your API token.", + "error_code": "EINVALIDTOK" + } + ) + + headers = {'Authorization': 'token aaabbbcccddd'} + + # Access issue authenticated correctly + output = self.app.get('/api/0/test4/issue/1', headers=headers) + self.assertEqual(output.status_code, 200) + data = json.loads(output.get_data(as_text=True)) + data['date_created'] = '1431414800' + self.assertDictEqual( + data, + { + "assignee": None, + "blocks": [], + "comments": [], + "content": "This issue needs attention", + "date_created": "1431414800", + "depends": [], + "id": 1, + "priority": None, + "private": False, + "status": "Open", + "tags": [], + "title": "test issue", + "user": { + "fullname": "PY C", + "name": "pingou" + } + } + ) + + def test_api_private_repo_change_status_issue(self): + """ Test the api_change_status_issue method of the flask api. """ + item = pagure.lib.model.Project( + user_id=1, # pingou + name='test4', + description='test project description', + hook_token='aaabbbeeeceee', + private=True, + ) + self.session.add(item) + self.session.commit() + + for repo in ['GIT_FOLDER', 'TICKETS_FOLDER']: + # Add a git repo + repo_path = os.path.join( + pagure.APP.config.get(repo), 'test4.git') + if not os.path.exists(repo_path): + os.makedirs(repo_path) + pygit2.init_repository(repo_path, bare=True) + + tests.create_tokens(self.session) + tests.create_tokens_acl(self.session) + + headers = {'Authorization': 'token aaabbbcccddd'} + + # Invalid project + output = self.app.post('/api/0/foo/issue/1/status', 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", + } + ) + + # Valid token, wrong project + user = tests.FakeUser(username='pingou') + with tests.user_set(pagure.APP, user): + output = self.app.post( + '/api/0/test2/issue/1/status', 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", + } + ) + + # No input + output = self.app.post('/api/0/test4/issue/1/status', headers=headers) + self.assertEqual(output.status_code, 404) + data = json.loads(output.get_data(as_text=True)) + self.assertDictEqual( + data, + { + "error": "Issue not found", + "error_code": "ENOISSUE", + } + ) + + # Create normal issue + repo = pagure.lib.get_project(self.session, 'test4') + msg = pagure.lib.new_issue( + session=self.session, + repo=repo, + title='Test issue #1', + content='We should work on this', + user='pingou', + ticketfolder=None, + private=False, + ) + self.session.commit() + self.assertEqual(msg.title, 'Test issue #1') + + # Check status before + repo = pagure.lib.get_project(self.session, 'test4') + issue = pagure.lib.search_issues(self.session, repo, issueid=1) + self.assertEqual(issue.status, 'Open') + + data = { + 'title': 'test issue', + } + + user = tests.FakeUser(username='pingou') + with tests.user_set(pagure.APP, user): + # Incomplete request + output = self.app.post( + '/api/0/test4/issue/1/status', 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 submited", + "error_code": "EINVALIDREQ", + } + ) + + # No change + repo = pagure.lib.get_project(self.session, 'test4') + issue = pagure.lib.search_issues(self.session, repo, issueid=1) + self.assertEqual(issue.status, 'Open') + + data = { + 'status': 'Open', + } + + # Valid request but no change + output = self.app.post( + '/api/0/test4/issue/1/status', data=data, headers=headers) + self.assertEqual(output.status_code, 200) + data = json.loads(output.get_data(as_text=True)) + self.assertDictEqual( + data, + {'message': 'No changes'} + ) + + # No change + repo = pagure.lib.get_project(self.session, 'test4') + issue = pagure.lib.search_issues(self.session, repo, issueid=1) + self.assertEqual(issue.status, 'Open') + + data = { + 'status': 'Fixed', + } + + # Valid request + output = self.app.post( + '/api/0/test4/issue/1/status', data=data, headers=headers) + self.assertEqual(output.status_code, 200) + data = json.loads(output.get_data(as_text=True)) + self.assertDictEqual( + data, + {'message': 'Successfully edited issue #1'} + ) + + @patch('pagure.lib.git.update_git') + @patch('pagure.lib.notify.send_email') + def test_api_private_repo_comment_issue(self, p_send_email, p_ugt): + """ Test the api_comment_issue method of the flask api. """ + p_send_email.return_value = True + p_ugt.return_value = True + + item = pagure.lib.model.Project( + user_id=1, # pingou + name='test4', + description='test project description', + hook_token='aaabbbeeeceee', + private=True, + ) + self.session.add(item) + self.session.commit() + tests.create_tokens(self.session) + tests.create_tokens_acl(self.session) + + headers = {'Authorization': 'token aaabbbcccddd'} + + # Invalid project + output = self.app.post('/api/0/foo/issue/1/comment', 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", + } + ) + + # Invalid token, right project + headers = {'Authorization': 'token aaabbbccc'} + output = self.app.post('/api/0/test4/issue/1/comment', headers=headers) + self.assertEqual(output.status_code, 401) + data = json.loads(output.get_data(as_text=True)) + self.assertDictEqual( + data, + { + "error": "Invalid or expired token. Please visit " + "https://pagure.org/ to get or renew your API token.", + "error_code": "EINVALIDTOK", + } + ) + + headers = {'Authorization': 'token aaabbbcccddd'} + # No input + output = self.app.post('/api/0/test4/issue/1/comment', headers=headers) + self.assertEqual(output.status_code, 404) + data = json.loads(output.get_data(as_text=True)) + self.assertDictEqual( + data, + { + "error": "Issue not found", + "error_code": "ENOISSUE", + } + ) + + # Create normal issue + repo = pagure.lib.get_project(self.session, 'test4') + msg = pagure.lib.new_issue( + session=self.session, + repo=repo, + title='Test issue #1', + content='We should work on this', + user='pingou', + ticketfolder=None, + private=False, + issue_uid='aaabbbccc#1', + ) + self.session.commit() + self.assertEqual(msg.title, 'Test issue #1') + + # Check comments before + repo = pagure.lib.get_project(self.session, 'test4') + issue = pagure.lib.search_issues(self.session, repo, issueid=1) + self.assertEqual(len(issue.comments), 0) + + data = { + 'title': 'test issue', + } + + # Incomplete request + output = self.app.post( + '/api/0/test4/issue/1/comment', 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 submited", + "error_code": "EINVALIDREQ", + } + ) + + # No change + repo = pagure.lib.get_project(self.session, 'test4') + issue = pagure.lib.search_issues(self.session, repo, issueid=1) + self.assertEqual(issue.status, 'Open') + + data = { + 'comment': 'This is a very interesting question', + } + + # Valid request + output = self.app.post( + '/api/0/test4/issue/1/comment', data=data, headers=headers) + self.assertEqual(output.status_code, 200) + data = json.loads(output.get_data(as_text=True)) + self.assertDictEqual( + data, + {'message': 'Comment added'} + ) + + # One comment added + repo = pagure.lib.get_project(self.session, 'test4') + issue = pagure.lib.search_issues(self.session, repo, issueid=1) + self.assertEqual(len(issue.comments), 1) + + @patch('pagure.lib.git.update_git') + @patch('pagure.lib.notify.send_email') + def test_api_view_issue_comment(self, p_send_email, p_ugt): + """ Test the api_view_issue_comment endpoint. """ + p_send_email.return_value = True + p_ugt.return_value = True + + self.test_api_private_repo_comment_issue() + + # View a comment that does not exist + output = self.app.get('/api/0/foo/issue/100/comment/2') + self.assertEqual(output.status_code, 404) + + # Issue exists but not the comment + output = self.app.get('/api/0/test/issue/1/comment/2') + self.assertEqual(output.status_code, 404) + + # Issue and comment exists + output = self.app.get('/api/0/test/issue/1/comment/1') + self.assertEqual(output.status_code, 404) + + user = tests.FakeUser(username='pingou') + with tests.user_set(pagure.APP, user): + output = self.app.get('/api/0/test4/issue/1/comment/1') + self.assertEqual(output.status_code, 200) + data = json.loads(output.get_data(as_text=True)) + data['date_created'] = '1435821770' + data["comment_date"] = "2015-07-02 09:22" + data["avatar_url"] = "https://seccdn.libravatar.org/avatar/..." + self.assertDictEqual( + data, + { + "avatar_url": "https://seccdn.libravatar.org/avatar/...", + "comment": "This is a very interesting question", + "comment_date": "2015-07-02 09:22", + "date_created": "1435821770", + "edited_on": None, + "editor": None, + "id": 1, + "parent": None, + "user": { + "fullname": "PY C", + "name": "pingou" + } + } + ) + + # Issue and comment exists, using UID + output = self.app.get('/api/0/test4/issue/aaabbbccc#1/comment/1') + self.assertEqual(output.status_code, 200) + data = json.loads(output.get_data(as_text=True)) + data['date_created'] = '1435821770' + data["comment_date"] = "2015-07-02 09:22" + data["avatar_url"] = "https://seccdn.libravatar.org/avatar/..." + self.assertDictEqual( + data, + { + "avatar_url": "https://seccdn.libravatar.org/avatar/...", + "comment": "This is a very interesting question", + "comment_date": "2015-07-02 09:22", + "date_created": "1435821770", + "edited_on": None, + "editor": None, + "id": 1, + "parent": None, + "user": { + "fullname": "PY C", + "name": "pingou" + } + } + ) + + +if __name__ == '__main__': + SUITE = unittest.TestLoader().loadTestsFromTestCase(PagurePrivateRepotest) + unittest.TextTestRunner(verbosity=2).run(SUITE) diff --git a/tests/test_pagure_private_repo.py b/tests/test_pagure_private_repo.py deleted file mode 100644 index 0d35522..0000000 --- a/tests/test_pagure_private_repo.py +++ /dev/null @@ -1,2336 +0,0 @@ -# -*- coding: utf-8 -*- - -__requires__ = ['SQLAlchemy >= 0.8'] -import pkg_resources - -import datetime -import unittest -import shutil -import sys -import tempfile -import os - -import json -import pygit2 -from mock import patch - -sys.path.insert(0, os.path.join(os.path.dirname( - os.path.abspath(__file__)), '..')) - -import pagure.lib -import tests -from pagure.lib.repo import PagureRepo - - -class PagurePrivateRepotest(tests.Modeltests): - """ Tests for private repo in pagure """ - - def setUp(self): - """ Set up the environnment, ran before every tests. """ - super(PagurePrivateRepotest, self).setUp() - - pagure.APP.config['TESTING'] = True - pagure.SESSION = self.session - pagure.lib.SESSION = self.session - pagure.ui.SESSION = self.session - pagure.ui.app.SESSION = self.session - pagure.ui.filters.SESSION = self.session - pagure.ui.fork.SESSION = self.session - pagure.ui.repo.SESSION = self.session - pagure.ui.issues.SESSION = self.session - pagure.api.SESSION = self.session - pagure.api.project.SESSION = self.session - pagure.api.fork.SESSION = self.session - pagure.api.issue.SESSION = self.session - - pagure.APP.config['GIT_FOLDER'] = os.path.join(tests.HERE, 'repos') - pagure.APP.config['FORK_FOLDER'] = os.path.join( - tests.HERE, 'forks') - pagure.APP.config['TICKETS_FOLDER'] = os.path.join( - tests.HERE, 'tickets') - pagure.APP.config['DOCS_FOLDER'] = os.path.join( - tests.HERE, 'docs') - pagure.APP.config['REQUESTS_FOLDER'] = os.path.join( - tests.HERE, 'requests') - self.app = pagure.APP.test_client() - - def set_up_git_repo( - self, new_project=None, branch_from='feature', mtype='FF'): - """ Set up the git repo and create the corresponding PullRequest - object. - """ - - # Create a git repo to play with - gitrepo = os.path.join(tests.HERE, 'repos', 'pmc.git') - repo = pygit2.init_repository(gitrepo, bare=True) - - newpath = tempfile.mkdtemp(prefix='pagure-private-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() - - # 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 - [] - ) - refname = 'refs/heads/master:refs/heads/master' - ori_remote = clone_repo.remotes[0] - PagureRepo.push(ori_remote, refname) - - first_commit = repo.revparse_single('HEAD') - - 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 = pygit2.Signature( - 'Alice Äuthòr', 'alice@äuthòrs.tld') - committer = pygit2.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' % branch_from, - tree, - [first_commit.oid.hex] - ) - refname = 'refs/heads/%s' % (branch_from) - ori_remote = repo.remotes[0] - PagureRepo.push(ori_remote, refname) - - # Create a PR for these changes - project = pagure.lib.get_project(self.session, 'pmc') - req = pagure.lib.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', - requestfolder=None, - ) - self.session.commit() - self.assertEqual(req.id, 1) - self.assertEqual(req.title, 'PR from the %s branch' % branch_from) - - shutil.rmtree(newpath) - - def test_index(self): - """ Test the index endpoint. """ - - output = self.app.get('/') - self.assertEqual(output.status_code, 200) - self.assertIn( - '

All Projects ' - '0

', output.data) - - # Add a private project - item = pagure.lib.model.Project( - user_id=2, # foo - name='test3', - description='test project description', - hook_token='aaabbbeee', - private=True, - ) - - self.session.add(item) - - # Add a public project - item = pagure.lib.model.Project( - user_id=2, # foo - name='test4', - description='test project description', - hook_token='aaabbbeeeccceee', - ) - - self.session.add(item) - self.session.commit() - - output = self.app.get('/?page=abc') - self.assertEqual(output.status_code, 200) - self.assertIn( - '

All Projects ' - '1

', output.data) - - user = tests.FakeUser(username='foo') - with tests.user_set(pagure.APP, user): - output = self.app.get('/') - self.assertIn( - 'My Projects 2', - output.data) - self.assertIn( - 'Forks 0', - output.data) - self.assertEqual( - output.data.count('

No group found

'), 1) - self.assertEqual( - output.data.count('
'), 3) - - def test_view_user(self): - """ Test the view_user endpoint. """ - - output = self.app.get('/user/foo?repopage=abc&forkpage=def') - self.assertEqual(output.status_code, 200) - self.assertIn( - 'Projects 0', - output.data) - self.assertIn( - 'Forks 0', - output.data) - - # Add a private project - item = pagure.lib.model.Project( - user_id=2, # foo - name='test3', - description='test project description', - hook_token='aaabbbeee', - private=True, - ) - - self.session.add(item) - - # Add a public project - item = pagure.lib.model.Project( - user_id=2, # foo - name='test4', - description='test project description', - hook_token='aaabbbeeeccceee', - ) - - self.session.add(item) - self.session.commit() - - self.gitrepos = tests.create_projects_git( - pagure.APP.config['GIT_FOLDER']) - - output = self.app.get('/user/foo') - self.assertEqual(output.status_code, 200) - self.assertIn( - 'Projects 1', - output.data) - self.assertIn( - 'Forks 0', output.data) - - user = tests.FakeUser(username='foo') - with tests.user_set(pagure.APP, user): - output = self.app.get('/user/foo') - self.assertIn( - 'Projects 2', - output.data) - self.assertIn( - 'Forks 0', - output.data) - self.assertEqual( - output.data.count('

No group found

'), 1) - self.assertEqual( - output.data.count('
'), 3) - - user.username = 'pingou' - with tests.user_set(pagure.APP, user): - output = self.app.get('/user/foo') - self.assertIn( - 'Projects 1', - output.data) - self.assertIn( - 'Forks 0', - output.data) - self.assertEqual( - output.data.count('

No group found

'), 1) - self.assertEqual( - output.data.count('
'), 3) - - # Check pingou has 0 projects - user.username = 'pingou' - with tests.user_set(pagure.APP, user): - output = self.app.get('/') - self.assertIn( - 'My Projects 0', - output.data) - self.assertIn( - 'Forks 0', - output.data) - self.assertEqual( - output.data.count('

No group found

'), 1) - self.assertEqual( - output.data.count('
'), 3) - - repo = pagure.lib.get_project(self.session, 'test3') - - msg = pagure.lib.add_user_to_project( - session=self.session, - project=repo, - new_user='pingou', - user='foo', - ) - self.assertEqual(msg, 'User added') - - # New user added to private projects - user.username = 'pingou' - with tests.user_set(pagure.APP, user): - output = self.app.get('/') - self.assertIn( - 'My Projects 1', - output.data) - self.assertIn( - 'Forks 0', - output.data) - self.assertEqual( - output.data.count('

No group found

'), 1) - self.assertEqual( - output.data.count('
'), 3) - - @patch('pagure.ui.repo.admin_session_timedout') - def test_private_settings_ui(self, ast): - """ Test UI for private repo""" - - # Add private repo - item = pagure.lib.model.Project( - user_id=1, # pingou - name='test4', - description='test project description', - hook_token='aaabbbeeeceee', - private=True, - ) - self.session.add(item) - self.session.commit() - - # Add a git repo - repo_path = os.path.join( - pagure.APP.config.get('GIT_FOLDER'), 'test4.git') - if not os.path.exists(repo_path): - os.makedirs(repo_path) - pygit2.init_repository(repo_path) - - user = tests.FakeUser(username='pingou') - with tests.user_set(pagure.APP, user): - tests.create_projects(self.session) - tests.create_projects_git(pagure.APP.config.get('GIT_FOLDER')) - - ast.return_value = False - output = self.app.post('/test/settings') - - # Check for a public repo - self.assertEqual(output.status_code, 200) - self.assertIn( - '', output.data) - - # Check the new project form has 'private' checkbox - output = self.app.get('/new') - self.assertEqual(output.status_code, 200) - self.assertIn( - '', output.data) - - @patch('pagure.lib.notify.send_email') - def test_private_pr(self, send_email): - """Test pull request made to the private repo""" - - send_email.return_value = True - # Add a private project - item = pagure.lib.model.Project( - user_id=1, # pingou - name='pmc', - description='test project description', - hook_token='aaabbbeeeceee', - private=True, - ) - - self.session.add(item) - self.session.commit() - - repo = pagure.lib.get_project(self.session, 'pmc') - - msg = pagure.lib.add_user_to_project( - session=self.session, - project=repo, - new_user='foo', - user='pingou', - ) - self.session.commit() - self.assertEqual(msg, 'User added') - - # Create all the git repos - tests.create_projects_git( - os.path.join(tests.HERE, 'requests'), bare=True) - - # Add a git repo - repo_path = os.path.join( - pagure.APP.config.get('REQUESTS_FOLDER'), 'pmc.git') - if not os.path.exists(repo_path): - os.makedirs(repo_path) - pygit2.init_repository(repo_path, bare=True) - - # Check repo was created - user = tests.FakeUser(username='pingou') - with tests.user_set(pagure.APP, user): - - output = self.app.get('/user/pingou/') - self.assertEqual(output.status_code, 200) - self.assertIn( - '
\n Projects 1', output.data) - self.assertIn( - 'Forks 0', - output.data) - - self.set_up_git_repo(new_project=None, branch_from='feature') - project = pagure.lib.get_project(self.session, 'pmc') - self.assertEqual(len(project.requests), 1) - - output = self.app.get('/pmc/pull-request/1') - self.assertEqual(output.status_code, 200) - - # Check repo was created - user = tests.FakeUser() - with tests.user_set(pagure.APP, user): - output = self.app.get('/pmc/pull-requests') - self.assertEqual(output.status_code, 404) - - user = tests.FakeUser(username='pingou') - with tests.user_set(pagure.APP, user): - output = self.app.get('/pmc/pull-requests') - self.assertEqual(output.status_code, 200) - - user = tests.FakeUser(username='foo') - with tests.user_set(pagure.APP, user): - output = self.app.get('/pmc/pull-requests') - self.assertEqual(output.status_code, 200) - - @patch('pagure.lib.git.update_git') - @patch('pagure.lib.notify.send_email') - def test_private_repo_issues_ui(self, p_send_email, p_ugt): - """ Test issues made to private repo""" - p_send_email.return_value = True - p_ugt.return_value = True - - # Add private repo - item = pagure.lib.model.Project( - user_id=1, # pingou - name='test4', - description='test project description', - hook_token='aaabbbeeeceee', - private=True, - ) - self.session.add(item) - self.session.commit() - - for repo in ['GIT_FOLDER', 'TICKETS_FOLDER']: - # Add a git repo - repo_path = os.path.join( - pagure.APP.config.get(repo), 'test4.git') - if not os.path.exists(repo_path): - os.makedirs(repo_path) - pygit2.init_repository(repo_path) - - # Check if the private repo issues are publicly not accesible - output = self.app.get('/test4/issues') - self.assertEqual(output.status_code, 404) - - # Create issues to play with - repo = pagure.lib.get_project(self.session, 'test4') - msg = pagure.lib.new_issue( - session=self.session, - repo=repo, - title='Test issue', - content='We should work on this', - user='pingou', - ticketfolder=None - ) - self.session.commit() - self.assertEqual(msg.title, 'Test issue') - - user = tests.FakeUser() - with tests.user_set(pagure.APP, user): - - # Whole list - output = self.app.get('/test4/issues') - self.assertEqual(output.status_code, 404) - - # Check single issue - output = self.app.get('/test4/issue/1') - self.assertEqual(output.status_code, 404) - - user = tests.FakeUser() - with tests.user_set(pagure.APP, user): - - # Whole list - output = self.app.get('/test4/issues') - self.assertEqual(output.status_code, 404) - - user = tests.FakeUser(username='pingou') - with tests.user_set(pagure.APP, user): - - # Whole list - output = self.app.get('/test4/issues') - self.assertEqual(output.status_code, 200) - self.assertIn( - 'Issues - test4 - Pagure', output.data) - self.assertTrue( - '

\n 1 Open Issues' in output.data) - - # Check single issue - output = self.app.get('/test4/issue/1') - self.assertEqual(output.status_code, 200) - - repo = pagure.lib.get_project(self.session, 'test4') - - msg = pagure.lib.add_user_to_project( - session=self.session, - project=repo, - new_user='foo', - user='pingou', - ) - self.session.commit() - self.assertEqual(msg, 'User added') - - user.username = 'foo' - with tests.user_set(pagure.APP, user): - - # Whole list - output = self.app.get('/test4/issues') - self.assertEqual(output.status_code, 200) - self.assertIn( - 'Issues - test4 - Pagure', output.data) - self.assertTrue( - '

\n 1 Open Issues' in output.data) - - # Check single issue - output = self.app.get('/test4/issue/1') - self.assertEqual(output.status_code, 200) - - # API checks - def test_api_private_repo_projects(self): - """ Test api points for private repo for projects""" - - # Add private repo - item = pagure.lib.model.Project( - user_id=1, # pingou - name='test4', - description='test project description', - hook_token='aaabbbeeeceee', - private=True, - ) - self.session.add(item) - self.session.commit() - - # Create a git repo to play with - gitrepo = os.path.join(tests.HERE, 'repos', 'test4.git') - repo = pygit2.init_repository(gitrepo, bare=True) - - newpath = tempfile.mkdtemp(prefix='pagure-fork-test') - repopath = os.path.join(newpath, 'test4') - 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() - - # 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 - [] - ) - refname = 'refs/heads/master:refs/heads/master' - ori_remote = clone_repo.remotes[0] - PagureRepo.push(ori_remote, refname) - - # Tag our first commit - first_commit = repo.revparse_single('HEAD') - tagger = pygit2.Signature('Alice Doe', 'adoe@example.com', 12347, 0) - repo.create_tag( - "0.0.1", first_commit.oid.hex, pygit2.GIT_OBJ_COMMIT, tagger, - "Release 0.0.1") - - # Create a token for foo for this project - item = pagure.lib.model.Token( - id='foobar_token', - user_id=1, - project_id=1, - expiration=datetime.datetime.utcnow() + datetime.timedelta( - days=30) - ) - self.session.add(item) - self.session.commit() - item = pagure.lib.model.TokenAcl( - token_id='foobar_token', - acl_id=1, - ) - self.session.add(item) - self.session.commit() - - # Check if the admin requests - user = tests.FakeUser(username='pingou') - with tests.user_set(pagure.APP, user): - # Check tags - output = self.app.get('/api/0/test4/git/tags') - self.assertEqual(output.status_code, 200) - data = json.loads(output.data) - self.assertDictEqual( - data, - {'tags': ['0.0.1'], 'total_tags': 1} - ) - - output = self.app.get('/api/0/test4/git/tags') - self.assertEqual(output.status_code, 404) - - # Chekc if user is not admin - user = tests.FakeUser() - with tests.user_set(pagure.APP, user): - output = self.app.get('/api/0/test4/git/tags') - self.assertEqual(output.status_code, 404) - - shutil.rmtree(newpath) - - # Check before adding - repo = pagure.lib.get_project(self.session, 'test4') - self.assertEqual(repo.tags, []) - - # Adding a tag - output = pagure.lib.update_tags( - self.session, repo, 'infra', 'pingou', - ticketfolder=None) - self.assertEqual(output, ['Tag added: infra']) - - # Check after adding - repo = pagure.lib.get_project(self.session, 'test4') - self.assertEqual(len(repo.tags), 1) - self.assertEqual(repo.tags_text, ['infra']) - - # Check the API - output = self.app.get('/api/0/projects?tags=inf') - self.assertEqual(output.status_code, 404) - data = json.loads(output.data) - self.assertDictEqual( - data, - {'error_code': 'ENOPROJECTS', 'error': 'No projects found'} - ) - - # Request by not a loggged in user - output = self.app.get('/api/0/projects?tags=infra') - self.assertEqual(output.status_code, 404) - - user = tests.FakeUser() - with tests.user_set(pagure.APP, user): - # Request by a non authorized user - output = self.app.get('/api/0/projects?tags=infra') - self.assertEqual(output.status_code, 404) - - user.username = 'pingou' - with tests.user_set(pagure.APP, user): - # Private repo username is compulsion to pass - output = self.app.get('/api/0/projects?tags=infra') - self.assertEqual(output.status_code, 404) - - output = self.app.get('/api/0/projects?username=pingou') - self.assertEqual(output.status_code, 200) - data = json.loads(output.data) - data['projects'][0]['date_created'] = "1436527638" - self.assertDictEqual( - data, - { - "total_projects": 1, - "projects": [ - { - "date_created": "1436527638", - "description": "test project description", - "id": 1, - "name": "test4", - "parent": None, - "priorities": {}, - "tags": ["infra"], - "user": { - "fullname": "PY C", - "name": "pingou" - } - }, - ] - } - ) - - output = self.app.get('/api/0/projects?username=pingou&tags=infra') - self.assertEqual(output.status_code, 200) - data = json.loads(output.data) - data['projects'][0]['date_created'] = "1436527638" - self.assertDictEqual( - data, - { - "total_projects": 1, - "projects": [ - { - "date_created": "1436527638", - "description": "test project description", - "id": 1, - "name": "test4", - "parent": None, - "priorities": {}, - "tags": ["infra"], - "user": { - "fullname": "PY C", - "name": "pingou" - } - } - ] - } - ) - - # Api pull-request views - @patch('pagure.lib.notify.send_email') - def test_api_private_repo_fork(self, send_email): - """ Test api endpoints in api/fork""" - - send_email.return_value = True - - # Add private repo - item = pagure.lib.model.Project( - user_id=1, # pingou - name='test4', - description='test project description', - hook_token='aaabbbeeeceee', - private=True, - ) - self.session.add(item) - self.session.commit() - - tests.create_tokens(self.session) - tests.create_tokens_acl(self.session) - - headers = {'Authorization': 'token aaabbbcccddd'} - # Create a pull-request - repo = pagure.lib.get_project(self.session, 'test4') - forked_repo = pagure.lib.get_project(self.session, 'test4') - req = pagure.lib.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', - requestfolder=None, - ) - self.session.commit() - self.assertEqual(req.id, 1) - self.assertEqual(req.title, 'test pull-request') - - # Check list of PR - output = self.app.get('/api/0/test4/pull-requests') - self.assertEqual(output.status_code, 404) - - # Check single PR - output = self.app.get('/api/0/test/pull-request/1') - self.assertEqual(output.status_code, 404) - - user = tests.FakeUser(username='pingou') - with tests.user_set(pagure.APP, user): - # List pull-requests - output = self.app.get('/api/0/test4/pull-requests') - self.assertEqual(output.status_code, 200) - data = json.loads(output.data) - data['requests'][0]['date_created'] = '1431414800' - data['requests'][0]['updated_on'] = '1431414800' - data['requests'][0]['project']['date_created'] = '1431414800' - data['requests'][0]['repo_from']['date_created'] = '1431414800' - data['requests'][0]['uid'] = '1431414800' - self.assertDictEqual( - data, - { - 'args': { - 'assignee': None, - 'author': None, - 'status': True - }, - 'requests': [{ - 'assignee': None, - 'branch': 'master', - 'branch_from': 'master', - 'closed_at': None, - 'closed_by': None, - 'comments': [], - 'commit_start': None, - 'commit_stop': None, - 'date_created': '1431414800', - 'id': 1, - 'initial_comment': None, - 'project': { - 'date_created': '1431414800', - 'description': 'test project description', - 'id': 1, - 'name': 'test4', - 'parent': None, - 'priorities': {}, - 'tags': [], - 'user': { - 'fullname': 'PY C', - 'name': 'pingou' - } - }, - 'remote_git': None, - 'repo_from': { - 'date_created': '1431414800', - 'description': 'test project description', - 'id': 1, - 'name': 'test4', - 'parent': None, - 'priorities': {}, - 'tags': [], - 'user': { - 'fullname': 'PY C', - 'name': 'pingou' - } - }, - 'status': 'Open', - 'title': 'test pull-request', - 'uid': '1431414800', - 'updated_on': '1431414800', - 'user': { - 'fullname': 'PY C', - 'name': 'pingou' - } - }], - 'total_requests': 1 - } - ) - headers = {'Authorization': 'token foobar_token'} - - # Access Pull-Request authenticated - output = self.app.get( - '/api/0/test4/pull-requests', headers=headers) - self.assertEqual(output.status_code, 200) - data2 = json.loads(output.data) - data2['requests'][0]['date_created'] = '1431414800' - data2['requests'][0]['updated_on'] = '1431414800' - data2['requests'][0]['project']['date_created'] = '1431414800' - data2['requests'][0]['repo_from']['date_created'] = '1431414800' - data2['requests'][0]['uid'] = '1431414800' - self.assertDictEqual(data, data2) - - # For single PR - output = self.app.get('/api/0/test4/pull-request/1') - self.assertEqual(output.status_code, 200) - data = json.loads(output.data) - data['date_created'] = '1431414800' - data['updated_on'] = '1431414800' - data['project']['date_created'] = '1431414800' - data['repo_from']['date_created'] = '1431414800' - data['uid'] = '1431414800' - self.assertDictEqual( - data, - { - "assignee": None, - "branch": "master", - "branch_from": "master", - "closed_at": None, - "closed_by": None, - "comments": [], - "commit_start": None, - "commit_stop": None, - "date_created": "1431414800", - "id": 1, - "initial_comment": None, - "project": { - "date_created": "1431414800", - "description": "test project description", - "id": 1, - "name": "test4", - "parent": None, - "priorities": {}, - "tags": [], - "user": { - "fullname": "PY C", - "name": "pingou" - } - }, - "remote_git": None, - "repo_from": { - "date_created": "1431414800", - "description": "test project description", - "id": 1, - "name": "test4", - "parent": None, - "priorities": {}, - "tags": [], - "user": { - "fullname": "PY C", - "name": "pingou" - } - }, - "status": 'Open', - "title": "test pull-request", - "uid": "1431414800", - "updated_on": "1431414800", - "user": { - "fullname": "PY C", - "name": "pingou" - } - } - ) - - # Access Pull-Request authenticated - output = self.app.get( - '/api/0/test4/pull-request/1', headers=headers) - self.assertEqual(output.status_code, 200) - data2 = json.loads(output.data) - data2['date_created'] = '1431414800' - data2['project']['date_created'] = '1431414800' - data2['repo_from']['date_created'] = '1431414800' - data2['uid'] = '1431414800' - data2['date_created'] = '1431414800' - data2['updated_on'] = '1431414800' - self.assertDictEqual(data, data2) - - @patch('pagure.lib.notify.send_email') - def test_api_pr_private_repo_add_comment(self, mockemail): - """ Test the api_pull_request_add_comment method of the flask api. """ - mockemail.return_value = True - pagure.APP.config['REQUESTS_FOLDER'] = None - - # Add private repo - item = pagure.lib.model.Project( - user_id=1, # pingou - name='test4', - description='test project description', - hook_token='aaabbbeeeceee', - private=True, - ) - self.session.add(item) - self.session.commit() - tests.create_tokens(self.session) - tests.create_tokens_acl(self.session) - - headers = {'Authorization': 'token aaabbbcccddd'} - # Create a pull-request - repo = pagure.lib.get_project(self.session, 'test4') - forked_repo = pagure.lib.get_project(self.session, 'test4') - req = pagure.lib.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', - requestfolder=None, - ) - self.session.commit() - self.assertEqual(req.id, 1) - self.assertEqual(req.title, 'test pull-request') - - # Check comments before - request = pagure.lib.search_pull_requests( - self.session, project_id=1, requestid=1) - self.assertEqual(len(request.comments), 0) - - data = { - 'title': 'test issue', - } - - # Incomplete request - output = self.app.post( - '/api/0/test4/pull-request/1/comment', data=data, headers=headers) - self.assertEqual(output.status_code, 400) - data = json.loads(output.data) - self.assertDictEqual( - data, - { - "error": "Invalid or incomplete input submited", - "error_code": "EINVALIDREQ", - } - ) - - # No change - request = pagure.lib.search_pull_requests( - self.session, project_id=1, requestid=1) - self.assertEqual(len(request.comments), 0) - - data = { - 'comment': 'This is a very interesting question', - } - - # Valid request - output = self.app.post( - '/api/0/test4/pull-request/1/comment', data=data, headers=headers) - self.assertEqual(output.status_code, 200) - data = json.loads(output.data) - self.assertDictEqual( - data, - {'message': 'Comment added'} - ) - - # One comment added - request = pagure.lib.search_pull_requests( - self.session, project_id=1, requestid=1) - self.assertEqual(len(request.comments), 1) - - @patch('pagure.lib.notify.send_email') - def test_api_private_repo_pr_add_flag(self, mockemail): - """ Test the api_pull_request_add_flag method of the flask api. """ - mockemail.return_value = True - pagure.APP.config['REQUESTS_FOLDER'] = None - - # Add private repo - item = pagure.lib.model.Project( - user_id=1, # pingou - name='test4', - description='test project description', - hook_token='aaabbbeeeceee', - private=True, - ) - self.session.add(item) - self.session.commit() - - # Add private repo - item = pagure.lib.model.Project( - user_id=1, # pingou - name='test2', - description='test project description', - hook_token='foo_bar', - private=True, - ) - self.session.add(item) - self.session.commit() - - tests.create_tokens(self.session) - tests.create_tokens_acl(self.session) - - 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.data) - self.assertDictEqual( - data, - { - "error": "Project not found", - "error_code": "ENOPROJECT", - } - ) - - # 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.data) - self.assertDictEqual( - data, - { - "error": "Invalid or expired token. Please visit " - "https://pagure.org/ to get or renew your API token.", - "error_code": "EINVALIDTOK", - } - ) - - # No input - output = self.app.post( - '/api/0/test4/pull-request/1/flag', headers=headers) - self.assertEqual(output.status_code, 404) - data = json.loads(output.data) - self.assertDictEqual( - data, - { - "error": "Pull-Request not found", - "error_code": "ENOREQ", - } - ) - - # Create a pull-request - repo = pagure.lib.get_project(self.session, 'test4') - forked_repo = pagure.lib.get_project(self.session, 'test4') - req = pagure.lib.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', - requestfolder=None, - ) - self.session.commit() - self.assertEqual(req.id, 1) - self.assertEqual(req.title, 'test pull-request') - - # Check comments before - request = pagure.lib.search_pull_requests( - self.session, project_id=1, requestid=1) - self.assertEqual(len(request.flags), 0) - - 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/test4/pull-request/1/flag', data=data, headers=headers) - self.assertEqual(output.status_code, 400) - data = json.loads(output.data) - self.assertDictEqual( - data, - { - "error": "Invalid or incomplete input submited", - "error_code": "EINVALIDREQ", - } - ) - - # No change - request = pagure.lib.search_pull_requests( - self.session, project_id=1, requestid=1) - self.assertEqual(len(request.flags), 0) - - data = { - 'username': 'Jenkins', - 'percent': 0, - 'comment': 'Tests failed', - 'url': 'http://jenkins.cloud.fedoraproject.org/', - 'uid': 'jenkins_build_pagure_100+seed', - } - - # Valid request - output = self.app.post( - '/api/0/test4/pull-request/1/flag', data=data, headers=headers) - self.assertEqual(output.status_code, 200) - data = json.loads(output.data) - self.assertDictEqual( - data, - {'message': 'Flag added'} - ) - - # One flag added - request = pagure.lib.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) - - # Update flag - 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/test4/pull-request/1/flag', data=data, headers=headers) - self.assertEqual(output.status_code, 200) - data = json.loads(output.data) - self.assertDictEqual( - data, - {'message': 'Flag updated'} - ) - - # One flag added - request = pagure.lib.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) - - @patch('pagure.lib.notify.send_email') - def test_api_private_repo_pr_close(self, send_email): - """ Test the api_pull_request_close method of the flask api. """ - send_email.return_value = True - - pagure.APP.config['REQUESTS_FOLDER'] = None - - # Add private repo - item = pagure.lib.model.Project( - user_id=1, # pingou - name='test4', - description='test project description', - hook_token='aaabbbeeeceee', - private=True, - ) - self.session.add(item) - self.session.commit() - - tests.create_tokens(self.session) - tests.create_tokens_acl(self.session) - - # Add private repo - item = pagure.lib.model.Project( - user_id=1, # pingou - name='test2', - description='test project description', - hook_token='foo_bar', - private=True, - ) - self.session.add(item) - self.session.commit() - - # Create the pull-request to close - repo = pagure.lib.get_project(self.session, 'test4') - forked_repo = pagure.lib.get_project(self.session, 'test4') - req = pagure.lib.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', - requestfolder=None, - ) - self.session.commit() - self.assertEqual(req.id, 1) - self.assertEqual(req.title, 'test pull-request') - - headers = {'Authorization': 'token aaabbbcccddd'} - - # Invalid project - output = self.app.post( - '/api/0/foo/pull-request/1/close', headers=headers) - self.assertEqual(output.status_code, 404) - data = json.loads(output.data) - self.assertDictEqual( - data, - { - "error": "Project not found", - "error_code": "ENOPROJECT", - } - ) - - # Valid token, wrong project - output = self.app.post( - '/api/0/test2/pull-request/1/close', headers=headers) - self.assertEqual(output.status_code, 401) - data = json.loads(output.data) - self.assertDictEqual( - data, - { - "error": "Invalid or expired token. Please visit " - "https://pagure.org/ to get or renew your API token.", - "error_code": "EINVALIDTOK", - } - ) - - # Invalid PR - output = self.app.post( - '/api/0/test4/pull-request/2/close', headers=headers) - self.assertEqual(output.status_code, 404) - data = json.loads(output.data) - self.assertDictEqual( - data, - {'error': 'Pull-Request not found', 'error_code': "ENOREQ"} - ) - - # Create a token for foo for this project - item = pagure.lib.model.Token( - id='foobar_token', - user_id=2, - project_id=1, - expiration=datetime.datetime.utcnow() + datetime.timedelta( - days=30) - ) - self.session.add(item) - self.session.commit() - item = pagure.lib.model.TokenAcl( - token_id='foobar_token', - acl_id=2, - ) - self.session.add(item) - self.session.commit() - - headers = {'Authorization': 'token foobar_token'} - - # User not admin - output = self.app.post( - '/api/0/test4/pull-request/1/close', headers=headers) - self.assertEqual(output.status_code, 404) - data = json.loads(output.data) - self.assertDictEqual( - data, - { - "error": "Project not found", - "error_code": "ENOPROJECT", - } - ) - - headers = {'Authorization': 'token aaabbbcccddd'} - - # Close PR - output = self.app.post( - '/api/0/test4/pull-request/1/close', headers=headers) - self.assertEqual(output.status_code, 200) - data = json.loads(output.data) - self.assertDictEqual( - data, - {"message": "Pull-request closed!"} - ) - - @patch('pagure.lib.notify.send_email') - @patch('pagure.lib.git.merge_pull_request') - def test_api_private_repo_pr_merge(self, mpr, send_email): - """ Test the api_pull_request_merge method of the flask api. """ - mpr.return_value = 'Changes merged!' - send_email.return_value = True - - pagure.APP.config['REQUESTS_FOLDER'] = None - - # Add private repo - item = pagure.lib.model.Project( - user_id=1, # pingou - name='test4', - description='test project description', - hook_token='aaabbbeeeceee', - private=True, - ) - self.session.add(item) - self.session.commit() - - tests.create_tokens(self.session) - tests.create_tokens_acl(self.session) - - # Add private repo - item = pagure.lib.model.Project( - user_id=1, # pingou - name='test2', - description='test project description', - hook_token='foo_bar', - private=True, - ) - self.session.add(item) - self.session.commit() - - # Create the pull-request to close - repo = pagure.lib.get_project(self.session, 'test4') - forked_repo = pagure.lib.get_project(self.session, 'test4') - req = pagure.lib.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', - requestfolder=None, - ) - self.session.commit() - self.assertEqual(req.id, 1) - self.assertEqual(req.title, 'test pull-request') - - headers = {'Authorization': 'token aaabbbcccddd'} - - # Invalid project - output = self.app.post( - '/api/0/foo/pull-request/1/merge', headers=headers) - self.assertEqual(output.status_code, 404) - data = json.loads(output.data) - self.assertDictEqual( - data, - { - "error": "Project not found", - "error_code": "ENOPROJECT", - } - ) - - # Valid token, wrong project - output = self.app.post( - '/api/0/test2/pull-request/1/merge', headers=headers) - self.assertEqual(output.status_code, 401) - data = json.loads(output.data) - self.assertDictEqual( - data, - { - "error": "Invalid or expired token. Please visit " - "https://pagure.org/ to get or renew your API token.", - "error_code": "EINVALIDTOK", - } - ) - - # Invalid PR - output = self.app.post( - '/api/0/test4/pull-request/2/merge', headers=headers) - self.assertEqual(output.status_code, 404) - data = json.loads(output.data) - self.assertDictEqual( - data, - {'error': 'Pull-Request not found', 'error_code': "ENOREQ"} - ) - - # Create a token for foo for this project - item = pagure.lib.model.Token( - id='foobar_token', - user_id=2, - project_id=1, - expiration=datetime.datetime.utcnow() + datetime.timedelta( - days=30) - ) - self.session.add(item) - self.session.commit() - item = pagure.lib.model.TokenAcl( - token_id='foobar_token', - acl_id=3, - ) - self.session.add(item) - self.session.commit() - - headers = {'Authorization': 'token foobar_token'} - - # User not admin - output = self.app.post( - '/api/0/test4/pull-request/1/merge', headers=headers) - self.assertEqual(output.status_code, 404) - data = json.loads(output.data) - self.assertDictEqual( - data, - { - "error": "Project not found", - "error_code": "ENOPROJECT", - } - ) - - headers = {'Authorization': 'token aaabbbcccddd'} - - # Merge PR - output = self.app.post( - '/api/0/test4/pull-request/1/merge', headers=headers) - self.assertEqual(output.status_code, 200) - data = json.loads(output.data) - self.assertDictEqual( - data, - {"message": "Changes merged!"} - ) - - def test_api_private_repo_new_issue(self): - """ Test the api_new_issue method of the flask api. """ - # Add private repo - item = pagure.lib.model.Project( - user_id=1, # pingou - name='test4', - description='test project description', - hook_token='aaabbbeeeceee', - private=True, - ) - self.session.add(item) - self.session.commit() - - for repo in ['GIT_FOLDER', 'TICKETS_FOLDER']: - # Add a git repo - repo_path = os.path.join( - pagure.APP.config.get(repo), 'test4.git') - if not os.path.exists(repo_path): - os.makedirs(repo_path) - pygit2.init_repository(repo_path, bare=True) - - tests.create_tokens(self.session) - tests.create_tokens_acl(self.session) - - # Add private repo - item = pagure.lib.model.Project( - user_id=1, # pingou - name='test2', - description='test project description', - hook_token='foo_bar', - private=True, - ) - self.session.add(item) - self.session.commit() - - headers = {'Authorization': 'token aaabbbcccddd'} - - # Valid token, wrong project - output = self.app.post('/api/0/test2/new_issue', headers=headers) - self.assertEqual(output.status_code, 401) - data = json.loads(output.data) - self.assertDictEqual( - data, - { - "error": "Invalid or expired token. Please visit " - "https://pagure.org/ to get or renew your API token.", - "error_code": "EINVALIDTOK", - } - ) - - # No input - output = self.app.post('/api/0/test4/new_issue', headers=headers) - self.assertEqual(output.status_code, 400) - data = json.loads(output.data) - self.assertDictEqual( - data, - { - "error": "Invalid or incomplete input submited", - "error_code": "EINVALIDREQ", - } - ) - - data = { - 'title': 'test issue', - } - - # Invalid repo - output = self.app.post( - '/api/0/foo/new_issue', data=data, headers=headers) - self.assertEqual(output.status_code, 404) - data = json.loads(output.data) - self.assertDictEqual( - data, - { - "error": "Project not found", - "error_code": "ENOPROJECT", - } - ) - - # Incomplete request - output = self.app.post( - '/api/0/test4/new_issue', data=data, headers=headers) - self.assertEqual(output.status_code, 400) - data = json.loads(output.data) - self.assertDictEqual( - data, - { - "error": "Invalid or incomplete input submited", - "error_code": "EINVALIDREQ", - } - ) - - data = { - 'title': 'test issue', - 'issue_content': 'This issue needs attention', - } - - # Valid request - output = self.app.post( - '/api/0/test4/new_issue', data=data, headers=headers) - self.assertEqual(output.status_code, 200) - data = json.loads(output.data) - self.assertDictEqual( - data, - {'message': 'Issue created'} - ) - - def test_api_priavte_repo_view_issues(self): - """ Test the api_view_issues method of the flask api. """ - self.test_api_private_repo_new_issue() - - # Invalid repo - output = self.app.get('/api/0/foo/issues') - self.assertEqual(output.status_code, 404) - data = json.loads(output.data) - self.assertDictEqual( - data, - { - "error": "Project not found", - "error_code": "ENOPROJECT", - } - ) - - # List all opened issues - user = tests.FakeUser(username='pingou') - with tests.user_set(pagure.APP, user): - output = self.app.get('/api/0/test4/issues') - self.assertEqual(output.status_code, 200) - data = json.loads(output.data) - data['issues'][0]['date_created'] = '1431414800' - self.assertDictEqual( - data, - { - "args": { - "assignee": None, - "author": None, - "status": None, - "tags": [] - }, - "total_issues": 1, - "issues": [ - { - "assignee": None, - "blocks": [], - "comments": [], - "content": "This issue needs attention", - "date_created": "1431414800", - "depends": [], - "id": 1, - "priority": None, - "private": False, - "status": "Open", - "tags": [], - "title": "test issue", - "user": { - "fullname": "PY C", - "name": "pingou" - } - } - ] - } - ) - - # Create private issue - repo = pagure.lib.get_project(self.session, 'test4') - msg = pagure.lib.new_issue( - session=self.session, - repo=repo, - title='Test issue', - content='We should work on this', - user='pingou', - ticketfolder=None, - private=True, - ) - self.session.commit() - self.assertEqual(msg.title, 'Test issue') - - # Private issues are retrieved - user = tests.FakeUser(username='pingou') - with tests.user_set(pagure.APP, user): - output = self.app.get('/api/0/test4/issues') - self.assertEqual(output.status_code, 200) - data = json.loads(output.data) - data['issues'][0]['date_created'] = '1431414800' - data['issues'][1]['date_created'] = '1431414800' - self.assertDictEqual( - data, - {'args': - {'assignee': None, 'author': None, 'status': None, 'tags': []}, - 'issues': [{u'assignee': None, - 'blocks': [], - 'comments': [], - 'content': 'This issue needs attention', - 'date_created': '1431414800', - 'depends': [], - 'id': 1, - 'priority': None, - 'private': False, - 'status': 'Open', - 'tags': [], - 'title': u'test issue', - 'user': {'fullname': 'PY C', 'name': 'pingou'}}, - {'assignee': None, - 'blocks': [], - 'comments': [], - 'content': 'We should work on this', - 'date_created': '1431414800', - 'depends': [], - 'id': 2, - 'priority': None, - 'private': True, - 'status': 'Open', - 'tags': [], - 'title': 'Test issue', - 'user': {'fullname': 'PY C', 'name': 'pingou'}}], - 'total_issues': 2} - ) - - # Access issues authenticated but non-existing token - headers = {'Authorization': 'token aaabbbccc'} - output = self.app.get('/api/0/test4/issues', headers=headers) - self.assertEqual(output.status_code, 401) - - headers = {'Authorization': 'token aaabbbcccddd'} - - # Access issues authenticated correctly - output = self.app.get('/api/0/test4/issues', headers=headers) - self.assertEqual(output.status_code, 200) - data = json.loads(output.data) - data['issues'][0]['date_created'] = '1431414800' - data['issues'][1]['date_created'] = '1431414800' - self.assertDictEqual( - data, - { - "args": { - "assignee": None, - "author": None, - "status": None, - "tags": [] - }, - "total_issues": 2, - "issues": [ - { - "assignee": None, - "blocks": [], - "comments": [], - "content": "This issue needs attention", - "date_created": "1431414800", - "depends": [], - "id": 1, - "priority": None, - "private": False, - "status": "Open", - "tags": [], - "title": "test issue", - "user": { - "fullname": "PY C", - "name": "pingou" - } - }, - { - "assignee": None, - "blocks": [], - "comments": [], - "content": "We should work on this", - "date_created": "1431414800", - "depends": [], - "id": 2, - "priority": None, - "private": True, - "status": "Open", - "tags": [], - "title": "Test issue", - "user": { - "fullname": "PY C", - "name": "pingou" - } - } - ] - } - ) - - # List closed issue - output = self.app.get( - '/api/0/test4/issues?status=Closed', headers=headers) - self.assertEqual(output.status_code, 200) - data = json.loads(output.data) - self.assertDictEqual( - data, - { - "args": { - "assignee": None, - "author": None, - "status": "Closed", - "tags": [] - }, - "total_issues": 0, - "issues": [] - } - ) - - # List closed issue - output = self.app.get( - '/api/0/test4/issues?status=Invalid', headers=headers) - self.assertEqual(output.status_code, 200) - data = json.loads(output.data) - self.assertDictEqual( - data, - { - "args": { - "assignee": None, - "author": None, - "status": "Invalid", - "tags": [] - }, - "total_issues": 0, - "issues": [] - } - ) - - # List all issues - output = self.app.get( - '/api/0/test4/issues?status=All', headers=headers) - self.assertEqual(output.status_code, 200) - data = json.loads(output.data) - data['issues'][0]['date_created'] = '1431414800' - data['issues'][1]['date_created'] = '1431414800' - self.assertDictEqual( - data, - { - "args": { - "assignee": None, - "author": None, - "status": "All", - "tags": [] - }, - "total_issues": 2, - "issues": [ - { - "assignee": None, - "blocks": [], - "comments": [], - "content": "This issue needs attention", - "date_created": "1431414800", - "depends": [], - "id": 1, - "priority": None, - "private": False, - "status": "Open", - "tags": [], - "title": "test issue", - "user": { - "fullname": "PY C", - "name": "pingou" - } - }, - { - "assignee": None, - "blocks": [], - "comments": [], - "content": "We should work on this", - "date_created": "1431414800", - "depends": [], - "id": 2, - "priority": None, - "private": True, - "status": "Open", - "tags": [], - "title": "Test issue", - "user": { - "fullname": "PY C", - "name": "pingou" - } - } - ], - } - ) - - def test_api_pivate_repo_view_issue(self): - """ Test the api_view_issue method of the flask api. """ - self.test_api_private_repo_new_issue() - - # Invalid repo - output = self.app.get('/api/0/foo/issue/1') - self.assertEqual(output.status_code, 404) - data = json.loads(output.data) - self.assertDictEqual( - data, - { - "error": "Project not found", - "error_code": "ENOPROJECT", - } - ) - - # Invalid issue for this repo - output = self.app.get('/api/0/test4/issue/1') - self.assertEqual(output.status_code, 404) - data = json.loads(output.data) - self.assertDictEqual( - data, - { - "error": "Project not found", - "error_code": "ENOPROJECT", - } - ) - - # Un-authorized user - user = tests.FakeUser() - with tests.user_set(pagure.APP, user): - output = self.app.get('/api/0/test4/issue/1') - self.assertEqual(output.status_code, 404) - data = json.loads(output.data) - self.assertDictEqual( - data, - { - "error": "Project not found", - "error_code": "ENOPROJECT", - } - ) - - # Valid issue - user = tests.FakeUser(username='pingou') - with tests.user_set(pagure.APP, user): - output = self.app.get('/api/0/test4/issue/1') - self.assertEqual(output.status_code, 200) - data = json.loads(output.data) - data['date_created'] = '1431414800' - self.assertDictEqual( - data, - { - "assignee": None, - "blocks": [], - "comments": [], - "content": "This issue needs attention", - "date_created": "1431414800", - "depends": [], - "id": 1, - "priority": None, - "private": False, - "status": "Open", - "tags": [], - "title": "test issue", - "user": { - "fullname": "PY C", - "name": "pingou" - } - } - ) - - headers = {'Authorization': 'token aaabbbccc'} - - # Access issue authenticated but non-existing token - output = self.app.get('/api/0/test4/issue/1', headers=headers) - self.assertEqual(output.status_code, 401) - data = json.loads(output.data) - self.assertDictEqual( - data, - { - "error": "Invalid or expired token. Please visit https://pagure.org/ to get or renew your API token.", - "error_code": "EINVALIDTOK" - } - ) - - headers = {'Authorization': 'token aaabbbcccddd'} - - # Access issue authenticated correctly - output = self.app.get('/api/0/test4/issue/1', headers=headers) - self.assertEqual(output.status_code, 200) - data = json.loads(output.data) - data['date_created'] = '1431414800' - self.assertDictEqual( - data, - { - "assignee": None, - "blocks": [], - "comments": [], - "content": "This issue needs attention", - "date_created": "1431414800", - "depends": [], - "id": 1, - "priority": None, - "private": False, - "status": "Open", - "tags": [], - "title": "test issue", - "user": { - "fullname": "PY C", - "name": "pingou" - } - } - ) - - def test_api_private_repo_change_status_issue(self): - """ Test the api_change_status_issue method of the flask api. """ - item = pagure.lib.model.Project( - user_id=1, # pingou - name='test4', - description='test project description', - hook_token='aaabbbeeeceee', - private=True, - ) - self.session.add(item) - self.session.commit() - - for repo in ['GIT_FOLDER', 'TICKETS_FOLDER']: - # Add a git repo - repo_path = os.path.join( - pagure.APP.config.get(repo), 'test4.git') - if not os.path.exists(repo_path): - os.makedirs(repo_path) - pygit2.init_repository(repo_path, bare=True) - - tests.create_tokens(self.session) - tests.create_tokens_acl(self.session) - - headers = {'Authorization': 'token aaabbbcccddd'} - - # Invalid project - output = self.app.post('/api/0/foo/issue/1/status', headers=headers) - self.assertEqual(output.status_code, 404) - data = json.loads(output.data) - self.assertDictEqual( - data, - { - "error": "Project not found", - "error_code": "ENOPROJECT", - } - ) - - # Valid token, wrong project - user = tests.FakeUser(username='pingou') - with tests.user_set(pagure.APP, user): - output = self.app.post( - '/api/0/test2/issue/1/status', headers=headers) - self.assertEqual(output.status_code, 404) - data = json.loads(output.data) - self.assertDictEqual( - data, - { - "error": "Project not found", - "error_code": "ENOPROJECT", - } - ) - - # No input - output = self.app.post('/api/0/test4/issue/1/status', headers=headers) - self.assertEqual(output.status_code, 404) - data = json.loads(output.data) - self.assertDictEqual( - data, - { - "error": "Issue not found", - "error_code": "ENOISSUE", - } - ) - - # Create normal issue - repo = pagure.lib.get_project(self.session, 'test4') - msg = pagure.lib.new_issue( - session=self.session, - repo=repo, - title='Test issue #1', - content='We should work on this', - user='pingou', - ticketfolder=None, - private=False, - ) - self.session.commit() - self.assertEqual(msg.title, 'Test issue #1') - - # Check status before - repo = pagure.lib.get_project(self.session, 'test4') - issue = pagure.lib.search_issues(self.session, repo, issueid=1) - self.assertEqual(issue.status, 'Open') - - data = { - 'title': 'test issue', - } - - user = tests.FakeUser(username='pingou') - with tests.user_set(pagure.APP, user): - # Incomplete request - output = self.app.post( - '/api/0/test4/issue/1/status', data=data, headers=headers) - self.assertEqual(output.status_code, 400) - data = json.loads(output.data) - self.assertDictEqual( - data, - { - "error": "Invalid or incomplete input submited", - "error_code": "EINVALIDREQ", - } - ) - - # No change - repo = pagure.lib.get_project(self.session, 'test4') - issue = pagure.lib.search_issues(self.session, repo, issueid=1) - self.assertEqual(issue.status, 'Open') - - data = { - 'status': 'Open', - } - - # Valid request but no change - output = self.app.post( - '/api/0/test4/issue/1/status', data=data, headers=headers) - self.assertEqual(output.status_code, 200) - data = json.loads(output.data) - self.assertDictEqual( - data, - {'message': 'No changes'} - ) - - # No change - repo = pagure.lib.get_project(self.session, 'test4') - issue = pagure.lib.search_issues(self.session, repo, issueid=1) - self.assertEqual(issue.status, 'Open') - - data = { - 'status': 'Fixed', - } - - # Valid request - output = self.app.post( - '/api/0/test4/issue/1/status', data=data, headers=headers) - self.assertEqual(output.status_code, 200) - data = json.loads(output.data) - self.assertDictEqual( - data, - {'message': 'Successfully edited issue #1'} - ) - - @patch('pagure.lib.git.update_git') - @patch('pagure.lib.notify.send_email') - def test_api_private_repo_comment_issue(self, p_send_email, p_ugt): - """ Test the api_comment_issue method of the flask api. """ - p_send_email.return_value = True - p_ugt.return_value = True - - item = pagure.lib.model.Project( - user_id=1, # pingou - name='test4', - description='test project description', - hook_token='aaabbbeeeceee', - private=True, - ) - self.session.add(item) - self.session.commit() - tests.create_tokens(self.session) - tests.create_tokens_acl(self.session) - - headers = {'Authorization': 'token aaabbbcccddd'} - - # Invalid project - output = self.app.post('/api/0/foo/issue/1/comment', headers=headers) - self.assertEqual(output.status_code, 404) - data = json.loads(output.data) - self.assertDictEqual( - data, - { - "error": "Project not found", - "error_code": "ENOPROJECT", - } - ) - - # Invalid token, right project - headers = {'Authorization': 'token aaabbbccc'} - output = self.app.post('/api/0/test4/issue/1/comment', headers=headers) - self.assertEqual(output.status_code, 401) - data = json.loads(output.data) - self.assertDictEqual( - data, - { - "error": "Invalid or expired token. Please visit " - "https://pagure.org/ to get or renew your API token.", - "error_code": "EINVALIDTOK", - } - ) - - headers = {'Authorization': 'token aaabbbcccddd'} - # No input - output = self.app.post('/api/0/test4/issue/1/comment', headers=headers) - self.assertEqual(output.status_code, 404) - data = json.loads(output.data) - self.assertDictEqual( - data, - { - "error": "Issue not found", - "error_code": "ENOISSUE", - } - ) - - # Create normal issue - repo = pagure.lib.get_project(self.session, 'test4') - msg = pagure.lib.new_issue( - session=self.session, - repo=repo, - title='Test issue #1', - content='We should work on this', - user='pingou', - ticketfolder=None, - private=False, - issue_uid='aaabbbccc#1', - ) - self.session.commit() - self.assertEqual(msg.title, 'Test issue #1') - - # Check comments before - repo = pagure.lib.get_project(self.session, 'test4') - issue = pagure.lib.search_issues(self.session, repo, issueid=1) - self.assertEqual(len(issue.comments), 0) - - data = { - 'title': 'test issue', - } - - # Incomplete request - output = self.app.post( - '/api/0/test4/issue/1/comment', data=data, headers=headers) - self.assertEqual(output.status_code, 400) - data = json.loads(output.data) - self.assertDictEqual( - data, - { - "error": "Invalid or incomplete input submited", - "error_code": "EINVALIDREQ", - } - ) - - # No change - repo = pagure.lib.get_project(self.session, 'test4') - issue = pagure.lib.search_issues(self.session, repo, issueid=1) - self.assertEqual(issue.status, 'Open') - - data = { - 'comment': 'This is a very interesting question', - } - - # Valid request - output = self.app.post( - '/api/0/test4/issue/1/comment', data=data, headers=headers) - self.assertEqual(output.status_code, 200) - data = json.loads(output.data) - self.assertDictEqual( - data, - {'message': 'Comment added'} - ) - - # One comment added - repo = pagure.lib.get_project(self.session, 'test4') - issue = pagure.lib.search_issues(self.session, repo, issueid=1) - self.assertEqual(len(issue.comments), 1) - - @patch('pagure.lib.git.update_git') - @patch('pagure.lib.notify.send_email') - def test_api_view_issue_comment(self, p_send_email, p_ugt): - """ Test the api_view_issue_comment endpoint. """ - p_send_email.return_value = True - p_ugt.return_value = True - - self.test_api_private_repo_comment_issue() - - # View a comment that does not exist - output = self.app.get('/api/0/foo/issue/100/comment/2') - self.assertEqual(output.status_code, 404) - - # Issue exists but not the comment - output = self.app.get('/api/0/test/issue/1/comment/2') - self.assertEqual(output.status_code, 404) - - # Issue and comment exists - output = self.app.get('/api/0/test/issue/1/comment/1') - self.assertEqual(output.status_code, 404) - - user = tests.FakeUser(username='pingou') - with tests.user_set(pagure.APP, user): - output = self.app.get('/api/0/test4/issue/1/comment/1') - self.assertEqual(output.status_code, 200) - data = json.loads(output.data) - data['date_created'] = '1435821770' - data["comment_date"] = "2015-07-02 09:22" - data["avatar_url"] = "https://seccdn.libravatar.org/avatar/..." - self.assertDictEqual( - data, - { - "avatar_url": "https://seccdn.libravatar.org/avatar/...", - "comment": "This is a very interesting question", - "comment_date": "2015-07-02 09:22", - "date_created": "1435821770", - "edited_on": None, - "editor": None, - "id": 1, - "parent": None, - "user": { - "fullname": "PY C", - "name": "pingou" - } - } - ) - - # Issue and comment exists, using UID - output = self.app.get('/api/0/test4/issue/aaabbbccc#1/comment/1') - self.assertEqual(output.status_code, 200) - data = json.loads(output.data) - data['date_created'] = '1435821770' - data["comment_date"] = "2015-07-02 09:22" - data["avatar_url"] = "https://seccdn.libravatar.org/avatar/..." - self.assertDictEqual( - data, - { - "avatar_url": "https://seccdn.libravatar.org/avatar/...", - "comment": "This is a very interesting question", - "comment_date": "2015-07-02 09:22", - "date_created": "1435821770", - "edited_on": None, - "editor": None, - "id": 1, - "parent": None, - "user": { - "fullname": "PY C", - "name": "pingou" - } - } - ) - - -if __name__ == '__main__': - SUITE = unittest.TestLoader().loadTestsFromTestCase(PagurePrivateRepotest) - unittest.TextTestRunner(verbosity=2).run(SUITE) From 87bf093936f9ad72b4bc91f19ff2b19628335958 Mon Sep 17 00:00:00 2001 From: farhaanbukhsh Date: Apr 14 2017 10:32:37 +0000 Subject: [PATCH 51/94] Fix test after rebase --- diff --git a/pagure/lib/__init__.py b/pagure/lib/__init__.py index 0237880..4335bd0 100644 --- a/pagure/lib/__init__.py +++ b/pagure/lib/__init__.py @@ -1265,7 +1265,7 @@ def new_project(session, user, name, blacklist, allowed_prefix, description=None, url=None, avatar_email=None, parent_id=None, add_readme=False, userobj=None, prevent_40_chars=False, namespace=None, user_ns=False, - ignore_existing_repo=False): + ignore_existing_repo=False, private=False): ''' Create a new project based on the information provided. ''' if (not namespace and name in blacklist) \ diff --git a/tests/test_pagure_flask_api_ui_private_repo.py b/tests/test_pagure_flask_api_ui_private_repo.py index 22b454b..cdadf0e 100644 --- a/tests/test_pagure_flask_api_ui_private_repo.py +++ b/tests/test_pagure_flask_api_ui_private_repo.py @@ -1340,7 +1340,7 @@ class PagurePrivateRepotest(tests.Modeltests): self.session.commit() item = pagure.lib.model.TokenAcl( token_id='foobar_token', - acl_id=2, + acl_id=7, ) self.session.add(item) self.session.commit() @@ -1474,7 +1474,7 @@ class PagurePrivateRepotest(tests.Modeltests): self.session.commit() item = pagure.lib.model.TokenAcl( token_id='foobar_token', - acl_id=3, + acl_id=10, ) self.session.add(item) self.session.commit() @@ -1650,6 +1650,7 @@ class PagurePrivateRepotest(tests.Modeltests): { "assignee": None, "blocks": [], + "closed_at": None, "comments": [], "content": "This issue needs attention", "date_created": "1431414800", @@ -1697,6 +1698,7 @@ class PagurePrivateRepotest(tests.Modeltests): {'assignee': None, 'author': None, 'status': None, 'tags': []}, 'issues': [{u'assignee': None, 'blocks': [], + 'closed_at': None, 'comments': [], 'content': 'This issue needs attention', 'date_created': '1431414800', @@ -1710,6 +1712,7 @@ class PagurePrivateRepotest(tests.Modeltests): 'user': {'fullname': 'PY C', 'name': 'pingou'}}, {'assignee': None, 'blocks': [], + 'closed_at': None, 'comments': [], 'content': 'We should work on this', 'date_created': '1431414800', @@ -1751,6 +1754,7 @@ class PagurePrivateRepotest(tests.Modeltests): { "assignee": None, "blocks": [], + "closed_at": None, "comments": [], "content": "This issue needs attention", "date_created": "1431414800", @@ -1769,6 +1773,7 @@ class PagurePrivateRepotest(tests.Modeltests): { "assignee": None, "blocks": [], + "closed_at": None, "comments": [], "content": "We should work on this", "date_created": "1431414800", @@ -1847,6 +1852,7 @@ class PagurePrivateRepotest(tests.Modeltests): { "assignee": None, "blocks": [], + "closed_at": None, "comments": [], "content": "This issue needs attention", "date_created": "1431414800", @@ -1865,6 +1871,7 @@ class PagurePrivateRepotest(tests.Modeltests): { "assignee": None, "blocks": [], + "closed_at": None, "comments": [], "content": "We should work on this", "date_created": "1431414800", @@ -1938,6 +1945,7 @@ class PagurePrivateRepotest(tests.Modeltests): { "assignee": None, "blocks": [], + "closed_at":None, "comments": [], "content": "This issue needs attention", "date_created": "1431414800", @@ -1981,6 +1989,7 @@ class PagurePrivateRepotest(tests.Modeltests): { "assignee": None, "blocks": [], + "closed_at":None, "comments": [], "content": "This issue needs attention", "date_created": "1431414800", @@ -2294,6 +2303,7 @@ class PagurePrivateRepotest(tests.Modeltests): "avatar_url": "https://seccdn.libravatar.org/avatar/...", "comment": "This is a very interesting question", "comment_date": "2015-07-02 09:22", + "notification":False, "date_created": "1435821770", "edited_on": None, "editor": None, @@ -2319,6 +2329,7 @@ class PagurePrivateRepotest(tests.Modeltests): "avatar_url": "https://seccdn.libravatar.org/avatar/...", "comment": "This is a very interesting question", "comment_date": "2015-07-02 09:22", + "notification":False, "date_created": "1435821770", "edited_on": None, "editor": None, From 72e9dba78957bff38bda0440631a1ccffbf94077 Mon Sep 17 00:00:00 2001 From: Farhaan Bukhsh Date: Apr 14 2017 10:32:37 +0000 Subject: [PATCH 52/94] Replace get_project to get_authorized_project This is done so that no project should use get_project since it is the direct way to get all the project. There is a level of filtering that get_authorized project provides which is necessary so the information regarding private repo shouldn't be leaked. --- diff --git a/dev-data.py b/dev-data.py index 293d094..fe3dc3a 100644 --- a/dev-data.py +++ b/dev-data.py @@ -257,7 +257,7 @@ def insert_data(session, username, user_email): # projects_groups group = pagure.lib.search_groups(session, pattern=None, group_name="rel-eng", group_type=None) - repo = pagure.lib.get_project(session, 'test') + repo = pagure.get_authorized_project(session, 'test') item = pagure.lib.model.ProjectGroup( project_id=repo.id, group_id=group.id @@ -267,7 +267,7 @@ def insert_data(session, username, user_email): group = pagure.lib.search_groups(session, pattern=None, group_name="admin", group_type=None) - repo = pagure.lib.get_project(session, 'test2') + repo = pagure.get_authorized_project(session, 'test2') item = pagure.lib.model.ProjectGroup( project_id=repo.id, group_id=group.id @@ -277,8 +277,8 @@ def insert_data(session, username, user_email): ###################################### # pull_requests - repo = pagure.lib.get_project(session, 'test') - forked_repo = pagure.lib.get_project(session, 'test') + repo = pagure.get_authorized_project(session, 'test') + forked_repo = pagure.get_authorized_project(session, 'test') req = pagure.lib.new_pull_request( session=session, repo_from=forked_repo, @@ -298,7 +298,7 @@ def insert_data(session, username, user_email): ###################################### # user_projects user = pagure.lib.search_user(session, username='foo') - repo = pagure.lib.get_project(session, 'test') + repo = pagure.get_authorized_project(session, 'test') item = pagure.lib.model.ProjectUser( project_id=repo.id, user_id=user.id @@ -307,7 +307,7 @@ def insert_data(session, username, user_email): session.commit() user = pagure.lib.search_user(session, username=username) - repo = pagure.lib.get_project(session, 'test2') + repo = pagure.get_authorized_project(session, 'test2') item = pagure.lib.model.ProjectUser( project_id=repo.id, user_id=user.id @@ -327,8 +327,7 @@ def insert_data(session, username, user_email): ###################################### # issue_to_issue - repo = pagure.lib.get_project(session, 'test') - + repo = pagure.get_authorized_project(session, 'test') all_issues = pagure.lib.search_issues(session, repo) pagure.lib.add_issue_dependency(session, all_issues[0], all_issues[1], 'pingou', @@ -367,7 +366,7 @@ def insert_data(session, username, user_email): ###################################### # tags_issues - repo = pagure.lib.get_project(session, 'test') + repo = pagure.get_authorized_project(session, 'test') issues = pagure.lib.search_issues(session, repo) item = pagure.lib.model.TagIssue( issue_uid=issues[0].uid, @@ -408,7 +407,7 @@ def insert_data(session, username, user_email): except: print('requests folder already deleted') - repo = pagure.lib.get_project(session, 'test') + repo = pagure.get_authorized_project(session, 'test') result = pagure.lib.fork_project(session, 'foo', repo, pagure.APP.config['GIT_FOLDER'], pagure.APP.config['DOCS_FOLDER'], diff --git a/pagure/api/__init__.py b/pagure/api/__init__.py index 3c542f3..21eab81 100644 --- a/pagure/api/__init__.py +++ b/pagure/api/__init__.py @@ -341,7 +341,7 @@ def api_project_tags(repo, username=None): if pattern is not None and not pattern.endswith('*'): pattern += '*' - project_obj = pagure.lib.get_project(SESSION, repo, username) + project_obj = pagure.get_authorized_project(SESSION, repo, username) if not project_obj: output = {'output': 'notok', 'error': 'Project not found'} jsonout = flask.jsonify(output) diff --git a/pagure/docs_server.py b/pagure/docs_server.py index bc17900..a72331d 100644 --- a/pagure/docs_server.py +++ b/pagure/docs_server.py @@ -16,6 +16,7 @@ import pygit2 from binaryornot.helpers import is_binary_string +import pagure import pagure.doc_utils import pagure.exceptions import pagure.lib @@ -139,8 +140,8 @@ def view_docs(repo, username=None, namespace=None, filename=None): if '.' in repo: namespace, repo = repo.split('.', 1) - repo = pagure.lib.get_project( - SESSION, repo, user=username, namespace=namespace) + repo = pagure.get_authorized_project(SESSION, repo, user=username, + namespace=namespace) if not repo: flask.abort(404, 'Project not found') diff --git a/pagure/internal/__init__.py b/pagure/internal/__init__.py index 17ac510..abbdb96 100644 --- a/pagure/internal/__init__.py +++ b/pagure/internal/__init__.py @@ -249,7 +249,7 @@ def get_pull_request_ready_branch(): response.status_code = 400 return response - repo = pagure.lib.get_project( + repo = pagure.get_authorized_project( pagure.SESSION, flask.request.form.get('repo', '').strip() or None, namespace=flask.request.form.get('namespace', '').strip() or None, @@ -336,7 +336,7 @@ def get_ticket_template(repo, username=None): response.status_code = 400 return response - repo = pagure.lib.get_project(pagure.SESSION, repo, user=username) + repo = pagure.get_authorized_project(pagure.SESSION, repo, user=username) if repo is None: response = flask.jsonify({ @@ -405,7 +405,7 @@ def get_branches_of_commit(): response.status_code = 400 return response - repo = pagure.lib.get_project( + repo = pagure.get_authorized_project( pagure.SESSION, flask.request.form.get('repo', '').strip() or None, user=flask.request.form.get('repouser', '').strip() or None) diff --git a/pagure/lib/__init__.py b/pagure/lib/__init__.py index 4335bd0..a92a7c7 100644 --- a/pagure/lib/__init__.py +++ b/pagure/lib/__init__.py @@ -44,6 +44,7 @@ from sqlalchemy.orm import scoped_session import pygit2 +import pagure import pagure.exceptions import pagure.lib.git import pagure.lib.login diff --git a/pagure/lib/link.py b/pagure/lib/link.py index f1f87e1..f6fb84b 100644 --- a/pagure/lib/link.py +++ b/pagure/lib/link.py @@ -12,7 +12,7 @@ import re - +import pagure import pagure.exceptions diff --git a/pagure/pfmarkdown.py b/pagure/pfmarkdown.py index 4be6cb8..ccb765f 100644 --- a/pagure/pfmarkdown.py +++ b/pagure/pfmarkdown.py @@ -315,8 +315,10 @@ def makeExtension(*arg, **kwargs): def _issue_exists(user, namespace, repo, idx): """ Utility method checking if a given issue exists. """ + repo_obj = pagure.lib.get_project( pagure.SESSION, name=repo, user=user, namespace=namespace) + if not repo_obj: return False @@ -332,6 +334,7 @@ def _pr_exists(user, namespace, repo, idx): """ Utility method checking if a given PR exists. """ repo_obj = pagure.lib.get_project( pagure.SESSION, name=repo, user=user, namespace=namespace) + if not repo_obj: return False diff --git a/tests/test_pagure_flask_api_fork.py b/tests/test_pagure_flask_api_fork.py index 3ecdecf..8a03857 100644 --- a/tests/test_pagure_flask_api_fork.py +++ b/tests/test_pagure_flask_api_fork.py @@ -23,7 +23,7 @@ from mock import patch sys.path.insert(0, os.path.join(os.path.dirname( os.path.abspath(__file__)), '..')) -import pagure.api +import pagure import pagure.lib import tests @@ -55,8 +55,8 @@ class PagureFlaskApiForktests(tests.Modeltests): tests.create_tokens_acl(self.session) # Create a pull-request - repo = pagure.lib.get_project(self.session, 'test') - forked_repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') + forked_repo = pagure.get_authorized_project(self.session, 'test') req = pagure.lib.new_pull_request( session=self.session, repo_from=forked_repo, @@ -216,8 +216,8 @@ class PagureFlaskApiForktests(tests.Modeltests): tests.create_tokens_acl(self.session) # Create a pull-request - repo = pagure.lib.get_project(self.session, 'test') - forked_repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') + forked_repo = pagure.get_authorized_project(self.session, 'test') req = pagure.lib.new_pull_request( session=self.session, repo_from=forked_repo, @@ -381,8 +381,8 @@ class PagureFlaskApiForktests(tests.Modeltests): tests.create_tokens_acl(self.session) # Create the pull-request to close - repo = pagure.lib.get_project(self.session, 'test') - forked_repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') + forked_repo = pagure.get_authorized_project(self.session, 'test') req = pagure.lib.new_pull_request( session=self.session, repo_from=forked_repo, @@ -494,8 +494,8 @@ class PagureFlaskApiForktests(tests.Modeltests): tests.create_tokens_acl(self.session) # Create the pull-request to close - repo = pagure.lib.get_project(self.session, 'test') - forked_repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') + forked_repo = pagure.get_authorized_project(self.session, 'test') req = pagure.lib.new_pull_request( session=self.session, repo_from=forked_repo, @@ -757,8 +757,8 @@ class PagureFlaskApiForktests(tests.Modeltests): ) # Create a pull-request - repo = pagure.lib.get_project(self.session, 'test') - forked_repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') + forked_repo = pagure.get_authorized_project(self.session, 'test') req = pagure.lib.new_pull_request( session=self.session, repo_from=forked_repo, @@ -981,8 +981,8 @@ class PagureFlaskApiForktests(tests.Modeltests): ) # Create a pull-request - repo = pagure.lib.get_project(self.session, 'test') - forked_repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') + forked_repo = pagure.get_authorized_project(self.session, 'test') req = pagure.lib.new_pull_request( session=self.session, repo_from=forked_repo, diff --git a/tests/test_pagure_flask_api_issue.py b/tests/test_pagure_flask_api_issue.py index 77b9964..f1c04ac 100644 --- a/tests/test_pagure_flask_api_issue.py +++ b/tests/test_pagure_flask_api_issue.py @@ -25,6 +25,7 @@ from mock import patch sys.path.insert(0, os.path.join(os.path.dirname( os.path.abspath(__file__)), '..')) +import pagure import pagure.lib import tests @@ -614,8 +615,6 @@ class PagureFlaskApiIssuetests(tests.Modeltests): 'title': 'test issue', 'issue_content': 'This issue needs attention', } - - # Valid request output = self.app.post( '/api/0/test/new_issue', data=data, headers=headers) self.assertEqual(output.status_code, 200) @@ -1716,7 +1715,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): ) # Create private issue - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') msg = pagure.lib.new_issue( session=self.session, repo=repo, @@ -1886,7 +1885,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): ) # Create normal issue - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') msg = pagure.lib.new_issue( session=self.session, repo=repo, @@ -1928,7 +1927,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): self.session.add(item) self.session.commit() - repo = pagure.lib.get_project(self.session, 'foo') + repo = pagure.get_authorized_project(self.session, 'foo') # Create private issue msg = pagure.lib.new_issue( session=self.session, @@ -1943,7 +1942,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): self.assertEqual(msg.title, 'Test issue') # Check status before - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') issue = pagure.lib.search_issues(self.session, repo, issueid=1) self.assertEqual(issue.status, 'Open') @@ -1966,7 +1965,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): ) # No change - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') issue = pagure.lib.search_issues(self.session, repo, issueid=1) self.assertEqual(issue.status, 'Open') @@ -1985,7 +1984,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): ) # No change - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') issue = pagure.lib.search_issues(self.session, repo, issueid=1) self.assertEqual(issue.status, 'Open') @@ -2264,7 +2263,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): ) # Create normal issue - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') msg = pagure.lib.new_issue( session=self.session, repo=repo, @@ -2279,7 +2278,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): self.assertEqual(msg.title, 'Test issue #1') # Check comments before - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') issue = pagure.lib.search_issues(self.session, repo, issueid=1) self.assertEqual(len(issue.comments), 0) @@ -2302,7 +2301,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): ) # No change - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') issue = pagure.lib.search_issues(self.session, repo, issueid=1) self.assertEqual(issue.status, 'Open') @@ -2321,7 +2320,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): ) # One comment added - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') issue = pagure.lib.search_issues(self.session, repo, issueid=1) self.assertEqual(len(issue.comments), 1) @@ -2355,7 +2354,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): self.session.add(item) self.session.commit() - repo = pagure.lib.get_project(self.session, 'foo') + repo = pagure.get_authorized_project(self.session, 'foo') # Create private issue msg = pagure.lib.new_issue( session=self.session, @@ -2371,7 +2370,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): self.assertEqual(msg.title, 'Test issue') # Check before - repo = pagure.lib.get_project(self.session, 'foo') + repo = pagure.get_authorized_project(self.session, 'foo') issue = pagure.lib.search_issues(self.session, repo, issueid=1) self.assertEqual(len(issue.comments), 0) @@ -2390,7 +2389,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): self.assertEqual(pagure.api.APIERROR.EINVALIDTOK.value, data['error']) # No comment added - repo = pagure.lib.get_project(self.session, 'foo') + repo = pagure.get_authorized_project(self.session, 'foo') issue = pagure.lib.search_issues(self.session, repo, issueid=1) self.assertEqual(len(issue.comments), 0) @@ -2787,7 +2786,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): ) # Create normal issue - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') msg = pagure.lib.new_issue( session=self.session, repo=repo, @@ -2802,7 +2801,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): self.assertEqual(msg.title, 'Test issue #1') # Check comments before - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') issue = pagure.lib.search_issues(self.session, repo, issueid=1) self.assertEqual(len(issue.comments), 0) @@ -2834,7 +2833,8 @@ class PagureFlaskApiIssuetests(tests.Modeltests): data, {'message': 'Assignee reset'} ) - repo = pagure.lib.get_project(self.session, 'test') + # No change + repo = pagure.get_authorized_project(self.session, 'test') issue = pagure.lib.search_issues(self.session, repo, issueid=1) self.assertEqual(issue.assignee, None) @@ -2886,7 +2886,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): ) # One comment added - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') issue = pagure.lib.search_issues(self.session, repo, issueid=1) self.assertEqual(issue.assignee.user, 'pingou') @@ -2920,7 +2920,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): self.session.add(item) self.session.commit() - repo = pagure.lib.get_project(self.session, 'foo') + repo = pagure.get_authorized_project(self.session, 'foo') # Create private issue msg = pagure.lib.new_issue( session=self.session, @@ -2936,7 +2936,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): self.assertEqual(msg.title, 'Test issue') # Check before - repo = pagure.lib.get_project(self.session, 'foo') + repo = pagure.get_authorized_project(self.session, 'foo') issue = pagure.lib.search_issues(self.session, repo, issueid=1) self.assertEqual(len(issue.comments), 0) @@ -2955,7 +2955,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): self.assertEqual(pagure.api.APIERROR.EINVALIDTOK.value, data['error']) # No comment added - repo = pagure.lib.get_project(self.session, 'foo') + repo = pagure.get_authorized_project(self.session, 'foo') issue = pagure.lib.search_issues(self.session, repo, issueid=1) self.assertEqual(len(issue.comments), 0) diff --git a/tests/test_pagure_flask_api_project.py b/tests/test_pagure_flask_api_project.py index 6bfb9b5..8940d9e 100644 --- a/tests/test_pagure_flask_api_project.py +++ b/tests/test_pagure_flask_api_project.py @@ -115,7 +115,7 @@ class PagureFlaskApiProjecttests(tests.Modeltests): tests.create_projects(self.session) # Check before adding - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') self.assertEqual(repo.tags, []) # Adding a tag @@ -125,7 +125,7 @@ class PagureFlaskApiProjecttests(tests.Modeltests): self.assertEqual(output, ['Issue tagged with: infra']) # Check after adding - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') self.assertEqual(len(repo.tags), 1) self.assertEqual(repo.tags_text, ['infra']) diff --git a/tests/test_pagure_flask_docs.py b/tests/test_pagure_flask_docs.py index de232f8..5ca5d64 100644 --- a/tests/test_pagure_flask_docs.py +++ b/tests/test_pagure_flask_docs.py @@ -24,6 +24,7 @@ from mock import patch sys.path.insert(0, os.path.join(os.path.dirname( os.path.abspath(__file__)), '..')) +import pagure import pagure.docs_server import pagure.lib import tests @@ -120,7 +121,7 @@ class PagureFlaskDocstests(tests.Modeltests): tests.create_projects(self.session) # Turn on the docs project since it's off by default - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') repo.settings = {'project_documentation': True} self.session.add(repo) self.session.commit() @@ -163,6 +164,51 @@ class PagureFlaskDocstests(tests.Modeltests): self.assertEqual(output.status_code, 404) self._set_up_doc() + # forked doc repo + docrepo = os.path.join(self.path, 'docs', 'test', 'test.git') + repo = pygit2.init_repository(docrepo) + + # Create files in that git repo + with open(os.path.join(docrepo, 'sources'), 'w') as stream: + stream.write('foo\n bar') + repo.index.add('sources') + repo.index.write() + + folderpart = os.path.join(docrepo, 'folder1', 'folder2') + os.makedirs(folderpart) + with open(os.path.join(folderpart, 'test_file'), 'w') as stream: + stream.write('row1\nrow2\nrow3') + repo.index.add(os.path.join('folder1', 'folder2', 'test_file')) + 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/master', # the name of the reference to update + author, + committer, + 'Add test files and folder', + # binary string representing the tree object ID + tree, + # list of binary strings representing parents of the new commit + [] + ) + + # Push the changes to the bare repo + remote = repo.create_remote( + 'origin', os.path.join(self.path, 'docs', 'test.git')) + + PagureRepo.push(remote, 'refs/heads/master:refs/heads/master') + + # Turn on the docs project since it's off by default + repo = pagure.get_authorized_project(self.session, 'test') + repo.settings = {'project_documentation': True} + self.session.add(repo) + self.session.commit() # Now check the UI diff --git a/tests/test_pagure_flask_dump_load_ticket.py b/tests/test_pagure_flask_dump_load_ticket.py index aecf319..ac84724 100644 --- a/tests/test_pagure_flask_dump_load_ticket.py +++ b/tests/test_pagure_flask_dump_load_ticket.py @@ -24,6 +24,7 @@ from mock import patch sys.path.insert(0, os.path.join(os.path.dirname( os.path.abspath(__file__)), '..')) +import pagure import pagure.lib import tests @@ -67,7 +68,7 @@ class PagureFlaskDumpLoadTicketTests(tests.Modeltests): os.makedirs(self.gitrepo) repo_obj = pygit2.init_repository(self.gitrepo, bare=True) - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') # Create an issue to play with msg = pagure.lib.new_issue( session=self.session, @@ -208,7 +209,7 @@ class PagureFlaskDumpLoadTicketTests(tests.Modeltests): ) # Post loading - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') self.assertEqual(len(repo.issues), 1) issue = pagure.lib.search_issues(self.session, repo, issueid=1) diff --git a/tests/test_pagure_flask_internal.py b/tests/test_pagure_flask_internal.py index 0a51015..017f286 100644 --- a/tests/test_pagure_flask_internal.py +++ b/tests/test_pagure_flask_internal.py @@ -23,6 +23,7 @@ from mock import patch sys.path.insert(0, os.path.join(os.path.dirname( os.path.abspath(__file__)), '..')) +import pagure import pagure.lib import tests @@ -55,7 +56,7 @@ class PagureFlaskInternaltests(tests.Modeltests): tests.create_projects(self.session) - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') req = pagure.lib.new_pull_request( session=self.session, @@ -117,7 +118,7 @@ class PagureFlaskInternaltests(tests.Modeltests): js_data = json.loads(output.data) self.assertDictEqual(js_data, {'message': 'Comment added'}) - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') request = repo.requests[0] self.assertEqual(len(request.comments), 1) self.assertEqual(len(request.discussion), 1) @@ -139,7 +140,7 @@ class PagureFlaskInternaltests(tests.Modeltests): tests.create_projects(self.session) # Create issues to play with - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') msg = pagure.lib.new_issue( session=self.session, repo=repo, @@ -196,7 +197,7 @@ class PagureFlaskInternaltests(tests.Modeltests): js_data = json.loads(output.data) self.assertDictEqual(js_data, {'message': 'Comment added'}) - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') issue = repo.issues[0] self.assertEqual(len(issue.comments), 1) @@ -218,7 +219,7 @@ class PagureFlaskInternaltests(tests.Modeltests): tests.create_projects(self.session) # Create issues to play with - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') msg = pagure.lib.new_issue( session=self.session, repo=repo, @@ -285,7 +286,7 @@ class PagureFlaskInternaltests(tests.Modeltests): js_data = json.loads(output.data) self.assertDictEqual(js_data, {'message': 'Comment added'}) - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') issue = repo.issues[0] self.assertEqual(len(issue.comments), 1) @@ -494,7 +495,7 @@ class PagureFlaskInternaltests(tests.Modeltests): # Create a PR for these changes tests.create_projects(self.session) - project = pagure.lib.get_project(self.session, 'test') + project = pagure.get_authorized_project(self.session, 'test') req = pagure.lib.new_pull_request( session=self.session, repo_from=project, @@ -533,7 +534,7 @@ class PagureFlaskInternaltests(tests.Modeltests): self.assertEqual(output.status_code, 404) # With all the desired information - project = pagure.lib.get_project(self.session, 'test') + project = pagure.get_authorized_project(self.session, 'test') data = { 'csrf_token': csrf_token, 'requestid': project.requests[0].uid, @@ -616,7 +617,7 @@ class PagureFlaskInternaltests(tests.Modeltests): # Create a PR for these changes tests.create_projects(self.session) - project = pagure.lib.get_project(self.session, 'test') + project = pagure.get_authorized_project(self.session, 'test') req = pagure.lib.new_pull_request( session=self.session, repo_from=project, @@ -655,7 +656,7 @@ class PagureFlaskInternaltests(tests.Modeltests): self.assertEqual(output.status_code, 404) # With all the desired information - project = pagure.lib.get_project(self.session, 'test') + project = pagure.get_authorized_project(self.session, 'test') data = { 'csrf_token': csrf_token, 'requestid': project.requests[0].uid, @@ -759,7 +760,7 @@ class PagureFlaskInternaltests(tests.Modeltests): # Create a PR for these changes tests.create_projects(self.session) - project = pagure.lib.get_project(self.session, 'test') + project = pagure.get_authorized_project(self.session, 'test') req = pagure.lib.new_pull_request( session=self.session, repo_from=project, @@ -796,7 +797,7 @@ class PagureFlaskInternaltests(tests.Modeltests): self.assertEqual(output.status_code, 404) # With all the desired information - project = pagure.lib.get_project(self.session, 'test') + project = pagure.get_authorized_project(self.session, 'test') data = { 'csrf_token': csrf_token, 'requestid': project.requests[0].uid, @@ -900,7 +901,7 @@ class PagureFlaskInternaltests(tests.Modeltests): # Create a PR for these changes tests.create_projects(self.session) - project = pagure.lib.get_project(self.session, 'test') + project = pagure.get_authorized_project(self.session, 'test') req = pagure.lib.new_pull_request( session=self.session, repo_from=project, @@ -937,7 +938,7 @@ class PagureFlaskInternaltests(tests.Modeltests): self.assertEqual(output.status_code, 404) # With all the desired information - project = pagure.lib.get_project(self.session, 'test') + project = pagure.get_authorized_project(self.session, 'test') data = { 'csrf_token': csrf_token, 'requestid': project.requests[0].uid, diff --git a/tests/test_pagure_flask_ui_fork.py b/tests/test_pagure_flask_ui_fork.py index fbe0b33..7464448 100644 --- a/tests/test_pagure_flask_ui_fork.py +++ b/tests/test_pagure_flask_ui_fork.py @@ -24,6 +24,7 @@ from mock import patch sys.path.insert(0, os.path.join(os.path.dirname( os.path.abspath(__file__)), '..')) +import pagure import pagure.lib import tests from pagure.lib.repo import PagureRepo @@ -206,7 +207,7 @@ class PagureFlaskForktests(tests.Modeltests): PagureRepo.push(ori_remote, refname) # Create a PR for these changes - project = pagure.lib.get_project(self.session, 'test') + project = pagure.get_authorized_project(self.session, 'test') req = pagure.lib.new_pull_request( session=self.session, repo_from=project, @@ -242,7 +243,7 @@ class PagureFlaskForktests(tests.Modeltests): self.set_up_git_repo(new_project=None, branch_from='feature') - project = pagure.lib.get_project(self.session, 'test') + project = pagure.get_authorized_project(self.session, 'test') self.assertEqual(len(project.requests), 1) # View the pull-request @@ -317,7 +318,7 @@ class PagureFlaskForktests(tests.Modeltests): self.assertEqual(output.status_code, 404) # Project w/o pull-request - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') settings = repo.settings settings['pull_requests'] = False repo.settings = settings @@ -351,7 +352,7 @@ class PagureFlaskForktests(tests.Modeltests): 'assigned to be merged', output.data) # PR assigned but not to this user - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') req = repo.requests[0] req.assignee_id = 2 self.session.add(req) @@ -565,7 +566,7 @@ class PagureFlaskForktests(tests.Modeltests): self.set_up_git_repo(new_project=None, branch_from='feature') # Project w/o pull-request - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') settings = repo.settings settings['pull_requests'] = False repo.settings = settings @@ -633,7 +634,7 @@ class PagureFlaskForktests(tests.Modeltests): PagureRepo.push(ori_remote, refname) # Create a PR for these changes - project = pagure.lib.get_project(self.session, 'test') + project = pagure.get_authorized_project(self.session, 'test') req = pagure.lib.new_pull_request( session=self.session, repo_from=item, @@ -695,7 +696,7 @@ class PagureFlaskForktests(tests.Modeltests): # Create a PR for these "changes" (there are none, both repos are # empty) - project = pagure.lib.get_project(self.session, 'test') + project = pagure.get_authorized_project(self.session, 'test') req = pagure.lib.new_pull_request( session=self.session, repo_from=item, @@ -789,7 +790,7 @@ class PagureFlaskForktests(tests.Modeltests): 'href="/test/pull-requests?status=0">Closed', output.data) # Project w/o pull-request - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') settings = repo.settings settings['pull_requests'] = False repo.settings = settings @@ -862,7 +863,7 @@ index 9f44358..2a552bb 100644 self.assertEqual(patch, exp) # Project w/o pull-request - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') settings = repo.settings settings['pull_requests'] = False repo.settings = settings @@ -976,7 +977,7 @@ index 9f44358..2a552bb 100644 # Create a PR for these "changes" (there are none, both repos are # empty) - project = pagure.lib.get_project(self.session, 'test') + project = pagure.get_authorized_project(self.session, 'test') req = pagure.lib.new_pull_request( session=self.session, repo_from=item, @@ -1067,7 +1068,7 @@ index 0000000..2a552bb # Create a PR for these "changes" (there are none, both repos are # empty) - project = pagure.lib.get_project(self.session, 'test') + project = pagure.get_authorized_project(self.session, 'test') req = pagure.lib.new_pull_request( session=self.session, repo_from=item, @@ -1149,7 +1150,7 @@ index 0000000..2a552bb user.username = 'pingou' with tests.user_set(pagure.APP, user): # Project w/o pull-request - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') settings = repo.settings settings['pull_requests'] = False repo.settings = settings @@ -1162,7 +1163,7 @@ index 0000000..2a552bb self.assertEqual(output.status_code, 404) # Project w/ pull-request - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') settings = repo.settings settings['pull_requests'] = True repo.settings = settings @@ -1288,7 +1289,7 @@ index 0000000..2a552bb output.data) # Pull-Request closed - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') req = repo.requests[0] req.status = 'Closed' req.closed_by_in = 1 @@ -1301,7 +1302,7 @@ index 0000000..2a552bb self.assertEqual(output.status_code, 403) # Project w/o pull-request - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') settings = repo.settings settings['pull_requests'] = False repo.settings = settings @@ -1370,8 +1371,8 @@ index 0000000..2a552bb tests.create_projects_git( os.path.join(self.path, 'requests'), bare=True) - repo = pagure.lib.get_project(self.session, 'test') - fork = pagure.lib.get_project(self.session, 'test', user='foo') + repo = pagure.get_authorized_project(self.session, 'test') + fork = pagure.get_authorized_project(self.session, 'test', user='foo') self.set_up_git_repo( new_project=fork, branch_from='feature', mtype='FF') @@ -1518,8 +1519,8 @@ index 0000000..2a552bb tests.create_projects_git( os.path.join(self.path, 'requests'), bare=True) - repo = pagure.lib.get_project(self.session, 'test') - fork = pagure.lib.get_project(self.session, 'test', user='foo') + repo = pagure.get_authorized_project(self.session, 'test') + fork = pagure.get_authorized_project(self.session, 'test', user='foo') # Create a git repo to play with gitrepo = os.path.join(self.path, 'repos', 'test.git') @@ -1569,8 +1570,8 @@ index 0000000..2a552bb tests.create_projects_git( os.path.join(self.path, 'requests'), bare=True) - repo = pagure.lib.get_project(self.session, 'test') - fork = pagure.lib.get_project(self.session, 'test', user='foo') + repo = pagure.get_authorized_project(self.session, 'test') + fork = pagure.get_authorized_project(self.session, 'test', user='foo') # Create a git repo to play with gitrepo = os.path.join(self.path, 'repos', 'test.git') @@ -1634,7 +1635,7 @@ index 0000000..2a552bb output.data) # Project w/o pull-request - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') settings = repo.settings settings['pull_requests'] = False repo.settings = settings @@ -1653,7 +1654,7 @@ index 0000000..2a552bb self.test_pull_request_add_comment() # Project w/ pull-request - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') settings = repo.settings settings['pull_requests'] = True repo.settings = settings @@ -1715,7 +1716,7 @@ index 0000000..2a552bb output.data) # Project w/o pull-request - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') settings = repo.settings settings['pull_requests'] = False repo.settings = settings @@ -1809,7 +1810,7 @@ index 0000000..2a552bb '\n Comment updated', output.data) # Project w/o pull-request - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') settings = repo.settings settings['pull_requests'] = False repo.settings = settings @@ -1879,7 +1880,7 @@ index 0000000..2a552bb self.assertEqual(output.status_code, 404) # Project requiring a merge commit - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') settings = repo.settings settings['always_merge'] = True repo.settings = settings diff --git a/tests/test_pagure_flask_ui_issues.py b/tests/test_pagure_flask_ui_issues.py index b328ea0..bb47299 100644 --- a/tests/test_pagure_flask_ui_issues.py +++ b/tests/test_pagure_flask_ui_issues.py @@ -29,6 +29,7 @@ from mock import patch sys.path.insert(0, os.path.join(os.path.dirname( os.path.abspath(__file__)), '..')) +import pagure import pagure.lib import tests @@ -145,7 +146,7 @@ class PagureFlaskIssuestests(tests.Modeltests): output.data) # Project w/o issue tracker - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') repo.settings = {'issue_tracker': False} self.session.add(repo) self.session.commit() @@ -211,7 +212,7 @@ class PagureFlaskIssuestests(tests.Modeltests): output.data) # Project w/o issue tracker - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') repo.settings = {'issue_tracker': False} self.session.add(repo) self.session.commit() @@ -297,7 +298,7 @@ class PagureFlaskIssuestests(tests.Modeltests): self.assertTrue( '

\n 0 Open Issues' in output.data) - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') # Create some custom fields to play with msg = pagure.lib.set_custom_key_fields( session=self.session, @@ -461,7 +462,7 @@ class PagureFlaskIssuestests(tests.Modeltests): output.data) # Project w/o issue tracker - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') repo.settings = {'issue_tracker': False} self.session.add(repo) self.session.commit() @@ -496,7 +497,7 @@ class PagureFlaskIssuestests(tests.Modeltests): self.assertEqual(output.status_code, 404) # Create issues to play with - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') msg = pagure.lib.new_issue( session=self.session, repo=repo, @@ -560,7 +561,7 @@ class PagureFlaskIssuestests(tests.Modeltests): 'name="csrf_token" type="hidden" value="')[1].split('">')[0] # Create private issue - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') msg = pagure.lib.new_issue( session=self.session, repo=repo, @@ -600,7 +601,7 @@ class PagureFlaskIssuestests(tests.Modeltests): output.data) # Project w/o issue tracker - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') repo.settings = {'issue_tracker': False} self.session.add(repo) self.session.commit() @@ -952,7 +953,7 @@ class PagureFlaskIssuestests(tests.Modeltests): self.assertEqual(output.status_code, 302) # Create issues to play with - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') msg = pagure.lib.new_issue( session=self.session, repo=repo, @@ -1167,7 +1168,7 @@ class PagureFlaskIssuestests(tests.Modeltests): in output.data) # Create another issue with a dependency - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') msg = pagure.lib.new_issue( session=self.session, repo=repo, @@ -1213,7 +1214,7 @@ class PagureFlaskIssuestests(tests.Modeltests): in output.data) # Create private issue - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') msg = pagure.lib.new_issue( session=self.session, repo=repo, @@ -1234,7 +1235,7 @@ class PagureFlaskIssuestests(tests.Modeltests): self.assertEqual(output.status_code, 403) # Project w/o issue tracker - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') repo.settings = {'issue_tracker': False} self.session.add(repo) self.session.commit() @@ -1259,7 +1260,7 @@ class PagureFlaskIssuestests(tests.Modeltests): os.path.join(self.path), bare=True) # Create issues to play with - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') msg = pagure.lib.new_issue( session=self.session, repo=repo, @@ -1309,7 +1310,7 @@ class PagureFlaskIssuestests(tests.Modeltests): '

Woohoo a second comment !

' in output.data) self.assertEqual(output.data.count('comment_body">'), 2) - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') issue = pagure.lib.search_issues(self.session, repo, issueid=1) self.assertEqual(len(issue.comments), 1) @@ -1353,7 +1354,7 @@ class PagureFlaskIssuestests(tests.Modeltests): '/test/issue/1/update', data=data, follow_redirects=True) self.assertEqual(output.status_code, 404) - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') issue = pagure.lib.search_issues(self.session, repo, issueid=1) self.assertEqual(len(issue.comments), 0) @@ -1369,7 +1370,7 @@ class PagureFlaskIssuestests(tests.Modeltests): os.path.join(self.path), bare=True) # Create issues to play with - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') msg = pagure.lib.new_issue( session=self.session, repo=repo, @@ -1381,7 +1382,7 @@ class PagureFlaskIssuestests(tests.Modeltests): self.session.commit() self.assertEqual(msg.title, 'Test issue') - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') msg = pagure.lib.new_issue( session=self.session, repo=repo, @@ -1445,7 +1446,7 @@ class PagureFlaskIssuestests(tests.Modeltests): 'Successfully edited issue #1', output.data) - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') issue = pagure.lib.search_issues(self.session, repo, issueid=1) self.assertEqual(issue.depending_text, [2]) self.assertEqual(issue.blocking_text, []) @@ -1462,7 +1463,7 @@ class PagureFlaskIssuestests(tests.Modeltests): os.path.join(self.path), bare=True) # Create issues to play with - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') msg = pagure.lib.new_issue( session=self.session, repo=repo, @@ -1474,7 +1475,7 @@ class PagureFlaskIssuestests(tests.Modeltests): self.session.commit() self.assertEqual(msg.title, 'Test issue') - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') msg = pagure.lib.new_issue( session=self.session, repo=repo, @@ -1567,7 +1568,7 @@ class PagureFlaskIssuestests(tests.Modeltests): 'Successfully edited issue #1', output.data) - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') issue = pagure.lib.search_issues(self.session, repo, issueid=1) self.assertEqual(issue.depending_text, []) self.assertEqual(issue.blocking_text, [2]) @@ -1588,7 +1589,7 @@ class PagureFlaskIssuestests(tests.Modeltests): os.path.join(self.path, 'tickets'), bare=True) # Create issues to play with - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') msg = pagure.lib.new_issue( session=self.session, repo=repo, @@ -1678,7 +1679,7 @@ class PagureFlaskIssuestests(tests.Modeltests): self.assertDictEqual(json_data, exp) # Project w/o issue tracker - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') repo.settings = {'issue_tracker': False} self.session.add(repo) self.session.commit() @@ -1695,7 +1696,7 @@ class PagureFlaskIssuestests(tests.Modeltests): os.path.join(self.path, 'tickets'), bare=True) # Create issues to play with - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') msg = pagure.lib.new_issue( session=self.session, repo=repo, @@ -1719,7 +1720,7 @@ class PagureFlaskIssuestests(tests.Modeltests): self.assertEqual(output.status_code, 404) # Project w/o issue tracker - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') repo.settings = {'issue_tracker': False} self.session.add(repo) self.session.commit() @@ -1733,7 +1734,7 @@ class PagureFlaskIssuestests(tests.Modeltests): self.test_upload_issue() # Project w/ issue tracker - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') repo.settings = {'issue_tracker': True} self.session.add(repo) self.session.commit() @@ -1754,7 +1755,7 @@ class PagureFlaskIssuestests(tests.Modeltests): self.assertEqual(output.status_code, 200) # Project w/o issue tracker - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') repo.settings = {'issue_tracker': False} self.session.add(repo) self.session.commit() @@ -1795,7 +1796,7 @@ class PagureFlaskIssuestests(tests.Modeltests): self.assertEqual(output.status_code, 404) # Create issues to play with - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') msg = pagure.lib.new_issue( session=self.session, repo=repo, @@ -1868,7 +1869,7 @@ class PagureFlaskIssuestests(tests.Modeltests): '

We should work on this!

'), 1) # Project w/o issue tracker - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') repo.settings = {'issue_tracker': False} self.session.add(repo) self.session.commit() @@ -1905,7 +1906,7 @@ class PagureFlaskIssuestests(tests.Modeltests): self.assertEqual(output.status_code, 302) # Create issues to play with - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') msg = pagure.lib.new_issue( session=self.session, repo=repo, @@ -2008,7 +2009,7 @@ class PagureFlaskIssuestests(tests.Modeltests): self.assertEqual(output.status_code, 302) # Create issues to play with - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') msg = pagure.lib.new_issue( session=self.session, repo=repo, @@ -2076,7 +2077,7 @@ class PagureFlaskIssuestests(tests.Modeltests): tests.create_projects_git(os.path.join(self.path, 'tickets')) # Create issues to play with - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') msg = pagure.lib.new_issue( session=self.session, repo=repo, @@ -2136,7 +2137,7 @@ class PagureFlaskIssuestests(tests.Modeltests): output.data) # Project w/o issue tracker - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') repo.settings = {'issue_tracker': False} self.session.add(repo) self.session.commit() @@ -2158,7 +2159,7 @@ class PagureFlaskIssuestests(tests.Modeltests): os.path.join(self.path), bare=True) # Create issues to play with - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') msg = pagure.lib.new_issue( session=self.session, repo=repo, @@ -2208,7 +2209,7 @@ class PagureFlaskIssuestests(tests.Modeltests): '

Woohoo a second comment !

' in output.data) self.assertEqual(output.data.count('comment_body">'), 2) - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') issue = pagure.lib.search_issues(self.session, repo, issueid=1) self.assertEqual(len(issue.comments), 1) self.assertEqual( @@ -2251,7 +2252,7 @@ class PagureFlaskIssuestests(tests.Modeltests): '\n Comment updated', output.data) - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') issue = pagure.lib.search_issues(self.session, repo, issueid=1) self.assertEqual(len(issue.comments), 1) self.assertEqual(issue.comments[0].comment, 'Updated comment') @@ -2289,7 +2290,7 @@ class PagureFlaskIssuestests(tests.Modeltests): '\n Comment updated', output.data) - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') issue = pagure.lib.search_issues(self.session, repo, issueid=1) self.assertEqual(len(issue.comments), 1) self.assertEqual(issue.comments[0].comment, 'Second update') @@ -2410,7 +2411,7 @@ class PagureFlaskIssuestests(tests.Modeltests): '

Issues GIT URLs
', output.data) # Project w/o issue tracker - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') repo.settings = {'issue_tracker': True} self.session.add(repo) self.session.commit() diff --git a/tests/test_pagure_flask_ui_priorities.py b/tests/test_pagure_flask_ui_priorities.py index 9666b0a..34a843f 100644 --- a/tests/test_pagure_flask_ui_priorities.py +++ b/tests/test_pagure_flask_ui_priorities.py @@ -25,6 +25,7 @@ from mock import patch sys.path.insert(0, os.path.join(os.path.dirname( os.path.abspath(__file__)), '..')) +import pagure import pagure.lib import tests from pagure.lib.repo import PagureRepo @@ -110,7 +111,7 @@ class PagureFlaskPrioritiestests(tests.Modeltests): tests.create_projects_git(os.path.join(self.path), bare=True) # Set some priorities - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') repo.priorities = {'1': 'High', '2': 'Normal'} self.session.add(repo) self.session.commit() @@ -156,7 +157,7 @@ class PagureFlaskPrioritiestests(tests.Modeltests): tests.create_projects_git(os.path.join(self.path), bare=True) # Set some priorities - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') self.assertEqual(repo.priorities, {}) user = tests.FakeUser() @@ -185,7 +186,7 @@ class PagureFlaskPrioritiestests(tests.Modeltests): 'Settings - test - Pagure', output.data) self.assertIn('

Settings for test

', output.data) # Check the result of the action -- None, no CSRF - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') self.assertEqual(repo.priorities, {}) data = { @@ -201,7 +202,7 @@ class PagureFlaskPrioritiestests(tests.Modeltests): 'Settings - test - Pagure', output.data) self.assertIn('

Settings for test

', output.data) # Check the result of the action -- Priority recorded - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') self.assertEqual(repo.priorities, {u'': u'', u'1': u'High'}) data = { @@ -222,7 +223,7 @@ class PagureFlaskPrioritiestests(tests.Modeltests): self.assertTrue( output.data.find('Normal') < output.data.find('Low')) # Check the result of the action -- Priority recorded - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') self.assertEqual( repo.priorities, {u'': u'', u'1': u'High', u'2': u'Normal', u'3': u'Low'} @@ -245,7 +246,7 @@ class PagureFlaskPrioritiestests(tests.Modeltests): '\n' ' Priorities weights and titles are ' 'not of the same length', output.data) # Check the result of the action -- Priorities un-changed - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') self.assertEqual( repo.priorities, {u'': u'', u'1': u'High', u'2': u'Normal', u'3': u'Low'} @@ -269,7 +270,7 @@ class PagureFlaskPrioritiestests(tests.Modeltests): ' Priorities weights must be numbers', output.data) # Check the result of the action -- Priorities un-changed - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') self.assertEqual( repo.priorities, {u'': u'', u'1': u'High', u'2': u'Normal', u'3': u'Low'} @@ -293,7 +294,7 @@ class PagureFlaskPrioritiestests(tests.Modeltests): ' Priority weight 2 is present 2 times', output.data) # Check the result of the action -- Priorities un-changed - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') self.assertEqual( repo.priorities, {u'': u'', u'1': u'High', u'2': u'Normal', u'3': u'Low'} @@ -317,7 +318,7 @@ class PagureFlaskPrioritiestests(tests.Modeltests): ' Priority Normal is present 2 times', output.data) # Check the result of the action -- Priorities un-changed - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') self.assertEqual( repo.priorities, {u'': u'', u'1': u'High', u'2': u'Normal', u'3': u'Low'} diff --git a/tests/test_pagure_flask_ui_repo.py b/tests/test_pagure_flask_ui_repo.py index 9e25d9d..05eea20 100644 --- a/tests/test_pagure_flask_ui_repo.py +++ b/tests/test_pagure_flask_ui_repo.py @@ -25,6 +25,7 @@ from mock import patch, MagicMock sys.path.insert(0, os.path.join(os.path.dirname( os.path.abspath(__file__)), '..')) +import pagure import pagure.lib import tests from pagure.lib.repo import PagureRepo @@ -499,7 +500,7 @@ class PagureFlaskRepotests(tests.Modeltests): self.assertEqual(output.status_code, 302) # Add an user to a project - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') msg = pagure.lib.add_user_to_project( session=self.session, project=repo, @@ -646,7 +647,7 @@ class PagureFlaskRepotests(tests.Modeltests): 'access on the repo', output.data) # Add an user to a project - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') msg = pagure.lib.add_user_to_project( session=self.session, project=repo, @@ -722,7 +723,7 @@ class PagureFlaskRepotests(tests.Modeltests): self.assertEqual(msg, 'User `pingou` added to the group `testgrp`.') self.session.commit() - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') # Add the group to a project msg = pagure.lib.add_group_to_project( session=self.session, @@ -808,7 +809,7 @@ class PagureFlaskRepotests(tests.Modeltests): self.assertEqual(msg, 'User `pingou` added to the group `testgrp`.') self.session.commit() - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') # Add the group to a project msg = pagure.lib.add_group_to_project( session=self.session, @@ -1310,7 +1311,7 @@ class PagureFlaskRepotests(tests.Modeltests): self.perfReset() # Turn that repo into a fork - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') repo.parent_id = 2 repo.is_fork = True self.session.add(repo) @@ -1445,7 +1446,7 @@ class PagureFlaskRepotests(tests.Modeltests): 'test project #1

', output.data) # Turn that repo into a fork - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') repo.parent_id = 2 repo.is_fork = True self.session.add(repo) @@ -1540,7 +1541,7 @@ class PagureFlaskRepotests(tests.Modeltests): 'test project #1
', output.data) # Turn that repo into a fork - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') repo.parent_id = 2 repo.is_fork = True self.session.add(repo) @@ -2598,7 +2599,7 @@ index 0000000..fb7093d output.data) # add issues - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') msg = pagure.lib.new_issue( session=self.session, repo=repo, @@ -2692,9 +2693,9 @@ index 0000000..fb7093d output = self.app.post('/test/delete', follow_redirects=True) self.assertEqual(output.status_code, 404) - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') self.assertNotEqual(repo, None) - repo = pagure.lib.get_project(self.session, 'test2') + repo = pagure.get_authorized_project(self.session, 'test2') self.assertNotEqual(repo, None) # Add a fork of a fork @@ -2849,7 +2850,7 @@ index 0000000..fb7093d output.data) # add issues - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') msg = pagure.lib.new_issue( session=self.session, repo=repo, @@ -2949,9 +2950,9 @@ index 0000000..fb7093d 'Forks 0', output.data) - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') self.assertEqual(repo, None) - repo = pagure.lib.get_project(self.session, 'test2') + repo = pagure.get_authorized_project(self.session, 'test2') self.assertNotEqual(repo, None) # Add a fork of a fork @@ -3267,7 +3268,7 @@ index 0000000..fb7093d tests.create_projects(self.session) tests.create_projects_git(self.path) - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') self.assertEqual(repo.hook_token, 'aaabbbccc') user = tests.FakeUser() @@ -3293,7 +3294,7 @@ index 0000000..fb7093d pagure.APP.config['WEBHOOK'] = False - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') self.assertEqual(repo.hook_token, 'aaabbbccc') user.username = 'pingou' @@ -3304,7 +3305,7 @@ index 0000000..fb7093d data = {'csrf_token': csrf_token} - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') self.assertEqual(repo.hook_token, 'aaabbbccc') output = self.app.post( @@ -3315,7 +3316,7 @@ index 0000000..fb7093d output.data) pagure.APP.config['WEBHOOK'] = False - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') self.assertNotEqual(repo.hook_token, 'aaabbbccc') @patch('pagure.lib.notify.send_email') @@ -3364,7 +3365,7 @@ index 0000000..fb7093d self.assertEqual(output.status_code, 400) # Create an issue to play with - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') msg = pagure.lib.new_issue( session=self.session, repo=repo, @@ -3385,7 +3386,7 @@ index 0000000..fb7093d output.data) # Create a request to play with - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') msg = pagure.lib.new_pull_request( session=self.session, repo_from=repo, @@ -3925,7 +3926,7 @@ index 0000000..fb7093d output.data) # Existing token will expire in 60 days - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') self.assertEqual( repo.tokens[0].expiration.date(), datetime.datetime.utcnow().date() + datetime.timedelta(days=60)) @@ -3942,7 +3943,7 @@ index 0000000..fb7093d output.data) # Existing token has been expired - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') self.assertEqual( repo.tokens[0].expiration.date(), repo.tokens[0].created.date()) diff --git a/tests/test_pagure_flask_ui_roadmap.py b/tests/test_pagure_flask_ui_roadmap.py index 503382b..b97469c 100644 --- a/tests/test_pagure_flask_ui_roadmap.py +++ b/tests/test_pagure_flask_ui_roadmap.py @@ -25,6 +25,7 @@ from mock import patch sys.path.insert(0, os.path.join(os.path.dirname( os.path.abspath(__file__)), '..')) +import pagure import pagure.lib import tests from pagure.lib.repo import PagureRepo @@ -108,7 +109,7 @@ class PagureFlaskRoadmaptests(tests.Modeltests): tests.create_projects_git(os.path.join(self.path), bare=True) # Set some milestone - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') repo.milestone = {'v1.0': '', 'v2.0': 'Tomorrow!'} self.session.add(repo) self.session.commit() @@ -168,7 +169,7 @@ class PagureFlaskRoadmaptests(tests.Modeltests): tests.create_projects_git(os.path.join(self.path), bare=True) # Set some milestones - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') self.assertEqual(repo.milestones, {}) user = tests.FakeUser() @@ -197,7 +198,7 @@ class PagureFlaskRoadmaptests(tests.Modeltests): u'Settings - test - Pagure', output.data) self.assertIn('

Settings for test

', output.data) # Check the result of the action -- None, no CSRF - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') self.assertEqual(repo.milestones, {}) data = { @@ -214,7 +215,7 @@ class PagureFlaskRoadmaptests(tests.Modeltests): self.assertIn(u'

Settings for test

', output.data) self.assertIn(u'Milestones updated', output.data) # Check the result of the action -- Milestones recorded - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') self.assertEqual(repo.milestones, {u'1': u'Tomorrow'}) data = { @@ -231,7 +232,7 @@ class PagureFlaskRoadmaptests(tests.Modeltests): self.assertIn(u'

Settings for test

', output.data) self.assertIn(u'Milestones updated', output.data) # Check the result of the action -- Milestones recorded - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') self.assertEqual( repo.milestones, {u'v1.0': u'Tomorrow', u'v2.0': u''} ) @@ -254,7 +255,7 @@ class PagureFlaskRoadmaptests(tests.Modeltests): ' Milestones and dates are not of the ' 'same length', output.data) # Check the result of the action -- Milestones un-changed - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') self.assertEqual( repo.milestones, {u'v1.0': u'Tomorrow', u'v2.0': u''} ) @@ -277,7 +278,7 @@ class PagureFlaskRoadmaptests(tests.Modeltests): ' Milestone v2.0 is present 2 times', output.data) # Check the result of the action -- Milestones un-changed - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') self.assertEqual( repo.milestones, {u'v1.0': u'Tomorrow', u'v2.0': u''} ) @@ -300,7 +301,7 @@ class PagureFlaskRoadmaptests(tests.Modeltests): ' Date Next week is present 2 times', output.data) # Check the result of the action -- Milestones un-changed - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') self.assertEqual( repo.milestones, {u'v1.0': u'Tomorrow', u'v2.0': u''} ) @@ -363,7 +364,7 @@ class PagureFlaskRoadmaptests(tests.Modeltests): self.assertIn(u'

Settings for test

', output.data) self.assertIn(u'Milestones updated', output.data) # Check the result of the action -- Milestones recorded - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') self.assertEqual(repo.milestones, {u'v1.0': u'', u'v2.0': u''}) @patch('pagure.lib.git.update_git') @@ -464,7 +465,7 @@ class PagureFlaskRoadmaptests(tests.Modeltests): u'Issue set to the milestone: %s\n' % mstone, output.data) - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') # Mark ticket #1 as Fixed for iid in [1, 4]: @@ -528,7 +529,7 @@ class PagureFlaskRoadmaptests(tests.Modeltests): output = self.app.get('/foo/roadmap') self.assertEqual(output.status_code, 404) - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') settings = repo.settings settings['issue_tracker'] = False repo.settings = settings diff --git a/tests/test_pagure_lib.py b/tests/test_pagure_lib.py index c4e3b59..632484d 100644 --- a/tests/test_pagure_lib.py +++ b/tests/test_pagure_lib.py @@ -21,6 +21,7 @@ from mock import patch, MagicMock sys.path.insert(0, os.path.join(os.path.dirname( os.path.abspath(__file__)), '..')) +import pagure import pagure.lib import pagure.lib.model import tests @@ -141,7 +142,7 @@ class PagureLibtests(tests.Modeltests): p_ugt.return_value = True tests.create_projects(self.session) - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') # Before issues = pagure.lib.search_issues(self.session, repo) @@ -162,7 +163,7 @@ class PagureLibtests(tests.Modeltests): ) # Add an extra user to project `foo` - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') msg = pagure.lib.add_user_to_project( session=self.session, project=repo, @@ -225,7 +226,7 @@ class PagureLibtests(tests.Modeltests): self.test_new_issue() - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') issue = pagure.lib.search_issues(self.session, repo, issueid=2) self.assertEqual(repo.open_tickets, 2) @@ -508,7 +509,7 @@ class PagureLibtests(tests.Modeltests): p_ugt.return_value = True self.test_new_issue() - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') issue = pagure.lib.search_issues(self.session, repo, issueid=1) issue_blocked = pagure.lib.search_issues( self.session, repo, issueid=2) @@ -560,7 +561,7 @@ class PagureLibtests(tests.Modeltests): p_ugt.return_value = True self.test_edit_issue() - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') issue = pagure.lib.search_issues(self.session, repo, issueid=1) # Add a tag to the issue @@ -598,7 +599,7 @@ class PagureLibtests(tests.Modeltests): p_ugt.return_value = True self.test_add_tag_obj() - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') issue = pagure.lib.search_issues(self.session, repo, issueid=1) self.assertRaises( pagure.exceptions.PagureException, @@ -626,7 +627,7 @@ class PagureLibtests(tests.Modeltests): p_ugt.return_value = True self.test_add_tag_obj() - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') issue = pagure.lib.search_issues(self.session, repo, issueid=1) msgs = pagure.lib.remove_tags_obj( @@ -682,7 +683,7 @@ class PagureLibtests(tests.Modeltests): p_ugt.return_value = True self.test_add_tag_obj() - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') issue = pagure.lib.search_issues(self.session, repo, issueid=1) self.assertRaises( @@ -774,7 +775,7 @@ class PagureLibtests(tests.Modeltests): p_ugt.return_value = True self.test_edit_issue() - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') # All issues issues = pagure.lib.search_issues(self.session, repo) @@ -847,7 +848,7 @@ class PagureLibtests(tests.Modeltests): p_ugt.return_value = True self.test_new_issue() - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') issue = pagure.lib.search_issues(self.session, repo, issueid=2) # Before @@ -951,7 +952,7 @@ class PagureLibtests(tests.Modeltests): p_ugt.return_value = True self.test_new_issue() - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') # Before issue = pagure.lib.search_issues(self.session, repo, issueid=1) @@ -992,7 +993,7 @@ class PagureLibtests(tests.Modeltests): tests.create_projects(self.session) # Before - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') self.assertEqual(len(repo.users), 0) # Add an user to a project @@ -1015,7 +1016,7 @@ class PagureLibtests(tests.Modeltests): self.assertEqual(msg, 'User added') # After - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') self.assertEqual(len(repo.users), 1) self.assertEqual(repo.users[0].user, 'foo') self.assertEqual(repo.admins[0].user, 'foo') @@ -1123,7 +1124,7 @@ class PagureLibtests(tests.Modeltests): parent_id=None, ) - repo = pagure.lib.get_project(self.session, 'testproject') + repo = pagure.get_authorized_project(self.session, 'testproject') self.assertEqual(repo.path, 'testproject.git') gitrepo = os.path.join(gitfolder, repo.path) @@ -1373,7 +1374,7 @@ class PagureLibtests(tests.Modeltests): tests.create_projects(self.session) # Before - repo = pagure.lib.get_project(self.session, 'test2') + repo = pagure.get_authorized_project(self.session, 'test2') self.assertTrue(repo.settings['issue_tracker']) self.assertFalse(repo.settings['project_documentation']) @@ -1430,7 +1431,7 @@ class PagureLibtests(tests.Modeltests): self.assertEqual(args[1]['topic'], 'project.edit') # After - repo = pagure.lib.get_project(self.session, 'test2') + repo = pagure.get_authorized_project(self.session, 'test2') self.assertFalse(repo.settings['issue_tracker']) self.assertTrue(repo.settings['project_documentation']) self.assertFalse(repo.settings['pull_requests']) @@ -1529,7 +1530,7 @@ class PagureLibtests(tests.Modeltests): """ Test the get_tags_of_project of pagure.lib. """ self.test_add_tag_obj() - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') tags = pagure.lib.get_tags_of_project(self.session, repo) self.assertEqual([tag.tag for tag in tags], ['tag1']) @@ -1538,7 +1539,7 @@ class PagureLibtests(tests.Modeltests): self.session, repo, pattern='T*') self.assertEqual([tag.tag for tag in tags], ['tag1']) - repo = pagure.lib.get_project(self.session, 'test2') + repo = pagure.get_authorized_project(self.session, 'test2') tags = pagure.lib.get_tags_of_project(self.session, repo) self.assertEqual([tag.tag for tag in tags], []) @@ -1679,7 +1680,7 @@ class PagureLibtests(tests.Modeltests): projects = pagure.lib.search_projects(self.session) self.assertEqual(len(projects), 1) - repo = pagure.lib.get_project(self.session, 'testproject') + repo = pagure.get_authorized_project(self.session, 'testproject') gitrepo = os.path.join(gitfolder, repo.path) docrepo = os.path.join(docfolder, repo.path) ticketrepo = os.path.join(ticketfolder, repo.path) @@ -1785,7 +1786,7 @@ class PagureLibtests(tests.Modeltests): # Fork a fork - repo = pagure.lib.get_project( + repo = pagure.get_authorized_project( self.session, 'testproject', user='foo') msg = pagure.lib.fork_project( @@ -1987,7 +1988,7 @@ class PagureLibtests(tests.Modeltests): self.session.add(item) # Add an extra user to project `foo` - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') self.assertEqual(repo.open_requests, 0) msg = pagure.lib.add_user_to_project( @@ -1999,8 +2000,8 @@ class PagureLibtests(tests.Modeltests): self.session.commit() self.assertEqual(msg, 'User added') - repo = pagure.lib.get_project(self.session, 'test') - forked_repo = pagure.lib.get_project( + repo = pagure.get_authorized_project(self.session, 'test') + forked_repo = pagure.get_authorized_project( self.session, 'test', user='pingou') req = pagure.lib.new_pull_request( @@ -2185,7 +2186,7 @@ class PagureLibtests(tests.Modeltests): self.test_new_pull_request() - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') self.assertEqual(repo.open_requests, 1) request = pagure.lib.search_pull_requests(self.session, requestid=1) @@ -2197,7 +2198,7 @@ class PagureLibtests(tests.Modeltests): merged=True, ) self.session.commit() - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') self.assertEqual(repo.open_requests, 0) prs = pagure.lib.search_pull_requests( @@ -2231,7 +2232,7 @@ class PagureLibtests(tests.Modeltests): p_ugt.return_value = True self.test_add_issue_dependency() - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') issue = pagure.lib.search_issues(self.session, repo, issueid=1) issue_blocked = pagure.lib.search_issues( self.session, repo, issueid=2) @@ -2291,7 +2292,7 @@ class PagureLibtests(tests.Modeltests): self.test_add_issue_comment() - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') issue = pagure.lib.search_issues(self.session, repo, issueid=1) self.assertEqual( @@ -2311,7 +2312,7 @@ class PagureLibtests(tests.Modeltests): self.test_new_issue() - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') issue = pagure.lib.search_issues(self.session, repo, issueid=1) self.assertEqual( @@ -2330,7 +2331,7 @@ class PagureLibtests(tests.Modeltests): p_ugt.return_value = True self.test_new_issue() - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') issue = pagure.lib.search_issues(self.session, repo, issueid=1) # before @@ -2378,7 +2379,7 @@ class PagureLibtests(tests.Modeltests): p_ugt.return_value = True self.test_new_issue() - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') issue = pagure.lib.search_issues(self.session, repo, issueid=1) self.assertEqual(repo.open_tickets, 2) @@ -2434,7 +2435,7 @@ class PagureLibtests(tests.Modeltests): p_ugt.return_value = True self.test_new_issue() - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') issue = pagure.lib.search_issues(self.session, repo, issueid=1) # Create issues to play with @@ -3052,7 +3053,7 @@ class PagureLibtests(tests.Modeltests): tests.create_projects(self.session) self.test_add_group() - project = pagure.lib.get_project(self.session, 'test2') + project = pagure.get_authorized_project(self.session, 'test2') # Group does not exist self.assertRaises( @@ -3135,7 +3136,7 @@ class PagureLibtests(tests.Modeltests): """ Test the update_watch_status method of pagure.lib. """ tests.create_projects(self.session) - project = pagure.lib.get_project(self.session, 'test') + project = pagure.get_authorized_project(self.session, 'test') # User does not exist self.assertRaises( @@ -3192,7 +3193,7 @@ class PagureLibtests(tests.Modeltests): tests.create_projects(self.session) self.test_add_group() - project = pagure.lib.get_project(self.session, 'test') + project = pagure.get_authorized_project(self.session, 'test') # If user not logged in watch = pagure.lib.is_watching( diff --git a/tests/test_pagure_lib_git.py b/tests/test_pagure_lib_git.py index ea521e7..0113ee2 100644 --- a/tests/test_pagure_lib_git.py +++ b/tests/test_pagure_lib_git.py @@ -26,6 +26,7 @@ from mock import patch sys.path.insert(0, os.path.join(os.path.dirname( os.path.abspath(__file__)), '..')) +import pagure import pagure.lib.git import tests @@ -54,7 +55,7 @@ class PagureLibGittests(tests.Modeltests): when the new uesr is an made an admin """ tests.create_projects(self.session) - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') # Add an user to a project # The user will be an admin of the project msg = pagure.lib.add_user_to_project( @@ -484,7 +485,7 @@ repo requests/forks/pingou/test3 """ tests.create_projects(self.session) - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') # Add a couple of groups # They would be admins @@ -1317,7 +1318,7 @@ index 9f44358..2a552bb 100644 os.makedirs(self.gitrepo) repo_obj = pygit2.init_repository(self.gitrepo, bare=True) - repo = pagure.lib.get_project(self.session, 'test_ticket_repo') + repo = pagure.get_authorized_project(self.session, 'test_ticket_repo') # Create an issue to play with msg = pagure.lib.new_issue( session=self.session, @@ -1538,7 +1539,7 @@ index 458821a..77674a8 files = [entry.name for entry in commit.tree] self.assertEqual(files, [hash_file]) - repo = pagure.lib.get_project(self.session, 'test_ticket_repo') + repo = pagure.get_authorized_project(self.session, 'test_ticket_repo') issue = pagure.lib.search_issues(self.session, repo, issueid=1) pagure.lib.git.clean_git(issue, repo, self.path) @@ -1567,8 +1568,9 @@ index 458821a..77674a8 os.makedirs(self.gitrepo) repo_obj = pygit2.init_repository(self.gitrepo, bare=True) - repo = pagure.lib.get_project(self.session, 'test_ticket_repo') # Create a PR to play with + repo = pagure.get_authorized_project(self.session, 'test_ticket_repo') + # Create an issue to play with req = pagure.lib.new_pull_request( session=self.session, repo_from=repo, @@ -1848,7 +1850,7 @@ index 0000000..60f7480 """ Test the update_ticket_from_git method from pagure.lib.git. """ tests.create_projects(self.session) - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') # Set some priorities to the project repo.priorities = {'1': 'High', '2': 'Normal'} self.session.add(repo) diff --git a/tests/test_pagure_lib_git_get_tags_objects.py b/tests/test_pagure_lib_git_get_tags_objects.py index 0a964a2..3acf7a5 100644 --- a/tests/test_pagure_lib_git_get_tags_objects.py +++ b/tests/test_pagure_lib_git_get_tags_objects.py @@ -18,6 +18,7 @@ import pygit2 sys.path.insert(0, os.path.join(os.path.dirname( os.path.abspath(__file__)), '..')) +import pagure import pagure.lib.git import tests @@ -89,7 +90,7 @@ class PagureLibGitGetTagstests(tests.Modeltests): self.assertEqual(exp, get_tag_name(tags)) # Case 4 - Sorting with different splitting characters - project = pagure.lib.get_project(self.session, 'test2') + project = pagure.get_authorized_project(self.session, 'test2') tests.add_readme_git_repo(os.path.join(os.path.join( self.path, 'repos'), 'test2.git')) repo = pygit2.Repository(os.path.join(os.path.join( diff --git a/tests/test_pagure_lib_link.py b/tests/test_pagure_lib_link.py index bd8cb22..119775d 100644 --- a/tests/test_pagure_lib_link.py +++ b/tests/test_pagure_lib_link.py @@ -23,6 +23,7 @@ from mock import patch sys.path.insert(0, os.path.join(os.path.dirname( os.path.abspath(__file__)), '..')) +import pagure import pagure.lib.link import tests @@ -66,7 +67,7 @@ class PagureLibLinktests(tests.Modeltests): self.assertEqual(link, []) # Create the issue - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') pagure.lib.new_issue( self.session, repo, @@ -104,7 +105,7 @@ class PagureLibLinktests(tests.Modeltests): self.assertEqual(link, []) # Create the issue - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') pagure.lib.new_issue( self.session, repo, @@ -162,7 +163,7 @@ class PagureLibLinktests(tests.Modeltests): self.assertEqual(link, []) # Create the issue - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') pagure.lib.new_issue( self.session, repo, diff --git a/tests/test_pagure_lib_model.py b/tests/test_pagure_lib_model.py index 9099ead..f2c1b79 100644 --- a/tests/test_pagure_lib_model.py +++ b/tests/test_pagure_lib_model.py @@ -20,6 +20,7 @@ from mock import patch sys.path.insert(0, os.path.join(os.path.dirname( os.path.abspath(__file__)), '..')) +import pagure import pagure.lib import tests @@ -43,7 +44,7 @@ class PagureLibModeltests(tests.Modeltests): p_ugt.return_value = True tests.create_projects(self.session) - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') # Create an issue msg = pagure.lib.new_issue( @@ -82,8 +83,8 @@ class PagureLibModeltests(tests.Modeltests): self.session.commit() self.session.add(item) - repo = pagure.lib.get_project(self.session, 'test') - forked_repo = pagure.lib.get_project( + repo = pagure.get_authorized_project(self.session, 'test') + forked_repo = pagure.get_authorized_project( self.session, 'test', user='pingou') # Create an pull-request @@ -127,7 +128,7 @@ class PagureLibModeltests(tests.Modeltests): def test_tagissue__repr__(self): """ Test the TagIssue.__repr__ function of pagure.lib.model. """ self.test_issue__repr__() - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') issues = pagure.lib.search_issues(self.session, repo) self.assertEqual(len(issues), 1) From 839011899d16393b48fb013b0512f09690bee6a2 Mon Sep 17 00:00:00 2001 From: Farhaan Bukhsh Date: Apr 14 2017 10:32:37 +0000 Subject: [PATCH 53/94] Fix test for private-repo and rename get_project to _get_project The renaming is done on puiterwijk concern for open-points for get_project. This is done so any function or component using it will stop function as it should use get_authorized_project instead. The test for private-repo still has _get_project because getting a user authenticated demands to have an active request which is not possible while testing the component. --- diff --git a/pagure/__init__.py b/pagure/__init__.py index 9b36c4e..4dc2dc3 100644 --- a/pagure/__init__.py +++ b/pagure/__init__.py @@ -379,7 +379,7 @@ def get_authorized_project(session, repo, user=None): if repo is private and user is authorized to view repo object is returned else None """ - repo = pagure.lib.get_project(session, repo, user) + repo = pagure.lib._get_project(session, repo, user) if repo and repo.private and not is_repo_admin(repo): return None diff --git a/tests/test_pagure_flask_api_ui_private_repo.py b/tests/test_pagure_flask_api_ui_private_repo.py index cdadf0e..4a7adec 100644 --- a/tests/test_pagure_flask_api_ui_private_repo.py +++ b/tests/test_pagure_flask_api_ui_private_repo.py @@ -187,7 +187,7 @@ class PagurePrivateRepotest(tests.Modeltests): PagureRepo.push(ori_remote, refname) # Create a PR for these changes - project = pagure.lib.get_project(self.session, 'pmc') + project = pagure.lib._get_project(self.session, 'pmc') req = pagure.lib.new_pull_request( session=self.session, repo_from=project, @@ -343,7 +343,7 @@ class PagurePrivateRepotest(tests.Modeltests): self.assertEqual( output.get_data(as_text=True).count('
'), 3) - repo = pagure.lib.get_project(self.session, 'test3') + repo = pagure.lib._get_project(self.session, 'test3') msg = pagure.lib.add_user_to_project( session=self.session, @@ -434,7 +434,7 @@ class PagurePrivateRepotest(tests.Modeltests): self.session.add(item) self.session.commit() - repo = pagure.lib.get_project(self.session, 'pmc') + repo = pagure.lib._get_project(self.session, 'pmc') msg = pagure.lib.add_user_to_project( session=self.session, @@ -470,7 +470,7 @@ class PagurePrivateRepotest(tests.Modeltests): output.get_data(as_text=True)) self.set_up_git_repo(new_project=None, branch_from='feature') - project = pagure.lib.get_project(self.session, 'pmc') + project = pagure.lib._get_project(self.session, 'pmc') self.assertEqual(len(project.requests), 1) output = self.app.get('/pmc/pull-request/1') @@ -523,7 +523,7 @@ class PagurePrivateRepotest(tests.Modeltests): self.assertEqual(output.status_code, 404) # Create issues to play with - repo = pagure.lib.get_project(self.session, 'test4') + repo = pagure.lib._get_project(self.session, 'test4') msg = pagure.lib.new_issue( session=self.session, repo=repo, @@ -568,7 +568,7 @@ class PagurePrivateRepotest(tests.Modeltests): output = self.app.get('/test4/issue/1') self.assertEqual(output.status_code, 200) - repo = pagure.lib.get_project(self.session, 'test4') + repo = pagure.lib._get_project(self.session, 'test4') msg = pagure.lib.add_user_to_project( session=self.session, @@ -691,7 +691,7 @@ class PagurePrivateRepotest(tests.Modeltests): shutil.rmtree(newpath) # Check before adding - repo = pagure.lib.get_project(self.session, 'test4') + repo = pagure.lib._get_project(self.session, 'test4') self.assertEqual(repo.tags, []) # Adding a tag @@ -701,7 +701,7 @@ class PagurePrivateRepotest(tests.Modeltests): self.assertEqual(output, ['Tag added: infra']) # Check after adding - repo = pagure.lib.get_project(self.session, 'test4') + repo = pagure.lib._get_project(self.session, 'test4') self.assertEqual(len(repo.tags), 1) self.assertEqual(repo.tags_text, ['infra']) @@ -805,8 +805,8 @@ class PagurePrivateRepotest(tests.Modeltests): headers = {'Authorization': 'token aaabbbcccddd'} # Create a pull-request - repo = pagure.lib.get_project(self.session, 'test4') - forked_repo = pagure.lib.get_project(self.session, 'test4') + repo = pagure.lib._get_project(self.session, 'test4') + forked_repo = pagure.lib._get_project(self.session, 'test4') req = pagure.lib.new_pull_request( session=self.session, repo_from=forked_repo, @@ -1008,8 +1008,8 @@ class PagurePrivateRepotest(tests.Modeltests): headers = {'Authorization': 'token aaabbbcccddd'} # Create a pull-request - repo = pagure.lib.get_project(self.session, 'test4') - forked_repo = pagure.lib.get_project(self.session, 'test4') + repo = pagure.lib._get_project(self.session, 'test4') + forked_repo = pagure.lib._get_project(self.session, 'test4') req = pagure.lib.new_pull_request( session=self.session, repo_from=forked_repo, @@ -1144,8 +1144,8 @@ class PagurePrivateRepotest(tests.Modeltests): ) # Create a pull-request - repo = pagure.lib.get_project(self.session, 'test4') - forked_repo = pagure.lib.get_project(self.session, 'test4') + repo = pagure.lib._get_project(self.session, 'test4') + forked_repo = pagure.lib._get_project(self.session, 'test4') req = pagure.lib.new_pull_request( session=self.session, repo_from=forked_repo, @@ -1273,8 +1273,8 @@ class PagurePrivateRepotest(tests.Modeltests): self.session.commit() # Create the pull-request to close - repo = pagure.lib.get_project(self.session, 'test4') - forked_repo = pagure.lib.get_project(self.session, 'test4') + repo = pagure.lib._get_project(self.session, 'test4') + forked_repo = pagure.lib._get_project(self.session, 'test4') req = pagure.lib.new_pull_request( session=self.session, repo_from=forked_repo, @@ -1407,8 +1407,8 @@ class PagurePrivateRepotest(tests.Modeltests): self.session.commit() # Create the pull-request to close - repo = pagure.lib.get_project(self.session, 'test4') - forked_repo = pagure.lib.get_project(self.session, 'test4') + repo = pagure.lib._get_project(self.session, 'test4') + forked_repo = pagure.lib._get_project(self.session, 'test4') req = pagure.lib.new_pull_request( session=self.session, repo_from=forked_repo, @@ -1671,7 +1671,7 @@ class PagurePrivateRepotest(tests.Modeltests): ) # Create private issue - repo = pagure.lib.get_project(self.session, 'test4') + repo = pagure.lib._get_project(self.session, 'test4') msg = pagure.lib.new_issue( session=self.session, repo=repo, @@ -2072,7 +2072,7 @@ class PagurePrivateRepotest(tests.Modeltests): ) # Create normal issue - repo = pagure.lib.get_project(self.session, 'test4') + repo = pagure.lib._get_project(self.session, 'test4') msg = pagure.lib.new_issue( session=self.session, repo=repo, @@ -2086,7 +2086,7 @@ class PagurePrivateRepotest(tests.Modeltests): self.assertEqual(msg.title, 'Test issue #1') # Check status before - repo = pagure.lib.get_project(self.session, 'test4') + repo = pagure.lib._get_project(self.session, 'test4') issue = pagure.lib.search_issues(self.session, repo, issueid=1) self.assertEqual(issue.status, 'Open') @@ -2110,7 +2110,7 @@ class PagurePrivateRepotest(tests.Modeltests): ) # No change - repo = pagure.lib.get_project(self.session, 'test4') + repo = pagure.lib._get_project(self.session, 'test4') issue = pagure.lib.search_issues(self.session, repo, issueid=1) self.assertEqual(issue.status, 'Open') @@ -2129,7 +2129,7 @@ class PagurePrivateRepotest(tests.Modeltests): ) # No change - repo = pagure.lib.get_project(self.session, 'test4') + repo = pagure.lib._get_project(self.session, 'test4') issue = pagure.lib.search_issues(self.session, repo, issueid=1) self.assertEqual(issue.status, 'Open') @@ -2208,7 +2208,7 @@ class PagurePrivateRepotest(tests.Modeltests): ) # Create normal issue - repo = pagure.lib.get_project(self.session, 'test4') + repo = pagure.lib._get_project(self.session, 'test4') msg = pagure.lib.new_issue( session=self.session, repo=repo, @@ -2223,7 +2223,7 @@ class PagurePrivateRepotest(tests.Modeltests): self.assertEqual(msg.title, 'Test issue #1') # Check comments before - repo = pagure.lib.get_project(self.session, 'test4') + repo = pagure.lib._get_project(self.session, 'test4') issue = pagure.lib.search_issues(self.session, repo, issueid=1) self.assertEqual(len(issue.comments), 0) @@ -2245,7 +2245,7 @@ class PagurePrivateRepotest(tests.Modeltests): ) # No change - repo = pagure.lib.get_project(self.session, 'test4') + repo = pagure.lib._get_project(self.session, 'test4') issue = pagure.lib.search_issues(self.session, repo, issueid=1) self.assertEqual(issue.status, 'Open') @@ -2264,7 +2264,7 @@ class PagurePrivateRepotest(tests.Modeltests): ) # One comment added - repo = pagure.lib.get_project(self.session, 'test4') + repo = pagure.lib._get_project(self.session, 'test4') issue = pagure.lib.search_issues(self.session, repo, issueid=1) self.assertEqual(len(issue.comments), 1) From 0d09a6f22687ebf81fba3e9ec702eb58f5952634 Mon Sep 17 00:00:00 2001 From: Farhaan Bukhsh Date: Apr 14 2017 10:32:37 +0000 Subject: [PATCH 54/94] Fix _get_project where it is required --- diff --git a/pagure/lib/__init__.py b/pagure/lib/__init__.py index a92a7c7..be8b5d9 100644 --- a/pagure/lib/__init__.py +++ b/pagure/lib/__init__.py @@ -3645,6 +3645,7 @@ def is_watching(session, user, reponame, repouser=None, namespace=None): project = pagure.lib.get_project( session, reponame, user=repouser, namespace=namespace) + if not project: return False From f47b3bbfbff154c70ff3099d579281354d57d7df Mon Sep 17 00:00:00 2001 From: Farhaan Bukhsh Date: Apr 14 2017 10:32:37 +0000 Subject: [PATCH 55/94] Fix fedmsg and redis leaking private-repo info --- diff --git a/pagure/lib/__init__.py b/pagure/lib/__init__.py index be8b5d9..ba2ec21 100644 --- a/pagure/lib/__init__.py +++ b/pagure/lib/__init__.py @@ -140,7 +140,6 @@ def get_next_id(session, projectid): def search_user(session, username=None, email=None, token=None, pattern=None): ''' Searches the database for the user or users matching the given - criterias. :arg session: the session to use to connect to the database. :kwarg username: the username of the user to look for. @@ -327,7 +326,7 @@ def add_issue_comment(session, issue, comment, user, ticketfolder, if notify: pagure.lib.notify.notify_new_comment(issue_comment, user=user_obj) - if not issue.private: + if not issue.private and not issue.project.private: pagure.lib.notify.log( issue.project, topic='issue.comment.added', @@ -421,7 +420,7 @@ def add_tag_obj(session, obj, tags, user, ticketfolder): pagure.lib.git.update_git( obj, repo=obj.project, repofolder=ticketfolder) - if not obj.private: + if not obj.private and not obj.project.private: pagure.lib.notify.log( obj.project, topic='issue.tag.added', @@ -435,7 +434,7 @@ def add_tag_obj(session, obj, tags, user, ticketfolder): ) # Send notification for the event-source server - if REDIS: + if REDIS and not obj.project.private: REDIS.publish('pagure.%s' % obj.uid, json.dumps( {'added_tags': added_tags})) @@ -463,7 +462,7 @@ def add_issue_assignee(session, issue, assignee, user, ticketfolder, if notify: pagure.lib.notify.notify_assigned_issue(issue, None, user_obj) - if not issue.private: + if not issue.private and not issue.project.private: pagure.lib.notify.log( issue.project, topic='issue.assigned.reset', @@ -476,7 +475,7 @@ def add_issue_assignee(session, issue, assignee, user, ticketfolder, ) # Send notification for the event-source server - if REDIS: + if REDIS and not issue.project.private: REDIS.publish('pagure.%s' % issue.uid, json.dumps( {'unassigned': '-'})) @@ -499,7 +498,7 @@ def add_issue_assignee(session, issue, assignee, user, ticketfolder, pagure.lib.notify.notify_assigned_issue( issue, assignee_obj, user_obj) - if not issue.private: + if not issue.private and not issue.project.private: pagure.lib.notify.log( issue.project, topic='issue.assigned.added', @@ -513,7 +512,7 @@ def add_issue_assignee(session, issue, assignee, user, ticketfolder, issue.last_updated = datetime.datetime.utcnow() # Send notification for the event-source server - if REDIS: + if REDIS and not issue.project.private: REDIS.publish('pagure.%s' % issue.uid, json.dumps( {'assigned': assignee_obj.to_json(public=True)})) @@ -538,16 +537,18 @@ def add_pull_request_assignee( request, repo=request.project, repofolder=requestfolder) pagure.lib.notify.notify_assigned_request(request, None, user_obj) - pagure.lib.notify.log( - request.project, - topic='request.assigned.reset', - msg=dict( - request=request.to_json(public=True), - project=request.project.to_json(public=True), - agent=user_obj.username, - ), - redis=REDIS, - ) + + if not request.project.private: + pagure.lib.notify.log( + request.project, + topic='request.assigned.reset', + msg=dict( + request=request.to_json(public=True), + project=request.project.to_json(public=True), + agent=user_obj.username, + ), + redis=REDIS, + ) return 'Request reset' elif assignee is None and request.assignee is None: @@ -567,16 +568,17 @@ def add_pull_request_assignee( pagure.lib.notify.notify_assigned_request( request, assignee_obj, user_obj) - pagure.lib.notify.log( - request.project, - topic='request.assigned.added', - msg=dict( - request=request.to_json(public=True), - project=request.project.to_json(public=True), - agent=user_obj.username, - ), - redis=REDIS, - ) + if not request.project.private: + pagure.lib.notify.log( + request.project, + topic='request.assigned.added', + msg=dict( + request=request.to_json(public=True), + project=request.project.to_json(public=True), + agent=user_obj.username, + ), + redis=REDIS, + ) return 'Request assigned' @@ -609,6 +611,8 @@ def add_issue_dependency( repofolder=ticketfolder) if not issue.private: + #pagure.lib.notify.notify_assigned_issue(issue, user_obj) + #pagure.lib.notify.notify_assigned_issue(issue_blocked, user_obj) pagure.lib.notify.log( issue.project, topic='issue.dependency.added', @@ -622,7 +626,7 @@ def add_issue_dependency( ) # Send notification for the event-source server - if REDIS: + if REDIS and not issue.project.private: REDIS.publish('pagure.%s' % issue.uid, json.dumps({ 'added_dependency': issue_blocked.id, 'issue_uid': issue.uid, @@ -666,6 +670,8 @@ def remove_issue_dependency( repofolder=ticketfolder) if not issue.private: + #pagure.lib.notify.notify_assigned_issue(issue, user_obj) + #pagure.lib.notify.notify_assigned_issue(issue_blocked, user_obj) pagure.lib.notify.log( issue.project, topic='issue.dependency.removed', @@ -679,7 +685,7 @@ def remove_issue_dependency( ) # Send notification for the event-source server - if REDIS: + if REDIS and not issue.project.private: REDIS.publish('pagure.%s' % issue.uid, json.dumps({ 'removed_dependency': parent_del, 'issue_uid': issue.uid, @@ -767,20 +773,21 @@ def remove_tags_obj(session, obj, tags, ticketfolder, user): pagure.lib.git.update_git( obj, repo=obj.project, repofolder=ticketfolder) - pagure.lib.notify.log( - obj.project, - topic='issue.tag.removed', - msg=dict( - issue=obj.to_json(public=True), - project=obj.project.to_json(public=True), - tags=removed_tags, - agent=user_obj.username, - ), - redis=REDIS, - ) + if not obj.project.private: + pagure.lib.notify.log( + obj.project, + topic='issue.tag.removed', + msg=dict( + issue=obj.to_json(public=True), + project=obj.project.to_json(public=True), + tags=removed_tags, + agent=user_obj.username, + ), + redis=REDIS, + ) # Send notification for the event-source server - if REDIS: + if REDIS and not obj.project.private: REDIS.publish('pagure.%s' % obj.uid, json.dumps( {'removed_tags': removed_tags})) @@ -870,6 +877,7 @@ def edit_issue_tags( ), redis=REDIS, ) + msgs.append('Edited tag: %s to %s' % (old_tag, new_tag)) return msgs @@ -1103,8 +1111,10 @@ def add_pull_request_comment(session, request, commit, tree_id, filename, pagure.lib.notify.notify_pull_request_comment(pr_comment, user_obj) # Send notification for the event-source server - if REDIS: - comment_text = text2markdown(pr_comment.comment) + if REDIS and not request.project.private: + comment_text = pr_comment.comment + if not notification: + comment_text = text2markdown(pr_comment.comment) REDIS.publish('pagure.%s' % request.uid, json.dumps({ 'request_id': request.id, @@ -1130,15 +1140,16 @@ def add_pull_request_comment(session, request, commit, tree_id, filename, 'pr': request.to_json(public=True, with_comments=False) })) - pagure.lib.notify.log( - request.project, - topic='pull-request.comment.added', - msg=dict( - pullrequest=request.to_json(public=True), - agent=user_obj.username, - ), - redis=REDIS, - ) + if not request.project.private: + pagure.lib.notify.log( + request.project, + topic='pull-request.comment.added', + msg=dict( + pullrequest=request.to_json(public=True), + agent=user_obj.username, + ), + redis=REDIS, + ) if trigger_ci and comment.strip().lower() in trigger_ci: # Send notification to the CI server @@ -1195,7 +1206,7 @@ def edit_comment(session, parent, comment, user, redis=REDIS, ) - if REDIS: + if REDIS and not parent.project.private: if private: REDIS.publish('pagure.%s' % comment.parent.uid, json.dumps({ 'comment_updated': 'private', @@ -1247,16 +1258,17 @@ def add_pull_request_flag(session, request, username, percent, comment, url, pagure.lib.git.update_git( request, repo=request.project, repofolder=requestfolder) - pagure.lib.notify.log( - request.project, - topic='pull-request.flag.%s' % action, - msg=dict( - pullrequest=request.to_json(public=True), - flag=pr_flag.to_json(public=True), - agent=user_obj.username, - ), - redis=REDIS, - ) + if not request.project.private: + pagure.lib.notify.log( + request.project, + topic='pull-request.flag.%s' % action, + msg=dict( + pullrequest=request.to_json(public=True), + flag=pr_flag.to_json(public=True), + agent=user_obj.username, + ), + redis=REDIS, + ) return 'Flag %s' % action @@ -1419,14 +1431,15 @@ def new_project(session, user, name, blacklist, allowed_prefix, log_action(session, 'created', project, user_obj) - pagure.lib.notify.log( - project, - topic='project.new', - msg=dict( - project=project.to_json(public=True), - agent=user_obj.username, - ), - ) + if not project.private: + pagure.lib.notify.log( + project, + topic='project.new', + msg=dict( + project=project.to_json(public=True), + agent=user_obj.username, + ), + ) return 'Project "%s" created' % ( '%s/%s' % (project.namespace, project.name) if project.namespace @@ -1481,7 +1494,7 @@ def new_issue(session, repo, title, content, user, ticketfolder, issue_id=None, if notify: pagure.lib.notify.notify_new_issue(issue, user=user_obj) - if not private: + if not private and not issue.project.private: pagure.lib.notify.log( issue.project, topic='issue.new', @@ -1509,7 +1522,7 @@ def drop_issue(session, issue, user, ticketfolder): pagure.lib.git.clean_git( issue, repo=issue.project, repofolder=ticketfolder) - if not private: + if not private and not issue.project.private: pagure.lib.notify.log( issue.project, topic='issue.drop', @@ -1568,15 +1581,16 @@ def new_pull_request(session, branch_from, if notify: pagure.lib.notify.notify_new_pull_request(request) - pagure.lib.notify.log( - request.project, - topic='pull-request.new', - msg=dict( - pullrequest=request.to_json(public=True), - agent=user_obj.username, - ), - redis=REDIS, - ) + if not request.project.private: + pagure.lib.notify.log( + request.project, + topic='pull-request.new', + msg=dict( + pullrequest=request.to_json(public=True), + agent=user_obj.username, + ), + redis=REDIS, + ) # Send notification to the CI server if REDIS and request.project.ci_hook and PAGURE_CI: @@ -1689,7 +1703,7 @@ def edit_issue(session, issue, ticketfolder, user, repo=None, log_action(session, status.lower(), issue, user_obj) pagure.lib.notify.notify_status_change_issue(issue, user_obj) - if not issue.private and edit: + if not issue.private and edit and not issue.project.private: pagure.lib.notify.log( issue.project, topic='issue.edit', @@ -1702,7 +1716,7 @@ def edit_issue(session, issue, ticketfolder, user, repo=None, redis=REDIS, ) - if REDIS and edit: + if REDIS and edit and not issue.project.private: if issue.private: REDIS.publish('pagure.%s' % issue.uid, json.dumps({ 'issue': 'private', @@ -1762,16 +1776,18 @@ def update_project_settings(session, repo, settings, user): repo.settings = new_settings session.add(repo) session.flush() - pagure.lib.notify.log( - repo, - topic='project.edit', - msg=dict( - project=repo.to_json(public=True), - fields=update, - agent=user_obj.username, - ), - redis=REDIS, - ) + + if not repo.private: + pagure.lib.notify.log( + repo, + topic='project.edit', + msg=dict( + project=repo.to_json(public=True), + fields=update, + agent=user_obj.username, + ), + redis=REDIS, + ) return 'Edited successfully settings of repo: %s' % repo.fullname @@ -1882,14 +1898,15 @@ def fork_project(session, user, repo, gitfolder, requestrepo, bare=True, mode=pygit2.C.GIT_REPOSITORY_INIT_SHARED_GROUP) - pagure.lib.notify.log( - project, - topic='project.forked', - msg=dict( - project=project.to_json(public=True), - agent=user_obj.username, - ), - ) + if not project.private: + pagure.lib.notify.log( + project, + topic='project.forked', + msg=dict( + project=project.to_json(public=True), + agent=user_obj.username, + ), + ) return 'Repo "{0}" cloned to "{1}/{0}"'.format( '%s/%s' % (repo.namespace, repo.name) if repo.namespace else repo.name, @@ -2573,16 +2590,17 @@ def close_pull_request(session, request, user, requestfolder, merged=True): notify=False, notification=True ) - pagure.lib.notify.log( - request.project, - topic='pull-request.closed', - msg=dict( - pullrequest=request.to_json(public=True), - merged=merged, - agent=user_obj.username, - ), - redis=REDIS, - ) + if not request.project.private: + pagure.lib.notify.log( + request.project, + topic='pull-request.closed', + msg=dict( + pullrequest=request.to_json(public=True), + merged=merged, + agent=user_obj.username, + ), + redis=REDIS, + ) def reset_status_pull_request(session, project): From 6ee1b8e7eec1266e44bdae11328e878e7bec2107 Mon Sep 17 00:00:00 2001 From: Farhaan Bukhsh Date: Apr 14 2017 10:32:37 +0000 Subject: [PATCH 56/94] Add conf key to turn private-repo on and off Conf key is added to pagure to turn private project on and off. --- diff --git a/pagure/default_config.py b/pagure/default_config.py index d3c3e48..3456480 100644 --- a/pagure/default_config.py +++ b/pagure/default_config.py @@ -60,6 +60,9 @@ ENABLE_USER_MNGT = True # Enables / Disables managing groups via the UI ENABLE_GROUP_MNGT = True +# Enables / Disables private projects +PRIVATE_PROJECTS = False + # Enables / Disables showing all the projects by default on the front page SHOW_PROJECTS_INDEX = ['repos', 'myrepos', 'myforks'] diff --git a/pagure/templates/new_project.html b/pagure/templates/new_project.html index b141ac9..bf22010 100644 --- a/pagure/templates/new_project.html +++ b/pagure/templates/new_project.html @@ -20,7 +20,9 @@ {{ render_bootstrap_field(form.namespace, field_description="namespace of the project") }} {{ render_bootstrap_field(form.url, field_description="url of the project's website") }} {{ render_bootstrap_field(form.avatar_email, field_description="libravatar email address avatar email") }} - {{ render_bootstrap_field(form.private, field_description="To mark the repo private") }} + {% if config.get('PRIVATE_PROJECTS', False) %} + {{ render_bootstrap_field(form.private, field_description="To mark the repo private") }} + {% endif %} {{ render_bootstrap_field(form.create_readme, field_description="Create a README file automatically") }} Date: Apr 14 2017 10:32:37 +0000 Subject: [PATCH 57/94] Fix test after the addition of conf key --- diff --git a/tests/test_pagure_flask_api_ui_private_repo.py b/tests/test_pagure_flask_api_ui_private_repo.py index 4a7adec..4d75702 100644 --- a/tests/test_pagure_flask_api_ui_private_repo.py +++ b/tests/test_pagure_flask_api_ui_private_repo.py @@ -31,6 +31,7 @@ class PagurePrivateRepotest(tests.Modeltests): pagure.APP.config['TESTING'] = True pagure.APP.config['DATAGREPPER_URL'] = None + pagure.APP.config['PRIVATE_PROJECTS'] = True pagure.SESSION = self.session pagure.lib.SESSION = self.session pagure.ui.SESSION = self.session From da9b2019340317ee603416d4c74ecdcfde21d720 Mon Sep 17 00:00:00 2001 From: Farhaan Bukhsh Date: Apr 14 2017 10:32:37 +0000 Subject: [PATCH 58/94] Disable pagure ci for private repo --- diff --git a/pagure/lib/__init__.py b/pagure/lib/__init__.py index ba2ec21..f7770a9 100644 --- a/pagure/lib/__init__.py +++ b/pagure/lib/__init__.py @@ -1132,9 +1132,10 @@ def add_pull_request_comment(session, request, commit, tree_id, filename, })) # Send notification to the CI server, if the comment added was a - # notification and the PR is still open + # notification and the PR is still open and project is not private if notification and request.status == 'Open' \ - and request.project.ci_hook and PAGURE_CI: + and request.project.ci_hook and PAGURE_CI \ + and not request.project.private: REDIS.publish('pagure.ci', json.dumps({ 'ci_type': request.project.ci_hook.ci_type, 'pr': request.to_json(public=True, with_comments=False) @@ -1593,7 +1594,8 @@ def new_pull_request(session, branch_from, ) # Send notification to the CI server - if REDIS and request.project.ci_hook and PAGURE_CI: + if REDIS and request.project.ci_hook and PAGURE_CI \ + and not request.project.private: REDIS.publish('pagure.ci', json.dumps({ 'ci_type': request.project.ci_hook.ci_type, 'pr': request.to_json(public=True, with_comments=False) diff --git a/pagure/ui/plugins.py b/pagure/ui/plugins.py index 48bfc64..cba8fb5 100644 --- a/pagure/ui/plugins.py +++ b/pagure/ui/plugins.py @@ -73,6 +73,9 @@ def view_plugin(repo, plugin, username=None, namespace=None, full=True): 403, 'You are not allowed to change the settings for this project') + if repo.private: + APP.config.get('DISABLED_PLUGINS', []).append('Pagure CI') + if plugin in APP.config.get('DISABLED_PLUGINS', []): flask.abort(404, 'Plugin disabled') From 59481258992459da2539d2e13db5c357ccfd6f46 Mon Sep 17 00:00:00 2001 From: Farhaan Bukhsh Date: Apr 14 2017 10:32:37 +0000 Subject: [PATCH 59/94] Fix overwriting conf file --- diff --git a/pagure/ui/plugins.py b/pagure/ui/plugins.py index cba8fb5..6f79b0d 100644 --- a/pagure/ui/plugins.py +++ b/pagure/ui/plugins.py @@ -5,6 +5,7 @@ Authors: Pierre-Yves Chibon + Farhaan Bukhsh """ @@ -73,8 +74,8 @@ def view_plugin(repo, plugin, username=None, namespace=None, full=True): 403, 'You are not allowed to change the settings for this project') - if repo.private: - APP.config.get('DISABLED_PLUGINS', []).append('Pagure CI') + if repo.private and plugin == 'Pagure CI': + flask.abort(404, 'Plugin disabled') if plugin in APP.config.get('DISABLED_PLUGINS', []): flask.abort(404, 'Plugin disabled') From f69aa2c30f63ac00a8ab4da5539239a3cce4555d Mon Sep 17 00:00:00 2001 From: Farhaan Bukhsh Date: Apr 14 2017 10:32:37 +0000 Subject: [PATCH 60/94] Fix get_authorized_project The introduction of 'namespace' parameter change the behaviour of get_project function and get_project is used in get_authorized_project to filter project according to ownership. --- diff --git a/pagure/__init__.py b/pagure/__init__.py index 4dc2dc3..ab977d1 100644 --- a/pagure/__init__.py +++ b/pagure/__init__.py @@ -374,12 +374,12 @@ def is_repo_user(repo_obj): ) or (user in usergrps) -def get_authorized_project(session, repo, user=None): +def get_authorized_project(session, repo, user=None, namespace=None): """ Return repo object if repo is public, if repo is private and user is authorized to view repo object is returned else None """ - repo = pagure.lib._get_project(session, repo, user) + repo = pagure.lib._get_project(session, repo, user, namespace) if repo and repo.private and not is_repo_admin(repo): return None @@ -489,12 +489,11 @@ def set_variables(): # If there isn't a `repo` in the URL path, or if there is but the # endpoint called is part of the API, just don't do anything if repo: - flask.g.repo = pagure.lib.get_project( + flask.g.repo = pagure.get_authorized_project( SESSION, repo, user=username, namespace=namespace) if authenticated(): - flask.g.repo_forked = pagure.lib.get_project( - SESSION, repo, user=flask.g.fas_user.username, - namespace=namespace) + flask.g.repo_forked = pagure.lib._get_project(SESSION, repo, user=flask.g.fas_user.username, + namespace=namespace) if not flask.g.repo \ and APP.config.get('OLD_VIEW_COMMIT_ENABLED', False) \ From d59b42b3b91648a7590dbbae797e617c1f22fa28 Mon Sep 17 00:00:00 2001 From: Farhaan Bukhsh Date: Apr 14 2017 10:32:37 +0000 Subject: [PATCH 61/94] Fix test for pushing to non-bare repo in private repo Introducing the new VIRUS_SCAN conf and also the new way of writing test in pagure, things were leading to 'not able to push to non-bare repo' these changes are fix those error in the tests. Also changing of get_project to _get_project --- diff --git a/tests/test_pagure_flask_api_ui_private_repo.py b/tests/test_pagure_flask_api_ui_private_repo.py index 4d75702..dc0a200 100644 --- a/tests/test_pagure_flask_api_ui_private_repo.py +++ b/tests/test_pagure_flask_api_ui_private_repo.py @@ -45,15 +45,18 @@ class PagurePrivateRepotest(tests.Modeltests): pagure.api.fork.SESSION = self.session pagure.api.issue.SESSION = self.session - pagure.APP.config['GIT_FOLDER'] = os.path.join(tests.HERE, 'repos') + pagure.APP.config['VIRUS_SCAN_ATTACHMENTS'] = False + pagure.APP.config['GIT_FOLDER'] = self.path pagure.APP.config['FORK_FOLDER'] = os.path.join( - tests.HERE, 'forks') + self.path, 'forks') + pagure.APP.config['REQUESTS_FOLDER'] = os.path.join( + self.path, 'requests') pagure.APP.config['TICKETS_FOLDER'] = os.path.join( - tests.HERE, 'tickets') + self.path, 'tickets') pagure.APP.config['DOCS_FOLDER'] = os.path.join( - tests.HERE, 'docs') - pagure.APP.config['REQUESTS_FOLDER'] = os.path.join( - tests.HERE, 'requests') + self.path, 'docs') + pagure.APP.config['UPLOAD_FOLDER_PATH'] = os.path.join( + self.path, 'releases') self.app = pagure.APP.test_client() def set_up_git_repo( @@ -63,7 +66,7 @@ class PagurePrivateRepotest(tests.Modeltests): """ # Create a git repo to play with - gitrepo = os.path.join(tests.HERE, 'repos', 'pmc.git') + gitrepo = os.path.join(self.path, 'repos', 'pmc.git') repo = pygit2.init_repository(gitrepo, bare=True) newpath = tempfile.mkdtemp(prefix='pagure-private-test') @@ -611,7 +614,7 @@ class PagurePrivateRepotest(tests.Modeltests): self.session.commit() # Create a git repo to play with - gitrepo = os.path.join(tests.HERE, 'repos', 'test4.git') + gitrepo = os.path.join(self.path, 'repos', 'test4.git') repo = pygit2.init_repository(gitrepo, bare=True) newpath = tempfile.mkdtemp(prefix='pagure-fork-test') From 32abf99abe87b71e27eb2dcd5084fd4933f9a612 Mon Sep 17 00:00:00 2001 From: Farhaan Bukhsh Date: Apr 14 2017 10:32:37 +0000 Subject: [PATCH 62/94] Fix test for private repo in api/issue Use of get_project instead of get_authorized project was creating this issue, fixing the above change fixed the tests as well. --- diff --git a/pagure/api/issue.py b/pagure/api/issue.py index 5a49842..89708fb 100644 --- a/pagure/api/issue.py +++ b/pagure/api/issue.py @@ -34,7 +34,7 @@ def _get_repo(repo_name, username=None, namespace=None): :raises pagure.exceptions.APIError: when repository doesn't exists or is disabled :return: repository name """ - repo = pagure.lib.get_project( + repo = pagure.get_authorized_project( SESSION, repo_name, user=username, namespace=namespace) if repo is None: From 83f8bcbecbca3f8708395d8cd1ee85dacceca456 Mon Sep 17 00:00:00 2001 From: Farhaan Bukhsh Date: Apr 14 2017 10:32:37 +0000 Subject: [PATCH 63/94] Change of get_project to _get_project --- diff --git a/pagure/api/ci/jenkins.py b/pagure/api/ci/jenkins.py index 5cc0c87..1309bf6 100644 --- a/pagure/api/ci/jenkins.py +++ b/pagure/api/ci/jenkins.py @@ -44,7 +44,7 @@ def jenkins_ci_notification( """ - project = pagure.lib.get_project( + project = pagure.lib._get_project( SESSION, repo, user=username, namespace=namespace) if not project: raise pagure.exceptions.APIError(404, error_code=APIERROR.ENOPROJECT) diff --git a/pagure/api/fork.py b/pagure/api/fork.py index 0d450cd..c009e8a 100644 --- a/pagure/api/fork.py +++ b/pagure/api/fork.py @@ -123,8 +123,7 @@ def api_pull_request_views(repo, username=None, namespace=None): """ - repo = pagure.lib.get_project( - SESSION, repo, user=username, namespace=namespace) + repo = pagure.get_authorized_project(SESSION, repo, user=username, namespace=namespace) if repo is None: raise pagure.exceptions.APIError(404, error_code=APIERROR.ENOPROJECT) @@ -249,8 +248,7 @@ def api_pull_request_view(repo, requestid, username=None, namespace=None): """ - repo = pagure.lib.get_project( - SESSION, repo, user=username, namespace=namespace) + repo = pagure.get_authorized_project(SESSION, repo, user=username, namespace=namespace) if repo is None: raise pagure.exceptions.APIError(404, error_code=APIERROR.ENOPROJECT) @@ -308,8 +306,7 @@ def api_pull_request_merge(repo, requestid, username=None, namespace=None): """ # noqa output = {} - repo = pagure.lib.get_project( - SESSION, repo, user=username, namespace=namespace) + repo = pagure.get_authorized_project(SESSION, repo, user=username, namespace=namespace) if repo is None: raise pagure.exceptions.APIError(404, error_code=APIERROR.ENOPROJECT) @@ -395,8 +392,7 @@ def api_pull_request_close(repo, requestid, username=None, namespace=None): """ # noqa output = {} - repo = pagure.lib.get_project( - SESSION, repo, user=username, namespace=namespace) + repo = pagure.get_authorized_project(SESSION, repo, user=username, namespace=namespace) if repo is None: raise pagure.exceptions.APIError(404, error_code=APIERROR.ENOPROJECT) @@ -498,8 +494,7 @@ def api_pull_request_add_comment( } """ # noqa - repo = pagure.lib.get_project( - SESSION, repo, user=username, namespace=namespace) + repo = pagure.get_authorized_project(SESSION, repo, user=username, namespace=namespace) output = {} @@ -642,8 +637,7 @@ def api_pull_request_add_flag(repo, requestid, username=None, namespace=None): } """ # noqa - repo = pagure.lib.get_project( - SESSION, repo, user=username, namespace=namespace) + repo = pagure.get_authorized_project(SESSION, repo, user=username, namespace=namespace) output = {} diff --git a/pagure/api/project.py b/pagure/api/project.py index 52d993a..9c794a7 100644 --- a/pagure/api/project.py +++ b/pagure/api/project.py @@ -51,8 +51,7 @@ def api_git_tags(repo, username=None, namespace=None): } """ - repo = pagure.lib.get_project( - SESSION, repo, user=username, namespace=namespace) + repo = pagure.lib._get_project(SESSION, repo, user=username, namespace=namespace) if repo is None: raise pagure.exceptions.APIError(404, error_code=APIERROR.ENOPROJECT) @@ -393,8 +392,7 @@ def api_fork_project(): username = form.username.data or None namespace = form.namespace.data.strip() or None - repo = pagure.lib.get_project( - SESSION, repo, user=username, namespace=namespace) + repo = pagure.lib._get_project(SESSION, repo, user=username, namespace=namespace) if repo is None: raise pagure.exceptions.APIError( 404, error_code=APIERROR.ENOPROJECT) diff --git a/pagure/hooks/files/default_hook.py b/pagure/hooks/files/default_hook.py index 33f3c8b..a91f755 100755 --- a/pagure/hooks/files/default_hook.py +++ b/pagure/hooks/files/default_hook.py @@ -38,8 +38,7 @@ def run_as_post_receive_hook(): print('user:', username) print('namespace:', namespace) - project = pagure.lib.get_project( - pagure.SESSION, repo, user=username, namespace=namespace) + project = pagure.lib._get_project(pagure.SESSION, repo, user=username, namespace=namespace) for line in sys.stdin: if pagure.APP.config.get('HOOK_DEBUG', False): diff --git a/pagure/hooks/files/fedmsg_hook.py b/pagure/hooks/files/fedmsg_hook.py index 0497b51..44aa754 100755 --- a/pagure/hooks/files/fedmsg_hook.py +++ b/pagure/hooks/files/fedmsg_hook.py @@ -55,7 +55,7 @@ for line in sys.stdin.readlines(): project_name = pagure.lib.git.get_repo_name(abspath) username = pagure.lib.git.get_username(abspath) namespace = pagure.lib.git.get_repo_namespace(abspath) - project = pagure.lib.get_project( + project = pagure.lib._get_project( pagure.SESSION, project_name, username, namespace=namespace) if not project: project = project_name diff --git a/pagure/hooks/files/pagure_force_commit_hook.py b/pagure/hooks/files/pagure_force_commit_hook.py index dd57bfb..6377340 100755 --- a/pagure/hooks/files/pagure_force_commit_hook.py +++ b/pagure/hooks/files/pagure_force_commit_hook.py @@ -33,8 +33,7 @@ def run_as_pre_receive_hook(): print 'user: ', username print 'namspaces:', namespace - repo = pagure.lib.get_project( - pagure.SESSION, reponame, user=username, namespace=namespace) + repo = pagure.lib._get_project(pagure.SESSION, reponame, user=username, namespace=namespace) if not repo: print 'Unknown repo %s of username: %s in namespace %s' % ( reponame, username, namespace) diff --git a/pagure/hooks/files/rtd_hook.py b/pagure/hooks/files/rtd_hook.py index 163aa69..7554e03 100755 --- a/pagure/hooks/files/rtd_hook.py +++ b/pagure/hooks/files/rtd_hook.py @@ -35,8 +35,7 @@ def run_as_post_receive_hook(): print 'user: ', username print 'namespace:', namespace - repo = pagure.lib.get_project( - pagure.SESSION, reponame, user=username, namespace=namespace) + repo = pagure.lib._get_project(pagure.SESSION, reponame, user=username, namespace=namespace) if not repo: print 'Unknown repo %s of username: %s' % (reponame, username) sys.exit(1) diff --git a/pagure/lib/__init__.py b/pagure/lib/__init__.py index f7770a9..3b3d323 100644 --- a/pagure/lib/__init__.py +++ b/pagure/lib/__init__.py @@ -2088,7 +2088,7 @@ def search_projects( return query.all() -def get_project(session, name, user=None, namespace=None): +def _get_project(session, name, user=None, namespace=None): '''Get a project from the database ''' query = session.query( @@ -3663,7 +3663,7 @@ def is_watching(session, user, reponame, repouser=None, namespace=None): if watcher: return watcher.watch - project = pagure.lib.get_project( + project = pagure.lib._get_project( session, reponame, user=repouser, namespace=namespace) if not project: diff --git a/pagure/lib/git.py b/pagure/lib/git.py index 4172180..da53627 100644 --- a/pagure/lib/git.py +++ b/pagure/lib/git.py @@ -411,8 +411,7 @@ def get_project_from_json( project_user = None if jsondata.get('parent'): project_user = user.username - project = pagure.lib.get_project( - session, name, user=project_user, namespace=namespace) + project = pagure.lib._get_project(session, name, user=project_user, namespace=namespace) if not project: parent = None @@ -451,8 +450,7 @@ def get_project_from_json( ) session.commit() - project = pagure.lib.get_project( - session, name, user=user.username, namespace=namespace) + project = pagure.lib._get_project(session, name, user=user.username, namespace=namespace) tags = jsondata.get('tags', None) if tags: @@ -529,8 +527,7 @@ def update_ticket_from_git( """ - repo = pagure.lib.get_project( - session, reponame, user=username, namespace=namespace) + repo = pagure.lib._get_project(session, reponame, user=username, namespace=namespace) if not repo: raise pagure.exceptions.PagureException( 'Unknown repo %s of username: %s in namespace: %s' % ( @@ -707,8 +704,7 @@ def update_request_from_git( """ - repo = pagure.lib.get_project( - session, reponame, user=username, namespace=namespace) + repo = pagure.lib._get_project(session, reponame, user=username, namespace=namespace) if not repo: raise pagure.exceptions.PagureException( 'Unknown repo %s of username: %s in namespace: %s' % ( diff --git a/pagure/lib/link.py b/pagure/lib/link.py index f6fb84b..c56ed54 100644 --- a/pagure/lib/link.py +++ b/pagure/lib/link.py @@ -57,7 +57,7 @@ def get_relation(session, reponame, username, namespace, text, ''' - repo = pagure.lib.get_project( + repo = pagure.lib._get_project( session, reponame, user=username, namespace=namespace) if not repo: return [] diff --git a/pagure/pfmarkdown.py b/pagure/pfmarkdown.py index ccb765f..be86526 100644 --- a/pagure/pfmarkdown.py +++ b/pagure/pfmarkdown.py @@ -316,8 +316,7 @@ def makeExtension(*arg, **kwargs): def _issue_exists(user, namespace, repo, idx): """ Utility method checking if a given issue exists. """ - repo_obj = pagure.lib.get_project( - pagure.SESSION, name=repo, user=user, namespace=namespace) + repo_obj = pagure.lib._get_project(pagure.SESSION, name=repo, user=user, namespace=namespace) if not repo_obj: return False @@ -332,8 +331,7 @@ def _issue_exists(user, namespace, repo, idx): def _pr_exists(user, namespace, repo, idx): """ Utility method checking if a given PR exists. """ - repo_obj = pagure.lib.get_project( - pagure.SESSION, name=repo, user=user, namespace=namespace) + repo_obj = pagure.lib._get_project(pagure.SESSION, name=repo, user=user, namespace=namespace) if not repo_obj: return False diff --git a/pagure/ui/fork.py b/pagure/ui/fork.py index bdada35..a8fce8b 100644 --- a/pagure/ui/fork.py +++ b/pagure/ui/fork.py @@ -889,7 +889,7 @@ def fork_project(repo, username=None, namespace=None): if not form.validate_on_submit(): flask.abort(400) - if pagure.lib.get_project( + if pagure.lib._get_project( SESSION, repo.name, user=flask.g.fas_user.username, namespace=namespace): return flask.redirect(flask.url_for( @@ -1254,7 +1254,7 @@ def fork_edit_file( if not form.validate_on_submit(): flask.abort(400) - if pagure.lib.get_project( + if pagure.lib._get_project( SESSION, repo.name, user=flask.g.fas_user.username): flask.flash('You had already forked this project') return flask.redirect(flask.url_for( diff --git a/tests/test_pagure_flask_api_issue.py b/tests/test_pagure_flask_api_issue.py index f1c04ac..c4abfab 100644 --- a/tests/test_pagure_flask_api_issue.py +++ b/tests/test_pagure_flask_api_issue.py @@ -3048,7 +3048,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): ) # Create normal issue - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.lib._get_project(self.session, 'test') msg = pagure.lib.new_issue( session=self.session, repo=repo, @@ -3063,7 +3063,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): self.assertEqual(msg.title, 'Test issue #1') # Check subscribtion before - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.lib._get_project(self.session, 'test') issue = pagure.lib.search_issues(self.session, repo, issueid=1) self.assertEqual( pagure.lib.get_watch_list(self.session, issue), @@ -3092,7 +3092,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): ) # No change - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.lib._get_project(self.session, 'test') issue = pagure.lib.search_issues(self.session, repo, issueid=1) self.assertEqual( pagure.lib.get_watch_list(self.session, issue), @@ -3120,7 +3120,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): {'message': 'You are now watching this issue'} ) - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.lib._get_project(self.session, 'test') issue = pagure.lib.search_issues(self.session, repo, issueid=1) self.assertEqual( pagure.lib.get_watch_list(self.session, issue), @@ -3137,7 +3137,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): {'message': 'You are no longer watching this issue'} ) - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.lib._get_project(self.session, 'test') issue = pagure.lib.search_issues(self.session, repo, issueid=1) self.assertEqual( pagure.lib.get_watch_list(self.session, issue), diff --git a/tests/test_pagure_flask_api_user.py b/tests/test_pagure_flask_api_user.py index b427636..7ad67e9 100644 --- a/tests/test_pagure_flask_api_user.py +++ b/tests/test_pagure_flask_api_user.py @@ -255,8 +255,8 @@ class PagureFlaskApiUSertests(tests.Modeltests): headers = {'Authorization': 'token aaabbbcccddd'} # Create a pull-request - repo = pagure.lib.get_project(self.session, 'test') - forked_repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.lib._get_project(self.session, 'test') + forked_repo = pagure.lib._get_project(self.session, 'test') req = pagure.lib.new_pull_request( session=self.session, repo_from=forked_repo, diff --git a/tests/test_pagure_flask_docs.py b/tests/test_pagure_flask_docs.py index 5ca5d64..3817f4c 100644 --- a/tests/test_pagure_flask_docs.py +++ b/tests/test_pagure_flask_docs.py @@ -141,7 +141,7 @@ class PagureFlaskDocstests(tests.Modeltests): docs. """ tests.create_projects(self.session) - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.lib._get_project(self.session, 'test') tests.create_projects_git(os.path.join(self.path, 'docs')) output = self.app.get('/test/docs') diff --git a/tests/test_pagure_flask_ui_fork.py b/tests/test_pagure_flask_ui_fork.py index 7464448..95d621f 100644 --- a/tests/test_pagure_flask_ui_fork.py +++ b/tests/test_pagure_flask_ui_fork.py @@ -2192,7 +2192,7 @@ index 0000000..2a552bb self.session.commit() # Get fork project - project = pagure.lib.get_project(self.session, 'test', 'foo') + project = pagure.lib._get_project(self.session, 'test', 'foo') # Pull-requests and issue-trackers are off for forks # lib function is not used here so mannually turning them off diff --git a/tests/test_pagure_flask_ui_roadmap.py b/tests/test_pagure_flask_ui_roadmap.py index b97469c..60dcc99 100644 --- a/tests/test_pagure_flask_ui_roadmap.py +++ b/tests/test_pagure_flask_ui_roadmap.py @@ -405,7 +405,7 @@ class PagureFlaskRoadmaptests(tests.Modeltests): self.assertIn(u'

Settings for test

', output.data) self.assertIn(u'Milestones updated', output.data) # Check the result of the action -- Milestones recorded - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.lib._get_project(self.session, 'test') self.assertEqual( repo.milestones, { diff --git a/tests/test_pagure_lib.py b/tests/test_pagure_lib.py index 632484d..075b1ea 100644 --- a/tests/test_pagure_lib.py +++ b/tests/test_pagure_lib.py @@ -1837,8 +1837,7 @@ class PagureLibtests(tests.Modeltests): projects = pagure.lib.search_projects(self.session) self.assertEqual(len(projects), 1) - repo = pagure.lib.get_project( - self.session, 'testproject', namespace='foonamespace') + repo = pagure.lib._get_project(self.session, 'testproject', namespace='foonamespace') gitrepo = os.path.join(gitfolder, repo.path) docrepo = os.path.join(docfolder, repo.path) ticketrepo = os.path.join(ticketfolder, repo.path) @@ -1946,9 +1945,7 @@ class PagureLibtests(tests.Modeltests): # Fork a fork - repo = pagure.lib.get_project( - self.session, 'testproject', - namespace='foonamespace', user='foo') + repo = pagure.lib._get_project(self.session, 'testproject', user='foo', namespace='foonamespace') msg = pagure.lib.fork_project( session=self.session, @@ -3364,9 +3361,8 @@ class PagureLibtests(tests.Modeltests): self.test_new_pull_request() # create PR#2 to project pingou/test - repo = pagure.lib.get_project(self.session, 'test') - forked_repo = pagure.lib.get_project( - self.session, 'test', user='pingou') + repo = pagure.lib._get_project(self.session, 'test') + forked_repo = pagure.lib._get_project(self.session, 'test', user='pingou') req = pagure.lib.new_pull_request( requestid=2, session=self.session, diff --git a/tests/test_pagure_lib_git.py b/tests/test_pagure_lib_git.py index 0113ee2..42df2a6 100644 --- a/tests/test_pagure_lib_git.py +++ b/tests/test_pagure_lib_git.py @@ -1988,9 +1988,8 @@ index 0000000..60f7480 tests.create_projects(self.session) tests.create_projects_git(os.path.join(self.path, 'repos')) - repo = pagure.lib.get_project(self.session, 'test') - namespaced_repo = pagure.lib.get_project( - self.session, 'test3', namespace='somenamespace') + repo = pagure.lib._get_project(self.session, 'test') + namespaced_repo = pagure.lib._get_project(self.session, 'test3', namespace='somenamespace') # Before self.assertEqual(len(repo.requests), 0) diff --git a/tests/test_pagure_lib_git_get_tags_objects.py b/tests/test_pagure_lib_git_get_tags_objects.py index 3acf7a5..27932db 100644 --- a/tests/test_pagure_lib_git_get_tags_objects.py +++ b/tests/test_pagure_lib_git_get_tags_objects.py @@ -65,7 +65,7 @@ class PagureLibGitGetTagstests(tests.Modeltests): """ Test the get_git_tags_objects method of pagure.lib.git. """ tests.create_projects(self.session) tests.create_projects_git(os.path.join(self.path, 'repos'), bare=True) - project = pagure.lib.get_project(self.session, 'test') + project = pagure.lib._get_project(self.session, 'test') # Case 1 - Empty repo with no tags exp = [] diff --git a/tests/test_pagure_lib_notify.py b/tests/test_pagure_lib_notify.py index 99ad3ce..24115ee 100644 --- a/tests/test_pagure_lib_notify.py +++ b/tests/test_pagure_lib_notify.py @@ -189,7 +189,7 @@ class PagureLibNotifytests(tests.Modeltests): self.session.commit() # Create the PR - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.lib._get_project(self.session, 'test') req = pagure.lib.new_pull_request( session=self.session, repo_from=repo, diff --git a/webhook-server/pagure-webhook-server.py b/webhook-server/pagure-webhook-server.py index 2b35227..4644867 100644 --- a/webhook-server/pagure-webhook-server.py +++ b/webhook-server/pagure-webhook-server.py @@ -134,7 +134,7 @@ def handle_messages(): log.info( 'Searching %s/%s/%s' % (username, namespace, projectname)) session = pagure.lib.create_session(pagure.APP.config['DB_URL']) - project = pagure.lib.get_project( + project = pagure.lib._get_project( session=session, name=projectname, user=username, namespace=namespace) if not project: From 8c764900b20eb42d58ea647dd1643e0d17ed8270 Mon Sep 17 00:00:00 2001 From: Farhaan Bukhsh Date: Apr 14 2017 10:32:37 +0000 Subject: [PATCH 64/94] Fix test for api response json --- diff --git a/tests/test_pagure_flask_api_ui_private_repo.py b/tests/test_pagure_flask_api_ui_private_repo.py index dc0a200..7858eb8 100644 --- a/tests/test_pagure_flask_api_ui_private_repo.py +++ b/tests/test_pagure_flask_api_ui_private_repo.py @@ -1654,12 +1654,15 @@ class PagurePrivateRepotest(tests.Modeltests): { "assignee": None, "blocks": [], + "close_status": None, "closed_at": None, "comments": [], "content": "This issue needs attention", + "custom_fields": [], "date_created": "1431414800", "depends": [], "id": 1, + "milestone": None, "priority": None, "private": False, "status": "Open", @@ -1668,6 +1671,7 @@ class PagurePrivateRepotest(tests.Modeltests): "user": { "fullname": "PY C", "name": "pingou" + } } ] @@ -1698,37 +1702,62 @@ class PagurePrivateRepotest(tests.Modeltests): data['issues'][1]['date_created'] = '1431414800' self.assertDictEqual( data, - {'args': - {'assignee': None, 'author': None, 'status': None, 'tags': []}, - 'issues': [{u'assignee': None, - 'blocks': [], - 'closed_at': None, - 'comments': [], - 'content': 'This issue needs attention', - 'date_created': '1431414800', - 'depends': [], - 'id': 1, - 'priority': None, - 'private': False, - 'status': 'Open', - 'tags': [], - 'title': u'test issue', - 'user': {'fullname': 'PY C', 'name': 'pingou'}}, - {'assignee': None, - 'blocks': [], - 'closed_at': None, - 'comments': [], - 'content': 'We should work on this', - 'date_created': '1431414800', - 'depends': [], - 'id': 2, - 'priority': None, - 'private': True, - 'status': 'Open', - 'tags': [], - 'title': 'Test issue', - 'user': {'fullname': 'PY C', 'name': 'pingou'}}], - 'total_issues': 2} + { + "args": { + "assignee": None, + "author": None, + "status": None, + "tags": [] + }, + "issues": [ + { + "assignee": None, + "blocks": [], + "close_status": None, + "closed_at": None, + "comments": [], + "content": "We should work on this", + "custom_fields": [], + "date_created": "1431414800", + "depends": [], + "id": 2, + "milestone": None, + "priority": None, + "private": True, + "status": "Open", + "tags": [], + "title": "Test issue", + "user": { + "fullname": "PY C", + "name": "pingou" + } + }, + { + "assignee": None, + "blocks": [], + "close_status": None, + "closed_at": None, + "comments": [], + "content": "This issue needs attention", + "custom_fields": [], + "date_created": "1431414800", + "depends": [], + "id": 1, + "milestone": None, + "priority": None, + "private": False, + "status": "Open", + "tags": [], + "title": "test issue", + "user": { + "fullname": "PY C", + "name": "pingou" + } + } + ], + "total_issues": 2 + } + ) # Access issues authenticated but non-existing token @@ -1753,22 +1782,24 @@ class PagurePrivateRepotest(tests.Modeltests): "status": None, "tags": [] }, - "total_issues": 2, "issues": [ { "assignee": None, "blocks": [], + "close_status": None, "closed_at": None, "comments": [], - "content": "This issue needs attention", + "content": "We should work on this", + "custom_fields": [], "date_created": "1431414800", "depends": [], - "id": 1, + "id": 2, + "milestone": None, "priority": None, - "private": False, + "private": True, "status": "Open", "tags": [], - "title": "test issue", + "title": "Test issue", "user": { "fullname": "PY C", "name": "pingou" @@ -1777,24 +1808,29 @@ class PagurePrivateRepotest(tests.Modeltests): { "assignee": None, "blocks": [], + "close_status": None, "closed_at": None, "comments": [], - "content": "We should work on this", + "content": "This issue needs attention", + "custom_fields": [], "date_created": "1431414800", "depends": [], - "id": 2, + "id": 1, + "milestone": None, "priority": None, - "private": True, + "private": False, "status": "Open", "tags": [], - "title": "Test issue", + "title": "test issue", "user": { "fullname": "PY C", "name": "pingou" } } - ] + ], + "total_issues": 2 } + ) # List closed issue @@ -1851,22 +1887,24 @@ class PagurePrivateRepotest(tests.Modeltests): "status": "All", "tags": [] }, - "total_issues": 2, "issues": [ { "assignee": None, "blocks": [], + "close_status": None, "closed_at": None, "comments": [], - "content": "This issue needs attention", + "content": "We should work on this", + "custom_fields": [], "date_created": "1431414800", "depends": [], - "id": 1, + "id": 2, + "milestone": None, "priority": None, - "private": False, + "private": True, "status": "Open", "tags": [], - "title": "test issue", + "title": "Test issue", "user": { "fullname": "PY C", "name": "pingou" @@ -1875,24 +1913,29 @@ class PagurePrivateRepotest(tests.Modeltests): { "assignee": None, "blocks": [], + "close_status": None, "closed_at": None, "comments": [], - "content": "We should work on this", + "content": "This issue needs attention", + "custom_fields": [], "date_created": "1431414800", "depends": [], - "id": 2, + "id": 1, + "milestone": None, "priority": None, - "private": True, + "private": False, "status": "Open", "tags": [], - "title": "Test issue", + "title": "test issue", "user": { "fullname": "PY C", "name": "pingou" } } ], + "total_issues": 2 } + ) def test_api_pivate_repo_view_issue(self): @@ -1949,12 +1992,15 @@ class PagurePrivateRepotest(tests.Modeltests): { "assignee": None, "blocks": [], - "closed_at":None, + "close_status": None, + "closed_at": None, "comments": [], "content": "This issue needs attention", + "custom_fields": [], "date_created": "1431414800", "depends": [], "id": 1, + "milestone": None, "priority": None, "private": False, "status": "Open", @@ -1963,6 +2009,7 @@ class PagurePrivateRepotest(tests.Modeltests): "user": { "fullname": "PY C", "name": "pingou" + } } ) @@ -1993,12 +2040,15 @@ class PagurePrivateRepotest(tests.Modeltests): { "assignee": None, "blocks": [], - "closed_at":None, + "close_status": None, + "closed_at": None, "comments": [], "content": "This issue needs attention", + "custom_fields": [], "date_created": "1431414800", "depends": [], "id": 1, + "milestone": None, "priority": None, "private": False, "status": "Open", @@ -2007,6 +2057,7 @@ class PagurePrivateRepotest(tests.Modeltests): "user": { "fullname": "PY C", "name": "pingou" + } } ) From 77ab9e53fe64aaa8dea54c6cabdd29ad1c49bc76 Mon Sep 17 00:00:00 2001 From: Farhaan Bukhsh Date: Apr 14 2017 10:32:37 +0000 Subject: [PATCH 65/94] Fix test for changing status of an issue --- diff --git a/tests/test_pagure_flask_api_ui_private_repo.py b/tests/test_pagure_flask_api_ui_private_repo.py index 7858eb8..429ee9a 100644 --- a/tests/test_pagure_flask_api_ui_private_repo.py +++ b/tests/test_pagure_flask_api_ui_private_repo.py @@ -2071,6 +2071,7 @@ class PagurePrivateRepotest(tests.Modeltests): hook_token='aaabbbeeeceee', private=True, ) + item.close_status = ['Invalid', 'Insufficient data', 'Fixed', 'Duplicate'] self.session.add(item) self.session.commit() From febbedc8e0b88645718771ff181bd2ec6da0d7fe Mon Sep 17 00:00:00 2001 From: Farhaan Bukhsh Date: Apr 14 2017 10:32:37 +0000 Subject: [PATCH 66/94] Fix using get_authorized_project in api/fork --- diff --git a/pagure/api/fork.py b/pagure/api/fork.py index c009e8a..ad554b7 100644 --- a/pagure/api/fork.py +++ b/pagure/api/fork.py @@ -493,7 +493,11 @@ def api_pull_request_add_comment( "message": "Comment added" } +<<<<<<< a8fb3f131e9001d3b8a7952180d3f92540aea426 """ # noqa +======= + """ +>>>>>>> Fix using get_authorized_project in api/fork repo = pagure.get_authorized_project(SESSION, repo, user=username, namespace=namespace) output = {} From 65b71a30aa83483c905d940fa06ff09a96eff2c1 Mon Sep 17 00:00:00 2001 From: Farhaan Bukhsh Date: Apr 14 2017 10:32:37 +0000 Subject: [PATCH 67/94] Fix modified json response --- diff --git a/tests/test_pagure_flask_api_ui_private_repo.py b/tests/test_pagure_flask_api_ui_private_repo.py index 429ee9a..f8854c8 100644 --- a/tests/test_pagure_flask_api_ui_private_repo.py +++ b/tests/test_pagure_flask_api_ui_private_repo.py @@ -847,61 +847,71 @@ class PagurePrivateRepotest(tests.Modeltests): self.assertDictEqual( data, { - 'args': { - 'assignee': None, - 'author': None, - 'status': True - }, - 'requests': [{ - 'assignee': None, - 'branch': 'master', - 'branch_from': 'master', - 'closed_at': None, - 'closed_by': None, - 'comments': [], - 'commit_start': None, - 'commit_stop': None, - 'date_created': '1431414800', - 'id': 1, - 'initial_comment': None, - 'project': { - 'date_created': '1431414800', - 'description': 'test project description', - 'id': 1, - 'name': 'test4', - 'parent': None, - 'priorities': {}, - 'tags': [], - 'user': { - 'fullname': 'PY C', - 'name': 'pingou' - } - }, - 'remote_git': None, - 'repo_from': { - 'date_created': '1431414800', - 'description': 'test project description', - 'id': 1, - 'name': 'test4', - 'parent': None, - 'priorities': {}, - 'tags': [], - 'user': { - 'fullname': 'PY C', - 'name': 'pingou' - } - }, - 'status': 'Open', - 'title': 'test pull-request', - 'uid': '1431414800', - 'updated_on': '1431414800', - 'user': { - 'fullname': 'PY C', - 'name': 'pingou' - } - }], - 'total_requests': 1 +"args": { + "assignee": None, + "author": None, + "status": True + }, + "requests": [ + { + "assignee": None, + "branch": "master", + "branch_from": "master", + "closed_at": None, + "closed_by": None, + "comments": [], + "commit_start": None, + "commit_stop": None, + "date_created": "1431414800", + "id": 1, + "initial_comment": None, + "project": { + "close_status": [], + "custom_keys": [], + "date_created": "1431414800", + "description": "test project description", + "id": 1, + "milestones": {}, + "name": "test4", + "namespace": None, + "parent": None, + "priorities": {}, + "tags": [], + "user": { + "fullname": "PY C", + "name": "pingou" } + }, + "remote_git": None, + "repo_from": { + "close_status": [], + "custom_keys": [], + "date_created": "1431414800", + "description": "test project description", + "id": 1, + "milestones": {}, + "name": "test4", + "namespace": None, + "parent": None, + "priorities": {}, + "tags": [], + "user": { + "fullname": "PY C", + "name": "pingou" + } + }, + "status": "Open", + "title": "test pull-request", + "uid": "1431414800", + "updated_on": "1431414800", + "user": { + "fullname": "PY C", + "name": "pingou" + } + } + ], + "total_requests": 1 + } ) headers = {'Authorization': 'token foobar_token'} @@ -928,54 +938,63 @@ class PagurePrivateRepotest(tests.Modeltests): data['uid'] = '1431414800' self.assertDictEqual( data, - { - "assignee": None, - "branch": "master", - "branch_from": "master", - "closed_at": None, - "closed_by": None, - "comments": [], - "commit_start": None, - "commit_stop": None, - "date_created": "1431414800", - "id": 1, - "initial_comment": None, - "project": { - "date_created": "1431414800", - "description": "test project description", - "id": 1, - "name": "test4", - "parent": None, - "priorities": {}, - "tags": [], - "user": { - "fullname": "PY C", - "name": "pingou" - } - }, - "remote_git": None, - "repo_from": { - "date_created": "1431414800", - "description": "test project description", - "id": 1, - "name": "test4", - "parent": None, - "priorities": {}, - "tags": [], - "user": { - "fullname": "PY C", - "name": "pingou" - } - }, - "status": 'Open', - "title": "test pull-request", - "uid": "1431414800", - "updated_on": "1431414800", - "user": { - "fullname": "PY C", - "name": "pingou" - } + { + "assignee": None, + "branch": "master", + "branch_from": "master", + "closed_at": None, + "closed_by": None, + "comments": [], + "commit_start": None, + "commit_stop": None, + "date_created": "1431414800", + "id": 1, + "initial_comment": None, + "project": { + "close_status": [], + "custom_keys": [], + "date_created": "1431414800", + "description": "test project description", + "id": 1, + "milestones": {}, + "name": "test4", + "namespace": None, + "parent": None, + "priorities": {}, + "tags": [], + "user": { + "fullname": "PY C", + "name": "pingou" } + }, + "remote_git": None, + "repo_from": { + "close_status": [], + "custom_keys": [], + "date_created": "1431414800", + "description": "test project description", + "id": 1, + "milestones": {}, + "name": "test4", + "namespace": None, + "parent": None, + "priorities": {}, + "tags": [], + "user": { + "fullname": "PY C", + "name": "pingou" + } + }, + "status": "Open", + "title": "test pull-request", + "uid": "1431414800", + "updated_on": "1431414800", + "user": { + "fullname": "PY C", + "name": "pingou" + } + } + ) # Access Pull-Request authenticated From 5d8713e2e6b1330e71172de3a228419abc1378eb Mon Sep 17 00:00:00 2001 From: Farhaan Bukhsh Date: Apr 14 2017 10:32:37 +0000 Subject: [PATCH 68/94] Fix 401 error because of wrong acls --- diff --git a/tests/test_pagure_flask_api_ui_private_repo.py b/tests/test_pagure_flask_api_ui_private_repo.py index f8854c8..a304e58 100644 --- a/tests/test_pagure_flask_api_ui_private_repo.py +++ b/tests/test_pagure_flask_api_ui_private_repo.py @@ -1361,9 +1361,15 @@ class PagurePrivateRepotest(tests.Modeltests): ) self.session.add(item) self.session.commit() + # Allow the token to close PR + acls = pagure.lib.get_acls(self.session) + acl = None + for acl in acls: + if acl.name == 'pull_request_close': + break item = pagure.lib.model.TokenAcl( token_id='foobar_token', - acl_id=7, + acl_id=acl.id, ) self.session.add(item) self.session.commit() @@ -1371,6 +1377,7 @@ class PagurePrivateRepotest(tests.Modeltests): headers = {'Authorization': 'token foobar_token'} # User not admin + print headers output = self.app.post( '/api/0/test4/pull-request/1/close', headers=headers) self.assertEqual(output.status_code, 404) @@ -1495,9 +1502,16 @@ class PagurePrivateRepotest(tests.Modeltests): ) self.session.add(item) self.session.commit() + + # Allow the token to merge PR + acls = pagure.lib.get_acls(self.session) + acl = None + for acl in acls: + if acl.name == 'pull_request_merge': + break item = pagure.lib.model.TokenAcl( token_id='foobar_token', - acl_id=10, + acl_id=acl.id, ) self.session.add(item) self.session.commit() From 02f4218bb49ee54be0ee17eb6c0da14ea5d87083 Mon Sep 17 00:00:00 2001 From: Farhaan Bukhsh Date: Apr 14 2017 10:32:37 +0000 Subject: [PATCH 69/94] Fix failing test in ui and repo path fixed for test --- diff --git a/pagure/api/project.py b/pagure/api/project.py index 9c794a7..23e7aa2 100644 --- a/pagure/api/project.py +++ b/pagure/api/project.py @@ -51,8 +51,8 @@ def api_git_tags(repo, username=None, namespace=None): } """ - repo = pagure.lib._get_project(SESSION, repo, user=username, namespace=namespace) - + repo = pagure.get_authorized_project( + SESSION, repo, user=username, namespace=namespace) if repo is None: raise pagure.exceptions.APIError(404, error_code=APIERROR.ENOPROJECT) @@ -392,7 +392,8 @@ def api_fork_project(): username = form.username.data or None namespace = form.namespace.data.strip() or None - repo = pagure.lib._get_project(SESSION, repo, user=username, namespace=namespace) + repo = pagure.lib._get_project( + SESSION, repo, user=username, namespace=namespace) if repo is None: raise pagure.exceptions.APIError( 404, error_code=APIERROR.ENOPROJECT) diff --git a/pagure/ui/fork.py b/pagure/ui/fork.py index a8fce8b..5312c86 100644 --- a/pagure/ui/fork.py +++ b/pagure/ui/fork.py @@ -170,7 +170,6 @@ def request_pulls(repo, username=None, namespace=None): def request_pull(repo, requestid, username=None, namespace=None): """ Create a pull request with the changes from the fork into the project. """ - repo = flask.g.repo if not repo.settings.get('pull_requests', True): diff --git a/tests/test_pagure_flask_api_ui_private_repo.py b/tests/test_pagure_flask_api_ui_private_repo.py index a304e58..a159b2e 100644 --- a/tests/test_pagure_flask_api_ui_private_repo.py +++ b/tests/test_pagure_flask_api_ui_private_repo.py @@ -257,7 +257,7 @@ class PagurePrivateRepotest(tests.Modeltests): self.assertEqual( output.get_data(as_text=True).count('

No group found

'), 1) self.assertEqual( - output.get_data(as_text=True).count('
'), 3) + output.get_data(as_text=True).count('
'), 6) def test_view_user(self): """ Test the view_user endpoint. """ @@ -316,7 +316,7 @@ class PagurePrivateRepotest(tests.Modeltests): self.assertEqual( output.get_data(as_text=True).count('

No group found

'), 1) self.assertEqual( - output.get_data(as_text=True).count('
'), 3) + output.get_data(as_text=True).count('
'), 5) user.username = 'pingou' with tests.user_set(pagure.APP, user): @@ -330,7 +330,7 @@ class PagurePrivateRepotest(tests.Modeltests): self.assertEqual( output.get_data(as_text=True).count('

No group found

'), 1) self.assertEqual( - output.get_data(as_text=True).count('
'), 3) + output.get_data(as_text=True).count('
'), 5) # Check pingou has 0 projects user.username = 'pingou' @@ -345,7 +345,7 @@ class PagurePrivateRepotest(tests.Modeltests): self.assertEqual( output.get_data(as_text=True).count('

No group found

'), 1) self.assertEqual( - output.get_data(as_text=True).count('
'), 3) + output.get_data(as_text=True).count('
'), 6) repo = pagure.lib._get_project(self.session, 'test3') @@ -370,7 +370,7 @@ class PagurePrivateRepotest(tests.Modeltests): self.assertEqual( output.get_data(as_text=True).count('

No group found

'), 1) self.assertEqual( - output.get_data(as_text=True).count('
'), 3) + output.get_data(as_text=True).count('
'), 6) @patch('pagure.ui.repo.admin_session_timedout') def test_private_settings_ui(self, ast): @@ -451,7 +451,7 @@ class PagurePrivateRepotest(tests.Modeltests): # Create all the git repos tests.create_projects_git( - os.path.join(tests.HERE, 'requests'), bare=True) + os.path.join(self.path, 'requests'), bare=True) # Add a git repo repo_path = os.path.join( @@ -459,7 +459,6 @@ class PagurePrivateRepotest(tests.Modeltests): if not os.path.exists(repo_path): os.makedirs(repo_path) pygit2.init_repository(repo_path, bare=True) - # Check repo was created user = tests.FakeUser(username='pingou') with tests.user_set(pagure.APP, user): @@ -614,13 +613,12 @@ class PagurePrivateRepotest(tests.Modeltests): self.session.commit() # Create a git repo to play with - gitrepo = os.path.join(self.path, 'repos', 'test4.git') + gitrepo = os.path.join(self.path, 'test4.git') repo = pygit2.init_repository(gitrepo, bare=True) newpath = tempfile.mkdtemp(prefix='pagure-fork-test') repopath = os.path.join(newpath, 'test4') 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') @@ -847,71 +845,71 @@ class PagurePrivateRepotest(tests.Modeltests): self.assertDictEqual( data, { -"args": { - "assignee": None, - "author": None, - "status": True - }, - "requests": [ - { - "assignee": None, - "branch": "master", - "branch_from": "master", - "closed_at": None, - "closed_by": None, - "comments": [], - "commit_start": None, - "commit_stop": None, - "date_created": "1431414800", - "id": 1, - "initial_comment": None, - "project": { - "close_status": [], - "custom_keys": [], - "date_created": "1431414800", - "description": "test project description", - "id": 1, - "milestones": {}, - "name": "test4", - "namespace": None, - "parent": None, - "priorities": {}, - "tags": [], - "user": { - "fullname": "PY C", - "name": "pingou" - } - }, - "remote_git": None, - "repo_from": { - "close_status": [], - "custom_keys": [], - "date_created": "1431414800", - "description": "test project description", - "id": 1, - "milestones": {}, - "name": "test4", - "namespace": None, - "parent": None, - "priorities": {}, - "tags": [], - "user": { - "fullname": "PY C", - "name": "pingou" + "args": { + "assignee": None, + "author": None, + "status": True + }, + "requests": [ + { + "assignee": None, + "branch": "master", + "branch_from": "master", + "closed_at": None, + "closed_by": None, + "comments": [], + "commit_start": None, + "commit_stop": None, + "date_created": "1431414800", + "id": 1, + "initial_comment": None, + "project": { + "close_status": [], + "custom_keys": [], + "date_created": "1431414800", + "description": "test project description", + "id": 1, + "milestones": {}, + "name": "test4", + "namespace": None, + "parent": None, + "priorities": {}, + "tags": [], + "user": { + "fullname": "PY C", + "name": "pingou" + } + }, + "remote_git": None, + "repo_from": { + "close_status": [], + "custom_keys": [], + "date_created": "1431414800", + "description": "test project description", + "id": 1, + "milestones": {}, + "name": "test4", + "namespace": None, + "parent": None, + "priorities": {}, + "tags": [], + "user": { + "fullname": "PY C", + "name": "pingou" + } + }, + "status": "Open", + "title": "test pull-request", + "uid": "1431414800", + "updated_on": "1431414800", + "user": { + "fullname": "PY C", + "name": "pingou" + } + } + ], + "total_requests": 1 } - }, - "status": "Open", - "title": "test pull-request", - "uid": "1431414800", - "updated_on": "1431414800", - "user": { - "fullname": "PY C", - "name": "pingou" - } - } - ], - "total_requests": 1 - } ) headers = {'Authorization': 'token foobar_token'} @@ -938,62 +936,62 @@ class PagurePrivateRepotest(tests.Modeltests): data['uid'] = '1431414800' self.assertDictEqual( data, - { - "assignee": None, - "branch": "master", - "branch_from": "master", - "closed_at": None, - "closed_by": None, - "comments": [], - "commit_start": None, - "commit_stop": None, - "date_created": "1431414800", - "id": 1, - "initial_comment": None, - "project": { - "close_status": [], - "custom_keys": [], - "date_created": "1431414800", - "description": "test project description", - "id": 1, - "milestones": {}, - "name": "test4", - "namespace": None, - "parent": None, - "priorities": {}, - "tags": [], - "user": { - "fullname": "PY C", - "name": "pingou" - } - }, - "remote_git": None, - "repo_from": { - "close_status": [], - "custom_keys": [], - "date_created": "1431414800", - "description": "test project description", - "id": 1, - "milestones": {}, - "name": "test4", - "namespace": None, - "parent": None, - "priorities": {}, - "tags": [], - "user": { - "fullname": "PY C", - "name": "pingou" + { + "assignee": None, + "branch": "master", + "branch_from": "master", + "closed_at": None, + "closed_by": None, + "comments": [], + "commit_start": None, + "commit_stop": None, + "date_created": "1431414800", + "id": 1, + "initial_comment": None, + "project": { + "close_status": [], + "custom_keys": [], + "date_created": "1431414800", + "description": "test project description", + "id": 1, + "milestones": {}, + "name": "test4", + "namespace": None, + "parent": None, + "priorities": {}, + "tags": [], + "user": { + "fullname": "PY C", + "name": "pingou" + } + }, + "remote_git": None, + "repo_from": { + "close_status": [], + "custom_keys": [], + "date_created": "1431414800", + "description": "test project description", + "id": 1, + "milestones": {}, + "name": "test4", + "namespace": None, + "parent": None, + "priorities": {}, + "tags": [], + "user": { + "fullname": "PY C", + "name": "pingou" + } + }, + "status": "Open", + "title": "test pull-request", + "uid": "1431414800", + "updated_on": "1431414800", + "user": { + "fullname": "PY C", + "name": "pingou" + } } - }, - "status": "Open", - "title": "test pull-request", - "uid": "1431414800", - "updated_on": "1431414800", - "user": { - "fullname": "PY C", - "name": "pingou" - } - } ) @@ -1377,7 +1375,6 @@ class PagurePrivateRepotest(tests.Modeltests): headers = {'Authorization': 'token foobar_token'} # User not admin - print headers output = self.app.post( '/api/0/test4/pull-request/1/close', headers=headers) self.assertEqual(output.status_code, 404) From 990ffeba1883bcceaa668d7e9a2f79cba45a3cf0 Mon Sep 17 00:00:00 2001 From: Farhaan Bukhsh Date: Apr 14 2017 10:32:37 +0000 Subject: [PATCH 70/94] Fix keys and file path for test --- diff --git a/tests/test_pagure_flask_api_ui_private_repo.py b/tests/test_pagure_flask_api_ui_private_repo.py index a159b2e..8051b3b 100644 --- a/tests/test_pagure_flask_api_ui_private_repo.py +++ b/tests/test_pagure_flask_api_ui_private_repo.py @@ -66,7 +66,7 @@ class PagurePrivateRepotest(tests.Modeltests): """ # Create a git repo to play with - gitrepo = os.path.join(self.path, 'repos', 'pmc.git') + gitrepo = os.path.join(self.path, 'pmc.git') repo = pygit2.init_repository(gitrepo, bare=True) newpath = tempfile.mkdtemp(prefix='pagure-private-test') @@ -742,10 +742,14 @@ class PagurePrivateRepotest(tests.Modeltests): "total_projects": 1, "projects": [ { + "close_status": [], + "custom_keys": [], "date_created": "1436527638", "description": "test project description", "id": 1, + "milestones": {}, "name": "test4", + "namespace": None, "parent": None, "priorities": {}, "tags": ["infra"], @@ -768,10 +772,14 @@ class PagurePrivateRepotest(tests.Modeltests): "total_projects": 1, "projects": [ { + "close_status": [], + "custom_keys": [], "date_created": "1436527638", "description": "test project description", "id": 1, + "milestones": {}, "name": "test4", + "namespace": None, "parent": None, "priorities": {}, "tags": ["infra"], @@ -782,6 +790,7 @@ class PagurePrivateRepotest(tests.Modeltests): } ] } + ) # Api pull-request views From 8aa0f529cd36724e73627503118f99679c4b1189 Mon Sep 17 00:00:00 2001 From: Farhaan Bukhsh Date: Apr 14 2017 10:32:37 +0000 Subject: [PATCH 71/94] Fixed more breaking tests after recent rebase --- diff --git a/tests/test_pagure_flask_api_ui_private_repo.py b/tests/test_pagure_flask_api_ui_private_repo.py index 8051b3b..6366d2c 100644 --- a/tests/test_pagure_flask_api_ui_private_repo.py +++ b/tests/test_pagure_flask_api_ui_private_repo.py @@ -21,6 +21,193 @@ import pagure.lib import tests from pagure.lib.repo import PagureRepo +FULL_ISSUE_LIST = [ + { + "assignee": None, + "blocks": [], + "close_status": None, + "closed_at": None, + "comments": [], + "content": "We should work on this", + "custom_fields": [], + "date_created": "1431414800", + "depends": [], + "id": 8, + "last_updated": "1431414800", + "milestone": None, + "priority": None, + "private": True, + "status": "Open", + "tags": [], + "title": "Test issue", + "user": { + "fullname": "PY C", + "name": "pingou" + } + }, + { + "assignee": None, + "blocks": [], + "close_status": None, + "closed_at": None, + "comments": [], + "content": "This issue needs attention", + "custom_fields": [], + "date_created": "1431414800", + "depends": [], + "id": 7, + "last_updated": "1431414800", + "milestone": None, + "priority": None, + "private": True, + "status": "Open", + "tags": [], + "title": "test issue", + "user": { + "fullname": "PY C", + "name": "pingou" + } + }, + { + "assignee": None, + "blocks": [], + "close_status": None, + "closed_at": None, + "comments": [], + "content": "This issue needs attention", + "custom_fields": [], + "date_created": "1431414800", + "depends": [], + "id": 6, + "last_updated": "1431414800", + "milestone": None, + "priority": None, + "private": True, + "status": "Open", + "tags": [], + "title": "test issue", + "user": { + "fullname": "PY C", + "name": "pingou" + } + }, + { + "assignee": None, + "blocks": [], + "close_status": None, + "closed_at": None, + "comments": [], + "content": "This issue needs attention", + "custom_fields": [], + "date_created": "1431414800", + "depends": [], + "id": 5, + "last_updated": "1431414800", + "milestone": None, + "priority": None, + "private": False, + "status": "Open", + "tags": [], + "title": "test issue", + "user": { + "fullname": "PY C", + "name": "pingou" + } + }, + { + "assignee": None, + "blocks": [], + "close_status": None, + "closed_at": None, + "comments": [], + "content": "This issue needs attention", + "custom_fields": [], + "date_created": "1431414800", + "depends": [], + "id": 4, + "last_updated": "1431414800", + "milestone": None, + "priority": None, + "private": False, + "status": "Open", + "tags": [], + "title": "test issue", + "user": { + "fullname": "PY C", + "name": "pingou" + } + }, + { + "assignee": None, + "blocks": [], + "close_status": None, + "closed_at": None, + "comments": [], + "content": "This issue needs attention", + "custom_fields": [], + "date_created": "1431414800", + "depends": [], + "id": 3, + "last_updated": "1431414800", + "milestone": None, + "priority": None, + "private": False, + "status": "Open", + "tags": [], + "title": "test issue", + "user": { + "fullname": "PY C", + "name": "pingou" + } + }, + { + "assignee": None, + "blocks": [], + "close_status": None, + "closed_at": None, + "comments": [], + "content": "This issue needs attention", + "custom_fields": [], + "date_created": "1431414800", + "depends": [], + "id": 2, + "last_updated": "1431414800", + "milestone": None, + "priority": None, + "private": False, + "status": "Open", + "tags": [], + "title": "test issue", + "user": { + "fullname": "PY C", + "name": "pingou" + } + }, + { + "assignee": None, + "blocks": [], + "close_status": None, + "closed_at": 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" + } + } +] + class PagurePrivateRepotest(tests.Modeltests): """ Tests for private repo in pagure """ @@ -462,7 +649,6 @@ class PagurePrivateRepotest(tests.Modeltests): # Check repo was created user = tests.FakeUser(username='pingou') with tests.user_set(pagure.APP, user): - output = self.app.get('/user/pingou/') self.assertEqual(output.status_code, 200) self.assertIn( @@ -739,6 +925,13 @@ class PagurePrivateRepotest(tests.Modeltests): self.assertDictEqual( data, { + "args": { + "fork": None, + "pattern": None, + "tags": [], + "username": "pingou" + }, + "total_projects": 1, "projects": [ { @@ -769,6 +962,12 @@ class PagurePrivateRepotest(tests.Modeltests): self.assertDictEqual( data, { + "args": { + "fork": None, + "pattern": None, + "tags": ["infra"], + "username": "pingou" + }, "total_projects": 1, "projects": [ { @@ -851,6 +1050,7 @@ class PagurePrivateRepotest(tests.Modeltests): data['requests'][0]['project']['date_created'] = '1431414800' data['requests'][0]['repo_from']['date_created'] = '1431414800' data['requests'][0]['uid'] = '1431414800' + data['requests'][0]['last_updated'] = '1431414800' self.assertDictEqual( data, { @@ -870,6 +1070,7 @@ class PagurePrivateRepotest(tests.Modeltests): "commit_start": None, "commit_stop": None, "date_created": "1431414800", + "last_updated": "1431414800", "id": 1, "initial_comment": None, "project": { @@ -932,6 +1133,7 @@ class PagurePrivateRepotest(tests.Modeltests): data2['requests'][0]['project']['date_created'] = '1431414800' data2['requests'][0]['repo_from']['date_created'] = '1431414800' data2['requests'][0]['uid'] = '1431414800' + data2['requests'][0]['last_updated'] = '1431414800' self.assertDictEqual(data, data2) # For single PR @@ -943,6 +1145,7 @@ class PagurePrivateRepotest(tests.Modeltests): data['project']['date_created'] = '1431414800' data['repo_from']['date_created'] = '1431414800' data['uid'] = '1431414800' + data['last_updated'] = '1431414800' self.assertDictEqual( data, { @@ -955,6 +1158,7 @@ class PagurePrivateRepotest(tests.Modeltests): "commit_start": None, "commit_stop": None, "date_created": "1431414800", + "last_updated": "1431414800", "id": 1, "initial_comment": None, "project": { @@ -1015,6 +1219,7 @@ class PagurePrivateRepotest(tests.Modeltests): data2['uid'] = '1431414800' data2['date_created'] = '1431414800' data2['updated_on'] = '1431414800' + data2['last_updated'] = '1431414800' self.assertDictEqual(data, data2) @patch('pagure.lib.notify.send_email') @@ -1073,6 +1278,7 @@ class PagurePrivateRepotest(tests.Modeltests): { "error": "Invalid or incomplete input submited", "error_code": "EINVALIDREQ", + "errors": {"comment": ["This field is required."]} } ) @@ -1155,7 +1361,7 @@ class PagurePrivateRepotest(tests.Modeltests): data, { "error": "Invalid or expired token. Please visit " - "https://pagure.org/ to get or renew your API token.", + "https://pagure.org/ to get or renew your API token.", "error_code": "EINVALIDTOK", } ) @@ -1212,6 +1418,7 @@ class PagurePrivateRepotest(tests.Modeltests): { "error": "Invalid or incomplete input submited", "error_code": "EINVALIDREQ", + "errors": {"comment": ["This field is required."]} } ) @@ -1343,7 +1550,7 @@ class PagurePrivateRepotest(tests.Modeltests): data, { "error": "Invalid or expired token. Please visit " - "https://pagure.org/ to get or renew your API token.", + "https://pagure.org/ to get or renew your API token.", "error_code": "EINVALIDTOK", } ) @@ -1483,7 +1690,7 @@ class PagurePrivateRepotest(tests.Modeltests): data, { "error": "Invalid or expired token. Please visit " - "https://pagure.org/ to get or renew your API token.", + "https://pagure.org/ to get or renew your API token.", "error_code": "EINVALIDTOK", } ) @@ -1594,7 +1801,7 @@ class PagurePrivateRepotest(tests.Modeltests): data, { "error": "Invalid or expired token. Please visit " - "https://pagure.org/ to get or renew your API token.", + "https://pagure.org/ to get or renew your API token.", "error_code": "EINVALIDTOK", } ) @@ -1608,8 +1815,11 @@ class PagurePrivateRepotest(tests.Modeltests): { "error": "Invalid or incomplete input submited", "error_code": "EINVALIDREQ", - } - ) + "errors": { + "issue_content": ["This field is required."], + "title": ["This field is required."] + } + }) data = { 'title': 'test issue', @@ -1638,6 +1848,11 @@ class PagurePrivateRepotest(tests.Modeltests): { "error": "Invalid or incomplete input submited", "error_code": "EINVALIDREQ", + "errors": { + "issue_content": ["This field is required."], + "title": ["This field is required."] + } + } ) @@ -1651,9 +1866,14 @@ class PagurePrivateRepotest(tests.Modeltests): '/api/0/test4/new_issue', data=data, headers=headers) 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.assertDictEqual( data, - {'message': 'Issue created'} + { + 'issue': FULL_ISSUE_LIST[7], + 'message': 'Issue created' + } ) def test_api_priavte_repo_view_issues(self): @@ -1679,12 +1899,14 @@ class PagurePrivateRepotest(tests.Modeltests): self.assertEqual(output.status_code, 200) data = json.loads(output.get_data(as_text=True)) data['issues'][0]['date_created'] = '1431414800' + data['issues'][0]['last_updated'] = '1431414800' self.assertDictEqual( data, { "args": { "assignee": None, "author": None, + "since": None, "status": None, "tags": [] }, @@ -1699,6 +1921,7 @@ class PagurePrivateRepotest(tests.Modeltests): "content": "This issue needs attention", "custom_fields": [], "date_created": "1431414800", + "last_updated": "1431414800", "depends": [], "id": 1, "milestone": None, @@ -1738,7 +1961,9 @@ class PagurePrivateRepotest(tests.Modeltests): self.assertEqual(output.status_code, 200) data = json.loads(output.get_data(as_text=True)) data['issues'][0]['date_created'] = '1431414800' + data['issues'][0]['last_updated'] = '1431414800' data['issues'][1]['date_created'] = '1431414800' + data['issues'][1]['last_updated'] = '1431414800' self.assertDictEqual( data, { @@ -1746,6 +1971,7 @@ class PagurePrivateRepotest(tests.Modeltests): "assignee": None, "author": None, "status": None, + "since": None, "tags": [] }, "issues": [ @@ -1758,6 +1984,7 @@ class PagurePrivateRepotest(tests.Modeltests): "content": "We should work on this", "custom_fields": [], "date_created": "1431414800", + "last_updated": "1431414800", "depends": [], "id": 2, "milestone": None, @@ -1780,6 +2007,7 @@ class PagurePrivateRepotest(tests.Modeltests): "content": "This issue needs attention", "custom_fields": [], "date_created": "1431414800", + "last_updated": "1431414800", "depends": [], "id": 1, "milestone": None, @@ -1811,7 +2039,9 @@ class PagurePrivateRepotest(tests.Modeltests): self.assertEqual(output.status_code, 200) data = json.loads(output.get_data(as_text=True)) data['issues'][0]['date_created'] = '1431414800' + data['issues'][0]['last_updated'] = '1431414800' data['issues'][1]['date_created'] = '1431414800' + data['issues'][1]['last_updated'] = '1431414800' self.assertDictEqual( data, { @@ -1819,6 +2049,7 @@ class PagurePrivateRepotest(tests.Modeltests): "assignee": None, "author": None, "status": None, + "since": None, "tags": [] }, "issues": [ @@ -1831,6 +2062,7 @@ class PagurePrivateRepotest(tests.Modeltests): "content": "We should work on this", "custom_fields": [], "date_created": "1431414800", + "last_updated": "1431414800", "depends": [], "id": 2, "milestone": None, @@ -1853,6 +2085,7 @@ class PagurePrivateRepotest(tests.Modeltests): "content": "This issue needs attention", "custom_fields": [], "date_created": "1431414800", + "last_updated": "1431414800", "depends": [], "id": 1, "milestone": None, @@ -1884,6 +2117,7 @@ class PagurePrivateRepotest(tests.Modeltests): "assignee": None, "author": None, "status": "Closed", + "since": None, "tags": [] }, "total_issues": 0, @@ -1903,6 +2137,7 @@ class PagurePrivateRepotest(tests.Modeltests): "assignee": None, "author": None, "status": "Invalid", + "since": None, "tags": [] }, "total_issues": 0, @@ -1916,13 +2151,16 @@ class PagurePrivateRepotest(tests.Modeltests): self.assertEqual(output.status_code, 200) data = json.loads(output.get_data(as_text=True)) data['issues'][0]['date_created'] = '1431414800' + data['issues'][0]['last_updated'] = '1431414800' data['issues'][1]['date_created'] = '1431414800' + data['issues'][1]['last_updated'] = '1431414800' self.assertDictEqual( data, { "args": { "assignee": None, "author": None, + "since": None, "status": "All", "tags": [] }, @@ -1936,6 +2174,7 @@ class PagurePrivateRepotest(tests.Modeltests): "content": "We should work on this", "custom_fields": [], "date_created": "1431414800", + "last_updated": "1431414800", "depends": [], "id": 2, "milestone": None, @@ -1958,6 +2197,7 @@ class PagurePrivateRepotest(tests.Modeltests): "content": "This issue needs attention", "custom_fields": [], "date_created": "1431414800", + "last_updated": "1431414800", "depends": [], "id": 1, "milestone": None, @@ -2026,6 +2266,7 @@ class PagurePrivateRepotest(tests.Modeltests): self.assertEqual(output.status_code, 200) data = json.loads(output.get_data(as_text=True)) data['date_created'] = '1431414800' + data['last_updated'] = '1431414800' self.assertDictEqual( data, { @@ -2039,6 +2280,7 @@ class PagurePrivateRepotest(tests.Modeltests): "date_created": "1431414800", "depends": [], "id": 1, + "last_updated": "1431414800", "milestone": None, "priority": None, "private": False, @@ -2048,9 +2290,9 @@ class PagurePrivateRepotest(tests.Modeltests): "user": { "fullname": "PY C", "name": "pingou" - } } + ) headers = {'Authorization': 'token aaabbbccc'} @@ -2074,6 +2316,7 @@ class PagurePrivateRepotest(tests.Modeltests): self.assertEqual(output.status_code, 200) data = json.loads(output.get_data(as_text=True)) data['date_created'] = '1431414800' + data['last_updated'] = '1431414800' self.assertDictEqual( data, { @@ -2087,6 +2330,7 @@ class PagurePrivateRepotest(tests.Modeltests): "date_created": "1431414800", "depends": [], "id": 1, + "last_updated": "1431414800", "milestone": None, "priority": None, "private": False, @@ -2096,8 +2340,8 @@ class PagurePrivateRepotest(tests.Modeltests): "user": { "fullname": "PY C", "name": "pingou" - } + } ) @@ -2201,6 +2445,7 @@ class PagurePrivateRepotest(tests.Modeltests): { "error": "Invalid or incomplete input submited", "error_code": "EINVALIDREQ", + "errors": {"status": ["Not a valid choice"]} } ) @@ -2284,7 +2529,7 @@ class PagurePrivateRepotest(tests.Modeltests): data, { "error": "Invalid or expired token. Please visit " - "https://pagure.org/ to get or renew your API token.", + "https://pagure.org/ to get or renew your API token.", "error_code": "EINVALIDTOK", } ) @@ -2336,6 +2581,7 @@ class PagurePrivateRepotest(tests.Modeltests): { "error": "Invalid or incomplete input submited", "error_code": "EINVALIDREQ", + "errors": {"comment": ["This field is required."]} } ) @@ -2398,7 +2644,7 @@ class PagurePrivateRepotest(tests.Modeltests): "avatar_url": "https://seccdn.libravatar.org/avatar/...", "comment": "This is a very interesting question", "comment_date": "2015-07-02 09:22", - "notification":False, + "notification": False, "date_created": "1435821770", "edited_on": None, "editor": None, @@ -2424,7 +2670,7 @@ class PagurePrivateRepotest(tests.Modeltests): "avatar_url": "https://seccdn.libravatar.org/avatar/...", "comment": "This is a very interesting question", "comment_date": "2015-07-02 09:22", - "notification":False, + "notification": False, "date_created": "1435821770", "edited_on": None, "editor": None, From 94088039227673ab1b7eb16dd74be0c03d395c1e Mon Sep 17 00:00:00 2001 From: Farhaan Bukhsh Date: Apr 14 2017 10:32:37 +0000 Subject: [PATCH 72/94] Migration from get_project to _get_project --- diff --git a/ev-server/pagure_stream_server.py b/ev-server/pagure_stream_server.py index 2baa592..66f62aa 100644 --- a/ev-server/pagure_stream_server.py +++ b/ev-server/pagure_stream_server.py @@ -144,9 +144,8 @@ def get_obj_from_path(path): """ Return the Ticket or Request object based on the path provided. """ (username, namespace, reponame, objtype, objid) = _parse_path(path) - repo = pagure.lib.get_project( - pagure.SESSION, reponame, user=username, namespace=namespace) - + repo = pagure.get_authorized_project(pagure.SESSION, reponame, + user=username, namespace=namespace) if repo is None: raise PagureEvException("Project '%s' not found" % reponame) diff --git a/tests/test_pagure_flask_api_user.py b/tests/test_pagure_flask_api_user.py index 7ad67e9..f668e4f 100644 --- a/tests/test_pagure_flask_api_user.py +++ b/tests/test_pagure_flask_api_user.py @@ -426,7 +426,7 @@ class PagureFlaskApiUSertests(tests.Modeltests): api when the user only did one action. """ tests.create_projects(self.session) - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.lib._get_project(self.session, 'test') now = datetime.datetime.utcnow() date = now.date().strftime('%Y-%m-%d') diff --git a/tests/test_pagure_flask_ui_app.py b/tests/test_pagure_flask_ui_app.py index e04d64a..77522e0 100644 --- a/tests/test_pagure_flask_ui_app.py +++ b/tests/test_pagure_flask_ui_app.py @@ -1053,7 +1053,7 @@ class PagureFlaskApptests(tests.Modeltests): """Test the view_user_requests endpoint. """ # Create the PR tests.create_projects(self.session) - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.lib._get_project(self.session, 'test') req = pagure.lib.new_pull_request( session=self.session, repo_from=repo, @@ -1085,7 +1085,7 @@ class PagureFlaskApptests(tests.Modeltests): hook_token='aaabbbttt', ) self.session.add(item) - repo = pagure.lib.get_project( + repo = pagure.lib._get_project( self.session, 'test_fork', user='pingou') req = pagure.lib.new_pull_request( @@ -1123,7 +1123,7 @@ class PagureFlaskApptests(tests.Modeltests): """Test the view_user_issues endpoint when the user exists.""" # Create the issue tests.create_projects(self.session) - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.lib._get_project(self.session, 'test') msg = pagure.lib.new_issue( session=self.session, repo=repo, @@ -1153,7 +1153,7 @@ class PagureFlaskApptests(tests.Modeltests): hook_token='aaabbbttt', ) self.session.add(item) - repo = pagure.lib.get_project(self.session, 'test_fork', user='foo') + repo = pagure.lib._get_project(self.session, 'test_fork', user='foo') msg = pagure.lib.new_issue( session=self.session, diff --git a/tests/test_pagure_flask_ui_issues.py b/tests/test_pagure_flask_ui_issues.py index bb47299..f0b649b 100644 --- a/tests/test_pagure_flask_ui_issues.py +++ b/tests/test_pagure_flask_ui_issues.py @@ -1511,7 +1511,7 @@ class PagureFlaskIssuestests(tests.Modeltests): 'Issue #1: Test issue - test - Pagure', output.data) - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.lib._get_project(self.session, 'test') issue = pagure.lib.search_issues(self.session, repo, issueid=1) self.assertEqual(issue.depending_text, []) self.assertEqual(issue.blocking_text, []) diff --git a/tests/test_pagure_flask_ui_priorities.py b/tests/test_pagure_flask_ui_priorities.py index 34a843f..b52c056 100644 --- a/tests/test_pagure_flask_ui_priorities.py +++ b/tests/test_pagure_flask_ui_priorities.py @@ -364,7 +364,7 @@ class PagureFlaskPrioritiestests(tests.Modeltests): tests.create_projects_git(os.path.join(self.path), bare=True) # Start from scrach on priorities - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.lib._get_project(self.session, 'test') self.assertEqual(repo.priorities, {}) user = tests.FakeUser() @@ -395,7 +395,7 @@ class PagureFlaskPrioritiestests(tests.Modeltests): self.assertIn('

Settings for test

', output.data) # Check the result of the action -- Priority recorded - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.lib._get_project(self.session, 'test') self.assertEqual( repo.priorities, {u'': u'', u'1': u'High', u'2': u'Normal', u'3': u'Low'} @@ -449,7 +449,7 @@ class PagureFlaskPrioritiestests(tests.Modeltests): self.assertNotIn('', output.data) # Check the result of the action -- Priority recorded - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.lib._get_project(self.session, 'test') self.assertEqual(repo.priorities, {}) diff --git a/tests/test_pagure_flask_ui_quick_reply.py b/tests/test_pagure_flask_ui_quick_reply.py index 58a9882..3df52b4 100644 --- a/tests/test_pagure_flask_ui_quick_reply.py +++ b/tests/test_pagure_flask_ui_quick_reply.py @@ -51,7 +51,7 @@ class PagureFlaskQuickReplytest(tests.Modeltests): self.admin = tests.FakeUser(username='pingou') self.user = tests.FakeUser(username='ralph') - self.repo = pagure.lib.get_project(self.session, 'test') + self.repo = pagure.lib._get_project(self.session, 'test') def disable_issues_and_pull_requests(self): """Disable both issues and pull requests.""" @@ -101,7 +101,7 @@ class PagureFlaskQuickReplytest(tests.Modeltests): self.assertIn(notice, output.data) def assertQuickReplies(self, quick_replies, project='test'): - repo = pagure.lib.get_project(self.session, project) + repo = pagure.lib._get_project(self.session, project) self.assertEqual(repo.quick_replies, quick_replies) def assertQuickReplyLinks(self, output): @@ -158,7 +158,7 @@ class PagureFlaskQuickReplytest(tests.Modeltests): def test_update_quick_replies_empty_to_reset(self): # Set some quick replies - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.lib._get_project(self.session, 'test') repo.quick_replies = ['Ship it!', 'Nah.'] self.session.add(repo) self.session.commit() diff --git a/tests/test_pagure_lib_git.py b/tests/test_pagure_lib_git.py index 42df2a6..c731eda 100644 --- a/tests/test_pagure_lib_git.py +++ b/tests/test_pagure_lib_git.py @@ -2579,7 +2579,7 @@ index 0000000..60f7480 """ Test the update_custom_fields_from_json method of lib.git """ tests.create_projects(self.session) - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.lib._get_project(self.session, 'test') # Create issues to play with pagure.lib.new_issue( diff --git a/tests/test_pagure_lib_notify_email.py b/tests/test_pagure_lib_notify_email.py index 26371cd..ef40744 100644 --- a/tests/test_pagure_lib_notify_email.py +++ b/tests/test_pagure_lib_notify_email.py @@ -40,9 +40,9 @@ class PagureLibNotifyEmailtests(tests.Modeltests): self.user1 = pagure.lib.get_user(self.session, 'pingou') self.user2 = pagure.lib.get_user(self.session, 'foo') - self.project1 = pagure.lib.get_project(self.session, 'test') - self.project2 = pagure.lib.get_project(self.session, 'test2') - self.project3 = pagure.lib.get_project(self.session, 'test3', namespace='somenamespace') + self.project1 = pagure.lib._get_project(self.session, 'test') + self.project2 = pagure.lib._get_project(self.session, 'test2') + self.project3 = pagure.lib._get_project(self.session, 'test3', namespace='somenamespace') # Create a forked repo, should be project #4 # Not using fork_project as it tries to do a git clone @@ -56,7 +56,7 @@ class PagureLibNotifyEmailtests(tests.Modeltests): ) self.session.add(item) self.session.commit() - self.forkedproject = pagure.lib.get_project(self.session, 'test', user='foo') + self.forkedproject = pagure.lib._get_project(self.session, 'test', user='foo') # Report an issue on project #1 self.issue1 = pagure.lib.new_issue( diff --git a/tests/test_pagure_lib_watch_list.py b/tests/test_pagure_lib_watch_list.py index 70be7b8..bfddc0a 100644 --- a/tests/test_pagure_lib_watch_list.py +++ b/tests/test_pagure_lib_watch_list.py @@ -149,7 +149,7 @@ class PagureLibGetWatchListtests(tests.Modeltests): email='bar@bar.com') self.session.add(item) - project = pagure.lib.get_project( + project = pagure.lib._get_project( self.session, 'test3', namespace='ns') msg = pagure.lib.add_user_to_project( session=self.session, @@ -233,7 +233,7 @@ class PagureLibGetWatchListtests(tests.Modeltests): self.session.commit() self.assertEqual(msg, 'User `bar` added to the group `foo`.') - project = pagure.lib.get_project( + project = pagure.lib._get_project( self.session, 'test3', namespace='ns') # Add group to project @@ -293,7 +293,7 @@ class PagureLibGetWatchListtests(tests.Modeltests): email='bar@bar.com') self.session.add(item) - project = pagure.lib.get_project( + project = pagure.lib._get_project( self.session, 'test3', namespace='ns') msg = pagure.lib.add_user_to_project( session=self.session, @@ -361,7 +361,7 @@ class PagureLibGetWatchListtests(tests.Modeltests): email='bar@bar.com') self.session.add(item) - project = pagure.lib.get_project( + project = pagure.lib._get_project( self.session, 'test3', namespace='ns') msg = pagure.lib.add_user_to_project( session=self.session, @@ -426,7 +426,7 @@ class PagureLibGetWatchListtests(tests.Modeltests): self.session.add(item) # Set the user `bar` to watch the project - project = pagure.lib.get_project( + project = pagure.lib._get_project( self.session, 'test3', namespace='ns') msg = pagure.lib.update_watch_status( session=self.session, diff --git a/tests/test_stream_server.py b/tests/test_stream_server.py index 411df62..0db4ccb 100644 --- a/tests/test_stream_server.py +++ b/tests/test_stream_server.py @@ -49,8 +49,8 @@ class StreamingServerTests(tests.Modeltests): # Setup projects tests.create_projects(self.session) - self.repo = pagure.lib.get_project(self.session, 'test') - self.repo2 = pagure.lib.get_project(self.session, 'test2') + self.repo = pagure.lib._get_project(self.session, 'test') + self.repo2 = pagure.lib._get_project(self.session, 'test2') # Disable repo 2's issue tracker and PR tracker pagure.lib.update_project_settings( From 9f560ffb7dd48d02a749645c455cd522fe61a9b3 Mon Sep 17 00:00:00 2001 From: Farhaan Bukhsh Date: Apr 14 2017 10:32:37 +0000 Subject: [PATCH 73/94] Fix test after FORK_FOLDER change --- diff --git a/tests/test_pagure_flask_api_ui_private_repo.py b/tests/test_pagure_flask_api_ui_private_repo.py index 6366d2c..40bd45c 100644 --- a/tests/test_pagure_flask_api_ui_private_repo.py +++ b/tests/test_pagure_flask_api_ui_private_repo.py @@ -234,8 +234,6 @@ class PagurePrivateRepotest(tests.Modeltests): pagure.APP.config['VIRUS_SCAN_ATTACHMENTS'] = False pagure.APP.config['GIT_FOLDER'] = self.path - pagure.APP.config['FORK_FOLDER'] = os.path.join( - self.path, 'forks') pagure.APP.config['REQUESTS_FOLDER'] = os.path.join( self.path, 'requests') pagure.APP.config['TICKETS_FOLDER'] = os.path.join( From 1a3e4e3626fcfeb34641c14dd236c7bb38542928 Mon Sep 17 00:00:00 2001 From: Farhaan Bukhsh Date: Apr 14 2017 10:32:37 +0000 Subject: [PATCH 74/94] Fix _get_project to get_authorized project for the new files and removing imports --- diff --git a/pagure/__init__.py b/pagure/__init__.py index ab977d1..8d1f61e 100644 --- a/pagure/__init__.py +++ b/pagure/__init__.py @@ -492,7 +492,7 @@ def set_variables(): flask.g.repo = pagure.get_authorized_project( SESSION, repo, user=username, namespace=namespace) if authenticated(): - flask.g.repo_forked = pagure.lib._get_project(SESSION, repo, user=flask.g.fas_user.username, + flask.g.repo_forked = pagure.get_authorized_project(SESSION, repo, user=flask.g.fas_user.username, namespace=namespace) if not flask.g.repo \ diff --git a/pagure/api/project.py b/pagure/api/project.py index 23e7aa2..8fff21f 100644 --- a/pagure/api/project.py +++ b/pagure/api/project.py @@ -15,7 +15,7 @@ from sqlalchemy.exc import SQLAlchemyError import pagure import pagure.exceptions import pagure.lib -from pagure import SESSION, APP, is_repo_admin, authenticated +from pagure import SESSION, APP, authenticated from pagure.api import API, api_method, APIERROR, api_login_required @@ -392,7 +392,7 @@ def api_fork_project(): username = form.username.data or None namespace = form.namespace.data.strip() or None - repo = pagure.lib._get_project( + repo = pagure.get_authorized_project( SESSION, repo, user=username, namespace=namespace) if repo is None: raise pagure.exceptions.APIError( diff --git a/pagure/hooks/files/default_hook.py b/pagure/hooks/files/default_hook.py index a91f755..6c8ad3b 100755 --- a/pagure/hooks/files/default_hook.py +++ b/pagure/hooks/files/default_hook.py @@ -38,7 +38,7 @@ def run_as_post_receive_hook(): print('user:', username) print('namespace:', namespace) - project = pagure.lib._get_project(pagure.SESSION, repo, user=username, namespace=namespace) + project = pagure.get_authorized_project(pagure.SESSION, repo, user=username, namespace=namespace) for line in sys.stdin: if pagure.APP.config.get('HOOK_DEBUG', False): diff --git a/pagure/hooks/files/fedmsg_hook.py b/pagure/hooks/files/fedmsg_hook.py index 44aa754..350e5ab 100755 --- a/pagure/hooks/files/fedmsg_hook.py +++ b/pagure/hooks/files/fedmsg_hook.py @@ -55,7 +55,7 @@ for line in sys.stdin.readlines(): project_name = pagure.lib.git.get_repo_name(abspath) username = pagure.lib.git.get_username(abspath) namespace = pagure.lib.git.get_repo_namespace(abspath) - project = pagure.lib._get_project( + project = pagure.get_authorized_project( pagure.SESSION, project_name, username, namespace=namespace) if not project: project = project_name diff --git a/pagure/hooks/files/rtd_hook.py b/pagure/hooks/files/rtd_hook.py index 7554e03..182fc26 100755 --- a/pagure/hooks/files/rtd_hook.py +++ b/pagure/hooks/files/rtd_hook.py @@ -35,7 +35,7 @@ def run_as_post_receive_hook(): print 'user: ', username print 'namespace:', namespace - repo = pagure.lib._get_project(pagure.SESSION, reponame, user=username, namespace=namespace) + repo = pagure.get_authorized_project(pagure.SESSION, reponame, user=username, namespace=namespace) if not repo: print 'Unknown repo %s of username: %s' % (reponame, username) sys.exit(1) diff --git a/pagure/lib/__init__.py b/pagure/lib/__init__.py index 3b3d323..99c2199 100644 --- a/pagure/lib/__init__.py +++ b/pagure/lib/__init__.py @@ -3663,7 +3663,7 @@ def is_watching(session, user, reponame, repouser=None, namespace=None): if watcher: return watcher.watch - project = pagure.lib._get_project( + project = pagure.get_authorized_project( session, reponame, user=repouser, namespace=namespace) if not project: diff --git a/pagure/lib/git.py b/pagure/lib/git.py index da53627..fdedf19 100644 --- a/pagure/lib/git.py +++ b/pagure/lib/git.py @@ -411,7 +411,7 @@ def get_project_from_json( project_user = None if jsondata.get('parent'): project_user = user.username - project = pagure.lib._get_project(session, name, user=project_user, namespace=namespace) + project = pagure.get_authorized_project(session, name, user=project_user, namespace=namespace) if not project: parent = None @@ -450,7 +450,7 @@ def get_project_from_json( ) session.commit() - project = pagure.lib._get_project(session, name, user=user.username, namespace=namespace) + project = pagure.get_authorized_project(session, name, user=user.username, namespace=namespace) tags = jsondata.get('tags', None) if tags: @@ -527,7 +527,7 @@ def update_ticket_from_git( """ - repo = pagure.lib._get_project(session, reponame, user=username, namespace=namespace) + repo = pagure.get_authorized_project(session, reponame, user=username, namespace=namespace) if not repo: raise pagure.exceptions.PagureException( 'Unknown repo %s of username: %s in namespace: %s' % ( @@ -704,7 +704,7 @@ def update_request_from_git( """ - repo = pagure.lib._get_project(session, reponame, user=username, namespace=namespace) + repo = pagure.get_authorized_project(session, reponame, user=username, namespace=namespace) if not repo: raise pagure.exceptions.PagureException( 'Unknown repo %s of username: %s in namespace: %s' % ( diff --git a/pagure/lib/link.py b/pagure/lib/link.py index c56ed54..dc2c246 100644 --- a/pagure/lib/link.py +++ b/pagure/lib/link.py @@ -57,7 +57,7 @@ def get_relation(session, reponame, username, namespace, text, ''' - repo = pagure.lib._get_project( + repo = pagure.get_authorized_project( session, reponame, user=username, namespace=namespace) if not repo: return [] diff --git a/pagure/pfmarkdown.py b/pagure/pfmarkdown.py index be86526..9566d19 100644 --- a/pagure/pfmarkdown.py +++ b/pagure/pfmarkdown.py @@ -316,7 +316,7 @@ def makeExtension(*arg, **kwargs): def _issue_exists(user, namespace, repo, idx): """ Utility method checking if a given issue exists. """ - repo_obj = pagure.lib._get_project(pagure.SESSION, name=repo, user=user, namespace=namespace) + repo_obj = pagure.get_authorized_project(pagure.SESSION, repo=repo, user=user, namespace=namespace) if not repo_obj: return False @@ -331,7 +331,7 @@ def _issue_exists(user, namespace, repo, idx): def _pr_exists(user, namespace, repo, idx): """ Utility method checking if a given PR exists. """ - repo_obj = pagure.lib._get_project(pagure.SESSION, name=repo, user=user, namespace=namespace) + repo_obj = pagure.get_authorized_project(pagure.SESSION, repo=repo, user=user, namespace=namespace) if not repo_obj: return False diff --git a/pagure/ui/app.py b/pagure/ui/app.py index 8b14f3e..2a3ad95 100644 --- a/pagure/ui/app.py +++ b/pagure/ui/app.py @@ -21,8 +21,7 @@ import pagure.lib.git import pagure.forms import pagure.ui.filters from pagure import (APP, SESSION, login_required, - authenticated, is_repo_admin, - admin_session_timedout) + authenticated, admin_session_timedout) @APP.route('/browse/projects', endpoint='browse_projects') diff --git a/pagure/ui/repo.py b/pagure/ui/repo.py index 9814caf..f8ed3b1 100644 --- a/pagure/ui/repo.py +++ b/pagure/ui/repo.py @@ -50,8 +50,7 @@ import pagure.forms import pagure import pagure.ui.plugins from pagure import (APP, SESSION, LOG, __get_file_in_tree, login_required, - is_repo_admin, admin_session_timedout, authenticated, - get_authorized_project) + is_repo_admin, admin_session_timedout) from pagure.lib import encoding_utils @@ -916,6 +915,7 @@ def view_tags(repo, username=None, namespace=None): @APP.route('//upload/', methods=('GET', 'POST')) +@APP.route('//upload', methods=('GET', 'POST')) @APP.route('///upload/', methods=('GET', 'POST')) @APP.route('///upload', methods=('GET', 'POST')) @APP.route('/fork///upload/', methods=('GET', 'POST')) From 481209fc422b9171a0737e4c5d8cf9bd7af6cadf Mon Sep 17 00:00:00 2001 From: Farhaan Bukhsh Date: Apr 14 2017 10:32:37 +0000 Subject: [PATCH 75/94] Fix tests after rebase --- diff --git a/pagure/api/project.py b/pagure/api/project.py index 8fff21f..cc5eb3e 100644 --- a/pagure/api/project.py +++ b/pagure/api/project.py @@ -216,7 +216,7 @@ def api_project(repo, username=None, namespace=None): } """ - repo = pagure.lib.get_project( + repo = pagure.get_authorized_project( SESSION, repo, user=username, namespace=namespace) if repo is None: diff --git a/pagure/lib/__init__.py b/pagure/lib/__init__.py index 99c2199..5008787 100644 --- a/pagure/lib/__init__.py +++ b/pagure/lib/__init__.py @@ -862,6 +862,7 @@ def edit_issue_tags( new_tag, new_tag_description, new_tag_color ) ) + pagure.lib.notify.log( project, topic='project.tag.edited', @@ -877,7 +878,6 @@ def edit_issue_tags( ), redis=REDIS, ) - msgs.append('Edited tag: %s to %s' % (old_tag, new_tag)) return msgs diff --git a/tests/test_pagure_flask_api_issue.py b/tests/test_pagure_flask_api_issue.py index c4abfab..2d8df2a 100644 --- a/tests/test_pagure_flask_api_issue.py +++ b/tests/test_pagure_flask_api_issue.py @@ -2806,7 +2806,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): self.assertEqual(len(issue.comments), 0) # No change - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') issue = pagure.lib.search_issues(self.session, repo, issueid=1) self.assertEqual(issue.status, 'Open') @@ -2848,7 +2848,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): data, {'message': 'Nothing to change'} ) - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') issue = pagure.lib.search_issues(self.session, repo, issueid=1) self.assertEqual(issue.assignee, None) @@ -3048,7 +3048,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): ) # Create normal issue - repo = pagure.lib._get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') msg = pagure.lib.new_issue( session=self.session, repo=repo, @@ -3063,7 +3063,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): self.assertEqual(msg.title, 'Test issue #1') # Check subscribtion before - repo = pagure.lib._get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') issue = pagure.lib.search_issues(self.session, repo, issueid=1) self.assertEqual( pagure.lib.get_watch_list(self.session, issue), @@ -3092,7 +3092,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): ) # No change - repo = pagure.lib._get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') issue = pagure.lib.search_issues(self.session, repo, issueid=1) self.assertEqual( pagure.lib.get_watch_list(self.session, issue), @@ -3120,7 +3120,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): {'message': 'You are now watching this issue'} ) - repo = pagure.lib._get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') issue = pagure.lib.search_issues(self.session, repo, issueid=1) self.assertEqual( pagure.lib.get_watch_list(self.session, issue), @@ -3137,7 +3137,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): {'message': 'You are no longer watching this issue'} ) - repo = pagure.lib._get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') issue = pagure.lib.search_issues(self.session, repo, issueid=1) self.assertEqual( pagure.lib.get_watch_list(self.session, issue), @@ -3188,7 +3188,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): ) # Create normal issue - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') msg = pagure.lib.new_issue( session=self.session, repo=repo, @@ -3215,7 +3215,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): ) # Check the behavior if the project disabled the issue tracker - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') settings = repo.settings settings['issue_tracker'] = False repo.settings = settings @@ -3234,7 +3234,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): } ) - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') settings = repo.settings settings['issue_tracker'] = True repo.settings = settings @@ -3260,7 +3260,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): headers = {'Authorization': 'token aaabbbcccddd'} # Set some custom fields - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') msg = pagure.lib.set_custom_key_fields( self.session, repo, ['bugzilla', 'upstream', 'reviewstatus'], diff --git a/tests/test_pagure_flask_api_project.py b/tests/test_pagure_flask_api_project.py index 8940d9e..c16298a 100644 --- a/tests/test_pagure_flask_api_project.py +++ b/tests/test_pagure_flask_api_project.py @@ -354,7 +354,7 @@ class PagureFlaskApiProjecttests(tests.Modeltests): tests.create_projects(self.session) # Check before adding - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') self.assertEqual(repo.tags, []) # Adding a tag @@ -364,7 +364,7 @@ class PagureFlaskApiProjecttests(tests.Modeltests): self.assertEqual(output, ['Issue tagged with: infra']) # Check after adding - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') self.assertEqual(len(repo.tags), 1) self.assertEqual(repo.tags_text, ['infra']) diff --git a/tests/test_pagure_flask_ui_issues.py b/tests/test_pagure_flask_ui_issues.py index f0b649b..8f491d5 100644 --- a/tests/test_pagure_flask_ui_issues.py +++ b/tests/test_pagure_flask_ui_issues.py @@ -1511,7 +1511,7 @@ class PagureFlaskIssuestests(tests.Modeltests): 'Issue #1: Test issue - test - Pagure', output.data) - repo = pagure.lib._get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') issue = pagure.lib.search_issues(self.session, repo, issueid=1) self.assertEqual(issue.depending_text, []) self.assertEqual(issue.blocking_text, []) @@ -2296,7 +2296,7 @@ class PagureFlaskIssuestests(tests.Modeltests): self.assertEqual(issue.comments[0].comment, 'Second update') # Create another issue from someone else - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') msg = pagure.lib.new_issue( session=self.session, repo=repo, @@ -2448,7 +2448,7 @@ class PagureFlaskIssuestests(tests.Modeltests): self.assertEqual(output.status_code, 302) # Create issues to play with - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') msg = pagure.lib.new_issue( session=self.session, repo=repo, diff --git a/tests/test_pagure_lib.py b/tests/test_pagure_lib.py index 075b1ea..5600014 100644 --- a/tests/test_pagure_lib.py +++ b/tests/test_pagure_lib.py @@ -142,7 +142,7 @@ class PagureLibtests(tests.Modeltests): p_ugt.return_value = True tests.create_projects(self.session) - repo = pagure.get_authorized_project(self.session, 'test') + repo = pagure.lib._get_project(self.session, 'test') # Before issues = pagure.lib.search_issues(self.session, repo) @@ -163,7 +163,7 @@ class PagureLibtests(tests.Modeltests): ) # Add an extra user to project `foo` - repo = pagure.get_authorized_project(self.session, 'test') + repo = pagure.lib._get_project(self.session, 'test') msg = pagure.lib.add_user_to_project( session=self.session, project=repo, @@ -226,7 +226,7 @@ class PagureLibtests(tests.Modeltests): self.test_new_issue() - repo = pagure.get_authorized_project(self.session, 'test') + repo = pagure.lib._get_project(self.session, 'test') issue = pagure.lib.search_issues(self.session, repo, issueid=2) self.assertEqual(repo.open_tickets, 2) @@ -274,7 +274,7 @@ class PagureLibtests(tests.Modeltests): ] ) - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.lib._get_project(self.session, 'test') self.assertEqual(repo.open_tickets, 1) self.assertEqual(repo.open_tickets_public, 1) self.assertEqual(repo.issues[1].status, 'Closed') @@ -293,7 +293,7 @@ class PagureLibtests(tests.Modeltests): self.assertEqual( msg, ['Issue status updated to: Open (was: Closed)']) - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.lib._get_project(self.session, 'test') for issue in repo.issues: self.assertEqual(issue.status, 'Open') self.assertEqual(issue.close_status, None) @@ -320,7 +320,7 @@ class PagureLibtests(tests.Modeltests): ] ) - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.lib._get_project(self.session, 'test') self.assertEqual(repo.open_tickets, 1) self.assertEqual(repo.open_tickets_public, 1) self.assertEqual(repo.issues[1].status, 'Closed') @@ -509,7 +509,7 @@ class PagureLibtests(tests.Modeltests): p_ugt.return_value = True self.test_new_issue() - repo = pagure.get_authorized_project(self.session, 'test') + repo = pagure.lib._get_project(self.session, 'test') issue = pagure.lib.search_issues(self.session, repo, issueid=1) issue_blocked = pagure.lib.search_issues( self.session, repo, issueid=2) @@ -561,7 +561,7 @@ class PagureLibtests(tests.Modeltests): p_ugt.return_value = True self.test_edit_issue() - repo = pagure.get_authorized_project(self.session, 'test') + repo = pagure.lib._get_project(self.session, 'test') issue = pagure.lib.search_issues(self.session, repo, issueid=1) # Add a tag to the issue @@ -599,7 +599,7 @@ class PagureLibtests(tests.Modeltests): p_ugt.return_value = True self.test_add_tag_obj() - repo = pagure.get_authorized_project(self.session, 'test') + repo = pagure.lib._get_project(self.session, 'test') issue = pagure.lib.search_issues(self.session, repo, issueid=1) self.assertRaises( pagure.exceptions.PagureException, @@ -627,7 +627,7 @@ class PagureLibtests(tests.Modeltests): p_ugt.return_value = True self.test_add_tag_obj() - repo = pagure.get_authorized_project(self.session, 'test') + repo = pagure.lib._get_project(self.session, 'test') issue = pagure.lib.search_issues(self.session, repo, issueid=1) msgs = pagure.lib.remove_tags_obj( @@ -683,7 +683,7 @@ class PagureLibtests(tests.Modeltests): p_ugt.return_value = True self.test_add_tag_obj() - repo = pagure.get_authorized_project(self.session, 'test') + repo = pagure.lib._get_project(self.session, 'test') issue = pagure.lib.search_issues(self.session, repo, issueid=1) self.assertRaises( @@ -723,6 +723,7 @@ class PagureLibtests(tests.Modeltests): ticketfolder=None, ) self.session.commit() + print msgs self.assertEqual( msgs, ['Edited tag: tag1()[DeepSkyBlue] to tag2(lorem ipsum)[black]'] @@ -775,7 +776,7 @@ class PagureLibtests(tests.Modeltests): p_ugt.return_value = True self.test_edit_issue() - repo = pagure.get_authorized_project(self.session, 'test') + repo = pagure.lib._get_project(self.session, 'test') # All issues issues = pagure.lib.search_issues(self.session, repo) @@ -848,7 +849,7 @@ class PagureLibtests(tests.Modeltests): p_ugt.return_value = True self.test_new_issue() - repo = pagure.get_authorized_project(self.session, 'test') + repo = pagure.lib._get_project(self.session, 'test') issue = pagure.lib.search_issues(self.session, repo, issueid=2) # Before @@ -952,7 +953,7 @@ class PagureLibtests(tests.Modeltests): p_ugt.return_value = True self.test_new_issue() - repo = pagure.get_authorized_project(self.session, 'test') + repo = pagure.lib._get_project(self.session, 'test') # Before issue = pagure.lib.search_issues(self.session, repo, issueid=1) @@ -993,7 +994,7 @@ class PagureLibtests(tests.Modeltests): tests.create_projects(self.session) # Before - repo = pagure.get_authorized_project(self.session, 'test') + repo = pagure.lib._get_project(self.session, 'test') self.assertEqual(len(repo.users), 0) # Add an user to a project @@ -1016,7 +1017,7 @@ class PagureLibtests(tests.Modeltests): self.assertEqual(msg, 'User added') # After - repo = pagure.get_authorized_project(self.session, 'test') + repo = pagure.lib._get_project(self.session, 'test') self.assertEqual(len(repo.users), 1) self.assertEqual(repo.users[0].user, 'foo') self.assertEqual(repo.admins[0].user, 'foo') @@ -1321,7 +1322,7 @@ class PagureLibtests(tests.Modeltests): self.session.commit() self.assertEqual(msg, 'Project "pingou/testproject" created') - repo = pagure.lib.get_project( + repo = pagure.lib._get_project( self.session, 'testproject', namespace='pingou') self.assertEqual(repo.path, 'pingou/testproject.git') @@ -1354,7 +1355,7 @@ class PagureLibtests(tests.Modeltests): self.session.commit() self.assertEqual(msg, 'Project "testns/testproject2" created') - repo = pagure.lib.get_project( + repo = pagure.lib._get_project( self.session, 'testproject2', namespace='testns') self.assertEqual(repo.path, 'testns/testproject2.git') @@ -1374,7 +1375,7 @@ class PagureLibtests(tests.Modeltests): tests.create_projects(self.session) # Before - repo = pagure.get_authorized_project(self.session, 'test2') + repo = pagure.lib._get_project(self.session, 'test2') self.assertTrue(repo.settings['issue_tracker']) self.assertFalse(repo.settings['project_documentation']) @@ -1431,7 +1432,7 @@ class PagureLibtests(tests.Modeltests): self.assertEqual(args[1]['topic'], 'project.edit') # After - repo = pagure.get_authorized_project(self.session, 'test2') + repo = pagure.lib._get_project(self.session, 'test2') self.assertFalse(repo.settings['issue_tracker']) self.assertTrue(repo.settings['project_documentation']) self.assertFalse(repo.settings['pull_requests']) @@ -1530,7 +1531,7 @@ class PagureLibtests(tests.Modeltests): """ Test the get_tags_of_project of pagure.lib. """ self.test_add_tag_obj() - repo = pagure.get_authorized_project(self.session, 'test') + repo = pagure.lib._get_project(self.session, 'test') tags = pagure.lib.get_tags_of_project(self.session, repo) self.assertEqual([tag.tag for tag in tags], ['tag1']) @@ -1539,7 +1540,7 @@ class PagureLibtests(tests.Modeltests): self.session, repo, pattern='T*') self.assertEqual([tag.tag for tag in tags], ['tag1']) - repo = pagure.get_authorized_project(self.session, 'test2') + repo = pagure.lib._get_project(self.session, 'test2') tags = pagure.lib.get_tags_of_project(self.session, repo) self.assertEqual([tag.tag for tag in tags], []) @@ -1680,7 +1681,7 @@ class PagureLibtests(tests.Modeltests): projects = pagure.lib.search_projects(self.session) self.assertEqual(len(projects), 1) - repo = pagure.get_authorized_project(self.session, 'testproject') + repo = pagure.lib._get_project(self.session, 'testproject') gitrepo = os.path.join(gitfolder, repo.path) docrepo = os.path.join(docfolder, repo.path) ticketrepo = os.path.join(ticketfolder, repo.path) @@ -1786,7 +1787,7 @@ class PagureLibtests(tests.Modeltests): # Fork a fork - repo = pagure.get_authorized_project( + repo = pagure.lib._get_project( self.session, 'testproject', user='foo') msg = pagure.lib.fork_project( @@ -1985,7 +1986,7 @@ class PagureLibtests(tests.Modeltests): self.session.add(item) # Add an extra user to project `foo` - repo = pagure.get_authorized_project(self.session, 'test') + repo = pagure.lib._get_project(self.session, 'test') self.assertEqual(repo.open_requests, 0) msg = pagure.lib.add_user_to_project( @@ -1997,8 +1998,8 @@ class PagureLibtests(tests.Modeltests): self.session.commit() self.assertEqual(msg, 'User added') - repo = pagure.get_authorized_project(self.session, 'test') - forked_repo = pagure.get_authorized_project( + repo = pagure.lib._get_project(self.session, 'test') + forked_repo = pagure.lib._get_project( self.session, 'test', user='pingou') req = pagure.lib.new_pull_request( @@ -2183,7 +2184,7 @@ class PagureLibtests(tests.Modeltests): self.test_new_pull_request() - repo = pagure.get_authorized_project(self.session, 'test') + repo = pagure.lib._get_project(self.session, 'test') self.assertEqual(repo.open_requests, 1) request = pagure.lib.search_pull_requests(self.session, requestid=1) @@ -2195,7 +2196,7 @@ class PagureLibtests(tests.Modeltests): merged=True, ) self.session.commit() - repo = pagure.get_authorized_project(self.session, 'test') + repo = pagure.lib._get_project(self.session, 'test') self.assertEqual(repo.open_requests, 0) prs = pagure.lib.search_pull_requests( @@ -2229,7 +2230,7 @@ class PagureLibtests(tests.Modeltests): p_ugt.return_value = True self.test_add_issue_dependency() - repo = pagure.get_authorized_project(self.session, 'test') + repo = pagure.lib._get_project(self.session, 'test') issue = pagure.lib.search_issues(self.session, repo, issueid=1) issue_blocked = pagure.lib.search_issues( self.session, repo, issueid=2) @@ -2289,7 +2290,7 @@ class PagureLibtests(tests.Modeltests): self.test_add_issue_comment() - repo = pagure.get_authorized_project(self.session, 'test') + repo = pagure.lib._get_project(self.session, 'test') issue = pagure.lib.search_issues(self.session, repo, issueid=1) self.assertEqual( @@ -2309,7 +2310,7 @@ class PagureLibtests(tests.Modeltests): self.test_new_issue() - repo = pagure.get_authorized_project(self.session, 'test') + repo = pagure.lib._get_project(self.session, 'test') issue = pagure.lib.search_issues(self.session, repo, issueid=1) self.assertEqual( @@ -2328,7 +2329,7 @@ class PagureLibtests(tests.Modeltests): p_ugt.return_value = True self.test_new_issue() - repo = pagure.get_authorized_project(self.session, 'test') + repo = pagure.lib._get_project(self.session, 'test') issue = pagure.lib.search_issues(self.session, repo, issueid=1) # before @@ -2376,7 +2377,7 @@ class PagureLibtests(tests.Modeltests): p_ugt.return_value = True self.test_new_issue() - repo = pagure.get_authorized_project(self.session, 'test') + repo = pagure.lib._get_project(self.session, 'test') issue = pagure.lib.search_issues(self.session, repo, issueid=1) self.assertEqual(repo.open_tickets, 2) @@ -2432,7 +2433,7 @@ class PagureLibtests(tests.Modeltests): p_ugt.return_value = True self.test_new_issue() - repo = pagure.get_authorized_project(self.session, 'test') + repo = pagure.lib._get_project(self.session, 'test') issue = pagure.lib.search_issues(self.session, repo, issueid=1) # Create issues to play with @@ -3050,7 +3051,7 @@ class PagureLibtests(tests.Modeltests): tests.create_projects(self.session) self.test_add_group() - project = pagure.get_authorized_project(self.session, 'test2') + project = pagure.lib._get_project(self.session, 'test2') # Group does not exist self.assertRaises( @@ -3133,7 +3134,7 @@ class PagureLibtests(tests.Modeltests): """ Test the update_watch_status method of pagure.lib. """ tests.create_projects(self.session) - project = pagure.get_authorized_project(self.session, 'test') + project = pagure.lib._get_project(self.session, 'test') # User does not exist self.assertRaises( @@ -3190,7 +3191,7 @@ class PagureLibtests(tests.Modeltests): tests.create_projects(self.session) self.test_add_group() - project = pagure.get_authorized_project(self.session, 'test') + project = pagure.lib._get_project(self.session, 'test') # If user not logged in watch = pagure.lib.is_watching( diff --git a/tests/test_pagure_lib_notify.py b/tests/test_pagure_lib_notify.py index 24115ee..1f6e891 100644 --- a/tests/test_pagure_lib_notify.py +++ b/tests/test_pagure_lib_notify.py @@ -161,7 +161,7 @@ class PagureLibNotifytests(tests.Modeltests): self.session.commit() # Watch the project - repo = pagure.lib.get_project(self.session, 'test3', namespace='ns') + repo = pagure.get_authorized_project(self.session, 'test3', namespace='ns') out = pagure.lib.update_watch_status(self.session, repo, 'bar', True) self.assertEqual(out, 'You are now watching this repo.') @@ -269,7 +269,7 @@ class PagureLibNotifytests(tests.Modeltests): self.session.commit() # Create the PR - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') req = pagure.lib.new_pull_request( session=self.session, repo_from=repo, @@ -322,7 +322,7 @@ class PagureLibNotifytests(tests.Modeltests): self.session.commit() # Watch the project - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') out = pagure.lib.update_watch_status(self.session, repo, 'bar', True) self.assertEqual(out, 'You are now watching this repo.') From 58dc47e0e2581b65db6ed523e3ea7dad37cebd10 Mon Sep 17 00:00:00 2001 From: Farhaan Bukhsh Date: Apr 14 2017 10:32:37 +0000 Subject: [PATCH 76/94] Fix alembic version --- diff --git a/alembic/versions/4255158a6913_create_private_column_in_project_table.py b/alembic/versions/4255158a6913_create_private_column_in_project_table.py index f489113..a65b545 100644 --- a/alembic/versions/4255158a6913_create_private_column_in_project_table.py +++ b/alembic/versions/4255158a6913_create_private_column_in_project_table.py @@ -1,21 +1,21 @@ """Create private column in project table Revision ID: 4255158a6913 -Revises: 317a285e04a8 +Revises: 208b0cd232ab Create Date: 2016-06-06 14:33:47.039207 """ # revision identifiers, used by Alembic. revision = '4255158a6913' -down_revision = '317a285e04a8' +down_revision = '208b0cd232ab' from alembic import op import sqlalchemy as sa def upgrade(): - ''' Add a pivate column in the project table + ''' Add a private column in the project table ''' op.add_column( 'projects', From 50c2f60f0fc7fdd36037d8cbfdcb04bf13e73c79 Mon Sep 17 00:00:00 2001 From: Farhaan Bukhsh Date: Apr 14 2017 10:32:37 +0000 Subject: [PATCH 77/94] Document the get_authorized_project function and change parameter name --- diff --git a/pagure/__init__.py b/pagure/__init__.py index 8d1f61e..e6fb234 100644 --- a/pagure/__init__.py +++ b/pagure/__init__.py @@ -374,12 +374,22 @@ def is_repo_user(repo_obj): ) or (user in usergrps) -def get_authorized_project(session, repo, user=None, namespace=None): - """ Return repo object if repo is public, - if repo is private and user is authorized to - view repo object is returned else None +def get_authorized_project(session, project_name, user=None, namespace=None): + """ Retrieving the project with user permission constraint + + :param session: The SQLAlchemy session to use + :type session: sqlalchemy.orm.session.Session + :param project_name: Name of the project on pagure + :type project_name: String + :param user: Pagure username + :type user: String + :param namespace: Pagure namespace + :type namespace: String + :return: The project object if project is public or user has + permissions for the project else it returns None + :rtype: pagure.lib.models.project """ - repo = pagure.lib._get_project(session, repo, user, namespace) + repo = pagure.lib._get_project(session, project_name, user, namespace) if repo and repo.private and not is_repo_admin(repo): return None From 94d1e1bb1ca52d3272b3b68020ea6310e3438125 Mon Sep 17 00:00:00 2001 From: Farhaan Bukhsh Date: Apr 14 2017 10:32:37 +0000 Subject: [PATCH 78/94] Fix tests after changing parameter name --- diff --git a/pagure/lib/__init__.py b/pagure/lib/__init__.py index 5008787..17759db 100644 --- a/pagure/lib/__init__.py +++ b/pagure/lib/__init__.py @@ -1112,9 +1112,7 @@ def add_pull_request_comment(session, request, commit, tree_id, filename, # Send notification for the event-source server if REDIS and not request.project.private: - comment_text = pr_comment.comment - if not notification: - comment_text = text2markdown(pr_comment.comment) + comment_text = text2markdown(pr_comment.comment) REDIS.publish('pagure.%s' % request.uid, json.dumps({ 'request_id': request.id, diff --git a/pagure/pfmarkdown.py b/pagure/pfmarkdown.py index 9566d19..ac6954d 100644 --- a/pagure/pfmarkdown.py +++ b/pagure/pfmarkdown.py @@ -316,7 +316,8 @@ def makeExtension(*arg, **kwargs): def _issue_exists(user, namespace, repo, idx): """ Utility method checking if a given issue exists. """ - repo_obj = pagure.get_authorized_project(pagure.SESSION, repo=repo, user=user, namespace=namespace) + repo_obj = pagure.get_authorized_project(pagure.SESSION, project_name=repo, + user=user, namespace=namespace) if not repo_obj: return False @@ -331,7 +332,8 @@ def _issue_exists(user, namespace, repo, idx): def _pr_exists(user, namespace, repo, idx): """ Utility method checking if a given PR exists. """ - repo_obj = pagure.get_authorized_project(pagure.SESSION, repo=repo, user=user, namespace=namespace) + repo_obj = pagure.get_authorized_project(pagure.SESSION, project_name=repo, + user=user, namespace=namespace) if not repo_obj: return False diff --git a/tests/test_pagure_lib.py b/tests/test_pagure_lib.py index 5600014..fbe35f9 100644 --- a/tests/test_pagure_lib.py +++ b/tests/test_pagure_lib.py @@ -723,7 +723,6 @@ class PagureLibtests(tests.Modeltests): ticketfolder=None, ) self.session.commit() - print msgs self.assertEqual( msgs, ['Edited tag: tag1()[DeepSkyBlue] to tag2(lorem ipsum)[black]'] diff --git a/tests/test_pagure_lib_model.py b/tests/test_pagure_lib_model.py index f2c1b79..ffdc3e4 100644 --- a/tests/test_pagure_lib_model.py +++ b/tests/test_pagure_lib_model.py @@ -147,7 +147,7 @@ class PagureLibModeltests(tests.Modeltests): def test_tagissuecolor__repr__(self): """ Test the TagIssue.__repr__ function of pagure.lib.model. """ self.test_issue__repr__() - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') issues = pagure.lib.search_issues(self.session, repo) self.assertEqual(len(issues), 1) From 079703f69547352f16db89e570a58681dd3c75d2 Mon Sep 17 00:00:00 2001 From: Farhaan Bukhsh Date: Apr 14 2017 10:32:37 +0000 Subject: [PATCH 79/94] Document code and fix condition to filter Code documentation is done as pointed by @pingou and @jcline The condition private == username is removed because there was no need to filter, the filtering needs to be done when a different user is viewing the projects. --- diff --git a/pagure/lib/__init__.py b/pagure/lib/__init__.py index 17759db..2b1b728 100644 --- a/pagure/lib/__init__.py +++ b/pagure/lib/__init__.py @@ -1997,14 +1997,9 @@ def search_projects( projects = projects.filter( model.Project.private == False ) - elif private == username: - projects = projects.filter( - sqlalchemy.or_( - model.Project.private == False, - model.Project.private == True, - ) - ) - elif isinstance(private, basestring): + # No filtering is done if private == username i.e if the owner of the + # project is viewing the project + elif isinstance(private, basestring) and private != username: projects = projects.filter( sqlalchemy.or_( model.Project.private == False, diff --git a/pagure/templates/settings.html b/pagure/templates/settings.html index 8894d29..7da9140 100644 --- a/pagure/templates/settings.html +++ b/pagure/templates/settings.html @@ -41,12 +41,14 @@ tags for project (separated by commas) -
-
+ {% if config.get('PRIVATE_PROJECTS', False) %} +
+
+ {% endif %} diff --git a/pagure/ui/app.py b/pagure/ui/app.py index 2a3ad95..aa10da2 100644 --- a/pagure/ui/app.py +++ b/pagure/ui/app.py @@ -181,6 +181,8 @@ def view_users(username=None): users = pagure.lib.search_user(SESSION, pattern=username) private = False + # Condition to check non-authorized user should't be able to access private + # project of other users if authenticated() and username == flask.g.fas_user.username: private = flask.g.fas_user.username diff --git a/pagure/ui/plugins.py b/pagure/ui/plugins.py index 6f79b0d..363a4b3 100644 --- a/pagure/ui/plugins.py +++ b/pagure/ui/plugins.py @@ -74,6 +74,9 @@ def view_plugin(repo, plugin, username=None, namespace=None, full=True): 403, 'You are not allowed to change the settings for this project') + # Private repos are not allowed to leak information outside so disabling CI + # enables us to keep the repos totally discreate and prevents from leaking + # information outside if repo.private and plugin == 'Pagure CI': flask.abort(404, 'Plugin disabled') From 2c0f6a6446b1902ab421b24b9f88015257a69933 Mon Sep 17 00:00:00 2001 From: Farhaan Bukhsh Date: Apr 14 2017 10:32:37 +0000 Subject: [PATCH 80/94] Fix tests --- diff --git a/tests/test_pagure_lib.py b/tests/test_pagure_lib.py index fbe35f9..6a3ad39 100644 --- a/tests/test_pagure_lib.py +++ b/tests/test_pagure_lib.py @@ -648,7 +648,7 @@ class PagureLibtests(tests.Modeltests): tests.create_projects(self.session) # Add a tag to the project - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') msg = pagure.lib.add_tag_obj( self.session, repo, tags=['pagure', 'test'], @@ -658,7 +658,7 @@ class PagureLibtests(tests.Modeltests): self.session.commit() # Check the tags - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') self.assertEqual(repo.tags_text, ['pagure', 'test']) # Remove one of the the tag @@ -672,7 +672,7 @@ class PagureLibtests(tests.Modeltests): self.session.commit() # Check the tags - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') self.assertEqual(repo.tags_text, ['pagure']) @patch('pagure.lib.git.update_git') @@ -2340,7 +2340,7 @@ class PagureLibtests(tests.Modeltests): self.assertEqual(messages, ['Issue tagged with: tag']) # after - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') issue = pagure.lib.search_issues(self.session, repo, issueid=1) self.assertEqual( @@ -2359,7 +2359,7 @@ class PagureLibtests(tests.Modeltests): ) # after - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') issue = pagure.lib.search_issues(self.session, repo, issueid=1) self.assertEqual( From bef1a5a4754d1fca80a814c0a8e77e248450ae60 Mon Sep 17 00:00:00 2001 From: Farhaan Bukhsh Date: Apr 14 2017 10:32:37 +0000 Subject: [PATCH 81/94] Add documetation about private repo --- diff --git a/doc/configuration.rst b/doc/configuration.rst index 8496dde..f212a7d 100644 --- a/doc/configuration.rst +++ b/doc/configuration.rst @@ -603,6 +603,17 @@ this pagure instance does not have a documentation server. Defaults to: ``None`` +PRIVATE_PROJECTS +~~~~~~~~~~~~~~~~ + +This configuration key allows you to host private repositories. These +repositories are visible only to the creator of the repository and to the +user who are given access to the repository. No information is leaked about the +private repository which means redis doesn't have the access to the repository +and even fedmsg doesn't get any notifications. + +Defaults to: ``False`` + EXCLUDE_GROUP_INDEX ~~~~~~~~~~~~~~~~~~~ diff --git a/tests/test_pagure_flask_ui_issues.py b/tests/test_pagure_flask_ui_issues.py index 8f491d5..3b86678 100644 --- a/tests/test_pagure_flask_ui_issues.py +++ b/tests/test_pagure_flask_ui_issues.py @@ -627,7 +627,7 @@ class PagureFlaskIssuestests(tests.Modeltests): self.assertEqual(output.status_code, 404) # Create issues to play with - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') msg = pagure.lib.new_issue( session=self.session, repo=repo, @@ -864,7 +864,7 @@ class PagureFlaskIssuestests(tests.Modeltests): self.assertNotIn(b'käpy'.decode('utf-8'), output.data) # Add a non-ascii milestone to the project - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') repo.milestones = {b'käpy'.decode('utf-8'): None} self.session.add(repo) self.session.commit() From baa162f01bab748a649d8449dd9afec295781ab2 Mon Sep 17 00:00:00 2001 From: Farhaan Bukhsh Date: Apr 14 2017 10:32:37 +0000 Subject: [PATCH 82/94] Fix the changes suggested by @vivekanad1101 --- diff --git a/alembic/versions/4255158a6913_create_private_column_in_project_table.py b/alembic/versions/4255158a6913_create_private_column_in_project_table.py index a65b545..dbeb1f3 100644 --- a/alembic/versions/4255158a6913_create_private_column_in_project_table.py +++ b/alembic/versions/4255158a6913_create_private_column_in_project_table.py @@ -8,7 +8,7 @@ Create Date: 2016-06-06 14:33:47.039207 # revision identifiers, used by Alembic. revision = '4255158a6913' -down_revision = '208b0cd232ab' +down_revision = '38581a8fbae2' from alembic import op import sqlalchemy as sa @@ -19,14 +19,14 @@ def upgrade(): ''' op.add_column( 'projects', - sa.Column('_private', sa.Boolean, nullable=True, default=False) + sa.Column('private', sa.Boolean, nullable=True, default=False) ) op.execute('''UPDATE "projects" ''' - '''SET _private=False;''') + '''SET private=False;''') op.alter_column( 'projects', - column_name='_private', new_column_name='private', + column_name='private', new_column_name='private', nullable=False, existing_nullable=True) diff --git a/ev-server/pagure_stream_server.py b/ev-server/pagure_stream_server.py index 66f62aa..0d74f1d 100644 --- a/ev-server/pagure_stream_server.py +++ b/ev-server/pagure_stream_server.py @@ -144,8 +144,9 @@ def get_obj_from_path(path): """ Return the Ticket or Request object based on the path provided. """ (username, namespace, reponame, objtype, objid) = _parse_path(path) - repo = pagure.get_authorized_project(pagure.SESSION, reponame, - user=username, namespace=namespace) + repo = pagure.get_authorized_project( + pagure.SESSION, reponame, user=username, namespace=namespace) + if repo is None: raise PagureEvException("Project '%s' not found" % reponame) diff --git a/pagure/__init__.py b/pagure/__init__.py index e6fb234..1d86f6a 100644 --- a/pagure/__init__.py +++ b/pagure/__init__.py @@ -502,8 +502,9 @@ def set_variables(): flask.g.repo = pagure.get_authorized_project( SESSION, repo, user=username, namespace=namespace) if authenticated(): - flask.g.repo_forked = pagure.get_authorized_project(SESSION, repo, user=flask.g.fas_user.username, - namespace=namespace) + flask.g.repo_forked = pagure.get_authorized_project( + SESSION, repo, user=flask.g.fas_user.username, + namespace=namespace) if not flask.g.repo \ and APP.config.get('OLD_VIEW_COMMIT_ENABLED', False) \ From bb7b7156594b15aa7f07f4326732155d965a9480 Mon Sep 17 00:00:00 2001 From: Farhaan Bukhsh Date: Apr 14 2017 10:32:37 +0000 Subject: [PATCH 83/94] Fix 80 character pep8 convention --- diff --git a/pagure/hooks/files/default_hook.py b/pagure/hooks/files/default_hook.py index 6c8ad3b..e679c4e 100755 --- a/pagure/hooks/files/default_hook.py +++ b/pagure/hooks/files/default_hook.py @@ -38,7 +38,8 @@ def run_as_post_receive_hook(): print('user:', username) print('namespace:', namespace) - project = pagure.get_authorized_project(pagure.SESSION, repo, user=username, namespace=namespace) + project = pagure.get_authorized_project( + pagure.SESSION, repo, user=username, namespace=namespace) for line in sys.stdin: if pagure.APP.config.get('HOOK_DEBUG', False): diff --git a/pagure/hooks/files/pagure_force_commit_hook.py b/pagure/hooks/files/pagure_force_commit_hook.py index 6377340..1fa5a20 100755 --- a/pagure/hooks/files/pagure_force_commit_hook.py +++ b/pagure/hooks/files/pagure_force_commit_hook.py @@ -33,7 +33,8 @@ def run_as_pre_receive_hook(): print 'user: ', username print 'namspaces:', namespace - repo = pagure.lib._get_project(pagure.SESSION, reponame, user=username, namespace=namespace) + repo = pagure.lib._get_project( + pagure.SESSION, reponame, user=username, namespace=namespace) if not repo: print 'Unknown repo %s of username: %s in namespace %s' % ( reponame, username, namespace) diff --git a/pagure/hooks/files/rtd_hook.py b/pagure/hooks/files/rtd_hook.py index 182fc26..c4c7371 100755 --- a/pagure/hooks/files/rtd_hook.py +++ b/pagure/hooks/files/rtd_hook.py @@ -35,13 +35,13 @@ def run_as_post_receive_hook(): print 'user: ', username print 'namespace:', namespace - repo = pagure.get_authorized_project(pagure.SESSION, reponame, user=username, namespace=namespace) + repo = pagure.get_authorized_project( + pagure.SESSION, reponame, user=username, namespace=namespace) if not repo: print 'Unknown repo %s of username: %s' % (reponame, username) sys.exit(1) plugin = pagure.lib.plugins.get_plugin('Read the Doc') - dbobj = plugin.db_object() # Get the list of branches branches = [ branch.strip() From 20a6979cc2e46e088a5dc244572a7bb5b816cb5b Mon Sep 17 00:00:00 2001 From: Farhaan Bukhsh Date: Apr 14 2017 10:32:37 +0000 Subject: [PATCH 84/94] Fix test after rebase --- diff --git a/tests/test_pagure_flask_api_issue.py b/tests/test_pagure_flask_api_issue.py index 2d8df2a..eb81126 100644 --- a/tests/test_pagure_flask_api_issue.py +++ b/tests/test_pagure_flask_api_issue.py @@ -3294,7 +3294,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): } ) - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') issue = pagure.lib.search_issues(self.session, repo, issueid=1) self.assertEqual(issue.other_fields, []) self.assertEqual(len(issue.other_fields), 0) @@ -3314,7 +3314,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): } ) - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') issue = pagure.lib.search_issues(self.session, repo, issueid=1) self.assertEqual(issue.other_fields, []) self.assertEqual(len(issue.other_fields), 0) @@ -3333,7 +3333,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): } ) - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') issue = pagure.lib.search_issues(self.session, repo, issueid=1) self.assertEqual(len(issue.other_fields), 1) self.assertEqual(issue.other_fields[0].key.name, 'bugzilla') @@ -3355,7 +3355,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): } ) - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') issue = pagure.lib.search_issues(self.session, repo, issueid=1) self.assertEqual(len(issue.other_fields), 0) diff --git a/tests/test_pagure_flask_api_ui_private_repo.py b/tests/test_pagure_flask_api_ui_private_repo.py index 40bd45c..183fede 100644 --- a/tests/test_pagure_flask_api_ui_private_repo.py +++ b/tests/test_pagure_flask_api_ui_private_repo.py @@ -34,7 +34,7 @@ FULL_ISSUE_LIST = [ "depends": [], "id": 8, "last_updated": "1431414800", - "milestone": None, + "milestone": "", "priority": None, "private": True, "status": "Open", @@ -57,7 +57,7 @@ FULL_ISSUE_LIST = [ "depends": [], "id": 7, "last_updated": "1431414800", - "milestone": None, + "milestone": "", "priority": None, "private": True, "status": "Open", @@ -80,7 +80,7 @@ FULL_ISSUE_LIST = [ "depends": [], "id": 6, "last_updated": "1431414800", - "milestone": None, + "milestone": "", "priority": None, "private": True, "status": "Open", @@ -103,7 +103,7 @@ FULL_ISSUE_LIST = [ "depends": [], "id": 5, "last_updated": "1431414800", - "milestone": None, + "milestone": "", "priority": None, "private": False, "status": "Open", @@ -126,7 +126,7 @@ FULL_ISSUE_LIST = [ "depends": [], "id": 4, "last_updated": "1431414800", - "milestone": None, + "milestone": "", "priority": None, "private": False, "status": "Open", @@ -149,7 +149,7 @@ FULL_ISSUE_LIST = [ "depends": [], "id": 3, "last_updated": "1431414800", - "milestone": None, + "milestone": "", "priority": None, "private": False, "status": "Open", @@ -172,7 +172,7 @@ FULL_ISSUE_LIST = [ "depends": [], "id": 2, "last_updated": "1431414800", - "milestone": None, + "milestone": "", "priority": None, "private": False, "status": "Open", @@ -195,7 +195,7 @@ FULL_ISSUE_LIST = [ "depends": [], "id": 1, "last_updated": "1431414800", - "milestone": None, + "milestone": "", "priority": None, "private": False, "status": "Open", @@ -1922,7 +1922,7 @@ class PagurePrivateRepotest(tests.Modeltests): "last_updated": "1431414800", "depends": [], "id": 1, - "milestone": None, + "milestone": "", "priority": None, "private": False, "status": "Open", @@ -1946,6 +1946,7 @@ class PagurePrivateRepotest(tests.Modeltests): title='Test issue', content='We should work on this', user='pingou', + milestone='', ticketfolder=None, private=True, ) @@ -1985,7 +1986,7 @@ class PagurePrivateRepotest(tests.Modeltests): "last_updated": "1431414800", "depends": [], "id": 2, - "milestone": None, + "milestone": "", "priority": None, "private": True, "status": "Open", @@ -2008,7 +2009,7 @@ class PagurePrivateRepotest(tests.Modeltests): "last_updated": "1431414800", "depends": [], "id": 1, - "milestone": None, + "milestone": "", "priority": None, "private": False, "status": "Open", @@ -2063,7 +2064,7 @@ class PagurePrivateRepotest(tests.Modeltests): "last_updated": "1431414800", "depends": [], "id": 2, - "milestone": None, + "milestone": "", "priority": None, "private": True, "status": "Open", @@ -2086,7 +2087,7 @@ class PagurePrivateRepotest(tests.Modeltests): "last_updated": "1431414800", "depends": [], "id": 1, - "milestone": None, + "milestone": "", "priority": None, "private": False, "status": "Open", @@ -2175,7 +2176,7 @@ class PagurePrivateRepotest(tests.Modeltests): "last_updated": "1431414800", "depends": [], "id": 2, - "milestone": None, + "milestone": "", "priority": None, "private": True, "status": "Open", @@ -2198,7 +2199,7 @@ class PagurePrivateRepotest(tests.Modeltests): "last_updated": "1431414800", "depends": [], "id": 1, - "milestone": None, + "milestone": "", "priority": None, "private": False, "status": "Open", @@ -2279,7 +2280,7 @@ class PagurePrivateRepotest(tests.Modeltests): "depends": [], "id": 1, "last_updated": "1431414800", - "milestone": None, + "milestone": "", "priority": None, "private": False, "status": "Open", @@ -2329,7 +2330,7 @@ class PagurePrivateRepotest(tests.Modeltests): "depends": [], "id": 1, "last_updated": "1431414800", - "milestone": None, + "milestone": "", "priority": None, "private": False, "status": "Open", From 37ce71057bca8b68b6bcd1f3b906424dc5e33c45 Mon Sep 17 00:00:00 2001 From: Farhaan Bukhsh Date: Apr 14 2017 10:32:37 +0000 Subject: [PATCH 85/94] Replacing get_project by get_authorized project after rebase --- diff --git a/pagure/pfmarkdown.py b/pagure/pfmarkdown.py index ac6954d..61d2b57 100644 --- a/pagure/pfmarkdown.py +++ b/pagure/pfmarkdown.py @@ -348,8 +348,8 @@ def _pr_exists(user, namespace, repo, idx): def _commit_exists(user, namespace, repo, githash): """ Utility method checking if a given commit exists. """ - repo_obj = pagure.lib.get_project( - pagure.SESSION, name=repo, user=user, namespace=namespace) + repo_obj = pagure.get_authorized_project( + pagure.SESSION, project_name=repo, user=user, namespace=namespace) if not repo_obj: return False From 40e9bdaf6d8a83d575568fad7cc64a6b56596f15 Mon Sep 17 00:00:00 2001 From: Farhaan Bukhsh Date: Apr 14 2017 10:32:37 +0000 Subject: [PATCH 86/94] Fix test for private repo --- diff --git a/tests/test_pagure_exclude_group_index.py b/tests/test_pagure_exclude_group_index.py index 295de5a..37cf7d3 100644 --- a/tests/test_pagure_exclude_group_index.py +++ b/tests/test_pagure_exclude_group_index.py @@ -21,6 +21,7 @@ import mock sys.path.insert(0, os.path.join(os.path.dirname( os.path.abspath(__file__)), '..')) +import pagure import pagure.lib import pagure.lib.model import tests @@ -52,7 +53,7 @@ class PagureExcludeGroupIndex(tests.Modeltests): msg, 'User `pingou` added to the group `provenpackager`.') # Add the `provenpackager` group to the test2 project - project = pagure.lib.get_project(self.session, 'test2') + project = pagure.get_authorized_project(self.session, 'test2') msg = pagure.lib.add_group_to_project( session=self.session, project=project, diff --git a/tests/test_pagure_flask_api_issue.py b/tests/test_pagure_flask_api_issue.py index eb81126..82c3ebe 100644 --- a/tests/test_pagure_flask_api_issue.py +++ b/tests/test_pagure_flask_api_issue.py @@ -1997,6 +1997,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): '/api/0/test/issue/1/status', data=data, headers=headers) self.assertEqual(output.status_code, 200) data = json.loads(output.data) + self.assertDictEqual( data, {'message':[ diff --git a/tests/test_pagure_flask_api_ui_private_repo.py b/tests/test_pagure_flask_api_ui_private_repo.py index 183fede..b08cc14 100644 --- a/tests/test_pagure_flask_api_ui_private_repo.py +++ b/tests/test_pagure_flask_api_ui_private_repo.py @@ -884,7 +884,7 @@ class PagurePrivateRepotest(tests.Modeltests): output = pagure.lib.update_tags( self.session, repo, 'infra', 'pingou', ticketfolder=None) - self.assertEqual(output, ['Tag added: infra']) + self.assertEqual(output, ['Issue tagged with: infra']) # Check after adding repo = pagure.lib._get_project(self.session, 'test4') @@ -2483,7 +2483,10 @@ class PagurePrivateRepotest(tests.Modeltests): data = json.loads(output.get_data(as_text=True)) self.assertDictEqual( data, - {'message': 'Successfully edited issue #1'} + {'message':[ + 'Issue status updated to: Closed (was: Open)', + 'Issue close_status updated to: Fixed' + ]} ) @patch('pagure.lib.git.update_git') diff --git a/tests/test_pagure_flask_ui_repo.py b/tests/test_pagure_flask_ui_repo.py index 05eea20..f72770b 100644 --- a/tests/test_pagure_flask_ui_repo.py +++ b/tests/test_pagure_flask_ui_repo.py @@ -569,7 +569,7 @@ class PagureFlaskRepotests(tests.Modeltests): self.assertIn('Deploy key does not exist in project', output.data) # Add a deploy key to a project - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') msg = pagure.lib.add_deploykey_to_project( session=self.session, project=repo, diff --git a/tests/test_pagure_lib_drop_issue.py b/tests/test_pagure_lib_drop_issue.py index 56a103b..abc9965 100644 --- a/tests/test_pagure_lib_drop_issue.py +++ b/tests/test_pagure_lib_drop_issue.py @@ -21,6 +21,7 @@ from mock import patch, MagicMock sys.path.insert(0, os.path.join(os.path.dirname( os.path.abspath(__file__)), '..')) +import pagure import pagure.lib import pagure.lib.model import tests @@ -42,7 +43,7 @@ class PagureLibDropIssuetests(tests.Modeltests): tests.create_projects(self.session) - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') # Before issues = pagure.lib.search_issues(self.session, repo) @@ -92,7 +93,7 @@ class PagureLibDropIssuetests(tests.Modeltests): ) self.session.commit() - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') self.assertEqual( str(repo.tags_colored), '[TagColored(id: 1, tag:red, tag_description:red tag, color:#ff0000)]' @@ -110,7 +111,7 @@ class PagureLibDropIssuetests(tests.Modeltests): p_send_email.return_value = True p_ugt.return_value = True - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') # Add tag to the second issue issue = pagure.lib.search_issues(self.session, repo, issueid=2) @@ -125,7 +126,7 @@ class PagureLibDropIssuetests(tests.Modeltests): self.assertEqual(msgs, ['Issue tagged with: red']) - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') self.assertEqual(len(repo.issues), 2) issue = pagure.lib.search_issues(self.session, repo, issueid=2) self.assertEqual( @@ -139,7 +140,7 @@ class PagureLibDropIssuetests(tests.Modeltests): self.session, issue, user='pingou', ticketfolder=None) self.session.commit() - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') self.assertEqual(len(repo.issues), 1) @patch('pagure.lib.git.update_git') @@ -154,7 +155,7 @@ class PagureLibDropIssuetests(tests.Modeltests): p_send_email.return_value = True p_ugt.return_value = True - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') # Add the tag to both issues issue = pagure.lib.search_issues(self.session, repo, issueid=1) @@ -179,7 +180,7 @@ class PagureLibDropIssuetests(tests.Modeltests): self.session.commit() self.assertEqual(msgs, ['Issue tagged with: red']) - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') self.assertEqual(len(repo.issues), 2) issue = pagure.lib.search_issues(self.session, repo, issueid=1) self.assertEqual( @@ -198,7 +199,7 @@ class PagureLibDropIssuetests(tests.Modeltests): self.session, issue, user='pingou', ticketfolder=None) self.session.commit() - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') self.assertEqual(len(repo.issues), 1) issue = pagure.lib.search_issues(self.session, repo, issueid=1) diff --git a/tests/test_pagure_lib_git.py b/tests/test_pagure_lib_git.py index c731eda..6a38c0f 100644 --- a/tests/test_pagure_lib_git.py +++ b/tests/test_pagure_lib_git.py @@ -159,7 +159,7 @@ repo requests/forks/pingou/test3 """ Test write_gitolite_acls function to add deploy keys. """ tests.create_projects(self.session) - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') # Add two deploy keys (one readonly one push) msg1 = pagure.lib.add_deploykey_to_project( session=self.session, From cf3b53bebfd69edbd10be0403e93d27240afe898 Mon Sep 17 00:00:00 2001 From: Farhaan Bukhsh Date: Apr 14 2017 10:32:37 +0000 Subject: [PATCH 87/94] Refactor code to have lesser check for sending notification The check for the project being private or not is moved to lib.notify so that there will be less code in lib/__init__.py --- diff --git a/pagure/lib/__init__.py b/pagure/lib/__init__.py index 2b1b728..69c97e6 100644 --- a/pagure/lib/__init__.py +++ b/pagure/lib/__init__.py @@ -326,7 +326,7 @@ def add_issue_comment(session, issue, comment, user, ticketfolder, if notify: pagure.lib.notify.notify_new_comment(issue_comment, user=user_obj) - if not issue.private and not issue.project.private: + if not issue.private: pagure.lib.notify.log( issue.project, topic='issue.comment.added', @@ -420,7 +420,7 @@ def add_tag_obj(session, obj, tags, user, ticketfolder): pagure.lib.git.update_git( obj, repo=obj.project, repofolder=ticketfolder) - if not obj.private and not obj.project.private: + if not obj.private: pagure.lib.notify.log( obj.project, topic='issue.tag.added', @@ -462,7 +462,7 @@ def add_issue_assignee(session, issue, assignee, user, ticketfolder, if notify: pagure.lib.notify.notify_assigned_issue(issue, None, user_obj) - if not issue.private and not issue.project.private: + if not issue.private: pagure.lib.notify.log( issue.project, topic='issue.assigned.reset', @@ -498,7 +498,7 @@ def add_issue_assignee(session, issue, assignee, user, ticketfolder, pagure.lib.notify.notify_assigned_issue( issue, assignee_obj, user_obj) - if not issue.private and not issue.project.private: + if not issue.private: pagure.lib.notify.log( issue.project, topic='issue.assigned.added', @@ -538,17 +538,16 @@ def add_pull_request_assignee( pagure.lib.notify.notify_assigned_request(request, None, user_obj) - if not request.project.private: - pagure.lib.notify.log( - request.project, - topic='request.assigned.reset', - msg=dict( - request=request.to_json(public=True), - project=request.project.to_json(public=True), - agent=user_obj.username, - ), - redis=REDIS, - ) + pagure.lib.notify.log( + request.project, + topic='request.assigned.reset', + msg=dict( + request=request.to_json(public=True), + project=request.project.to_json(public=True), + agent=user_obj.username, + ), + redis=REDIS, + ) return 'Request reset' elif assignee is None and request.assignee is None: @@ -568,17 +567,16 @@ def add_pull_request_assignee( pagure.lib.notify.notify_assigned_request( request, assignee_obj, user_obj) - if not request.project.private: - pagure.lib.notify.log( - request.project, - topic='request.assigned.added', - msg=dict( - request=request.to_json(public=True), - project=request.project.to_json(public=True), - agent=user_obj.username, - ), - redis=REDIS, - ) + pagure.lib.notify.log( + request.project, + topic='request.assigned.added', + msg=dict( + request=request.to_json(public=True), + project=request.project.to_json(public=True), + agent=user_obj.username, + ), + redis=REDIS, + ) return 'Request assigned' @@ -613,6 +611,8 @@ def add_issue_dependency( if not issue.private: #pagure.lib.notify.notify_assigned_issue(issue, user_obj) #pagure.lib.notify.notify_assigned_issue(issue_blocked, user_obj) + + if not issue.private: pagure.lib.notify.log( issue.project, topic='issue.dependency.added', @@ -672,6 +672,8 @@ def remove_issue_dependency( if not issue.private: #pagure.lib.notify.notify_assigned_issue(issue, user_obj) #pagure.lib.notify.notify_assigned_issue(issue_blocked, user_obj) + + if not issue.private: pagure.lib.notify.log( issue.project, topic='issue.dependency.removed', @@ -773,18 +775,17 @@ def remove_tags_obj(session, obj, tags, ticketfolder, user): pagure.lib.git.update_git( obj, repo=obj.project, repofolder=ticketfolder) - if not obj.project.private: - pagure.lib.notify.log( - obj.project, - topic='issue.tag.removed', - msg=dict( - issue=obj.to_json(public=True), - project=obj.project.to_json(public=True), - tags=removed_tags, - agent=user_obj.username, - ), - redis=REDIS, - ) + pagure.lib.notify.log( + obj.project, + topic='issue.tag.removed', + msg=dict( + issue=obj.to_json(public=True), + project=obj.project.to_json(public=True), + tags=removed_tags, + agent=user_obj.username, + ), + redis=REDIS, + ) # Send notification for the event-source server if REDIS and not obj.project.private: @@ -1139,16 +1140,15 @@ def add_pull_request_comment(session, request, commit, tree_id, filename, 'pr': request.to_json(public=True, with_comments=False) })) - if not request.project.private: - pagure.lib.notify.log( - request.project, - topic='pull-request.comment.added', - msg=dict( - pullrequest=request.to_json(public=True), - agent=user_obj.username, - ), - redis=REDIS, - ) + pagure.lib.notify.log( + request.project, + topic='pull-request.comment.added', + msg=dict( + pullrequest=request.to_json(public=True), + agent=user_obj.username, + ), + redis=REDIS, + ) if trigger_ci and comment.strip().lower() in trigger_ci: # Send notification to the CI server @@ -1192,18 +1192,17 @@ def edit_comment(session, parent, comment, user, id_ = 'issue_id' private = parent.private - if not private: - pagure.lib.notify.log( - parent.project, - topic=topic, - msg={ - key: parent.to_json(public=True, with_comments=False), - 'project': parent.project.to_json(public=True), - 'comment': comment.to_json(public=True), - 'agent': user_obj.username, - }, - redis=REDIS, - ) + pagure.lib.notify.log( + parent.project, + topic=topic, + msg={ + key: parent.to_json(public=True, with_comments=False), + 'project': parent.project.to_json(public=True), + 'comment': comment.to_json(public=True), + 'agent': user_obj.username, + }, + redis=REDIS, + ) if REDIS and not parent.project.private: if private: @@ -1257,17 +1256,16 @@ def add_pull_request_flag(session, request, username, percent, comment, url, pagure.lib.git.update_git( request, repo=request.project, repofolder=requestfolder) - if not request.project.private: - pagure.lib.notify.log( - request.project, - topic='pull-request.flag.%s' % action, - msg=dict( - pullrequest=request.to_json(public=True), - flag=pr_flag.to_json(public=True), - agent=user_obj.username, - ), - redis=REDIS, - ) + pagure.lib.notify.log( + request.project, + topic='pull-request.flag.%s' % action, + msg=dict( + pullrequest=request.to_json(public=True), + flag=pr_flag.to_json(public=True), + agent=user_obj.username, + ), + redis=REDIS, + ) return 'Flag %s' % action @@ -1430,15 +1428,14 @@ def new_project(session, user, name, blacklist, allowed_prefix, log_action(session, 'created', project, user_obj) - if not project.private: - pagure.lib.notify.log( - project, - topic='project.new', - msg=dict( - project=project.to_json(public=True), - agent=user_obj.username, - ), - ) + pagure.lib.notify.log( + project, + topic='project.new', + msg=dict( + project=project.to_json(public=True), + agent=user_obj.username, + ), + ) return 'Project "%s" created' % ( '%s/%s' % (project.namespace, project.name) if project.namespace @@ -1493,7 +1490,7 @@ def new_issue(session, repo, title, content, user, ticketfolder, issue_id=None, if notify: pagure.lib.notify.notify_new_issue(issue, user=user_obj) - if not private and not issue.project.private: + if not private: pagure.lib.notify.log( issue.project, topic='issue.new', @@ -1521,7 +1518,7 @@ def drop_issue(session, issue, user, ticketfolder): pagure.lib.git.clean_git( issue, repo=issue.project, repofolder=ticketfolder) - if not private and not issue.project.private: + if not private: pagure.lib.notify.log( issue.project, topic='issue.drop', @@ -1580,16 +1577,15 @@ def new_pull_request(session, branch_from, if notify: pagure.lib.notify.notify_new_pull_request(request) - if not request.project.private: - pagure.lib.notify.log( - request.project, - topic='pull-request.new', - msg=dict( - pullrequest=request.to_json(public=True), - agent=user_obj.username, - ), - redis=REDIS, - ) + pagure.lib.notify.log( + request.project, + topic='pull-request.new', + msg=dict( + pullrequest=request.to_json(public=True), + agent=user_obj.username, + ), + redis=REDIS, + ) # Send notification to the CI server if REDIS and request.project.ci_hook and PAGURE_CI \ @@ -1703,7 +1699,7 @@ def edit_issue(session, issue, ticketfolder, user, repo=None, log_action(session, status.lower(), issue, user_obj) pagure.lib.notify.notify_status_change_issue(issue, user_obj) - if not issue.private and edit and not issue.project.private: + if not issue.private and edit: pagure.lib.notify.log( issue.project, topic='issue.edit', @@ -1777,17 +1773,16 @@ def update_project_settings(session, repo, settings, user): session.add(repo) session.flush() - if not repo.private: - pagure.lib.notify.log( - repo, - topic='project.edit', - msg=dict( - project=repo.to_json(public=True), - fields=update, - agent=user_obj.username, - ), - redis=REDIS, - ) + pagure.lib.notify.log( + repo, + topic='project.edit', + msg=dict( + project=repo.to_json(public=True), + fields=update, + agent=user_obj.username, + ), + redis=REDIS, + ) return 'Edited successfully settings of repo: %s' % repo.fullname @@ -1898,15 +1893,14 @@ def fork_project(session, user, repo, gitfolder, requestrepo, bare=True, mode=pygit2.C.GIT_REPOSITORY_INIT_SHARED_GROUP) - if not project.private: - pagure.lib.notify.log( - project, - topic='project.forked', - msg=dict( - project=project.to_json(public=True), - agent=user_obj.username, - ), - ) + pagure.lib.notify.log( + project, + topic='project.forked', + msg=dict( + project=project.to_json(public=True), + agent=user_obj.username, + ), + ) return 'Repo "{0}" cloned to "{1}/{0}"'.format( '%s/%s' % (repo.namespace, repo.name) if repo.namespace else repo.name, @@ -2585,17 +2579,16 @@ def close_pull_request(session, request, user, requestfolder, merged=True): notify=False, notification=True ) - if not request.project.private: - pagure.lib.notify.log( - request.project, - topic='pull-request.closed', - msg=dict( - pullrequest=request.to_json(public=True), - merged=merged, - agent=user_obj.username, - ), - redis=REDIS, - ) + pagure.lib.notify.log( + request.project, + topic='pull-request.closed', + msg=dict( + pullrequest=request.to_json(public=True), + merged=merged, + agent=user_obj.username, + ), + redis=REDIS, + ) def reset_status_pull_request(session, project): diff --git a/pagure/lib/notify.py b/pagure/lib/notify.py index a04957b..54c4863 100644 --- a/pagure/lib/notify.py +++ b/pagure/lib/notify.py @@ -53,18 +53,20 @@ def log(project, topic, msg, redis=None): ''' This is the place where we send notifications to user about actions occuring in pagure. ''' - # Send fedmsg notification (if fedmsg is there and set-up) - if not project or project.settings.get('fedmsg_notifications', True): - fedmsg_publish(topic, msg) - - if redis and project: - redis.publish( - 'pagure.hook', - json.dumps({ - 'project': project.fullname, - 'topic': topic, - 'msg': msg, - })) + # Check so that no information regarding private project is leaked + if not project.private: + # Send fedmsg notification (if fedmsg is there and set-up) + if not project or project.settings.get('fedmsg_notifications', True): + fedmsg_publish(topic, msg) + + if redis and project: + redis.publish( + 'pagure.hook', + json.dumps({ + 'project': project.fullname, + 'topic': topic, + 'msg': msg, + })) def _add_mentioned_users(emails, comment): From 83b88ccec9f1b1ae2986295b5a0687dc6d3923bd Mon Sep 17 00:00:00 2001 From: Farhaan Bukhsh Date: Apr 14 2017 10:32:37 +0000 Subject: [PATCH 88/94] Fix docstring for get_authorized_project --- diff --git a/pagure/__init__.py b/pagure/__init__.py index 1d86f6a..7c30903 100644 --- a/pagure/__init__.py +++ b/pagure/__init__.py @@ -375,20 +375,21 @@ def is_repo_user(repo_obj): def get_authorized_project(session, project_name, user=None, namespace=None): - """ Retrieving the project with user permission constraint - - :param session: The SQLAlchemy session to use - :type session: sqlalchemy.orm.session.Session - :param project_name: Name of the project on pagure - :type project_name: String - :param user: Pagure username - :type user: String - :param namespace: Pagure namespace - :type namespace: String - :return: The project object if project is public or user has - permissions for the project else it returns None - :rtype: pagure.lib.models.project - """ + ''' Retrieving the project with user permission constraint + + :arg session: The SQLAlchemy session to use + :type session: sqlalchemy.orm.session.Session + :arg project_name: Name of the project on pagure + :type project_name: String + :arg user: Pagure username + :type user: String + :arg namespace: Pagure namespace + :type namespace: String + :return: The project object if project is public or user has + permissions for the project else it returns None + :rtype: Project or [Project] + + ''' repo = pagure.lib._get_project(session, project_name, user, namespace) if repo and repo.private and not is_repo_admin(repo): From 94c9f05b0d00c84682bbe8a00f6b1c4866445c99 Mon Sep 17 00:00:00 2001 From: Farhaan Bukhsh Date: Apr 14 2017 10:32:37 +0000 Subject: [PATCH 89/94] Fix the check for project=None --- diff --git a/pagure/lib/notify.py b/pagure/lib/notify.py index 54c4863..f7b2fd7 100644 --- a/pagure/lib/notify.py +++ b/pagure/lib/notify.py @@ -53,20 +53,20 @@ def log(project, topic, msg, redis=None): ''' This is the place where we send notifications to user about actions occuring in pagure. ''' - # Check so that no information regarding private project is leaked - if not project.private: - # Send fedmsg notification (if fedmsg is there and set-up) - if not project or project.settings.get('fedmsg_notifications', True): - fedmsg_publish(topic, msg) - - if redis and project: - redis.publish( - 'pagure.hook', - json.dumps({ - 'project': project.fullname, - 'topic': topic, - 'msg': msg, - })) + + # Send fedmsg notification (if fedmsg is there and set-up) + if not project or (project.settings.get('fedmsg_notifications', True) + and not project.private): + fedmsg_publish(topic, msg) + + if redis and project and not project.private: + redis.publish( + 'pagure.hook', + json.dumps({ + 'project': project.fullname, + 'topic': topic, + 'msg': msg, + })) def _add_mentioned_users(emails, comment): From 880d17cc74179733523042e92fd272dfa0339af7 Mon Sep 17 00:00:00 2001 From: Farhaan Bukhsh Date: Apr 14 2017 10:32:37 +0000 Subject: [PATCH 90/94] Fix private-repo feature after rebase --- diff --git a/pagure/lib/__init__.py b/pagure/lib/__init__.py index 69c97e6..c7077da 100644 --- a/pagure/lib/__init__.py +++ b/pagure/lib/__init__.py @@ -1324,7 +1324,7 @@ def new_project(session, user, name, blacklist, allowed_prefix, ) # Repo exists in the DB - repo = pagure.lib.get_project(session, name, namespace=namespace) + repo = pagure.get_authorized_project(session, name, namespace=namespace) if repo: raise pagure.exceptions.RepoExistsException( 'The project repo "%s" already exists in the database' % ( diff --git a/tests/test_pagure_lib.py b/tests/test_pagure_lib.py index 6a3ad39..7669e14 100644 --- a/tests/test_pagure_lib.py +++ b/tests/test_pagure_lib.py @@ -1179,7 +1179,7 @@ class PagureLibtests(tests.Modeltests): self.session.rollback() # Re-create it, ignoring the existing repos on disk - repo = pagure.lib.get_project(self.session, 'testproject') + repo = pagure.lib._get_project(self.session, 'testproject') self.session.delete(repo) self.session.commit() diff --git a/tests/test_pagure_lib_model.py b/tests/test_pagure_lib_model.py index ffdc3e4..f3223e9 100644 --- a/tests/test_pagure_lib_model.py +++ b/tests/test_pagure_lib_model.py @@ -218,7 +218,7 @@ class PagureLibModeltests(tests.Modeltests): for ns, reponame in [ (None, 'aaa'), (None, 'KKK'), ('somenamespace', 'zzz')]: - repo = pagure.lib.get_project( + repo = pagure.get_authorized_project( self.session, reponame, namespace=ns) msg = pagure.lib.add_group_to_project( self.session, From e498a136f14f91cbd90854c5bbe694debcba144a Mon Sep 17 00:00:00 2001 From: Farhaan Bukhsh Date: Apr 14 2017 10:32:37 +0000 Subject: [PATCH 91/94] Fix test cases and replace get_project after acl This commit fix various test case failing after recent rebase and merging of acl, the test for private repo has also been updated with new issue structure. Signed-off-by: Farhaan Bukhsh --- diff --git a/pagure-loadjson/pagure_loadjson_server.py b/pagure-loadjson/pagure_loadjson_server.py index 1a10a52..d00f4cd 100644 --- a/pagure-loadjson/pagure_loadjson_server.py +++ b/pagure-loadjson/pagure_loadjson_server.py @@ -158,7 +158,7 @@ def handle_messages(): _log.info('Looking for project: %s%s of user: %s', '%s/' % namespace if namespace else '', repo, username) - project = pagure.lib.get_project( + project = pagure.lib._get_project( session, repo, user=username, namespace=namespace) if not project: diff --git a/pagure-logcom/pagure_logcom_server.py b/pagure-logcom/pagure_logcom_server.py index 0861610..fdb4cb1 100644 --- a/pagure-logcom/pagure_logcom_server.py +++ b/pagure-logcom/pagure_logcom_server.py @@ -21,7 +21,6 @@ import json import logging import os -import requests import trollius import trollius_redis @@ -99,7 +98,7 @@ def handle_messages(): _log.info('Looking for project: %s%s of %s', '%s/' % namespacerepo if namespace else '', repo, username) - project = pagure.lib.get_project( + project = pagure.lib._get_project( pagure.SESSION, repo, user=username, namespace=namespace) if not project: diff --git a/pagure/api/fork.py b/pagure/api/fork.py index ad554b7..c009e8a 100644 --- a/pagure/api/fork.py +++ b/pagure/api/fork.py @@ -493,11 +493,7 @@ def api_pull_request_add_comment( "message": "Comment added" } -<<<<<<< a8fb3f131e9001d3b8a7952180d3f92540aea426 """ # noqa -======= - """ ->>>>>>> Fix using get_authorized_project in api/fork repo = pagure.get_authorized_project(SESSION, repo, user=username, namespace=namespace) output = {} diff --git a/pagure/hooks/files/pagure_hook_tickets.py b/pagure/hooks/files/pagure_hook_tickets.py index 84b1150..a0c847c 100755 --- a/pagure/hooks/files/pagure_hook_tickets.py +++ b/pagure/hooks/files/pagure_hook_tickets.py @@ -38,7 +38,7 @@ def run_as_post_receive_hook(): print('user:', username) print('namespace:', namespace) - project = pagure.lib.get_project( + project = pagure.lib._get_project( pagure.SESSION, repo, user=username, namespace=namespace) for line in sys.stdin: @@ -65,14 +65,14 @@ def run_as_post_receive_hook(): if REDIS: print('Sending to redis to load the data') REDIS.publish('pagure.loadjson', - json.dumps({ - 'project': project.to_json(public=True), - 'abspath': abspath, - 'commits': commits, - 'data_type': 'ticket', - 'agent': os.environ.get('GL_USER'), - } - )) + json.dumps({ + 'project': project.to_json(public=True), + 'abspath': abspath, + 'commits': commits, + 'data_type': 'ticket', + 'agent': os.environ.get('GL_USER'), + } + )) print( 'A report will be emailed to you once the load is finished') else: diff --git a/pagure/lib/__init__.py b/pagure/lib/__init__.py index c7077da..fd2b3f0 100644 --- a/pagure/lib/__init__.py +++ b/pagure/lib/__init__.py @@ -611,8 +611,6 @@ def add_issue_dependency( if not issue.private: #pagure.lib.notify.notify_assigned_issue(issue, user_obj) #pagure.lib.notify.notify_assigned_issue(issue_blocked, user_obj) - - if not issue.private: pagure.lib.notify.log( issue.project, topic='issue.dependency.added', @@ -672,8 +670,6 @@ def remove_issue_dependency( if not issue.private: #pagure.lib.notify.notify_assigned_issue(issue, user_obj) #pagure.lib.notify.notify_assigned_issue(issue_blocked, user_obj) - - if not issue.private: pagure.lib.notify.log( issue.project, topic='issue.dependency.removed', diff --git a/tests/test_pagure_flask_api_fork.py b/tests/test_pagure_flask_api_fork.py index 8a03857..ead44c9 100644 --- a/tests/test_pagure_flask_api_fork.py +++ b/tests/test_pagure_flask_api_fork.py @@ -607,8 +607,8 @@ class PagureFlaskApiForktests(tests.Modeltests): tests.create_tokens_acl(self.session) # Create the pull-request to close - repo = pagure.lib.get_project(self.session, 'test') - forked_repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') + forked_repo = pagure.get_authorized_project(self.session, 'test') req = pagure.lib.new_pull_request( session=self.session, repo_from=forked_repo, @@ -871,8 +871,8 @@ class PagureFlaskApiForktests(tests.Modeltests): ) # Create a pull-request - repo = pagure.lib.get_project(self.session, 'test') - forked_repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') + forked_repo = pagure.get_authorized_project(self.session, 'test') req = pagure.lib.new_pull_request( session=self.session, repo_from=forked_repo, @@ -1129,8 +1129,8 @@ class PagureFlaskApiForktests(tests.Modeltests): ) # Create a pull-request - repo = pagure.lib.get_project(self.session, 'test') - forked_repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') + forked_repo = pagure.get_authorized_project(self.session, 'test') req = pagure.lib.new_pull_request( session=self.session, repo_from=forked_repo, diff --git a/tests/test_pagure_flask_api_issue.py b/tests/test_pagure_flask_api_issue.py index 82c3ebe..46b1d16 100644 --- a/tests/test_pagure_flask_api_issue.py +++ b/tests/test_pagure_flask_api_issue.py @@ -838,7 +838,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): ) # Create private issue - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') msg = pagure.lib.new_issue( session=self.session, repo=repo, @@ -1095,7 +1095,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): tests.create_tokens(self.session) tests.create_tokens_acl(self.session) - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') # Create 2 tickets but only 1 has a milestone start = datetime.datetime.utcnow().strftime('%s') @@ -1186,7 +1186,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): tests.create_tokens(self.session) tests.create_tokens_acl(self.session) - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') # Create 2 tickets but only 1 has a priority start = datetime.datetime.utcnow().strftime('%s') @@ -1328,7 +1328,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): tests.create_tokens(self.session) tests.create_tokens_acl(self.session) - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') # Create 2 tickets but only 1 has a milestone start = datetime.datetime.utcnow().strftime('%s') @@ -1443,7 +1443,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): tests.create_tokens(self.session) tests.create_tokens_acl(self.session) - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') # Create 1st tickets start = datetime.datetime.utcnow().strftime('%s') @@ -2470,7 +2470,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): ) # Create normal issue - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') msg = pagure.lib.new_issue( session=self.session, repo=repo, @@ -2485,7 +2485,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): self.assertEqual(msg.title, 'Test issue #1') # Check comments before - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') issue = pagure.lib.search_issues(self.session, repo, issueid=1) self.assertEqual(len(issue.comments), 0) @@ -2508,7 +2508,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): ) # No change - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') issue = pagure.lib.search_issues(self.session, repo, issueid=1) self.assertEqual(issue.status, 'Open') @@ -2527,7 +2527,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): ) # One comment added - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') issue = pagure.lib.search_issues(self.session, repo, issueid=1) self.assertEqual(len(issue.comments), 1) @@ -2561,7 +2561,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): self.session.add(item) self.session.commit() - repo = pagure.lib.get_project(self.session, 'foo') + repo = pagure.get_authorized_project(self.session, 'foo') # Create private issue msg = pagure.lib.new_issue( session=self.session, @@ -2577,7 +2577,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): self.assertEqual(msg.title, 'Test issue') # Check before - repo = pagure.lib.get_project(self.session, 'foo') + repo = pagure.get_authorized_project(self.session, 'foo') issue = pagure.lib.search_issues(self.session, repo, issueid=1) self.assertEqual(len(issue.comments), 0) @@ -2596,7 +2596,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): self.assertEqual(pagure.api.APIERROR.EINVALIDTOK.value, data['error']) # No comment added - repo = pagure.lib.get_project(self.session, 'foo') + repo = pagure.get_authorized_project(self.session, 'foo') issue = pagure.lib.search_issues(self.session, repo, issueid=1) self.assertEqual(len(issue.comments), 0) diff --git a/tests/test_pagure_flask_api_ui_private_repo.py b/tests/test_pagure_flask_api_ui_private_repo.py index b08cc14..42754f9 100644 --- a/tests/test_pagure_flask_api_ui_private_repo.py +++ b/tests/test_pagure_flask_api_ui_private_repo.py @@ -1904,6 +1904,9 @@ class PagurePrivateRepotest(tests.Modeltests): "args": { "assignee": None, "author": None, + "milestones": [], + "no_stones": None, + "priority": None, "since": None, "status": None, "tags": [] @@ -1969,6 +1972,9 @@ class PagurePrivateRepotest(tests.Modeltests): "args": { "assignee": None, "author": None, + "milestones": [], + "no_stones": None, + "priority": None, "status": None, "since": None, "tags": [] @@ -2047,6 +2053,9 @@ class PagurePrivateRepotest(tests.Modeltests): "args": { "assignee": None, "author": None, + "milestones": [], + "no_stones": None, + "priority": None, "status": None, "since": None, "tags": [] @@ -2115,6 +2124,9 @@ class PagurePrivateRepotest(tests.Modeltests): "args": { "assignee": None, "author": None, + "milestones": [], + "no_stones": None, + "priority": None, "status": "Closed", "since": None, "tags": [] @@ -2135,6 +2147,9 @@ class PagurePrivateRepotest(tests.Modeltests): "args": { "assignee": None, "author": None, + "milestones": [], + "no_stones": None, + "priority": None, "status": "Invalid", "since": None, "tags": [] @@ -2159,6 +2174,9 @@ class PagurePrivateRepotest(tests.Modeltests): "args": { "assignee": None, "author": None, + "milestones": [], + "no_stones": None, + "priority": None, "since": None, "status": "All", "tags": [] diff --git a/tests/test_pagure_flask_docs.py b/tests/test_pagure_flask_docs.py index 3817f4c..bae1c3d 100644 --- a/tests/test_pagure_flask_docs.py +++ b/tests/test_pagure_flask_docs.py @@ -103,7 +103,7 @@ class PagureFlaskDocstests(tests.Modeltests): PagureRepo.push(remote, 'refs/heads/master:refs/heads/master') # Turn on the docs project since it's off by default - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') repo.settings = {'project_documentation': True} self.session.add(repo) self.session.commit() diff --git a/tests/test_pagure_flask_internal.py b/tests/test_pagure_flask_internal.py index 017f286..8848cfd 100644 --- a/tests/test_pagure_flask_internal.py +++ b/tests/test_pagure_flask_internal.py @@ -307,7 +307,7 @@ class PagureFlaskInternaltests(tests.Modeltests): tests.create_projects(self.session) # Create issues to play with - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') msg = pagure.lib.new_issue( session=self.session, repo=repo, @@ -320,7 +320,7 @@ class PagureFlaskInternaltests(tests.Modeltests): self.session.commit() self.assertEqual(msg.title, 'Test issue') - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') issue = repo.issues[0] self.assertEqual(len(issue.comments), 0) @@ -336,7 +336,7 @@ class PagureFlaskInternaltests(tests.Modeltests): output = self.app.put('/pv/ticket/comment/', data=data) self.assertEqual(output.status_code, 403) - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') # Let's promote him to be a ticketer # He shoudn't be able to comment even then though msg = pagure.lib.add_user_to_project( @@ -348,7 +348,7 @@ class PagureFlaskInternaltests(tests.Modeltests): ) self.session.commit() self.assertEqual(msg, 'User added') - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') self.assertEqual( sorted([u.username for u in repo.users]), ['foo']) self.assertEqual( @@ -359,7 +359,7 @@ class PagureFlaskInternaltests(tests.Modeltests): output = self.app.put('/pv/ticket/comment/', data=data) self.assertEqual(output.status_code, 403) - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') # Let's promote him to be a committer # He should be able to comment msg = pagure.lib.add_user_to_project( @@ -371,7 +371,7 @@ class PagureFlaskInternaltests(tests.Modeltests): ) self.session.commit() self.assertEqual(msg, 'User access updated') - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') self.assertEqual( sorted([u.username for u in repo.users]), ['foo']) self.assertEqual( @@ -385,7 +385,7 @@ class PagureFlaskInternaltests(tests.Modeltests): js_data = json.loads(output.data) self.assertDictEqual(js_data, {'message': 'Comment added'}) - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') issue = repo.issues[0] self.assertEqual(len(issue.comments), 1) @@ -401,7 +401,7 @@ class PagureFlaskInternaltests(tests.Modeltests): self.session.commit() self.assertEqual(msg, 'User access updated') - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') self.assertEqual( sorted([u.username for u in repo.users]), ['foo']) self.assertEqual( @@ -415,7 +415,7 @@ class PagureFlaskInternaltests(tests.Modeltests): js_data = json.loads(output.data) self.assertDictEqual(js_data, {'message': 'Comment added'}) - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') issue = repo.issues[0] self.assertEqual(len(issue.comments), 2) diff --git a/tests/test_pagure_flask_ui_fork.py b/tests/test_pagure_flask_ui_fork.py index 95d621f..ca77241 100644 --- a/tests/test_pagure_flask_ui_fork.py +++ b/tests/test_pagure_flask_ui_fork.py @@ -1467,8 +1467,8 @@ index 0000000..2a552bb tests.create_projects_git( os.path.join(self.path, 'requests'), bare=True) - repo = pagure.lib.get_project(self.session, 'test') - fork = pagure.lib.get_project(self.session, 'test', user='foo') + repo = pagure.get_authorized_project(self.session, 'test') + fork = pagure.get_authorized_project(self.session, 'test', user='foo') self.set_up_git_repo( new_project=fork, branch_from='feature', mtype='FF') diff --git a/tests/test_pagure_flask_ui_issues.py b/tests/test_pagure_flask_ui_issues.py index 3b86678..b89f2a4 100644 --- a/tests/test_pagure_flask_ui_issues.py +++ b/tests/test_pagure_flask_ui_issues.py @@ -889,7 +889,7 @@ class PagureFlaskIssuestests(tests.Modeltests): tests.create_projects_git( os.path.join(self.path), bare=True) - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') # Add custom fields to the project msg = pagure.lib.set_custom_key_fields( diff --git a/tests/test_pagure_flask_ui_issues_acl_checks.py b/tests/test_pagure_flask_ui_issues_acl_checks.py index 41f7c69..92ecf45 100644 --- a/tests/test_pagure_flask_ui_issues_acl_checks.py +++ b/tests/test_pagure_flask_ui_issues_acl_checks.py @@ -74,7 +74,7 @@ class PagureFlaskIssuesACLtests(tests.Modeltests): self.assertEqual(output.status_code, 404) # Create issues to play with - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') msg = pagure.lib.new_issue( session=self.session, repo=repo, @@ -268,7 +268,7 @@ class PagureFlaskIssuesACLtests(tests.Modeltests): output.data) # Create private issue - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') msg = pagure.lib.new_issue( session=self.session, repo=repo, @@ -325,7 +325,7 @@ class PagureFlaskIssuesACLtests(tests.Modeltests): self.assertEqual(output.status_code, 404) # Create issues to play with - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') # Add user 'foo' with ticket access on repo msg = pagure.lib.add_user_to_project( @@ -338,7 +338,7 @@ class PagureFlaskIssuesACLtests(tests.Modeltests): self.assertEqual(msg, 'User added') self.session.commit() - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') msg = pagure.lib.new_issue( session=self.session, repo=repo, @@ -531,7 +531,7 @@ class PagureFlaskIssuesACLtests(tests.Modeltests): output.data) # Create private issue - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') msg = pagure.lib.new_issue( session=self.session, repo=repo, @@ -588,7 +588,7 @@ class PagureFlaskIssuesACLtests(tests.Modeltests): self.assertEqual(output.status_code, 404) # Create issues to play with - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') # Add user 'foo' with ticket access on repo msg = pagure.lib.add_user_to_project( @@ -601,7 +601,7 @@ class PagureFlaskIssuesACLtests(tests.Modeltests): self.assertEqual(msg, 'User added') self.session.commit() - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') msg = pagure.lib.new_issue( session=self.session, repo=repo, @@ -793,7 +793,7 @@ class PagureFlaskIssuesACLtests(tests.Modeltests): output.data) # Create private issue - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') msg = pagure.lib.new_issue( session=self.session, repo=repo, @@ -850,7 +850,7 @@ class PagureFlaskIssuesACLtests(tests.Modeltests): self.assertEqual(output.status_code, 404) # Create issues to play with - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') # Add user 'foo' with ticket access on repo msg = pagure.lib.add_user_to_project( @@ -863,7 +863,7 @@ class PagureFlaskIssuesACLtests(tests.Modeltests): self.assertEqual(msg, 'User added') self.session.commit() - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') msg = pagure.lib.new_issue( session=self.session, repo=repo, @@ -1056,7 +1056,7 @@ class PagureFlaskIssuesACLtests(tests.Modeltests): output.data) # Create private issue - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') msg = pagure.lib.new_issue( session=self.session, repo=repo, diff --git a/tests/test_pagure_flask_ui_repo.py b/tests/test_pagure_flask_ui_repo.py index f72770b..642b227 100644 --- a/tests/test_pagure_flask_ui_repo.py +++ b/tests/test_pagure_flask_ui_repo.py @@ -3033,7 +3033,7 @@ index 0000000..fb7093d output.data) # add user - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') msg = pagure.lib.add_user_to_project( session=self.session, project=repo, @@ -3052,9 +3052,9 @@ index 0000000..fb7093d self.assertIn( 'Forks 0', output.data) - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') self.assertNotEqual(repo, None) - repo = pagure.lib.get_project(self.session, 'test2') + repo = pagure.get_authorized_project(self.session, 'test2') self.assertEqual(repo, None) # Delete the project @@ -3068,9 +3068,9 @@ index 0000000..fb7093d output.data) # Check after - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') self.assertEqual(repo, None) - repo = pagure.lib.get_project(self.session, 'test2') + repo = pagure.get_authorized_project(self.session, 'test2') self.assertEqual(repo, None) @patch('pagure.lib.notify.send_email') @@ -3127,7 +3127,7 @@ index 0000000..fb7093d self.assertEqual(msg, 'User `pingou` added to the group `foo`.') # Add group to the project - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') msg = pagure.lib.add_group_to_project( session=self.session, project=repo, @@ -3138,7 +3138,7 @@ index 0000000..fb7093d self.assertEqual(msg, 'Group added') # check if group where we expect it - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') self.assertEqual(len(repo.projects_groups), 1) # Check before deleting the project @@ -3150,7 +3150,7 @@ index 0000000..fb7093d self.assertIn( 'Forks 0', output.data) - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') self.assertNotEqual(repo, None) # Delete the project @@ -3164,7 +3164,7 @@ index 0000000..fb7093d output.data) # Check after - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') self.assertEqual(repo, None) @patch('pagure.lib.notify.send_email') @@ -3207,7 +3207,7 @@ index 0000000..fb7093d output.data) # Create the issue - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') msg = pagure.lib.new_issue( session=self.session, repo=repo, @@ -3220,7 +3220,7 @@ index 0000000..fb7093d self.assertEqual(msg.title, 'Test issue') # Add a tag to the issue - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') issue = pagure.lib.search_issues(self.session, repo, issueid=1) msg = pagure.lib.add_tag_obj( session=self.session, @@ -3240,9 +3240,9 @@ index 0000000..fb7093d self.assertIn( 'Forks 0', output.data) - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') self.assertNotEqual(repo, None) - repo = pagure.lib.get_project(self.session, 'test2') + repo = pagure.get_authorized_project(self.session, 'test2') self.assertEqual(repo, None) # Delete the project @@ -3256,9 +3256,9 @@ index 0000000..fb7093d output.data) # Check after - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') self.assertEqual(repo, None) - repo = pagure.lib.get_project(self.session, 'test2') + repo = pagure.get_authorized_project(self.session, 'test2') self.assertEqual(repo, None) @patch('pagure.ui.repo.admin_session_timedout') @@ -4224,7 +4224,7 @@ index 0000000..fb7093d output.data) # Create a report - project = pagure.lib.get_project(self.session, name='test') + project = pagure.get_authorized_project(self.session, project_name='test') self.assertEqual(project.reports, {}) name = 'test report' url = '?foo=bar&baz=biz' @@ -4236,7 +4236,7 @@ index 0000000..fb7093d username=None ) self.session.commit() - project = pagure.lib.get_project(self.session, name='test') + project = pagure.get_authorized_project(self.session, project_name='test') self.assertEqual( project.reports, {'test report': {'baz': 'biz', 'foo': 'bar'}} @@ -4253,7 +4253,7 @@ index 0000000..fb7093d 'Settings - test - Pagure', output.data) - project = pagure.lib.get_project(self.session, name='test') + project = pagure.get_authorized_project(self.session, project_name='test') self.assertEqual( project.reports, {'test report': {'baz': 'biz', 'foo': 'bar'}} @@ -4270,7 +4270,7 @@ index 0000000..fb7093d self.assertIn( '\n List of reports updated', output.data) - project = pagure.lib.get_project(self.session, name='test') + project = pagure.get_authorized_project(self.session, project_name='test') self.assertEqual(project.reports, {}) def test_delete_report_ns_project(self): @@ -4329,8 +4329,8 @@ index 0000000..fb7093d output.data) # Create a report - project = pagure.lib.get_project( - self.session, name='test', namespace='foo') + project = pagure.get_authorized_project( + self.session, project_name='test', namespace='foo') self.assertEqual(project.reports, {}) name = 'test report' url = '?foo=bar&baz=biz' @@ -4342,8 +4342,8 @@ index 0000000..fb7093d username=None ) self.session.commit() - project = pagure.lib.get_project( - self.session, name='test', namespace='foo') + project = pagure.get_authorized_project( + self.session, project_name='test', namespace='foo') self.assertEqual( project.reports, {'test report': {'baz': 'biz', 'foo': 'bar'}} @@ -4360,8 +4360,8 @@ index 0000000..fb7093d 'Settings - foo/test - Pagure', output.data) - project = pagure.lib.get_project( - self.session, name='test', namespace='foo') + project = pagure.get_authorized_project( + self.session, project_name='test', namespace='foo') self.assertEqual( project.reports, {'test report': {'baz': 'biz', 'foo': 'bar'}} @@ -4379,8 +4379,8 @@ index 0000000..fb7093d '\n List of reports updated', output.data) - project = pagure.lib.get_project( - self.session, name='test', namespace='foo') + project = pagure.get_authorized_project( + self.session, project_name='test', namespace='foo') self.assertEqual(project.reports, {}) diff --git a/tests/test_pagure_lib.py b/tests/test_pagure_lib.py index 7669e14..9f6ff82 100644 --- a/tests/test_pagure_lib.py +++ b/tests/test_pagure_lib.py @@ -401,7 +401,7 @@ class PagureLibtests(tests.Modeltests): p_ugt.return_value = True tests.create_projects(self.session) - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') # Create 3 issues msg = pagure.lib.new_issue( @@ -1467,7 +1467,7 @@ class PagureLibtests(tests.Modeltests): # Also check if the project shows up if a user doesn't # have admin access in the project # Check with commit access first - project = pagure.lib.get_project(self.session, name='test') + project = pagure.get_authorized_project(self.session, project_name='test') msg = pagure.lib.add_user_to_project( self.session, project=project, @@ -1482,7 +1482,7 @@ class PagureLibtests(tests.Modeltests): self.assertEqual(len(projects), 1) # Now check with only ticket access - project = pagure.lib.get_project(self.session, name='test') + project = pagure.get_authorized_project(self.session, project_name='test') msg = pagure.lib.add_user_to_project( self.session, project=project, @@ -3567,7 +3567,7 @@ class PagureLibtests(tests.Modeltests): ''' tests.create_projects(self.session) - project = pagure.lib.get_project(self.session, name='test') + project = pagure.get_authorized_project(self.session, project_name='test') # Default value of combine is True # which means the an admin is a user, committer as well @@ -3602,7 +3602,7 @@ class PagureLibtests(tests.Modeltests): # since, he is an admin, the msg should be 'User added' self.assertEqual(msg, 'User added') - project = pagure.lib.get_project(self.session, name='test') + project = pagure.get_authorized_project(self.session, project_name='test') users = project.get_project_users(access='admin') self.assertEqual(len(users), 1) @@ -3631,7 +3631,7 @@ class PagureLibtests(tests.Modeltests): self.session.commit() self.assertEqual(msg, 'User access updated') - project = pagure.lib.get_project(self.session, name='test') + project = pagure.get_authorized_project(self.session, project_name='test') # No admin now, even though pingou the creator is there users = project.get_project_users(access='admin') self.assertEqual(len(users), 0) @@ -3658,7 +3658,7 @@ class PagureLibtests(tests.Modeltests): self.session.commit() self.assertEqual(msg, 'User access updated') - project = pagure.lib.get_project(self.session, name='test') + project = pagure.get_authorized_project(self.session, project_name='test') # No admin now, even though pingou the creator is there users = project.get_project_users(access='admin') self.assertEqual(len(users), 0) @@ -3678,7 +3678,7 @@ class PagureLibtests(tests.Modeltests): ''' tests.create_projects(self.session) - project = pagure.lib.get_project(self.session, name='test') + project = pagure.get_authorized_project(self.session, project_name='test') # Let's add a new user to the project, 'foo' # By default, if no access is specified, he becomes an admin @@ -3718,8 +3718,9 @@ class PagureLibtests(tests.Modeltests): self.assertEqual(msg, 'User access updated') # He is just a committer - project = pagure.lib.get_project(self.session, name='test') + project = pagure.get_authorized_project(self.session, project_name='test') users = project.get_project_users(access='admin', combine=False) + self.assertEqual(len(users), 0) # He is just a committer @@ -3743,8 +3744,9 @@ class PagureLibtests(tests.Modeltests): self.assertEqual(msg, 'User access updated') # He is just a ticketer - project = pagure.lib.get_project(self.session, name='test') + project = pagure.get_authorized_project(self.session, project_name='test') users = project.get_project_users(access='admin',combine=False) + self.assertEqual(len(users), 0) # He is just a ticketer @@ -3781,7 +3783,7 @@ class PagureLibtests(tests.Modeltests): # Add the group to project we just created, test # First add it as an admin - project = pagure.lib.get_project(self.session, name='test') + project = pagure.get_authorized_project(self.session, project_name='test') msg = pagure.lib.add_group_to_project( self.session, project=project, @@ -3793,8 +3795,9 @@ class PagureLibtests(tests.Modeltests): # Now, the group is an admin in the project # so, it must have access to everything - project = pagure.lib.get_project(self.session, name='test') + project = pagure.get_authorized_project(self.session, project_name='test') groups = project.get_project_groups(access='admin') + self.assertEqual(len(groups), 1) self.assertEqual(groups[0].display_name, 'Justice League') self.assertEqual(len(project.admin_groups), 1) @@ -3824,7 +3827,7 @@ class PagureLibtests(tests.Modeltests): ) # Update the access level of the group, JL to commit - project = pagure.lib.get_project(self.session, name='test') + project = pagure.get_authorized_project(self.session, project_name='test') msg = pagure.lib.add_group_to_project( self.session, project=project, @@ -3836,8 +3839,9 @@ class PagureLibtests(tests.Modeltests): self.assertEqual(msg, 'Group access updated') # It shouldn't be an admin - project = pagure.lib.get_project(self.session, name='test') + project = pagure.get_authorized_project(self.session, project_name='test') groups = project.get_project_groups(access='admin') + self.assertEqual(len(groups), 0) self.assertEqual(len(project.admin_groups), 0) @@ -3873,8 +3877,9 @@ class PagureLibtests(tests.Modeltests): self.assertEqual(msg, 'Group access updated') # It is not an admin - project = pagure.lib.get_project(self.session, name='test') + project = pagure.get_authorized_project(self.session, project_name='test') groups = project.get_project_groups(access='admin') + self.assertEqual(len(groups), 0) self.assertEqual(len(project.admin_groups), 0) @@ -3918,7 +3923,7 @@ class PagureLibtests(tests.Modeltests): # Add the group to project we just created, test # First add it as an admin - project = pagure.lib.get_project(self.session, name='test') + project = pagure.get_authorized_project(self.session, project_name='test') msg = pagure.lib.add_group_to_project( self.session, project=project, @@ -3930,8 +3935,9 @@ class PagureLibtests(tests.Modeltests): # Now, the group is an admin in the project # so, it must have access to everything - project = pagure.lib.get_project(self.session, name='test') + project = pagure.get_authorized_project(self.session, project_name='test') groups = project.get_project_groups(access='admin', combine=False) + self.assertEqual(len(groups), 1) self.assertEqual(groups[0].display_name, 'Justice League') self.assertEqual(len(project.admin_groups), 1) @@ -3949,7 +3955,7 @@ class PagureLibtests(tests.Modeltests): self.assertEqual(len(groups), 0) # Update the access level of the group, JL to commit - project = pagure.lib.get_project(self.session, name='test') + project = pagure.get_authorized_project(self.session, project_name='test') msg = pagure.lib.add_group_to_project( self.session, project=project, @@ -3961,8 +3967,9 @@ class PagureLibtests(tests.Modeltests): self.assertEqual(msg, 'Group access updated') # It shouldn't be an admin - project = pagure.lib.get_project(self.session, name='test') + project = pagure.get_authorized_project(self.session, project_name='test') groups = project.get_project_groups(access='admin', combine=False) + self.assertEqual(len(groups), 0) # It is a committer @@ -3991,8 +3998,9 @@ class PagureLibtests(tests.Modeltests): self.assertEqual(msg, 'Group access updated') # It is not an admin - project = pagure.lib.get_project(self.session, name='test') + project = pagure.get_authorized_project(self.session, project_name='test') groups = project.get_project_groups(access='admin', combine=False) + self.assertEqual(len(groups), 0) # The group shouldn't be a committer @@ -4017,7 +4025,7 @@ class PagureLibtests(tests.Modeltests): tests.create_projects(self.session) # Add a user object - make him an admin first - project = pagure.lib.get_project(self.session, name='test') + project = pagure.get_authorized_project(self.session, project_name='test') msg = pagure.lib.add_user_to_project( self.session, project=project, @@ -4046,7 +4054,7 @@ class PagureLibtests(tests.Modeltests): ) self.session.commit() self.assertEqual(msg, 'User access updated') - project = pagure.lib.get_project(self.session, name='test') + project = pagure.get_authorized_project(self.session, project_name='test') # He should be a committer access_obj = pagure.lib.get_obj_access( @@ -4066,7 +4074,7 @@ class PagureLibtests(tests.Modeltests): ) self.session.commit() self.assertEqual(msg, 'User access updated') - project = pagure.lib.get_project(self.session, name='test') + project = pagure.get_authorized_project(self.session, project_name='test') # He should be a ticketer access_obj = pagure.lib.get_obj_access( @@ -4101,7 +4109,7 @@ class PagureLibtests(tests.Modeltests): ) # Add a group object - make him an admin first - project = pagure.lib.get_project(self.session, name='test') + project = pagure.get_authorized_project(self.session, project_name='test') msg = pagure.lib.add_group_to_project( self.session, project=project, @@ -4131,7 +4139,7 @@ class PagureLibtests(tests.Modeltests): self.session.commit() self.assertEqual(msg, 'Group access updated') - project = pagure.lib.get_project(self.session, name='test') + project = pagure.get_authorized_project(self.session, project_name='test') # He should be a committer access_obj = pagure.lib.get_obj_access( self.session, @@ -4150,7 +4158,7 @@ class PagureLibtests(tests.Modeltests): ) self.session.commit() self.assertEqual(msg, 'Group access updated') - project = pagure.lib.get_project(self.session, name='test') + project = pagure.get_authorized_project(self.session, project_name='test') # He should be a ticketer access_obj = pagure.lib.get_obj_access( @@ -4241,7 +4249,7 @@ class PagureLibtests(tests.Modeltests): # Create the projects tests.create_projects(self.session) - project = pagure.lib.get_project(self.session, name='test') + project = pagure.get_authorized_project(self.session, project_name='test') self.assertEqual(project.reports, {}) name = 'test report' @@ -4255,7 +4263,7 @@ class PagureLibtests(tests.Modeltests): username=None ) - project = pagure.lib.get_project(self.session, name='test') + project = pagure.get_authorized_project(self.session, project_name='test') self.assertEqual( project.reports, {'test report': {'baz': 'biz', 'foo': 'bar'}} @@ -4272,7 +4280,7 @@ class PagureLibtests(tests.Modeltests): username=None ) - project = pagure.lib.get_project(self.session, name='test') + project = pagure.get_authorized_project(self.session, project_name='test') self.assertEqual( project.reports, { diff --git a/tests/test_pagure_lib_git.py b/tests/test_pagure_lib_git.py index 6a38c0f..3b25d5e 100644 --- a/tests/test_pagure_lib_git.py +++ b/tests/test_pagure_lib_git.py @@ -276,7 +276,7 @@ repo requests/forks/pingou/test3 when the new uesr is just a ticketer """ tests.create_projects(self.session) - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') # Add an user to a project # The user will be an admin of the project msg = pagure.lib.add_user_to_project( @@ -378,7 +378,7 @@ repo requests/forks/pingou/test3 when the new uesr is just a committer """ tests.create_projects(self.session) - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') # Add an user to a project # The user will be an admin of the project msg = pagure.lib.add_user_to_project( @@ -642,7 +642,7 @@ repo requests/forks/pingou/test2 """ tests.create_projects(self.session) - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') # Add a couple of groups # They would be ticketers @@ -795,7 +795,7 @@ repo requests/forks/pingou/test2 """ tests.create_projects(self.session) - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') # Add a couple of groups # They would be committers @@ -2689,7 +2689,7 @@ index 0000000..60f7480 self.session.add(item) self.session.commit() - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') gitrepo = os.path.join(gitfolder, repo.path) docrepo = os.path.join(docfolder, repo.path) ticketrepo = os.path.join(ticketfolder, repo.path) @@ -2719,7 +2719,7 @@ index 0000000..60f7480 self.path, 'repos', 'forks', 'foo', 'test.git') tests.add_content_git_repo(self.gitrepo, branch='feature') - fork_repo = pagure.lib.get_project(self.session, 'test', user='foo') + fork_repo = pagure.get_authorized_project(self.session, 'test', user='foo') # Create a PR to play with req = pagure.lib.new_pull_request( session=self.session, diff --git a/tests/test_pagure_lib_watch_list.py b/tests/test_pagure_lib_watch_list.py index bfddc0a..c2b075d 100644 --- a/tests/test_pagure_lib_watch_list.py +++ b/tests/test_pagure_lib_watch_list.py @@ -486,7 +486,7 @@ class PagureLibGetWatchListtests(tests.Modeltests): self.session.add(item) # Set the user `bar` to watch the project - project = pagure.lib.get_project( + project = pagure.get_authorized_project( self.session, 'test3', namespace='ns') msg = pagure.lib.update_watch_status( session=self.session, From 7c42293b28f5cdc893f6c334aa1f12d83bbdc63e Mon Sep 17 00:00:00 2001 From: Farhaan Bukhsh Date: Apr 14 2017 10:32:37 +0000 Subject: [PATCH 92/94] Fix tests and migrated to ``_getrepo`` The ``issue`` api changed its architecture to use a different way of getting the repo. The refactoring is amazing since now only one function is required to make a get repo call. This commit also fixes few test cases and modified the test json for the same. The alembic revision file is updated with the new revision. Signed-off-by: Farhaan Bukhsh --- diff --git a/alembic/versions/4255158a6913_create_private_column_in_project_table.py b/alembic/versions/4255158a6913_create_private_column_in_project_table.py index dbeb1f3..289e6af 100644 --- a/alembic/versions/4255158a6913_create_private_column_in_project_table.py +++ b/alembic/versions/4255158a6913_create_private_column_in_project_table.py @@ -1,14 +1,14 @@ """Create private column in project table Revision ID: 4255158a6913 -Revises: 208b0cd232ab +Revises: 3ffec872dfdf Create Date: 2016-06-06 14:33:47.039207 """ # revision identifiers, used by Alembic. revision = '4255158a6913' -down_revision = '38581a8fbae2' +down_revision = '3ffec872dfdf' from alembic import op import sqlalchemy as sa diff --git a/tests/test_pagure_flask_api_issue.py b/tests/test_pagure_flask_api_issue.py index 46b1d16..df93ee3 100644 --- a/tests/test_pagure_flask_api_issue.py +++ b/tests/test_pagure_flask_api_issue.py @@ -2025,7 +2025,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): tests.create_tokens_acl(self.session) # Set some milestones to the project - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') repo.milestones = {'v1.0': None, 'v2.0': 'Soon'} self.session.add(repo) self.session.commit() @@ -2065,7 +2065,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): ) # Create normal issue - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') msg = pagure.lib.new_issue( session=self.session, repo=repo, @@ -2079,7 +2079,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): self.assertEqual(msg.title, 'Test issue #1') # Check milestone before - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') issue = pagure.lib.search_issues(self.session, repo, issueid=1) self.assertEqual(issue.milestone, None) @@ -2098,7 +2098,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): ) # No change - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') issue = pagure.lib.search_issues(self.session, repo, issueid=1) self.assertEqual(issue.milestone, None) @@ -2162,7 +2162,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): ) # Change recorded - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') issue = pagure.lib.search_issues(self.session, repo, issueid=1) self.assertEqual(issue.milestone, None) @@ -2202,7 +2202,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): ) # Change recorded - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') issue = pagure.lib.search_issues(self.session, repo, issueid=1) self.assertEqual(issue.milestone, None) diff --git a/tests/test_pagure_flask_api_ui_private_repo.py b/tests/test_pagure_flask_api_ui_private_repo.py index 42754f9..af6def7 100644 --- a/tests/test_pagure_flask_api_ui_private_repo.py +++ b/tests/test_pagure_flask_api_ui_private_repo.py @@ -940,6 +940,7 @@ class PagurePrivateRepotest(tests.Modeltests): "id": 1, "milestones": {}, "name": "test4", + "fullname": "test4", "namespace": None, "parent": None, "priorities": {}, @@ -976,6 +977,7 @@ class PagurePrivateRepotest(tests.Modeltests): "id": 1, "milestones": {}, "name": "test4", + "fullname": "test4", "namespace": None, "parent": None, "priorities": {}, @@ -1079,6 +1081,7 @@ class PagurePrivateRepotest(tests.Modeltests): "id": 1, "milestones": {}, "name": "test4", + "fullname": "test4", "namespace": None, "parent": None, "priorities": {}, @@ -1096,6 +1099,7 @@ class PagurePrivateRepotest(tests.Modeltests): "description": "test project description", "id": 1, "milestones": {}, + "fullname": "test4", "name": "test4", "namespace": None, "parent": None, @@ -1167,6 +1171,7 @@ class PagurePrivateRepotest(tests.Modeltests): "id": 1, "milestones": {}, "name": "test4", + "fullname": "test4", "namespace": None, "parent": None, "priorities": {}, @@ -1185,6 +1190,7 @@ class PagurePrivateRepotest(tests.Modeltests): "id": 1, "milestones": {}, "name": "test4", + "fullname": "test4", "namespace": None, "parent": None, "priorities": {}, diff --git a/tests/test_pagure_flask_docs.py b/tests/test_pagure_flask_docs.py index bae1c3d..8930885 100644 --- a/tests/test_pagure_flask_docs.py +++ b/tests/test_pagure_flask_docs.py @@ -141,7 +141,7 @@ class PagureFlaskDocstests(tests.Modeltests): docs. """ tests.create_projects(self.session) - repo = pagure.lib._get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') tests.create_projects_git(os.path.join(self.path, 'docs')) output = self.app.get('/test/docs') @@ -164,51 +164,6 @@ class PagureFlaskDocstests(tests.Modeltests): self.assertEqual(output.status_code, 404) self._set_up_doc() - # forked doc repo - docrepo = os.path.join(self.path, 'docs', 'test', 'test.git') - repo = pygit2.init_repository(docrepo) - - # Create files in that git repo - with open(os.path.join(docrepo, 'sources'), 'w') as stream: - stream.write('foo\n bar') - repo.index.add('sources') - repo.index.write() - - folderpart = os.path.join(docrepo, 'folder1', 'folder2') - os.makedirs(folderpart) - with open(os.path.join(folderpart, 'test_file'), 'w') as stream: - stream.write('row1\nrow2\nrow3') - repo.index.add(os.path.join('folder1', 'folder2', 'test_file')) - 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/master', # the name of the reference to update - author, - committer, - 'Add test files and folder', - # binary string representing the tree object ID - tree, - # list of binary strings representing parents of the new commit - [] - ) - - # Push the changes to the bare repo - remote = repo.create_remote( - 'origin', os.path.join(self.path, 'docs', 'test.git')) - - PagureRepo.push(remote, 'refs/heads/master:refs/heads/master') - - # Turn on the docs project since it's off by default - repo = pagure.get_authorized_project(self.session, 'test') - repo.settings = {'project_documentation': True} - self.session.add(repo) - self.session.commit() # Now check the UI diff --git a/tests/test_pagure_lib.py b/tests/test_pagure_lib.py index 9f6ff82..f537206 100644 --- a/tests/test_pagure_lib.py +++ b/tests/test_pagure_lib.py @@ -336,11 +336,11 @@ class PagureLibtests(tests.Modeltests): self.test_new_issue() - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') issue = pagure.lib.search_issues(self.session, repo, issueid=2) # Set some priorities to the repo - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') repo.priorities = {'1': 'High', '2': 'Normal'} self.session.add(repo) self.session.commit() diff --git a/tests/test_pagure_lib_git.py b/tests/test_pagure_lib_git.py index 3b25d5e..8ce5000 100644 --- a/tests/test_pagure_lib_git.py +++ b/tests/test_pagure_lib_git.py @@ -1776,7 +1776,7 @@ index 0000000..60f7480 """ Test the update_ticket_from_git method from pagure.lib.git. """ tests.create_projects(self.session) - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') # Before self.assertEqual(len(repo.issues), 0) From 8267d1a4c48276c88d6c2b8a98b4e2595f463369 Mon Sep 17 00:00:00 2001 From: Farhaan Bukhsh Date: Apr 14 2017 10:32:37 +0000 Subject: [PATCH 93/94] Fix pep8 convention and chages suggested by ``@pingou`` This commit few pep8 changes and changing ``lib/git.py`` to use ``_get_project`` instead of ``get_authorized_project`` Certain formatting changes have also been resolved Signed-off-by: Farhaan Bukhsh --- diff --git a/alembic/versions/4255158a6913_create_private_column_in_project_table.py b/alembic/versions/4255158a6913_create_private_column_in_project_table.py index 289e6af..7baeef6 100644 --- a/alembic/versions/4255158a6913_create_private_column_in_project_table.py +++ b/alembic/versions/4255158a6913_create_private_column_in_project_table.py @@ -26,7 +26,7 @@ def upgrade(): op.alter_column( 'projects', - column_name='private', new_column_name='private', + column_name='private', nullable=False, existing_nullable=True) diff --git a/doc/configuration.rst b/doc/configuration.rst index f212a7d..e48b519 100644 --- a/doc/configuration.rst +++ b/doc/configuration.rst @@ -608,7 +608,7 @@ PRIVATE_PROJECTS This configuration key allows you to host private repositories. These repositories are visible only to the creator of the repository and to the -user who are given access to the repository. No information is leaked about the +users who are given access to the repository. No information is leaked about the private repository which means redis doesn't have the access to the repository and even fedmsg doesn't get any notifications. diff --git a/pagure/__init__.py b/pagure/__init__.py index 7c30903..4d975d3 100644 --- a/pagure/__init__.py +++ b/pagure/__init__.py @@ -387,7 +387,7 @@ def get_authorized_project(session, project_name, user=None, namespace=None): :type namespace: String :return: The project object if project is public or user has permissions for the project else it returns None - :rtype: Project or [Project] + :rtype: Project ''' repo = pagure.lib._get_project(session, project_name, user, namespace) diff --git a/pagure/api/fork.py b/pagure/api/fork.py index c009e8a..1a2efd0 100644 --- a/pagure/api/fork.py +++ b/pagure/api/fork.py @@ -123,7 +123,8 @@ def api_pull_request_views(repo, username=None, namespace=None): """ - repo = pagure.get_authorized_project(SESSION, repo, user=username, namespace=namespace) + repo = pagure.get_authorized_project( + SESSION, repo, user=username, namespace=namespace) if repo is None: raise pagure.exceptions.APIError(404, error_code=APIERROR.ENOPROJECT) @@ -248,7 +249,8 @@ def api_pull_request_view(repo, requestid, username=None, namespace=None): """ - repo = pagure.get_authorized_project(SESSION, repo, user=username, namespace=namespace) + repo = pagure.get_authorized_project( + SESSION, repo, user=username, namespace=namespace) if repo is None: raise pagure.exceptions.APIError(404, error_code=APIERROR.ENOPROJECT) @@ -306,7 +308,8 @@ def api_pull_request_merge(repo, requestid, username=None, namespace=None): """ # noqa output = {} - repo = pagure.get_authorized_project(SESSION, repo, user=username, namespace=namespace) + repo = pagure.get_authorized_project( + SESSION, repo, user=username, namespace=namespace) if repo is None: raise pagure.exceptions.APIError(404, error_code=APIERROR.ENOPROJECT) @@ -392,7 +395,8 @@ def api_pull_request_close(repo, requestid, username=None, namespace=None): """ # noqa output = {} - repo = pagure.get_authorized_project(SESSION, repo, user=username, namespace=namespace) + repo = pagure.get_authorized_project( + SESSION, repo, user=username, namespace=namespace) if repo is None: raise pagure.exceptions.APIError(404, error_code=APIERROR.ENOPROJECT) @@ -494,7 +498,8 @@ def api_pull_request_add_comment( } """ # noqa - repo = pagure.get_authorized_project(SESSION, repo, user=username, namespace=namespace) + repo = pagure.get_authorized_project( + SESSION, repo, user=username, namespace=namespace) output = {} @@ -637,7 +642,8 @@ def api_pull_request_add_flag(repo, requestid, username=None, namespace=None): } """ # noqa - repo = pagure.get_authorized_project(SESSION, repo, user=username, namespace=namespace) + repo = pagure.get_authorized_project( + SESSION, repo, user=username, namespace=namespace) output = {} diff --git a/pagure/hooks/files/default_hook.py b/pagure/hooks/files/default_hook.py index e679c4e..7d5e05d 100755 --- a/pagure/hooks/files/default_hook.py +++ b/pagure/hooks/files/default_hook.py @@ -38,7 +38,7 @@ def run_as_post_receive_hook(): print('user:', username) print('namespace:', namespace) - project = pagure.get_authorized_project( + project = pagure.lib._get_project( pagure.SESSION, repo, user=username, namespace=namespace) for line in sys.stdin: diff --git a/pagure/hooks/files/fedmsg_hook.py b/pagure/hooks/files/fedmsg_hook.py index 350e5ab..bc67959 100755 --- a/pagure/hooks/files/fedmsg_hook.py +++ b/pagure/hooks/files/fedmsg_hook.py @@ -55,7 +55,7 @@ for line in sys.stdin.readlines(): project_name = pagure.lib.git.get_repo_name(abspath) username = pagure.lib.git.get_username(abspath) namespace = pagure.lib.git.get_repo_namespace(abspath) - project = pagure.get_authorized_project( + project = pagure._get_project( pagure.SESSION, project_name, username, namespace=namespace) if not project: project = project_name diff --git a/pagure/hooks/files/pagure_hook_tickets.py b/pagure/hooks/files/pagure_hook_tickets.py index a0c847c..7fb8a50 100755 --- a/pagure/hooks/files/pagure_hook_tickets.py +++ b/pagure/hooks/files/pagure_hook_tickets.py @@ -65,14 +65,14 @@ def run_as_post_receive_hook(): if REDIS: print('Sending to redis to load the data') REDIS.publish('pagure.loadjson', - json.dumps({ - 'project': project.to_json(public=True), - 'abspath': abspath, - 'commits': commits, - 'data_type': 'ticket', - 'agent': os.environ.get('GL_USER'), - } - )) + json.dumps({ + 'project': project.to_json(public=True), + 'abspath': abspath, + 'commits': commits, + 'data_type': 'ticket', + 'agent': os.environ.get('GL_USER'), + }) + ) print( 'A report will be emailed to you once the load is finished') else: diff --git a/pagure/lib/__init__.py b/pagure/lib/__init__.py index fd2b3f0..f18e577 100644 --- a/pagure/lib/__init__.py +++ b/pagure/lib/__init__.py @@ -140,6 +140,7 @@ def get_next_id(session, projectid): def search_user(session, username=None, email=None, token=None, pattern=None): ''' Searches the database for the user or users matching the given + criterias. :arg session: the session to use to connect to the database. :kwarg username: the username of the user to look for. @@ -609,8 +610,6 @@ def add_issue_dependency( repofolder=ticketfolder) if not issue.private: - #pagure.lib.notify.notify_assigned_issue(issue, user_obj) - #pagure.lib.notify.notify_assigned_issue(issue_blocked, user_obj) pagure.lib.notify.log( issue.project, topic='issue.dependency.added', @@ -668,8 +667,6 @@ def remove_issue_dependency( repofolder=ticketfolder) if not issue.private: - #pagure.lib.notify.notify_assigned_issue(issue, user_obj) - #pagure.lib.notify.notify_assigned_issue(issue_blocked, user_obj) pagure.lib.notify.log( issue.project, topic='issue.dependency.removed', @@ -1129,8 +1126,8 @@ def add_pull_request_comment(session, request, commit, tree_id, filename, # Send notification to the CI server, if the comment added was a # notification and the PR is still open and project is not private if notification and request.status == 'Open' \ - and request.project.ci_hook and PAGURE_CI \ - and not request.project.private: + and request.project.ci_hook and PAGURE_CI \ + and not request.project.private: REDIS.publish('pagure.ci', json.dumps({ 'ci_type': request.project.ci_hook.ci_type, 'pr': request.to_json(public=True, with_comments=False) @@ -1188,17 +1185,18 @@ def edit_comment(session, parent, comment, user, id_ = 'issue_id' private = parent.private - pagure.lib.notify.log( - parent.project, - topic=topic, - msg={ - key: parent.to_json(public=True, with_comments=False), - 'project': parent.project.to_json(public=True), - 'comment': comment.to_json(public=True), - 'agent': user_obj.username, - }, - redis=REDIS, - ) + if not private: + pagure.lib.notify.log( + parent.project, + topic=topic, + msg={ + key: parent.to_json(public=True, with_comments=False), + 'project': parent.project.to_json(public=True), + 'comment': comment.to_json(public=True), + 'agent': user_obj.username, + }, + redis=REDIS, + ) if REDIS and not parent.project.private: if private: @@ -2000,7 +1998,6 @@ def search_projects( model.Project.private == True, ) ) - ) if fork is not None: @@ -2012,7 +2009,6 @@ def search_projects( projects = projects.filter( model.Project.is_fork == False ) - if tags: if not isinstance(tags, (list, tuple)): tags = [tags] @@ -2023,7 +2019,6 @@ def search_projects( model.TagProject.tag.in_(tags) ) - if pattern: pattern = pattern.replace('*', '%') if '%' in pattern: diff --git a/pagure/lib/git.py b/pagure/lib/git.py index fdedf19..affa5e6 100644 --- a/pagure/lib/git.py +++ b/pagure/lib/git.py @@ -411,7 +411,8 @@ def get_project_from_json( project_user = None if jsondata.get('parent'): project_user = user.username - project = pagure.get_authorized_project(session, name, user=project_user, namespace=namespace) + project = pagure.lib._get_project( + session, name, user=project_user, namespace=namespace) if not project: parent = None @@ -450,7 +451,8 @@ def get_project_from_json( ) session.commit() - project = pagure.get_authorized_project(session, name, user=user.username, namespace=namespace) + project = pagure.lib._get_project( + session, name, user=user.username, namespace=namespace) tags = jsondata.get('tags', None) if tags: @@ -527,7 +529,9 @@ def update_ticket_from_git( """ - repo = pagure.get_authorized_project(session, reponame, user=username, namespace=namespace) + repo = pagure.lib._get_project( + session, reponame, user=username, namespace=namespace) + if not repo: raise pagure.exceptions.PagureException( 'Unknown repo %s of username: %s in namespace: %s' % ( @@ -704,7 +708,8 @@ def update_request_from_git( """ - repo = pagure.get_authorized_project(session, reponame, user=username, namespace=namespace) + repo = pagure.lib._get_project( + session, reponame, user=username, namespace=namespace) if not repo: raise pagure.exceptions.PagureException( 'Unknown repo %s of username: %s in namespace: %s' % ( diff --git a/pagure/pfmarkdown.py b/pagure/pfmarkdown.py index 61d2b57..aa86f4e 100644 --- a/pagure/pfmarkdown.py +++ b/pagure/pfmarkdown.py @@ -316,8 +316,8 @@ def makeExtension(*arg, **kwargs): def _issue_exists(user, namespace, repo, idx): """ Utility method checking if a given issue exists. """ - repo_obj = pagure.get_authorized_project(pagure.SESSION, project_name=repo, - user=user, namespace=namespace) + repo_obj = pagure.get_authorized_project( + pagure.SESSION, project_name=repo, user=user, namespace=namespace) if not repo_obj: return False @@ -332,8 +332,8 @@ def _issue_exists(user, namespace, repo, idx): def _pr_exists(user, namespace, repo, idx): """ Utility method checking if a given PR exists. """ - repo_obj = pagure.get_authorized_project(pagure.SESSION, project_name=repo, - user=user, namespace=namespace) + repo_obj = pagure.get_authorized_project( + pagure.SESSION, project_name=repo, user=user, namespace=namespace) if not repo_obj: return False diff --git a/pagure/templates/new_project.html b/pagure/templates/new_project.html index bf22010..8ffb023 100644 --- a/pagure/templates/new_project.html +++ b/pagure/templates/new_project.html @@ -21,7 +21,7 @@ {{ render_bootstrap_field(form.url, field_description="url of the project's website") }} {{ render_bootstrap_field(form.avatar_email, field_description="libravatar email address avatar email") }} {% if config.get('PRIVATE_PROJECTS', False) %} - {{ render_bootstrap_field(form.private, field_description="To mark the repo private") }} + {{ render_bootstrap_field(form.private, field_description="To mark the repo private") }} {% endif %} {{ render_bootstrap_field(form.create_readme, field_description="Create a README file automatically") }} diff --git a/pagure/ui/repo.py b/pagure/ui/repo.py index f8ed3b1..5449f31 100644 --- a/pagure/ui/repo.py +++ b/pagure/ui/repo.py @@ -50,11 +50,10 @@ import pagure.forms import pagure import pagure.ui.plugins from pagure import (APP, SESSION, LOG, __get_file_in_tree, login_required, - is_repo_admin, admin_session_timedout) + admin_session_timedout) from pagure.lib import encoding_utils - @APP.route('/.git') @APP.route('//.git') @APP.route('/fork//.git') @@ -2102,9 +2101,6 @@ def edit_file(repo, branchname, filename, username=None, namespace=None): 403, 'You are not allowed to change the settings for this project') - if repo.private and not is_repo_admin(repo): - flask.abort(401, 'Forbidden') - user = pagure.lib.search_user( SESSION, username=flask.g.fas_user.username) diff --git a/tests/test_pagure_flask_api_issue.py b/tests/test_pagure_flask_api_issue.py index df93ee3..adbb43b 100644 --- a/tests/test_pagure_flask_api_issue.py +++ b/tests/test_pagure_flask_api_issue.py @@ -615,6 +615,8 @@ class PagureFlaskApiIssuetests(tests.Modeltests): 'title': 'test issue', 'issue_content': 'This issue needs attention', } + + # Valid request output = self.app.post( '/api/0/test/new_issue', data=data, headers=headers) self.assertEqual(output.status_code, 200) From 6ccd40c641252c17290768ab9e83069f4f3b81e0 Mon Sep 17 00:00:00 2001 From: Farhaan Bukhsh Date: Apr 14 2017 10:58:00 +0000 Subject: [PATCH 94/94] Fix tests after rebase Change in the ``project`` api and few changes in `lib.git`` Signed-off-by: Farhaan Bukhsh Signed-off-by: Pierre-Yves Chibon --- diff --git a/tests/test_pagure_flask_api_ui_private_repo.py b/tests/test_pagure_flask_api_ui_private_repo.py index af6def7..2fe9166 100644 --- a/tests/test_pagure_flask_api_ui_private_repo.py +++ b/tests/test_pagure_flask_api_ui_private_repo.py @@ -933,6 +933,19 @@ class PagurePrivateRepotest(tests.Modeltests): "total_projects": 1, "projects": [ { + "access_groups": { + "admin": [], + "commit": [], + "ticket": [] + }, + "access_users": { + "admin": [], + "commit": [], + "owner": [ + "pingou" + ], + "ticket": [] + }, "close_status": [], "custom_keys": [], "date_created": "1436527638", @@ -970,6 +983,19 @@ class PagurePrivateRepotest(tests.Modeltests): "total_projects": 1, "projects": [ { + "access_groups": { + "admin": [], + "commit": [], + "ticket": [] + }, + "access_users": { + "admin": [], + "commit": [], + "owner": [ + "pingou" + ], + "ticket": [] + }, "close_status": [], "custom_keys": [], "date_created": "1436527638", @@ -1074,6 +1100,19 @@ class PagurePrivateRepotest(tests.Modeltests): "id": 1, "initial_comment": None, "project": { + "access_groups": { + "admin": [], + "commit": [], + "ticket": [] + }, + "access_users": { + "admin": [], + "commit": [], + "owner": [ + "pingou" + ], + "ticket": [] + }, "close_status": [], "custom_keys": [], "date_created": "1431414800", @@ -1093,6 +1132,19 @@ class PagurePrivateRepotest(tests.Modeltests): }, "remote_git": None, "repo_from": { + "access_groups": { + "admin": [], + "commit": [], + "ticket": [] + }, + "access_users": { + "admin": [], + "commit": [], + "owner": [ + "pingou" + ], + "ticket": [] + }, "close_status": [], "custom_keys": [], "date_created": "1431414800", @@ -1164,6 +1216,19 @@ class PagurePrivateRepotest(tests.Modeltests): "id": 1, "initial_comment": None, "project": { + "access_groups": { + "admin": [], + "commit": [], + "ticket": [] + }, + "access_users": { + "admin": [], + "commit": [], + "owner": [ + "pingou" + ], + "ticket": [] + }, "close_status": [], "custom_keys": [], "date_created": "1431414800", @@ -1183,6 +1248,19 @@ class PagurePrivateRepotest(tests.Modeltests): }, "remote_git": None, "repo_from": { + "access_groups": { + "admin": [], + "commit": [], + "ticket": [] + }, + "access_users": { + "admin": [], + "commit": [], + "owner": [ + "pingou" + ], + "ticket": [] + }, "close_status": [], "custom_keys": [], "date_created": "1431414800", diff --git a/tests/test_pagure_flask_ui_issues.py b/tests/test_pagure_flask_ui_issues.py index b89f2a4..3859364 100644 --- a/tests/test_pagure_flask_ui_issues.py +++ b/tests/test_pagure_flask_ui_issues.py @@ -652,7 +652,7 @@ class PagureFlaskIssuestests(tests.Modeltests): in output.data) # Create issues to play with - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') # Add user 'foo' with ticket access on repo msg = pagure.lib.add_user_to_project( @@ -706,7 +706,7 @@ class PagureFlaskIssuestests(tests.Modeltests): self.assertEqual(output.status_code, 404) # Create issues to play with - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') msg = pagure.lib.new_issue( session=self.session, repo=repo, @@ -719,7 +719,7 @@ class PagureFlaskIssuestests(tests.Modeltests): self.assertEqual(msg.title, 'Test issue') # Add user 'foo' with ticket access on repo - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') msg = pagure.lib.add_user_to_project( self.session, repo, @@ -731,7 +731,7 @@ class PagureFlaskIssuestests(tests.Modeltests): self.session.commit() # Set some custom fields - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') msg = pagure.lib.set_custom_key_fields( self.session, repo, @@ -826,7 +826,7 @@ class PagureFlaskIssuestests(tests.Modeltests): self.assertEqual(output.status_code, 404) # Create issues to play with - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.get_authorized_project(self.session, 'test') msg = pagure.lib.new_issue( session=self.session, repo=repo, diff --git a/tests/test_pagure_lib_git.py b/tests/test_pagure_lib_git.py index 8ce5000..f53abe8 100644 --- a/tests/test_pagure_lib_git.py +++ b/tests/test_pagure_lib_git.py @@ -954,7 +954,7 @@ repo requests/forks/pingou/test2 """ tests.create_projects(self.session) - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.lib._get_project(self.session, 'test') # Make the project enforce the PR workflow settings = repo.settings settings['pull_request_access_only'] = True @@ -1063,7 +1063,7 @@ repo requests/forks/pingou/test3 """ tests.create_projects(self.session) - repo = pagure.lib.get_project(self.session, 'test') + repo = pagure.lib._get_project(self.session, 'test') self.assertFalse(repo.settings['pull_request_access_only']) # Add an user to a project diff --git a/tests/test_pagure_lib_git_diff_pr.py b/tests/test_pagure_lib_git_diff_pr.py index f6e588b..cfa09ad 100644 --- a/tests/test_pagure_lib_git_diff_pr.py +++ b/tests/test_pagure_lib_git_diff_pr.py @@ -190,8 +190,8 @@ class PagureFlaskForkPrtests(tests.Modeltests): shutil.rmtree(newpath) # Create the PR between the two repos - repo = pagure.lib.get_project(self.session, 'test') - forked_repo = pagure.lib.get_project( + repo = pagure.get_authorized_project(self.session, 'test') + forked_repo = pagure.get_authorized_project( self.session, 'test', user='pingou') req = pagure.lib.new_pull_request(