|
Patrick Uiterwijk |
b2cb9c |
# -*- coding: utf-8 -*-
|
|
Patrick Uiterwijk |
b2cb9c |
|
|
Patrick Uiterwijk |
b2cb9c |
"""
|
|
Patrick Uiterwijk |
b2cb9c |
(c) 2015-2018 - Copyright Red Hat Inc
|
|
Patrick Uiterwijk |
b2cb9c |
|
|
Patrick Uiterwijk |
b2cb9c |
Authors:
|
|
Patrick Uiterwijk |
b2cb9c |
Pierre-Yves Chibon <pingou@pingoured.fr></pingou@pingoured.fr>
|
|
Patrick Uiterwijk |
b2cb9c |
Patrick Uiterwijk <patrick@puiterwijk.org></patrick@puiterwijk.org>
|
|
Patrick Uiterwijk |
b2cb9c |
|
|
Patrick Uiterwijk |
b2cb9c |
"""
|
|
Patrick Uiterwijk |
b2cb9c |
|
|
Patrick Uiterwijk |
b2cb9c |
from __future__ import unicode_literals
|
|
Patrick Uiterwijk |
b2cb9c |
|
|
Patrick Uiterwijk |
b2cb9c |
__requires__ = ['SQLAlchemy >= 0.8']
|
|
Patrick Uiterwijk |
b2cb9c |
|
|
Patrick Uiterwijk |
b2cb9c |
import pkg_resources
|
|
Patrick Uiterwijk |
b2cb9c |
|
|
Patrick Uiterwijk |
b2cb9c |
import datetime
|
|
Patrick Uiterwijk |
b2cb9c |
import os
|
|
Patrick Uiterwijk |
b2cb9c |
import shutil
|
|
Patrick Uiterwijk |
b2cb9c |
import sys
|
|
Patrick Uiterwijk |
b2cb9c |
import tempfile
|
|
Patrick Uiterwijk |
b2cb9c |
import time
|
|
Patrick Uiterwijk |
b2cb9c |
import unittest
|
|
Patrick Uiterwijk |
b2cb9c |
|
|
Patrick Uiterwijk |
b2cb9c |
import pygit2
|
|
Patrick Uiterwijk |
b2cb9c |
import six
|
|
Patrick Uiterwijk |
b2cb9c |
from mock import patch, MagicMock
|
|
Patrick Uiterwijk |
b2cb9c |
|
|
Patrick Uiterwijk |
b2cb9c |
sys.path.insert(0, os.path.join(os.path.dirname(
|
|
Patrick Uiterwijk |
b2cb9c |
os.path.abspath(__file__)), '..'))
|
|
Patrick Uiterwijk |
b2cb9c |
|
|
Patrick Uiterwijk |
b2cb9c |
import pagure
|
|
Patrick Uiterwijk |
b2cb9c |
import pagure.lib.git
|
|
Patrick Uiterwijk |
b2cb9c |
import tests
|
|
Patrick Uiterwijk |
b2cb9c |
|
|
Patrick Uiterwijk |
b2cb9c |
from pagure.lib.repo import PagureRepo
|
|
Patrick Uiterwijk |
b2cb9c |
|
|
Patrick Uiterwijk |
b2cb9c |
|
|
Patrick Uiterwijk |
b2cb9c |
class PagureLibGitAuthtests(tests.Modeltests):
|
|
Patrick Uiterwijk |
b2cb9c |
""" Tests for pagure.lib.git_auth """
|
|
Patrick Uiterwijk |
b2cb9c |
config_values = {'authbackend': 'test_auth'}
|
|
Patrick Uiterwijk |
b2cb9c |
|
|
Patrick Uiterwijk |
b2cb9c |
def setUp(self):
|
|
Patrick Uiterwijk |
b2cb9c |
super(PagureLibGitAuthtests, self).setUp()
|
|
Patrick Uiterwijk |
b2cb9c |
|
|
Patrick Uiterwijk |
b2cb9c |
tests.create_projects(self.session)
|
|
Patrick Uiterwijk |
b2cb9c |
tests.create_tokens(self.session)
|
|
Patrick Uiterwijk |
b2cb9c |
tests.create_tokens_acl(self.session)
|
|
Patrick Uiterwijk |
b2cb9c |
self.create_project_full('hooktest')
|
|
Patrick Uiterwijk |
b2cb9c |
|
|
Patrick Uiterwijk |
b2cb9c |
def test_edit_with_all_allowed(self):
|
|
Patrick Uiterwijk |
b2cb9c |
"""Tests that editing a file is possible if ACLs say allowed."""
|
|
Patrick Uiterwijk |
b2cb9c |
user = tests.FakeUser()
|
|
Patrick Uiterwijk |
b2cb9c |
user.username = 'pingou'
|
|
Patrick Uiterwijk |
b2cb9c |
with tests.user_set(self.app.application, user):
|
|
Patrick Uiterwijk |
b2cb9c |
# Add some content to the git repo
|
|
Patrick Uiterwijk |
b2cb9c |
tests.add_content_git_repo(
|
|
Patrick Uiterwijk |
b2cb9c |
os.path.join(self.path, 'repos', 'hooktest.git'))
|
|
Patrick Uiterwijk |
b2cb9c |
|
|
Patrick Uiterwijk |
b2cb9c |
data = {
|
|
Patrick Uiterwijk |
b2cb9c |
'content': 'foo\n bar\n baz',
|
|
Patrick Uiterwijk |
b2cb9c |
'commit_title': 'test commit',
|
|
Patrick Uiterwijk |
b2cb9c |
'commit_message': 'Online commits from the gure.lib.get',
|
|
Patrick Uiterwijk |
b2cb9c |
'email': 'bar@pingou.com',
|
|
Patrick Uiterwijk |
b2cb9c |
'branch': 'master',
|
|
Patrick Uiterwijk |
b2cb9c |
'csrf_token': self.get_csrf(),
|
|
Patrick Uiterwijk |
b2cb9c |
}
|
|
Patrick Uiterwijk |
b2cb9c |
|
|
Patrick Uiterwijk |
b2cb9c |
output = self.app.post(
|
|
Patrick Uiterwijk |
b2cb9c |
'/hooktest/edit/master/f/sources', data=data,
|
|
Patrick Uiterwijk |
b2cb9c |
follow_redirects=True)
|
|
Patrick Uiterwijk |
b2cb9c |
self.assertEqual(output.status_code, 200)
|
|
Patrick Uiterwijk |
b2cb9c |
output_text = output.get_data(as_text=True)
|
|
Patrick Uiterwijk |
b2cb9c |
self.assertIn(
|
|
Patrick Uiterwijk |
b2cb9c |
'<title>Commits - hooktest - Pagure</title>', output_text)
|
|
Patrick Uiterwijk |
b2cb9c |
self.assertIn('test commit', output_text)
|
|
Patrick Uiterwijk |
b2cb9c |
|
|
Patrick Uiterwijk |
b2cb9c |
# Check file after the commit
|
|
Patrick Uiterwijk |
b2cb9c |
output = self.app.get('/hooktest/raw/master/f/sources')
|
|
Patrick Uiterwijk |
b2cb9c |
self.assertEqual(output.status_code, 200)
|
|
Patrick Uiterwijk |
b2cb9c |
output_text = output.get_data(as_text=True)
|
|
Patrick Uiterwijk |
b2cb9c |
self.assertEqual(output_text, 'foo\n bar\n baz')
|
|
Patrick Uiterwijk |
b2cb9c |
|
|
Patrick Uiterwijk |
b2cb9c |
def test_edit_with_all_denied(self):
|
|
Patrick Uiterwijk |
b2cb9c |
"""Tests that editing a file is not possible if ACLs say denied."""
|
|
Patrick Uiterwijk |
b2cb9c |
self.set_auth_status(False)
|
|
Patrick Uiterwijk |
b2cb9c |
|
|
Patrick Uiterwijk |
b2cb9c |
user = tests.FakeUser()
|
|
Patrick Uiterwijk |
b2cb9c |
user.username = 'pingou'
|
|
Patrick Uiterwijk |
b2cb9c |
with tests.user_set(self.app.application, user):
|
|
Patrick Uiterwijk |
b2cb9c |
# Add some content to the git repo
|
|
Patrick Uiterwijk |
b2cb9c |
tests.add_content_git_repo(
|
|
Patrick Uiterwijk |
b2cb9c |
os.path.join(self.path, 'repos', 'hooktest.git'))
|
|
Patrick Uiterwijk |
b2cb9c |
|
|
Patrick Uiterwijk |
b2cb9c |
data = {
|
|
Patrick Uiterwijk |
b2cb9c |
'content': 'foo\n bar\n baz',
|
|
Patrick Uiterwijk |
b2cb9c |
'commit_title': 'test commit',
|
|
Patrick Uiterwijk |
b2cb9c |
'commit_message': 'Online commits from the gure.lib.get',
|
|
Patrick Uiterwijk |
b2cb9c |
'email': 'bar@pingou.com',
|
|
Patrick Uiterwijk |
b2cb9c |
'branch': 'master',
|
|
Patrick Uiterwijk |
d29158 |
'csrf_token': self.get_csrf(),
|
|
Patrick Uiterwijk |
b2cb9c |
}
|
|
Patrick Uiterwijk |
b2cb9c |
|
|
Patrick Uiterwijk |
b2cb9c |
output = self.app.post(
|
|
Patrick Uiterwijk |
b2cb9c |
'/hooktest/edit/master/f/sources', data=data,
|
|
Patrick Uiterwijk |
b2cb9c |
follow_redirects=True)
|
|
Patrick Uiterwijk |
b2cb9c |
self.assertEqual(output.status_code, 200)
|
|
Patrick Uiterwijk |
b2cb9c |
output_text = output.get_data(as_text=True)
|
|
Patrick Uiterwijk |
b2cb9c |
self.assertIn(
|
|
Pierre-Yves Chibon |
6d6656 |
"Remote hook declined the push: Running hooks for hooktest\n"
|
|
Patrick Uiterwijk |
b2cb9c |
"Denied push for ref 'refs/heads/master' for user 'pingou'\n"
|
|
Patrick Uiterwijk |
b2cb9c |
"All changes have been rejected",
|
|
Patrick Uiterwijk |
b2cb9c |
output_text
|
|
Patrick Uiterwijk |
b2cb9c |
)
|
|
Patrick Uiterwijk |
b2cb9c |
|
|
Patrick Uiterwijk |
b2cb9c |
# Check file after the commit:
|
|
Patrick Uiterwijk |
b2cb9c |
output = self.app.get('/hooktest/raw/master/f/sources')
|
|
Patrick Uiterwijk |
b2cb9c |
self.assertEqual(output.status_code, 200)
|
|
Patrick Uiterwijk |
b2cb9c |
output_text = output.get_data(as_text=True)
|
|
Patrick Uiterwijk |
b2cb9c |
self.assertEqual(output_text, 'foo\n bar')
|
|
Patrick Uiterwijk |
b2cb9c |
|
|
Patrick Uiterwijk |
b2cb9c |
def test_edit_pr(self):
|
|
Patrick Uiterwijk |
b2cb9c |
"""Tests the ACLs if they only accept PRs."""
|
|
Patrick Uiterwijk |
b2cb9c |
self.set_auth_status({'refs/heads/master': 'pronly',
|
|
Patrick Uiterwijk |
b2cb9c |
'refs/heads/source': True})
|
|
Patrick Uiterwijk |
b2cb9c |
|
|
Patrick Uiterwijk |
b2cb9c |
user = tests.FakeUser()
|
|
Patrick Uiterwijk |
b2cb9c |
user.username = 'pingou'
|
|
Patrick Uiterwijk |
b2cb9c |
with tests.user_set(self.app.application, user):
|
|
Patrick Uiterwijk |
b2cb9c |
# Add some content to the git repo
|
|
Patrick Uiterwijk |
b2cb9c |
tests.add_content_git_repo(
|
|
Patrick Uiterwijk |
b2cb9c |
os.path.join(self.path, 'repos', 'hooktest.git'))
|
|
Patrick Uiterwijk |
b2cb9c |
|
|
Patrick Uiterwijk |
b2cb9c |
# Try editing master branch, should fail (only PRs allowed)
|
|
Patrick Uiterwijk |
b2cb9c |
data = {
|
|
Patrick Uiterwijk |
b2cb9c |
'content': 'foo\n bar\n baz',
|
|
Patrick Uiterwijk |
b2cb9c |
'commit_title': 'test commit',
|
|
Patrick Uiterwijk |
b2cb9c |
'commit_message': 'Online commits from the gure.lib.get',
|
|
Patrick Uiterwijk |
b2cb9c |
'email': 'bar@pingou.com',
|
|
Patrick Uiterwijk |
b2cb9c |
'branch': 'master',
|
|
Patrick Uiterwijk |
d29158 |
'csrf_token': self.get_csrf(),
|
|
Patrick Uiterwijk |
b2cb9c |
}
|
|
Patrick Uiterwijk |
b2cb9c |
output = self.app.post(
|
|
Patrick Uiterwijk |
b2cb9c |
'/hooktest/edit/master/f/sources', data=data,
|
|
Patrick Uiterwijk |
b2cb9c |
follow_redirects=True)
|
|
Patrick Uiterwijk |
b2cb9c |
self.assertEqual(output.status_code, 200)
|
|
Patrick Uiterwijk |
b2cb9c |
output_text = output.get_data(as_text=True)
|
|
Patrick Uiterwijk |
b2cb9c |
self.assertIn(
|
|
Pierre-Yves Chibon |
6d6656 |
"Remote hook declined the push: Running hooks for hooktest\n"
|
|
Patrick Uiterwijk |
b2cb9c |
"Denied push for ref 'refs/heads/master' for user 'pingou'\n"
|
|
Patrick Uiterwijk |
b2cb9c |
"All changes have been rejected",
|
|
Patrick Uiterwijk |
b2cb9c |
output_text
|
|
Patrick Uiterwijk |
b2cb9c |
)
|
|
Patrick Uiterwijk |
b2cb9c |
|
|
Patrick Uiterwijk |
b2cb9c |
# Change something in the "source" branch
|
|
Patrick Uiterwijk |
b2cb9c |
data = {
|
|
Patrick Uiterwijk |
b2cb9c |
'content': 'foo\n bar\n baz',
|
|
Patrick Uiterwijk |
b2cb9c |
'commit_title': 'test commit',
|
|
Patrick Uiterwijk |
b2cb9c |
'commit_message': 'Online commits from the gure.lib.get',
|
|
Patrick Uiterwijk |
b2cb9c |
'email': 'bar@pingou.com',
|
|
Patrick Uiterwijk |
b2cb9c |
'branch': 'source',
|
|
Patrick Uiterwijk |
d29158 |
'csrf_token': self.get_csrf(),
|
|
Patrick Uiterwijk |
b2cb9c |
}
|
|
Patrick Uiterwijk |
b2cb9c |
|
|
Patrick Uiterwijk |
b2cb9c |
output = self.app.post(
|
|
Patrick Uiterwijk |
b2cb9c |
'/hooktest/edit/master/f/sources', data=data,
|
|
Patrick Uiterwijk |
b2cb9c |
follow_redirects=True)
|
|
Patrick Uiterwijk |
b2cb9c |
self.assertEqual(output.status_code, 200)
|
|
Patrick Uiterwijk |
b2cb9c |
output_text = output.get_data(as_text=True)
|
|
Patrick Uiterwijk |
b2cb9c |
self.assertIn(
|
|
Patrick Uiterwijk |
b2cb9c |
'<title>Commits - hooktest - Pagure</title>', output_text)
|
|
Patrick Uiterwijk |
b2cb9c |
self.assertIn('test commit', output_text)
|
|
Patrick Uiterwijk |
b2cb9c |
|
|
Patrick Uiterwijk |
b2cb9c |
# Check file after the commit:
|
|
Patrick Uiterwijk |
b2cb9c |
output = self.app.get('/hooktest/raw/source/f/sources')
|
|
Patrick Uiterwijk |
b2cb9c |
self.assertEqual(output.status_code, 200)
|
|
Patrick Uiterwijk |
b2cb9c |
output_text = output.get_data(as_text=True)
|
|
Patrick Uiterwijk |
b2cb9c |
self.assertEqual(output_text, 'foo\n bar\n baz')
|
|
Patrick Uiterwijk |
b2cb9c |
|
|
Patrick Uiterwijk |
b2cb9c |
# Create the PRs
|
|
Patrick Uiterwijk |
b2cb9c |
project = pagure.lib.get_authorized_project(self.session, 'hooktest')
|
|
Patrick Uiterwijk |
b2cb9c |
req = pagure.lib.new_pull_request(
|
|
Patrick Uiterwijk |
b2cb9c |
session=self.session,
|
|
Patrick Uiterwijk |
b2cb9c |
repo_from=project,
|
|
Patrick Uiterwijk |
b2cb9c |
branch_from="source",
|
|
Patrick Uiterwijk |
b2cb9c |
repo_to=project,
|
|
Patrick Uiterwijk |
b2cb9c |
branch_to='master',
|
|
Patrick Uiterwijk |
b2cb9c |
title='PR to master',
|
|
Patrick Uiterwijk |
b2cb9c |
user='pingou',
|
|
Patrick Uiterwijk |
b2cb9c |
)
|
|
Patrick Uiterwijk |
b2cb9c |
self.session.add(req)
|
|
Patrick Uiterwijk |
b2cb9c |
self.session.commit()
|
|
Patrick Uiterwijk |
b2cb9c |
|
|
Patrick Uiterwijk |
b2cb9c |
# Check file before the merge
|
|
Patrick Uiterwijk |
b2cb9c |
output = self.app.get('/hooktest/raw/master/f/sources')
|
|
Patrick Uiterwijk |
b2cb9c |
self.assertEqual(output.status_code, 200)
|
|
Patrick Uiterwijk |
b2cb9c |
output_text = output.get_data(as_text=True)
|
|
Patrick Uiterwijk |
b2cb9c |
self.assertEqual(output_text, 'foo\n bar')
|
|
Patrick Uiterwijk |
b2cb9c |
|
|
Patrick Uiterwijk |
b2cb9c |
# Try to merge (should work)
|
|
Patrick Uiterwijk |
b2cb9c |
output = self.app.post(
|
|
Patrick Uiterwijk |
b2cb9c |
'/hooktest/pull-request/1/merge', data=data, follow_redirects=True)
|
|
Patrick Uiterwijk |
b2cb9c |
self.assertEqual(output.status_code, 200)
|
|
Patrick Uiterwijk |
b2cb9c |
output_text = output.get_data(as_text=True)
|
|
Patrick Uiterwijk |
b2cb9c |
self.assertIn(
|
|
Patrick Uiterwijk |
b2cb9c |
'<title>Overview - hooktest - Pagure</title>',
|
|
Patrick Uiterwijk |
b2cb9c |
output_text
|
|
Patrick Uiterwijk |
b2cb9c |
)
|
|
Patrick Uiterwijk |
b2cb9c |
|
|
Patrick Uiterwijk |
b2cb9c |
# Check file after the merge
|
|
Patrick Uiterwijk |
b2cb9c |
output = self.app.get('/hooktest/raw/master/f/sources')
|
|
Patrick Uiterwijk |
b2cb9c |
self.assertEqual(output.status_code, 200)
|
|
Patrick Uiterwijk |
b2cb9c |
output_text = output.get_data(as_text=True)
|
|
Patrick Uiterwijk |
b2cb9c |
self.assertEqual(output_text, 'foo\n bar\n baz')
|