From 6c6084c1392f93398b44fe5e4a4c91f264f2bc68 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Mar 13 2016 10:34:37 +0000 Subject: [PATCH 1/23] Add a hook_type to each hook This will allow having different types of hooks --- diff --git a/pagure/hooks/__init__.py b/pagure/hooks/__init__.py index c8a2c42..400bdd2 100644 --- a/pagure/hooks/__init__.py +++ b/pagure/hooks/__init__.py @@ -42,6 +42,7 @@ class BaseHook(object): name = None form = None description = None + hook_type = 'post-receive' @classmethod def set_up(cls, project): @@ -66,10 +67,10 @@ class BaseHook(object): os.makedirs(hookfolder) # Install the main post-receive file - postreceive = os.path.join(hookfolder, 'post-receive') + postreceive = os.path.join(hookfolder, cls.hook_type) if not os.path.exists(postreceive): shutil.copyfile( - os.path.join(hook_files, 'post-receive'), + os.path.join(hook_files, cls.hook_type), postreceive) os.chmod(postreceive, 0755) From 6eb1cc70677e043531de9c144577abf195087c1e Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Mar 13 2016 10:34:37 +0000 Subject: [PATCH 2/23] Adjust the variable names in is_forced_push to fit with the documentation --- diff --git a/pagure/lib/git.py b/pagure/lib/git.py index 9629774..ecf0f18 100644 --- a/pagure/lib/git.py +++ b/pagure/lib/git.py @@ -858,11 +858,13 @@ def get_revs_between(torev, fromrev, abspath, forced=False): return pagure.lib.git.read_git_lines(cmd, abspath) -def is_forced_push(torev, fromrev, abspath): - """ Returns wether there was a force push between HEAD and BASE. """ +def is_forced_push(oldrev, newrev, abspath): + """ Returns wether there was a force push between HEAD and BASE. + Doc: http://stackoverflow.com/a/12258773 + """ # Returns if there was any commits deleted in the changeset - cmd = ['rev-list', '%s' % torev, '^%s' % (fromrev)] + cmd = ['rev-list', '%s' % oldrev, '^%s' % newrev] out = pagure.lib.git.read_git_lines(cmd, abspath) return len(out) > 0 From bd3434ca4fb7a4bc86cae982a6bc4933ce445889 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Mar 13 2016 10:34:37 +0000 Subject: [PATCH 3/23] Add a generic pre-receive hook This hook will call all the pre-receive.foo hooks installed --- diff --git a/pagure/hooks/files/pre-receive b/pagure/hooks/files/pre-receive new file mode 100644 index 0000000..8a63e5c --- /dev/null +++ b/pagure/hooks/files/pre-receive @@ -0,0 +1,23 @@ +#!/bin/bash +# +# author: orefalo + +hookname=`basename $0` + + +FILE=`mktemp` +trap 'rm -f $FILE' EXIT +cat - > $FILE + +for hook in $GIT_DIR/hooks/$hookname.* +do + if test -x "$hook"; then + cat $FILE | $hook "$@" + status=$? + + if test $status -ne 0; then + echo Hook $hook failed with error code $status + exit $status + fi + fi +done From a5a9fdcfbd144711c5ff71921b97bef1bf0ec176 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Mar 13 2016 10:34:37 +0000 Subject: [PATCH 4/23] Add a pre-receive plugin allowing to block non fast-forward pushes on a per branch basis --- diff --git a/pagure/hooks/files/pagure_force_commit_hook.py b/pagure/hooks/files/pagure_force_commit_hook.py new file mode 100755 index 0000000..a1bacd4 --- /dev/null +++ b/pagure/hooks/files/pagure_force_commit_hook.py @@ -0,0 +1,82 @@ +#! /usr/bin/env python2 + + +"""Pagure specific hook to add comment on issues if the commits fixes or +relates to an issue. +""" + +import os +import sys + +from sqlalchemy.exc import SQLAlchemyError + + +if 'PAGURE_CONFIG' not in os.environ \ + and os.path.exists('/etc/pagure/pagure.cfg'): + os.environ['PAGURE_CONFIG'] = '/etc/pagure/pagure.cfg' + + +import pagure +import pagure.exceptions +import pagure.lib.link +import pagure.ui.plugins + + +abspath = os.path.abspath(os.environ['GIT_DIR']) + + +def run_as_pre_receive_hook(): + reponame = pagure.lib.git.get_repo_name(abspath) + username = pagure.lib.git.get_username(abspath) + if pagure.APP.config.get('HOOK_DEBUG', False): + print 'repo:', reponame + print 'user:', username + + repo = pagure.lib.get_project(pagure.SESSION, reponame, user=username) + if not repo: + print 'Unknown repo %s of username: %s' % (reponame, username) + sys.exit(1) + + plugin = pagure.ui.plugins.get_plugin('Block non fast-forward pushes') + dbobj = plugin.db_object() + # Get the list of branches + branches = [ + branch.strip() + for branch in repo.pagure_force_commit_hook[0].branches.split(',') + if repo.pagure_force_commit_hook] + + # Remove empty branches + branches = [ + branch.strip() + for branch in branches + if branch] + + for line in sys.stdin: + if pagure.APP.config.get('HOOK_DEBUG', False): + print line + (oldrev, newrev, refname) = line.strip().split(' ', 2) + + refname = refname.replace('refs/heads/', '') + if refname in branches: + if pagure.APP.config.get('HOOK_DEBUG', False): + print ' -- Old rev' + print oldrev + print ' -- New rev' + print newrev + print ' -- Ref name' + print refname + + if set(newrev) == set(['0']): + print "Deletion is forbidden" + sys.exit(1) + elif pagure.lib.git.is_forced_push(oldrev, newrev, abspath): + print "Non fast-forward push are forbidden" + sys.exit(1) + + +def main(args): + run_as_pre_receive_hook() + + +if __name__ == '__main__': + main(sys.argv[1:]) diff --git a/pagure/hooks/pagure_force_commit.py b/pagure/hooks/pagure_force_commit.py new file mode 100644 index 0000000..09b8930 --- /dev/null +++ b/pagure/hooks/pagure_force_commit.py @@ -0,0 +1,128 @@ +# -*- coding: utf-8 -*- + +""" + (c) 2016 - Copyright Red Hat Inc + + Authors: + Pierre-Yves Chibon + +""" + +import os + +import sqlalchemy as sa +import pygit2 +import wtforms +from flask.ext import wtf +from sqlalchemy.orm import relation +from sqlalchemy.orm import backref + +from pagure.hooks import BaseHook, RequiredIf +from pagure.lib.model import BASE, Project +from pagure import APP, get_repo_path + + +class PagureForceCommitTable(BASE): + """ Stores information about the pagure hook deployed on a project. + + Table -- hook_pagure_force_commit + """ + + __tablename__ = 'hook_pagure_force_commit' + + id = sa.Column(sa.Integer, primary_key=True) + project_id = sa.Column( + sa.Integer, + sa.ForeignKey('projects.id', onupdate='CASCADE'), + nullable=False, + unique=True, + index=True) + + branches = sa.Column(sa.Text, nullable=False) + + active = sa.Column(sa.Boolean, nullable=False, default=False) + + project = relation( + 'Project', foreign_keys=[project_id], remote_side=[Project.id], + backref=backref( + 'pagure_force_commit_hook', cascade="delete, delete-orphan", + single_parent=True) + ) + + +class PagureForceCommitForm(wtf.Form): + ''' Form to configure the pagure hook. ''' + branches = wtforms.TextField( + 'Branches', + [RequiredIf('active')] + ) + + active = wtforms.BooleanField( + 'Active', + [wtforms.validators.Optional()] + ) + + +class PagureForceCommitHook(BaseHook): + ''' PagurPagureForceCommit hook. ''' + + name = 'Block non fast-forward pushes' + description = 'Using this hook you can block any non-fast-forward '\ + 'commit forced pushed to one or more branches' + form = PagureForceCommitForm + db_object = PagureForceCommitTable + backref = 'pagure_force_commit_hook' + form_fields = ['branches', 'active'] + hook_type = 'pre-receive' + + @classmethod + def install(cls, project, dbobj): + ''' Method called to install the hook for a project. + + :arg project: a ``pagure.model.Project`` object to which the hook + should be installed + + ''' + repopaths = [get_repo_path(project)] + for folder in [ + APP.config.get('DOCS_FOLDER'), + APP.config.get('REQUESTS_FOLDER')]: + repopaths.append( + os.path.join(folder, project.path) + ) + + hook_files = os.path.join( + os.path.dirname(os.path.realpath(__file__)), 'files') + hook_file = os.path.join(hook_files, 'pagure_force_commit_hook.py') + + for repopath in repopaths: + # Init the git repo in case + pygit2.Repository(repopath) + + # Install the hook itself + hook_path = os.path.join( + repopath, 'hooks', 'pre-receive.pagureforcecommit') + if not os.path.exists(hook_path): + os.symlink(hook_file, hook_path) + + @classmethod + def remove(cls, project): + ''' Method called to remove the hook of a project. + + :arg project: a ``pagure.model.Project`` object to which the hook + should be installed + + ''' + repopaths = [get_repo_path(project)] + for folder in [ + APP.config.get('DOCS_FOLDER'), + APP.config.get('REQUESTS_FOLDER')]: + repopaths.append( + os.path.join(folder, project.path) + ) + + for repopath in repopaths: + hook_path = os.path.join( + repopath, 'hooks', 'pre-receive.pagureforcecommit') + if os.path.exists(hook_path): + os.unlink(hook_path) From 4d09a391d06e7d2411a2d04db231991a7ef8d13d Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Mar 13 2016 10:34:37 +0000 Subject: [PATCH 5/23] Small code-style change --- diff --git a/pagure/lib/__init__.py b/pagure/lib/__init__.py index b7cff50..487099c 100644 --- a/pagure/lib/__init__.py +++ b/pagure/lib/__init__.py @@ -1228,7 +1228,8 @@ def update_project_settings(session, repo, settings, user): update.append(key) if key == 'Minimum_score_to_merge_pull-request': try: - settings[key] = int(settings[key]) if settings[key] else -1 + settings[key] = int(settings[key]) \ + if settings[key] else -1 except ValueError: raise pagure.exceptions.PagureException( "Please enter a numeric value for the 'minimum " From 5c0b88c26ee836af3c45d94dc09a3ed75da773e2 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Mar 13 2016 22:13:46 +0000 Subject: [PATCH 6/23] The no-FF git hook is only applicable to the main git repo --- diff --git a/pagure/hooks/pagure_force_commit.py b/pagure/hooks/pagure_force_commit.py index 09b8930..4715653 100644 --- a/pagure/hooks/pagure_force_commit.py +++ b/pagure/hooks/pagure_force_commit.py @@ -83,27 +83,20 @@ class PagureForceCommitHook(BaseHook): should be installed ''' - repopaths = [get_repo_path(project)] - for folder in [ - APP.config.get('DOCS_FOLDER'), - APP.config.get('REQUESTS_FOLDER')]: - repopaths.append( - os.path.join(folder, project.path) - ) + repopath = get_repo_path(project) hook_files = os.path.join( os.path.dirname(os.path.realpath(__file__)), 'files') hook_file = os.path.join(hook_files, 'pagure_force_commit_hook.py') - for repopath in repopaths: - # Init the git repo in case - pygit2.Repository(repopath) + # Init the git repo in case + pygit2.Repository(repopath) - # Install the hook itself - hook_path = os.path.join( - repopath, 'hooks', 'pre-receive.pagureforcecommit') - if not os.path.exists(hook_path): - os.symlink(hook_file, hook_path) + # Install the hook itself + hook_path = os.path.join( + repopath, 'hooks', 'pre-receive.pagureforcecommit') + if not os.path.exists(hook_path): + os.symlink(hook_file, hook_path) @classmethod def remove(cls, project): From 61e02d1bb1382dbe3fad7a47fe725c15c44f2469 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Mar 13 2016 22:14:34 +0000 Subject: [PATCH 7/23] Adjust unit-test for the new no-FF plugin --- diff --git a/tests/test_pagure_flask_ui_plugins.py b/tests/test_pagure_flask_ui_plugins.py index 17b89c4..2c57287 100644 --- a/tests/test_pagure_flask_ui_plugins.py +++ b/tests/test_pagure_flask_ui_plugins.py @@ -69,8 +69,8 @@ class PagureFlaskPluginstests(tests.Modeltests): names = pagure.ui.plugins.get_plugin_names() self.assertEqual( sorted(names), - ['Fedmsg', 'IRC', 'Mail', 'pagure', 'pagure requests', - 'pagure tickets']) + ['Block non fast-forward pushes', 'Fedmsg', 'IRC', 'Mail', + 'pagure', 'pagure requests', 'pagure tickets']) def test_get_plugin(self): """ Test the get_plugin function. """ From 447126eed37aadd44b99795a2d8be37193eeaacf Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Mar 13 2016 22:15:54 +0000 Subject: [PATCH 8/23] Add unit-test for the new no-FF plugin --- diff --git a/tests/test_pagure_flask_ui_plugins_noff.py b/tests/test_pagure_flask_ui_plugins_noff.py new file mode 100644 index 0000000..039350f --- /dev/null +++ b/tests/test_pagure_flask_ui_plugins_noff.py @@ -0,0 +1,237 @@ +# -*- coding: utf-8 -*- + +""" + (c) 2016 - Copyright Red Hat Inc + + Authors: + Pierre-Yves Chibon + +""" + +__requires__ = ['SQLAlchemy >= 0.8'] +import pkg_resources + +import json +import unittest +import shutil +import sys +import os + +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 + + +class PagureFlaskPluginNoFFtests(tests.Modeltests): + """ Tests for Block non fast-forward pushes plugin of pagure """ + + def setUp(self): + """ Set up the environnment, ran before every tests. """ + super(PagureFlaskPluginNoFFtests, self).setUp() + + pagure.APP.config['TESTING'] = True + pagure.SESSION = self.session + pagure.ui.SESSION = self.session + pagure.ui.app.SESSION = self.session + pagure.ui.plugins.SESSION = self.session + pagure.ui.repo.SESSION = self.session + pagure.ui.filters.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') + self.app = pagure.APP.test_client() + + def test_plugin_noff(self): + """ Test the noff plugin on/off endpoint. """ + + tests.create_projects(self.session) + + user = tests.FakeUser(username='pingou') + with tests.user_set(pagure.APP, user): + output = self.app.get( + '/test/settings/Block non fast-forward pushes') + self.assertEqual(output.status_code, 200) + self.assertIn( + '
\n' + 'test project #1
', output.data) + self.assertIn( + '

Block non fast-forward pushes settings

', + output.data) + self.assertIn( + '', output.data) + self.assertTrue( + '' + in output.data) + + csrf_token = output.data.split( + 'name="csrf_token" type="hidden" value="')[1].split('">')[0] + + data = {} + + output = self.app.post( + '/test/settings/Block non fast-forward pushes', data=data) + self.assertEqual(output.status_code, 200) + self.assertIn( + '
\n' + 'test project #1
', output.data) + self.assertIn( + '

Block non fast-forward pushes settings

', + output.data) + self.assertIn( + '', output.data) + self.assertTrue( + '' + in output.data) + + data['csrf_token'] = csrf_token + # No git found + output = self.app.post( + '/test/settings/Block non fast-forward pushes', data=data) + self.assertEqual(output.status_code, 404) + + tests.create_projects_git(tests.HERE) + + # With the git repo + output = self.app.post( + '/test/settings/Block non fast-forward pushes', + data=data, follow_redirects=True) + self.assertEqual(output.status_code, 200) + self.assertIn( + '
\n

Settings for test

', + output.data) + self.assertTrue( + '\n Hook Block non ' + 'fast-forward pushes inactived' in output.data) + + output = self.app.get( + '/test/settings/Block non fast-forward pushes') + self.assertEqual(output.status_code, 200) + self.assertIn( + '
\n' + 'test project #1
', output.data) + self.assertIn( + '

Block non fast-forward pushes settings

', + output.data) + self.assertIn( + '', output.data) + self.assertTrue( + '' + in output.data) + + self.assertFalse(os.path.exists(os.path.join( + tests.HERE, 'test.git', 'hooks', 'post-receive.mail'))) + + # Missing the required mail_to + data = {'csrf_token': csrf_token, 'active': 'y'} + + output = self.app.post( + '/test/settings/Block non fast-forward pushes', + data=data, follow_redirects=True) + self.assertEqual(output.status_code, 200) + self.assertIn( + '
\n' + 'test project #1
', output.data) + self.assertIn( + '

Block non fast-forward pushes settings

', + output.data) + self.assertNotIn( + '\n Hook activated', + output.data) + self.assertIn( + '', output.data) + self.assertTrue( + '' in output.data) + + self.assertFalse(os.path.exists(os.path.join( + tests.HERE, 'test.git', 'hooks', + 'pre-receive.pagureforcecommit'))) + + # Activate hook + data = { + 'csrf_token': csrf_token, + 'active': 'y', + 'branches': 'master', + } + + output = self.app.post( + '/test/settings/Block non fast-forward pushes', + data=data, follow_redirects=True) + self.assertEqual(output.status_code, 200) + self.assertIn( + '

Settings for test

', + output.data) + self.assertIn( + '\n Hook Block non ' + 'fast-forward pushes activated', output.data) + + output = self.app.get( + '/test/settings/Block non fast-forward pushes') + self.assertIn( + '
\n' + 'test project #1
', output.data) + self.assertIn( + '

Block non fast-forward pushes settings

', + output.data) + self.assertIn( + '', output.data) + self.assertIn( + '', output.data) + + self.assertTrue(os.path.exists(os.path.join( + tests.HERE, 'test.git', 'hooks', + 'pre-receive.pagureforcecommit'))) + + # De-Activate hook + data = {'csrf_token': csrf_token} + output = self.app.post( + '/test/settings/Block non fast-forward pushes', + data=data, follow_redirects=True) + self.assertEqual(output.status_code, 200) + self.assertIn( + '
\n

Settings for test

', + output.data) + self.assertIn( + '\n Hook Block non ' + 'fast-forward pushes inactived', output.data) + + output = self.app.get( + '/test/settings/Block non fast-forward pushes') + self.assertIn( + '
\n' + 'test project #1
', output.data) + self.assertIn( + '

Block non fast-forward pushes settings

', + output.data) + self.assertIn( + '', output.data) + self.assertIn( + '', output.data) + + self.assertFalse(os.path.exists(os.path.join( + tests.HERE, 'test.git', 'hooks', + 'pre-receive.pagureforcecommit'))) + + +if __name__ == '__main__': + SUITE = unittest.TestLoader().loadTestsFromTestCase( + PagureFlaskPluginNoFFtests) + unittest.TextTestRunner(verbosity=2).run(SUITE) From 756512f610662adcc476bda4c5c9ad32502ba698 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Mar 13 2016 22:18:34 +0000 Subject: [PATCH 9/23] Port pagure to python3 --- diff --git a/pagure/__init__.py b/pagure/__init__.py index 32f4b41..ad86491 100644 --- a/pagure/__init__.py +++ b/pagure/__init__.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """ - (c) 2014-2015 - Copyright Red Hat Inc + (c) 2014-2016 - Copyright Red Hat Inc Authors: Pierre-Yves Chibon @@ -20,14 +20,15 @@ import datetime import logging import os import subprocess -import urlparse from logging.handlers import SMTPHandler import flask import pygit2 +import six import werkzeug from functools import wraps from sqlalchemy.exc import SQLAlchemyError +from six.moves.urllib.parse import urlparse, urljoin from pygments import highlight from pygments.lexers.text import DiffLexer @@ -179,9 +180,8 @@ def is_safe_url(target): # pragma: no cover """ Checks that the target url is safe and sending to the current website not some other malicious one. """ - ref_url = urlparse.urlparse(flask.request.host_url) - test_url = urlparse.urlparse( - urlparse.urljoin(flask.request.host_url, target)) + ref_url = urlparse(flask.request.host_url) + test_url = urlparse(urljoin(flask.request.host_url, target)) return test_url.scheme in ('http', 'https') and \ ref_url.netloc == test_url.netloc @@ -199,7 +199,7 @@ def is_admin(): return False admins = APP.config['ADMIN_GROUP'] - if isinstance(admins, basestring): + if isinstance(admins, six.string_types): admins = [admins] admins = set(admins) groups = set(flask.g.fas_user.groups) @@ -318,7 +318,7 @@ def auth_login(): # pragma: no cover return flask.redirect(return_point) admins = APP.config['ADMIN_GROUP'] - if isinstance(admins, basestring): + if isinstance(admins, six.string_types): admins = set([admins]) else: # pragma: no cover admins = set(admins) diff --git a/pagure/docs_server.py b/pagure/docs_server.py index dad385e..866f5a9 100644 --- a/pagure/docs_server.py +++ b/pagure/docs_server.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """ - (c) 2014-2015 - Copyright Red Hat Inc + (c) 2014-2016 - Copyright Red Hat Inc Authors: Pierre-Yves Chibon @@ -107,7 +107,8 @@ def __get_tree_and_content(repo_obj, commit, path): if isinstance(blob_or_tree, pygit2.TreeEntry): # Returned a file ext = os.path.splitext(blob_or_tree.name)[1] blob_obj = repo_obj[blob_or_tree.oid] - content, safe = pagure.doc_utils.convert_readme(blob_obj.data, ext) + content, safe = pagure.doc_utils.convert_readme( + blob_obj.data.decode('utf-8'), ext) tree = sorted(tree_obj, key=lambda x: x.filemode) return (tree, content, safe, extended) @@ -157,7 +158,7 @@ def view_docs(repo, username=None, filename=None): if extended: filename += '/' except pagure.exceptions.FileNotFoundException as err: - flask.flash(err.message, 'error') + flask.flash('%s' % err, 'error') mimetype = None if not filename: diff --git a/pagure/hooks/__init__.py b/pagure/hooks/__init__.py index 400bdd2..01c3684 100644 --- a/pagure/hooks/__init__.py +++ b/pagure/hooks/__init__.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """ - (c) 2014 - Copyright Red Hat Inc + (c) 2014-2016 - Copyright Red Hat Inc Authors: Pierre-Yves Chibon @@ -10,6 +10,8 @@ import os import shutil + +import six import wtforms from pagure import APP, get_repo_path @@ -21,7 +23,7 @@ class RequiredIf(wtforms.validators.Required): """ def __init__(self, fields, *args, **kwargs): - if isinstance(fields, basestring): + if isinstance(fields, six.string_types): fields = [fields] self.fields = fields super(RequiredIf, self).__init__(*args, **kwargs) @@ -72,7 +74,7 @@ class BaseHook(object): shutil.copyfile( os.path.join(hook_files, cls.hook_type), postreceive) - os.chmod(postreceive, 0755) + os.chmod(postreceive, 0o755) @classmethod def install(cls, project, dbobj): # pragma: no cover diff --git a/pagure/hooks/files/fedmsg_hook.py b/pagure/hooks/files/fedmsg_hook.py index 043bc6c..cb5ccca 100755 --- a/pagure/hooks/files/fedmsg_hook.py +++ b/pagure/hooks/files/fedmsg_hook.py @@ -9,6 +9,7 @@ from collections import defaultdict import fedmsg import fedmsg.config +import six if 'PAGURE_CONFIG' not in os.environ \ diff --git a/pagure/hooks/files/git_multimail.py b/pagure/hooks/files/git_multimail.py index 88930c3..2ae4576 100755 --- a/pagure/hooks/files/git_multimail.py +++ b/pagure/hooks/files/git_multimail.py @@ -56,6 +56,8 @@ import optparse import smtplib import time +import six + try: from email.utils import make_msgid from email.utils import getaddresses @@ -1457,7 +1459,7 @@ class SMTPMailer(Mailer): try: msg = ''.join(lines) # turn comma-separated list into Python list if needed. - if isinstance(to_addrs, basestring): + if isinstance(to_addrs, six.string_types): to_addrs = [ email for (name, email) in getaddresses([to_addrs])] self.smtp.sendmail(self.envelopesender, to_addrs, msg) diff --git a/pagure/lib/__init__.py b/pagure/lib/__init__.py index 487099c..34db698 100644 --- a/pagure/lib/__init__.py +++ b/pagure/lib/__init__.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """ - (c) 2014-2015 - Copyright Red Hat Inc + (c) 2014-2016 - Copyright Red Hat Inc Authors: Pierre-Yves Chibon @@ -18,14 +18,16 @@ import markdown import os import shutil import tempfile -import urlparse import uuid +from datetime import timedelta import bleach import redis +import six import sqlalchemy import sqlalchemy.schema -from datetime import timedelta + +from six.moves.urllib_parse import urlparse, urlencode from sqlalchemy import func from sqlalchemy import asc from sqlalchemy.orm import aliased @@ -257,7 +259,7 @@ def add_tag_obj(session, obj, tags, user, ticketfolder): ''' Add a tag to an object (either an issue or a project). ''' user_obj = __get_user(session, user) - if isinstance(tags, basestring): + if isinstance(tags, six.string_types): tags = [tags] added_tags = [] @@ -316,7 +318,7 @@ def add_tag_obj(session, obj, tags, user, ticketfolder): {'added_tags': added_tags})) if added_tags: - return 'Tag added: %s' % ', '.join(added_tags) + return 'Tag added: %s' % ', '.join(sorted(added_tags)) else: return 'Nothing to add' @@ -607,7 +609,7 @@ def remove_tags_obj( ''' Removes the specified tag(s) of a given object. ''' user_obj = __get_user(session, user) - if isinstance(tags, basestring): + if isinstance(tags, six.string_types): tags = [tags] removed_tags = [] @@ -1576,7 +1578,7 @@ def search_issues( model.Issue.status != 'Open' ) if tags is not None and tags != []: - if isinstance(tags, basestring): + if isinstance(tags, six.string_types): tags = [tags] notags = [] ytags = [] @@ -1656,7 +1658,7 @@ def search_issues( query = query.filter( model.Issue.private == False ) - elif isinstance(private, basestring): + elif isinstance(private, six.string_types): user2 = aliased(model.User) query = query.filter( sqlalchemy.or_( @@ -2023,7 +2025,7 @@ def add_email_to_user(session, user, user_email): def update_user_ssh(session, user, ssh_key, keydir): ''' Set up a new user into the database or update its information. ''' - if isinstance(user, basestring): + if isinstance(user, six.string_types): user = __get_user(session, user) user.public_ssh_key = ssh_key @@ -2051,7 +2053,9 @@ def avatar_url_from_openid(openid, size=64, default='retro', dns=False): else: import urllib import hashlib - query = urllib.urlencode({'s': size, 'd': default}) + query = urlencode({'s': size, 'd': default}) + if six.PY3: + openid = openid.encode('utf-8') hashhex = hashlib.sha256(openid).hexdigest() return "https://seccdn.libravatar.org/avatar/%s?%s" % ( hashhex, query) @@ -2062,7 +2066,7 @@ def update_tags(session, obj, tags, username, ticketfolder): This object can be either an issue or a project. """ - if isinstance(tags, basestring): + if isinstance(tags, six.string_types): tags = [tags] toadd = set(tags) - set(obj.tags_text) @@ -2099,7 +2103,7 @@ def update_dependency_issue( """ Update the dependency of a specified issue (adding or removing them) """ - if isinstance(depends, basestring): + if isinstance(depends, six.string_types): depends = [depends] toadd = set(depends) - set(issue.depends_text) @@ -2156,7 +2160,7 @@ def update_blocked_issue( removing them) """ - if isinstance(blocks, basestring): + if isinstance(blocks, six.string_types): blocks = [blocks] toadd = set(blocks) - set(issue.blocks_text) @@ -2585,8 +2589,8 @@ def filter_img_src(name, value): if name in ('alt', 'height', 'width', 'class'): return True if name == 'src': - p = urlparse.urlparse(value) - return (not p.netloc) or p.netloc == urlparse.urlparse( + p = urlparse(value) + return (not p.netloc) or p.netloc == urlparse( pagure.APP.config['APP_URL']).netloc return False diff --git a/pagure/lib/git.py b/pagure/lib/git.py index ecf0f18..5d4025f 100644 --- a/pagure/lib/git.py +++ b/pagure/lib/git.py @@ -1,12 +1,13 @@ # -*- coding: utf-8 -*- """ - (c) 2015 - Copyright Red Hat Inc + (c) 2015-2016 - Copyright Red Hat Inc Authors: Pierre-Yves Chibon """ +from __future__ import print_function import datetime @@ -19,6 +20,7 @@ import tempfile import re import pygit2 +import six import werkzeug from sqlalchemy.exc import SQLAlchemyError @@ -113,7 +115,7 @@ def write_gitolite_acls(session, configfile): config.append('') with open(configfile, 'w') as stream: - for key, users in groups.iteritems(): + for key, users in groups.items(): stream.write('@%s = %s\n' % (key, ' '.join(users))) stream.write('\n') @@ -646,7 +648,7 @@ def add_file_to_git(repo, issue, ticketfolder, user, filename, filestream): # Write down what changed filestream.seek(0) - with open(file_path, 'w') as stream: + with open(file_path, 'wb') as stream: stream.write(filestream.read()) # Retrieve the list of files that changed @@ -816,11 +818,13 @@ def read_output(cmd, abspath, input=None, keepends=False, **kw): cwd=abspath, **kw) (out, err) = procs.communicate(input) + out = out.decode('utf-8') + err = err.decode('utf-8') retcode = procs.wait() if retcode: - print 'ERROR: %s =-- %s' % (cmd, retcode) - print out - print err + print('ERROR: %s =-- %s' % (cmd, retcode)) + print(out) + print(err) if not keepends: out = out.rstrip('\n\r') return out diff --git a/pagure/lib/login.py b/pagure/lib/login.py index 4227c94..a27c7d5 100644 --- a/pagure/lib/login.py +++ b/pagure/lib/login.py @@ -15,6 +15,7 @@ import bcrypt import hashlib import pagure +import six from pagure.lib import model from kitchen.text.converters import to_unicode, to_bytes from cryptography.hazmat.primitives import constant_time @@ -72,12 +73,19 @@ def get_users_by_group(session, group): def generate_hashed_value(password): """ Generate hash value for password """ - return '$2$' + bcrypt.hashpw(to_unicode(password), bcrypt.gensalt()) + if not six.PY3: + password = to_unicode(password) + else: + password = password.encode('utf-8') + return b'$2$' + bcrypt.hashpw(password, bcrypt.gensalt()) def check_password(entered_password, user_password, seed=None): """ Version checking and returning the password """ + if six.PY3: + if not isinstance(user_password, six.string_types): + user_password = user_password.decode('utf-8') if not user_password.count('$') >= 2: raise pagure.exceptions.PagureException( 'Password of unknown version found in the database' @@ -86,10 +94,19 @@ def check_password(entered_password, user_password, seed=None): _, version, user_password = user_password.split('$', 2) if version == '2': - password = bcrypt.hashpw(to_unicode(entered_password), user_password) + if not six.PY3: + entered_password = to_unicode(entered_password) + else: + entered_password = entered_password.encode('utf-8') + user_password = user_password.encode('utf-8') + password = bcrypt.hashpw(entered_password, user_password) elif version == '1': - password = '%s%s' % (to_unicode(entered_password), seed) + if six.PY3: + password = '%s%s' % (entered_password, seed) + password = password.encode('utf-8') + else: + password = '%s%s' % (to_unicode(entered_password), seed) password = hashlib.sha512(password).hexdigest() else: diff --git a/pagure/lib/notify.py b/pagure/lib/notify.py index 761d356..bb54a2f 100644 --- a/pagure/lib/notify.py +++ b/pagure/lib/notify.py @@ -1,18 +1,19 @@ # -*- coding: utf-8 -*- """ - (c) 2014-2015 - Copyright Red Hat Inc + (c) 2014-2016 - Copyright Red Hat Inc Authors: Pierre-Yves Chibon pagure notifications. """ +from __future__ import print_function + import datetime import hashlib import json -import urlparse import re import smtplib import time @@ -24,6 +25,7 @@ import six import pagure from email.mime.text import MIMEText +from six.moves.urllib_parse import urljoin REPLY_MSG = 'To reply, visit the link below' @@ -164,14 +166,14 @@ def send_email(text, subject, to_mail, return if not pagure.APP.config.get('EMAIL_SEND', True): - print '******EMAIL******' - print 'To: %s' % to_mail - print 'Subject: %s' % subject - print 'in_reply_to: %s' % in_reply_to - print 'mail_id: %s' % mail_id - print 'Contents:' - print text.encode('utf-8') - print '*****/EMAIL******' + print('******EMAIL******') + print('To: %s' % to_mail) + print('Subject: %s' % subject) + print('in_reply_to: %s' % in_reply_to) + print('mail_id: %s' % mail_id) + print('Contents:') + print(text.encode('utf-8')) + print('*****/EMAIL******') return if project_name is not None: @@ -507,7 +509,7 @@ def notify_new_email(email, user): root_url = pagure.APP.config.get('APP_URL', flask.request.url_root) - url = urlparse.urljoin( + url = urljoin( root_url or flask.request.url_root, flask.url_for('confirm_email', token=email.token), ) diff --git a/pagure/ui/admin.py b/pagure/ui/admin.py index 776f299..57f00c9 100644 --- a/pagure/ui/admin.py +++ b/pagure/ui/admin.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """ - (c) 2014-2015 - Copyright Red Hat Inc + (c) 2014-2016 - Copyright Red Hat Inc Authors: Pierre-Yves Chibon @@ -66,7 +66,7 @@ def admin_generate_acl(): pagure.lib.git.generate_gitolite_acls() flask.flash('Gitolite ACLs updated') except pagure.exceptions.PagureException as err: - flask.flash(str(err), 'error') + flask.flash('%s' % err, 'error') return flask.redirect(flask.url_for('admin_index')) @@ -81,7 +81,7 @@ def admin_refresh_ssh(): pagure.lib.git.generate_gitolite_acls() flask.flash('User key files regenerated') except pagure.exceptions.PagureException as err: - flask.flash(str(err), 'error') + flask.flash('%s' % err, 'error') return flask.redirect(flask.url_for('admin_index')) diff --git a/pagure/ui/filters.py b/pagure/ui/filters.py index 1f877db..4bb0d39 100644 --- a/pagure/ui/filters.py +++ b/pagure/ui/filters.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """ - (c) 2014 - Copyright Red Hat Inc + (c) 2014-2016 - Copyright Red Hat Inc Authors: Pierre-Yves Chibon @@ -13,7 +13,8 @@ import textwrap import arrow import flask -import md5 +import hashlib +import six from pygments import highlight from pygments.lexers.text import DiffLexer @@ -67,8 +68,8 @@ def format_loc(loc, commit=None, filename=None, tree_id=None, prequest=None, comments = {} if prequest and not isinstance(prequest, flask.wrappers.Request): for com in prequest.comments: - if commit and unicode(com.commit_id) == unicode(commit) \ - and unicode(com.filename) == unicode(filename): + if commit and com.commit_id == commit \ + and com.filename == filename: if com.line in comments: comments[com.line].append(com) else: @@ -240,6 +241,12 @@ def avatar(packager, size=64, default="retro"): """ Template filter sorting the given branches, Fedora first then EPEL, then whatever is left. """ + if six.PY3: + if isinstance(packager, six.string_types): + packager = packager.encode('utf-8').decode('utf-8') + else: + packager = packager.decode('utf-8') + if not '@' in packager: user = pagure.lib.search_user(SESSION, username=packager) if user: @@ -396,6 +403,6 @@ def int_to_rgb(percent): def return_md5(text): """ Template filter to return an MD5 for a string """ - m = md5.new() + m = hashlib.md5() m.update(text) return pagure.lib.clean_input(m.hexdigest()) diff --git a/pagure/ui/fork.py b/pagure/ui/fork.py index 076fede..ef88ef9 100644 --- a/pagure/ui/fork.py +++ b/pagure/ui/fork.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """ - (c) 2014-2015 - Copyright Red Hat Inc + (c) 2014-2016 - Copyright Red Hat Inc Authors: Pierre-Yves Chibon @@ -259,7 +259,7 @@ def request_pull(repo, requestid, username=None): SESSION, request, repo_obj, orig_repo, requestfolder=APP.config['REQUESTS_FOLDER']) except pagure.exceptions.PagureException as err: - flask.flash(err.message, 'error') + flask.flash('%s' % err, 'error') return flask.redirect(flask.url_for( 'view_repo', username=username, repo=repo.name)) except SQLAlchemyError as err: # pragma: no cover @@ -344,7 +344,7 @@ def request_pull_patch(repo, requestid, username=None): requestfolder=APP.config['REQUESTS_FOLDER'], with_diff=False)[0] except pagure.exceptions.PagureException as err: - flask.flash(err.message, 'error') + flask.flash('%s' % err, 'error') return flask.redirect(flask.url_for( 'view_repo', username=username, repo=repo.name)) except SQLAlchemyError as err: # pragma: no cover @@ -626,7 +626,7 @@ def pull_request_edit_comment(repo, requestid, commentid, username=None): SESSION.commit() if not is_js: flask.flash(message) - except SQLAlchemyError, err: # pragma: no cover + except SQLAlchemyError as err: # pragma: no cover SESSION.rollback() LOG.error(err) if is_js: @@ -717,7 +717,7 @@ def merge_request_pull(repo, requestid, username=None): APP.config['REQUESTS_FOLDER']) flask.flash(message) except pygit2.GitError as err: - flask.flash(str(err.message), 'error') + flask.flash('%s' % err, 'error') return flask.redirect(flask.url_for( 'request_pull', repo=repo.name, requestid=requestid, username=username)) @@ -819,7 +819,7 @@ def set_assignee_requests(repo, requestid, username=None): flask.flash(message) except pagure.exceptions.PagureException as err: SESSION.rollback() - flask.flash(err.message, 'error') + flask.flash('%s' % err, 'error') except SQLAlchemyError as err: # pragma: no cover SESSION.rollback() APP.logger.exception(err) @@ -920,7 +920,7 @@ def new_request_pull(repo, branch_to, branch_from, username=None): diff, diff_commits, orig_commit = _get_pr_info( repo_obj, orig_repo, branch_from, branch_to) except pagure.exceptions.PagureException as err: - flask.flash(err.message, 'error') + flask.flash('%s' % err, 'error') return flask.redirect(flask.url_for( 'view_repo', username=username, repo=repo.name)) @@ -1057,7 +1057,7 @@ def new_remote_request_pull(repo, username=None): diff, diff_commits, orig_commit = _get_pr_info( repo_obj, orig_repo, branch_from, branch_to) except pagure.exceptions.PagureException as err: - flask.flash(err.message, 'error') + flask.flash('%s' % err, 'error') return flask.redirect(flask.url_for( 'view_repo', username=username, repo=repo.name)) diff --git a/pagure/ui/groups.py b/pagure/ui/groups.py index 7e311a2..3c8ec93 100644 --- a/pagure/ui/groups.py +++ b/pagure/ui/groups.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """ - (c) 2015 - Copyright Red Hat Inc + (c) 2015-2016 - Copyright Red Hat Inc Authors: Pierre-Yves Chibon @@ -86,7 +86,7 @@ def view_group(group): flask.flash(msg) except pagure.exceptions.PagureException as err: pagure.SESSION.rollback() - flask.flash(err.message, 'error') + flask.flash('%s' % err, 'error') return flask.redirect( flask.url_for('.view_group', group=group.group_name)) except SQLAlchemyError as err: # pragma: no cover @@ -138,7 +138,7 @@ def group_user_delete(user, group): 'User `%s` removed from the group `%s`' % (user, group)) except pagure.exceptions.PagureException as err: pagure.SESSION.rollback() - flask.flash(err.message, 'error') + flask.flash('%s' % err, 'error') return flask.redirect( flask.url_for('.view_group', group=group)) except SQLAlchemyError as err: # pragma: no cover @@ -238,7 +238,7 @@ def add_group(): return flask.redirect(flask.url_for('.group_lists')) except pagure.exceptions.PagureException as err: pagure.SESSION.rollback() - flask.flash(err.message, 'error') + flask.flash('%s' % err, 'error') except SQLAlchemyError as err: # pragma: no cover pagure.SESSION.rollback() flask.flash('Could not create group.') diff --git a/pagure/ui/issues.py b/pagure/ui/issues.py index 45b7b50..af947cc 100644 --- a/pagure/ui/issues.py +++ b/pagure/ui/issues.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """ - (c) 2014-2015 - Copyright Red Hat Inc + (c) 2014-2016 - Copyright Red Hat Inc Authors: Pierre-Yves Chibon @@ -215,7 +215,7 @@ def update_issue(repo, issueid, username=None): is_js = False SESSION.rollback() if not is_js: - flask.flash(err.message, 'error') + flask.flash('%s' % err, 'error') except SQLAlchemyError as err: # pragma: no cover is_js = False SESSION.rollback() @@ -867,7 +867,7 @@ def edit_comment_issue(repo, issueid, commentid, username=None): SESSION.commit() if not is_js: flask.flash(message) - except SQLAlchemyError, err: # pragma: no cover + except SQLAlchemyError as err: # pragma: no cover SESSION.rollback() LOG.error(err) if is_js: diff --git a/pagure/ui/login.py b/pagure/ui/login.py index 7a3a00f..062d376 100644 --- a/pagure/ui/login.py +++ b/pagure/ui/login.py @@ -12,11 +12,12 @@ import hashlib import datetime -import urlparse import bcrypt import flask +import six from sqlalchemy.exc import SQLAlchemyError +from six.moves.urllib.parse import urljoin import pagure.login_forms as forms import pagure.lib @@ -122,8 +123,10 @@ def do_login(): return flask.redirect(flask.url_for('auth_login')) else: - - if not user_obj.password.startswith('$2$'): + password = user_obj.password + if not isinstance(password, six.string_types): + password = password.decode('utf-8') + if not password.startswith('$2$'): user_obj.password = generate_hashed_value(form.password.data) SESSION.add(user_obj) @@ -341,7 +344,7 @@ def send_confirmation_email(user): url = APP.config.get('APP_URL', flask.request.url_root) - url = urlparse.urljoin( + url = urljoin( url or flask.request.url_root, flask.url_for('confirm_user', token=user.token), ) @@ -376,7 +379,7 @@ def send_lostpassword_email(user): url = APP.config.get('APP_URL', flask.request.url_root) - url = urlparse.urljoin( + url = urljoin( url or flask.request.url_root, flask.url_for('reset_password', token=user.token), ) diff --git a/pagure/ui/repo.py b/pagure/ui/repo.py index c1c14a5..713f28f 100644 --- a/pagure/ui/repo.py +++ b/pagure/ui/repo.py @@ -16,9 +16,10 @@ from math import ceil import flask import pygit2 import kitchen.text.converters as ktc +import six import werkzeug -from cStringIO import StringIO +from six.moves import StringIO from PIL import Image from pygments import highlight from pygments.formatters import HtmlFormatter @@ -323,7 +324,7 @@ def view_commits(repo, branchname=None, username=None): orig_repo = pygit2.Repository(parentname) if not repo_obj.is_empty and not orig_repo.is_empty \ - and repo_obj.listall_branches() > 1: + and len(repo_obj.listall_branches()) > 1: if not orig_repo.head_is_unborn: compare_branch = orig_repo.lookup_branch( @@ -426,7 +427,7 @@ def view_file(repo, identifier, filename, username=None): '.gif', '.png', '.bmp', '.tif', '.tiff', '.jpg', '.jpeg', '.ppm', '.pnm', '.pbm', '.pgm', '.webp', '.ico'): try: - Image.open(StringIO(content.data)) + Image.open(StringIO(content.data.decode('utf-8'))) output_type = 'image' except IOError as err: LOG.debug( @@ -524,7 +525,7 @@ def view_raw_file(repo, identifier, filename=None, username=None): flask.abort(404, 'File not found') mimetype, encoding = mimetypes.guess_type(filename) - data = repo_obj[content.oid].data + data = repo_obj[content.oid].data.decode('utf-8') else: if commit.parents: diff = commit.tree.diff_to_tree() @@ -538,6 +539,8 @@ def view_raw_file(repo, identifier, filename=None, username=None): # First commit in the repo diff = commit.tree.diff_to_tree(swap=True) data = diff.patch + if six.PY3: + data = data.encode('utf-8').decode('utf-8') if not data: flask.abort(404, 'No content found') From cdc517694005c84e433bea630bbc00f6ea765a68 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Mar 13 2016 22:18:34 +0000 Subject: [PATCH 10/23] Port the test suite to python3 --- diff --git a/tests/__init__.py b/tests/__init__.py index a5545a4..27f7956 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -1,12 +1,13 @@ # -*- coding: utf-8 -*- """ - (c) 2015 - Copyright Red Hat Inc + (c) 2015-2016 - Copyright Red Hat Inc Authors: Pierre-Yves Chibon """ +from __future__ import print_function __requires__ = ['SQLAlchemy >= 0.7'] import pkg_resources @@ -23,6 +24,7 @@ from datetime import timedelta from functools import wraps import pygit2 +import six from contextlib import contextmanager from sqlalchemy import create_engine @@ -48,7 +50,7 @@ if os.environ.get('BUILD_ID'): req = requests.get('%s/new' % FAITOUT_URL) if req.status_code == 200: DB_PATH = req.text - print 'Using faitout at: %s' % DB_PATH + print('Using faitout at: %s' % DB_PATH) except: pass @@ -179,7 +181,7 @@ class FakeUser(object): :arg groups: list of the groups in which this fake user is supposed to be. """ - if isinstance(groups, basestring): + if isinstance(groups, six.string_types): groups = [groups] self.groups = groups self.username = username diff --git a/tests/test_pagure_flask_api.py b/tests/test_pagure_flask_api.py index 6432d07..466189f 100644 --- a/tests/test_pagure_flask_api.py +++ b/tests/test_pagure_flask_api.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """ - (c) 2015 - Copyright Red Hat Inc + (c) 2015-2016 - Copyright Red Hat Inc Authors: Pierre-Yves Chibon @@ -43,25 +43,25 @@ class PagureFlaskApitests(tests.Modeltests): output = self.app.get('/api/0/version') self.assertEqual(output.status_code, 200) - data = json.loads(output.data) + data = json.loads(output.data.decode('utf-8')) self.assertEqual(data['version'], pagure.__api_version__) - self.assertEqual(data.keys(), ['version']) + self.assertEqual(list(data.keys()), ['version']) def test_api_users(self): """ Test the api_users function. """ output = self.app.get('/api/0/users') self.assertEqual(output.status_code, 200) - data = json.loads(output.data) + data = json.loads(output.data.decode('utf-8')) self.assertEqual(sorted(data['users']), ['foo', 'pingou']) - self.assertEqual(sorted(data.keys()), ['total_users', 'users']) + self.assertEqual(sorted(list(data.keys())), ['total_users', 'users']) self.assertEqual(data['total_users'], 2) output = self.app.get('/api/0/users?pattern=p') self.assertEqual(output.status_code, 200) - data = json.loads(output.data) + data = json.loads(output.data.decode('utf-8')) self.assertEqual(data['users'], ['pingou']) - self.assertEqual(sorted(data.keys()), ['total_users', 'users']) + self.assertEqual(sorted(list(data.keys())), ['total_users', 'users']) self.assertEqual(data['total_users'], 1) def test_api_project_tags(self): @@ -70,15 +70,15 @@ class PagureFlaskApitests(tests.Modeltests): output = self.app.get('/api/0/foo/tags/') self.assertEqual(output.status_code, 404) - data = json.loads(output.data) - self.assertEqual(data.keys(), ['output', 'error']) + data = json.loads(output.data.decode('utf-8')) + self.assertEqual(sorted(list(data.keys())), ['error', 'output']) self.assertEqual(data['output'], 'notok') self.assertEqual(data['error'], 'Project not found') output = self.app.get('/api/0/test/tags/') self.assertEqual(output.status_code, 200) - data = json.loads(output.data) - self.assertEqual(sorted(data.keys()), ['tags', 'total_tags']) + data = json.loads(output.data.decode('utf-8')) + self.assertEqual(sorted(list(data.keys())), ['tags', 'total_tags']) self.assertEqual(data['tags'], []) self.assertEqual(data['total_tags'], 0) @@ -107,22 +107,22 @@ class PagureFlaskApitests(tests.Modeltests): output = self.app.get('/api/0/test/tags/') self.assertEqual(output.status_code, 200) - data = json.loads(output.data) - self.assertEqual(sorted(data.keys()), ['tags', 'total_tags']) + data = json.loads(output.data.decode('utf-8')) + self.assertEqual(sorted(list(data.keys())), ['tags', 'total_tags']) self.assertEqual(data['tags'], ['tag1']) self.assertEqual(data['total_tags'], 1) output = self.app.get('/api/0/test/tags/?pattern=t') self.assertEqual(output.status_code, 200) - data = json.loads(output.data) - self.assertEqual(sorted(data.keys()), ['tags', 'total_tags']) + data = json.loads(output.data.decode('utf-8')) + self.assertEqual(sorted(list(data.keys())), ['tags', 'total_tags']) self.assertEqual(data['tags'], ['tag1']) self.assertEqual(data['total_tags'], 1) output = self.app.get('/api/0/test/tags/?pattern=p') self.assertEqual(output.status_code, 200) - data = json.loads(output.data) - self.assertEqual(sorted(data.keys()), ['tags', 'total_tags']) + data = json.loads(output.data.decode('utf-8')) + self.assertEqual(sorted(list(data.keys())), ['tags', 'total_tags']) self.assertEqual(data['tags'], []) self.assertEqual(data['total_tags'], 0) @@ -147,16 +147,16 @@ class PagureFlaskApitests(tests.Modeltests): output = self.app.get('/api/0/groups') self.assertEqual(output.status_code, 200) - data = json.loads(output.data) + data = json.loads(output.data.decode('utf-8')) self.assertEqual(data['groups'], ['group1', 'rel-eng']) - self.assertEqual(sorted(data.keys()), ['groups', 'total_groups']) + self.assertEqual(sorted(list(data.keys())), ['groups', 'total_groups']) self.assertEqual(data['total_groups'], 2) output = self.app.get('/api/0/groups?pattern=re') self.assertEqual(output.status_code, 200) - data = json.loads(output.data) + data = json.loads(output.data.decode('utf-8')) self.assertEqual(data['groups'], ['rel-eng']) - self.assertEqual(sorted(data.keys()), ['groups', 'total_groups']) + self.assertEqual(sorted(list(data.keys())), ['groups', 'total_groups']) self.assertEqual(data['total_groups'], 1) diff --git a/tests/test_pagure_flask_api_auth.py b/tests/test_pagure_flask_api_auth.py index ef76281..77facf4 100644 --- a/tests/test_pagure_flask_api_auth.py +++ b/tests/test_pagure_flask_api_auth.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """ - (c) 2015 - Copyright Red Hat Inc + (c) 2015-2016 - Copyright Red Hat Inc Authors: Pierre-Yves Chibon @@ -46,7 +46,7 @@ class PagureFlaskApiAuthtests(tests.Modeltests): output = self.app.post('/api/0/foo/new_issue') self.assertEqual(output.status_code, 401) - data = json.loads(output.data) + data = json.loads(output.data.decode('utf-8')) self.assertDictEqual( data, { @@ -60,7 +60,7 @@ class PagureFlaskApiAuthtests(tests.Modeltests): output = self.app.post('/api/0/foo/new_issue', headers=headers) self.assertEqual(output.status_code, 401) - data = json.loads(output.data) + data = json.loads(output.data.decode('utf-8')) self.assertDictEqual( data, { @@ -78,7 +78,7 @@ class PagureFlaskApiAuthtests(tests.Modeltests): output = self.app.post('/api/0/test/new_issue') self.assertEqual(output.status_code, 401) - data = json.loads(output.data) + data = json.loads(output.data.decode('utf-8')) self.assertDictEqual( data, { @@ -92,7 +92,7 @@ class PagureFlaskApiAuthtests(tests.Modeltests): output = self.app.post('/api/0/test/new_issue', headers=headers) self.assertEqual(output.status_code, 401) - data = json.loads(output.data) + data = json.loads(output.data.decode('utf-8')) self.assertDictEqual( data, { @@ -110,7 +110,7 @@ class PagureFlaskApiAuthtests(tests.Modeltests): output = self.app.post('/api/0/test/new_issue') self.assertEqual(output.status_code, 401) - data = json.loads(output.data) + data = json.loads(output.data.decode('utf-8')) self.assertDictEqual( data, { @@ -124,7 +124,7 @@ class PagureFlaskApiAuthtests(tests.Modeltests): output = self.app.post('/api/0/test/new_issue', headers=headers) self.assertEqual(output.status_code, 401) - data = json.loads(output.data) + data = json.loads(output.data.decode('utf-8')) self.assertDictEqual( data, { @@ -143,7 +143,7 @@ class PagureFlaskApiAuthtests(tests.Modeltests): output = self.app.post('/api/0/test/new_issue') self.assertEqual(output.status_code, 401) - data = json.loads(output.data) + data = json.loads(output.data.decode('utf-8')) self.assertDictEqual( data, { @@ -157,7 +157,7 @@ class PagureFlaskApiAuthtests(tests.Modeltests): output = self.app.post('/api/0/test/new_issue', headers=headers) self.assertEqual(output.status_code, 400) - data = json.loads(output.data) + data = json.loads(output.data.decode('utf-8')) self.assertDictEqual( data, { diff --git a/tests/test_pagure_flask_api_fork.py b/tests/test_pagure_flask_api_fork.py index c175ae4..54deff2 100644 --- a/tests/test_pagure_flask_api_fork.py +++ b/tests/test_pagure_flask_api_fork.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """ - (c) 2015 - Copyright Red Hat Inc + (c) 2015-2016 - Copyright Red Hat Inc Authors: Pierre-Yves Chibon @@ -73,7 +73,7 @@ class PagureFlaskApiForktests(tests.Modeltests): # Invalid repo output = self.app.get('/api/0/foo/pull-requests') self.assertEqual(output.status_code, 404) - data = json.loads(output.data) + data = json.loads(output.data.decode('utf-8')) self.assertDictEqual( data, { @@ -85,7 +85,7 @@ class PagureFlaskApiForktests(tests.Modeltests): # List pull-requests output = self.app.get('/api/0/test/pull-requests') self.assertEqual(output.status_code, 200) - data = json.loads(output.data) + data = json.loads(output.data.decode('utf-8')) data['requests'][0]['date_created'] = '1431414800' data['requests'][0]['updated_on'] = '1431414800' data['requests'][0]['project']['date_created'] = '1431414800' @@ -156,7 +156,7 @@ class PagureFlaskApiForktests(tests.Modeltests): # Access Pull-Request authenticated output = self.app.get('/api/0/test/pull-requests', headers=headers) self.assertEqual(output.status_code, 200) - data2 = json.loads(output.data) + data2 = json.loads(output.data.decode('utf-8')) data2['requests'][0]['date_created'] = '1431414800' data2['requests'][0]['updated_on'] = '1431414800' data2['requests'][0]['project']['date_created'] = '1431414800' @@ -193,7 +193,7 @@ class PagureFlaskApiForktests(tests.Modeltests): # Invalid repo output = self.app.get('/api/0/foo/pull-request/1') self.assertEqual(output.status_code, 404) - data = json.loads(output.data) + data = json.loads(output.data.decode('utf-8')) self.assertDictEqual( data, { @@ -205,7 +205,7 @@ class PagureFlaskApiForktests(tests.Modeltests): # Invalid issue for this repo output = self.app.get('/api/0/test2/pull-request/1') self.assertEqual(output.status_code, 404) - data = json.loads(output.data) + data = json.loads(output.data.decode('utf-8')) self.assertDictEqual( data, { @@ -217,7 +217,7 @@ class PagureFlaskApiForktests(tests.Modeltests): # Valid issue output = self.app.get('/api/0/test/pull-request/1') self.assertEqual(output.status_code, 200) - data = json.loads(output.data) + data = json.loads(output.data.decode('utf-8')) data['date_created'] = '1431414800' data['updated_on'] = '1431414800' data['project']['date_created'] = '1431414800' @@ -278,7 +278,7 @@ class PagureFlaskApiForktests(tests.Modeltests): # Access Pull-Request authenticated output = self.app.get('/api/0/test/pull-request/1', headers=headers) self.assertEqual(output.status_code, 200) - data2 = json.loads(output.data) + data2 = json.loads(output.data.decode('utf-8')) data2['date_created'] = '1431414800' data2['project']['date_created'] = '1431414800' data2['repo_from']['date_created'] = '1431414800' @@ -319,7 +319,7 @@ class PagureFlaskApiForktests(tests.Modeltests): output = self.app.post( '/api/0/foo/pull-request/1/close', headers=headers) self.assertEqual(output.status_code, 404) - data = json.loads(output.data) + data = json.loads(output.data.decode('utf-8')) self.assertDictEqual( data, { @@ -332,7 +332,7 @@ class PagureFlaskApiForktests(tests.Modeltests): output = self.app.post( '/api/0/test2/pull-request/1/close', headers=headers) self.assertEqual(output.status_code, 401) - data = json.loads(output.data) + data = json.loads(output.data.decode('utf-8')) self.assertDictEqual( data, { @@ -346,7 +346,7 @@ class PagureFlaskApiForktests(tests.Modeltests): output = self.app.post( '/api/0/test/pull-request/2/close', headers=headers) self.assertEqual(output.status_code, 404) - data = json.loads(output.data) + data = json.loads(output.data.decode('utf-8')) self.assertDictEqual( data, {'error': 'Pull-Request not found', 'error_code': "ENOREQ"} @@ -364,7 +364,7 @@ class PagureFlaskApiForktests(tests.Modeltests): self.session.commit() item = pagure.lib.model.TokenAcl( token_id='foobar_token', - acl_id=2, + acl_id=4, ) self.session.add(item) self.session.commit() @@ -374,8 +374,9 @@ class PagureFlaskApiForktests(tests.Modeltests): # User not admin output = self.app.post( '/api/0/test/pull-request/1/close', headers=headers) + print(output.data) self.assertEqual(output.status_code, 403) - data = json.loads(output.data) + data = json.loads(output.data.decode('utf-8')) self.assertDictEqual( data, { @@ -391,7 +392,7 @@ class PagureFlaskApiForktests(tests.Modeltests): output = self.app.post( '/api/0/test/pull-request/1/close', headers=headers) self.assertEqual(output.status_code, 200) - data = json.loads(output.data) + data = json.loads(output.data.decode('utf-8')) self.assertDictEqual( data, {"message": "Pull-request closed!"} @@ -431,7 +432,7 @@ class PagureFlaskApiForktests(tests.Modeltests): output = self.app.post( '/api/0/foo/pull-request/1/merge', headers=headers) self.assertEqual(output.status_code, 404) - data = json.loads(output.data) + data = json.loads(output.data.decode('utf-8')) self.assertDictEqual( data, { @@ -444,7 +445,7 @@ class PagureFlaskApiForktests(tests.Modeltests): output = self.app.post( '/api/0/test2/pull-request/1/merge', headers=headers) self.assertEqual(output.status_code, 401) - data = json.loads(output.data) + data = json.loads(output.data.decode('utf-8')) self.assertDictEqual( data, { @@ -458,7 +459,7 @@ class PagureFlaskApiForktests(tests.Modeltests): output = self.app.post( '/api/0/test/pull-request/2/merge', headers=headers) self.assertEqual(output.status_code, 404) - data = json.loads(output.data) + data = json.loads(output.data.decode('utf-8')) self.assertDictEqual( data, {'error': 'Pull-Request not found', 'error_code': "ENOREQ"} @@ -476,7 +477,7 @@ class PagureFlaskApiForktests(tests.Modeltests): self.session.commit() item = pagure.lib.model.TokenAcl( token_id='foobar_token', - acl_id=3, + acl_id=7, ) self.session.add(item) self.session.commit() @@ -487,7 +488,7 @@ class PagureFlaskApiForktests(tests.Modeltests): output = self.app.post( '/api/0/test/pull-request/1/merge', headers=headers) self.assertEqual(output.status_code, 403) - data = json.loads(output.data) + data = json.loads(output.data.decode('utf-8')) self.assertDictEqual( data, { @@ -503,7 +504,7 @@ class PagureFlaskApiForktests(tests.Modeltests): output = self.app.post( '/api/0/test/pull-request/1/merge', headers=headers) self.assertEqual(output.status_code, 200) - data = json.loads(output.data) + data = json.loads(output.data.decode('utf-8')) self.assertDictEqual( data, {"message": "Changes merged!"} @@ -524,7 +525,7 @@ class PagureFlaskApiForktests(tests.Modeltests): output = self.app.post( '/api/0/foo/pull-request/1/comment', headers=headers) self.assertEqual(output.status_code, 404) - data = json.loads(output.data) + data = json.loads(output.data.decode('utf-8')) self.assertDictEqual( data, { @@ -537,7 +538,7 @@ class PagureFlaskApiForktests(tests.Modeltests): output = self.app.post( '/api/0/test2/pull-request/1/comment', headers=headers) self.assertEqual(output.status_code, 401) - data = json.loads(output.data) + data = json.loads(output.data.decode('utf-8')) self.assertDictEqual( data, { @@ -551,7 +552,7 @@ class PagureFlaskApiForktests(tests.Modeltests): output = self.app.post( '/api/0/test/pull-request/1/comment', headers=headers) self.assertEqual(output.status_code, 404) - data = json.loads(output.data) + data = json.loads(output.data.decode('utf-8')) self.assertDictEqual( data, { @@ -590,7 +591,7 @@ class PagureFlaskApiForktests(tests.Modeltests): output = self.app.post( '/api/0/test/pull-request/1/comment', data=data, headers=headers) self.assertEqual(output.status_code, 400) - data = json.loads(output.data) + data = json.loads(output.data.decode('utf-8')) self.assertDictEqual( data, { @@ -612,7 +613,7 @@ class PagureFlaskApiForktests(tests.Modeltests): output = self.app.post( '/api/0/test/pull-request/1/comment', data=data, headers=headers) self.assertEqual(output.status_code, 200) - data = json.loads(output.data) + data = json.loads(output.data.decode('utf-8')) self.assertDictEqual( data, {'message': 'Comment added'} @@ -638,7 +639,7 @@ class PagureFlaskApiForktests(tests.Modeltests): output = self.app.post( '/api/0/foo/pull-request/1/flag', headers=headers) self.assertEqual(output.status_code, 404) - data = json.loads(output.data) + data = json.loads(output.data.decode('utf-8')) self.assertDictEqual( data, { @@ -651,7 +652,7 @@ class PagureFlaskApiForktests(tests.Modeltests): output = self.app.post( '/api/0/test2/pull-request/1/flag', headers=headers) self.assertEqual(output.status_code, 401) - data = json.loads(output.data) + data = json.loads(output.data.decode('utf-8')) self.assertDictEqual( data, { @@ -665,7 +666,7 @@ class PagureFlaskApiForktests(tests.Modeltests): output = self.app.post( '/api/0/test/pull-request/1/flag', headers=headers) self.assertEqual(output.status_code, 404) - data = json.loads(output.data) + data = json.loads(output.data.decode('utf-8')) self.assertDictEqual( data, { @@ -707,7 +708,7 @@ class PagureFlaskApiForktests(tests.Modeltests): output = self.app.post( '/api/0/test/pull-request/1/flag', data=data, headers=headers) self.assertEqual(output.status_code, 400) - data = json.loads(output.data) + data = json.loads(output.data.decode('utf-8')) self.assertDictEqual( data, { @@ -733,7 +734,7 @@ class PagureFlaskApiForktests(tests.Modeltests): output = self.app.post( '/api/0/test/pull-request/1/flag', data=data, headers=headers) self.assertEqual(output.status_code, 200) - data = json.loads(output.data) + data = json.loads(output.data.decode('utf-8')) self.assertDictEqual( data, {'message': 'Flag added'} @@ -758,7 +759,7 @@ class PagureFlaskApiForktests(tests.Modeltests): output = self.app.post( '/api/0/test/pull-request/1/flag', data=data, headers=headers) self.assertEqual(output.status_code, 200) - data = json.loads(output.data) + data = json.loads(output.data.decode('utf-8')) self.assertDictEqual( data, {'message': 'Flag updated'} diff --git a/tests/test_pagure_flask_api_issue.py b/tests/test_pagure_flask_api_issue.py index 0675beb..e51847f 100644 --- a/tests/test_pagure_flask_api_issue.py +++ b/tests/test_pagure_flask_api_issue.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """ - (c) 2015 - Copyright Red Hat Inc + (c) 2015-2016 - Copyright Red Hat Inc Authors: Pierre-Yves Chibon @@ -55,7 +55,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): # 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) + data = json.loads(output.data.decode('utf-8')) self.assertDictEqual( data, { @@ -68,7 +68,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): # No input output = self.app.post('/api/0/test/new_issue', headers=headers) self.assertEqual(output.status_code, 400) - data = json.loads(output.data) + data = json.loads(output.data.decode('utf-8')) self.assertDictEqual( data, { @@ -85,7 +85,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): output = self.app.post( '/api/0/foo/new_issue', data=data, headers=headers) self.assertEqual(output.status_code, 404) - data = json.loads(output.data) + data = json.loads(output.data.decode('utf-8')) self.assertDictEqual( data, { @@ -98,7 +98,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): output = self.app.post( '/api/0/test/new_issue', data=data, headers=headers) self.assertEqual(output.status_code, 400) - data = json.loads(output.data) + data = json.loads(output.data.decode('utf-8')) self.assertDictEqual( data, { @@ -116,7 +116,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): output = self.app.post( '/api/0/test/new_issue', data=data, headers=headers) self.assertEqual(output.status_code, 200) - data = json.loads(output.data) + data = json.loads(output.data.decode('utf-8')) self.assertDictEqual( data, {'message': 'Issue created'} @@ -129,7 +129,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): # Invalid repo output = self.app.get('/api/0/foo/issues') self.assertEqual(output.status_code, 404) - data = json.loads(output.data) + data = json.loads(output.data.decode('utf-8')) self.assertDictEqual( data, { @@ -141,7 +141,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): # List all opened issues output = self.app.get('/api/0/test/issues') self.assertEqual(output.status_code, 200) - data = json.loads(output.data) + data = json.loads(output.data.decode('utf-8')) data['issues'][0]['date_created'] = '1431414800' self.assertDictEqual( data, @@ -192,7 +192,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): # Access issues un-authenticated output = self.app.get('/api/0/test/issues') self.assertEqual(output.status_code, 200) - data = json.loads(output.data) + data = json.loads(output.data.decode('utf-8')) data['issues'][0]['date_created'] = '1431414800' self.assertDictEqual( data, @@ -246,7 +246,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): # Access issues authenticated but wrong token output = self.app.get('/api/0/test/issues', headers=headers) self.assertEqual(output.status_code, 200) - data = json.loads(output.data) + data = json.loads(output.data.decode('utf-8')) data['issues'][0]['date_created'] = '1431414800' self.assertDictEqual( data, @@ -285,7 +285,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): # Access issues authenticated correctly output = self.app.get('/api/0/test/issues', headers=headers) self.assertEqual(output.status_code, 200) - data = json.loads(output.data) + data = json.loads(output.data.decode('utf-8')) data['issues'][0]['date_created'] = '1431414800' data['issues'][1]['date_created'] = '1431414800' self.assertDictEqual( @@ -340,7 +340,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): # List closed issue output = self.app.get('/api/0/test/issues?status=Closed', headers=headers) self.assertEqual(output.status_code, 200) - data = json.loads(output.data) + data = json.loads(output.data.decode('utf-8')) self.assertDictEqual( data, { @@ -358,7 +358,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): # List closed issue output = self.app.get('/api/0/test/issues?status=Invalid', headers=headers) self.assertEqual(output.status_code, 200) - data = json.loads(output.data) + data = json.loads(output.data.decode('utf-8')) self.assertDictEqual( data, { @@ -435,7 +435,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): # Invalid repo output = self.app.get('/api/0/foo/issue/1') self.assertEqual(output.status_code, 404) - data = json.loads(output.data) + data = json.loads(output.data.decode('utf-8')) self.assertDictEqual( data, { @@ -447,7 +447,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): # Invalid issue for this repo output = self.app.get('/api/0/test2/issue/1') self.assertEqual(output.status_code, 404) - data = json.loads(output.data) + data = json.loads(output.data.decode('utf-8')) self.assertDictEqual( data, { @@ -459,7 +459,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): # Valid issue output = self.app.get('/api/0/test/issue/1') self.assertEqual(output.status_code, 200) - data = json.loads(output.data) + data = json.loads(output.data.decode('utf-8')) data['date_created'] = '1431414800' self.assertDictEqual( data, @@ -500,7 +500,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): # Access private issue un-authenticated output = self.app.get('/api/0/test/issue/2') self.assertEqual(output.status_code, 403) - data = json.loads(output.data) + data = json.loads(output.data.decode('utf-8')) self.assertDictEqual( data, { @@ -514,7 +514,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): # Access private issue authenticated but non-existing token output = self.app.get('/api/0/test/issue/2', headers=headers) self.assertEqual(output.status_code, 401) - data = json.loads(output.data) + data = json.loads(output.data.decode('utf-8')) self.assertDictEqual( data, { @@ -538,7 +538,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): # Access private issue authenticated but wrong token output = self.app.get('/api/0/test/issue/2', headers=headers) self.assertEqual(output.status_code, 403) - data = json.loads(output.data) + data = json.loads(output.data.decode('utf-8')) self.assertDictEqual( data, { @@ -552,7 +552,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): # Access private issue authenticated correctly output = self.app.get('/api/0/test/issue/2', headers=headers) self.assertEqual(output.status_code, 200) - data = json.loads(output.data) + data = json.loads(output.data.decode('utf-8')) data['date_created'] = '1431414800' self.assertDictEqual( data, @@ -578,7 +578,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): # Access private issue authenticated correctly using the issue's uid output = self.app.get('/api/0/test/issue/aaabbbccc', headers=headers) self.assertEqual(output.status_code, 200) - data = json.loads(output.data) + data = json.loads(output.data.decode('utf-8')) data['date_created'] = '1431414800' self.assertDictEqual( data, @@ -613,7 +613,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): # 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) + data = json.loads(output.data.decode('utf-8')) self.assertDictEqual( data, { @@ -625,7 +625,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): # Valid token, wrong project output = self.app.post('/api/0/test2/issue/1/status', headers=headers) self.assertEqual(output.status_code, 401) - data = json.loads(output.data) + data = json.loads(output.data.decode('utf-8')) self.assertDictEqual( data, { @@ -638,7 +638,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): # No input output = self.app.post('/api/0/test/issue/1/status', headers=headers) self.assertEqual(output.status_code, 404) - data = json.loads(output.data) + data = json.loads(output.data.decode('utf-8')) self.assertDictEqual( data, { @@ -685,7 +685,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): # Give `change_status_issue` to this token item = pagure.lib.model.TokenAcl( token_id='pingou_foo', - acl_id=6, + acl_id=1, ) self.session.add(item) self.session.commit() @@ -717,7 +717,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): output = self.app.post( '/api/0/test/issue/1/status', data=data, headers=headers) self.assertEqual(output.status_code, 400) - data = json.loads(output.data) + data = json.loads(output.data.decode('utf-8')) self.assertDictEqual( data, { @@ -739,7 +739,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): output = self.app.post( '/api/0/test/issue/1/status', data=data, headers=headers) self.assertEqual(output.status_code, 200) - data = json.loads(output.data) + data = json.loads(output.data.decode('utf-8')) self.assertDictEqual( data, {'message': 'No changes'} @@ -758,7 +758,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): output = self.app.post( '/api/0/test/issue/1/status', data=data, headers=headers) self.assertEqual(output.status_code, 200) - data = json.loads(output.data) + data = json.loads(output.data.decode('utf-8')) self.assertDictEqual( data, {'message': 'Successfully edited issue #1'} @@ -770,7 +770,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): output = self.app.post( '/api/0/foo/issue/1/status', data=data, headers=headers) self.assertEqual(output.status_code, 403) - data = json.loads(output.data) + data = json.loads(output.data.decode('utf-8')) self.assertDictEqual( data, { @@ -795,7 +795,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): # 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) + data = json.loads(output.data.decode('utf-8')) self.assertDictEqual( data, { @@ -807,7 +807,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): # Valid token, wrong project output = self.app.post('/api/0/test2/issue/1/comment', headers=headers) self.assertEqual(output.status_code, 401) - data = json.loads(output.data) + data = json.loads(output.data.decode('utf-8')) self.assertDictEqual( data, { @@ -820,7 +820,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): # No input output = self.app.post('/api/0/test/issue/1/comment', headers=headers) self.assertEqual(output.status_code, 404) - data = json.loads(output.data) + data = json.loads(output.data.decode('utf-8')) self.assertDictEqual( data, { @@ -857,7 +857,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): output = self.app.post( '/api/0/test/issue/1/comment', data=data, headers=headers) self.assertEqual(output.status_code, 400) - data = json.loads(output.data) + data = json.loads(output.data.decode('utf-8')) self.assertDictEqual( data, { @@ -879,7 +879,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): output = self.app.post( '/api/0/test/issue/1/comment', data=data, headers=headers) self.assertEqual(output.status_code, 200) - data = json.loads(output.data) + data = json.loads(output.data.decode('utf-8')) self.assertDictEqual( data, {'message': 'Comment added'} @@ -914,7 +914,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): # Give `change_status_issue` to this token item = pagure.lib.model.TokenAcl( token_id='pingou_foo', - acl_id=1, + acl_id=2, ) self.session.add(item) self.session.commit() @@ -948,7 +948,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): output = self.app.post( '/api/0/foo/issue/1/comment', data=data, headers=headers) self.assertEqual(output.status_code, 403) - data = json.loads(output.data) + data = json.loads(output.data.decode('utf-8')) self.assertDictEqual( data, { @@ -982,7 +982,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): output = self.app.post( '/api/0/foo/issue/1/comment', data=data, headers=headers) self.assertEqual(output.status_code, 200) - data = json.loads(output.data) + data = json.loads(output.data.decode('utf-8')) self.assertDictEqual( data, {'message': 'Comment added'} @@ -1008,7 +1008,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): # Issue and comment exists output = self.app.get('/api/0/test/issue/1/comment/1') self.assertEqual(output.status_code, 200) - data = json.loads(output.data) + data = json.loads(output.data.decode('utf-8')) data['date_created'] = '1435821770' data["comment_date"] = "2015-07-02 09:22" data["avatar_url"] = "https://seccdn.libravatar.org/avatar/..." @@ -1033,7 +1033,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): # 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 = json.loads(output.data.decode('utf-8')) data['date_created'] = '1435821770' data["comment_date"] = "2015-07-02 09:22" data["avatar_url"] = "https://seccdn.libravatar.org/avatar/..." @@ -1078,7 +1078,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): headers = {'Authorization': 'token foo_token2'} output = self.app.get('/api/0/foo/issue/1/comment/2', headers=headers) self.assertEqual(output.status_code, 200) - data = json.loads(output.data) + data = json.loads(output.data.decode('utf-8')) data['date_created'] = '1435821770' data["comment_date"] = "2015-07-02 09:22" data["avatar_url"] = "https://seccdn.libravatar.org/avatar/..." diff --git a/tests/test_pagure_flask_api_project.py b/tests/test_pagure_flask_api_project.py index f7abe34..76f27dc 100644 --- a/tests/test_pagure_flask_api_project.py +++ b/tests/test_pagure_flask_api_project.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """ - (c) 2015 - Copyright Red Hat Inc + (c) 2015-2016 - Copyright Red Hat Inc Authors: Pierre-Yves Chibon @@ -97,7 +97,7 @@ class PagureFlaskApiProjecttests(tests.Modeltests): # Check tags output = self.app.get('/api/0/test/git/tags') self.assertEqual(output.status_code, 200) - data = json.loads(output.data) + data = json.loads(output.data.decode('utf-8')) self.assertDictEqual( data, {'tags': ['0.0.1'], 'total_tags': 1} @@ -127,14 +127,14 @@ class PagureFlaskApiProjecttests(tests.Modeltests): # Check the API output = self.app.get('/api/0/projects?tags=inf') self.assertEqual(output.status_code, 404) - data = json.loads(output.data) + data = json.loads(output.data.decode('utf-8')) self.assertDictEqual( data, {'error_code': 'ENOPROJECTS', 'error': 'No projects found'} ) output = self.app.get('/api/0/projects?tags=infra') self.assertEqual(output.status_code, 200) - data = json.loads(output.data) + data = json.loads(output.data.decode('utf-8')) data['projects'][0]['date_created'] = "1436527638" self.assertDictEqual( data, @@ -158,7 +158,7 @@ class PagureFlaskApiProjecttests(tests.Modeltests): ) output = self.app.get('/api/0/projects?username=pingou') self.assertEqual(output.status_code, 200) - data = json.loads(output.data) + data = json.loads(output.data.decode('utf-8')) data['projects'][0]['date_created'] = "1436527638" data['projects'][1]['date_created'] = "1436527638" self.assertDictEqual( @@ -195,7 +195,7 @@ class PagureFlaskApiProjecttests(tests.Modeltests): ) output = self.app.get('/api/0/projects?username=pingou&tags=infra') self.assertEqual(output.status_code, 200) - data = json.loads(output.data) + data = json.loads(output.data.decode('utf-8')) data['projects'][0]['date_created'] = "1436527638" self.assertDictEqual( data, diff --git a/tests/test_pagure_flask_docs.py b/tests/test_pagure_flask_docs.py index 7037358..681bfae 100644 --- a/tests/test_pagure_flask_docs.py +++ b/tests/test_pagure_flask_docs.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """ - (c) 2015 - Copyright Red Hat Inc + (c) 2015-2016 - Copyright Red Hat Inc Authors: Pierre-Yves Chibon @@ -76,13 +76,13 @@ class PagureFlaskDocstests(tests.Modeltests): output = self.app.get('/test/docs', follow_redirects=True) self.assertEqual(output.status_code, 404) - self.assertTrue( - '

Documentation not found

' in output.data) + self.assertIn( + '

Documentation not found

',output.data.decode('utf-8')) output = self.app.get('/test', follow_redirects=True) self.assertEqual(output.status_code, 404) - self.assertTrue( - '

Documentation not found

' in output.data) + self.assertIn( + '

Documentation not found

', output.data.decode('utf-8')) def test_view_docs_project_no_docs(self): """ Test the view_docs endpoint with a project that disabled the @@ -117,7 +117,7 @@ class PagureFlaskDocstests(tests.Modeltests): # Create files in that git repo with open(os.path.join(docrepo, 'sources'), 'w') as stream: - stream.write('foo\n bar') + stream.write(str('foo\n bar')) repo.index.add('sources') repo.index.write() @@ -158,23 +158,27 @@ class PagureFlaskDocstests(tests.Modeltests): output = self.app.get('/test/sources') self.assertEqual(output.status_code, 200) - self.assertEqual('
foo\n bar
', output.data) + self.assertEqual( + '
foo\n bar
', + output.data.decode('utf-8')) output = self.app.get('/test/folder1/folder2') self.assertEqual(output.status_code, 200) - self.assertTrue( - '
  • ' - in output.data) + self.assertIn( + '
  • ', + output.data.decode('utf-8')) output = self.app.get('/test/folder1/folder2/test_file') self.assertEqual(output.status_code, 200) - self.assertEqual('
    row1\nrow2\nrow3
    ', output.data) + self.assertEqual( + '
    row1\nrow2\nrow3
    ', + output.data.decode('utf-8')) output = self.app.get('/test/folder1') self.assertEqual(output.status_code, 200) - self.assertTrue( - '
  • ' - in output.data) + self.assertIn( + '
  • ', + output.data.decode('utf-8')) output = self.app.get('/test/folder1/foo') self.assertEqual(output.status_code, 404) diff --git a/tests/test_pagure_flask_dump_load_ticket.py b/tests/test_pagure_flask_dump_load_ticket.py index 4b585b3..4d4f0dd 100644 --- a/tests/test_pagure_flask_dump_load_ticket.py +++ b/tests/test_pagure_flask_dump_load_ticket.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """ - (c) 2015 - Copyright Red Hat Inc + (c) 2015-2016 - Copyright Red Hat Inc Authors: Pierre-Yves Chibon @@ -220,7 +220,7 @@ class PagureFlaskDumpLoadTicketTests(tests.Modeltests): # Check after re-loading self.assertEqual(len(issue.comments), 2) self.assertEqual(len(issue.tags), 2) - self.assertEqual(issue.tags_text, ['future', 'feature']) + self.assertEqual(sorted(issue.tags_text), ['feature', 'future']) self.assertEqual(issue.assignee.username, 'pingou') self.assertEqual(issue.children, []) self.assertEqual(issue.parents, []) diff --git a/tests/test_pagure_flask_internal.py b/tests/test_pagure_flask_internal.py index d812b13..fb71a3d 100644 --- a/tests/test_pagure_flask_internal.py +++ b/tests/test_pagure_flask_internal.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """ - (c) 2015 - Copyright Red Hat Inc + (c) 2015-2016 - Copyright Red Hat Inc Authors: Pierre-Yves Chibon @@ -115,7 +115,7 @@ class PagureFlaskInternaltests(tests.Modeltests): # Add comment output = self.app.put('/pv/pull-request/comment/', data=data) self.assertEqual(output.status_code, 200) - js_data = json.loads(output.data) + js_data = json.loads(output.data.decode('utf-8')) self.assertDictEqual(js_data, {'message': 'Comment added'}) repo = pagure.lib.get_project(self.session, 'test') @@ -190,7 +190,7 @@ class PagureFlaskInternaltests(tests.Modeltests): # Add comment output = self.app.put('/pv/ticket/comment/', data=data) self.assertEqual(output.status_code, 200) - js_data = json.loads(output.data) + js_data = json.loads(output.data.decode('utf-8')) self.assertDictEqual(js_data, {'message': 'Comment added'}) repo = pagure.lib.get_project(self.session, 'test') @@ -274,7 +274,7 @@ class PagureFlaskInternaltests(tests.Modeltests): # Add comment output = self.app.put('/pv/ticket/comment/', data=data) self.assertEqual(output.status_code, 200) - js_data = json.loads(output.data) + js_data = json.loads(output.data.decode('utf-8')) self.assertDictEqual(js_data, {'message': 'Comment added'}) repo = pagure.lib.get_project(self.session, 'test') @@ -381,7 +381,7 @@ class PagureFlaskInternaltests(tests.Modeltests): user.username = 'pingou' with tests.user_set(pagure.APP, user): output = self.app.get('/test/adduser') - csrf_token = output.data.split( + csrf_token = output.data.decode('utf-8').split( 'name="csrf_token" type="hidden" value="')[1].split('">')[0] # Missing request identifier @@ -405,7 +405,7 @@ class PagureFlaskInternaltests(tests.Modeltests): "short_code": "Ok" } - js_data = json.loads(output.data) + js_data = json.loads(output.data.decode('utf-8')) self.assertDictEqual(js_data, exp) @patch('pagure.lib.notify.send_email') @@ -503,7 +503,7 @@ class PagureFlaskInternaltests(tests.Modeltests): user.username = 'pingou' with tests.user_set(pagure.APP, user): output = self.app.get('/test/adduser') - csrf_token = output.data.split( + csrf_token = output.data.decode('utf-8').split( 'name="csrf_token" type="hidden" value="')[1].split('">')[0] # Missing request identifier @@ -527,7 +527,7 @@ class PagureFlaskInternaltests(tests.Modeltests): "short_code": "No changes" } - js_data = json.loads(output.data) + js_data = json.loads(output.data.decode('utf-8')) self.assertDictEqual(js_data, exp) @patch('pagure.lib.notify.send_email') @@ -644,7 +644,7 @@ class PagureFlaskInternaltests(tests.Modeltests): user.username = 'pingou' with tests.user_set(pagure.APP, user): output = self.app.get('/test/adduser') - csrf_token = output.data.split( + csrf_token = output.data.decode('utf-8').split( 'name="csrf_token" type="hidden" value="')[1].split('">')[0] # Missing request identifier @@ -668,7 +668,7 @@ class PagureFlaskInternaltests(tests.Modeltests): "short_code": "With merge" } - js_data = json.loads(output.data) + js_data = json.loads(output.data.decode('utf-8')) self.assertDictEqual(js_data, exp) @patch('pagure.lib.notify.send_email') @@ -785,7 +785,7 @@ class PagureFlaskInternaltests(tests.Modeltests): user.username = 'pingou' with tests.user_set(pagure.APP, user): output = self.app.get('/test/adduser') - csrf_token = output.data.split( + csrf_token = output.data.decode('utf-8').split( 'name="csrf_token" type="hidden" value="')[1].split('">')[0] # Missing request identifier @@ -809,7 +809,7 @@ class PagureFlaskInternaltests(tests.Modeltests): "short_code": "Conflicts" } - js_data = json.loads(output.data) + js_data = json.loads(output.data.decode('utf-8')) self.assertDictEqual(js_data, exp) diff --git a/tests/test_pagure_flask_ui_admin.py b/tests/test_pagure_flask_ui_admin.py index 5c55c21..ad78842 100644 --- a/tests/test_pagure_flask_ui_admin.py +++ b/tests/test_pagure_flask_ui_admin.py @@ -63,7 +63,7 @@ class PagureFlaskAdmintests(tests.Modeltests): self.assertEqual(output.status_code, 404) self.assertIn( '\n Access restricted', - output.data) + output.data.decode('utf-8')) user.username = 'foo' with tests.user_set(pagure.APP, user): @@ -71,7 +71,7 @@ class PagureFlaskAdmintests(tests.Modeltests): self.assertEqual(output.status_code, 200) self.assertIn( '\n Access restricted', - output.data) + output.data.decode('utf-8')) user = tests.FakeUser( username='pingou', @@ -79,10 +79,10 @@ class PagureFlaskAdmintests(tests.Modeltests): with tests.user_set(pagure.APP, user): output = self.app.get('/admin', follow_redirects=True) self.assertEqual(output.status_code, 200) - self.assertTrue('

    Admin section

    ' in output.data) - self.assertTrue('Re-generate gitolite ACLs file' in output.data) + self.assertTrue('

    Admin section

    ' in output.data.decode('utf-8')) + self.assertTrue('Re-generate gitolite ACLs file' in output.data.decode('utf-8')) self.assertTrue( - 'Re-generate user ssh key files' in output.data) + 'Re-generate user ssh key files' in output.data.decode('utf-8')) @patch('pagure.lib.git.write_gitolite_acls') def test_admin_generate_acl(self, wga): @@ -101,7 +101,7 @@ class PagureFlaskAdmintests(tests.Modeltests): self.assertEqual(output.status_code, 404) self.assertIn( '\n Access restricted', - output.data) + output.data.decode('utf-8')) user.username = 'foo' with tests.user_set(pagure.APP, user): @@ -109,7 +109,7 @@ class PagureFlaskAdmintests(tests.Modeltests): self.assertEqual(output.status_code, 200) self.assertIn( '\n Access restricted', - output.data) + output.data.decode('utf-8')) user = tests.FakeUser( username='pingou', @@ -117,28 +117,28 @@ class PagureFlaskAdmintests(tests.Modeltests): with tests.user_set(pagure.APP, user): output = self.app.post('/admin/gitolite', follow_redirects=True) self.assertEqual(output.status_code, 200) - self.assertTrue('

    Admin section

    ' in output.data) - self.assertTrue('Re-generate gitolite ACLs file' in output.data) + self.assertTrue('

    Admin section

    ' in output.data.decode('utf-8')) + self.assertTrue('Re-generate gitolite ACLs file' in output.data.decode('utf-8')) self.assertTrue( - 'Re-generate user ssh key files' in output.data) + 'Re-generate user ssh key files' in output.data.decode('utf-8')) self.assertFalse( '
  • Gitolite ACLs updated
  • ' - in output.data) + in output.data.decode('utf-8')) - csrf_token = output.data.split( + csrf_token = output.data.decode('utf-8').split( 'name="csrf_token" type="hidden" value="')[1].split('">')[0] data = {'csrf_token': csrf_token} output = self.app.post( '/admin/gitolite', data=data, follow_redirects=True) self.assertEqual(output.status_code, 200) - self.assertTrue('

    Admin section

    ' in output.data) - self.assertTrue('Re-generate gitolite ACLs file' in output.data) + self.assertTrue('

    Admin section

    ' in output.data.decode('utf-8')) + self.assertTrue('Re-generate gitolite ACLs file' in output.data.decode('utf-8')) self.assertTrue( - 'Re-generate user ssh key files' in output.data) + 'Re-generate user ssh key files' in output.data.decode('utf-8')) self.assertTrue( '\n Gitolite ACLs updated' - in output.data) + in output.data.decode('utf-8')) @patch('pagure.generate_user_key_files') def test_admin_refresh_ssh(self, gakf): @@ -157,7 +157,7 @@ class PagureFlaskAdmintests(tests.Modeltests): self.assertEqual(output.status_code, 404) self.assertIn( '\n Access restricted', - output.data) + output.data.decode('utf-8')) user.username = 'foo' with tests.user_set(pagure.APP, user): @@ -165,7 +165,7 @@ class PagureFlaskAdmintests(tests.Modeltests): self.assertEqual(output.status_code, 200) self.assertIn( '\n Access restricted', - output.data) + output.data.decode('utf-8')) user = tests.FakeUser( username='pingou', @@ -173,28 +173,28 @@ class PagureFlaskAdmintests(tests.Modeltests): with tests.user_set(pagure.APP, user): output = self.app.post('/admin/ssh', follow_redirects=True) self.assertEqual(output.status_code, 200) - self.assertTrue('

    Admin section

    ' in output.data) - self.assertTrue('Re-generate gitolite ACLs file' in output.data) + self.assertTrue('

    Admin section

    ' in output.data.decode('utf-8')) + self.assertTrue('Re-generate gitolite ACLs file' in output.data.decode('utf-8')) self.assertTrue( - 'Re-generate user ssh key files' in output.data) + 'Re-generate user ssh key files' in output.data.decode('utf-8')) self.assertFalse( '
  • Authorized file updated
  • ' - in output.data) + in output.data.decode('utf-8')) - csrf_token = output.data.split( + csrf_token = output.data.decode('utf-8').split( 'name="csrf_token" type="hidden" value="')[1].split('">')[0] data = {'csrf_token': csrf_token} output = self.app.post( '/admin/ssh', data=data, follow_redirects=True) self.assertEqual(output.status_code, 200) - self.assertTrue('

    Admin section

    ' in output.data) - self.assertTrue('Re-generate gitolite ACLs file' in output.data) + self.assertTrue('

    Admin section

    ' in output.data.decode('utf-8')) + self.assertTrue('Re-generate gitolite ACLs file' in output.data.decode('utf-8')) self.assertTrue( - 'Re-generate user ssh key files' in output.data) + 'Re-generate user ssh key files' in output.data.decode('utf-8')) self.assertTrue( '\n User key files regenerated' - in output.data) + in output.data.decode('utf-8')) def test_admin_generate_hook_token(self): """ Test the admin_generate_hook_token endpoint. """ @@ -211,7 +211,7 @@ class PagureFlaskAdmintests(tests.Modeltests): self.assertEqual(output.status_code, 404) self.assertIn( '\n Access restricted', - output.data) + output.data.decode('utf-8')) user.username = 'foo' with tests.user_set(pagure.APP, user): @@ -219,7 +219,7 @@ class PagureFlaskAdmintests(tests.Modeltests): self.assertEqual(output.status_code, 200) self.assertIn( '\n Access restricted', - output.data) + output.data.decode('utf-8')) user = tests.FakeUser( username='pingou', @@ -227,29 +227,29 @@ class PagureFlaskAdmintests(tests.Modeltests): with tests.user_set(pagure.APP, user): output = self.app.post('/admin/hook_token', follow_redirects=True) self.assertEqual(output.status_code, 200) - self.assertTrue('

    Admin section

    ' in output.data) - self.assertTrue('Re-generate gitolite ACLs file' in output.data) + self.assertTrue('

    Admin section

    ' in output.data.decode('utf-8')) + self.assertTrue('Re-generate gitolite ACLs file' in output.data.decode('utf-8')) self.assertTrue( - 'Re-generate user ssh key files' in output.data) + 'Re-generate user ssh key files' in output.data.decode('utf-8')) self.assertTrue( - 'Re-generate hook-token for every projects' in output.data) + 'Re-generate hook-token for every projects' in output.data.decode('utf-8')) - csrf_token = output.data.split( + csrf_token = output.data.decode('utf-8').split( 'name="csrf_token" type="hidden" value="')[1].split('">')[0] data = {'csrf_token': csrf_token} output = self.app.post( '/admin/hook_token', data=data, follow_redirects=True) self.assertEqual(output.status_code, 200) - self.assertTrue('

    Admin section

    ' in output.data) - self.assertTrue('Re-generate gitolite ACLs file' in output.data) + self.assertTrue('

    Admin section

    ' in output.data.decode('utf-8')) + self.assertTrue('Re-generate gitolite ACLs file' in output.data.decode('utf-8')) self.assertTrue( - 'Re-generate user ssh key files' in output.data) + 'Re-generate user ssh key files' in output.data.decode('utf-8')) self.assertTrue( - 'Re-generate hook-token for every projects' in output.data) + 'Re-generate hook-token for every projects' in output.data.decode('utf-8')) self.assertTrue( '\n Hook token all re-generated' - in output.data) + in output.data.decode('utf-8')) if __name__ == '__main__': diff --git a/tests/test_pagure_flask_ui_app.py b/tests/test_pagure_flask_ui_app.py index d911f03..6ce27bb 100644 --- a/tests/test_pagure_flask_ui_app.py +++ b/tests/test_pagure_flask_ui_app.py @@ -58,7 +58,7 @@ class PagureFlaskApptests(tests.Modeltests): self.assertEqual(output.status_code, 200) self.assertIn( '

    All Projects ' - '0

    ', output.data) + '0', output.data.decode('utf-8')) tests.create_projects(self.session) @@ -66,7 +66,7 @@ class PagureFlaskApptests(tests.Modeltests): self.assertEqual(output.status_code, 200) self.assertIn( '

    All Projects ' - '2

    ', output.data) + '2', output.data.decode('utf-8')) # Add a 3rd project with a long description item = pagure.lib.model.Project( @@ -83,14 +83,14 @@ class PagureFlaskApptests(tests.Modeltests): output = self.app.get('/?repopage=abc&forkpage=def') self.assertIn( 'Projects 1', - output.data) + output.data.decode('utf-8')) self.assertIn( 'Forks 0', - output.data) + output.data.decode('utf-8')) self.assertEqual( - output.data.count('

    No group found

    '), 1) + output.data.decode('utf-8').count('

    No group found

    '), 1) self.assertEqual( - output.data.count('
    '), 3) + output.data.decode('utf-8').count('
    '), 3) def test_view_users(self): """ Test the view_users endpoint. """ @@ -99,13 +99,13 @@ class PagureFlaskApptests(tests.Modeltests): self.assertEqual(output.status_code, 200) self.assertIn( '

    \n Users ' - '2

    ', output.data) + '2', output.data.decode('utf-8')) self.assertIn( '', - output.data) + output.data.decode('utf-8')) self.assertIn( '', - output.data) + output.data.decode('utf-8')) def test_view_user(self): """ Test the view_user endpoint. """ @@ -114,10 +114,10 @@ class PagureFlaskApptests(tests.Modeltests): self.assertEqual(output.status_code, 200) self.assertIn( 'Projects 0', - output.data) + output.data.decode('utf-8')) self.assertIn( 'Forks 0', - output.data) + output.data.decode('utf-8')) tests.create_projects(self.session) self.gitrepos = tests.create_projects_git( @@ -127,9 +127,9 @@ class PagureFlaskApptests(tests.Modeltests): self.assertEqual(output.status_code, 200) self.assertIn( 'Projects 2', - output.data) + output.data.decode('utf-8')) self.assertIn( - 'Forks 0', output.data) + 'Forks 0', output.data.decode('utf-8')) def test_new_project(self): """ Test the new_project endpoint. """ @@ -149,9 +149,9 @@ class PagureFlaskApptests(tests.Modeltests): with tests.user_set(pagure.APP, user): output = self.app.get('/new/') self.assertEqual(output.status_code, 200) - self.assertIn('Create new Project', output.data) + self.assertIn('Create new Project', output.data.decode('utf-8')) - csrf_token = output.data.split( + csrf_token = output.data.decode('utf-8').split( 'name="csrf_token" type="hidden" value="')[1].split('">')[0] data = { @@ -160,27 +160,27 @@ class PagureFlaskApptests(tests.Modeltests): output = self.app.post('/new/', data=data) self.assertEqual(output.status_code, 200) - self.assertIn('Create new Project', output.data) + self.assertIn('Create new Project', output.data.decode('utf-8')) self.assertIn( '\n This field is required. \n' - ' ', output.data) + ' ', output.data.decode('utf-8')) data['name'] = 'project-1' output = self.app.post('/new/', data=data) self.assertEqual(output.status_code, 200) - self.assertIn('Create new Project', output.data) + self.assertIn('Create new Project', output.data.decode('utf-8')) self.assertNotIn( '\n This field is required. \n' - ' ', output.data) + ' ', output.data.decode('utf-8')) data['csrf_token'] = csrf_token output = self.app.post('/new/', data=data) self.assertEqual(output.status_code, 200) - self.assertIn('Create new Project', output.data) + self.assertIn('Create new Project', output.data.decode('utf-8')) self.assertIn( '\n No user ' '"username" found\n
    ', - output.data) + output.data.decode('utf-8')) user.username = 'foo' with tests.user_set(pagure.APP, user): @@ -189,10 +189,10 @@ class PagureFlaskApptests(tests.Modeltests): self.assertEqual(output.status_code, 200) self.assertIn( '
    \nProject #1
    ', - output.data) + output.data.decode('utf-8')) self.assertIn( '\n Project "project-1" created', - output.data) + output.data.decode('utf-8')) # After projects = pagure.lib.search_projects(self.session) @@ -216,7 +216,7 @@ class PagureFlaskApptests(tests.Modeltests): with tests.user_set(pagure.APP, user): output = self.app.get('/settings/') self.assertEqual(output.status_code, 404) - self.assertTrue('

    Page not found (404)

    ' in output.data) + self.assertTrue('

    Page not found (404)

    ' in output.data.decode('utf-8')) user.username = 'foo' with tests.user_set(pagure.APP, user): @@ -224,12 +224,12 @@ class PagureFlaskApptests(tests.Modeltests): self.assertEqual(output.status_code, 200) self.assertIn( '
    \n Basic Information\n' - '
    ', output.data) + '
    ', output.data.decode('utf-8')) self.assertIn( '', output.data) + '', output.data.decode('utf-8')) - csrf_token = output.data.split( + csrf_token = output.data.decode('utf-8').split( 'name="csrf_token" type="hidden" value="')[1].split('">')[0] data = { @@ -240,10 +240,10 @@ class PagureFlaskApptests(tests.Modeltests): self.assertEqual(output.status_code, 200) self.assertIn( '
    \n Basic Information\n' - '
    ', output.data) + ' ', output.data.decode('utf-8')) self.assertIn( '', output.data) + 'this is my ssh key', output.data.decode('utf-8')) data['csrf_token'] = csrf_token @@ -252,13 +252,13 @@ class PagureFlaskApptests(tests.Modeltests): self.assertEqual(output.status_code, 200) self.assertTrue( '\n Public ssh key updated' - in output.data) + in output.data.decode('utf-8')) self.assertIn( '
    \n Basic Information\n' - '
    ', output.data) + ' ', output.data.decode('utf-8')) self.assertIn( '', output.data) + 'this is my ssh key', output.data.decode('utf-8')) ast.return_value = True output = self.app.get('/settings/') @@ -282,12 +282,12 @@ class PagureFlaskApptests(tests.Modeltests): self.assertEqual(output.status_code, 200) self.assertIn( '
    \n Basic Information\n' - '
    ', output.data) + ' ', output.data.decode('utf-8')) self.assertIn( '', output.data) + '', output.data.decode('utf-8')) - csrf_token = output.data.split( + csrf_token = output.data.decode('utf-8').split( 'name="csrf_token" type="hidden" value="')[1].split('">')[0] # With CSRF @@ -299,7 +299,7 @@ class PagureFlaskApptests(tests.Modeltests):
  • 1
  • item 2
  • """ - self.assertEqual(output.data, exp) + self.assertEqual(output.data.decode('utf-8'), exp) @patch('pagure.ui.app.admin_session_timedout') def test_remove_user_email(self, ast): @@ -311,7 +311,7 @@ class PagureFlaskApptests(tests.Modeltests): with tests.user_set(pagure.APP, user): output = self.app.post('/settings/email/drop') self.assertEqual(output.status_code, 404) - self.assertTrue('

    Page not found (404)

    ' in output.data) + self.assertTrue('

    Page not found (404)

    ' in output.data.decode('utf-8')) user.username = 'foo' with tests.user_set(pagure.APP, user): @@ -319,12 +319,12 @@ class PagureFlaskApptests(tests.Modeltests): self.assertEqual(output.status_code, 200) self.assertIn( '
    \n Basic Information\n' - '
    ', output.data) + ' ', output.data.decode('utf-8')) self.assertIn( '', output.data) + '', output.data.decode('utf-8')) - csrf_token = output.data.split( + csrf_token = output.data.decode('utf-8').split( 'name="csrf_token" type="hidden" value="')[1].split('">')[0] data = { @@ -336,13 +336,13 @@ class PagureFlaskApptests(tests.Modeltests): self.assertEqual(output.status_code, 200) self.assertIn( '
    \n Basic Information\n' - '
    ', output.data) + ' ', output.data.decode('utf-8')) self.assertIn( '', output.data) + '', output.data.decode('utf-8')) self.assertIn( '\n You must always have at least one email', - output.data) + output.data.decode('utf-8')) user.username = 'pingou' with tests.user_set(pagure.APP, user): @@ -350,12 +350,12 @@ class PagureFlaskApptests(tests.Modeltests): self.assertEqual(output.status_code, 200) self.assertIn( '
    \n Basic Information\n' - '
    ', output.data) + ' ', output.data.decode('utf-8')) self.assertIn( '', output.data) + '', output.data.decode('utf-8')) - csrf_token = output.data.split( + csrf_token = output.data.decode('utf-8').split( 'name="csrf_token" type="hidden" value="')[1].split('">')[0] data = { @@ -367,8 +367,8 @@ class PagureFlaskApptests(tests.Modeltests): self.assertEqual(output.status_code, 200) self.assertIn( '
    \n Basic Information\n' - '
    ', output.data) - self.assertEqual(output.data.count('foo@pingou.com'), 4) + ' ', output.data.decode('utf-8')) + self.assertEqual(output.data.decode('utf-8').count('foo@pingou.com'), 4) data = { 'csrf_token': csrf_token, @@ -380,10 +380,10 @@ class PagureFlaskApptests(tests.Modeltests): self.assertEqual(output.status_code, 200) self.assertIn( '
    \n Basic Information\n' - '
    ', output.data) + ' ', output.data.decode('utf-8')) self.assertIn( '\n You do not have the ' - 'email: foobar@pingou.com, nothing to remove', output.data) + 'email: foobar@pingou.com, nothing to remove', output.data.decode('utf-8')) data = { 'csrf_token': csrf_token, @@ -393,14 +393,14 @@ class PagureFlaskApptests(tests.Modeltests): output = self.app.post( '/settings/email/drop', data=data, follow_redirects=True) self.assertEqual(output.status_code, 200) - self.assertEqual(output.data.count('foo@pingou.com'), 0) - self.assertEqual(output.data.count('bar@pingou.com'), 3) + self.assertEqual(output.data.decode('utf-8').count('foo@pingou.com'), 0) + self.assertEqual(output.data.decode('utf-8').count('bar@pingou.com'), 3) output = self.app.post( '/settings/email/drop', data=data, follow_redirects=True) self.assertEqual(output.status_code, 200) - self.assertEqual(output.data.count('foo@pingou.com'), 0) - self.assertEqual(output.data.count('bar@pingou.com'), 3) + self.assertEqual(output.data.decode('utf-8').count('foo@pingou.com'), 0) + self.assertEqual(output.data.decode('utf-8').count('bar@pingou.com'), 3) ast.return_value = True output = self.app.post('/settings/email/drop', data=data) @@ -418,28 +418,28 @@ class PagureFlaskApptests(tests.Modeltests): with tests.user_set(pagure.APP, user): output = self.app.post('/settings/email/add') self.assertEqual(output.status_code, 404) - self.assertTrue('

    Page not found (404)

    ' in output.data) + self.assertTrue('

    Page not found (404)

    ' in output.data.decode('utf-8')) user.username = 'foo' with tests.user_set(pagure.APP, user): output = self.app.post('/settings/email/add') self.assertEqual(output.status_code, 200) - self.assertTrue("Add new email" in output.data) + self.assertTrue("Add new email" in output.data.decode('utf-8')) self.assertIn( '', output.data) + 'name="email" type="text" value="">', output.data.decode('utf-8')) user.username = 'pingou' with tests.user_set(pagure.APP, user): output = self.app.post('/settings/email/add') self.assertEqual(output.status_code, 200) - self.assertTrue("Add new email" in output.data) + self.assertTrue("Add new email" in output.data.decode('utf-8')) self.assertIn( '', output.data) + 'name="email" type="text" value="">', output.data.decode('utf-8')) - csrf_token = output.data.split( + csrf_token = output.data.decode('utf-8').split( 'name="csrf_token" type="hidden" value="')[1].split('">')[0] data = { @@ -449,8 +449,8 @@ class PagureFlaskApptests(tests.Modeltests): output = self.app.post( '/settings/email/add', data=data, follow_redirects=True) self.assertEqual(output.status_code, 200) - self.assertTrue("Add new email" in output.data) - self.assertEqual(output.data.count('foo2@pingou.com'), 1) + self.assertTrue("Add new email" in output.data.decode('utf-8')) + self.assertEqual(output.data.decode('utf-8').count('foo2@pingou.com'), 1) # New email data = { @@ -463,13 +463,13 @@ class PagureFlaskApptests(tests.Modeltests): self.assertEqual(output.status_code, 200) self.assertIn( '
    \n Basic Information\n' - '
    ', output.data) + ' ', output.data.decode('utf-8')) self.assertIn( '\n Email pending validation', - output.data) - self.assertEqual(output.data.count('foo@pingou.com'), 4) - self.assertEqual(output.data.count('bar@pingou.com'), 5) - self.assertEqual(output.data.count('foobar@pingou.com'), 2) + output.data.decode('utf-8')) + self.assertEqual(output.data.decode('utf-8').count('foo@pingou.com'), 4) + self.assertEqual(output.data.decode('utf-8').count('bar@pingou.com'), 5) + self.assertEqual(output.data.decode('utf-8').count('foobar@pingou.com'), 2) # Email already pending output = self.app.post( @@ -491,13 +491,13 @@ class PagureFlaskApptests(tests.Modeltests): output = self.app.post( '/settings/email/add', data=data, follow_redirects=True) self.assertEqual(output.status_code, 200) - self.assertTrue("Add new email" in output.data) + self.assertTrue("Add new email" in output.data.decode('utf-8')) self.assertIn( 'Invalid value, can't be any of: bar@pingou.com, ' - 'foo@pingou.com. ', output.data) - self.assertEqual(output.data.count('foo@pingou.com'), 6) - self.assertEqual(output.data.count('bar@pingou.com'), 5) - self.assertEqual(output.data.count('foobar@pingou.com'), 0) + 'foo@pingou.com. ', output.data.decode('utf-8')) + self.assertEqual(output.data.decode('utf-8').count('foo@pingou.com'), 5) + self.assertEqual(output.data.decode('utf-8').count('bar@pingou.com'), 4) + self.assertEqual(output.data.decode('utf-8').count('foobar@pingou.com'), 0) # Email registered by someone else data = { @@ -508,10 +508,10 @@ class PagureFlaskApptests(tests.Modeltests): output = self.app.post( '/settings/email/add', data=data, follow_redirects=True) self.assertEqual(output.status_code, 200) - self.assertTrue("Add new email" in output.data) + self.assertTrue("Add new email" in output.data.decode('utf-8')) self.assertIn( 'Invalid value, can't be any of: foo@bar.com. ', - output.data) + output.data.decode('utf-8')) ast.return_value = True output = self.app.post('/settings/email/add', data=data) @@ -529,7 +529,7 @@ class PagureFlaskApptests(tests.Modeltests): with tests.user_set(pagure.APP, user): output = self.app.post('/settings/email/default') self.assertEqual(output.status_code, 404) - self.assertTrue('

    Page not found (404)

    ' in output.data) + self.assertTrue('

    Page not found (404)

    ' in output.data.decode('utf-8')) user.username = 'pingou' with tests.user_set(pagure.APP, user): @@ -537,12 +537,12 @@ class PagureFlaskApptests(tests.Modeltests): self.assertEqual(output.status_code, 200) self.assertIn( '
    \n Basic Information\n' - '
    ', output.data) + ' ', output.data.decode('utf-8')) self.assertIn( '', output.data) + '', output.data.decode('utf-8')) - csrf_token = output.data.split( + csrf_token = output.data.decode('utf-8').split( 'name="csrf_token" type="hidden" value="')[1].split('">')[0] data = { @@ -554,8 +554,8 @@ class PagureFlaskApptests(tests.Modeltests): self.assertEqual(output.status_code, 200) self.assertIn( '
    \n Basic Information\n' - '
    ', output.data) - self.assertEqual(output.data.count('foo@pingou.com'), 4) + ' ', output.data.decode('utf-8')) + self.assertEqual(output.data.decode('utf-8').count('foo@pingou.com'), 4) # Set invalid default email data = { @@ -568,12 +568,12 @@ class PagureFlaskApptests(tests.Modeltests): self.assertEqual(output.status_code, 200) self.assertIn( '
    \n Basic Information\n' - '
    ', output.data) - self.assertEqual(output.data.count('foo@pingou.com'), 4) + ' ', output.data.decode('utf-8')) + self.assertEqual(output.data.decode('utf-8').count('foo@pingou.com'), 4) self.assertIn( '\n You do not have the ' 'email: foobar@pingou.com, nothing to set', - output.data) + output.data.decode('utf-8')) # Set default email data = { @@ -586,11 +586,11 @@ class PagureFlaskApptests(tests.Modeltests): self.assertEqual(output.status_code, 200) self.assertIn( '
    \n Basic Information\n' - '
    ', output.data) - self.assertEqual(output.data.count('foo@pingou.com'), 4) + ' ', output.data.decode('utf-8')) + self.assertEqual(output.data.decode('utf-8').count('foo@pingou.com'), 4) self.assertIn( '\n Default email set to: ' - 'foo@pingou.com', output.data) + 'foo@pingou.com', output.data.decode('utf-8')) ast.return_value = True output = self.app.post('/settings/email/default', data=data) @@ -621,7 +621,7 @@ class PagureFlaskApptests(tests.Modeltests): with tests.user_set(pagure.APP, user): output = self.app.post('/settings/email/resend') self.assertEqual(output.status_code, 404) - self.assertTrue('

    Page not found (404)

    ' in output.data) + self.assertTrue('

    Page not found (404)

    ' in output.data.decode('utf-8')) user.username = 'pingou' with tests.user_set(pagure.APP, user): @@ -629,12 +629,12 @@ class PagureFlaskApptests(tests.Modeltests): self.assertEqual(output.status_code, 200) self.assertIn( '
    \n Basic Information\n' - '
    ', output.data) + ' ', output.data.decode('utf-8')) self.assertIn( '', output.data) + '', output.data.decode('utf-8')) - csrf_token = output.data.split( + csrf_token = output.data.decode('utf-8').split( 'name="csrf_token" type="hidden" value="')[1].split('">')[0] data = { @@ -646,8 +646,8 @@ class PagureFlaskApptests(tests.Modeltests): self.assertEqual(output.status_code, 200) self.assertIn( '
    \n Basic Information\n' - '
    ', output.data) - self.assertEqual(output.data.count('foo@pingou.com'), 4) + ' ', output.data.decode('utf-8')) + self.assertEqual(output.data.decode('utf-8').count('foo@pingou.com'), 4) # Set invalid default email data = { @@ -660,11 +660,11 @@ class PagureFlaskApptests(tests.Modeltests): self.assertEqual(output.status_code, 200) self.assertIn( '
    \n Basic Information\n' - '
    ', output.data) - self.assertEqual(output.data.count('foo@pingou.com'), 4) + ' ', output.data.decode('utf-8')) + self.assertEqual(output.data.decode('utf-8').count('foo@pingou.com'), 4) self.assertIn( '\n This email address has ' - 'already been confirmed', output.data) + 'already been confirmed', output.data.decode('utf-8')) # Validate a non-validated email data = { @@ -677,11 +677,11 @@ class PagureFlaskApptests(tests.Modeltests): self.assertEqual(output.status_code, 200) self.assertIn( '
    \n Basic Information\n' - '
    ', output.data) - self.assertEqual(output.data.count('foo@pingou.com'), 4) + ' ', output.data.decode('utf-8')) + self.assertEqual(output.data.decode('utf-8').count('foo@pingou.com'), 4) self.assertIn( '\n Confirmation email re-sent', - output.data) + output.data.decode('utf-8')) ast.return_value = True output = self.app.post('/settings/email/resend', data=data) @@ -717,10 +717,10 @@ class PagureFlaskApptests(tests.Modeltests): self.assertEqual(output.status_code, 200) self.assertIn( '
    \n Basic Information\n' - '
    ', output.data) + ' ', output.data.decode('utf-8')) self.assertIn( '\n No email associated with this token.', - output.data) + output.data.decode('utf-8')) # Confirm email output = self.app.get( @@ -728,10 +728,10 @@ class PagureFlaskApptests(tests.Modeltests): self.assertEqual(output.status_code, 200) self.assertIn( '
    \n Basic Information\n' - '
    ', output.data) + ' ', output.data.decode('utf-8')) self.assertIn( '\n Email validated', - output.data) + output.data.decode('utf-8')) userobj = pagure.lib.search_user(self.session, username='pingou') self.assertEqual(len(userobj.emails), 3) diff --git a/tests/test_pagure_flask_ui_fork.py b/tests/test_pagure_flask_ui_fork.py index 2417027..a7e505a 100644 --- a/tests/test_pagure_flask_ui_fork.py +++ b/tests/test_pagure_flask_ui_fork.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """ - (c) 2015 - Copyright Red Hat Inc + (c) 2015-2016 - Copyright Red Hat Inc Authors: Pierre-Yves Chibon @@ -37,7 +37,7 @@ def _get_commits(output): save = False cnt = 0 for row in output.split('\n'): - if row.strip() in ['Alice Author', 'Alice Äuthòr', 'PY C']: + if row.strip() in [u'Alice Author', u'Alice Äuthòr', u'PY C']: save = True if save: cnt += 1 @@ -251,9 +251,9 @@ class PagureFlaskForktests(tests.Modeltests): self.assertEqual(output.status_code, 200) self.assertIn( '

    PR#1\n' - ' PR from the feature branch\n

    ', output.data) + ' PR from the feature branch\n', output.data.decode('utf-8')) self.assertIn( - 'title="View file as of 2a552b">View
    ', output.data) + 'title="View file as of 2a552b">View', output.data.decode('utf-8')) @patch('pagure.lib.notify.send_email') def test_merge_request_pull_FF(self, send_email): @@ -267,7 +267,7 @@ class PagureFlaskForktests(tests.Modeltests): output = self.app.get('/test/pull-request/1') self.assertEqual(output.status_code, 200) - csrf_token = output.data.split( + csrf_token = output.data.decode('utf-8').split( 'name="csrf_token" type="hidden" value="')[1].split('">')[0] # No CSRF @@ -276,12 +276,12 @@ class PagureFlaskForktests(tests.Modeltests): self.assertEqual(output.status_code, 200) self.assertIn( 'PR#1: PR from the feature branch - test\n - ' - 'Pagure', output.data) + 'Pagure', output.data.decode('utf-8')) self.assertIn( '

    PR#1\n' - ' PR from the feature branch\n

    ', output.data) + ' PR from the feature branch\n', output.data.decode('utf-8')) self.assertIn( - 'title="View file as of 2a552b">View', output.data) + 'title="View file as of 2a552b">View', output.data.decode('utf-8')) # Wrong project data = { @@ -335,14 +335,14 @@ class PagureFlaskForktests(tests.Modeltests): self.assertEqual(output.status_code, 200) self.assertIn( 'PR#1: PR from the feature branch - test\n - ' - 'Pagure', output.data) + 'Pagure', output.data.decode('utf-8')) self.assertIn( '

    PR#1\n' ' PR from the feature branch\n ', - output.data) + output.data.decode('utf-8')) self.assertIn( '\n This request must be ' - 'assigned to be merged', output.data) + 'assigned to be merged', output.data.decode('utf-8')) # PR assigned but not to this user repo = pagure.lib.get_project(self.session, 'test') @@ -357,10 +357,10 @@ class PagureFlaskForktests(tests.Modeltests): self.assertIn( '

    PR#1\n' ' PR from the feature branch\n ', - output.data) + output.data.decode('utf-8')) self.assertIn( '\n Only the assignee can ' - 'merge this review', output.data) + 'merge this review', output.data.decode('utf-8')) # Project w/ minimal PR score settings['Only_assignee_can_merge_pull-request'] = False @@ -375,11 +375,11 @@ class PagureFlaskForktests(tests.Modeltests): self.assertIn( '

    PR#1\n' ' PR from the feature branch\n ', - output.data) + output.data.decode('utf-8')) self.assertIn( '\n This request does not ' 'have the minimum review score necessary to be merged', - output.data) + output.data.decode('utf-8')) # Merge settings['Minimum_score_to_merge_pull-request'] = -1 @@ -390,16 +390,16 @@ class PagureFlaskForktests(tests.Modeltests): '/test/pull-request/1/merge', data=data, follow_redirects=True) self.assertEqual(output.status_code, 200) self.assertIn( - 'Overview - test - Pagure', output.data) + 'Overview - test - Pagure', output.data.decode('utf-8')) self.assertIn( '\n Changes merged!', - output.data) + output.data.decode('utf-8')) self.assertIn( - 'A commit on branch feature', output.data) + 'A commit on branch feature', output.data.decode('utf-8')) self.assertNotIn( - 'Merge #1 `PR from the feature branch`', output.data) + 'Merge #1 `PR from the feature branch`', output.data.decode('utf-8')) # Ensure we have the new commit - commits = _get_commits(output.data) + commits = _get_commits(output.data.decode('utf-8')) self.assertEqual( commits, [ @@ -432,7 +432,7 @@ class PagureFlaskForktests(tests.Modeltests): output = self.app.get('/test/pull-request/1') self.assertEqual(output.status_code, 200) - csrf_token = output.data.split( + csrf_token = output.data.decode('utf-8').split( 'name="csrf_token" type="hidden" value="')[1].split('">')[0] data = { @@ -444,10 +444,10 @@ class PagureFlaskForktests(tests.Modeltests): '/test/pull-request/1/merge', data=data, follow_redirects=True) self.assertEqual(output.status_code, 200) self.assertIn( - 'Overview - test - Pagure', output.data) + 'Overview - test - Pagure', output.data.decode('utf-8')) self.assertIn( '\n Changes merged!', - output.data) + output.data.decode('utf-8')) # Check if the closing notification was added output = self.app.get('/test/pull-request/1') @@ -473,7 +473,7 @@ class PagureFlaskForktests(tests.Modeltests): output = self.app.get('/test/pull-request/1') self.assertEqual(output.status_code, 200) - csrf_token = output.data.split( + csrf_token = output.data.decode('utf-8').split( 'name="csrf_token" type="hidden" value="')[1].split('">')[0] data = { @@ -487,10 +487,10 @@ class PagureFlaskForktests(tests.Modeltests): self.assertIn( '

    PR#1\n' ' PR from the feature branch\n ', - output.data) + output.data.decode('utf-8')) self.assertIn( '\n Merge conflicts!', - output.data) + output.data.decode('utf-8')) @patch('pagure.lib.notify.send_email') def test_merge_request_pull_nochange(self, send_email): @@ -509,7 +509,7 @@ class PagureFlaskForktests(tests.Modeltests): output = self.app.get('/test/pull-request/1') self.assertEqual(output.status_code, 200) - csrf_token = output.data.split( + csrf_token = output.data.decode('utf-8').split( 'name="csrf_token" type="hidden" value="')[1].split('">')[0] data = { @@ -523,10 +523,10 @@ class PagureFlaskForktests(tests.Modeltests): self.assertIn( '

    PR#1\n' ' Merged', - output.data) + output.data.decode('utf-8')) self.assertIn( '\n Nothing to do, changes ' - 'were already merged', output.data) + 'were already merged', output.data.decode('utf-8')) # Check if the closing notification was added output = self.app.get('/test/pull-request/1') @@ -546,10 +546,10 @@ class PagureFlaskForktests(tests.Modeltests): self.assertEqual(output.status_code, 200) self.assertIn( '

    PR#1\n' - ' ', output.data) - self.assertIn('
    Merged by\n', output.data) + ' ', output.data.decode('utf-8')) + self.assertIn('
    Merged by\n', output.data.decode('utf-8')) self.assertIn( - 'title="View file as of 2a552b">View', output.data) + 'title="View file as of 2a552b">View', output.data.decode('utf-8')) @patch('pagure.lib.notify.send_email') def test_request_pull_disabled(self, send_email): @@ -649,9 +649,9 @@ class PagureFlaskForktests(tests.Modeltests): self.assertEqual(output.status_code, 200) self.assertIn( '

    PR#1\n' - ' PR from the feature branch\n

    ', output.data) + ' PR from the feature branch\n

    ', output.data.decode('utf-8')) self.assertTrue( - output.data.count('Overview - test - Pagure', output.data) + 'Overview - test - Pagure', output.data.decode('utf-8')) self.assertIn( '\n Fork is empty, there are no ' - 'commits to request pulling', output.data) + 'commits to request pulling', output.data.decode('utf-8')) shutil.rmtree(newpath) @@ -732,14 +732,14 @@ class PagureFlaskForktests(tests.Modeltests): self.assertEqual(output.status_code, 200) self.assertIn( 'Pull Requests 0', - output.data) + output.data.decode('utf-8')) # Open is primary self.assertIn( 'Open', output.data) + 'href="/test/pull-requests">Open', output.data.decode('utf-8')) self.assertIn( 'Closed', output.data) + 'href="/test/pull-requests?status=0">Closed', output.data.decode('utf-8')) self.set_up_git_repo(new_project=None, branch_from='feature') @@ -747,40 +747,40 @@ class PagureFlaskForktests(tests.Modeltests): self.assertEqual(output.status_code, 200) self.assertIn( 'Pull Requests 1', - output.data) + output.data.decode('utf-8')) # Open is primary self.assertIn( 'Open', output.data) + 'href="/test/pull-requests">Open', output.data.decode('utf-8')) self.assertIn( 'Closed', output.data) + 'href="/test/pull-requests?status=0">Closed', output.data.decode('utf-8')) output = self.app.get('/test/pull-requests?status=Closed') self.assertEqual(output.status_code, 200) self.assertIn( 'Closed Pull Requests 0', - output.data) + output.data.decode('utf-8')) # Close is primary self.assertIn( 'Open', output.data) + 'href="/test/pull-requests">Open', output.data.decode('utf-8')) self.assertIn( 'Closed', output.data) + 'href="/test/pull-requests?status=0">Closed', output.data.decode('utf-8')) output = self.app.get('/test/pull-requests?status=0') self.assertEqual(output.status_code, 200) self.assertIn( 'Closed/Merged Pull Requests 0', - output.data) + output.data.decode('utf-8')) # Close is primary self.assertIn( 'Open', output.data) + 'href="/test/pull-requests">Open', output.data.decode('utf-8')) self.assertIn( 'Closed', output.data) + 'href="/test/pull-requests?status=0">Closed', output.data.decode('utf-8')) # Project w/o pull-request repo = pagure.lib.get_project(self.session, 'test') @@ -814,7 +814,7 @@ class PagureFlaskForktests(tests.Modeltests): self.assertEqual(output.status_code, 200) npatch = [] - for row in output.data.split('\n'): + for row in output.data.decode('utf-8').split('\n'): if row.startswith('Date:'): continue if row.startswith('From '): @@ -877,7 +877,7 @@ index 9f44358..2a552bb 100644 self.assertEqual(output.status_code, 200) npatch = [] - for row in output.data.split('\n'): + for row in output.data.decode('utf-8').split('\n'): if row.startswith('Date:'): continue if row.startswith('From '): @@ -988,7 +988,7 @@ index 9f44358..2a552bb 100644 self.assertEqual(output.status_code, 200) npatch = [] - for row in output.data.split('\n'): + for row in output.data.decode('utf-8').split('\n'): if row.startswith('Date:'): continue if row.startswith('From '): @@ -1075,10 +1075,10 @@ index 0000000..2a552bb output = self.app.get('/test/pull-request/1.patch', follow_redirects=True) self.assertEqual(output.status_code, 200) self.assertIn( - 'Overview - test - Pagure', output.data) + 'Overview - test - Pagure', output.data.decode('utf-8')) self.assertIn( '\n Fork is empty, there are no ' - 'commits to request pulling', output.data) + 'commits to request pulling', output.data.decode('utf-8')) shutil.rmtree(newpath) @@ -1102,15 +1102,15 @@ index 0000000..2a552bb '/test/pull-request/cancel/1', follow_redirects=True) self.assertEqual(output.status_code, 200) self.assertIn( - 'Overview - test - Pagure', output.data) + 'Overview - test - Pagure', output.data.decode('utf-8')) self.assertIn( '\n Invalid input submitted', - output.data) + output.data.decode('utf-8')) output = self.app.get('/test/pull-request/1') self.assertEqual(output.status_code, 200) - csrf_token = output.data.split( + csrf_token = output.data.decode('utf-8').split( 'name="csrf_token" type="hidden" value="')[1].split('">')[0] data = { @@ -1158,10 +1158,10 @@ index 0000000..2a552bb '/test/pull-request/cancel/1', data=data, follow_redirects=True) self.assertEqual(output.status_code, 200) self.assertIn( - 'Overview - test - Pagure', output.data) + 'Overview - test - Pagure', output.data.decode('utf-8')) self.assertIn( '\n Request pull canceled!', - output.data) + output.data.decode('utf-8')) @patch('pagure.lib.notify.send_email') def test_set_assignee_requests(self, send_email): @@ -1189,18 +1189,18 @@ index 0000000..2a552bb self.assertEqual(output.status_code, 200) self.assertIn( 'PR#1: PR from the feature branch - test\n - ' - 'Pagure', output.data) + 'Pagure', output.data.decode('utf-8')) self.assertIn( '

    PR#1\n' - ' PR from the feature branch\n

    ', output.data) + ' PR from the feature branch\n

    ', output.data.decode('utf-8')) self.assertNotIn( '\n Request assigned', - output.data) + output.data.decode('utf-8')) output = self.app.get('/test/pull-request/1') self.assertEqual(output.status_code, 200) - csrf_token = output.data.split( + csrf_token = output.data.decode('utf-8').split( 'name="csrf_token" type="hidden" value="')[1].split('">')[0] data = { @@ -1214,13 +1214,13 @@ index 0000000..2a552bb self.assertEqual(output.status_code, 200) self.assertIn( 'PR#1: PR from the feature branch - test\n - ' - 'Pagure', output.data) + 'Pagure', output.data.decode('utf-8')) self.assertIn( '

    PR#1\n' - ' PR from the feature branch\n

    ', output.data) + ' PR from the feature branch\n

    ', output.data.decode('utf-8')) self.assertNotIn( '\n Request assigned', - output.data) + output.data.decode('utf-8')) # Invalid assignee data = { @@ -1234,13 +1234,13 @@ index 0000000..2a552bb self.assertEqual(output.status_code, 200) self.assertIn( 'PR#1: PR from the feature branch - test\n - ' - 'Pagure', output.data) + 'Pagure', output.data.decode('utf-8')) self.assertIn( '

    PR#1\n' - ' PR from the feature branch\n

    ', output.data) + ' PR from the feature branch\n

    ', output.data.decode('utf-8')) self.assertIn( '\n No user "bar" found', - output.data) + output.data.decode('utf-8')) # Assign the PR data = { @@ -1254,13 +1254,13 @@ index 0000000..2a552bb self.assertEqual(output.status_code, 200) self.assertIn( 'PR#1: PR from the feature branch - test\n - ' - 'Pagure', output.data) + 'Pagure', output.data.decode('utf-8')) self.assertIn( '

    PR#1\n' - ' PR from the feature branch\n

    ', output.data) + ' PR from the feature branch\n

    ', output.data.decode('utf-8')) self.assertIn( '\n Request assigned', - output.data) + output.data.decode('utf-8')) # Pull-Request closed repo = pagure.lib.get_project(self.session, 'test') @@ -1306,9 +1306,9 @@ index 0000000..2a552bb output = self.app.get('/new/') self.assertEqual(output.status_code, 200) - self.assertIn('Create new Project', output.data) + self.assertIn('Create new Project', output.data.decode('utf-8')) - csrf_token = output.data.split( + csrf_token = output.data.decode('utf-8').split( 'name="csrf_token" type="hidden" value="')[1].split('">')[0] data = { @@ -1324,7 +1324,7 @@ index 0000000..2a552bb self.assertEqual(output.status_code, 200) self.assertIn( '\n You may not fork your ' - 'own repo', output.data) + 'own repo', output.data.decode('utf-8')) user.username = 'foo' with tests.user_set(pagure.APP, user): @@ -1340,7 +1340,7 @@ index 0000000..2a552bb self.assertEqual(output.status_code, 200) self.assertIn( '\n Repo "test" ' - 'cloned to "foo/test"', output.data) + 'cloned to "foo/test"', output.data.decode('utf-8')) @patch('pagure.lib.notify.send_email') def test_new_request_pull(self, send_email): @@ -1374,18 +1374,18 @@ index 0000000..2a552bb self.assertEqual(output.status_code, 200) self.assertIn( 'Diff from master to feature - test - Pagure', - output.data) + output.data.decode('utf-8')) self.assertIn( - '

    No commits found

    ', output.data) + '

    No commits found

    ', output.data.decode('utf-8')) output = self.app.get('/test/diff/master..feature') self.assertEqual(output.status_code, 200) self.assertIn( 'Diff from feature to master - test - Pagure', - output.data) + output.data.decode('utf-8')) self.assertNotIn( '', output.data) + 'value="Create">', output.data.decode('utf-8')) user.username = 'pingou' with tests.user_set(pagure.APP, user): @@ -1393,12 +1393,12 @@ index 0000000..2a552bb self.assertEqual(output.status_code, 200) self.assertIn( ' Create new Pull Request for master - test - ' - 'Pagure', output.data) + 'Pagure', output.data.decode('utf-8')) self.assertIn( '', - output.data) + output.data.decode('utf-8')) - csrf_token = output.data.split( + csrf_token = output.data.decode('utf-8').split( 'name="csrf_token" type="hidden" value="')[1].split('">')[0] # Case 1 - Add an initial comment @@ -1413,9 +1413,10 @@ index 0000000..2a552bb self.assertEqual(output.status_code, 200) self.assertIn( 'PR#2: foo bar PR - test\n - Pagure', - output.data) - self.assertIn('

    Test Initial Comment

    ', output.data) - + output.data.decode('utf-8')) + self.assertIn( + '

    Test Initial Comment

    ', + output.data.decode('utf-8')) # Case 2 - Add an empty initial comment data = { @@ -1429,8 +1430,8 @@ index 0000000..2a552bb self.assertEqual(output.status_code, 200) self.assertIn( 'PR#3: foo bar PR - test\n - Pagure', - output.data) - self.assertNotIn('
    Overview - test - Pagure', output.data) + 'Overview - test - Pagure', output.data.decode('utf-8')) self.assertIn( '\n Fork is empty, there are ' - 'no commits to request pulling', output.data) + 'no commits to request pulling', output.data.decode('utf-8')) output = self.app.get('/test/new_issue') - csrf_token = output.data.split( + csrf_token = output.data.decode('utf-8').split( 'name="csrf_token" type="hidden" value="')[1].split('">')[0] data = { @@ -1480,10 +1481,10 @@ index 0000000..2a552bb '/test/diff/master..feature', data=data, follow_redirects=True) self.assertEqual(output.status_code, 200) self.assertIn( - 'Overview - test - Pagure', output.data) + 'Overview - test - Pagure', output.data.decode('utf-8')) self.assertIn( '\n Fork is empty, there are ' - 'no commits to request pulling', output.data) + 'no commits to request pulling', output.data.decode('utf-8')) shutil.rmtree(newpath) @@ -1515,10 +1516,10 @@ index 0000000..2a552bb output = self.app.get( '/fork/foo/test/diff/master..master', follow_redirects=True) self.assertIn( - 'Overview - test - Pagure', output.data) + 'Overview - test - Pagure', output.data.decode('utf-8')) self.assertIn( '\n Fork is empty, there are ' - 'no commits to request pulling', output.data) + 'no commits to request pulling', output.data.decode('utf-8')) shutil.rmtree(newpath) @@ -1541,9 +1542,9 @@ index 0000000..2a552bb output = self.app.post('/test/pull-request/1/comment') self.assertEqual(output.status_code, 200) self.assertTrue( - output.data.startswith('\n
    ')) + output.data.decode('utf-8').startswith('\n
    ')) - csrf_token = output.data.split( + csrf_token = output.data.decode('utf-8').split( 'name="csrf_token" type="hidden" value="')[1].split('">')[0] data = { @@ -1556,10 +1557,10 @@ index 0000000..2a552bb self.assertEqual(output.status_code, 200) self.assertIn( 'PR#1: PR from the feature branch - test\n - ' - 'Pagure', output.data) + 'Pagure', output.data.decode('utf-8')) self.assertIn( '\n Comment added', - output.data) + output.data.decode('utf-8')) # Project w/o pull-request repo = pagure.lib.get_project(self.session, 'test') @@ -1602,13 +1603,13 @@ index 0000000..2a552bb self.assertEqual(output.status_code, 200) self.assertIn( '

    PR#1\n' - ' PR from the feature branch\n

    ', output.data) - #self.assertIn('href="#comment-1">¶', output.data) + ' PR from the feature branch\n', output.data.decode('utf-8')) + #self.assertIn('href="#comment-1">¶', output.data.decode('utf-8')) self.assertIn( '

    This look alright but we can do better

    ', - output.data) + output.data.decode('utf-8')) - csrf_token = output.data.split( + csrf_token = output.data.decode('utf-8').split( 'name="csrf_token" type="hidden" value="')[1].split('">')[0] # Invalid comment id @@ -1637,10 +1638,10 @@ index 0000000..2a552bb self.assertIn( '

    PR#1\n' ' PR from the feature branch\n ', - output.data) + output.data.decode('utf-8')) self.assertIn( '\n Comment removed', - output.data) + output.data.decode('utf-8')) # Project w/o pull-request repo = pagure.lib.get_project(self.session, 'test') @@ -1677,9 +1678,9 @@ index 0000000..2a552bb self.assertEqual(output.status_code, 200) # Creating comment to play with self.assertTrue( - output.data.startswith('\n
    ')) + output.data.decode('utf-8').startswith('\n
    ')) - csrf_token = output.data.split( + csrf_token = output.data.decode('utf-8').split( 'name="csrf_token" type="hidden" value="')[1].split('">')[0] data = { @@ -1694,22 +1695,22 @@ index 0000000..2a552bb self.assertIn( '

    PR#1\n' ' PR from the feature branch\n ', - output.data) + output.data.decode('utf-8')) self.assertIn( '\n Comment added', - output.data) + output.data.decode('utf-8')) # Check if the comment is there self.assertIn( - '

    This look alright but we can do better

    ', output.data) + '

    This look alright but we can do better

    ', output.data.decode('utf-8')) output = self.app.get('/test/pull-request/1/comment/1/edit') self.assertEqual(output.status_code, 200) - self.assertIn('
    ', output.data) + self.assertIn('
    ', output.data.decode('utf-8')) # Checking if the comment is there in the update page self.assertIn( - 'This look alright but we can do better', output.data) + 'This look alright but we can do better', output.data.decode('utf-8')) - csrf_token = output.data.split( + csrf_token = output.data.decode('utf-8').split( 'name="csrf_token" type="hidden" value="')[1].split('">')[0] data = { @@ -1721,17 +1722,17 @@ index 0000000..2a552bb follow_redirects=True) # Checking if the comment is updated in the main page self.assertIn( - '

    This look alright but we can do better than this.

    ', output.data) + '

    This look alright but we can do better than this.

    ', output.data.decode('utf-8')) self.assertIn( '

    PR#1\n' ' PR from the feature branch\n ', - output.data) + output.data.decode('utf-8')) # Checking if Edited by User is there or not self.assertIn( 'Edited just now by pingou ', - output.data) + output.data.decode('utf-8')) self.assertIn( - '\n Comment updated', output.data) + '\n Comment updated', output.data.decode('utf-8')) # Project w/o pull-request repo = pagure.lib.get_project(self.session, 'test') @@ -1760,7 +1761,7 @@ index 0000000..2a552bb output = self.app.get('/test/pull-request/1') self.assertEqual(output.status_code, 200) - csrf_token = output.data.split( + csrf_token = output.data.decode('utf-8').split( 'name="csrf_token" type="hidden" value="')[1].split('">')[0] # No CSRF @@ -1769,12 +1770,12 @@ index 0000000..2a552bb self.assertEqual(output.status_code, 200) self.assertIn( 'PR#1: PR from the feature branch - test\n - ' - 'Pagure', output.data) + 'Pagure', output.data.decode('utf-8')) self.assertIn( '

    PR#1\n' - ' PR from the feature branch\n

    ', output.data) + ' PR from the feature branch\n

    ', output.data.decode('utf-8')) self.assertIn( - 'title="View file as of 2a552b">View', output.data) + 'title="View file as of 2a552b">View', output.data.decode('utf-8')) # Wrong project data = { @@ -1816,16 +1817,16 @@ index 0000000..2a552bb '/test/pull-request/1/merge', data=data, follow_redirects=True) self.assertEqual(output.status_code, 200) self.assertIn( - 'Overview - test - Pagure', output.data) + 'Overview - test - Pagure', output.data.decode('utf-8')) self.assertIn( '\n Changes merged!', - output.data) + output.data.decode('utf-8')) self.assertIn( - 'Merge #1 `PR from the feature branch`', output.data) + 'Merge #1 `PR from the feature branch`', output.data.decode('utf-8')) self.assertIn( - 'A commit on branch feature', output.data) + 'A commit on branch feature', output.data.decode('utf-8')) # Ensure we have the merge commit - commits = _get_commits(output.data) + commits = _get_commits(output.data.decode('utf-8')) self.assertEqual(commits, [ 'Merge #1 `PR from the feature branch`', 'Add sources file for testing', diff --git a/tests/test_pagure_flask_ui_groups.py b/tests/test_pagure_flask_ui_groups.py index 26e392d..68efb8a 100644 --- a/tests/test_pagure_flask_ui_groups.py +++ b/tests/test_pagure_flask_ui_groups.py @@ -57,7 +57,7 @@ class PagureFlaskGroupstests(tests.Modeltests): self.assertIn( '

    \n' ' Groups 0', - output.data) + output.data.decode('utf-8')) def test_add_group(self): """ Test the add_group endpoint. """ @@ -73,11 +73,11 @@ class PagureFlaskGroupstests(tests.Modeltests): with tests.user_set(pagure.APP, user): output = self.app.get('/group/add') self.assertEqual(output.status_code, 200) - self.assertIn('

    Create group

    ', output.data) + self.assertIn('

    Create group

    ', output.data.decode('utf-8')) self.assertNotIn( - '', output.data) + '', output.data.decode('utf-8')) - csrf_token = output.data.split( + csrf_token = output.data.decode('utf-8').split( 'name="csrf_token" type="hidden" value="')[1].split('">')[0] data = { @@ -86,8 +86,8 @@ class PagureFlaskGroupstests(tests.Modeltests): # Insufficient input output = self.app.post('/group/add', data=data) self.assertEqual(output.status_code, 200) - self.assertIn('

    Create group

    ', output.data) - self.assertEqual(output.data.count( + self.assertIn('

    Create group

    ', output.data.decode('utf-8')) + self.assertEqual(output.data.decode('utf-8').count( 'This field is required.'), 1) data = { @@ -97,8 +97,8 @@ class PagureFlaskGroupstests(tests.Modeltests): # Missing CSRF output = self.app.post('/group/add', data=data) self.assertEqual(output.status_code, 200) - self.assertIn('

    Create group

    ', output.data) - self.assertEqual(output.data.count( + self.assertIn('

    Create group

    ', output.data.decode('utf-8')) + self.assertEqual(output.data.decode('utf-8').count( 'This field is required.'), 0) data['csrf_token'] = csrf_token @@ -109,14 +109,14 @@ class PagureFlaskGroupstests(tests.Modeltests): self.assertEqual(output.status_code, 200) self.assertIn( '\n User `pingou` added to ' - 'the group `test_group`.', output.data) + 'the group `test_group`.', output.data.decode('utf-8')) self.assertIn( '\n Group `test_group` created.', - output.data) + output.data.decode('utf-8')) self.assertIn( '

    \n' ' Groups 1', - output.data) + output.data.decode('utf-8')) user = tests.FakeUser( username='pingou', @@ -124,8 +124,8 @@ class PagureFlaskGroupstests(tests.Modeltests): with tests.user_set(pagure.APP, user): output = self.app.get('/group/add') self.assertEqual(output.status_code, 200) - self.assertIn('

    Create group

    ', output.data) - self.assertIn('', output.data) + self.assertIn('

    Create group

    ', output.data.decode('utf-8')) + self.assertIn('', output.data.decode('utf-8')) data = { 'group_name': 'test_admin_group', @@ -139,14 +139,14 @@ class PagureFlaskGroupstests(tests.Modeltests): self.assertEqual(output.status_code, 200) self.assertIn( '\n User `pingou` added to ' - 'the group `test_admin_group`.', output.data) + 'the group `test_admin_group`.', output.data.decode('utf-8')) self.assertIn( '\n Group `test_admin_group` ' - 'created.',output.data) + 'created.',output.data.decode('utf-8')) self.assertIn( '

    \n' ' Groups 2', - output.data) + output.data.decode('utf-8')) def test_group_delete(self): """ Test the group_delete endpoint. """ @@ -159,11 +159,11 @@ class PagureFlaskGroupstests(tests.Modeltests): self.assertEqual(output.status_code, 200) self.assertIn( '

    No groups have been created on this pagure instance ' - 'yet

    ', output.data) + 'yet

    ', output.data.decode('utf-8')) self.assertIn( '

    \n' ' Groups 0', - output.data) + output.data.decode('utf-8')) self.test_add_group() @@ -173,9 +173,9 @@ class PagureFlaskGroupstests(tests.Modeltests): self.assertIn( '

    \n' ' Groups 1', - output.data) + output.data.decode('utf-8')) - csrf_token = output.data.split( + csrf_token = output.data.decode('utf-8').split( 'name="csrf_token" type="hidden" value="')[1].split('">')[0] user.username = 'foo' @@ -189,22 +189,22 @@ class PagureFlaskGroupstests(tests.Modeltests): self.assertEqual(output.status_code, 200) self.assertIn( '\n No group `bar` found', - output.data) + output.data.decode('utf-8')) self.assertIn( '

    \n' ' Groups 1', - output.data) + output.data.decode('utf-8')) output = self.app.post( '/group/test_group/delete', data=data, follow_redirects=True) self.assertEqual(output.status_code, 200) self.assertIn( '\n You are not allowed to ' - 'delete the group test_group', output.data) + 'delete the group test_group', output.data.decode('utf-8')) self.assertIn( '

    \n' ' Groups 1', - output.data) + output.data.decode('utf-8')) user.username = 'bar' with tests.user_set(pagure.APP, user): @@ -221,11 +221,11 @@ class PagureFlaskGroupstests(tests.Modeltests): self.assertEqual(output.status_code, 200) self.assertIn( '\n Group `test_group` has ' - 'been deleted', output.data) + 'been deleted', output.data.decode('utf-8')) self.assertIn( '

    \n' ' Groups 0', - output.data) + output.data.decode('utf-8')) def test_view_group(self): """ Test the view_group endpoint. """ @@ -240,7 +240,7 @@ class PagureFlaskGroupstests(tests.Modeltests): self.assertEqual(output.status_code, 200) self.assertIn( '  ' - 'test_group', output.data) + 'test_group', output.data.decode('utf-8')) output = self.app.get('/group/test_admin_group') self.assertEqual(output.status_code, 404) @@ -254,10 +254,10 @@ class PagureFlaskGroupstests(tests.Modeltests): self.assertEqual(output.status_code, 200) self.assertIn( '  ' - 'test_admin_group', output.data) - self.assertEqual(output.data.count('')[0] # No CSRF @@ -269,8 +269,8 @@ class PagureFlaskGroupstests(tests.Modeltests): self.assertEqual(output.status_code, 200) self.assertIn( '  ' - 'test_admin_group', output.data) - self.assertEqual(output.data.count('\n No user `bar` found', - output.data) + output.data.decode('utf-8')) self.assertIn( '  ' - 'test_admin_group', output.data) - self.assertEqual(output.data.count('\n User `foo` added to the ' - 'group `test_admin_group`.', output.data) + 'group `test_admin_group`.', output.data.decode('utf-8')) self.assertIn( '  ' - 'test_admin_group', output.data) - self.assertEqual(output.data.count('  ' - 'test_group', output.data) - self.assertEqual(output.data.count('')[0] data = {'csrf_token': csrf_token} @@ -337,22 +337,22 @@ class PagureFlaskGroupstests(tests.Modeltests): self.assertEqual(output.status_code, 200) self.assertIn( '\n No user `bar` found', - output.data) + output.data.decode('utf-8')) self.assertIn( '  ' - 'test_group', output.data) - self.assertEqual(output.data.count('\n Could not find user ' - 'username', output.data) + 'username', output.data.decode('utf-8')) self.assertIn( '  ' - 'test_group', output.data) - self.assertEqual(output.data.count('\n User `foo` could not be ' - 'found in the group `test_group`', output.data) + 'found in the group `test_group`', output.data.decode('utf-8')) self.assertIn( '  ' - 'test_group', output.data) - self.assertEqual(output.data.count('\n User `foo` could not be ' - 'found in the group `test_group`', output.data) + 'found in the group `test_group`', output.data.decode('utf-8')) self.assertIn( '  ' - 'test_group', output.data) - self.assertEqual(output.data.count('\n User `foo` added to the ' - 'group `test_group`.', output.data) + 'group `test_group`.', output.data.decode('utf-8')) self.assertIn( '  ' - 'test_group', output.data) - self.assertEqual(output.data.count('\n User `foo` removed from ' - 'the group `test_group`', output.data) + 'the group `test_group`', output.data.decode('utf-8')) self.assertIn( '  ' - 'test_group', output.data) - self.assertEqual(output.data.count('\n New issue' - in output.data) + in output.data.decode('utf-8')) - csrf_token = output.data.split( + csrf_token = output.data.decode('utf-8').split( 'name="csrf_token" type="hidden" value="')[1].split('">')[0] data = { @@ -87,8 +87,8 @@ class PagureFlaskIssuestests(tests.Modeltests): self.assertEqual(output.status_code, 200) self.assertTrue( '
    \n New issue' - in output.data) - self.assertEqual(output.data.count( + in output.data.decode('utf-8')) + self.assertEqual(output.data.decode('utf-8').count( 'This field is required.'), 2) data['title'] = 'Test issue' @@ -96,8 +96,8 @@ class PagureFlaskIssuestests(tests.Modeltests): self.assertEqual(output.status_code, 200) self.assertTrue( '
    \n New issue' - in output.data) - self.assertEqual(output.data.count( + in output.data.decode('utf-8')) + self.assertEqual(output.data.decode('utf-8').count( 'This field is required.'), 1) data['issue_content'] = 'We really should improve on this issue' @@ -106,8 +106,8 @@ class PagureFlaskIssuestests(tests.Modeltests): self.assertEqual(output.status_code, 200) self.assertTrue( '
    \n New issue' - in output.data) - self.assertEqual(output.data.count( + in output.data.decode('utf-8')) + self.assertEqual(output.data.decode('utf-8').count( '\n This field is required.'), 0) @@ -117,12 +117,12 @@ class PagureFlaskIssuestests(tests.Modeltests): self.assertEqual(output.status_code, 200) self.assertTrue( '
    \n New issue' - in output.data) - self.assertEqual(output.data.count( + in output.data.decode('utf-8')) + self.assertEqual(output.data.decode('utf-8').count( 'This field is required.'), 0) self.assertTrue( '\n No user "username" found' - in output.data) + in output.data.decode('utf-8')) user.username = 'pingou' with tests.user_set(pagure.APP, user): @@ -131,11 +131,11 @@ class PagureFlaskIssuestests(tests.Modeltests): self.assertEqual(output.status_code, 200) self.assertIn( 'Issue #1: Test issue - test - Pagure', - output.data) + output.data.decode('utf-8')) self.assertIn( '', - output.data) + output.data.decode('utf-8')) # Project w/o issue tracker repo = pagure.lib.get_project(self.session, 'test') @@ -169,12 +169,12 @@ class PagureFlaskIssuestests(tests.Modeltests): self.assertEqual(output.status_code, 200) self.assertTrue( '', output.data) + '
    ', output.data.decode('utf-8')) self.assertTrue( - '

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

    \n 0 Open Issues' in output.data.decode('utf-8')) # Create issues to play with repo = pagure.lib.get_project(self.session, 'test') @@ -258,23 +258,23 @@ class PagureFlaskIssuestests(tests.Modeltests): # Whole list output = self.app.get('/test/issues') self.assertEqual(output.status_code, 200) - self.assertIn('Issues - test - Pagure', output.data) + self.assertIn('Issues - test - Pagure', output.data.decode('utf-8')) self.assertTrue( - '

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

    \n 1 Open Issues' in output.data.decode('utf-8')) # Status = closed output = self.app.get('/test/issues?status=cloSED') self.assertEqual(output.status_code, 200) - self.assertIn('Issues - test - Pagure', output.data) + self.assertIn('Issues - test - Pagure', output.data.decode('utf-8')) self.assertTrue( - '

    \n 0 Closed Issues' in output.data) + '

    \n 0 Closed Issues' in output.data.decode('utf-8')) # Status = fixed output = self.app.get('/test/issues?status=fixed') self.assertEqual(output.status_code, 200) - self.assertIn('Issues - test - Pagure', output.data) + self.assertIn('Issues - test - Pagure', output.data.decode('utf-8')) self.assertTrue( - '

    \n 0 Closed Issues' in output.data) + '

    \n 0 Closed Issues' in output.data.decode('utf-8')) # Project w/o issue tracker repo = pagure.lib.get_project(self.session, 'test') @@ -321,11 +321,11 @@ class PagureFlaskIssuestests(tests.Modeltests): self.assertNotIn( '', - output.data) + output.data.decode('utf-8')) self.assertTrue( '' 'Login\n to comment on this ticket.' - in output.data) + in output.data.decode('utf-8')) user = tests.FakeUser() with tests.user_set(pagure.APP, user): @@ -335,14 +335,14 @@ class PagureFlaskIssuestests(tests.Modeltests): self.assertNotIn( '', - output.data) + output.data.decode('utf-8')) self.assertNotIn( '\n Successfully edited issue #1', - output.data) + output.data.decode('utf-8')) self.assertTrue( '' - in output.data) + in output.data.decode('utf-8')) # Add new comment data = { @@ -525,23 +525,23 @@ class PagureFlaskIssuestests(tests.Modeltests): self.assertEqual(output.status_code, 200) self.assertIn( 'Issue #1: Test issue - test - Pagure', - output.data) + output.data.decode('utf-8')) self.assertIn( '', - output.data) + output.data.decode('utf-8')) self.assertIn( '\n Comment added', - output.data) + output.data.decode('utf-8')) self.assertNotIn( '\n No changes to edit', - output.data) + output.data.decode('utf-8')) self.assertTrue( - '

    Woohoo a second comment !

    ' in output.data) - self.assertEqual(output.data.count('comment_body">'), 2) + '

    Woohoo a second comment !

    ' in output.data.decode('utf-8')) + self.assertEqual(output.data.decode('utf-8').count('comment_body">'), 2) self.assertTrue( '' - in output.data) + in output.data.decode('utf-8')) # Add new tag data = { @@ -554,23 +554,23 @@ class PagureFlaskIssuestests(tests.Modeltests): self.assertEqual(output.status_code, 200) self.assertIn( 'Issue #1: Test issue - test - Pagure', - output.data) + output.data.decode('utf-8')) self.assertIn( '
    ', - output.data) + output.data.decode('utf-8')) self.assertIn( '\n Tag added: tag2', - output.data) + output.data.decode('utf-8')) self.assertNotIn( '\n No changes to edit', - output.data) + output.data.decode('utf-8')) self.assertTrue( - '

    Woohoo a second comment !

    ' in output.data) - self.assertEqual(output.data.count('comment_body">'), 2) + '

    Woohoo a second comment !

    ' in output.data.decode('utf-8')) + self.assertEqual(output.data.decode('utf-8').count('comment_body">'), 2) self.assertTrue( '' - in output.data) + in output.data.decode('utf-8')) # Assign issue to an non-existent user data = { @@ -583,20 +583,20 @@ class PagureFlaskIssuestests(tests.Modeltests): self.assertEqual(output.status_code, 200) self.assertIn( 'Issue #1: Test issue - test - Pagure', - output.data) + output.data.decode('utf-8')) self.assertIn( '
    ', - output.data) + output.data.decode('utf-8')) self.assertIn( '\n No user "ralph" found', - output.data) + output.data.decode('utf-8')) self.assertTrue( - '

    Woohoo a second comment !

    ' in output.data) - self.assertEqual(output.data.count('comment_body">'), 2) + '

    Woohoo a second comment !

    ' in output.data.decode('utf-8')) + self.assertEqual(output.data.decode('utf-8').count('comment_body">'), 2) self.assertTrue( '' - in output.data) + in output.data.decode('utf-8')) # Assign issue properly data = { @@ -609,22 +609,22 @@ class PagureFlaskIssuestests(tests.Modeltests): self.assertEqual(output.status_code, 200) self.assertIn( 'Issue #1: Test issue - test - Pagure', - output.data) + output.data.decode('utf-8')) self.assertIn( '
    ', - output.data) + output.data.decode('utf-8')) self.assertIn( '\n Issue assigned', - output.data) + output.data.decode('utf-8')) self.assertTrue( - '' in output.data) + '' in output.data.decode('utf-8')) self.assertTrue( - '

    Woohoo a second comment !

    ' in output.data) - self.assertEqual(output.data.count('comment_body">'), 2) + '

    Woohoo a second comment !

    ' in output.data.decode('utf-8')) + self.assertEqual(output.data.decode('utf-8').count('comment_body">'), 2) self.assertTrue( '' - in output.data) + in output.data.decode('utf-8')) # Create another issue with a dependency repo = pagure.lib.get_project(self.session, 'test') @@ -658,18 +658,18 @@ class PagureFlaskIssuestests(tests.Modeltests): self.assertEqual(output.status_code, 200) self.assertIn( 'Issue #2: Test issue - test - Pagure', - output.data) + output.data.decode('utf-8')) self.assertIn( '
    ', - output.data) + output.data.decode('utf-8')) self.assertIn( '\n You cannot close a ticket ' 'that has ticket depending that are still open.', - output.data) + output.data.decode('utf-8')) self.assertTrue( '' - in output.data) + in output.data.decode('utf-8')) # Create private issue repo = pagure.lib.get_project(self.session, 'test') @@ -737,13 +737,13 @@ class PagureFlaskIssuestests(tests.Modeltests): self.assertEqual(output.status_code, 200) self.assertIn( 'Issue #1: Test issue - test - Pagure', - output.data) + output.data.decode('utf-8')) self.assertIn( '', - output.data) + output.data.decode('utf-8')) - csrf_token = output.data.split( + csrf_token = output.data.decode('utf-8').split( 'name="csrf_token" type="hidden" value="')[1].split('">')[0] # Add new comment @@ -756,17 +756,17 @@ class PagureFlaskIssuestests(tests.Modeltests): self.assertEqual(output.status_code, 200) self.assertIn( 'Issue #1: Test issue - test - Pagure', - output.data) + output.data.decode('utf-8')) self.assertIn( '', - output.data) + output.data.decode('utf-8')) self.assertIn( '\n Comment added', - output.data) + output.data.decode('utf-8')) self.assertTrue( - '

    Woohoo a second comment !

    ' in output.data) - self.assertEqual(output.data.count('comment_body">'), 2) + '

    Woohoo a second comment !

    ' in output.data.decode('utf-8')) + self.assertEqual(output.data.decode('utf-8').count('comment_body">'), 2) repo = pagure.lib.get_project(self.session, 'test') issue = pagure.lib.search_issues(self.session, repo, issueid=1) @@ -798,14 +798,14 @@ class PagureFlaskIssuestests(tests.Modeltests): self.assertEqual(output.status_code, 200) self.assertIn( 'Issue #1: Test issue - test - Pagure', - output.data) + output.data.decode('utf-8')) self.assertIn( '
    ', - output.data) + output.data.decode('utf-8')) self.assertIn( '\n Comment removed', - output.data) + output.data.decode('utf-8')) # Drop non-existant comment output = self.app.post( @@ -859,13 +859,13 @@ class PagureFlaskIssuestests(tests.Modeltests): self.assertEqual(output.status_code, 200) self.assertIn( 'Issue #1: Test issue - test - Pagure', - output.data) + output.data.decode('utf-8')) self.assertIn( '', - output.data) + output.data.decode('utf-8')) - csrf_token = output.data.split( + csrf_token = output.data.decode('utf-8').split( 'name="csrf_token" type="hidden" value="')[1].split('">')[0] # Add a dependent ticket @@ -878,14 +878,14 @@ class PagureFlaskIssuestests(tests.Modeltests): self.assertEqual(output.status_code, 200) self.assertIn( 'Issue #1: Test issue - test - Pagure', - output.data) + output.data.decode('utf-8')) self.assertIn( '', - output.data) + output.data.decode('utf-8')) self.assertIn( '\n Dependency added', - output.data) + output.data.decode('utf-8')) # Add an invalid dependent ticket data = { @@ -897,14 +897,14 @@ class PagureFlaskIssuestests(tests.Modeltests): self.assertEqual(output.status_code, 200) self.assertIn( 'Issue #1: Test issue - test - Pagure', - output.data) + output.data.decode('utf-8')) self.assertIn( '', - output.data) + output.data.decode('utf-8')) self.assertNotIn( '\n Dependency added', - output.data) + output.data.decode('utf-8')) repo = pagure.lib.get_project(self.session, 'test') issue = pagure.lib.search_issues(self.session, repo, issueid=1) @@ -954,13 +954,13 @@ class PagureFlaskIssuestests(tests.Modeltests): self.assertEqual(output.status_code, 200) self.assertIn( 'Issue #1: Test issue - test - Pagure', - output.data) + output.data.decode('utf-8')) self.assertIn( '', - output.data) + output.data.decode('utf-8')) - csrf_token = output.data.split( + csrf_token = output.data.decode('utf-8').split( 'name="csrf_token" type="hidden" value="')[1].split('">')[0] # Add a dependent ticket @@ -973,14 +973,14 @@ class PagureFlaskIssuestests(tests.Modeltests): self.assertEqual(output.status_code, 200) self.assertIn( 'Issue #1: Test issue - test - Pagure', - output.data) + output.data.decode('utf-8')) self.assertIn( '', - output.data) + output.data.decode('utf-8')) self.assertIn( '\n Dependency added', - output.data) + output.data.decode('utf-8')) # Add an invalid dependent ticket data = { @@ -992,14 +992,14 @@ class PagureFlaskIssuestests(tests.Modeltests): self.assertEqual(output.status_code, 200) self.assertIn( 'Issue #1: Test issue - test - Pagure', - output.data) + output.data.decode('utf-8')) self.assertIn( '', - output.data) + output.data.decode('utf-8')) self.assertNotIn( '\n Dependency added', - output.data) + output.data.decode('utf-8')) repo = pagure.lib.get_project(self.session, 'test') issue = pagure.lib.search_issues(self.session, repo, issueid=1) @@ -1039,13 +1039,13 @@ class PagureFlaskIssuestests(tests.Modeltests): self.assertEqual(output.status_code, 200) self.assertIn( 'Issue #1: Test issue - test - Pagure', - output.data) + output.data.decode('utf-8')) self.assertIn( '', - output.data) + output.data.decode('utf-8')) - csrf_token = output.data.split( + csrf_token = output.data.decode('utf-8').split( 'name="csrf_token" type="hidden" value="')[1].split('">')[0] output = self.app.post('/foo/issue/1/upload') @@ -1061,7 +1061,7 @@ class PagureFlaskIssuestests(tests.Modeltests): output = self.app.post( '/test/issue/1/upload', data=data, follow_redirects=True) self.assertEqual(output.status_code, 200) - json_data = json.loads(output.data) + json_data = json.loads(output.data.decode('utf-8')) exp = {'output': 'notok'} self.assertDictEqual(json_data, exp) @@ -1076,7 +1076,7 @@ class PagureFlaskIssuestests(tests.Modeltests): '/test/issue/1/upload', data=data, follow_redirects=True) stream.close() self.assertEqual(output.status_code, 200) - json_data = json.loads(output.data) + json_data = json.loads(output.data.decode('utf-8')) folder = os.path.dirname( os.path.abspath(__file__))[1:].replace('/', '_') @@ -1225,9 +1225,9 @@ class PagureFlaskIssuestests(tests.Modeltests): self.assertEqual(output.status_code, 200) self.assertTrue( '
    \n Edit ' - 'issue #1\n
    ' in output.data) + 'issue #1\n

    ' in output.data.decode('utf-8')) - csrf_token = output.data.split( + csrf_token = output.data.decode('utf-8').split( 'name="csrf_token" type="hidden" value="')[1].split('">')[0] data = { @@ -1238,11 +1238,11 @@ class PagureFlaskIssuestests(tests.Modeltests): self.assertEqual(output.status_code, 200) self.assertTrue( '
    \n Edit ' - 'issue #1\n
    ' in output.data) - self.assertEqual(output.data.count( + 'issue #1\n
    ' in output.data.decode('utf-8')) + self.assertEqual(output.data.decode('utf-8').count( '\n This field is required. \n' ' '), 1) - self.assertEqual(output.data.count( + self.assertEqual(output.data.decode('utf-8').count( '\n Not a valid choice ' '\n '), 1) @@ -1252,11 +1252,11 @@ class PagureFlaskIssuestests(tests.Modeltests): self.assertEqual(output.status_code, 200) self.assertTrue( '
    \n Edit ' - 'issue #1\n
    ' in output.data) - self.assertEqual(output.data.count( + 'issue #1\n
    ' in output.data.decode('utf-8')) + self.assertEqual(output.data.decode('utf-8').count( '\n This field is required. \n' ' '), 0) - self.assertEqual(output.data.count( + self.assertEqual(output.data.decode('utf-8').count( '\n Not a valid choice ' '\n '), 0) @@ -1266,15 +1266,15 @@ class PagureFlaskIssuestests(tests.Modeltests): self.assertEqual(output.status_code, 200) self.assertIn( '\n Successfully edited issue #1', - output.data) + output.data.decode('utf-8')) self.assertIn( '#1\n' ' Test issue #1', - output.data) - self.assertEqual(output.data.count( + output.data.decode('utf-8')) + self.assertEqual(output.data.decode('utf-8').count( ''), 1) - self.assertEqual(output.data.count('comment_body">'), 1) - self.assertEqual(output.data.count( + self.assertEqual(output.data.decode('utf-8').count('comment_body">'), 1) + self.assertEqual(output.data.decode('utf-8').count( '

    We should work on this!

    '), 1) # Project w/o issue tracker @@ -1341,22 +1341,22 @@ class PagureFlaskIssuestests(tests.Modeltests): with tests.user_set(pagure.APP, user): output = self.app.get('/test/tag/tag1/edit') self.assertEqual(output.status_code, 200) - self.assertTrue('

    Edit tag: tag1

    ' in output.data) + self.assertTrue('

    Edit tag: tag1

    ' in output.data.decode('utf-8')) self.assertTrue( '

    Enter in the field below the new name for the tag: ' - '"tag1"

    ' in output.data) + '"tag1"

    ' in output.data.decode('utf-8')) - csrf_token = output.data.split( + csrf_token = output.data.decode('utf-8').split( 'name="csrf_token" type="hidden" value="')[1].split('">')[0] data = {'tag': 'tag2'} output = self.app.post('/test/tag/tag1/edit', data=data) self.assertEqual(output.status_code, 200) - self.assertTrue('

    Edit tag: tag1

    ' in output.data) + self.assertTrue('

    Edit tag: tag1

    ' in output.data.decode('utf-8')) self.assertTrue( '

    Enter in the field below the new name for the tag: ' - '"tag1"

    ' in output.data) + '"tag1"

    ' in output.data.decode('utf-8')) data['csrf_token'] = csrf_token tests.create_projects_git(tests.HERE) @@ -1364,10 +1364,10 @@ class PagureFlaskIssuestests(tests.Modeltests): '/test/tag/tag1/edit', data=data, follow_redirects=True) self.assertEqual(output.status_code, 200) self.assertIn( - 'Settings - test - Pagure', output.data) + 'Settings - test - Pagure', output.data.decode('utf-8')) self.assertIn( '\n Edited tag: tag1 to tag2', - output.data) + output.data.decode('utf-8')) # After edit, list tags tags = pagure.lib.get_tags_of_project(self.session, repo) @@ -1429,10 +1429,10 @@ class PagureFlaskIssuestests(tests.Modeltests): '/test/droptag/', data={}, follow_redirects=True) self.assertEqual(output.status_code, 200) self.assertTrue( - 'Settings - test - Pagure' in output.data) - self.assertTrue("

    Settings for test

    " in output.data) + 'Settings - test - Pagure' in output.data.decode('utf-8')) + self.assertTrue("

    Settings for test

    " in output.data.decode('utf-8')) - csrf_token = output.data.split( + csrf_token = output.data.decode('utf-8').split( 'name="csrf_token" type="hidden" value="')[1].split('">')[0] data = {'tag': 'tag1'} @@ -1440,16 +1440,16 @@ class PagureFlaskIssuestests(tests.Modeltests): output = self.app.post( '/test/droptag/', data=data, follow_redirects=True) self.assertEqual(output.status_code, 200) - self.assertTrue("

    Settings for test

    " in output.data) + self.assertTrue("

    Settings for test

    " in output.data.decode('utf-8')) data['csrf_token'] = csrf_token output = self.app.post( '/test/droptag/', data=data, follow_redirects=True) self.assertEqual(output.status_code, 200) - self.assertTrue("

    Settings for test

    " in output.data) + self.assertTrue("

    Settings for test

    " in output.data.decode('utf-8')) self.assertIn( '\n Removed tag: tag1', - output.data) + output.data.decode('utf-8')) @patch('pagure.lib.git.update_git') @patch('pagure.lib.notify.send_email') @@ -1496,9 +1496,9 @@ class PagureFlaskIssuestests(tests.Modeltests): self.assertEqual(output.status_code, 200) self.assertIn( 'Issue #1: Test issue - test - Pagure', - output.data) + output.data.decode('utf-8')) - csrf_token = output.data.split( + csrf_token = output.data.decode('utf-8').split( 'name="csrf_token" type="hidden" value="')[1].split('">')[0] data = { @@ -1510,17 +1510,17 @@ class PagureFlaskIssuestests(tests.Modeltests): self.assertEqual(output.status_code, 200) self.assertIn( 'Issue #1: Test issue - test - Pagure', - output.data) + output.data.decode('utf-8')) data['csrf_token'] = csrf_token output = self.app.post( '/test/issue/1/drop', data=data, follow_redirects=True) self.assertEqual(output.status_code, 200) self.assertIn( - 'Issues - test - Pagure', output.data) + 'Issues - test - Pagure', output.data.decode('utf-8')) self.assertIn( '\n Issue deleted', - output.data) + output.data.decode('utf-8')) # Project w/o issue tracker repo = pagure.lib.get_project(self.session, 'test') @@ -1564,13 +1564,13 @@ class PagureFlaskIssuestests(tests.Modeltests): self.assertEqual(output.status_code, 200) self.assertIn( 'Issue #1: Test issue - test - Pagure', - output.data) + output.data.decode('utf-8')) self.assertIn( '
    ', - output.data) + output.data.decode('utf-8')) - csrf_token = output.data.split( + csrf_token = output.data.decode('utf-8').split( 'name="csrf_token" type="hidden" value="')[1].split('">')[0] # Add new comment @@ -1583,17 +1583,17 @@ class PagureFlaskIssuestests(tests.Modeltests): self.assertEqual(output.status_code, 200) self.assertIn( 'Issue #1: Test issue - test - Pagure', - output.data) + output.data.decode('utf-8')) self.assertIn( '', - output.data) + output.data.decode('utf-8')) self.assertIn( '\n Comment added', - output.data) + output.data.decode('utf-8')) self.assertTrue( - '

    Woohoo a second comment !

    ' in output.data) - self.assertEqual(output.data.count('comment_body">'), 2) + '

    Woohoo a second comment !

    ' in output.data.decode('utf-8')) + self.assertEqual(output.data.decode('utf-8').count('comment_body">'), 2) repo = pagure.lib.get_project(self.session, 'test') issue = pagure.lib.search_issues(self.session, repo, issueid=1) @@ -1629,14 +1629,14 @@ class PagureFlaskIssuestests(tests.Modeltests): self.assertEqual(output.status_code, 200) self.assertIn( 'Issue #1: Test issue - test - Pagure', - output.data) + output.data.decode('utf-8')) self.assertIn( '
    ', - output.data) + output.data.decode('utf-8')) self.assertIn( '\n Comment updated', - output.data) + output.data.decode('utf-8')) repo = pagure.lib.get_project(self.session, 'test') issue = pagure.lib.search_issues(self.session, repo, issueid=1) @@ -1646,14 +1646,14 @@ class PagureFlaskIssuestests(tests.Modeltests): with tests.user_set(pagure.APP, user): output = self.app.get('/test/issue/1/comment/1/edit') self.assertIn( - 'test - Pagure', output.data) - self.assertTrue('
    ' in output.data) - self.assertTrue('
    ' in output.data) + 'test - Pagure', output.data.decode('utf-8')) + self.assertTrue('
    ' in output.data.decode('utf-8')) + self.assertTrue('
    ' in output.data.decode('utf-8')) self.assertTrue( '', - output.data) + output.data.decode('utf-8')) - csrf_token = output.data.split( + csrf_token = output.data.decode('utf-8').split( 'name="csrf_token" type="hidden" value="')[1].split('">')[0] # View what's supposed to be an image output = self.app.get('/test/edit/master/f/test.jpg') self.assertEqual(output.status_code, 400) - self.assertIn('

    Cannot edit binary files

    ', output.data) + self.assertIn('

    Cannot edit binary files

    ', output.data.decode('utf-8')) # Check file before the commit: output = self.app.get('/test/raw/master/f/sources') self.assertEqual(output.status_code, 200) - self.assertEqual(output.data, 'foo\n bar') + self.assertEqual(output.data.decode('utf-8'), 'foo\n bar') # No CSRF Token data = { @@ -1841,25 +1846,25 @@ index 0000000..fb7093d output = self.app.post('/test/edit/master/f/sources', data=data) self.assertEqual(output.status_code, 200) self.assertIn( - 'Edit - test - Pagure', output.data) + 'Edit - test - Pagure', output.data.decode('utf-8')) # Check that nothing changed output = self.app.get('/test/raw/master/f/sources') self.assertEqual(output.status_code, 200) - self.assertEqual(output.data, 'foo\n bar') + self.assertEqual(output.data.decode('utf-8'), 'foo\n bar') # Missing email data['csrf_token'] = csrf_token output = self.app.post('/test/edit/master/f/sources', data=data) self.assertEqual(output.status_code, 200) self.assertIn( - 'Edit - test - Pagure', output.data) + 'Edit - test - Pagure', output.data.decode('utf-8')) # Invalid email data['email'] = 'pingou@fp.o' output = self.app.post('/test/edit/master/f/sources', data=data) self.assertIn( - 'Edit - test - Pagure', output.data) + 'Edit - test - Pagure', output.data.decode('utf-8')) # Works data['email'] = 'bar@pingou.com' @@ -1869,15 +1874,15 @@ index 0000000..fb7093d follow_redirects=True) self.assertEqual(output.status_code, 200) self.assertIn( - 'Logs - test - Pagure', output.data) + 'Logs - test - Pagure', output.data.decode('utf-8')) self.assertIn( '\n Changes committed', - output.data) + output.data.decode('utf-8')) # Check file after the commit: output = self.app.get('/test/raw/master/f/sources') self.assertEqual(output.status_code, 200) - self.assertEqual(output.data, 'foo\n bar\n baz') + self.assertEqual(output.data.decode('utf-8'), 'foo\n bar\n baz') # Add a fork of a fork item = pagure.lib.model.Project( @@ -1905,10 +1910,10 @@ index 0000000..fb7093d '  master' '
  • ' '  sources' - '
  • ', output.data) + '', output.data.decode('utf-8')) self.assertIn( '