Blame tests/test_pagure_lib_git_auth.py

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(
Patrick Uiterwijk b2cb9c
                "Remote hook declined the push: "
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(
Patrick Uiterwijk b2cb9c
                "Remote hook declined the push: "
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')