changeset 8109:e527cc2ce8dc

cleanup: get rid of most "import *" Apply script generated with the following hack: ( hg loc '*.py'|xargs pyflakes-2 | sed -rn "s/([^:]*):.*'(.*)' may be undefined, or defined from star imports.*/sed -ri 's,\\\\<\2\\\\>([^=]|$),XXXX.\2\\\\1,g' \1/gp" | sort -u hg loc '*.py'|xargs pyflakes-2 | sed -rn "s/([^:]*):.* undefined name '(.*)'$/sed -ri 's,\\\\<\2\\\\>([^=]|$),XXXX.\2\\\\1,g' \1/gp" | sort -u hg loc '*.py'|xargs pyflakes-2 | sed -rn "s/([^:]*):.*'(from .*)\.([^.]*) import \*' used.*/sed -ri 's,\\\\<XXXX\\\\.,\3.,g' \1/gp" | sort -u hg loc '*.py'|xargs pyflakes-2 | sed -rn "s/([^:]*):.*'(from .*)\.([^.]*) import \*' used.*/sed -ri 's,\2\\\\.\3 .*,\2 import \3,g' \1/gp" | sort -u ) | grep -v kallithea/bin/kallithea_cli_ishell.py > fix2.sh
author Mads Kiilerich <mads@kiilerich.com>
date Thu, 02 Jan 2020 00:44:56 +0100
parents 8c99d5d8eb0e
children f713a37564c0
files kallithea/bin/kallithea_cli_ishell.py kallithea/tests/api/api_base.py kallithea/tests/functional/test_admin.py kallithea/tests/functional/test_admin_auth_settings.py kallithea/tests/functional/test_admin_defaults.py kallithea/tests/functional/test_admin_gists.py kallithea/tests/functional/test_admin_permissions.py kallithea/tests/functional/test_admin_repos.py kallithea/tests/functional/test_admin_settings.py kallithea/tests/functional/test_admin_user_groups.py kallithea/tests/functional/test_admin_users.py kallithea/tests/functional/test_changelog.py kallithea/tests/functional/test_changeset.py kallithea/tests/functional/test_changeset_pullrequests_comments.py kallithea/tests/functional/test_compare.py kallithea/tests/functional/test_compare_local.py kallithea/tests/functional/test_feed.py kallithea/tests/functional/test_files.py kallithea/tests/functional/test_followers.py kallithea/tests/functional/test_forks.py kallithea/tests/functional/test_home.py kallithea/tests/functional/test_journal.py kallithea/tests/functional/test_login.py kallithea/tests/functional/test_my_account.py kallithea/tests/functional/test_pullrequests.py kallithea/tests/functional/test_repo_groups.py kallithea/tests/functional/test_search.py kallithea/tests/functional/test_search_indexing.py kallithea/tests/functional/test_summary.py kallithea/tests/models/test_changeset_status.py kallithea/tests/models/test_comments.py kallithea/tests/models/test_diff_parsers.py kallithea/tests/models/test_notifications.py kallithea/tests/models/test_permissions.py kallithea/tests/models/test_repo_groups.py kallithea/tests/models/test_repos.py kallithea/tests/models/test_user_groups.py kallithea/tests/models/test_users.py kallithea/tests/other/test_libs.py kallithea/tests/other/test_mail.py kallithea/tests/other/test_validators.py kallithea/tests/other/test_vcs_operations.py kallithea/tests/performance/test_vcs.py
diffstat 43 files changed, 1204 insertions(+), 1204 deletions(-) [+]
line wrap: on
line diff
--- a/kallithea/bin/kallithea_cli_ishell.py	Thu Jan 02 00:57:38 2020 +0100
+++ b/kallithea/bin/kallithea_cli_ishell.py	Thu Jan 02 00:44:56 2020 +0100
@@ -25,7 +25,7 @@
 import sys
 
 import kallithea.bin.kallithea_cli_base as cli_base
-from kallithea.model.db import *
+from kallithea.model.db import *  # these names will be directly available in the IPython shell
 
 
 @cli_base.register_command(config_file_initialize_app=True)
--- a/kallithea/tests/api/api_base.py	Thu Jan 02 00:57:38 2020 +0100
+++ b/kallithea/tests/api/api_base.py	Thu Jan 02 00:44:56 2020 +0100
@@ -34,7 +34,7 @@
 from kallithea.model.scm import ScmModel
 from kallithea.model.user import UserModel
 from kallithea.model.user_group import UserGroupModel
-from kallithea.tests.base import *
+from kallithea.tests import base
 from kallithea.tests.fixture import Fixture
 
 
@@ -75,15 +75,15 @@
 
 ## helpers
 def make_user_group(name=TEST_USER_GROUP):
-    gr = fixture.create_user_group(name, cur_user=TEST_USER_ADMIN_LOGIN)
+    gr = fixture.create_user_group(name, cur_user=base.TEST_USER_ADMIN_LOGIN)
     UserGroupModel().add_user_to_group(user_group=gr,
-                                       user=TEST_USER_ADMIN_LOGIN)
+                                       user=base.TEST_USER_ADMIN_LOGIN)
     Session().commit()
     return gr
 
 
 def make_repo_group(name=TEST_REPO_GROUP):
-    gr = fixture.create_repo_group(name, cur_user=TEST_USER_ADMIN_LOGIN)
+    gr = fixture.create_repo_group(name, cur_user=base.TEST_USER_ADMIN_LOGIN)
     Session().commit()
     return gr
 
@@ -94,7 +94,7 @@
 
     @classmethod
     def setup_class(cls):
-        cls.usr = User.get_by_username(TEST_USER_ADMIN_LOGIN)
+        cls.usr = User.get_by_username(base.TEST_USER_ADMIN_LOGIN)
         cls.apikey = cls.usr.api_key
         cls.test_user = UserModel().create_or_update(
             username='test-api',
@@ -230,10 +230,10 @@
 
     def test_api_get_user(self):
         id_, params = _build_data(self.apikey, 'get_user',
-                                  userid=TEST_USER_ADMIN_LOGIN)
+                                  userid=base.TEST_USER_ADMIN_LOGIN)
         response = api_call(self, params)
 
-        usr = User.get_by_username(TEST_USER_ADMIN_LOGIN)
+        usr = User.get_by_username(base.TEST_USER_ADMIN_LOGIN)
         ret = usr.get_api_data()
         ret['permissions'] = AuthUser(dbuser=usr).permissions
 
@@ -252,7 +252,7 @@
         id_, params = _build_data(self.apikey, 'get_user')
         response = api_call(self, params)
 
-        usr = User.get_by_username(TEST_USER_ADMIN_LOGIN)
+        usr = User.get_by_username(base.TEST_USER_ADMIN_LOGIN)
         ret = usr.get_api_data()
         ret['permissions'] = AuthUser(dbuser=usr).permissions
 
@@ -394,22 +394,22 @@
 
     def test_api_create_existing_user(self):
         id_, params = _build_data(self.apikey, 'create_user',
-                                  username=TEST_USER_ADMIN_LOGIN,
+                                  username=base.TEST_USER_ADMIN_LOGIN,
                                   email='test@example.com',
                                   password='trololo')
         response = api_call(self, params)
 
-        expected = "user `%s` already exist" % TEST_USER_ADMIN_LOGIN
+        expected = "user `%s` already exist" % base.TEST_USER_ADMIN_LOGIN
         self._compare_error(id_, expected, given=response.body)
 
     def test_api_create_user_with_existing_email(self):
         id_, params = _build_data(self.apikey, 'create_user',
-                                  username=TEST_USER_ADMIN_LOGIN + 'new',
-                                  email=TEST_USER_REGULAR_EMAIL,
+                                  username=base.TEST_USER_ADMIN_LOGIN + 'new',
+                                  email=base.TEST_USER_REGULAR_EMAIL,
                                   password='trololo')
         response = api_call(self, params)
 
-        expected = "email `%s` already exist" % TEST_USER_REGULAR_EMAIL
+        expected = "email `%s` already exist" % base.TEST_USER_REGULAR_EMAIL
         self._compare_error(id_, expected, given=response.body)
 
     def test_api_create_user(self):
@@ -525,7 +525,7 @@
         expected = ret
         self._compare_error(id_, expected, given=response.body)
 
-    @parametrize('name,expected', [
+    @base.parametrize('name,expected', [
         ('firstname', 'new_username'),
         ('lastname', 'new_username'),
         ('email', 'new_username'),
@@ -558,22 +558,22 @@
         self._compare_ok(id_, expected, given=response.body)
 
     def test_api_update_user_no_changed_params(self):
-        usr = User.get_by_username(TEST_USER_ADMIN_LOGIN)
+        usr = User.get_by_username(base.TEST_USER_ADMIN_LOGIN)
         ret = jsonify(usr.get_api_data())
         id_, params = _build_data(self.apikey, 'update_user',
-                                  userid=TEST_USER_ADMIN_LOGIN)
+                                  userid=base.TEST_USER_ADMIN_LOGIN)
 
         response = api_call(self, params)
         ret = {
             'msg': 'updated user ID:%s %s' % (
-                usr.user_id, TEST_USER_ADMIN_LOGIN),
+                usr.user_id, base.TEST_USER_ADMIN_LOGIN),
             'user': ret
         }
         expected = ret
         self._compare_ok(id_, expected, given=response.body)
 
     def test_api_update_user_by_user_id(self):
-        usr = User.get_by_username(TEST_USER_ADMIN_LOGIN)
+        usr = User.get_by_username(base.TEST_USER_ADMIN_LOGIN)
         ret = jsonify(usr.get_api_data())
         id_, params = _build_data(self.apikey, 'update_user',
                                   userid=usr.user_id)
@@ -581,7 +581,7 @@
         response = api_call(self, params)
         ret = {
             'msg': 'updated user ID:%s %s' % (
-                usr.user_id, TEST_USER_ADMIN_LOGIN),
+                usr.user_id, base.TEST_USER_ADMIN_LOGIN),
             'user': ret
         }
         expected = ret
@@ -598,7 +598,7 @@
 
     @mock.patch.object(UserModel, 'update_user', crash)
     def test_api_update_user_when_exception_happens(self):
-        usr = User.get_by_username(TEST_USER_ADMIN_LOGIN)
+        usr = User.get_by_username(base.TEST_USER_ADMIN_LOGIN)
         ret = jsonify(usr.get_api_data())
         id_, params = _build_data(self.apikey, 'update_user',
                                   userid=usr.user_id)
@@ -658,7 +658,7 @@
         assert u"v0.2.0" in response.json[u'result'][u'tags']
         assert u'pull_requests' in response.json[u'result']
 
-    @parametrize('grant_perm', [
+    @base.parametrize('grant_perm', [
         ('repository.admin'),
         ('repository.write'),
         ('repository.read'),
@@ -755,7 +755,7 @@
 
         self._compare_ok(id_, expected, given=response.body)
 
-    @parametrize('name,ret_type', [
+    @base.parametrize('name,ret_type', [
         ('all', 'all'),
         ('dirs', 'dirs'),
         ('files', 'files'),
@@ -810,7 +810,7 @@
                     % (','.join(sorted(['files', 'dirs', 'all']))))
         self._compare_error(id_, expected, given=response.body)
 
-    @parametrize('name,ret_type,grant_perm', [
+    @base.parametrize('name,ret_type,grant_perm', [
         ('all', 'all', 'repository.write'),
         ('dirs', 'dirs', 'repository.admin'),
         ('files', 'files', 'repository.read'),
@@ -841,7 +841,7 @@
         repo_name = u'api-repo'
         id_, params = _build_data(self.apikey, 'create_repo',
                                   repo_name=repo_name,
-                                  owner=TEST_USER_ADMIN_LOGIN,
+                                  owner=base.TEST_USER_ADMIN_LOGIN,
                                   repo_type=self.REPO_TYPE,
         )
         response = api_call(self, params)
@@ -857,7 +857,7 @@
         self._compare_ok(id_, expected, given=response.body)
         fixture.destroy_repo(repo_name)
 
-    @parametrize('repo_name', [
+    @base.parametrize('repo_name', [
         u'',
         u'.',
         u'..',
@@ -868,7 +868,7 @@
     def test_api_create_repo_bad_names(self, repo_name):
         id_, params = _build_data(self.apikey, 'create_repo',
                                   repo_name=repo_name,
-                                  owner=TEST_USER_ADMIN_LOGIN,
+                                  owner=base.TEST_USER_ADMIN_LOGIN,
                                   repo_type=self.REPO_TYPE,
         )
         response = api_call(self, params)
@@ -883,11 +883,11 @@
     def test_api_create_repo_clone_uri_local(self):
         # cloning from local repos was a mis-feature - it would bypass access control
         # TODO: introduce other test coverage of actual remote cloning
-        clone_uri = os.path.join(TESTS_TMP_PATH, self.REPO)
+        clone_uri = os.path.join(base.TESTS_TMP_PATH, self.REPO)
         repo_name = u'api-repo'
         id_, params = _build_data(self.apikey, 'create_repo',
                                   repo_name=repo_name,
-                                  owner=TEST_USER_ADMIN_LOGIN,
+                                  owner=base.TEST_USER_ADMIN_LOGIN,
                                   repo_type=self.REPO_TYPE,
                                   clone_uri=clone_uri,
         )
@@ -903,7 +903,7 @@
         # repo creation can no longer also create repo group
         id_, params = _build_data(self.apikey, 'create_repo',
                                   repo_name=repo_name,
-                                  owner=TEST_USER_ADMIN_LOGIN,
+                                  owner=base.TEST_USER_ADMIN_LOGIN,
                                   repo_type=self.REPO_TYPE,)
         response = api_call(self, params)
         expected = u'repo group `%s` not found' % repo_group_name
@@ -916,7 +916,7 @@
 
         id_, params = _build_data(self.apikey, 'create_repo',
                                   repo_name=repo_name,
-                                  owner=TEST_USER_ADMIN_LOGIN,
+                                  owner=base.TEST_USER_ADMIN_LOGIN,
                                   repo_type=self.REPO_TYPE,)
         response = api_call(self, params)
         expected = {
@@ -1036,7 +1036,7 @@
         repo_name = self.REPO
         id_, params = _build_data(self.apikey, 'create_repo',
                                   repo_name=repo_name,
-                                  owner=TEST_USER_ADMIN_LOGIN,
+                                  owner=base.TEST_USER_ADMIN_LOGIN,
                                   repo_type=self.REPO_TYPE,)
         response = api_call(self, params)
         expected = "repo `%s` already exist" % repo_name
@@ -1048,7 +1048,7 @@
         repo_name = '%s/%s' % (group_name, 'could-be-outside')
         id_, params = _build_data(self.apikey, 'create_repo',
                                   repo_name=repo_name,
-                                  owner=TEST_USER_ADMIN_LOGIN,
+                                  owner=base.TEST_USER_ADMIN_LOGIN,
                                   repo_type=self.REPO_TYPE,)
         response = api_call(self, params)
         expected = u'repo group `%s` not found' % group_name
@@ -1060,14 +1060,14 @@
         repo_name = u'api-repo'
         id_, params = _build_data(self.apikey, 'create_repo',
                                   repo_name=repo_name,
-                                  owner=TEST_USER_ADMIN_LOGIN,
+                                  owner=base.TEST_USER_ADMIN_LOGIN,
                                   repo_type=self.REPO_TYPE,)
         response = api_call(self, params)
         expected = 'failed to create repository `%s`' % repo_name
         self._compare_error(id_, expected, given=response.body)
 
-    @parametrize('changing_attr,updates', [
-        ('owner', {'owner': TEST_USER_REGULAR_LOGIN}),
+    @base.parametrize('changing_attr,updates', [
+        ('owner', {'owner': base.TEST_USER_REGULAR_LOGIN}),
         ('description', {'description': u'new description'}),
         ('clone_uri', {'clone_uri': 'http://example.com/repo'}), # will fail - pulling from non-existing repo should fail
         ('clone_uri', {'clone_uri': '/repo'}), # will fail - pulling from local repo was a mis-feature - it would bypass access control
@@ -1106,8 +1106,8 @@
             if changing_attr == 'repo_group':
                 fixture.destroy_repo_group(updates['group'])
 
-    @parametrize('changing_attr,updates', [
-        ('owner', {'owner': TEST_USER_REGULAR_LOGIN}),
+    @base.parametrize('changing_attr,updates', [
+        ('owner', {'owner': base.TEST_USER_REGULAR_LOGIN}),
         ('description', {'description': u'new description'}),
         ('clone_uri', {'clone_uri': 'http://example.com/repo'}), # will fail - pulling from non-existing repo should fail
         ('clone_uri', {'clone_uri': '/repo'}), # will fail - pulling from local repo was a mis-feature - it would bypass access control
@@ -1180,7 +1180,7 @@
         repo_name = u'api_update_me'
         fixture.create_repo(repo_name, repo_type=self.REPO_TYPE)
         id_, params = _build_data(self.apikey, 'update_repo',
-                                  repoid=repo_name, owner=TEST_USER_ADMIN_LOGIN,)
+                                  repoid=repo_name, owner=base.TEST_USER_ADMIN_LOGIN,)
         response = api_call(self, params)
         try:
             expected = 'failed to update repo `%s`' % repo_name
@@ -1237,7 +1237,7 @@
         RepoModel().grant_user_permission(repo=repo_name,
                                           user=self.TEST_USER_LOGIN,
                                           perm='repository.admin')
-        updates = {'owner': TEST_USER_ADMIN_LOGIN}
+        updates = {'owner': base.TEST_USER_ADMIN_LOGIN}
         id_, params = _build_data(self.apikey_regular, 'update_repo',
                                   repoid=repo_name, **updates)
         response = api_call(self, params)
@@ -1314,7 +1314,7 @@
         id_, params = _build_data(self.apikey, 'fork_repo',
                                   repoid=self.REPO,
                                   fork_name=fork_name,
-                                  owner=TEST_USER_ADMIN_LOGIN,
+                                  owner=base.TEST_USER_ADMIN_LOGIN,
         )
         response = api_call(self, params)
 
@@ -1328,7 +1328,7 @@
         self._compare_ok(id_, expected, given=response.body)
         fixture.destroy_repo(fork_name)
 
-    @parametrize('fork_name', [
+    @base.parametrize('fork_name', [
         u'api-repo-fork',
         u'%s/api-repo-fork' % TEST_REPO_GROUP,
     ])
@@ -1354,7 +1354,7 @@
         id_, params = _build_data(self.apikey_regular, 'fork_repo',
                                   repoid=self.REPO,
                                   fork_name=fork_name,
-                                  owner=TEST_USER_ADMIN_LOGIN,
+                                  owner=base.TEST_USER_ADMIN_LOGIN,
         )
         response = api_call(self, params)
         expected = 'Only Kallithea admin can specify `owner` param'
@@ -1380,7 +1380,7 @@
                                               perm='repository.read')
             fixture.destroy_repo(fork_name)
 
-    @parametrize('name,perm', [
+    @base.parametrize('name,perm', [
         ('read', 'repository.read'),
         ('write', 'repository.write'),
         ('admin', 'repository.admin'),
@@ -1425,7 +1425,7 @@
             id_, params = _build_data(self.apikey, 'fork_repo',
                                       repoid=self.REPO,
                                       fork_name=fork_name,
-                                      owner=TEST_USER_ADMIN_LOGIN,
+                                      owner=base.TEST_USER_ADMIN_LOGIN,
             )
             response = api_call(self, params)
 
@@ -1440,7 +1440,7 @@
         id_, params = _build_data(self.apikey, 'fork_repo',
                                   repoid=self.REPO,
                                   fork_name=fork_name,
-                                  owner=TEST_USER_ADMIN_LOGIN,
+                                  owner=base.TEST_USER_ADMIN_LOGIN,
         )
         response = api_call(self, params)
 
@@ -1453,7 +1453,7 @@
         id_, params = _build_data(self.apikey, 'fork_repo',
                                   repoid=self.REPO,
                                   fork_name=fork_name,
-                                  owner=TEST_USER_ADMIN_LOGIN,
+                                  owner=base.TEST_USER_ADMIN_LOGIN,
         )
         response = api_call(self, params)
 
@@ -1529,10 +1529,10 @@
         expected = 'failed to create group `%s`' % group_name
         self._compare_error(id_, expected, given=response.body)
 
-    @parametrize('changing_attr,updates', [
+    @base.parametrize('changing_attr,updates', [
         ('group_name', {'group_name': u'new_group_name'}),
         ('group_name', {'group_name': u'test_group_for_update'}),
-        ('owner', {'owner': TEST_USER_REGULAR_LOGIN}),
+        ('owner', {'owner': base.TEST_USER_REGULAR_LOGIN}),
         ('active', {'active': False}),
         ('active', {'active': True}),
     ])
@@ -1574,11 +1574,11 @@
         try:
             id_, params = _build_data(self.apikey, 'add_user_to_user_group',
                                       usergroupid=gr_name,
-                                      userid=TEST_USER_ADMIN_LOGIN)
+                                      userid=base.TEST_USER_ADMIN_LOGIN)
             response = api_call(self, params)
             expected = {
             'msg': 'added member `%s` to user group `%s`' % (
-                    TEST_USER_ADMIN_LOGIN, gr_name),
+                    base.TEST_USER_ADMIN_LOGIN, gr_name),
             'success': True
             }
             self._compare_ok(id_, expected, given=response.body)
@@ -1588,7 +1588,7 @@
     def test_api_add_user_to_user_group_that_doesnt_exist(self):
         id_, params = _build_data(self.apikey, 'add_user_to_user_group',
                                   usergroupid='false-group',
-                                  userid=TEST_USER_ADMIN_LOGIN)
+                                  userid=base.TEST_USER_ADMIN_LOGIN)
         response = api_call(self, params)
 
         expected = 'user group `%s` does not exist' % 'false-group'
@@ -1601,7 +1601,7 @@
         try:
             id_, params = _build_data(self.apikey, 'add_user_to_user_group',
                                       usergroupid=gr_name,
-                                      userid=TEST_USER_ADMIN_LOGIN)
+                                      userid=base.TEST_USER_ADMIN_LOGIN)
             response = api_call(self, params)
             expected = 'failed to add member to user group `%s`' % gr_name
             self._compare_error(id_, expected, given=response.body)
@@ -1611,16 +1611,16 @@
     def test_api_remove_user_from_user_group(self):
         gr_name = u'test_group_3'
         gr = fixture.create_user_group(gr_name)
-        UserGroupModel().add_user_to_group(gr, user=TEST_USER_ADMIN_LOGIN)
+        UserGroupModel().add_user_to_group(gr, user=base.TEST_USER_ADMIN_LOGIN)
         Session().commit()
         try:
             id_, params = _build_data(self.apikey, 'remove_user_from_user_group',
                                       usergroupid=gr_name,
-                                      userid=TEST_USER_ADMIN_LOGIN)
+                                      userid=base.TEST_USER_ADMIN_LOGIN)
             response = api_call(self, params)
             expected = {
                 'msg': 'removed member `%s` from user group `%s`' % (
-                    TEST_USER_ADMIN_LOGIN, gr_name
+                    base.TEST_USER_ADMIN_LOGIN, gr_name
                 ),
                 'success': True}
             self._compare_ok(id_, expected, given=response.body)
@@ -1631,12 +1631,12 @@
     def test_api_remove_user_from_user_group_exception_occurred(self):
         gr_name = u'test_group_3'
         gr = fixture.create_user_group(gr_name)
-        UserGroupModel().add_user_to_group(gr, user=TEST_USER_ADMIN_LOGIN)
+        UserGroupModel().add_user_to_group(gr, user=base.TEST_USER_ADMIN_LOGIN)
         Session().commit()
         try:
             id_, params = _build_data(self.apikey, 'remove_user_from_user_group',
                                       usergroupid=gr_name,
-                                      userid=TEST_USER_ADMIN_LOGIN)
+                                      userid=base.TEST_USER_ADMIN_LOGIN)
             response = api_call(self, params)
             expected = 'failed to remove member from user group `%s`' % gr_name
             self._compare_error(id_, expected, given=response.body)
@@ -1693,7 +1693,7 @@
         finally:
             fixture.destroy_user_group(gr_name)
 
-    @parametrize('name,perm', [
+    @base.parametrize('name,perm', [
         ('none', 'repository.none'),
         ('read', 'repository.read'),
         ('write', 'repository.write'),
@@ -1703,13 +1703,13 @@
         id_, params = _build_data(self.apikey,
                                   'grant_user_permission',
                                   repoid=self.REPO,
-                                  userid=TEST_USER_ADMIN_LOGIN,
+                                  userid=base.TEST_USER_ADMIN_LOGIN,
                                   perm=perm)
         response = api_call(self, params)
 
         ret = {
             'msg': 'Granted perm: `%s` for user: `%s` in repo: `%s`' % (
-                perm, TEST_USER_ADMIN_LOGIN, self.REPO
+                perm, base.TEST_USER_ADMIN_LOGIN, self.REPO
             ),
             'success': True
         }
@@ -1721,7 +1721,7 @@
         id_, params = _build_data(self.apikey,
                                   'grant_user_permission',
                                   repoid=self.REPO,
-                                  userid=TEST_USER_ADMIN_LOGIN,
+                                  userid=base.TEST_USER_ADMIN_LOGIN,
                                   perm=perm)
         response = api_call(self, params)
 
@@ -1734,12 +1734,12 @@
         id_, params = _build_data(self.apikey,
                                   'grant_user_permission',
                                   repoid=self.REPO,
-                                  userid=TEST_USER_ADMIN_LOGIN,
+                                  userid=base.TEST_USER_ADMIN_LOGIN,
                                   perm=perm)
         response = api_call(self, params)
 
         expected = 'failed to edit permission for user: `%s` in repo: `%s`' % (
-            TEST_USER_ADMIN_LOGIN, self.REPO
+            base.TEST_USER_ADMIN_LOGIN, self.REPO
         )
         self._compare_error(id_, expected, given=response.body)
 
@@ -1747,12 +1747,12 @@
         id_, params = _build_data(self.apikey,
                                   'revoke_user_permission',
                                   repoid=self.REPO,
-                                  userid=TEST_USER_ADMIN_LOGIN, )
+                                  userid=base.TEST_USER_ADMIN_LOGIN, )
         response = api_call(self, params)
 
         expected = {
             'msg': 'Revoked perm for user: `%s` in repo: `%s`' % (
-                TEST_USER_ADMIN_LOGIN, self.REPO
+                base.TEST_USER_ADMIN_LOGIN, self.REPO
             ),
             'success': True
         }
@@ -1763,15 +1763,15 @@
         id_, params = _build_data(self.apikey,
                                   'revoke_user_permission',
                                   repoid=self.REPO,
-                                  userid=TEST_USER_ADMIN_LOGIN, )
+                                  userid=base.TEST_USER_ADMIN_LOGIN, )
         response = api_call(self, params)
 
         expected = 'failed to edit permission for user: `%s` in repo: `%s`' % (
-            TEST_USER_ADMIN_LOGIN, self.REPO
+            base.TEST_USER_ADMIN_LOGIN, self.REPO
         )
         self._compare_error(id_, expected, given=response.body)
 
-    @parametrize('name,perm', [
+    @base.parametrize('name,perm', [
         ('none', 'repository.none'),
         ('read', 'repository.read'),
         ('write', 'repository.write'),
@@ -1853,7 +1853,7 @@
         )
         self._compare_error(id_, expected, given=response.body)
 
-    @parametrize('name,perm,apply_to_children', [
+    @base.parametrize('name,perm,apply_to_children', [
         ('none', 'group.none', 'none'),
         ('read', 'group.read', 'none'),
         ('write', 'group.write', 'none'),
@@ -1878,20 +1878,20 @@
         id_, params = _build_data(self.apikey,
                                   'grant_user_permission_to_repo_group',
                                   repogroupid=TEST_REPO_GROUP,
-                                  userid=TEST_USER_ADMIN_LOGIN,
+                                  userid=base.TEST_USER_ADMIN_LOGIN,
                                   perm=perm, apply_to_children=apply_to_children)
         response = api_call(self, params)
 
         ret = {
             'msg': 'Granted perm: `%s` (recursive:%s) for user: `%s` in repo group: `%s`' % (
-                perm, apply_to_children, TEST_USER_ADMIN_LOGIN, TEST_REPO_GROUP
+                perm, apply_to_children, base.TEST_USER_ADMIN_LOGIN, TEST_REPO_GROUP
             ),
             'success': True
         }
         expected = ret
         self._compare_ok(id_, expected, given=response.body)
 
-    @parametrize('name,perm,apply_to_children,grant_admin,access_ok', [
+    @base.parametrize('name,perm,apply_to_children,grant_admin,access_ok', [
         ('none_fails', 'group.none', 'none', False, False),
         ('read_fails', 'group.read', 'none', False, False),
         ('write_fails', 'group.write', 'none', False, False),
@@ -1914,13 +1914,13 @@
         id_, params = _build_data(self.apikey_regular,
                                   'grant_user_permission_to_repo_group',
                                   repogroupid=TEST_REPO_GROUP,
-                                  userid=TEST_USER_ADMIN_LOGIN,
+                                  userid=base.TEST_USER_ADMIN_LOGIN,
                                   perm=perm, apply_to_children=apply_to_children)
         response = api_call(self, params)
         if access_ok:
             ret = {
                 'msg': 'Granted perm: `%s` (recursive:%s) for user: `%s` in repo group: `%s`' % (
-                    perm, apply_to_children, TEST_USER_ADMIN_LOGIN, TEST_REPO_GROUP
+                    perm, apply_to_children, base.TEST_USER_ADMIN_LOGIN, TEST_REPO_GROUP
                 ),
                 'success': True
             }
@@ -1935,7 +1935,7 @@
         id_, params = _build_data(self.apikey,
                                   'grant_user_permission_to_repo_group',
                                   repogroupid=TEST_REPO_GROUP,
-                                  userid=TEST_USER_ADMIN_LOGIN,
+                                  userid=base.TEST_USER_ADMIN_LOGIN,
                                   perm=perm)
         response = api_call(self, params)
 
@@ -1948,16 +1948,16 @@
         id_, params = _build_data(self.apikey,
                                   'grant_user_permission_to_repo_group',
                                   repogroupid=TEST_REPO_GROUP,
-                                  userid=TEST_USER_ADMIN_LOGIN,
+                                  userid=base.TEST_USER_ADMIN_LOGIN,
                                   perm=perm)
         response = api_call(self, params)
 
         expected = 'failed to edit permission for user: `%s` in repo group: `%s`' % (
-            TEST_USER_ADMIN_LOGIN, TEST_REPO_GROUP
+            base.TEST_USER_ADMIN_LOGIN, TEST_REPO_GROUP
         )
         self._compare_error(id_, expected, given=response.body)
 
-    @parametrize('name,apply_to_children', [
+    @base.parametrize('name,apply_to_children', [
         ('none', 'none'),
         ('all', 'all'),
         ('repos', 'repos'),
@@ -1965,26 +1965,26 @@
     ])
     def test_api_revoke_user_permission_from_repo_group(self, name, apply_to_children):
         RepoGroupModel().grant_user_permission(repo_group=TEST_REPO_GROUP,
-                                               user=TEST_USER_ADMIN_LOGIN,
+                                               user=base.TEST_USER_ADMIN_LOGIN,
                                                perm='group.read',)
         Session().commit()
 
         id_, params = _build_data(self.apikey,
                                   'revoke_user_permission_from_repo_group',
                                   repogroupid=TEST_REPO_GROUP,
-                                  userid=TEST_USER_ADMIN_LOGIN,
+                                  userid=base.TEST_USER_ADMIN_LOGIN,
                                   apply_to_children=apply_to_children,)
         response = api_call(self, params)
 
         expected = {
             'msg': 'Revoked perm (recursive:%s) for user: `%s` in repo group: `%s`' % (
-                apply_to_children, TEST_USER_ADMIN_LOGIN, TEST_REPO_GROUP
+                apply_to_children, base.TEST_USER_ADMIN_LOGIN, TEST_REPO_GROUP
             ),
             'success': True
         }
         self._compare_ok(id_, expected, given=response.body)
 
-    @parametrize('name,apply_to_children,grant_admin,access_ok', [
+    @base.parametrize('name,apply_to_children,grant_admin,access_ok', [
         ('none', 'none', False, False),
         ('all', 'all', False, False),
         ('repos', 'repos', False, False),
@@ -1999,7 +1999,7 @@
     def test_api_revoke_user_permission_from_repo_group_by_regular_user(
             self, name, apply_to_children, grant_admin, access_ok):
         RepoGroupModel().grant_user_permission(repo_group=TEST_REPO_GROUP,
-                                               user=TEST_USER_ADMIN_LOGIN,
+                                               user=base.TEST_USER_ADMIN_LOGIN,
                                                perm='group.read',)
         Session().commit()
 
@@ -2012,13 +2012,13 @@
         id_, params = _build_data(self.apikey_regular,
                                   'revoke_user_permission_from_repo_group',
                                   repogroupid=TEST_REPO_GROUP,
-                                  userid=TEST_USER_ADMIN_LOGIN,
+                                  userid=base.TEST_USER_ADMIN_LOGIN,
                                   apply_to_children=apply_to_children,)
         response = api_call(self, params)
         if access_ok:
             expected = {
                 'msg': 'Revoked perm (recursive:%s) for user: `%s` in repo group: `%s`' % (
-                    apply_to_children, TEST_USER_ADMIN_LOGIN, TEST_REPO_GROUP
+                    apply_to_children, base.TEST_USER_ADMIN_LOGIN, TEST_REPO_GROUP
                 ),
                 'success': True
             }
@@ -2032,15 +2032,15 @@
         id_, params = _build_data(self.apikey,
                                   'revoke_user_permission_from_repo_group',
                                   repogroupid=TEST_REPO_GROUP,
-                                  userid=TEST_USER_ADMIN_LOGIN, )
+                                  userid=base.TEST_USER_ADMIN_LOGIN, )
         response = api_call(self, params)
 
         expected = 'failed to edit permission for user: `%s` in repo group: `%s`' % (
-            TEST_USER_ADMIN_LOGIN, TEST_REPO_GROUP
+            base.TEST_USER_ADMIN_LOGIN, TEST_REPO_GROUP
         )
         self._compare_error(id_, expected, given=response.body)
 
-    @parametrize('name,perm,apply_to_children', [
+    @base.parametrize('name,perm,apply_to_children', [
         ('none', 'group.none', 'none'),
         ('read', 'group.read', 'none'),
         ('write', 'group.write', 'none'),
@@ -2079,7 +2079,7 @@
         expected = ret
         self._compare_ok(id_, expected, given=response.body)
 
-    @parametrize('name,perm,apply_to_children,grant_admin,access_ok', [
+    @base.parametrize('name,perm,apply_to_children,grant_admin,access_ok', [
         ('none_fails', 'group.none', 'none', False, False),
         ('read_fails', 'group.read', 'none', False, False),
         ('write_fails', 'group.write', 'none', False, False),
@@ -2146,7 +2146,7 @@
         )
         self._compare_error(id_, expected, given=response.body)
 
-    @parametrize('name,apply_to_children', [
+    @base.parametrize('name,apply_to_children', [
         ('none', 'none'),
         ('all', 'all'),
         ('repos', 'repos'),
@@ -2172,7 +2172,7 @@
         }
         self._compare_ok(id_, expected, given=response.body)
 
-    @parametrize('name,apply_to_children,grant_admin,access_ok', [
+    @base.parametrize('name,apply_to_children,grant_admin,access_ok', [
         ('none', 'none', False, False),
         ('all', 'all', False, False),
         ('repos', 'repos', False, False),
@@ -2187,7 +2187,7 @@
     def test_api_revoke_user_group_permission_from_repo_group_by_regular_user(
             self, name, apply_to_children, grant_admin, access_ok):
         RepoGroupModel().grant_user_permission(repo_group=TEST_REPO_GROUP,
-                                               user=TEST_USER_ADMIN_LOGIN,
+                                               user=base.TEST_USER_ADMIN_LOGIN,
                                                perm='group.read',)
         Session().commit()
 
@@ -2206,7 +2206,7 @@
         if access_ok:
             expected = {
                 'msg': 'Revoked perm (recursive:%s) for user group: `%s` in repo group: `%s`' % (
-                    apply_to_children, TEST_USER_ADMIN_LOGIN, TEST_REPO_GROUP
+                    apply_to_children, base.TEST_USER_ADMIN_LOGIN, TEST_REPO_GROUP
                 ),
                 'success': True
             }
@@ -2310,7 +2310,7 @@
 
     def test_api_get_gists_regular_user_with_different_userid(self):
         id_, params = _build_data(self.apikey_regular, 'get_gists',
-                                  userid=TEST_USER_ADMIN_LOGIN)
+                                  userid=base.TEST_USER_ADMIN_LOGIN)
         response = api_call(self, params)
         expected = 'userid is not the same as your user'
         self._compare_error(id_, expected, given=response.body)
@@ -2501,10 +2501,10 @@
             "org_repo_url": "http://localhost:80/%s" % self.REPO,
             "org_ref_parts": ["branch", "stable", self.TEST_PR_SRC],
             "other_ref_parts": ["branch", "default", self.TEST_PR_DST],
-            "comments": [{"username": TEST_USER_ADMIN_LOGIN, "text": "",
+            "comments": [{"username": base.TEST_USER_ADMIN_LOGIN, "text": "",
                          "comment_id": pullrequest.comments[0].comment_id}],
-            "owner": TEST_USER_ADMIN_LOGIN,
-            "statuses": [{"status": "under_review", "reviewer": TEST_USER_ADMIN_LOGIN, "modified_at": "2000-01-01T00:00:00"} for i in range(0, len(self.TEST_PR_REVISIONS))],
+            "owner": base.TEST_USER_ADMIN_LOGIN,
+            "statuses": [{"status": "under_review", "reviewer": base.TEST_USER_ADMIN_LOGIN, "modified_at": "2000-01-01T00:00:00"} for i in range(0, len(self.TEST_PR_REVISIONS))],
             "title": "get test",
             "revisions": self.TEST_PR_REVISIONS,
         }
@@ -2534,7 +2534,7 @@
         random_id = random.randrange(1, 9999)
         params = json.dumps({
             "id": random_id,
-            "api_key": User.get_by_username(TEST_USER_REGULAR2_LOGIN).api_key,
+            "api_key": User.get_by_username(base.TEST_USER_REGULAR2_LOGIN).api_key,
             "method": "comment_pullrequest",
             "args": {"pull_request_id": pull_request_id, "status": ChangesetStatus.STATUS_APPROVED},
         })
@@ -2544,7 +2544,7 @@
         assert ChangesetStatus.STATUS_UNDER_REVIEW == ChangesetStatusModel().calculate_pull_request_result(pullrequest)[2]
         params = json.dumps({
             "id": random_id,
-            "api_key": User.get_by_username(TEST_USER_REGULAR_LOGIN).api_key,
+            "api_key": User.get_by_username(base.TEST_USER_REGULAR_LOGIN).api_key,
             "method": "comment_pullrequest",
             "args": {"pull_request_id": pull_request_id, "status": ChangesetStatus.STATUS_APPROVED},
         })
--- a/kallithea/tests/functional/test_admin.py	Thu Jan 02 00:57:38 2020 +0100
+++ b/kallithea/tests/functional/test_admin.py	Thu Jan 02 00:44:56 2020 +0100
@@ -6,13 +6,13 @@
 from kallithea.lib.utils2 import safe_unicode
 from kallithea.model.db import UserLog
 from kallithea.model.meta import Session
-from kallithea.tests.base import *
+from kallithea.tests import base
 
 
 FIXTURES = os.path.join(dirname(dirname(os.path.abspath(__file__))), 'fixtures')
 
 
-class TestAdminController(TestController):
+class TestAdminController(base.TestController):
 
     @classmethod
     def setup_class(cls):
@@ -52,105 +52,105 @@
 
     def test_index(self):
         self.log_user()
-        response = self.app.get(url(controller='admin/admin', action='index'))
+        response = self.app.get(base.url(controller='admin/admin', action='index'))
         response.mustcontain('Admin Journal')
 
     def test_filter_all_entries(self):
         self.log_user()
-        response = self.app.get(url(controller='admin/admin', action='index',))
+        response = self.app.get(base.url(controller='admin/admin', action='index',))
         response.mustcontain(' 2036 Entries')
 
     def test_filter_journal_filter_exact_match_on_repository(self):
         self.log_user()
-        response = self.app.get(url(controller='admin/admin', action='index',
+        response = self.app.get(base.url(controller='admin/admin', action='index',
                                     filter='repository:xxx'))
         response.mustcontain(' 3 Entries')
 
     def test_filter_journal_filter_exact_match_on_repository_CamelCase(self):
         self.log_user()
-        response = self.app.get(url(controller='admin/admin', action='index',
+        response = self.app.get(base.url(controller='admin/admin', action='index',
                                     filter='repository:XxX'))
         response.mustcontain(' 3 Entries')
 
     def test_filter_journal_filter_wildcard_on_repository(self):
         self.log_user()
-        response = self.app.get(url(controller='admin/admin', action='index',
+        response = self.app.get(base.url(controller='admin/admin', action='index',
                                     filter='repository:*test*'))
         response.mustcontain(' 862 Entries')
 
     def test_filter_journal_filter_prefix_on_repository(self):
         self.log_user()
-        response = self.app.get(url(controller='admin/admin', action='index',
+        response = self.app.get(base.url(controller='admin/admin', action='index',
                                     filter='repository:test*'))
         response.mustcontain(' 257 Entries')
 
     def test_filter_journal_filter_prefix_on_repository_CamelCase(self):
         self.log_user()
-        response = self.app.get(url(controller='admin/admin', action='index',
+        response = self.app.get(base.url(controller='admin/admin', action='index',
                                     filter='repository:Test*'))
         response.mustcontain(' 257 Entries')
 
     def test_filter_journal_filter_prefix_on_repository_and_user(self):
         self.log_user()
-        response = self.app.get(url(controller='admin/admin', action='index',
+        response = self.app.get(base.url(controller='admin/admin', action='index',
                                     filter='repository:test* AND username:demo'))
         response.mustcontain(' 130 Entries')
 
     def test_filter_journal_filter_prefix_on_repository_or_other_repo(self):
         self.log_user()
-        response = self.app.get(url(controller='admin/admin', action='index',
+        response = self.app.get(base.url(controller='admin/admin', action='index',
                                     filter='repository:test* OR repository:xxx'))
         response.mustcontain(' 260 Entries')  # 257 + 3
 
     def test_filter_journal_filter_exact_match_on_username(self):
         self.log_user()
-        response = self.app.get(url(controller='admin/admin', action='index',
+        response = self.app.get(base.url(controller='admin/admin', action='index',
                                     filter='username:demo'))
         response.mustcontain(' 1087 Entries')
 
     def test_filter_journal_filter_exact_match_on_username_camelCase(self):
         self.log_user()
-        response = self.app.get(url(controller='admin/admin', action='index',
+        response = self.app.get(base.url(controller='admin/admin', action='index',
                                     filter='username:DemO'))
         response.mustcontain(' 1087 Entries')
 
     def test_filter_journal_filter_wildcard_on_username(self):
         self.log_user()
-        response = self.app.get(url(controller='admin/admin', action='index',
+        response = self.app.get(base.url(controller='admin/admin', action='index',
                                     filter='username:*test*'))
         response.mustcontain(' 100 Entries')
 
     def test_filter_journal_filter_prefix_on_username(self):
         self.log_user()
-        response = self.app.get(url(controller='admin/admin', action='index',
+        response = self.app.get(base.url(controller='admin/admin', action='index',
                                     filter='username:demo*'))
         response.mustcontain(' 1101 Entries')
 
     def test_filter_journal_filter_prefix_on_user_or_other_user(self):
         self.log_user()
-        response = self.app.get(url(controller='admin/admin', action='index',
+        response = self.app.get(base.url(controller='admin/admin', action='index',
                                     filter='username:demo OR username:volcan'))
         response.mustcontain(' 1095 Entries')  # 1087 + 8
 
     def test_filter_journal_filter_wildcard_on_action(self):
         self.log_user()
-        response = self.app.get(url(controller='admin/admin', action='index',
+        response = self.app.get(base.url(controller='admin/admin', action='index',
                                     filter='action:*pull_request*'))
         response.mustcontain(' 187 Entries')
 
     def test_filter_journal_filter_on_date(self):
         self.log_user()
-        response = self.app.get(url(controller='admin/admin', action='index',
+        response = self.app.get(base.url(controller='admin/admin', action='index',
                                     filter='date:20121010'))
         response.mustcontain(' 47 Entries')
 
     def test_filter_journal_filter_on_date_2(self):
         self.log_user()
-        response = self.app.get(url(controller='admin/admin', action='index',
+        response = self.app.get(base.url(controller='admin/admin', action='index',
                                     filter='date:20121020'))
         response.mustcontain(' 17 Entries')
 
-    @parametrize('filter,hit', [
+    @base.parametrize('filter,hit', [
         #### "repository:" filtering
         # "/" is used for grouping
         ('repository:group/test', 4),
@@ -189,7 +189,7 @@
     def test_filter_journal_filter_tokenization(self, filter, hit):
         self.log_user()
 
-        response = self.app.get(url(controller='admin/admin', action='index',
+        response = self.app.get(base.url(controller='admin/admin', action='index',
                                     filter=filter))
         if hit != 1:
             response.mustcontain(' %s Entries' % hit)
--- a/kallithea/tests/functional/test_admin_auth_settings.py	Thu Jan 02 00:57:38 2020 +0100
+++ b/kallithea/tests/functional/test_admin_auth_settings.py	Thu Jan 02 00:44:56 2020 +0100
@@ -1,10 +1,10 @@
 from kallithea.model.db import Setting
-from kallithea.tests.base import *
+from kallithea.tests import base
 
 
-class TestAuthSettingsController(TestController):
+class TestAuthSettingsController(base.TestController):
     def _enable_plugins(self, plugins_list):
-        test_url = url(controller='admin/auth_settings',
+        test_url = base.url(controller='admin/auth_settings',
                        action='auth_settings')
         params={'auth_plugins': plugins_list, '_session_csrf_secret_token': self.session_csrf_secret_token()}
 
@@ -17,11 +17,11 @@
 
     def test_index(self):
         self.log_user()
-        response = self.app.get(url(controller='admin/auth_settings',
+        response = self.app.get(base.url(controller='admin/auth_settings',
                                     action='index'))
         response.mustcontain('Authentication Plugins')
 
-    @skipif(not ldap_lib_installed, reason='skipping due to missing ldap lib')
+    @base.skipif(not base.ldap_lib_installed, reason='skipping due to missing ldap lib')
     def test_ldap_save_settings(self):
         self.log_user()
 
@@ -41,7 +41,7 @@
                        'auth_ldap_attr_lastname': 'tester',
                        'auth_ldap_attr_email': 'test@example.com'})
 
-        test_url = url(controller='admin/auth_settings',
+        test_url = base.url(controller='admin/auth_settings',
                        action='auth_settings')
 
         response = self.app.post(url=test_url, params=params)
@@ -50,7 +50,7 @@
         new_settings = Setting.get_auth_settings()
         assert new_settings['auth_ldap_host'] == u'dc.example.com', 'fail db write compare'
 
-    @skipif(not ldap_lib_installed, reason='skipping due to missing ldap lib')
+    @base.skipif(not base.ldap_lib_installed, reason='skipping due to missing ldap lib')
     def test_ldap_error_form_wrong_port_number(self):
         self.log_user()
 
@@ -68,7 +68,7 @@
                        'auth_ldap_attr_firstname': '',
                        'auth_ldap_attr_lastname': '',
                        'auth_ldap_attr_email': ''})
-        test_url = url(controller='admin/auth_settings',
+        test_url = base.url(controller='admin/auth_settings',
                        action='auth_settings')
 
         response = self.app.post(url=test_url, params=params)
@@ -76,7 +76,7 @@
         response.mustcontain("""<span class="error-message">"""
                              """Please enter a number</span>""")
 
-    @skipif(not ldap_lib_installed, reason='skipping due to missing ldap lib')
+    @base.skipif(not base.ldap_lib_installed, reason='skipping due to missing ldap lib')
     def test_ldap_error_form(self):
         self.log_user()
 
@@ -95,7 +95,7 @@
                        'auth_ldap_attr_lastname': '',
                        'auth_ldap_attr_email': ''})
 
-        test_url = url(controller='admin/auth_settings',
+        test_url = base.url(controller='admin/auth_settings',
                        action='auth_settings')
 
         response = self.app.post(url=test_url, params=params)
@@ -115,7 +115,7 @@
         params = self._enable_plugins('kallithea.lib.auth_modules.auth_internal,kallithea.lib.auth_modules.auth_container')
         params.update(settings)
 
-        test_url = url(controller='admin/auth_settings',
+        test_url = base.url(controller='admin/auth_settings',
                        action='auth_settings')
 
         response = self.app.post(url=test_url, params=params)
@@ -124,7 +124,7 @@
 
     def _container_auth_verify_login(self, resulting_username, **get_kwargs):
         response = self.app.get(
-            url=url(controller='admin/my_account', action='my_account'),
+            url=base.url(controller='admin/my_account', action='my_account'),
             **get_kwargs
         )
         response.mustcontain('My Account %s' % resulting_username)
@@ -153,7 +153,7 @@
             auth_container_clean_username='False',
         )
         response = self.app.get(
-            url=url(controller='admin/my_account', action='my_account'),
+            url=base.url(controller='admin/my_account', action='my_account'),
             extra_environ={'THE_USER_NAME': 'johnd',
                            'THE_USER_EMAIL': 'john@example.org',
                            'THE_USER_FIRSTNAME': 'John',
@@ -216,7 +216,7 @@
             auth_container_clean_username='True',
         )
         response = self.app.get(
-            url=url(controller='admin/my_account', action='my_account'),
+            url=base.url(controller='admin/my_account', action='my_account'),
             extra_environ={'REMOTE_USER': 'john'},
         )
         assert b'Log Out' not in response.normal_body
@@ -232,7 +232,7 @@
                        'auth_crowd_method': 'https',
                        'auth_crowd_app_name': 'xyzzy'})
 
-        test_url = url(controller='admin/auth_settings',
+        test_url = base.url(controller='admin/auth_settings',
                        action='auth_settings')
 
         response = self.app.post(url=test_url, params=params)
@@ -241,7 +241,7 @@
         new_settings = Setting.get_auth_settings()
         assert new_settings['auth_crowd_host'] == u'hostname', 'fail db write compare'
 
-    @skipif(not pam_lib_installed, reason='skipping due to missing pam lib')
+    @base.skipif(not base.pam_lib_installed, reason='skipping due to missing pam lib')
     def test_pam_save_settings(self):
         self.log_user()
 
@@ -249,7 +249,7 @@
         params.update({'auth_pam_service': 'kallithea',
                        'auth_pam_gecos': '^foo-.*'})
 
-        test_url = url(controller='admin/auth_settings',
+        test_url = base.url(controller='admin/auth_settings',
                        action='auth_settings')
 
         response = self.app.post(url=test_url, params=params)
--- a/kallithea/tests/functional/test_admin_defaults.py	Thu Jan 02 00:57:38 2020 +0100
+++ b/kallithea/tests/functional/test_admin_defaults.py	Thu Jan 02 00:44:56 2020 +0100
@@ -1,12 +1,12 @@
 from kallithea.model.db import Setting
-from kallithea.tests.base import *
+from kallithea.tests import base
 
 
-class TestDefaultsController(TestController):
+class TestDefaultsController(base.TestController):
 
     def test_index(self):
         self.log_user()
-        response = self.app.get(url('defaults'))
+        response = self.app.get(base.url('defaults'))
         response.mustcontain('default_repo_private')
         response.mustcontain('default_repo_enable_statistics')
         response.mustcontain('default_repo_enable_downloads')
@@ -20,7 +20,7 @@
             'default_repo_type': 'hg',
             '_session_csrf_secret_token': self.session_csrf_secret_token(),
         }
-        response = self.app.post(url('defaults_update', id='default'), params=params)
+        response = self.app.post(base.url('defaults_update', id='default'), params=params)
         self.checkSessionFlash(response, 'Default settings updated successfully')
 
         params.pop('_session_csrf_secret_token')
@@ -36,7 +36,7 @@
             'default_repo_type': 'git',
             '_session_csrf_secret_token': self.session_csrf_secret_token(),
         }
-        response = self.app.post(url('defaults_update', id='default'), params=params)
+        response = self.app.post(base.url('defaults_update', id='default'), params=params)
         self.checkSessionFlash(response, 'Default settings updated successfully')
 
         params.pop('_session_csrf_secret_token')
--- a/kallithea/tests/functional/test_admin_gists.py	Thu Jan 02 00:57:38 2020 +0100
+++ b/kallithea/tests/functional/test_admin_gists.py	Thu Jan 02 00:44:56 2020 +0100
@@ -1,24 +1,24 @@
 from kallithea.model.db import Gist, User
 from kallithea.model.gist import GistModel
 from kallithea.model.meta import Session
-from kallithea.tests.base import *
+from kallithea.tests import base
 
 
 def _create_gist(f_name, content='some gist', lifetime=-1,
                  description=u'gist-desc', gist_type='public',
-                 owner=TEST_USER_ADMIN_LOGIN):
+                 owner=base.TEST_USER_ADMIN_LOGIN):
     gist_mapping = {
         f_name: {'content': content}
     }
     owner = User.get_by_username(owner)
-    gist = GistModel().create(description, owner=owner, ip_addr=IP_ADDR,
+    gist = GistModel().create(description, owner=owner, ip_addr=base.IP_ADDR,
                        gist_mapping=gist_mapping, gist_type=gist_type,
                        lifetime=lifetime)
     Session().commit()
     return gist
 
 
-class TestGistsController(TestController):
+class TestGistsController(base.TestController):
 
     def teardown_method(self, method):
         for g in Gist.query():
@@ -27,7 +27,7 @@
 
     def test_index(self):
         self.log_user()
-        response = self.app.get(url('gists'))
+        response = self.app.get(base.url('gists'))
         # Test response...
         response.mustcontain('There are no gists yet')
 
@@ -35,7 +35,7 @@
         g2 = _create_gist('gist2', lifetime=1400).gist_access_id
         g3 = _create_gist('gist3', description=u'gist3-desc').gist_access_id
         g4 = _create_gist('gist4', gist_type='private').gist_access_id
-        response = self.app.get(url('gists'))
+        response = self.app.get(base.url('gists'))
         # Test response...
         response.mustcontain('gist: %s' % g1)
         response.mustcontain('gist: %s' % g2)
@@ -47,7 +47,7 @@
     def test_index_private_gists(self):
         self.log_user()
         gist = _create_gist('gist5', gist_type='private')
-        response = self.app.get(url('gists', private=1))
+        response = self.app.get(base.url('gists', private=1))
         # Test response...
 
         # and privates
@@ -55,7 +55,7 @@
 
     def test_create_missing_description(self):
         self.log_user()
-        response = self.app.post(url('gists'),
+        response = self.app.post(base.url('gists'),
                                  params={'lifetime': -1, '_session_csrf_secret_token': self.session_csrf_secret_token()},
                                  status=200)
 
@@ -63,7 +63,7 @@
 
     def test_create(self):
         self.log_user()
-        response = self.app.post(url('gists'),
+        response = self.app.post(base.url('gists'),
                                  params={'lifetime': -1,
                                          'content': 'gist test',
                                          'filename': 'foo',
@@ -77,7 +77,7 @@
 
     def test_create_with_path_with_dirs(self):
         self.log_user()
-        response = self.app.post(url('gists'),
+        response = self.app.post(base.url('gists'),
                                  params={'lifetime': -1,
                                          'content': 'gist test',
                                          'filename': '/home/foo',
@@ -92,11 +92,11 @@
         gist.gist_expires = 0  # 1970
         Session().commit()
 
-        response = self.app.get(url('gist', gist_id=gist.gist_access_id), status=404)
+        response = self.app.get(base.url('gist', gist_id=gist.gist_access_id), status=404)
 
     def test_create_private(self):
         self.log_user()
-        response = self.app.post(url('gists'),
+        response = self.app.post(base.url('gists'),
                                  params={'lifetime': -1,
                                          'content': 'private gist test',
                                          'filename': 'private-foo',
@@ -110,7 +110,7 @@
 
     def test_create_with_description(self):
         self.log_user()
-        response = self.app.post(url('gists'),
+        response = self.app.post(base.url('gists'),
                                  params={'lifetime': -1,
                                          'content': 'gist test',
                                          'filename': 'foo-desc',
@@ -126,46 +126,46 @@
 
     def test_new(self):
         self.log_user()
-        response = self.app.get(url('new_gist'))
+        response = self.app.get(base.url('new_gist'))
 
     def test_delete(self):
         self.log_user()
         gist = _create_gist('delete-me')
-        response = self.app.post(url('gist_delete', gist_id=gist.gist_id),
+        response = self.app.post(base.url('gist_delete', gist_id=gist.gist_id),
             params={'_session_csrf_secret_token': self.session_csrf_secret_token()})
 
     def test_delete_normal_user_his_gist(self):
-        self.log_user(TEST_USER_REGULAR_LOGIN, TEST_USER_REGULAR_PASS)
-        gist = _create_gist('delete-me', owner=TEST_USER_REGULAR_LOGIN)
-        response = self.app.post(url('gist_delete', gist_id=gist.gist_id),
+        self.log_user(base.TEST_USER_REGULAR_LOGIN, base.TEST_USER_REGULAR_PASS)
+        gist = _create_gist('delete-me', owner=base.TEST_USER_REGULAR_LOGIN)
+        response = self.app.post(base.url('gist_delete', gist_id=gist.gist_id),
             params={'_session_csrf_secret_token': self.session_csrf_secret_token()})
 
     def test_delete_normal_user_not_his_own_gist(self):
-        self.log_user(TEST_USER_REGULAR_LOGIN, TEST_USER_REGULAR_PASS)
+        self.log_user(base.TEST_USER_REGULAR_LOGIN, base.TEST_USER_REGULAR_PASS)
         gist = _create_gist('delete-me')
-        response = self.app.post(url('gist_delete', gist_id=gist.gist_id), status=403,
+        response = self.app.post(base.url('gist_delete', gist_id=gist.gist_id), status=403,
             params={'_session_csrf_secret_token': self.session_csrf_secret_token()})
 
     def test_show(self):
         gist = _create_gist('gist-show-me')
-        response = self.app.get(url('gist', gist_id=gist.gist_access_id))
+        response = self.app.get(base.url('gist', gist_id=gist.gist_access_id))
         response.mustcontain('added file: gist-show-me<')
-        response.mustcontain('%s - created' % TEST_USER_ADMIN_LOGIN)
+        response.mustcontain('%s - created' % base.TEST_USER_ADMIN_LOGIN)
         response.mustcontain('gist-desc')
         response.mustcontain('<div class="label label-success">Public Gist</div>')
 
     def test_show_as_raw(self):
         gist = _create_gist('gist-show-me', content='GIST CONTENT')
-        response = self.app.get(url('formatted_gist',
+        response = self.app.get(base.url('formatted_gist',
                                     gist_id=gist.gist_access_id, format='raw'))
         assert response.body == b'GIST CONTENT'
 
     def test_show_as_raw_individual_file(self):
         gist = _create_gist('gist-show-me-raw', content='GIST BODY')
-        response = self.app.get(url('formatted_gist_file',
+        response = self.app.get(base.url('formatted_gist_file',
                                     gist_id=gist.gist_access_id, format='raw',
                                     revision='tip', f_path='gist-show-me-raw'))
         assert response.body == b'GIST BODY'
 
     def test_edit(self):
-        response = self.app.get(url('edit_gist', gist_id=1))
+        response = self.app.get(base.url('edit_gist', gist_id=1))
--- a/kallithea/tests/functional/test_admin_permissions.py	Thu Jan 02 00:57:38 2020 +0100
+++ b/kallithea/tests/functional/test_admin_permissions.py	Thu Jan 02 00:44:56 2020 +0100
@@ -1,17 +1,17 @@
 from kallithea.model.db import User, UserIpMap
-from kallithea.tests.base import *
+from kallithea.tests import base
 
 
-class TestAdminPermissionsController(TestController):
+class TestAdminPermissionsController(base.TestController):
 
     def test_index(self):
         self.log_user()
-        response = self.app.get(url('admin_permissions'))
+        response = self.app.get(base.url('admin_permissions'))
         # Test response...
 
     def test_index_ips(self):
         self.log_user()
-        response = self.app.get(url('admin_permissions_ips'))
+        response = self.app.get(base.url('admin_permissions_ips'))
         # Test response...
         response.mustcontain('All IP addresses are allowed')
 
@@ -21,61 +21,61 @@
 
         # Add IP and verify it is shown in UI and both gives access and rejects
 
-        response = self.app.post(url('edit_user_ips_update', id=default_user_id),
+        response = self.app.post(base.url('edit_user_ips_update', id=default_user_id),
                                  params=dict(new_ip='0.0.0.0/24',
                                  _session_csrf_secret_token=self.session_csrf_secret_token()))
-        invalidate_all_caches()
-        response = self.app.get(url('admin_permissions_ips'),
+        base.invalidate_all_caches()
+        response = self.app.get(base.url('admin_permissions_ips'),
                                 extra_environ={'REMOTE_ADDR': '0.0.0.1'})
         response.mustcontain('0.0.0.0/24')
         response.mustcontain('0.0.0.0 - 0.0.0.255')
 
-        response = self.app.get(url('admin_permissions_ips'),
+        response = self.app.get(base.url('admin_permissions_ips'),
                                 extra_environ={'REMOTE_ADDR': '0.0.1.1'}, status=403)
 
         # Add another IP and verify previously rejected now works
 
-        response = self.app.post(url('edit_user_ips_update', id=default_user_id),
+        response = self.app.post(base.url('edit_user_ips_update', id=default_user_id),
                                  params=dict(new_ip='0.0.1.0/24',
                                  _session_csrf_secret_token=self.session_csrf_secret_token()))
-        invalidate_all_caches()
+        base.invalidate_all_caches()
 
-        response = self.app.get(url('admin_permissions_ips'),
+        response = self.app.get(base.url('admin_permissions_ips'),
                                 extra_environ={'REMOTE_ADDR': '0.0.1.1'})
 
         # Delete latest IP and verify same IP is rejected again
 
         x = UserIpMap.query().filter_by(ip_addr='0.0.1.0/24').first()
-        response = self.app.post(url('edit_user_ips_delete', id=default_user_id),
+        response = self.app.post(base.url('edit_user_ips_delete', id=default_user_id),
                                  params=dict(del_ip_id=x.ip_id,
                                              _session_csrf_secret_token=self.session_csrf_secret_token()))
-        invalidate_all_caches()
+        base.invalidate_all_caches()
 
-        response = self.app.get(url('admin_permissions_ips'),
+        response = self.app.get(base.url('admin_permissions_ips'),
                                 extra_environ={'REMOTE_ADDR': '0.0.1.1'}, status=403)
 
         # Delete first IP and verify unlimited access again
 
         x = UserIpMap.query().filter_by(ip_addr='0.0.0.0/24').first()
-        response = self.app.post(url('edit_user_ips_delete', id=default_user_id),
+        response = self.app.post(base.url('edit_user_ips_delete', id=default_user_id),
                                  params=dict(del_ip_id=x.ip_id,
                                              _session_csrf_secret_token=self.session_csrf_secret_token()))
-        invalidate_all_caches()
+        base.invalidate_all_caches()
 
-        response = self.app.get(url('admin_permissions_ips'),
+        response = self.app.get(base.url('admin_permissions_ips'),
                                 extra_environ={'REMOTE_ADDR': '0.0.1.1'})
 
     def test_index_overview(self):
         self.log_user()
-        response = self.app.get(url('admin_permissions_perms'))
+        response = self.app.get(base.url('admin_permissions_perms'))
         # Test response...
 
     def test_edit_permissions_permissions(self):
-        user = User.get_by_username(TEST_USER_REGULAR_LOGIN)
+        user = User.get_by_username(base.TEST_USER_REGULAR_LOGIN)
 
         # Test unauthenticated access - it will redirect to login page
         response = self.app.post(
-            url('edit_repo_perms_update', repo_name=HG_REPO),
+            base.url('edit_repo_perms_update', repo_name=base.HG_REPO),
             params=dict(
                 perm_new_member_1='repository.read',
                 perm_new_member_name_1=user.username,
@@ -83,24 +83,24 @@
                 _session_csrf_secret_token=self.session_csrf_secret_token()),
             status=302)
 
-        assert not response.location.endswith(url('edit_repo_perms_update', repo_name=HG_REPO))
-        assert response.location.endswith(url('login_home', came_from=url('edit_repo_perms_update', repo_name=HG_REPO)))
+        assert not response.location.endswith(base.url('edit_repo_perms_update', repo_name=base.HG_REPO))
+        assert response.location.endswith(base.url('login_home', came_from=base.url('edit_repo_perms_update', repo_name=base.HG_REPO)))
 
         response = self.app.post(
-            url('edit_repo_perms_revoke', repo_name=HG_REPO),
+            base.url('edit_repo_perms_revoke', repo_name=base.HG_REPO),
             params=dict(
                 obj_type='user',
                 user_id=user.user_id,
                 _session_csrf_secret_token=self.session_csrf_secret_token()),
             status=302)
 
-        assert response.location.endswith(url('login_home', came_from=url('edit_repo_perms_revoke', repo_name=HG_REPO)))
+        assert response.location.endswith(base.url('login_home', came_from=base.url('edit_repo_perms_revoke', repo_name=base.HG_REPO)))
 
         # Test authenticated access
         self.log_user()
 
         response = self.app.post(
-            url('edit_repo_perms_update', repo_name=HG_REPO),
+            base.url('edit_repo_perms_update', repo_name=base.HG_REPO),
             params=dict(
                 perm_new_member_1='repository.read',
                 perm_new_member_name_1=user.username,
@@ -108,10 +108,10 @@
                 _session_csrf_secret_token=self.session_csrf_secret_token()),
             status=302)
 
-        assert response.location.endswith(url('edit_repo_perms_update', repo_name=HG_REPO))
+        assert response.location.endswith(base.url('edit_repo_perms_update', repo_name=base.HG_REPO))
 
         response = self.app.post(
-            url('edit_repo_perms_revoke', repo_name=HG_REPO),
+            base.url('edit_repo_perms_revoke', repo_name=base.HG_REPO),
             params=dict(
                 obj_type='user',
                 user_id=user.user_id,
--- a/kallithea/tests/functional/test_admin_repos.py	Thu Jan 02 00:57:38 2020 +0100
+++ b/kallithea/tests/functional/test_admin_repos.py	Thu Jan 02 00:44:56 2020 +0100
@@ -13,7 +13,7 @@
 from kallithea.model.repo import RepoModel
 from kallithea.model.repo_group import RepoGroupModel
 from kallithea.model.user import UserModel
-from kallithea.tests.base import *
+from kallithea.tests import base
 from kallithea.tests.fixture import Fixture, error_function
 
 
@@ -29,7 +29,7 @@
     return perm
 
 
-class _BaseTestCase(TestController):
+class _BaseTestCase(base.TestController):
     """
     Write all tests here
     """
@@ -41,20 +41,20 @@
 
     def test_index(self):
         self.log_user()
-        response = self.app.get(url('repos'))
+        response = self.app.get(base.url('repos'))
 
     def test_create(self):
         self.log_user()
         repo_name = self.NEW_REPO
         description = u'description for newly created repo'
-        response = self.app.post(url('repos'),
+        response = self.app.post(base.url('repos'),
                         fixture._get_repo_create_params(repo_private=False,
                                                 repo_name=repo_name,
                                                 repo_type=self.REPO_TYPE,
                                                 repo_description=description,
                                                 _session_csrf_secret_token=self.session_csrf_secret_token()))
         ## run the check page that triggers the flash message
-        response = self.app.get(url('repo_check_home', repo_name=repo_name))
+        response = self.app.get(base.url('repo_check_home', repo_name=repo_name))
         assert response.json == {u'result': True}
         self.checkSessionFlash(response,
                                'Created repository <a href="/%s">%s</a>'
@@ -68,7 +68,7 @@
         assert new_repo.description == description
 
         # test if the repository is visible in the list ?
-        response = self.app.get(url('summary_home', repo_name=repo_name))
+        response = self.app.get(base.url('summary_home', repo_name=repo_name))
         response.mustcontain(repo_name)
         response.mustcontain(self.REPO_TYPE)
 
@@ -85,7 +85,7 @@
         self.log_user()
         repo_name = self.NEW_REPO
         description = u'description for newly created repo'
-        response = self.app.post(url('repos'),
+        response = self.app.post(base.url('repos'),
                                  fixture._get_repo_create_params(repo_private=False,
                                                                  repo_name=repo_name,
                                                                  repo_type=self.REPO_TYPE,
@@ -93,7 +93,7 @@
                                                                  _session_csrf_secret_token=self.session_csrf_secret_token()))
         # try to create repo with swapped case
         swapped_repo_name = repo_name.swapcase()
-        response = self.app.post(url('repos'),
+        response = self.app.post(base.url('repos'),
                                  fixture._get_repo_create_params(repo_private=False,
                                                                  repo_name=swapped_repo_name,
                                                                  repo_type=self.REPO_TYPE,
@@ -111,13 +111,13 @@
         group_name = u'sometest_%s' % self.REPO_TYPE
         gr = RepoGroupModel().create(group_name=group_name,
                                      group_description=u'test',
-                                     owner=TEST_USER_ADMIN_LOGIN)
+                                     owner=base.TEST_USER_ADMIN_LOGIN)
         Session().commit()
 
         repo_name = u'ingroup'
         repo_name_full = RepoGroup.url_sep().join([group_name, repo_name])
         description = u'description for newly created repo'
-        response = self.app.post(url('repos'),
+        response = self.app.post(base.url('repos'),
                         fixture._get_repo_create_params(repo_private=False,
                                                 repo_name=repo_name,
                                                 repo_type=self.REPO_TYPE,
@@ -125,7 +125,7 @@
                                                 repo_group=gr.group_id,
                                                 _session_csrf_secret_token=self.session_csrf_secret_token()))
         ## run the check page that triggers the flash message
-        response = self.app.get(url('repo_check_home', repo_name=repo_name_full))
+        response = self.app.get(base.url('repo_check_home', repo_name=repo_name_full))
         assert response.json == {u'result': True}
         self.checkSessionFlash(response,
                                'Created repository <a href="/%s">%s</a>'
@@ -139,7 +139,7 @@
         assert new_repo.description == description
 
         # test if the repository is visible in the list ?
-        response = self.app.get(url('summary_home', repo_name=repo_name_full))
+        response = self.app.get(base.url('summary_home', repo_name=repo_name_full))
         response.mustcontain(repo_name_full)
         response.mustcontain(self.REPO_TYPE)
 
@@ -160,7 +160,7 @@
         Session().commit()
 
     def test_create_in_group_without_needed_permissions(self):
-        usr = self.log_user(TEST_USER_REGULAR_LOGIN, TEST_USER_REGULAR_PASS)
+        usr = self.log_user(base.TEST_USER_REGULAR_LOGIN, base.TEST_USER_REGULAR_PASS)
         # avoid spurious RepoGroup DetachedInstanceError ...
         session_csrf_secret_token = self.session_csrf_secret_token()
         # revoke
@@ -172,29 +172,29 @@
         user_model.grant_perm(User.DEFAULT_USER, 'hg.fork.none')
 
         # disable on regular user
-        user_model.revoke_perm(TEST_USER_REGULAR_LOGIN, 'hg.create.repository')
-        user_model.grant_perm(TEST_USER_REGULAR_LOGIN, 'hg.create.none')
-        user_model.revoke_perm(TEST_USER_REGULAR_LOGIN, 'hg.fork.repository')
-        user_model.grant_perm(TEST_USER_REGULAR_LOGIN, 'hg.fork.none')
+        user_model.revoke_perm(base.TEST_USER_REGULAR_LOGIN, 'hg.create.repository')
+        user_model.grant_perm(base.TEST_USER_REGULAR_LOGIN, 'hg.create.none')
+        user_model.revoke_perm(base.TEST_USER_REGULAR_LOGIN, 'hg.fork.repository')
+        user_model.grant_perm(base.TEST_USER_REGULAR_LOGIN, 'hg.fork.none')
         Session().commit()
 
         ## create GROUP
         group_name = u'reg_sometest_%s' % self.REPO_TYPE
         gr = RepoGroupModel().create(group_name=group_name,
                                      group_description=u'test',
-                                     owner=TEST_USER_ADMIN_LOGIN)
+                                     owner=base.TEST_USER_ADMIN_LOGIN)
         Session().commit()
 
         group_name_allowed = u'reg_sometest_allowed_%s' % self.REPO_TYPE
         gr_allowed = RepoGroupModel().create(group_name=group_name_allowed,
                                      group_description=u'test',
-                                     owner=TEST_USER_REGULAR_LOGIN)
+                                     owner=base.TEST_USER_REGULAR_LOGIN)
         Session().commit()
 
         repo_name = u'ingroup'
         repo_name_full = RepoGroup.url_sep().join([group_name, repo_name])
         description = u'description for newly created repo'
-        response = self.app.post(url('repos'),
+        response = self.app.post(base.url('repos'),
                         fixture._get_repo_create_params(repo_private=False,
                                                 repo_name=repo_name,
                                                 repo_type=self.REPO_TYPE,
@@ -208,7 +208,7 @@
         repo_name = u'ingroup'
         repo_name_full = RepoGroup.url_sep().join([group_name_allowed, repo_name])
         description = u'description for newly created repo'
-        response = self.app.post(url('repos'),
+        response = self.app.post(base.url('repos'),
                         fixture._get_repo_create_params(repo_private=False,
                                                 repo_name=repo_name,
                                                 repo_type=self.REPO_TYPE,
@@ -217,7 +217,7 @@
                                                 _session_csrf_secret_token=session_csrf_secret_token))
 
         ## run the check page that triggers the flash message
-        response = self.app.get(url('repo_check_home', repo_name=repo_name_full))
+        response = self.app.get(base.url('repo_check_home', repo_name=repo_name_full))
         assert response.json == {u'result': True}
         self.checkSessionFlash(response,
                                'Created repository <a href="/%s">%s</a>'
@@ -231,7 +231,7 @@
         assert new_repo.description == description
 
         # test if the repository is visible in the list ?
-        response = self.app.get(url('summary_home', repo_name=repo_name_full))
+        response = self.app.get(base.url('summary_home', repo_name=repo_name_full))
         response.mustcontain(repo_name_full)
         response.mustcontain(self.REPO_TYPE)
 
@@ -259,9 +259,9 @@
         group_name = u'sometest_%s' % self.REPO_TYPE
         gr = RepoGroupModel().create(group_name=group_name,
                                      group_description=u'test',
-                                     owner=TEST_USER_ADMIN_LOGIN)
+                                     owner=base.TEST_USER_ADMIN_LOGIN)
         perm = Permission.get_by_key('repository.write')
-        RepoGroupModel().grant_user_permission(gr, TEST_USER_REGULAR_LOGIN, perm)
+        RepoGroupModel().grant_user_permission(gr, base.TEST_USER_REGULAR_LOGIN, perm)
 
         ## add repo permissions
         Session().commit()
@@ -269,7 +269,7 @@
         repo_name = u'ingroup_inherited_%s' % self.REPO_TYPE
         repo_name_full = RepoGroup.url_sep().join([group_name, repo_name])
         description = u'description for newly created repo'
-        response = self.app.post(url('repos'),
+        response = self.app.post(base.url('repos'),
                         fixture._get_repo_create_params(repo_private=False,
                                                 repo_name=repo_name,
                                                 repo_type=self.REPO_TYPE,
@@ -279,7 +279,7 @@
                                                 _session_csrf_secret_token=self.session_csrf_secret_token()))
 
         ## run the check page that triggers the flash message
-        response = self.app.get(url('repo_check_home', repo_name=repo_name_full))
+        response = self.app.get(base.url('repo_check_home', repo_name=repo_name_full))
         self.checkSessionFlash(response,
                                'Created repository <a href="/%s">%s</a>'
                                % (repo_name_full, repo_name_full))
@@ -292,7 +292,7 @@
         assert new_repo.description == description
 
         # test if the repository is visible in the list ?
-        response = self.app.get(url('summary_home', repo_name=repo_name_full))
+        response = self.app.get(base.url('summary_home', repo_name=repo_name_full))
         response.mustcontain(repo_name_full)
         response.mustcontain(self.REPO_TYPE)
 
@@ -309,7 +309,7 @@
             .filter(UserRepoToPerm.repository_id == new_repo_id).all()
         assert len(inherited_perms) == 2
 
-        assert TEST_USER_REGULAR_LOGIN in [x.user.username
+        assert base.TEST_USER_REGULAR_LOGIN in [x.user.username
                                                     for x in inherited_perms]
         assert 'repository.write' in [x.permission.permission_name
                                                for x in inherited_perms]
@@ -322,7 +322,7 @@
         self.log_user()
         repo_name = self.NEW_REPO
         description = u'description for newly created repo'
-        response = self.app.post(url('repos'),
+        response = self.app.post(base.url('repos'),
                         fixture._get_repo_create_params(repo_private=False,
                                                 repo_name=repo_name,
                                                 repo_type=self.REPO_TYPE,
@@ -335,7 +335,7 @@
         self.log_user()
         repo_name = self.NEW_REPO
         description = u'description for newly created repo'
-        response = self.app.post(url('repos'),
+        response = self.app.post(base.url('repos'),
                         fixture._get_repo_create_params(repo_private=False,
                                                 repo_name=repo_name,
                                                 repo_type=self.REPO_TYPE,
@@ -348,14 +348,14 @@
         self.log_user()
         repo_name = u'vcs_test_new_to_delete_%s' % self.REPO_TYPE
         description = u'description for newly created repo'
-        response = self.app.post(url('repos'),
+        response = self.app.post(base.url('repos'),
                         fixture._get_repo_create_params(repo_private=False,
                                                 repo_type=self.REPO_TYPE,
                                                 repo_name=repo_name,
                                                 repo_description=description,
                                                 _session_csrf_secret_token=self.session_csrf_secret_token()))
         ## run the check page that triggers the flash message
-        response = self.app.get(url('repo_check_home', repo_name=repo_name))
+        response = self.app.get(base.url('repo_check_home', repo_name=repo_name))
         self.checkSessionFlash(response,
                                'Created repository <a href="/%s">%s</a>'
                                % (repo_name, repo_name))
@@ -367,7 +367,7 @@
         assert new_repo.description == description
 
         # test if the repository is visible in the list ?
-        response = self.app.get(url('summary_home', repo_name=repo_name))
+        response = self.app.get(base.url('summary_home', repo_name=repo_name))
         response.mustcontain(repo_name)
         response.mustcontain(self.REPO_TYPE)
 
@@ -377,7 +377,7 @@
         except vcs.exceptions.VCSError:
             pytest.fail('no repo %s in filesystem' % repo_name)
 
-        response = self.app.post(url('delete_repo', repo_name=repo_name),
+        response = self.app.post(base.url('delete_repo', repo_name=repo_name),
             params={'_session_csrf_secret_token': self.session_csrf_secret_token()})
 
         self.checkSessionFlash(response, 'Deleted repository %s' % (repo_name))
@@ -399,14 +399,14 @@
         repo_name_unicode = safe_unicode(repo_name)
         description = 'description for newly created repo' + non_ascii
         description_unicode = safe_unicode(description)
-        response = self.app.post(url('repos'),
+        response = self.app.post(base.url('repos'),
                         fixture._get_repo_create_params(repo_private=False,
                                                 repo_name=repo_name,
                                                 repo_type=self.REPO_TYPE,
                                                 repo_description=description,
                                                 _session_csrf_secret_token=self.session_csrf_secret_token()))
         ## run the check page that triggers the flash message
-        response = self.app.get(url('repo_check_home', repo_name=repo_name))
+        response = self.app.get(base.url('repo_check_home', repo_name=repo_name))
         assert response.json == {u'result': True}
         self.checkSessionFlash(response,
                                u'Created repository <a href="/%s">%s</a>'
@@ -419,7 +419,7 @@
         assert new_repo.description == description_unicode
 
         # test if the repository is visible in the list ?
-        response = self.app.get(url('summary_home', repo_name=repo_name))
+        response = self.app.get(base.url('summary_home', repo_name=repo_name))
         response.mustcontain(repo_name)
         response.mustcontain(self.REPO_TYPE)
 
@@ -429,7 +429,7 @@
         except vcs.exceptions.VCSError:
             pytest.fail('no repo %s in filesystem' % repo_name)
 
-        response = self.app.post(url('delete_repo', repo_name=repo_name),
+        response = self.app.post(base.url('delete_repo', repo_name=repo_name),
             params={'_session_csrf_secret_token': self.session_csrf_secret_token()})
         self.checkSessionFlash(response, 'Deleted repository %s' % (repo_name_unicode))
         response.follow()
@@ -447,15 +447,15 @@
         pass
 
     def test_delete_browser_fakeout(self):
-        response = self.app.post(url('delete_repo', repo_name=self.REPO),
+        response = self.app.post(base.url('delete_repo', repo_name=self.REPO),
                                  params=dict(_session_csrf_secret_token=self.session_csrf_secret_token()))
 
     def test_show(self):
         self.log_user()
-        response = self.app.get(url('summary_home', repo_name=self.REPO))
+        response = self.app.get(base.url('summary_home', repo_name=self.REPO))
 
     def test_edit(self):
-        response = self.app.get(url('edit_repo', repo_name=self.REPO))
+        response = self.app.get(base.url('edit_repo', repo_name=self.REPO))
 
     def test_set_private_flag_sets_default_to_none(self):
         self.log_user()
@@ -465,11 +465,11 @@
         assert perm[0].permission.permission_name == 'repository.read'
         assert Repository.get_by_repo_name(self.REPO).private == False
 
-        response = self.app.post(url('update_repo', repo_name=self.REPO),
+        response = self.app.post(base.url('update_repo', repo_name=self.REPO),
                         fixture._get_repo_create_params(repo_private=1,
                                                 repo_name=self.REPO,
                                                 repo_type=self.REPO_TYPE,
-                                                owner=TEST_USER_ADMIN_LOGIN,
+                                                owner=base.TEST_USER_ADMIN_LOGIN,
                                                 _session_csrf_secret_token=self.session_csrf_secret_token()))
         self.checkSessionFlash(response,
                                msg='Repository %s updated successfully' % (self.REPO))
@@ -480,11 +480,11 @@
         assert len(perm), 1
         assert perm[0].permission.permission_name == 'repository.none'
 
-        response = self.app.post(url('update_repo', repo_name=self.REPO),
+        response = self.app.post(base.url('update_repo', repo_name=self.REPO),
                         fixture._get_repo_create_params(repo_private=False,
                                                 repo_name=self.REPO,
                                                 repo_type=self.REPO_TYPE,
-                                                owner=TEST_USER_ADMIN_LOGIN,
+                                                owner=base.TEST_USER_ADMIN_LOGIN,
                                                 _session_csrf_secret_token=self.session_csrf_secret_token()))
         self.checkSessionFlash(response,
                                msg='Repository %s updated successfully' % (self.REPO))
@@ -502,7 +502,7 @@
     def test_set_repo_fork_has_no_self_id(self):
         self.log_user()
         repo = Repository.get_by_repo_name(self.REPO)
-        response = self.app.get(url('edit_repo_advanced', repo_name=self.REPO))
+        response = self.app.get(base.url('edit_repo_advanced', repo_name=self.REPO))
         opt = """<option value="%s">%s</option>""" % (repo.repo_id, self.REPO)
         response.mustcontain(no=[opt])
 
@@ -512,7 +512,7 @@
         fixture.create_repo(other_repo, repo_type=self.REPO_TYPE)
         repo = Repository.get_by_repo_name(self.REPO)
         repo2 = Repository.get_by_repo_name(other_repo)
-        response = self.app.post(url('edit_repo_advanced_fork', repo_name=self.REPO),
+        response = self.app.post(base.url('edit_repo_advanced_fork', repo_name=self.REPO),
                                 params=dict(id_fork_of=repo2.repo_id, _session_csrf_secret_token=self.session_csrf_secret_token()))
         repo = Repository.get_by_repo_name(self.REPO)
         repo2 = Repository.get_by_repo_name(other_repo)
@@ -533,7 +533,7 @@
         self.log_user()
         repo = Repository.get_by_repo_name(self.REPO)
         repo2 = Repository.get_by_repo_name(self.OTHER_TYPE_REPO)
-        response = self.app.post(url('edit_repo_advanced_fork', repo_name=self.REPO),
+        response = self.app.post(base.url('edit_repo_advanced_fork', repo_name=self.REPO),
                                 params=dict(id_fork_of=repo2.repo_id, _session_csrf_secret_token=self.session_csrf_secret_token()))
         repo = Repository.get_by_repo_name(self.REPO)
         repo2 = Repository.get_by_repo_name(self.OTHER_TYPE_REPO)
@@ -543,7 +543,7 @@
     def test_set_fork_of_none(self):
         self.log_user()
         ## mark it as None
-        response = self.app.post(url('edit_repo_advanced_fork', repo_name=self.REPO),
+        response = self.app.post(base.url('edit_repo_advanced_fork', repo_name=self.REPO),
                                 params=dict(id_fork_of=None, _session_csrf_secret_token=self.session_csrf_secret_token()))
         repo = Repository.get_by_repo_name(self.REPO)
         repo2 = Repository.get_by_repo_name(self.OTHER_TYPE_REPO)
@@ -555,13 +555,13 @@
     def test_set_fork_of_same_repo(self):
         self.log_user()
         repo = Repository.get_by_repo_name(self.REPO)
-        response = self.app.post(url('edit_repo_advanced_fork', repo_name=self.REPO),
+        response = self.app.post(base.url('edit_repo_advanced_fork', repo_name=self.REPO),
                                 params=dict(id_fork_of=repo.repo_id, _session_csrf_secret_token=self.session_csrf_secret_token()))
         self.checkSessionFlash(response,
                                'An error occurred during this operation')
 
     def test_create_on_top_level_without_permissions(self):
-        usr = self.log_user(TEST_USER_REGULAR_LOGIN, TEST_USER_REGULAR_PASS)
+        usr = self.log_user(base.TEST_USER_REGULAR_LOGIN, base.TEST_USER_REGULAR_PASS)
         # revoke
         user_model = UserModel()
         # disable fork and create on default user
@@ -571,10 +571,10 @@
         user_model.grant_perm(User.DEFAULT_USER, 'hg.fork.none')
 
         # disable on regular user
-        user_model.revoke_perm(TEST_USER_REGULAR_LOGIN, 'hg.create.repository')
-        user_model.grant_perm(TEST_USER_REGULAR_LOGIN, 'hg.create.none')
-        user_model.revoke_perm(TEST_USER_REGULAR_LOGIN, 'hg.fork.repository')
-        user_model.grant_perm(TEST_USER_REGULAR_LOGIN, 'hg.fork.none')
+        user_model.revoke_perm(base.TEST_USER_REGULAR_LOGIN, 'hg.create.repository')
+        user_model.grant_perm(base.TEST_USER_REGULAR_LOGIN, 'hg.create.none')
+        user_model.revoke_perm(base.TEST_USER_REGULAR_LOGIN, 'hg.fork.repository')
+        user_model.grant_perm(base.TEST_USER_REGULAR_LOGIN, 'hg.fork.none')
         Session().commit()
 
 
@@ -582,7 +582,7 @@
 
         repo_name = self.NEW_REPO + u'no_perms'
         description = 'description for newly created repo'
-        response = self.app.post(url('repos'),
+        response = self.app.post(base.url('repos'),
                         fixture._get_repo_create_params(repo_private=False,
                                                 repo_name=repo_name,
                                                 repo_type=self.REPO_TYPE,
@@ -600,7 +600,7 @@
         repo_name = self.NEW_REPO
         description = 'description for newly created repo'
 
-        response = self.app.post(url('repos'),
+        response = self.app.post(base.url('repos'),
                         fixture._get_repo_create_params(repo_private=False,
                                                 repo_name=repo_name,
                                                 repo_type=self.REPO_TYPE,
@@ -618,18 +618,18 @@
 
 
 class TestAdminReposControllerGIT(_BaseTestCase):
-    REPO = GIT_REPO
+    REPO = base.GIT_REPO
     REPO_TYPE = 'git'
-    NEW_REPO = NEW_GIT_REPO
-    OTHER_TYPE_REPO = HG_REPO
+    NEW_REPO = base.NEW_GIT_REPO
+    OTHER_TYPE_REPO = base.HG_REPO
     OTHER_TYPE = 'hg'
 
 
 class TestAdminReposControllerHG(_BaseTestCase):
-    REPO = HG_REPO
+    REPO = base.HG_REPO
     REPO_TYPE = 'hg'
-    NEW_REPO = NEW_HG_REPO
-    OTHER_TYPE_REPO = GIT_REPO
+    NEW_REPO = base.NEW_HG_REPO
+    OTHER_TYPE_REPO = base.GIT_REPO
     OTHER_TYPE = 'git'
 
     def test_permanent_url_protocol_access(self):
@@ -637,7 +637,7 @@
         permanent_name = '_%d' % repo.repo_id
 
         # 400 Bad Request - Unable to detect pull/push action
-        self.app.get(url('summary_home', repo_name=permanent_name),
+        self.app.get(base.url('summary_home', repo_name=permanent_name),
             extra_environ={'HTTP_ACCEPT': 'application/mercurial'},
             status=400,
         )
--- a/kallithea/tests/functional/test_admin_settings.py	Thu Jan 02 00:57:38 2020 +0100
+++ b/kallithea/tests/functional/test_admin_settings.py	Thu Jan 02 00:44:56 2020 +0100
@@ -1,54 +1,54 @@
 # -*- coding: utf-8 -*-
 
 from kallithea.model.db import Setting, Ui
-from kallithea.tests.base import *
+from kallithea.tests import base
 from kallithea.tests.fixture import Fixture
 
 
 fixture = Fixture()
 
 
-class TestAdminSettingsController(TestController):
+class TestAdminSettingsController(base.TestController):
 
     def test_index_main(self):
         self.log_user()
-        response = self.app.get(url('admin_settings'))
+        response = self.app.get(base.url('admin_settings'))
 
     def test_index_mapping(self):
         self.log_user()
-        response = self.app.get(url('admin_settings_mapping'))
+        response = self.app.get(base.url('admin_settings_mapping'))
 
     def test_index_global(self):
         self.log_user()
-        response = self.app.get(url('admin_settings_global'))
+        response = self.app.get(base.url('admin_settings_global'))
 
     def test_index_visual(self):
         self.log_user()
-        response = self.app.get(url('admin_settings_visual'))
+        response = self.app.get(base.url('admin_settings_visual'))
 
     def test_index_email(self):
         self.log_user()
-        response = self.app.get(url('admin_settings_email'))
+        response = self.app.get(base.url('admin_settings_email'))
 
     def test_index_hooks(self):
         self.log_user()
-        response = self.app.get(url('admin_settings_hooks'))
+        response = self.app.get(base.url('admin_settings_hooks'))
 
     def test_create_custom_hook(self):
         self.log_user()
-        response = self.app.post(url('admin_settings_hooks'),
+        response = self.app.post(base.url('admin_settings_hooks'),
                                 params=dict(new_hook_ui_key='test_hooks_1',
-                                            new_hook_ui_value='cd %s' % TESTS_TMP_PATH,
+                                            new_hook_ui_value='cd %s' % base.TESTS_TMP_PATH,
                                             _session_csrf_secret_token=self.session_csrf_secret_token()))
 
         self.checkSessionFlash(response, 'Added new hook')
         response = response.follow()
         response.mustcontain('test_hooks_1')
-        response.mustcontain('cd %s' % TESTS_TMP_PATH)
+        response.mustcontain('cd %s' % base.TESTS_TMP_PATH)
 
     def test_edit_custom_hook(self):
         self.log_user()
-        response = self.app.post(url('admin_settings_hooks'),
+        response = self.app.post(base.url('admin_settings_hooks'),
                                 params=dict(hook_ui_key='test_hooks_1',
                                             hook_ui_value='old_value_of_hook_1',
                                             hook_ui_value_new='new_value_of_hook_1',
@@ -60,7 +60,7 @@
 
     def test_add_existing_custom_hook(self):
         self.log_user()
-        response = self.app.post(url('admin_settings_hooks'),
+        response = self.app.post(base.url('admin_settings_hooks'),
                                 params=dict(new_hook_ui_key='test_hooks_1',
                                             new_hook_ui_value='attempted_new_value',
                                             _session_csrf_secret_token=self.session_csrf_secret_token()))
@@ -72,27 +72,27 @@
 
     def test_create_custom_hook_delete(self):
         self.log_user()
-        response = self.app.post(url('admin_settings_hooks'),
+        response = self.app.post(base.url('admin_settings_hooks'),
                                 params=dict(new_hook_ui_key='test_hooks_2',
-                                            new_hook_ui_value='cd %s2' % TESTS_TMP_PATH,
+                                            new_hook_ui_value='cd %s2' % base.TESTS_TMP_PATH,
                                             _session_csrf_secret_token=self.session_csrf_secret_token()))
 
         self.checkSessionFlash(response, 'Added new hook')
         response = response.follow()
         response.mustcontain('test_hooks_2')
-        response.mustcontain('cd %s2' % TESTS_TMP_PATH)
+        response.mustcontain('cd %s2' % base.TESTS_TMP_PATH)
 
         hook_id = Ui.get_by_key('hooks', 'test_hooks_2').ui_id
         ## delete
-        self.app.post(url('admin_settings_hooks'),
+        self.app.post(base.url('admin_settings_hooks'),
                         params=dict(hook_id=hook_id, _session_csrf_secret_token=self.session_csrf_secret_token()))
-        response = self.app.get(url('admin_settings_hooks'))
+        response = self.app.get(base.url('admin_settings_hooks'))
         response.mustcontain(no=['test_hooks_2'])
-        response.mustcontain(no=['cd %s2' % TESTS_TMP_PATH])
+        response.mustcontain(no=['cd %s2' % base.TESTS_TMP_PATH])
 
     def test_add_existing_builtin_hook(self):
         self.log_user()
-        response = self.app.post(url('admin_settings_hooks'),
+        response = self.app.post(base.url('admin_settings_hooks'),
                                 params=dict(new_hook_ui_key='changegroup.update',
                                             new_hook_ui_value='attempted_new_value',
                                             _session_csrf_secret_token=self.session_csrf_secret_token()))
@@ -104,18 +104,18 @@
 
     def test_index_search(self):
         self.log_user()
-        response = self.app.get(url('admin_settings_search'))
+        response = self.app.get(base.url('admin_settings_search'))
 
     def test_index_system(self):
         self.log_user()
-        response = self.app.get(url('admin_settings_system'))
+        response = self.app.get(base.url('admin_settings_system'))
 
     def test_ga_code_active(self):
         self.log_user()
         old_title = 'Kallithea'
         old_realm = 'Kallithea authentication'
         new_ga_code = 'ga-test-123456789'
-        response = self.app.post(url('admin_settings_global'),
+        response = self.app.post(base.url('admin_settings_global'),
                         params=dict(title=old_title,
                                  realm=old_realm,
                                  ga_code=new_ga_code,
@@ -136,7 +136,7 @@
         old_title = 'Kallithea'
         old_realm = 'Kallithea authentication'
         new_ga_code = ''
-        response = self.app.post(url('admin_settings_global'),
+        response = self.app.post(base.url('admin_settings_global'),
                         params=dict(title=old_title,
                                  realm=old_realm,
                                  ga_code=new_ga_code,
@@ -156,7 +156,7 @@
         old_title = 'Kallithea'
         old_realm = 'Kallithea authentication'
         new_ga_code = ''
-        response = self.app.post(url('admin_settings_global'),
+        response = self.app.post(base.url('admin_settings_global'),
                         params=dict(title=old_title,
                                  realm=old_realm,
                                  ga_code=new_ga_code,
@@ -168,7 +168,7 @@
         self.checkSessionFlash(response, 'Updated application settings')
         assert Setting.get_app_settings()['captcha_private_key'] == '1234567890'
 
-        response = self.app.get(url('register'))
+        response = self.app.get(base.url('register'))
         response.mustcontain('captcha')
 
     def test_captcha_deactivate(self):
@@ -176,7 +176,7 @@
         old_title = 'Kallithea'
         old_realm = 'Kallithea authentication'
         new_ga_code = ''
-        response = self.app.post(url('admin_settings_global'),
+        response = self.app.post(base.url('admin_settings_global'),
                         params=dict(title=old_title,
                                  realm=old_realm,
                                  ga_code=new_ga_code,
@@ -188,7 +188,7 @@
         self.checkSessionFlash(response, 'Updated application settings')
         assert Setting.get_app_settings()['captcha_private_key'] == ''
 
-        response = self.app.get(url('register'))
+        response = self.app.get(base.url('register'))
         response.mustcontain(no=['captcha'])
 
     def test_title_change(self):
@@ -198,7 +198,7 @@
         old_realm = 'Kallithea authentication'
 
         for new_title in ['Changed', 'Żółwik', old_title]:
-            response = self.app.post(url('admin_settings_global'),
+            response = self.app.post(base.url('admin_settings_global'),
                         params=dict(title=new_title,
                                  realm=old_realm,
                                  ga_code='',
--- a/kallithea/tests/functional/test_admin_user_groups.py	Thu Jan 02 00:57:38 2020 +0100
+++ b/kallithea/tests/functional/test_admin_user_groups.py	Thu Jan 02 00:44:56 2020 +0100
@@ -1,23 +1,23 @@
 # -*- coding: utf-8 -*-
 from kallithea.model.db import Permission, UserGroup, UserGroupToPerm
 from kallithea.model.meta import Session
-from kallithea.tests.base import *
+from kallithea.tests import base
 
 
 TEST_USER_GROUP = u'admins_test'
 
 
-class TestAdminUsersGroupsController(TestController):
+class TestAdminUsersGroupsController(base.TestController):
 
     def test_index(self):
         self.log_user()
-        response = self.app.get(url('users_groups'))
+        response = self.app.get(base.url('users_groups'))
         # Test response...
 
     def test_create(self):
         self.log_user()
         users_group_name = TEST_USER_GROUP
-        response = self.app.post(url('users_groups'),
+        response = self.app.post(base.url('users_groups'),
                                  {'users_group_name': users_group_name,
                                   'user_group_description': u'DESC',
                                   'active': True,
@@ -30,19 +30,19 @@
                                '/edit">%s</a>' % TEST_USER_GROUP)
 
     def test_new(self):
-        response = self.app.get(url('new_users_group'))
+        response = self.app.get(base.url('new_users_group'))
 
     def test_update(self):
-        response = self.app.post(url('update_users_group', id=1), status=403)
+        response = self.app.post(base.url('update_users_group', id=1), status=403)
 
     def test_update_browser_fakeout(self):
-        response = self.app.post(url('update_users_group', id=1),
+        response = self.app.post(base.url('update_users_group', id=1),
                                  params=dict(_session_csrf_secret_token=self.session_csrf_secret_token()))
 
     def test_delete(self):
         self.log_user()
         users_group_name = TEST_USER_GROUP + 'another'
-        response = self.app.post(url('users_groups'),
+        response = self.app.post(base.url('users_groups'),
                                  {'users_group_name': users_group_name,
                                   'user_group_description': u'DESC',
                                   'active': True,
@@ -55,7 +55,7 @@
         gr = Session().query(UserGroup) \
             .filter(UserGroup.users_group_name == users_group_name).one()
 
-        response = self.app.post(url('delete_users_group', id=gr.users_group_id),
+        response = self.app.post(base.url('delete_users_group', id=gr.users_group_id),
             params={'_session_csrf_secret_token': self.session_csrf_secret_token()})
 
         gr = Session().query(UserGroup) \
@@ -66,7 +66,7 @@
     def test_default_perms_enable_repository_read_on_group(self):
         self.log_user()
         users_group_name = TEST_USER_GROUP + 'another2'
-        response = self.app.post(url('users_groups'),
+        response = self.app.post(base.url('users_groups'),
                                  {'users_group_name': users_group_name,
                                   'user_group_description': u'DESC',
                                   'active': True,
@@ -77,7 +77,7 @@
         self.checkSessionFlash(response,
                                'Created user group ')
         ## ENABLE REPO CREATE ON A GROUP
-        response = self.app.post(url('edit_user_group_default_perms_update',
+        response = self.app.post(base.url('edit_user_group_default_perms_update',
                                      id=ug.users_group_id),
                                  {'create_repo_perm': True,
                                   '_session_csrf_secret_token': self.session_csrf_secret_token()})
@@ -97,7 +97,7 @@
 
         ## DISABLE REPO CREATE ON A GROUP
         response = self.app.post(
-            url('edit_user_group_default_perms_update', id=ug.users_group_id),
+            base.url('edit_user_group_default_perms_update', id=ug.users_group_id),
             params={'_session_csrf_secret_token': self.session_csrf_secret_token()})
 
         response.follow()
@@ -118,7 +118,7 @@
         # DELETE !
         ug = UserGroup.get_by_group_name(users_group_name)
         ugid = ug.users_group_id
-        response = self.app.post(url('delete_users_group', id=ug.users_group_id),
+        response = self.app.post(base.url('delete_users_group', id=ug.users_group_id),
             params={'_session_csrf_secret_token': self.session_csrf_secret_token()})
         response = response.follow()
         gr = Session().query(UserGroup) \
@@ -135,7 +135,7 @@
     def test_default_perms_enable_repository_fork_on_group(self):
         self.log_user()
         users_group_name = TEST_USER_GROUP + 'another2'
-        response = self.app.post(url('users_groups'),
+        response = self.app.post(base.url('users_groups'),
                                  {'users_group_name': users_group_name,
                                   'user_group_description': u'DESC',
                                   'active': True,
@@ -146,7 +146,7 @@
         self.checkSessionFlash(response,
                                'Created user group ')
         ## ENABLE REPO CREATE ON A GROUP
-        response = self.app.post(url('edit_user_group_default_perms_update',
+        response = self.app.post(base.url('edit_user_group_default_perms_update',
                                      id=ug.users_group_id),
                                  {'fork_repo_perm': True, '_session_csrf_secret_token': self.session_csrf_secret_token()})
 
@@ -165,7 +165,7 @@
                     [ug.users_group_id, p3.permission_id]])
 
         ## DISABLE REPO CREATE ON A GROUP
-        response = self.app.post(url('edit_user_group_default_perms_update', id=ug.users_group_id),
+        response = self.app.post(base.url('edit_user_group_default_perms_update', id=ug.users_group_id),
             params={'_session_csrf_secret_token': self.session_csrf_secret_token()})
 
         response.follow()
@@ -185,7 +185,7 @@
         # DELETE !
         ug = UserGroup.get_by_group_name(users_group_name)
         ugid = ug.users_group_id
-        response = self.app.post(url('delete_users_group', id=ug.users_group_id),
+        response = self.app.post(base.url('delete_users_group', id=ug.users_group_id),
             params={'_session_csrf_secret_token': self.session_csrf_secret_token()})
         response = response.follow()
         gr = Session().query(UserGroup) \
@@ -201,5 +201,5 @@
         assert perms == []
 
     def test_delete_browser_fakeout(self):
-        response = self.app.post(url('delete_users_group', id=1),
+        response = self.app.post(base.url('delete_users_group', id=1),
                                  params=dict(_session_csrf_secret_token=self.session_csrf_secret_token()))
--- a/kallithea/tests/functional/test_admin_users.py	Thu Jan 02 00:57:38 2020 +0100
+++ b/kallithea/tests/functional/test_admin_users.py	Thu Jan 02 00:44:56 2020 +0100
@@ -24,7 +24,7 @@
 from kallithea.model.db import Permission, RepoGroup, User, UserApiKeys, UserSshKeys
 from kallithea.model.meta import Session
 from kallithea.model.user import UserModel
-from kallithea.tests.base import *
+from kallithea.tests import base
 from kallithea.tests.fixture import Fixture
 
 
@@ -43,7 +43,7 @@
         fixture.destroy_repo_group(repo_group)
 
 
-class TestAdminUsersController(TestController):
+class TestAdminUsersController(base.TestController):
     test_user_1 = 'testme'
 
     @classmethod
@@ -54,7 +54,7 @@
 
     def test_index(self):
         self.log_user()
-        response = self.app.get(url('users'))
+        response = self.app.get(base.url('users'))
         # TODO: Test response...
 
     def test_create(self):
@@ -66,7 +66,7 @@
         lastname = u'lastname'
         email = 'mail@example.com'
 
-        response = self.app.post(url('new_user'),
+        response = self.app.post(base.url('new_user'),
             {'username': username,
              'password': password,
              'password_confirmation': password_confirmation,
@@ -102,7 +102,7 @@
         lastname = u'lastname'
         email = 'errmail.example.com'
 
-        response = self.app.post(url('new_user'),
+        response = self.app.post(base.url('new_user'),
             {'username': username,
              'password': password,
              'name': name,
@@ -126,9 +126,9 @@
 
     def test_new(self):
         self.log_user()
-        response = self.app.get(url('new_user'))
+        response = self.app.get(base.url('new_user'))
 
-    @parametrize('name,attrs',
+    @base.parametrize('name,attrs',
         [('firstname', {'firstname': 'new_username'}),
          ('lastname', {'lastname': 'new_username'}),
          ('admin', {'admin': True}),
@@ -167,7 +167,7 @@
             # not filled so we use creation data
 
         params.update({'_session_csrf_secret_token': self.session_csrf_secret_token()})
-        response = self.app.post(url('update_user', id=usr.user_id), params)
+        response = self.app.post(base.url('update_user', id=usr.user_id), params)
         self.checkSessionFlash(response, 'User updated successfully')
         params.pop('_session_csrf_secret_token')
 
@@ -186,7 +186,7 @@
 
         new_user = Session().query(User) \
             .filter(User.username == username).one()
-        response = self.app.post(url('delete_user', id=new_user.user_id),
+        response = self.app.post(base.url('delete_user', id=new_user.user_id),
             params={'_session_csrf_secret_token': self.session_csrf_secret_token()})
 
         self.checkSessionFlash(response, 'Successfully deleted user')
@@ -201,18 +201,18 @@
 
         new_user = Session().query(User) \
             .filter(User.username == username).one()
-        response = self.app.post(url('delete_user', id=new_user.user_id),
+        response = self.app.post(base.url('delete_user', id=new_user.user_id),
             params={'_session_csrf_secret_token': self.session_csrf_secret_token()})
         self.checkSessionFlash(response, 'User &quot;%s&quot; still '
                                'owns 1 repositories and cannot be removed. '
                                'Switch owners or remove those repositories: '
                                '%s' % (username, reponame))
 
-        response = self.app.post(url('delete_repo', repo_name=reponame),
+        response = self.app.post(base.url('delete_repo', repo_name=reponame),
             params={'_session_csrf_secret_token': self.session_csrf_secret_token()})
         self.checkSessionFlash(response, 'Deleted repository %s' % reponame)
 
-        response = self.app.post(url('delete_user', id=new_user.user_id),
+        response = self.app.post(base.url('delete_user', id=new_user.user_id),
             params={'_session_csrf_secret_token': self.session_csrf_secret_token()})
         self.checkSessionFlash(response, 'Successfully deleted user')
 
@@ -223,7 +223,7 @@
 
         self.log_user()
 
-        response = self.app.post(url('delete_user', id=new_user.user_id),
+        response = self.app.post(base.url('delete_user', id=new_user.user_id),
             params={'_session_csrf_secret_token': self.session_csrf_secret_token()})
         self.checkSessionFlash(response, 'User &quot;%s&quot; still '
                                'owns 1 repository groups and cannot be removed. '
@@ -232,13 +232,13 @@
 
         # Relevant _if_ the user deletion succeeded to make sure we can render groups without owner
         # rg = RepoGroup.get_by_group_name(group_name=groupname)
-        # response = self.app.get(url('repos_groups', id=rg.group_id))
+        # response = self.app.get(base.url('repos_groups', id=rg.group_id))
 
-        response = self.app.post(url('delete_repo_group', group_name=groupname),
+        response = self.app.post(base.url('delete_repo_group', group_name=groupname),
             params={'_session_csrf_secret_token': self.session_csrf_secret_token()})
         self.checkSessionFlash(response, 'Removed repository group %s' % groupname)
 
-        response = self.app.post(url('delete_user', id=new_user.user_id),
+        response = self.app.post(base.url('delete_user', id=new_user.user_id),
             params={'_session_csrf_secret_token': self.session_csrf_secret_token()})
         self.checkSessionFlash(response, 'Successfully deleted user')
 
@@ -252,7 +252,7 @@
 
         new_user = Session().query(User) \
             .filter(User.username == username).one()
-        response = self.app.post(url('delete_user', id=new_user.user_id),
+        response = self.app.post(base.url('delete_user', id=new_user.user_id),
             params={'_session_csrf_secret_token': self.session_csrf_secret_token()})
         self.checkSessionFlash(response, 'User &quot;%s&quot; still '
                                'owns 1 user groups and cannot be removed. '
@@ -260,19 +260,19 @@
                                '%s' % (username, groupname))
 
         # TODO: why do this fail?
-        #response = self.app.delete(url('delete_users_group', id=groupname))
+        #response = self.app.delete(base.url('delete_users_group', id=groupname))
         #self.checkSessionFlash(response, 'Removed user group %s' % groupname)
 
         fixture.destroy_user_group(ug.users_group_id)
 
-        response = self.app.post(url('delete_user', id=new_user.user_id),
+        response = self.app.post(base.url('delete_user', id=new_user.user_id),
             params={'_session_csrf_secret_token': self.session_csrf_secret_token()})
         self.checkSessionFlash(response, 'Successfully deleted user')
 
     def test_edit(self):
         self.log_user()
-        user = User.get_by_username(TEST_USER_ADMIN_LOGIN)
-        response = self.app.get(url('edit_user', id=user.user_id))
+        user = User.get_by_username(base.TEST_USER_ADMIN_LOGIN)
+        response = self.app.get(base.url('edit_user', id=user.user_id))
 
     def test_add_perm_create_repo(self):
         self.log_user()
@@ -290,7 +290,7 @@
             assert UserModel().has_perm(user, perm_none) == False
             assert UserModel().has_perm(user, perm_create) == False
 
-            response = self.app.post(url('edit_user_perms_update', id=uid),
+            response = self.app.post(base.url('edit_user_perms_update', id=uid),
                                      params=dict(create_repo_perm=True,
                                                  _session_csrf_secret_token=self.session_csrf_secret_token()))
 
@@ -320,7 +320,7 @@
             assert UserModel().has_perm(user, perm_none) == False
             assert UserModel().has_perm(user, perm_create) == False
 
-            response = self.app.post(url('edit_user_perms_update', id=uid),
+            response = self.app.post(base.url('edit_user_perms_update', id=uid),
                                      params=dict(_session_csrf_secret_token=self.session_csrf_secret_token()))
 
             perm_none = Permission.get_by_key('hg.create.none')
@@ -349,7 +349,7 @@
             assert UserModel().has_perm(user, perm_none) == False
             assert UserModel().has_perm(user, perm_fork) == False
 
-            response = self.app.post(url('edit_user_perms_update', id=uid),
+            response = self.app.post(base.url('edit_user_perms_update', id=uid),
                                      params=dict(create_repo_perm=True,
                                                  _session_csrf_secret_token=self.session_csrf_secret_token()))
 
@@ -379,7 +379,7 @@
             assert UserModel().has_perm(user, perm_none) == False
             assert UserModel().has_perm(user, perm_fork) == False
 
-            response = self.app.post(url('edit_user_perms_update', id=uid),
+            response = self.app.post(base.url('edit_user_perms_update', id=uid),
                                      params=dict(_session_csrf_secret_token=self.session_csrf_secret_token()))
 
             perm_none = Permission.get_by_key('hg.create.none')
@@ -394,11 +394,11 @@
 
     def test_ips(self):
         self.log_user()
-        user = User.get_by_username(TEST_USER_REGULAR_LOGIN)
-        response = self.app.get(url('edit_user_ips', id=user.user_id))
+        user = User.get_by_username(base.TEST_USER_REGULAR_LOGIN)
+        response = self.app.get(base.url('edit_user_ips', id=user.user_id))
         response.mustcontain('All IP addresses are allowed')
 
-    @parametrize('test_name,ip,ip_range,failure', [
+    @base.parametrize('test_name,ip,ip_range,failure', [
         ('127/24', '127.0.0.1/24', '127.0.0.0 - 127.0.0.255', False),
         ('10/32', '10.0.0.10/32', '10.0.0.10 - 10.0.0.10', False),
         ('0/16', '0.0.0.0/16', '0.0.0.0 - 0.0.255.255', False),
@@ -408,26 +408,26 @@
     ])
     def test_add_ip(self, test_name, ip, ip_range, failure, auto_clear_ip_permissions):
         self.log_user()
-        user = User.get_by_username(TEST_USER_REGULAR_LOGIN)
+        user = User.get_by_username(base.TEST_USER_REGULAR_LOGIN)
         user_id = user.user_id
 
-        response = self.app.post(url('edit_user_ips_update', id=user_id),
+        response = self.app.post(base.url('edit_user_ips_update', id=user_id),
                                  params=dict(new_ip=ip, _session_csrf_secret_token=self.session_csrf_secret_token()))
 
         if failure:
             self.checkSessionFlash(response, 'Please enter a valid IPv4 or IPv6 address')
-            response = self.app.get(url('edit_user_ips', id=user_id))
+            response = self.app.get(base.url('edit_user_ips', id=user_id))
             response.mustcontain(no=[ip])
             response.mustcontain(no=[ip_range])
 
         else:
-            response = self.app.get(url('edit_user_ips', id=user_id))
+            response = self.app.get(base.url('edit_user_ips', id=user_id))
             response.mustcontain(ip)
             response.mustcontain(ip_range)
 
     def test_delete_ip(self, auto_clear_ip_permissions):
         self.log_user()
-        user = User.get_by_username(TEST_USER_REGULAR_LOGIN)
+        user = User.get_by_username(base.TEST_USER_REGULAR_LOGIN)
         user_id = user.user_id
         ip = '127.0.0.1/32'
         ip_range = '127.0.0.1 - 127.0.0.1'
@@ -436,14 +436,14 @@
             Session().commit()
         new_ip_id = new_ip.ip_id
 
-        response = self.app.get(url('edit_user_ips', id=user_id))
+        response = self.app.get(base.url('edit_user_ips', id=user_id))
         response.mustcontain(ip)
         response.mustcontain(ip_range)
 
-        self.app.post(url('edit_user_ips_delete', id=user_id),
+        self.app.post(base.url('edit_user_ips_delete', id=user_id),
                       params=dict(del_ip_id=new_ip_id, _session_csrf_secret_token=self.session_csrf_secret_token()))
 
-        response = self.app.get(url('edit_user_ips', id=user_id))
+        response = self.app.get(base.url('edit_user_ips', id=user_id))
         response.mustcontain('All IP addresses are allowed')
         response.mustcontain(no=[ip])
         response.mustcontain(no=[ip_range])
@@ -451,22 +451,22 @@
     def test_api_keys(self):
         self.log_user()
 
-        user = User.get_by_username(TEST_USER_REGULAR_LOGIN)
-        response = self.app.get(url('edit_user_api_keys', id=user.user_id))
+        user = User.get_by_username(base.TEST_USER_REGULAR_LOGIN)
+        response = self.app.get(base.url('edit_user_api_keys', id=user.user_id))
         response.mustcontain(user.api_key)
         response.mustcontain('Expires: Never')
 
-    @parametrize('desc,lifetime', [
+    @base.parametrize('desc,lifetime', [
         ('forever', -1),
         ('5mins', 60*5),
         ('30days', 60*60*24*30),
     ])
     def test_add_api_keys(self, desc, lifetime):
         self.log_user()
-        user = User.get_by_username(TEST_USER_REGULAR_LOGIN)
+        user = User.get_by_username(base.TEST_USER_REGULAR_LOGIN)
         user_id = user.user_id
 
-        response = self.app.post(url('edit_user_api_keys_update', id=user_id),
+        response = self.app.post(base.url('edit_user_api_keys_update', id=user_id),
                  {'description': desc, 'lifetime': lifetime, '_session_csrf_secret_token': self.session_csrf_secret_token()})
         self.checkSessionFlash(response, 'API key successfully created')
         try:
@@ -481,10 +481,10 @@
 
     def test_remove_api_key(self):
         self.log_user()
-        user = User.get_by_username(TEST_USER_REGULAR_LOGIN)
+        user = User.get_by_username(base.TEST_USER_REGULAR_LOGIN)
         user_id = user.user_id
 
-        response = self.app.post(url('edit_user_api_keys_update', id=user_id),
+        response = self.app.post(base.url('edit_user_api_keys_update', id=user_id),
                 {'description': 'desc', 'lifetime': -1, '_session_csrf_secret_token': self.session_csrf_secret_token()})
         self.checkSessionFlash(response, 'API key successfully created')
         response = response.follow()
@@ -493,7 +493,7 @@
         keys = UserApiKeys.query().filter(UserApiKeys.user_id == user_id).all()
         assert 1 == len(keys)
 
-        response = self.app.post(url('edit_user_api_keys_delete', id=user_id),
+        response = self.app.post(base.url('edit_user_api_keys_delete', id=user_id),
                  {'del_api_key': keys[0].api_key, '_session_csrf_secret_token': self.session_csrf_secret_token()})
         self.checkSessionFlash(response, 'API key successfully deleted')
         keys = UserApiKeys.query().filter(UserApiKeys.user_id == user_id).all()
@@ -501,14 +501,14 @@
 
     def test_reset_main_api_key(self):
         self.log_user()
-        user = User.get_by_username(TEST_USER_REGULAR_LOGIN)
+        user = User.get_by_username(base.TEST_USER_REGULAR_LOGIN)
         user_id = user.user_id
         api_key = user.api_key
-        response = self.app.get(url('edit_user_api_keys', id=user_id))
+        response = self.app.get(base.url('edit_user_api_keys', id=user_id))
         response.mustcontain(api_key)
         response.mustcontain('Expires: Never')
 
-        response = self.app.post(url('edit_user_api_keys_delete', id=user_id),
+        response = self.app.post(base.url('edit_user_api_keys_delete', id=user_id),
                  {'del_api_key_builtin': api_key, '_session_csrf_secret_token': self.session_csrf_secret_token()})
         self.checkSessionFlash(response, 'API key successfully reset')
         response = response.follow()
@@ -520,10 +520,10 @@
         fingerprint = u'Ke3oUCNJM87P0jJTb3D+e3shjceP2CqMpQKVd75E9I8'
 
         self.log_user()
-        user = User.get_by_username(TEST_USER_REGULAR_LOGIN)
+        user = User.get_by_username(base.TEST_USER_REGULAR_LOGIN)
         user_id = user.user_id
 
-        response = self.app.post(url('edit_user_ssh_keys', id=user_id),
+        response = self.app.post(base.url('edit_user_ssh_keys', id=user_id),
                                  {'description': description,
                                   'public_key': public_key,
                                   '_session_csrf_secret_token': self.session_csrf_secret_token()})
@@ -543,10 +543,10 @@
         fingerprint = u'Ke3oUCNJM87P0jJTb3D+e3shjceP2CqMpQKVd75E9I8'
 
         self.log_user()
-        user = User.get_by_username(TEST_USER_REGULAR_LOGIN)
+        user = User.get_by_username(base.TEST_USER_REGULAR_LOGIN)
         user_id = user.user_id
 
-        response = self.app.post(url('edit_user_ssh_keys', id=user_id),
+        response = self.app.post(base.url('edit_user_ssh_keys', id=user_id),
                                  {'description': description,
                                   'public_key': public_key,
                                   '_session_csrf_secret_token': self.session_csrf_secret_token()})
@@ -555,7 +555,7 @@
         ssh_key = UserSshKeys.query().filter(UserSshKeys.user_id == user_id).one()
         assert ssh_key.description == u'me@localhost'
 
-        response = self.app.post(url('edit_user_ssh_keys_delete', id=user_id),
+        response = self.app.post(base.url('edit_user_ssh_keys_delete', id=user_id),
                                  {'del_public_key': ssh_key.public_key,
                                   '_session_csrf_secret_token': self.session_csrf_secret_token()})
         self.checkSessionFlash(response, 'SSH key successfully deleted')
@@ -563,7 +563,7 @@
         assert 0 == len(keys)
 
 
-class TestAdminUsersController_unittest(TestController):
+class TestAdminUsersController_unittest(base.TestController):
     """ Unit tests for the users controller """
 
     def test_get_user_or_raise_if_default(self, monkeypatch, test_context_fixture):
@@ -574,14 +574,14 @@
 
         u = UsersController()
         # a regular user should work correctly
-        user = User.get_by_username(TEST_USER_REGULAR_LOGIN)
+        user = User.get_by_username(base.TEST_USER_REGULAR_LOGIN)
         assert u._get_user_or_raise_if_default(user.user_id) == user
         # the default user should raise
         with pytest.raises(HTTPNotFound):
             u._get_user_or_raise_if_default(User.get_default_user().user_id)
 
 
-class TestAdminUsersControllerForDefaultUser(TestController):
+class TestAdminUsersControllerForDefaultUser(base.TestController):
     """
     Edit actions on the default user are not allowed.
     Validate that they throw a 404 exception.
@@ -589,59 +589,59 @@
     def test_edit_default_user(self):
         self.log_user()
         user = User.get_default_user()
-        response = self.app.get(url('edit_user', id=user.user_id), status=404)
+        response = self.app.get(base.url('edit_user', id=user.user_id), status=404)
 
     def test_edit_advanced_default_user(self):
         self.log_user()
         user = User.get_default_user()
-        response = self.app.get(url('edit_user_advanced', id=user.user_id), status=404)
+        response = self.app.get(base.url('edit_user_advanced', id=user.user_id), status=404)
 
     # API keys
     def test_edit_api_keys_default_user(self):
         self.log_user()
         user = User.get_default_user()
-        response = self.app.get(url('edit_user_api_keys', id=user.user_id), status=404)
+        response = self.app.get(base.url('edit_user_api_keys', id=user.user_id), status=404)
 
     def test_add_api_keys_default_user(self):
         self.log_user()
         user = User.get_default_user()
-        response = self.app.post(url('edit_user_api_keys_update', id=user.user_id),
+        response = self.app.post(base.url('edit_user_api_keys_update', id=user.user_id),
                  {'_session_csrf_secret_token': self.session_csrf_secret_token()}, status=404)
 
     def test_delete_api_keys_default_user(self):
         self.log_user()
         user = User.get_default_user()
-        response = self.app.post(url('edit_user_api_keys_delete', id=user.user_id),
+        response = self.app.post(base.url('edit_user_api_keys_delete', id=user.user_id),
                  {'_session_csrf_secret_token': self.session_csrf_secret_token()}, status=404)
 
     # Permissions
     def test_edit_perms_default_user(self):
         self.log_user()
         user = User.get_default_user()
-        response = self.app.get(url('edit_user_perms', id=user.user_id), status=404)
+        response = self.app.get(base.url('edit_user_perms', id=user.user_id), status=404)
 
     def test_update_perms_default_user(self):
         self.log_user()
         user = User.get_default_user()
-        response = self.app.post(url('edit_user_perms_update', id=user.user_id),
+        response = self.app.post(base.url('edit_user_perms_update', id=user.user_id),
                  {'_session_csrf_secret_token': self.session_csrf_secret_token()}, status=404)
 
     # Emails
     def test_edit_emails_default_user(self):
         self.log_user()
         user = User.get_default_user()
-        response = self.app.get(url('edit_user_emails', id=user.user_id), status=404)
+        response = self.app.get(base.url('edit_user_emails', id=user.user_id), status=404)
 
     def test_add_emails_default_user(self):
         self.log_user()
         user = User.get_default_user()
-        response = self.app.post(url('edit_user_emails_update', id=user.user_id),
+        response = self.app.post(base.url('edit_user_emails_update', id=user.user_id),
                  {'_session_csrf_secret_token': self.session_csrf_secret_token()}, status=404)
 
     def test_delete_emails_default_user(self):
         self.log_user()
         user = User.get_default_user()
-        response = self.app.post(url('edit_user_emails_delete', id=user.user_id),
+        response = self.app.post(base.url('edit_user_emails_delete', id=user.user_id),
                  {'_session_csrf_secret_token': self.session_csrf_secret_token()}, status=404)
 
     # IP addresses
@@ -650,4 +650,4 @@
     def test_edit_ip_default_user(self):
         self.log_user()
         user = User.get_default_user()
-        response = self.app.get(url('edit_user_ips', id=user.user_id), status=404)
+        response = self.app.get(base.url('edit_user_ips', id=user.user_id), status=404)
--- a/kallithea/tests/functional/test_changelog.py	Thu Jan 02 00:57:38 2020 +0100
+++ b/kallithea/tests/functional/test_changelog.py	Thu Jan 02 00:44:56 2020 +0100
@@ -1,12 +1,12 @@
-from kallithea.tests.base import *
+from kallithea.tests import base
 
 
-class TestChangelogController(TestController):
+class TestChangelogController(base.TestController):
 
     def test_index_hg(self):
         self.log_user()
-        response = self.app.get(url(controller='changelog', action='index',
-                                    repo_name=HG_REPO))
+        response = self.app.get(base.url(controller='changelog', action='index',
+                                    repo_name=base.HG_REPO))
 
         response.mustcontain('''id="chg_20" class="mergerow"''')
         response.mustcontain(
@@ -17,7 +17,7 @@
         )
         # rev 640: code garden
         response.mustcontain(
-            """<a class="changeset_hash" href="/%s/changeset/0a4e54a4460401d6dbbd6a3604b17cd2b3606b82">r640:0a4e54a44604</a>""" % HG_REPO
+            """<a class="changeset_hash" href="/%s/changeset/0a4e54a4460401d6dbbd6a3604b17cd2b3606b82">r640:0a4e54a44604</a>""" % base.HG_REPO
         )
         response.mustcontain("""code garden""")
 
@@ -26,18 +26,18 @@
     def test_index_pagination_hg(self):
         self.log_user()
         # pagination
-        self.app.get(url(controller='changelog', action='index',
-                                    repo_name=HG_REPO), {'page': 1})
-        self.app.get(url(controller='changelog', action='index',
-                                    repo_name=HG_REPO), {'page': 2})
-        self.app.get(url(controller='changelog', action='index',
-                                    repo_name=HG_REPO), {'page': 3})
-        self.app.get(url(controller='changelog', action='index',
-                                    repo_name=HG_REPO), {'page': 4})
-        self.app.get(url(controller='changelog', action='index',
-                                    repo_name=HG_REPO), {'page': 5})
-        response = self.app.get(url(controller='changelog', action='index',
-                                    repo_name=HG_REPO), {'page': 6, 'size': 20})
+        self.app.get(base.url(controller='changelog', action='index',
+                                    repo_name=base.HG_REPO), {'page': 1})
+        self.app.get(base.url(controller='changelog', action='index',
+                                    repo_name=base.HG_REPO), {'page': 2})
+        self.app.get(base.url(controller='changelog', action='index',
+                                    repo_name=base.HG_REPO), {'page': 3})
+        self.app.get(base.url(controller='changelog', action='index',
+                                    repo_name=base.HG_REPO), {'page': 4})
+        self.app.get(base.url(controller='changelog', action='index',
+                                    repo_name=base.HG_REPO), {'page': 5})
+        response = self.app.get(base.url(controller='changelog', action='index',
+                                    repo_name=base.HG_REPO), {'page': 6, 'size': 20})
 
         # Test response after pagination...
         response.mustcontain(
@@ -53,8 +53,8 @@
 
     def test_index_git(self):
         self.log_user()
-        response = self.app.get(url(controller='changelog', action='index',
-                                    repo_name=GIT_REPO))
+        response = self.app.get(base.url(controller='changelog', action='index',
+                                    repo_name=base.GIT_REPO))
 
         response.mustcontain('''id="chg_20" class=""''') # why no mergerow for git?
         response.mustcontain(
@@ -82,18 +82,18 @@
     def test_index_pagination_git(self):
         self.log_user()
         # pagination
-        self.app.get(url(controller='changelog', action='index',
-                                    repo_name=GIT_REPO), {'page': 1})
-        self.app.get(url(controller='changelog', action='index',
-                                    repo_name=GIT_REPO), {'page': 2})
-        self.app.get(url(controller='changelog', action='index',
-                                    repo_name=GIT_REPO), {'page': 3})
-        self.app.get(url(controller='changelog', action='index',
-                                    repo_name=GIT_REPO), {'page': 4})
-        self.app.get(url(controller='changelog', action='index',
-                                    repo_name=GIT_REPO), {'page': 5})
-        response = self.app.get(url(controller='changelog', action='index',
-                                    repo_name=GIT_REPO), {'page': 6, 'size': 20})
+        self.app.get(base.url(controller='changelog', action='index',
+                                    repo_name=base.GIT_REPO), {'page': 1})
+        self.app.get(base.url(controller='changelog', action='index',
+                                    repo_name=base.GIT_REPO), {'page': 2})
+        self.app.get(base.url(controller='changelog', action='index',
+                                    repo_name=base.GIT_REPO), {'page': 3})
+        self.app.get(base.url(controller='changelog', action='index',
+                                    repo_name=base.GIT_REPO), {'page': 4})
+        self.app.get(base.url(controller='changelog', action='index',
+                                    repo_name=base.GIT_REPO), {'page': 5})
+        response = self.app.get(base.url(controller='changelog', action='index',
+                                    repo_name=base.GIT_REPO), {'page': 6, 'size': 20})
 
         # Test response after pagination...
         response.mustcontain(
@@ -109,9 +109,9 @@
 
     def test_index_hg_with_filenode(self):
         self.log_user()
-        response = self.app.get(url(controller='changelog', action='index',
+        response = self.app.get(base.url(controller='changelog', action='index',
                                     revision='tip', f_path='/vcs/exceptions.py',
-                                    repo_name=HG_REPO))
+                                    repo_name=base.HG_REPO))
         # history commits messages
         response.mustcontain('Added exceptions module, this time for real')
         response.mustcontain('Added not implemented hg backend test case')
@@ -120,9 +120,9 @@
 
     def test_index_git_with_filenode(self):
         self.log_user()
-        response = self.app.get(url(controller='changelog', action='index',
+        response = self.app.get(base.url(controller='changelog', action='index',
                                     revision='tip', f_path='/vcs/exceptions.py',
-                                    repo_name=GIT_REPO))
+                                    repo_name=base.GIT_REPO))
         # history commits messages
         response.mustcontain('Added exceptions module, this time for real')
         response.mustcontain('Added not implemented hg backend test case')
@@ -130,28 +130,28 @@
 
     def test_index_hg_with_filenode_that_is_dirnode(self):
         self.log_user()
-        response = self.app.get(url(controller='changelog', action='index',
+        response = self.app.get(base.url(controller='changelog', action='index',
                                     revision='tip', f_path='/tests',
-                                    repo_name=HG_REPO))
+                                    repo_name=base.HG_REPO))
         assert response.status == '302 Found'
 
     def test_index_git_with_filenode_that_is_dirnode(self):
         self.log_user()
-        response = self.app.get(url(controller='changelog', action='index',
+        response = self.app.get(base.url(controller='changelog', action='index',
                                     revision='tip', f_path='/tests',
-                                    repo_name=GIT_REPO))
+                                    repo_name=base.GIT_REPO))
         assert response.status == '302 Found'
 
     def test_index_hg_with_filenode_not_existing(self):
         self.log_user()
-        response = self.app.get(url(controller='changelog', action='index',
+        response = self.app.get(base.url(controller='changelog', action='index',
                                     revision='tip', f_path='/wrong_path',
-                                    repo_name=HG_REPO))
+                                    repo_name=base.HG_REPO))
         assert response.status == '302 Found'
 
     def test_index_git_with_filenode_not_existing(self):
         self.log_user()
-        response = self.app.get(url(controller='changelog', action='index',
+        response = self.app.get(base.url(controller='changelog', action='index',
                                     revision='tip', f_path='/wrong_path',
-                                    repo_name=GIT_REPO))
+                                    repo_name=base.GIT_REPO))
         assert response.status == '302 Found'
--- a/kallithea/tests/functional/test_changeset.py	Thu Jan 02 00:57:38 2020 +0100
+++ b/kallithea/tests/functional/test_changeset.py	Thu Jan 02 00:44:56 2020 +0100
@@ -1,24 +1,24 @@
-from kallithea.tests.base import *
+from kallithea.tests import base
 
 
-class TestChangesetController(TestController):
+class TestChangesetController(base.TestController):
 
     def test_index(self):
-        response = self.app.get(url(controller='changeset', action='index',
-                                    repo_name=HG_REPO, revision='tip'))
+        response = self.app.get(base.url(controller='changeset', action='index',
+                                    repo_name=base.HG_REPO, revision='tip'))
         # Test response...
 
     def test_changeset_range(self):
-        #print self.app.get(url(controller='changelog', action='index', repo_name=HG_REPO))
+        #print self.app.get(base.url(controller='changelog', action='index', repo_name=base.HG_REPO))
 
-        response = self.app.get(url(controller='changeset', action='index',
-                                    repo_name=HG_REPO, revision='a53d9201d4bc278910d416d94941b7ea007ecd52...96507bd11ecc815ebc6270fdf6db110928c09c1e'))
+        response = self.app.get(base.url(controller='changeset', action='index',
+                                    repo_name=base.HG_REPO, revision='a53d9201d4bc278910d416d94941b7ea007ecd52...96507bd11ecc815ebc6270fdf6db110928c09c1e'))
 
-        response = self.app.get(url(controller='changeset', action='changeset_raw',
-                                    repo_name=HG_REPO, revision='a53d9201d4bc278910d416d94941b7ea007ecd52'))
+        response = self.app.get(base.url(controller='changeset', action='changeset_raw',
+                                    repo_name=base.HG_REPO, revision='a53d9201d4bc278910d416d94941b7ea007ecd52'))
 
-        response = self.app.get(url(controller='changeset', action='changeset_patch',
-                                    repo_name=HG_REPO, revision='a53d9201d4bc278910d416d94941b7ea007ecd52'))
+        response = self.app.get(base.url(controller='changeset', action='changeset_patch',
+                                    repo_name=base.HG_REPO, revision='a53d9201d4bc278910d416d94941b7ea007ecd52'))
 
-        response = self.app.get(url(controller='changeset', action='changeset_download',
-                                    repo_name=HG_REPO, revision='a53d9201d4bc278910d416d94941b7ea007ecd52'))
+        response = self.app.get(base.url(controller='changeset', action='changeset_download',
+                                    repo_name=base.HG_REPO, revision='a53d9201d4bc278910d416d94941b7ea007ecd52'))
--- a/kallithea/tests/functional/test_changeset_pullrequests_comments.py	Thu Jan 02 00:57:38 2020 +0100
+++ b/kallithea/tests/functional/test_changeset_pullrequests_comments.py	Thu Jan 02 00:44:56 2020 +0100
@@ -3,10 +3,10 @@
 from kallithea.model.changeset_status import ChangesetStatusModel
 from kallithea.model.db import ChangesetComment, PullRequest
 from kallithea.model.meta import Session
-from kallithea.tests.base import *
+from kallithea.tests import base
 
 
-class TestChangeSetCommentsController(TestController):
+class TestChangeSetCommentsController(base.TestController):
 
     def setup_method(self, method):
         for x in ChangesetComment.query().all():
@@ -19,14 +19,14 @@
         text = u'general comment on changeset'
 
         params = {'text': text, '_session_csrf_secret_token': self.session_csrf_secret_token()}
-        response = self.app.post(url(controller='changeset', action='comment',
-                                     repo_name=HG_REPO, revision=rev),
+        response = self.app.post(base.url(controller='changeset', action='comment',
+                                     repo_name=base.HG_REPO, revision=rev),
                                      params=params, extra_environ={'HTTP_X_PARTIAL_XHR': '1'})
         # Test response...
         assert response.status == '200 OK'
 
-        response = self.app.get(url(controller='changeset', action='index',
-                                repo_name=HG_REPO, revision=rev))
+        response = self.app.get(base.url(controller='changeset', action='index',
+                                repo_name=base.HG_REPO, revision=rev))
         response.mustcontain(
             '''<div class="comments-number">'''
             ''' 1 comment (0 inline, 1 general)'''
@@ -44,14 +44,14 @@
         line = 'n1'
 
         params = {'text': text, 'f_path': f_path, 'line': line, '_session_csrf_secret_token': self.session_csrf_secret_token()}
-        response = self.app.post(url(controller='changeset', action='comment',
-                                     repo_name=HG_REPO, revision=rev),
+        response = self.app.post(base.url(controller='changeset', action='comment',
+                                     repo_name=base.HG_REPO, revision=rev),
                                      params=params, extra_environ={'HTTP_X_PARTIAL_XHR': '1'})
         # Test response...
         assert response.status == '200 OK'
 
-        response = self.app.get(url(controller='changeset', action='index',
-                                repo_name=HG_REPO, revision=rev))
+        response = self.app.get(base.url(controller='changeset', action='index',
+                                repo_name=base.HG_REPO, revision=rev))
         response.mustcontain(
             '''<div class="comments-number">'''
             ''' 1 comment (1 inline, 0 general)'''
@@ -70,22 +70,22 @@
         self.log_user()
 
         rev = '27cd5cce30c96924232dffcd24178a07ffeb5dfc'
-        text = u'@%s check CommentOnRevision' % TEST_USER_REGULAR_LOGIN
+        text = u'@%s check CommentOnRevision' % base.TEST_USER_REGULAR_LOGIN
 
         params = {'text': text, '_session_csrf_secret_token': self.session_csrf_secret_token()}
-        response = self.app.post(url(controller='changeset', action='comment',
-                                     repo_name=HG_REPO, revision=rev),
+        response = self.app.post(base.url(controller='changeset', action='comment',
+                                     repo_name=base.HG_REPO, revision=rev),
                                      params=params, extra_environ={'HTTP_X_PARTIAL_XHR': '1'})
         # Test response...
         assert response.status == '200 OK'
 
-        response = self.app.get(url(controller='changeset', action='index',
-                                repo_name=HG_REPO, revision=rev))
+        response = self.app.get(base.url(controller='changeset', action='index',
+                                repo_name=base.HG_REPO, revision=rev))
         response.mustcontain(
             '''<div class="comments-number">'''
             ''' 1 comment (0 inline, 1 general)'''
         )
-        response.mustcontain('<b>@%s</b> check CommentOnRevision' % TEST_USER_REGULAR_LOGIN)
+        response.mustcontain('<b>@%s</b> check CommentOnRevision' % base.TEST_USER_REGULAR_LOGIN)
 
         # test DB
         assert ChangesetComment.query().count() == 1
@@ -97,14 +97,14 @@
 
         params = {'text': text, 'changeset_status': 'rejected',
                 '_session_csrf_secret_token': self.session_csrf_secret_token()}
-        response = self.app.post(url(controller='changeset', action='comment',
-                                     repo_name=HG_REPO, revision=rev),
+        response = self.app.post(base.url(controller='changeset', action='comment',
+                                     repo_name=base.HG_REPO, revision=rev),
                                      params=params, extra_environ={'HTTP_X_PARTIAL_XHR': '1'})
         # Test response...
         assert response.status == '200 OK'
 
-        response = self.app.get(url(controller='changeset', action='index',
-                                repo_name=HG_REPO, revision=rev))
+        response = self.app.get(base.url(controller='changeset', action='index',
+                                repo_name=base.HG_REPO, revision=rev))
         response.mustcontain(
             '''<div class="comments-number">'''
             ''' 1 comment (0 inline, 1 general)'''
@@ -115,7 +115,7 @@
         assert ChangesetComment.query().count() == 1
 
         # check status
-        status = ChangesetStatusModel().get_status(repo=HG_REPO, revision=rev)
+        status = ChangesetStatusModel().get_status(repo=base.HG_REPO, revision=rev)
         assert status == 'rejected'
 
     def test_delete(self):
@@ -124,24 +124,24 @@
         text = u'general comment on changeset to be deleted'
 
         params = {'text': text, '_session_csrf_secret_token': self.session_csrf_secret_token()}
-        response = self.app.post(url(controller='changeset', action='comment',
-                                     repo_name=HG_REPO, revision=rev),
+        response = self.app.post(base.url(controller='changeset', action='comment',
+                                     repo_name=base.HG_REPO, revision=rev),
                                      params=params, extra_environ={'HTTP_X_PARTIAL_XHR': '1'})
 
         comments = ChangesetComment.query().all()
         assert len(comments) == 1
         comment_id = comments[0].comment_id
 
-        self.app.post(url("changeset_comment_delete",
-                                    repo_name=HG_REPO,
+        self.app.post(base.url("changeset_comment_delete",
+                                    repo_name=base.HG_REPO,
                                     comment_id=comment_id),
             params={'_session_csrf_secret_token': self.session_csrf_secret_token()})
 
         comments = ChangesetComment.query().all()
         assert len(comments) == 0
 
-        response = self.app.get(url(controller='changeset', action='index',
-                                repo_name=HG_REPO, revision=rev))
+        response = self.app.get(base.url(controller='changeset', action='index',
+                                repo_name=base.HG_REPO, revision=rev))
         response.mustcontain(
             '''<div class="comments-number">'''
             ''' 0 comments (0 inline, 0 general)'''
@@ -149,7 +149,7 @@
         response.mustcontain(no=text)
 
 
-class TestPullrequestsCommentsController(TestController):
+class TestPullrequestsCommentsController(base.TestController):
 
     def setup_method(self, method):
         for x in ChangesetComment.query().all():
@@ -157,11 +157,11 @@
         Session().commit()
 
     def _create_pr(self):
-        response = self.app.post(url(controller='pullrequests', action='create',
-                                     repo_name=HG_REPO),
-                                 {'org_repo': HG_REPO,
+        response = self.app.post(base.url(controller='pullrequests', action='create',
+                                     repo_name=base.HG_REPO),
+                                 {'org_repo': base.HG_REPO,
                                   'org_ref': 'branch:stable:4f7e2131323e0749a740c0a56ab68ae9269c562a',
-                                  'other_repo': HG_REPO,
+                                  'other_repo': base.HG_REPO,
                                   'other_ref': 'branch:default:96507bd11ecc815ebc6270fdf6db110928c09c1e',
                                   'pullrequest_title': 'title',
                                   'pullrequest_desc': 'description',
@@ -177,14 +177,14 @@
 
         text = u'general comment on pullrequest'
         params = {'text': text, '_session_csrf_secret_token': self.session_csrf_secret_token()}
-        response = self.app.post(url(controller='pullrequests', action='comment',
-                                     repo_name=HG_REPO, pull_request_id=pr_id),
+        response = self.app.post(base.url(controller='pullrequests', action='comment',
+                                     repo_name=base.HG_REPO, pull_request_id=pr_id),
                                      params=params, extra_environ={'HTTP_X_PARTIAL_XHR': '1'})
         # Test response...
         assert response.status == '200 OK'
 
-        response = self.app.get(url(controller='pullrequests', action='show',
-                                repo_name=HG_REPO, pull_request_id=pr_id, extra=''))
+        response = self.app.get(base.url(controller='pullrequests', action='show',
+                                repo_name=base.HG_REPO, pull_request_id=pr_id, extra=''))
         # PRs currently always have an initial 'Under Review' status change
         # that counts as a general comment, hence '2' in the test below. That
         # could be counted as a misfeature, to be reworked later.
@@ -205,14 +205,14 @@
         f_path = 'vcs/web/simplevcs/views/repository.py'
         line = 'n1'
         params = {'text': text, 'f_path': f_path, 'line': line, '_session_csrf_secret_token': self.session_csrf_secret_token()}
-        response = self.app.post(url(controller='pullrequests', action='comment',
-                                     repo_name=HG_REPO, pull_request_id=pr_id),
+        response = self.app.post(base.url(controller='pullrequests', action='comment',
+                                     repo_name=base.HG_REPO, pull_request_id=pr_id),
                                      params=params, extra_environ={'HTTP_X_PARTIAL_XHR': '1'})
         # Test response...
         assert response.status == '200 OK'
 
-        response = self.app.get(url(controller='pullrequests', action='show',
-                                repo_name=HG_REPO, pull_request_id=pr_id, extra=''))
+        response = self.app.get(base.url(controller='pullrequests', action='show',
+                                repo_name=base.HG_REPO, pull_request_id=pr_id, extra=''))
         response.mustcontain(
             '''<div class="comments-number">'''
             ''' 2 comments (1 inline, 1 general)'''
@@ -231,21 +231,21 @@
         self.log_user()
         pr_id = self._create_pr()
 
-        text = u'@%s check CommentOnRevision' % TEST_USER_REGULAR_LOGIN
+        text = u'@%s check CommentOnRevision' % base.TEST_USER_REGULAR_LOGIN
         params = {'text': text, '_session_csrf_secret_token': self.session_csrf_secret_token()}
-        response = self.app.post(url(controller='pullrequests', action='comment',
-                                     repo_name=HG_REPO, pull_request_id=pr_id),
+        response = self.app.post(base.url(controller='pullrequests', action='comment',
+                                     repo_name=base.HG_REPO, pull_request_id=pr_id),
                                      params=params, extra_environ={'HTTP_X_PARTIAL_XHR': '1'})
         # Test response...
         assert response.status == '200 OK'
 
-        response = self.app.get(url(controller='pullrequests', action='show',
-                                repo_name=HG_REPO, pull_request_id=pr_id, extra=''))
+        response = self.app.get(base.url(controller='pullrequests', action='show',
+                                repo_name=base.HG_REPO, pull_request_id=pr_id, extra=''))
         response.mustcontain(
             '''<div class="comments-number">'''
             ''' 2 comments (0 inline, 2 general)'''
         )
-        response.mustcontain('<b>@%s</b> check CommentOnRevision' % TEST_USER_REGULAR_LOGIN)
+        response.mustcontain('<b>@%s</b> check CommentOnRevision' % base.TEST_USER_REGULAR_LOGIN)
 
         # test DB
         assert ChangesetComment.query().count() == 2
@@ -257,14 +257,14 @@
         text = u'general comment on pullrequest'
         params = {'text': text, 'changeset_status': 'rejected',
                 '_session_csrf_secret_token': self.session_csrf_secret_token()}
-        response = self.app.post(url(controller='pullrequests', action='comment',
-                                     repo_name=HG_REPO, pull_request_id=pr_id),
+        response = self.app.post(base.url(controller='pullrequests', action='comment',
+                                     repo_name=base.HG_REPO, pull_request_id=pr_id),
                                      params=params, extra_environ={'HTTP_X_PARTIAL_XHR': '1'})
         # Test response...
         assert response.status == '200 OK'
 
-        response = self.app.get(url(controller='pullrequests', action='show',
-                                repo_name=HG_REPO, pull_request_id=pr_id, extra=''))
+        response = self.app.get(base.url(controller='pullrequests', action='show',
+                                repo_name=base.HG_REPO, pull_request_id=pr_id, extra=''))
         # PRs currently always have an initial 'Under Review' status change
         # that counts as a general comment, hence '2' in the test below. That
         # could be counted as a misfeature, to be reworked later.
@@ -278,7 +278,7 @@
         assert ChangesetComment.query().count() == 2
 
         # check status
-        status = ChangesetStatusModel().get_status(repo=HG_REPO, pull_request=pr_id)
+        status = ChangesetStatusModel().get_status(repo=base.HG_REPO, pull_request=pr_id)
         assert status == 'rejected'
 
     def test_delete(self):
@@ -287,24 +287,24 @@
 
         text = u'general comment on changeset to be deleted'
         params = {'text': text, '_session_csrf_secret_token': self.session_csrf_secret_token()}
-        response = self.app.post(url(controller='pullrequests', action='comment',
-                                     repo_name=HG_REPO, pull_request_id=pr_id),
+        response = self.app.post(base.url(controller='pullrequests', action='comment',
+                                     repo_name=base.HG_REPO, pull_request_id=pr_id),
                                      params=params, extra_environ={'HTTP_X_PARTIAL_XHR': '1'})
 
         comments = ChangesetComment.query().all()
         assert len(comments) == 2
         comment_id = comments[-1].comment_id
 
-        self.app.post(url("pullrequest_comment_delete",
-                                    repo_name=HG_REPO,
+        self.app.post(base.url("pullrequest_comment_delete",
+                                    repo_name=base.HG_REPO,
                                     comment_id=comment_id),
             params={'_session_csrf_secret_token': self.session_csrf_secret_token()})
 
         comments = ChangesetComment.query().all()
         assert len(comments) == 1
 
-        response = self.app.get(url(controller='pullrequests', action='show',
-                                repo_name=HG_REPO, pull_request_id=pr_id, extra=''))
+        response = self.app.get(base.url(controller='pullrequests', action='show',
+                                repo_name=base.HG_REPO, pull_request_id=pr_id, extra=''))
         response.mustcontain(
             '''<div class="comments-number">'''
             ''' 1 comment (0 inline, 1 general)'''
@@ -318,14 +318,14 @@
         text = u'general comment on pullrequest'
         params = {'text': text, 'save_close': 'close',
                 '_session_csrf_secret_token': self.session_csrf_secret_token()}
-        response = self.app.post(url(controller='pullrequests', action='comment',
-                                     repo_name=HG_REPO, pull_request_id=pr_id),
+        response = self.app.post(base.url(controller='pullrequests', action='comment',
+                                     repo_name=base.HG_REPO, pull_request_id=pr_id),
                                      params=params, extra_environ={'HTTP_X_PARTIAL_XHR': '1'})
         # Test response...
         assert response.status == '200 OK'
 
-        response = self.app.get(url(controller='pullrequests', action='show',
-                                repo_name=HG_REPO, pull_request_id=pr_id, extra=''))
+        response = self.app.get(base.url(controller='pullrequests', action='show',
+                                repo_name=base.HG_REPO, pull_request_id=pr_id, extra=''))
         response.mustcontain(
             '''title (Closed)'''
         )
@@ -341,14 +341,14 @@
         text = u'general comment on pullrequest'
         params = {'text': text, 'save_delete': 'delete',
                 '_session_csrf_secret_token': self.session_csrf_secret_token()}
-        response = self.app.post(url(controller='pullrequests', action='comment',
-                                     repo_name=HG_REPO, pull_request_id=pr_id),
+        response = self.app.post(base.url(controller='pullrequests', action='comment',
+                                     repo_name=base.HG_REPO, pull_request_id=pr_id),
                                      params=params, extra_environ={'HTTP_X_PARTIAL_XHR': '1'})
         # Test response...
         assert response.status == '200 OK'
 
-        response = self.app.get(url(controller='pullrequests', action='show',
-                                repo_name=HG_REPO, pull_request_id=pr_id, extra=''), status=404)
+        response = self.app.get(base.url(controller='pullrequests', action='show',
+                                repo_name=base.HG_REPO, pull_request_id=pr_id, extra=''), status=404)
 
         # test DB
         assert PullRequest.get(pr_id) is None
@@ -361,16 +361,16 @@
         text = u'general comment on pullrequest'
         params = {'text': text, 'save_close': 'close',
                 '_session_csrf_secret_token': self.session_csrf_secret_token()}
-        response = self.app.post(url(controller='pullrequests', action='comment',
-                                     repo_name=HG_REPO, pull_request_id=pr_id),
+        response = self.app.post(base.url(controller='pullrequests', action='comment',
+                                     repo_name=base.HG_REPO, pull_request_id=pr_id),
                                      params=params, extra_environ={'HTTP_X_PARTIAL_XHR': '1'})
         assert response.status == '200 OK'
 
         # attempt delete, should fail
         params = {'text': text, 'save_delete': 'delete',
                 '_session_csrf_secret_token': self.session_csrf_secret_token()}
-        response = self.app.post(url(controller='pullrequests', action='comment',
-                                     repo_name=HG_REPO, pull_request_id=pr_id),
+        response = self.app.post(base.url(controller='pullrequests', action='comment',
+                                     repo_name=base.HG_REPO, pull_request_id=pr_id),
                                      params=params, extra_environ={'HTTP_X_PARTIAL_XHR': '1'}, status=403)
 
         # verify that PR still exists, in closed state
--- a/kallithea/tests/functional/test_compare.py	Thu Jan 02 00:57:38 2020 +0100
+++ b/kallithea/tests/functional/test_compare.py	Thu Jan 02 00:44:56 2020 +0100
@@ -1,7 +1,7 @@
 # -*- coding: utf-8 -*-
 from kallithea.model.meta import Session
 from kallithea.model.repo import RepoModel
-from kallithea.tests.base import *
+from kallithea.tests import base
 from kallithea.tests.fixture import Fixture
 
 
@@ -12,7 +12,7 @@
     return '''<div class="message-firstline"><a class="message-link" href="/%s/changeset/%s">%s</a></div>''' % (repo_name, sha, msg)
 
 
-class TestCompareController(TestController):
+class TestCompareController(base.TestController):
 
     def setup_method(self, method):
         self.r1_id = None
@@ -30,7 +30,7 @@
         self.log_user()
         repo1 = fixture.create_repo(u'one', repo_type='hg',
                                     repo_description='diff-test',
-                                    cur_user=TEST_USER_ADMIN_LOGIN)
+                                    cur_user=base.TEST_USER_ADMIN_LOGIN)
         self.r1_id = repo1.repo_id
         # commit something !
         cs0 = fixture.commit_change(repo1.repo_name, filename='file1',
@@ -53,7 +53,7 @@
         rev1 = 'default'
         rev2 = 'default'
 
-        response = self.app.get(url('compare_url',
+        response = self.app.get(base.url('compare_url',
                                     repo_name=repo1.repo_name,
                                     org_ref_type="branch",
                                     org_ref_name=rev2,
@@ -81,7 +81,7 @@
         self.log_user()
         repo1 = fixture.create_repo(u'one-git', repo_type='git',
                                     repo_description='diff-test',
-                                    cur_user=TEST_USER_ADMIN_LOGIN)
+                                    cur_user=base.TEST_USER_ADMIN_LOGIN)
         self.r1_id = repo1.repo_id
         # commit something !
         cs0 = fixture.commit_change(repo1.repo_name, filename='file1',
@@ -104,7 +104,7 @@
         rev1 = 'master'
         rev2 = 'master'
 
-        response = self.app.get(url('compare_url',
+        response = self.app.get(base.url('compare_url',
                                     repo_name=repo1.repo_name,
                                     org_ref_type="branch",
                                     org_ref_name=rev2,
@@ -133,7 +133,7 @@
 
         repo1 = fixture.create_repo(u'one', repo_type='hg',
                                     repo_description='diff-test',
-                                    cur_user=TEST_USER_ADMIN_LOGIN)
+                                    cur_user=base.TEST_USER_ADMIN_LOGIN)
 
         self.r1_id = repo1.repo_id
 
@@ -163,7 +163,7 @@
         rev1 = 'default'
         rev2 = 'default'
 
-        response = self.app.get(url('compare_url',
+        response = self.app.get(base.url('compare_url',
                                     repo_name=repo1.repo_name,
                                     org_ref_type="branch",
                                     org_ref_name=rev2,
@@ -192,7 +192,7 @@
 
         repo1 = fixture.create_repo(u'one-git', repo_type='git',
                                     repo_description='diff-test',
-                                    cur_user=TEST_USER_ADMIN_LOGIN)
+                                    cur_user=base.TEST_USER_ADMIN_LOGIN)
 
         self.r1_id = repo1.repo_id
 
@@ -222,7 +222,7 @@
         rev1 = 'master'
         rev2 = 'master'
 
-        response = self.app.get(url('compare_url',
+        response = self.app.get(base.url('compare_url',
                                     repo_name=repo1.repo_name,
                                     org_ref_type="branch",
                                     org_ref_name=rev2,
@@ -263,7 +263,7 @@
 
         repo1 = fixture.create_repo(u'repo1', repo_type='hg',
                                     repo_description='diff-test',
-                                    cur_user=TEST_USER_ADMIN_LOGIN)
+                                    cur_user=base.TEST_USER_ADMIN_LOGIN)
         self.r1_id = repo1.repo_id
 
         # commit something !
@@ -290,7 +290,7 @@
                 content='line1\nline2\nline3\nline4\nline5\nline6\n',
                 message='commit6', vcs_type='hg', parent=cs4)
 
-        response = self.app.get(url('compare_url',
+        response = self.app.get(base.url('compare_url',
                                     repo_name=repo2.repo_name,
                                     org_ref_type="rev",
                                     org_ref_name=cs1.short_id,  # parent of cs2, in repo2
@@ -331,7 +331,7 @@
         self.log_user()
         repo1 = fixture.create_repo(u'repo1', repo_type='hg',
                                     repo_description='diff-test',
-                                    cur_user=TEST_USER_ADMIN_LOGIN)
+                                    cur_user=base.TEST_USER_ADMIN_LOGIN)
         self.r1_id = repo1.repo_id
 
         # commit something !
@@ -358,7 +358,7 @@
                 content='line1\nline2\nline3\nline4\nline5\nline6\n',
                 message='commit6', vcs_type='hg', parent=cs4)
 
-        response = self.app.get(url('compare_url',
+        response = self.app.get(base.url('compare_url',
                                     repo_name=repo1.repo_name,
                                     org_ref_type="rev",
                                     org_ref_name=cs2.short_id, # parent of cs3, not in repo2
@@ -388,27 +388,27 @@
     def test_compare_remote_branches_hg(self):
         self.log_user()
 
-        repo2 = fixture.create_fork(HG_REPO, HG_FORK)
+        repo2 = fixture.create_fork(base.HG_REPO, base.HG_FORK)
         self.r2_id = repo2.repo_id
         rev1 = '56349e29c2af'
         rev2 = '7d4bc8ec6be5'
 
-        response = self.app.get(url('compare_url',
-                                    repo_name=HG_REPO,
+        response = self.app.get(base.url('compare_url',
+                                    repo_name=base.HG_REPO,
                                     org_ref_type="rev",
                                     org_ref_name=rev1,
                                     other_ref_type="rev",
                                     other_ref_name=rev2,
-                                    other_repo=HG_FORK,
+                                    other_repo=base.HG_FORK,
                                     merge='1',))
 
-        response.mustcontain('%s@%s' % (HG_REPO, rev1))
-        response.mustcontain('%s@%s' % (HG_FORK, rev2))
+        response.mustcontain('%s@%s' % (base.HG_REPO, rev1))
+        response.mustcontain('%s@%s' % (base.HG_FORK, rev2))
         ## outgoing changesets between those revisions
 
-        response.mustcontain("""<a class="changeset_hash" href="/%s/changeset/2dda4e345facb0ccff1a191052dd1606dba6781d">r4:2dda4e345fac</a>""" % (HG_FORK))
-        response.mustcontain("""<a class="changeset_hash" href="/%s/changeset/6fff84722075f1607a30f436523403845f84cd9e">r5:6fff84722075</a>""" % (HG_FORK))
-        response.mustcontain("""<a class="changeset_hash" href="/%s/changeset/7d4bc8ec6be56c0f10425afb40b6fc315a4c25e7">r6:%s</a>""" % (HG_FORK, rev2))
+        response.mustcontain("""<a class="changeset_hash" href="/%s/changeset/2dda4e345facb0ccff1a191052dd1606dba6781d">r4:2dda4e345fac</a>""" % (base.HG_FORK))
+        response.mustcontain("""<a class="changeset_hash" href="/%s/changeset/6fff84722075f1607a30f436523403845f84cd9e">r5:6fff84722075</a>""" % (base.HG_FORK))
+        response.mustcontain("""<a class="changeset_hash" href="/%s/changeset/7d4bc8ec6be56c0f10425afb40b6fc315a4c25e7">r6:%s</a>""" % (base.HG_FORK, rev2))
 
         ## files
         response.mustcontain("""<a href="#C--9c390eb52cd6">vcs/backends/hg.py</a>""")
@@ -418,27 +418,27 @@
     def test_compare_remote_branches_git(self):
         self.log_user()
 
-        repo2 = fixture.create_fork(GIT_REPO, GIT_FORK)
+        repo2 = fixture.create_fork(base.GIT_REPO, base.GIT_FORK)
         self.r2_id = repo2.repo_id
         rev1 = '102607b09cdd60e2793929c4f90478be29f85a17'
         rev2 = 'd7e0d30fbcae12c90680eb095a4f5f02505ce501'
 
-        response = self.app.get(url('compare_url',
-                                    repo_name=GIT_REPO,
+        response = self.app.get(base.url('compare_url',
+                                    repo_name=base.GIT_REPO,
                                     org_ref_type="rev",
                                     org_ref_name=rev1,
                                     other_ref_type="rev",
                                     other_ref_name=rev2,
-                                    other_repo=GIT_FORK,
+                                    other_repo=base.GIT_FORK,
                                     merge='1',))
 
-        response.mustcontain('%s@%s' % (GIT_REPO, rev1))
-        response.mustcontain('%s@%s' % (GIT_FORK, rev2))
+        response.mustcontain('%s@%s' % (base.GIT_REPO, rev1))
+        response.mustcontain('%s@%s' % (base.GIT_FORK, rev2))
         ## outgoing changesets between those revisions
 
-        response.mustcontain("""<a class="changeset_hash" href="/%s/changeset/49d3fd156b6f7db46313fac355dca1a0b94a0017">r4:49d3fd156b6f</a>""" % (GIT_FORK))
-        response.mustcontain("""<a class="changeset_hash" href="/%s/changeset/2d1028c054665b962fa3d307adfc923ddd528038">r5:2d1028c05466</a>""" % (GIT_FORK))
-        response.mustcontain("""<a class="changeset_hash" href="/%s/changeset/d7e0d30fbcae12c90680eb095a4f5f02505ce501">r6:%s</a>""" % (GIT_FORK, rev2[:12]))
+        response.mustcontain("""<a class="changeset_hash" href="/%s/changeset/49d3fd156b6f7db46313fac355dca1a0b94a0017">r4:49d3fd156b6f</a>""" % (base.GIT_FORK))
+        response.mustcontain("""<a class="changeset_hash" href="/%s/changeset/2d1028c054665b962fa3d307adfc923ddd528038">r5:2d1028c05466</a>""" % (base.GIT_FORK))
+        response.mustcontain("""<a class="changeset_hash" href="/%s/changeset/d7e0d30fbcae12c90680eb095a4f5f02505ce501">r6:%s</a>""" % (base.GIT_FORK, rev2[:12]))
 
         ## files
         response.mustcontain("""<a href="#C--9c390eb52cd6">vcs/backends/hg.py</a>""")
@@ -450,7 +450,7 @@
 
         repo1 = fixture.create_repo(u'one', repo_type='hg',
                                     repo_description='diff-test',
-                                    cur_user=TEST_USER_ADMIN_LOGIN)
+                                    cur_user=base.TEST_USER_ADMIN_LOGIN)
 
         self.r1_id = repo1.repo_id
         r1_name = repo1.repo_name
@@ -461,7 +461,7 @@
         assert repo1.scm_instance.revisions == [cs0.raw_id]
         # fork the repo1
         repo2 = fixture.create_fork(r1_name, u'one-fork',
-                                    cur_user=TEST_USER_ADMIN_LOGIN)
+                                    cur_user=base.TEST_USER_ADMIN_LOGIN)
         Session().commit()
         assert repo2.scm_instance.revisions == [cs0.raw_id]
         self.r2_id = repo2.repo_id
@@ -482,7 +482,7 @@
         rev1 = 'default'
         rev2 = 'default'
 
-        response = self.app.get(url('compare_url',
+        response = self.app.get(base.url('compare_url',
                                     repo_name=r2_name,
                                     org_ref_type="branch",
                                     org_ref_name=rev2,
@@ -500,7 +500,7 @@
         # compare !
         rev1 = 'default'
         rev2 = 'default'
-        response = self.app.get(url('compare_url',
+        response = self.app.get(base.url('compare_url',
                                     repo_name=r2_name,
                                     org_ref_type="branch",
                                     org_ref_name=rev2,
@@ -522,7 +522,7 @@
 
         repo1 = fixture.create_repo(u'one-git', repo_type='git',
                                     repo_description='diff-test',
-                                    cur_user=TEST_USER_ADMIN_LOGIN)
+                                    cur_user=base.TEST_USER_ADMIN_LOGIN)
 
         self.r1_id = repo1.repo_id
         r1_name = repo1.repo_name
@@ -534,7 +534,7 @@
         assert repo1.scm_instance.revisions == [cs0.raw_id]
         # fork the repo1
         repo2 = fixture.create_fork(r1_name, u'one-git-fork',
-                                    cur_user=TEST_USER_ADMIN_LOGIN)
+                                    cur_user=base.TEST_USER_ADMIN_LOGIN)
         Session().commit()
         assert repo2.scm_instance.revisions == [cs0.raw_id]
         self.r2_id = repo2.repo_id
@@ -556,7 +556,7 @@
         rev1 = 'master'
         rev2 = 'master'
 
-        response = self.app.get(url('compare_url',
+        response = self.app.get(base.url('compare_url',
                                     repo_name=r2_name,
                                     org_ref_type="branch",
                                     org_ref_name=rev1,
@@ -574,7 +574,7 @@
         # compare !
         rev1 = 'master'
         rev2 = 'master'
-        response = self.app.get(url('compare_url',
+        response = self.app.get(base.url('compare_url',
                                     repo_name=r2_name,
                                     org_ref_type="branch",
                                     org_ref_name=rev1,
--- a/kallithea/tests/functional/test_compare_local.py	Thu Jan 02 00:57:38 2020 +0100
+++ b/kallithea/tests/functional/test_compare_local.py	Thu Jan 02 00:44:56 2020 +0100
@@ -1,31 +1,31 @@
 # -*- coding: utf-8 -*-
-from kallithea.tests.base import *
+from kallithea.tests import base
 
 
-class TestCompareController(TestController):
+class TestCompareController(base.TestController):
 
     def test_compare_tag_hg(self):
         self.log_user()
         tag1 = 'v0.1.2'
         tag2 = 'v0.1.3'
-        response = self.app.get(url('compare_url',
-                                    repo_name=HG_REPO,
+        response = self.app.get(base.url('compare_url',
+                                    repo_name=base.HG_REPO,
                                     org_ref_type="tag",
                                     org_ref_name=tag1,
                                     other_ref_type="tag",
                                     other_ref_name=tag2,
                                     ), status=200)
-        response.mustcontain('%s@%s' % (HG_REPO, tag1))
-        response.mustcontain('%s@%s' % (HG_REPO, tag2))
+        response.mustcontain('%s@%s' % (base.HG_REPO, tag1))
+        response.mustcontain('%s@%s' % (base.HG_REPO, tag2))
 
         ## outgoing changesets between tags
-        response.mustcontain('''<a class="changeset_hash" href="/%s/changeset/c5ddebc06eaaba3010c2d66ea6ec9d074eb0f678">r112:c5ddebc06eaa</a>''' % HG_REPO)
-        response.mustcontain('''<a class="changeset_hash" href="/%s/changeset/70d4cef8a37657ee4cf5aabb3bd9f68879769816">r115:70d4cef8a376</a>''' % HG_REPO)
-        response.mustcontain('''<a class="changeset_hash" href="/%s/changeset/9749bfbfc0d2eba208d7947de266303b67c87cda">r116:9749bfbfc0d2</a>''' % HG_REPO)
-        response.mustcontain('''<a class="changeset_hash" href="/%s/changeset/41fda979f02fda216374bf8edac4e83f69e7581c">r117:41fda979f02f</a>''' % HG_REPO)
-        response.mustcontain('''<a class="changeset_hash" href="/%s/changeset/bb1a3ab98cc45cb934a77dcabf87a5a598b59e97">r118:bb1a3ab98cc4</a>''' % HG_REPO)
-        response.mustcontain('''<a class="changeset_hash" href="/%s/changeset/36e0fc9d2808c5022a24f49d6658330383ed8666">r119:36e0fc9d2808</a>''' % HG_REPO)
-        response.mustcontain('''<a class="changeset_hash" href="/%s/changeset/17544fbfcd33ffb439e2b728b5d526b1ef30bfcf">r120:17544fbfcd33</a>''' % HG_REPO)
+        response.mustcontain('''<a class="changeset_hash" href="/%s/changeset/c5ddebc06eaaba3010c2d66ea6ec9d074eb0f678">r112:c5ddebc06eaa</a>''' % base.HG_REPO)
+        response.mustcontain('''<a class="changeset_hash" href="/%s/changeset/70d4cef8a37657ee4cf5aabb3bd9f68879769816">r115:70d4cef8a376</a>''' % base.HG_REPO)
+        response.mustcontain('''<a class="changeset_hash" href="/%s/changeset/9749bfbfc0d2eba208d7947de266303b67c87cda">r116:9749bfbfc0d2</a>''' % base.HG_REPO)
+        response.mustcontain('''<a class="changeset_hash" href="/%s/changeset/41fda979f02fda216374bf8edac4e83f69e7581c">r117:41fda979f02f</a>''' % base.HG_REPO)
+        response.mustcontain('''<a class="changeset_hash" href="/%s/changeset/bb1a3ab98cc45cb934a77dcabf87a5a598b59e97">r118:bb1a3ab98cc4</a>''' % base.HG_REPO)
+        response.mustcontain('''<a class="changeset_hash" href="/%s/changeset/36e0fc9d2808c5022a24f49d6658330383ed8666">r119:36e0fc9d2808</a>''' % base.HG_REPO)
+        response.mustcontain('''<a class="changeset_hash" href="/%s/changeset/17544fbfcd33ffb439e2b728b5d526b1ef30bfcf">r120:17544fbfcd33</a>''' % base.HG_REPO)
 
         response.mustcontain('11 files changed with 94 insertions and 64 deletions')
 
@@ -80,24 +80,24 @@
         self.log_user()
         tag1 = 'v0.1.2'
         tag2 = 'v0.1.3'
-        response = self.app.get(url('compare_url',
-                                    repo_name=GIT_REPO,
+        response = self.app.get(base.url('compare_url',
+                                    repo_name=base.GIT_REPO,
                                     org_ref_type="tag",
                                     org_ref_name=tag1,
                                     other_ref_type="tag",
                                     other_ref_name=tag2,
                                     ), status=200)
-        response.mustcontain('%s@%s' % (GIT_REPO, tag1))
-        response.mustcontain('%s@%s' % (GIT_REPO, tag2))
+        response.mustcontain('%s@%s' % (base.GIT_REPO, tag1))
+        response.mustcontain('%s@%s' % (base.GIT_REPO, tag2))
 
         ## outgoing changesets between tags
-        response.mustcontain('''<a class="changeset_hash" href="/%s/changeset/794bbdd31545c199f74912709ea350dedcd189a2">r113:794bbdd31545</a>''' % GIT_REPO)
-        response.mustcontain('''<a class="changeset_hash" href="/%s/changeset/e36d8c5025329bdd4212bd53d4ed8a70ff44985f">r115:e36d8c502532</a>''' % GIT_REPO)
-        response.mustcontain('''<a class="changeset_hash" href="/%s/changeset/5c9ff4f6d7508db0e72b1d2991c357d0d8e07af2">r116:5c9ff4f6d750</a>''' % GIT_REPO)
-        response.mustcontain('''<a class="changeset_hash" href="/%s/changeset/b7187fa2b8c1d773ec35e9dee12f01f74808c879">r117:b7187fa2b8c1</a>''' % GIT_REPO)
-        response.mustcontain('''<a class="changeset_hash" href="/%s/changeset/5f3b74262014a8de2dc7dade1152de9fd0c8efef">r118:5f3b74262014</a>''' % GIT_REPO)
-        response.mustcontain('''<a class="changeset_hash" href="/%s/changeset/17438a11f72b93f56d0e08e7d1fa79a378578a82">r119:17438a11f72b</a>''' % GIT_REPO)
-        response.mustcontain('''<a class="changeset_hash" href="/%s/changeset/5a3a8fb005554692b16e21dee62bf02667d8dc3e">r120:5a3a8fb00555</a>''' % GIT_REPO)
+        response.mustcontain('''<a class="changeset_hash" href="/%s/changeset/794bbdd31545c199f74912709ea350dedcd189a2">r113:794bbdd31545</a>''' % base.GIT_REPO)
+        response.mustcontain('''<a class="changeset_hash" href="/%s/changeset/e36d8c5025329bdd4212bd53d4ed8a70ff44985f">r115:e36d8c502532</a>''' % base.GIT_REPO)
+        response.mustcontain('''<a class="changeset_hash" href="/%s/changeset/5c9ff4f6d7508db0e72b1d2991c357d0d8e07af2">r116:5c9ff4f6d750</a>''' % base.GIT_REPO)
+        response.mustcontain('''<a class="changeset_hash" href="/%s/changeset/b7187fa2b8c1d773ec35e9dee12f01f74808c879">r117:b7187fa2b8c1</a>''' % base.GIT_REPO)
+        response.mustcontain('''<a class="changeset_hash" href="/%s/changeset/5f3b74262014a8de2dc7dade1152de9fd0c8efef">r118:5f3b74262014</a>''' % base.GIT_REPO)
+        response.mustcontain('''<a class="changeset_hash" href="/%s/changeset/17438a11f72b93f56d0e08e7d1fa79a378578a82">r119:17438a11f72b</a>''' % base.GIT_REPO)
+        response.mustcontain('''<a class="changeset_hash" href="/%s/changeset/5a3a8fb005554692b16e21dee62bf02667d8dc3e">r120:5a3a8fb00555</a>''' % base.GIT_REPO)
 
         response.mustcontain('11 files changed with 94 insertions and 64 deletions')
 
@@ -116,32 +116,32 @@
 
     def test_index_branch_hg(self):
         self.log_user()
-        response = self.app.get(url('compare_url',
-                                    repo_name=HG_REPO,
+        response = self.app.get(base.url('compare_url',
+                                    repo_name=base.HG_REPO,
                                     org_ref_type="branch",
                                     org_ref_name='default',
                                     other_ref_type="branch",
                                     other_ref_name='default',
                                     ))
 
-        response.mustcontain('%s@default' % (HG_REPO))
-        response.mustcontain('%s@default' % (HG_REPO))
+        response.mustcontain('%s@default' % (base.HG_REPO))
+        response.mustcontain('%s@default' % (base.HG_REPO))
         # branch are equal
         response.mustcontain('<span class="text-muted">No files</span>')
         response.mustcontain('<span class="text-muted">No changesets</span>')
 
     def test_index_branch_git(self):
         self.log_user()
-        response = self.app.get(url('compare_url',
-                                    repo_name=GIT_REPO,
+        response = self.app.get(base.url('compare_url',
+                                    repo_name=base.GIT_REPO,
                                     org_ref_type="branch",
                                     org_ref_name='master',
                                     other_ref_type="branch",
                                     other_ref_name='master',
                                     ))
 
-        response.mustcontain('%s@master' % (GIT_REPO))
-        response.mustcontain('%s@master' % (GIT_REPO))
+        response.mustcontain('%s@master' % (base.GIT_REPO))
+        response.mustcontain('%s@master' % (base.GIT_REPO))
         # branch are equal
         response.mustcontain('<span class="text-muted">No files</span>')
         response.mustcontain('<span class="text-muted">No changesets</span>')
@@ -151,18 +151,18 @@
         rev1 = 'b986218ba1c9'
         rev2 = '3d8f361e72ab'
 
-        response = self.app.get(url('compare_url',
-                                    repo_name=HG_REPO,
+        response = self.app.get(base.url('compare_url',
+                                    repo_name=base.HG_REPO,
                                     org_ref_type="rev",
                                     org_ref_name=rev1,
                                     other_ref_type="rev",
                                     other_ref_name=rev2,
                                     ))
-        response.mustcontain('%s@%s' % (HG_REPO, rev1))
-        response.mustcontain('%s@%s' % (HG_REPO, rev2))
+        response.mustcontain('%s@%s' % (base.HG_REPO, rev1))
+        response.mustcontain('%s@%s' % (base.HG_REPO, rev2))
 
         ## outgoing changesets between those revisions
-        response.mustcontain("""<a class="changeset_hash" href="/%s/changeset/3d8f361e72ab303da48d799ff1ac40d5ac37c67e">r1:%s</a>""" % (HG_REPO, rev2))
+        response.mustcontain("""<a class="changeset_hash" href="/%s/changeset/3d8f361e72ab303da48d799ff1ac40d5ac37c67e">r1:%s</a>""" % (base.HG_REPO, rev2))
 
         response.mustcontain('1 file changed with 7 insertions and 0 deletions')
         ## files
@@ -173,18 +173,18 @@
         rev1 = 'c1214f7e79e02fc37156ff215cd71275450cffc3'
         rev2 = '38b5fe81f109cb111f549bfe9bb6b267e10bc557'
 
-        response = self.app.get(url('compare_url',
-                                    repo_name=GIT_REPO,
+        response = self.app.get(base.url('compare_url',
+                                    repo_name=base.GIT_REPO,
                                     org_ref_type="rev",
                                     org_ref_name=rev1,
                                     other_ref_type="rev",
                                     other_ref_name=rev2,
                                     ))
-        response.mustcontain('%s@%s' % (GIT_REPO, rev1))
-        response.mustcontain('%s@%s' % (GIT_REPO, rev2))
+        response.mustcontain('%s@%s' % (base.GIT_REPO, rev1))
+        response.mustcontain('%s@%s' % (base.GIT_REPO, rev2))
 
         ## outgoing changesets between those revisions
-        response.mustcontain("""<a class="changeset_hash" href="/%s/changeset/38b5fe81f109cb111f549bfe9bb6b267e10bc557">r1:%s</a>""" % (GIT_REPO, rev2[:12]))
+        response.mustcontain("""<a class="changeset_hash" href="/%s/changeset/38b5fe81f109cb111f549bfe9bb6b267e10bc557">r1:%s</a>""" % (base.GIT_REPO, rev2[:12]))
         response.mustcontain('1 file changed with 7 insertions and 0 deletions')
 
         ## files
@@ -195,8 +195,8 @@
         rev1 = 'b986218ba1c9'
         rev2 = '3d8f361e72ab'
 
-        response = self.app.get(url('compare_url',
-                                    repo_name=HG_REPO,
+        response = self.app.get(base.url('compare_url',
+                                    repo_name=base.HG_REPO,
                                     org_ref_type="rev",
                                     org_ref_name=rev1,
                                     other_ref_type="rev",
@@ -206,18 +206,18 @@
                                 extra_environ={'HTTP_X_PARTIAL_XHR': '1'},)
 
         ## outgoing changesets between those revisions
-        response.mustcontain("""<a class="changeset_hash" href="/%s/changeset/3d8f361e72ab303da48d799ff1ac40d5ac37c67e">r1:%s</a>""" % (HG_REPO, rev2))
+        response.mustcontain("""<a class="changeset_hash" href="/%s/changeset/3d8f361e72ab303da48d799ff1ac40d5ac37c67e">r1:%s</a>""" % (base.HG_REPO, rev2))
 
         response.mustcontain('Merge Ancestor')
-        response.mustcontain("""<a class="changeset_hash" href="/%s/changeset/b986218ba1c9b0d6a259fac9b050b1724ed8e545">%s</a>""" % (HG_REPO, rev1))
+        response.mustcontain("""<a class="changeset_hash" href="/%s/changeset/b986218ba1c9b0d6a259fac9b050b1724ed8e545">%s</a>""" % (base.HG_REPO, rev1))
 
     def test_compare_revisions_git_is_ajax_preview(self):
         self.log_user()
         rev1 = 'c1214f7e79e02fc37156ff215cd71275450cffc3'
         rev2 = '38b5fe81f109cb111f549bfe9bb6b267e10bc557'
 
-        response = self.app.get(url('compare_url',
-                                    repo_name=GIT_REPO,
+        response = self.app.get(base.url('compare_url',
+                                    repo_name=base.GIT_REPO,
                                     org_ref_type="rev",
                                     org_ref_name=rev1,
                                     other_ref_type="rev",
@@ -226,7 +226,7 @@
                                     ),
                                 extra_environ={'HTTP_X_PARTIAL_XHR': '1'},)
         ## outgoing changesets between those revisions
-        response.mustcontain("""<a class="changeset_hash" href="/%s/changeset/38b5fe81f109cb111f549bfe9bb6b267e10bc557">r1:%s</a>""" % (GIT_REPO, rev2[:12]))
+        response.mustcontain("""<a class="changeset_hash" href="/%s/changeset/38b5fe81f109cb111f549bfe9bb6b267e10bc557">r1:%s</a>""" % (base.GIT_REPO, rev2[:12]))
 
         response.mustcontain('Merge Ancestor')
-        response.mustcontain("""<a class="changeset_hash" href="/%s/changeset/c1214f7e79e02fc37156ff215cd71275450cffc3">%s</a>""" % (GIT_REPO, rev1[:12]))
+        response.mustcontain("""<a class="changeset_hash" href="/%s/changeset/c1214f7e79e02fc37156ff215cd71275450cffc3">%s</a>""" % (base.GIT_REPO, rev1[:12]))
--- a/kallithea/tests/functional/test_feed.py	Thu Jan 02 00:57:38 2020 +0100
+++ b/kallithea/tests/functional/test_feed.py	Thu Jan 02 00:44:56 2020 +0100
@@ -1,20 +1,20 @@
-from kallithea.tests.base import *
+from kallithea.tests import base
 
 
-class TestFeedController(TestController):
+class TestFeedController(base.TestController):
 
     def test_rss(self):
         self.log_user()
-        response = self.app.get(url(controller='feed', action='rss',
-                                    repo_name=HG_REPO))
+        response = self.app.get(base.url(controller='feed', action='rss',
+                                    repo_name=base.HG_REPO))
 
         assert response.content_type == "application/rss+xml"
         assert """<rss version="2.0">""" in response
 
     def test_atom(self):
         self.log_user()
-        response = self.app.get(url(controller='feed', action='atom',
-                                    repo_name=HG_REPO))
+        response = self.app.get(base.url(controller='feed', action='atom',
+                                    repo_name=base.HG_REPO))
 
         assert response.content_type == """application/atom+xml"""
         assert """<?xml version="1.0" encoding="utf-8"?>""" in response
--- a/kallithea/tests/functional/test_files.py	Thu Jan 02 00:57:38 2020 +0100
+++ b/kallithea/tests/functional/test_files.py	Thu Jan 02 00:44:56 2020 +0100
@@ -5,7 +5,7 @@
 
 from kallithea.model.db import Repository
 from kallithea.model.meta import Session
-from kallithea.tests.base import *
+from kallithea.tests import base
 from kallithea.tests.fixture import Fixture
 
 
@@ -27,51 +27,51 @@
     Session().commit()
 
 
-class TestFilesController(TestController):
+class TestFilesController(base.TestController):
 
     def test_index(self):
         self.log_user()
-        response = self.app.get(url(controller='files', action='index',
-                                    repo_name=HG_REPO,
+        response = self.app.get(base.url(controller='files', action='index',
+                                    repo_name=base.HG_REPO,
                                     revision='tip',
                                     f_path='/'))
         # Test response...
-        response.mustcontain('<a class="browser-dir ypjax-link" href="/%s/files/96507bd11ecc815ebc6270fdf6db110928c09c1e/docs"><i class="icon-folder-open"></i><span>docs</span></a>' % HG_REPO)
-        response.mustcontain('<a class="browser-dir ypjax-link" href="/%s/files/96507bd11ecc815ebc6270fdf6db110928c09c1e/vcs"><i class="icon-folder-open"></i><span>vcs</span></a>' % HG_REPO)
-        response.mustcontain('<a class="browser-file ypjax-link" href="/%s/files/96507bd11ecc815ebc6270fdf6db110928c09c1e/.gitignore"><i class="icon-doc"></i><span>.gitignore</span></a>' % HG_REPO)
-        response.mustcontain('<a class="browser-file ypjax-link" href="/%s/files/96507bd11ecc815ebc6270fdf6db110928c09c1e/.hgignore"><i class="icon-doc"></i><span>.hgignore</span></a>' % HG_REPO)
-        response.mustcontain('<a class="browser-file ypjax-link" href="/%s/files/96507bd11ecc815ebc6270fdf6db110928c09c1e/.hgtags"><i class="icon-doc"></i><span>.hgtags</span></a>' % HG_REPO)
-        response.mustcontain('<a class="browser-file ypjax-link" href="/%s/files/96507bd11ecc815ebc6270fdf6db110928c09c1e/.travis.yml"><i class="icon-doc"></i><span>.travis.yml</span></a>' % HG_REPO)
-        response.mustcontain('<a class="browser-file ypjax-link" href="/%s/files/96507bd11ecc815ebc6270fdf6db110928c09c1e/MANIFEST.in"><i class="icon-doc"></i><span>MANIFEST.in</span></a>' % HG_REPO)
-        response.mustcontain('<a class="browser-file ypjax-link" href="/%s/files/96507bd11ecc815ebc6270fdf6db110928c09c1e/README.rst"><i class="icon-doc"></i><span>README.rst</span></a>' % HG_REPO)
-        response.mustcontain('<a class="browser-file ypjax-link" href="/%s/files/96507bd11ecc815ebc6270fdf6db110928c09c1e/run_test_and_report.sh"><i class="icon-doc"></i><span>run_test_and_report.sh</span></a>' % HG_REPO)
-        response.mustcontain('<a class="browser-file ypjax-link" href="/%s/files/96507bd11ecc815ebc6270fdf6db110928c09c1e/setup.cfg"><i class="icon-doc"></i><span>setup.cfg</span></a>' % HG_REPO)
-        response.mustcontain('<a class="browser-file ypjax-link" href="/%s/files/96507bd11ecc815ebc6270fdf6db110928c09c1e/setup.py"><i class="icon-doc"></i><span>setup.py</span></a>' % HG_REPO)
-        response.mustcontain('<a class="browser-file ypjax-link" href="/%s/files/96507bd11ecc815ebc6270fdf6db110928c09c1e/test_and_report.sh"><i class="icon-doc"></i><span>test_and_report.sh</span></a>' % HG_REPO)
-        response.mustcontain('<a class="browser-file ypjax-link" href="/%s/files/96507bd11ecc815ebc6270fdf6db110928c09c1e/tox.ini"><i class="icon-doc"></i><span>tox.ini</span></a>' % HG_REPO)
+        response.mustcontain('<a class="browser-dir ypjax-link" href="/%s/files/96507bd11ecc815ebc6270fdf6db110928c09c1e/docs"><i class="icon-folder-open"></i><span>docs</span></a>' % base.HG_REPO)
+        response.mustcontain('<a class="browser-dir ypjax-link" href="/%s/files/96507bd11ecc815ebc6270fdf6db110928c09c1e/vcs"><i class="icon-folder-open"></i><span>vcs</span></a>' % base.HG_REPO)
+        response.mustcontain('<a class="browser-file ypjax-link" href="/%s/files/96507bd11ecc815ebc6270fdf6db110928c09c1e/.gitignore"><i class="icon-doc"></i><span>.gitignore</span></a>' % base.HG_REPO)
+        response.mustcontain('<a class="browser-file ypjax-link" href="/%s/files/96507bd11ecc815ebc6270fdf6db110928c09c1e/.hgignore"><i class="icon-doc"></i><span>.hgignore</span></a>' % base.HG_REPO)
+        response.mustcontain('<a class="browser-file ypjax-link" href="/%s/files/96507bd11ecc815ebc6270fdf6db110928c09c1e/.hgtags"><i class="icon-doc"></i><span>.hgtags</span></a>' % base.HG_REPO)
+        response.mustcontain('<a class="browser-file ypjax-link" href="/%s/files/96507bd11ecc815ebc6270fdf6db110928c09c1e/.travis.yml"><i class="icon-doc"></i><span>.travis.yml</span></a>' % base.HG_REPO)
+        response.mustcontain('<a class="browser-file ypjax-link" href="/%s/files/96507bd11ecc815ebc6270fdf6db110928c09c1e/MANIFEST.in"><i class="icon-doc"></i><span>MANIFEST.in</span></a>' % base.HG_REPO)
+        response.mustcontain('<a class="browser-file ypjax-link" href="/%s/files/96507bd11ecc815ebc6270fdf6db110928c09c1e/README.rst"><i class="icon-doc"></i><span>README.rst</span></a>' % base.HG_REPO)
+        response.mustcontain('<a class="browser-file ypjax-link" href="/%s/files/96507bd11ecc815ebc6270fdf6db110928c09c1e/run_test_and_report.sh"><i class="icon-doc"></i><span>run_test_and_report.sh</span></a>' % base.HG_REPO)
+        response.mustcontain('<a class="browser-file ypjax-link" href="/%s/files/96507bd11ecc815ebc6270fdf6db110928c09c1e/setup.cfg"><i class="icon-doc"></i><span>setup.cfg</span></a>' % base.HG_REPO)
+        response.mustcontain('<a class="browser-file ypjax-link" href="/%s/files/96507bd11ecc815ebc6270fdf6db110928c09c1e/setup.py"><i class="icon-doc"></i><span>setup.py</span></a>' % base.HG_REPO)
+        response.mustcontain('<a class="browser-file ypjax-link" href="/%s/files/96507bd11ecc815ebc6270fdf6db110928c09c1e/test_and_report.sh"><i class="icon-doc"></i><span>test_and_report.sh</span></a>' % base.HG_REPO)
+        response.mustcontain('<a class="browser-file ypjax-link" href="/%s/files/96507bd11ecc815ebc6270fdf6db110928c09c1e/tox.ini"><i class="icon-doc"></i><span>tox.ini</span></a>' % base.HG_REPO)
 
     def test_index_revision(self):
         self.log_user()
 
         response = self.app.get(
-            url(controller='files', action='index',
-                repo_name=HG_REPO,
+            base.url(controller='files', action='index',
+                repo_name=base.HG_REPO,
                 revision='7ba66bec8d6dbba14a2155be32408c435c5f4492',
                 f_path='/')
         )
 
         # Test response...
 
-        response.mustcontain('<a class="browser-dir ypjax-link" href="/%s/files/7ba66bec8d6dbba14a2155be32408c435c5f4492/docs"><i class="icon-folder-open"></i><span>docs</span></a>' % HG_REPO)
-        response.mustcontain('<a class="browser-dir ypjax-link" href="/%s/files/7ba66bec8d6dbba14a2155be32408c435c5f4492/tests"><i class="icon-folder-open"></i><span>tests</span></a>' % HG_REPO)
-        response.mustcontain('<a class="browser-file ypjax-link" href="/%s/files/7ba66bec8d6dbba14a2155be32408c435c5f4492/README.rst"><i class="icon-doc"></i><span>README.rst</span></a>' % HG_REPO)
+        response.mustcontain('<a class="browser-dir ypjax-link" href="/%s/files/7ba66bec8d6dbba14a2155be32408c435c5f4492/docs"><i class="icon-folder-open"></i><span>docs</span></a>' % base.HG_REPO)
+        response.mustcontain('<a class="browser-dir ypjax-link" href="/%s/files/7ba66bec8d6dbba14a2155be32408c435c5f4492/tests"><i class="icon-folder-open"></i><span>tests</span></a>' % base.HG_REPO)
+        response.mustcontain('<a class="browser-file ypjax-link" href="/%s/files/7ba66bec8d6dbba14a2155be32408c435c5f4492/README.rst"><i class="icon-doc"></i><span>README.rst</span></a>' % base.HG_REPO)
         response.mustcontain('1.1 KiB')
 
     def test_index_different_branch(self):
         self.log_user()
 
-        response = self.app.get(url(controller='files', action='index',
-                                    repo_name=HG_REPO,
+        response = self.app.get(base.url(controller='files', action='index',
+                                    repo_name=base.HG_REPO,
                                     revision='97e8b885c04894463c51898e14387d80c30ed1ee',
                                     f_path='/'))
 
@@ -86,8 +86,8 @@
                   (1, '3d8f361e72ab303da48d799ff1ac40d5ac37c67e'),
                   (0, 'b986218ba1c9b0d6a259fac9b050b1724ed8e545')]:
 
-            response = self.app.get(url(controller='files', action='index',
-                                    repo_name=HG_REPO,
+            response = self.app.get(base.url(controller='files', action='index',
+                                    repo_name=base.HG_REPO,
                                     revision=r[1],
                                     f_path='/'))
 
@@ -99,8 +99,8 @@
         import kallithea.lib.helpers
         kallithea.lib.helpers._urlify_issues_f = None
         self.log_user()
-        response = self.app.get(url(controller='files', action='index',
-                                    repo_name=HG_REPO,
+        response = self.app.get(base.url(controller='files', action='index',
+                                    repo_name=base.HG_REPO,
                                     revision='8911406ad776fdd3d0b9932a2e89677e57405a48',
                                     f_path='vcs/nodes.py'))
 
@@ -115,8 +115,8 @@
 
     def test_file_source_history(self):
         self.log_user()
-        response = self.app.get(url(controller='files', action='history',
-                                    repo_name=HG_REPO,
+        response = self.app.get(base.url(controller='files', action='history',
+                                    repo_name=base.HG_REPO,
                                     revision='tip',
                                     f_path='vcs/nodes.py'),
                                 extra_environ={'HTTP_X_PARTIAL_XHR': '1'},)
@@ -124,8 +124,8 @@
 
     def test_file_source_history_git(self):
         self.log_user()
-        response = self.app.get(url(controller='files', action='history',
-                                    repo_name=GIT_REPO,
+        response = self.app.get(base.url(controller='files', action='history',
+                                    repo_name=base.GIT_REPO,
                                     revision='master',
                                     f_path='vcs/nodes.py'),
                                 extra_environ={'HTTP_X_PARTIAL_XHR': '1'},)
@@ -133,8 +133,8 @@
 
     def test_file_annotation(self):
         self.log_user()
-        response = self.app.get(url(controller='files', action='index',
-                                    repo_name=HG_REPO,
+        response = self.app.get(base.url(controller='files', action='index',
+                                    repo_name=base.HG_REPO,
                                     revision='tip',
                                     f_path='vcs/nodes.py',
                                     annotate='1'))
@@ -143,8 +143,8 @@
 
     def test_file_annotation_git(self):
         self.log_user()
-        response = self.app.get(url(controller='files', action='index',
-                                    repo_name=GIT_REPO,
+        response = self.app.get(base.url(controller='files', action='index',
+                                    repo_name=base.GIT_REPO,
                                     revision='master',
                                     f_path='vcs/nodes.py',
                                     annotate='1'))
@@ -152,8 +152,8 @@
 
     def test_file_annotation_history(self):
         self.log_user()
-        response = self.app.get(url(controller='files', action='history',
-                                    repo_name=HG_REPO,
+        response = self.app.get(base.url(controller='files', action='history',
+                                    repo_name=base.HG_REPO,
                                     revision='tip',
                                     f_path='vcs/nodes.py',
                                     annotate='1'),
@@ -163,8 +163,8 @@
 
     def test_file_annotation_history_git(self):
         self.log_user()
-        response = self.app.get(url(controller='files', action='history',
-                                    repo_name=GIT_REPO,
+        response = self.app.get(base.url(controller='files', action='history',
+                                    repo_name=base.GIT_REPO,
                                     revision='master',
                                     f_path='vcs/nodes.py',
                                     annotate=True),
@@ -174,8 +174,8 @@
 
     def test_file_authors(self):
         self.log_user()
-        response = self.app.get(url(controller='files', action='authors',
-                                    repo_name=HG_REPO,
+        response = self.app.get(base.url(controller='files', action='authors',
+                                    repo_name=base.HG_REPO,
                                     revision='tip',
                                     f_path='vcs/nodes.py',
                                     annotate='1'))
@@ -184,8 +184,8 @@
 
     def test_file_authors_git(self):
         self.log_user()
-        response = self.app.get(url(controller='files', action='authors',
-                                    repo_name=GIT_REPO,
+        response = self.app.get(base.url(controller='files', action='authors',
+                                    repo_name=base.GIT_REPO,
                                     revision='master',
                                     f_path='vcs/nodes.py',
                                     annotate='1'))
@@ -194,14 +194,14 @@
 
     def test_archival(self):
         self.log_user()
-        _set_downloads(HG_REPO, set_to=True)
+        _set_downloads(base.HG_REPO, set_to=True)
         for arch_ext, info in ARCHIVE_SPECS.items():
             short = '27cd5cce30c9%s' % arch_ext
             fname = '27cd5cce30c96924232dffcd24178a07ffeb5dfc%s' % arch_ext
-            filename = '%s-%s' % (HG_REPO, short)
-            response = self.app.get(url(controller='files',
+            filename = '%s-%s' % (base.HG_REPO, short)
+            response = self.app.get(base.url(controller='files',
                                         action='archivefile',
-                                        repo_name=HG_REPO,
+                                        repo_name=base.HG_REPO,
                                         fname=fname))
 
             assert response.status == '200 OK'
@@ -215,25 +215,25 @@
 
     def test_archival_wrong_ext(self):
         self.log_user()
-        _set_downloads(HG_REPO, set_to=True)
+        _set_downloads(base.HG_REPO, set_to=True)
         for arch_ext in ['tar', 'rar', 'x', '..ax', '.zipz']:
             fname = '27cd5cce30c96924232dffcd24178a07ffeb5dfc%s' % arch_ext
 
-            response = self.app.get(url(controller='files',
+            response = self.app.get(base.url(controller='files',
                                         action='archivefile',
-                                        repo_name=HG_REPO,
+                                        repo_name=base.HG_REPO,
                                         fname=fname))
             response.mustcontain('Unknown archive type')
 
     def test_archival_wrong_revision(self):
         self.log_user()
-        _set_downloads(HG_REPO, set_to=True)
+        _set_downloads(base.HG_REPO, set_to=True)
         for rev in ['00x000000', 'tar', 'wrong', '@##$@$42413232', '232dffcd']:
             fname = '%s.zip' % rev
 
-            response = self.app.get(url(controller='files',
+            response = self.app.get(base.url(controller='files',
                                         action='archivefile',
-                                        repo_name=HG_REPO,
+                                        repo_name=base.HG_REPO,
                                         fname=fname))
             response.mustcontain('Unknown revision')
 
@@ -242,8 +242,8 @@
     #==========================================================================
     def test_raw_file_ok(self):
         self.log_user()
-        response = self.app.get(url(controller='files', action='rawfile',
-                                    repo_name=HG_REPO,
+        response = self.app.get(base.url(controller='files', action='rawfile',
+                                    repo_name=base.HG_REPO,
                                     revision='27cd5cce30c96924232dffcd24178a07ffeb5dfc',
                                     f_path='vcs/nodes.py'))
 
@@ -255,8 +255,8 @@
         rev = u'ERRORce30c96924232dffcd24178a07ffeb5dfc'
         f_path = 'vcs/nodes.py'
 
-        response = self.app.get(url(controller='files', action='rawfile',
-                                    repo_name=HG_REPO,
+        response = self.app.get(base.url(controller='files', action='rawfile',
+                                    repo_name=base.HG_REPO,
                                     revision=rev,
                                     f_path=f_path), status=404)
 
@@ -267,8 +267,8 @@
         self.log_user()
         rev = '27cd5cce30c96924232dffcd24178a07ffeb5dfc'
         f_path = 'vcs/ERRORnodes.py'
-        response = self.app.get(url(controller='files', action='rawfile',
-                                    repo_name=HG_REPO,
+        response = self.app.get(base.url(controller='files', action='rawfile',
+                                    repo_name=base.HG_REPO,
                                     revision=rev,
                                     f_path=f_path), status=404)
 
@@ -280,8 +280,8 @@
     #==========================================================================
     def test_raw_ok(self):
         self.log_user()
-        response = self.app.get(url(controller='files', action='raw',
-                                    repo_name=HG_REPO,
+        response = self.app.get(base.url(controller='files', action='raw',
+                                    repo_name=base.HG_REPO,
                                     revision='27cd5cce30c96924232dffcd24178a07ffeb5dfc',
                                     f_path='vcs/nodes.py'))
 
@@ -292,8 +292,8 @@
         rev = u'ERRORcce30c96924232dffcd24178a07ffeb5dfc'
         f_path = 'vcs/nodes.py'
 
-        response = self.app.get(url(controller='files', action='raw',
-                                    repo_name=HG_REPO,
+        response = self.app.get(base.url(controller='files', action='raw',
+                                    repo_name=base.HG_REPO,
                                     revision=rev,
                                     f_path=f_path), status=404)
 
@@ -304,8 +304,8 @@
         self.log_user()
         rev = '27cd5cce30c96924232dffcd24178a07ffeb5dfc'
         f_path = 'vcs/ERRORnodes.py'
-        response = self.app.get(url(controller='files', action='raw',
-                                    repo_name=HG_REPO,
+        response = self.app.get(base.url(controller='files', action='raw',
+                                    repo_name=base.HG_REPO,
                                     revision=rev,
                                     f_path=f_path), status=404)
         msg = "There is no file nor directory at the given path: &apos;%s&apos; at revision %s" % (f_path, rev[:12])
@@ -315,7 +315,7 @@
         self.log_user()
         rev = '27cd5cce30c96924232dffcd24178a07ffeb5dfc'
         response = self.app.get(
-            url('files_nodelist_home', repo_name=HG_REPO, f_path='/',
+            base.url('files_nodelist_home', repo_name=base.HG_REPO, f_path='/',
                 revision=rev),
             extra_environ={'HTTP_X_PARTIAL_XHR': '1'},
         )
@@ -324,14 +324,14 @@
     # Hg - ADD FILE
     def test_add_file_view_hg(self):
         self.log_user()
-        response = self.app.get(url('files_add_home',
-                                      repo_name=HG_REPO,
+        response = self.app.get(base.url('files_add_home',
+                                      repo_name=base.HG_REPO,
                                       revision='tip', f_path='/'))
 
     def test_add_file_into_hg_missing_content(self):
         self.log_user()
-        response = self.app.post(url('files_add_home',
-                                      repo_name=HG_REPO,
+        response = self.app.post(base.url('files_add_home',
+                                      repo_name=base.HG_REPO,
                                       revision='tip', f_path='/'),
                                  params={
                                     'content': '',
@@ -343,8 +343,8 @@
 
     def test_add_file_into_hg_missing_filename(self):
         self.log_user()
-        response = self.app.post(url('files_add_home',
-                                      repo_name=HG_REPO,
+        response = self.app.post(base.url('files_add_home',
+                                      repo_name=base.HG_REPO,
                                       revision='tip', f_path='/'),
                                  params={
                                     'content': "foo",
@@ -354,15 +354,15 @@
 
         self.checkSessionFlash(response, 'No filename')
 
-    @parametrize('location,filename', [
+    @base.parametrize('location,filename', [
         ('/abs', 'foo'),
         ('../rel', 'foo'),
         ('file/../foo', 'foo'),
     ])
     def test_add_file_into_hg_bad_filenames(self, location, filename):
         self.log_user()
-        response = self.app.post(url('files_add_home',
-                                      repo_name=HG_REPO,
+        response = self.app.post(base.url('files_add_home',
+                                      repo_name=base.HG_REPO,
                                       revision='tip', f_path='/'),
                                  params={
                                     'content': "foo",
@@ -374,7 +374,7 @@
 
         self.checkSessionFlash(response, 'Location must be relative path and must not contain .. in path')
 
-    @parametrize('cnt,location,filename', [
+    @base.parametrize('cnt,location,filename', [
         (1, '', 'foo.txt'),
         (2, 'dir', 'foo.rst'),
         (3, 'rel/dir', 'foo.bar'),
@@ -382,7 +382,7 @@
     def test_add_file_into_hg(self, cnt, location, filename):
         self.log_user()
         repo = fixture.create_repo(u'commit-test-%s' % cnt, repo_type='hg')
-        response = self.app.post(url('files_add_home',
+        response = self.app.post(base.url('files_add_home',
                                       repo_name=repo.repo_name,
                                       revision='tip', f_path='/'),
                                  params={
@@ -401,14 +401,14 @@
     # Git - add file
     def test_add_file_view_git(self):
         self.log_user()
-        response = self.app.get(url('files_add_home',
-                                      repo_name=GIT_REPO,
+        response = self.app.get(base.url('files_add_home',
+                                      repo_name=base.GIT_REPO,
                                       revision='tip', f_path='/'))
 
     def test_add_file_into_git_missing_content(self):
         self.log_user()
-        response = self.app.post(url('files_add_home',
-                                      repo_name=GIT_REPO,
+        response = self.app.post(base.url('files_add_home',
+                                      repo_name=base.GIT_REPO,
                                       revision='tip', f_path='/'),
                                  params={
                                      'content': '',
@@ -419,8 +419,8 @@
 
     def test_add_file_into_git_missing_filename(self):
         self.log_user()
-        response = self.app.post(url('files_add_home',
-                                      repo_name=GIT_REPO,
+        response = self.app.post(base.url('files_add_home',
+                                      repo_name=base.GIT_REPO,
                                       revision='tip', f_path='/'),
                                  params={
                                     'content': "foo",
@@ -430,15 +430,15 @@
 
         self.checkSessionFlash(response, 'No filename')
 
-    @parametrize('location,filename', [
+    @base.parametrize('location,filename', [
         ('/abs', 'foo'),
         ('../rel', 'foo'),
         ('file/../foo', 'foo'),
     ])
     def test_add_file_into_git_bad_filenames(self, location, filename):
         self.log_user()
-        response = self.app.post(url('files_add_home',
-                                      repo_name=GIT_REPO,
+        response = self.app.post(base.url('files_add_home',
+                                      repo_name=base.GIT_REPO,
                                       revision='tip', f_path='/'),
                                  params={
                                     'content': "foo",
@@ -450,7 +450,7 @@
 
         self.checkSessionFlash(response, 'Location must be relative path and must not contain .. in path')
 
-    @parametrize('cnt,location,filename', [
+    @base.parametrize('cnt,location,filename', [
         (1, '', 'foo.txt'),
         (2, 'dir', 'foo.rst'),
         (3, 'rel/dir', 'foo.bar'),
@@ -458,7 +458,7 @@
     def test_add_file_into_git(self, cnt, location, filename):
         self.log_user()
         repo = fixture.create_repo(u'commit-test-%s' % cnt, repo_type='git')
-        response = self.app.post(url('files_add_home',
+        response = self.app.post(base.url('files_add_home',
                                       repo_name=repo.repo_name,
                                       revision='tip', f_path='/'),
                                  params={
@@ -477,16 +477,16 @@
     # Hg - EDIT
     def test_edit_file_view_hg(self):
         self.log_user()
-        response = self.app.get(url('files_edit_home',
-                                      repo_name=HG_REPO,
+        response = self.app.get(base.url('files_edit_home',
+                                      repo_name=base.HG_REPO,
                                       revision='tip', f_path='vcs/nodes.py'))
         # Odd error when on tip ...
         self.checkSessionFlash(response, "You can only edit files with revision being a valid branch")
         assert "Commit Message" not in response.body
 
         # Specify branch head revision to avoid "valid branch" error and get coverage of edit form
-        response = self.app.get(url('files_edit_home',
-                                      repo_name=HG_REPO,
+        response = self.app.get(base.url('files_edit_home',
+                                      repo_name=base.HG_REPO,
                                       revision='96507bd11ecc815ebc6270fdf6db110928c09c1e', f_path='vcs/nodes.py'))
         assert "Commit Message" in response.body
 
@@ -497,7 +497,7 @@
         ## add file
         location = 'vcs'
         filename = 'nodes.py'
-        response = self.app.post(url('files_add_home',
+        response = self.app.post(base.url('files_add_home',
                                       repo_name=repo.repo_name,
                                       revision='tip', f_path='/'),
                                  params={
@@ -511,7 +511,7 @@
         try:
             self.checkSessionFlash(response, 'Successfully committed to %s'
                                    % posixpath.join(location, filename))
-            response = self.app.get(url('files_edit_home',
+            response = self.app.get(base.url('files_edit_home',
                                           repo_name=repo.repo_name,
                                           revision='tip', f_path=posixpath.join(location, filename)),
                                     status=302)
@@ -527,7 +527,7 @@
         ## add file
         location = 'vcs'
         filename = 'nodes.py'
-        response = self.app.post(url('files_add_home',
+        response = self.app.post(base.url('files_add_home',
                                       repo_name=repo.repo_name,
                                       revision='tip',
                                       f_path='/'),
@@ -542,7 +542,7 @@
         try:
             self.checkSessionFlash(response, 'Successfully committed to %s'
                                    % posixpath.join(location, filename))
-            response = self.app.post(url('files_edit_home',
+            response = self.app.post(base.url('files_edit_home',
                                           repo_name=repo.repo_name,
                                           revision=repo.scm_instance.DEFAULT_BRANCH_NAME,
                                           f_path=posixpath.join(location, filename)),
@@ -560,8 +560,8 @@
     # Git - edit
     def test_edit_file_view_git(self):
         self.log_user()
-        response = self.app.get(url('files_edit_home',
-                                      repo_name=GIT_REPO,
+        response = self.app.get(base.url('files_edit_home',
+                                      repo_name=base.GIT_REPO,
                                       revision='tip', f_path='vcs/nodes.py'))
 
     def test_edit_file_view_not_on_branch_git(self):
@@ -571,7 +571,7 @@
         ## add file
         location = 'vcs'
         filename = 'nodes.py'
-        response = self.app.post(url('files_add_home',
+        response = self.app.post(base.url('files_add_home',
                                       repo_name=repo.repo_name,
                                       revision='tip', f_path='/'),
                                  params={
@@ -585,7 +585,7 @@
         try:
             self.checkSessionFlash(response, 'Successfully committed to %s'
                                    % posixpath.join(location, filename))
-            response = self.app.get(url('files_edit_home',
+            response = self.app.get(base.url('files_edit_home',
                                           repo_name=repo.repo_name,
                                           revision='tip', f_path=posixpath.join(location, filename)),
                                     status=302)
@@ -601,7 +601,7 @@
         ## add file
         location = 'vcs'
         filename = 'nodes.py'
-        response = self.app.post(url('files_add_home',
+        response = self.app.post(base.url('files_add_home',
                                       repo_name=repo.repo_name,
                                       revision='tip',
                                       f_path='/'),
@@ -616,7 +616,7 @@
         try:
             self.checkSessionFlash(response, 'Successfully committed to %s'
                                    % posixpath.join(location, filename))
-            response = self.app.post(url('files_edit_home',
+            response = self.app.post(base.url('files_edit_home',
                                           repo_name=repo.repo_name,
                                           revision=repo.scm_instance.DEFAULT_BRANCH_NAME,
                                           f_path=posixpath.join(location, filename)),
@@ -634,8 +634,8 @@
     # Hg - delete
     def test_delete_file_view_hg(self):
         self.log_user()
-        response = self.app.get(url('files_delete_home',
-                                     repo_name=HG_REPO,
+        response = self.app.get(base.url('files_delete_home',
+                                     repo_name=base.HG_REPO,
                                      revision='tip', f_path='vcs/nodes.py'))
 
     def test_delete_file_view_not_on_branch_hg(self):
@@ -645,7 +645,7 @@
         ## add file
         location = 'vcs'
         filename = 'nodes.py'
-        response = self.app.post(url('files_add_home',
+        response = self.app.post(base.url('files_add_home',
                                       repo_name=repo.repo_name,
                                       revision='tip', f_path='/'),
                                  params={
@@ -659,7 +659,7 @@
         try:
             self.checkSessionFlash(response, 'Successfully committed to %s'
                                    % posixpath.join(location, filename))
-            response = self.app.get(url('files_delete_home',
+            response = self.app.get(base.url('files_delete_home',
                                           repo_name=repo.repo_name,
                                           revision='tip', f_path=posixpath.join(location, filename)),
                                     status=302)
@@ -675,7 +675,7 @@
         ## add file
         location = 'vcs'
         filename = 'nodes.py'
-        response = self.app.post(url('files_add_home',
+        response = self.app.post(base.url('files_add_home',
                                       repo_name=repo.repo_name,
                                       revision='tip',
                                       f_path='/'),
@@ -690,7 +690,7 @@
         try:
             self.checkSessionFlash(response, 'Successfully committed to %s'
                                    % posixpath.join(location, filename))
-            response = self.app.post(url('files_delete_home',
+            response = self.app.post(base.url('files_delete_home',
                                           repo_name=repo.repo_name,
                                           revision=repo.scm_instance.DEFAULT_BRANCH_NAME,
                                           f_path=posixpath.join(location, filename)),
@@ -707,8 +707,8 @@
     # Git - delete
     def test_delete_file_view_git(self):
         self.log_user()
-        response = self.app.get(url('files_delete_home',
-                                     repo_name=HG_REPO,
+        response = self.app.get(base.url('files_delete_home',
+                                     repo_name=base.HG_REPO,
                                      revision='tip', f_path='vcs/nodes.py'))
 
     def test_delete_file_view_not_on_branch_git(self):
@@ -718,7 +718,7 @@
         ## add file
         location = 'vcs'
         filename = 'nodes.py'
-        response = self.app.post(url('files_add_home',
+        response = self.app.post(base.url('files_add_home',
                                       repo_name=repo.repo_name,
                                       revision='tip', f_path='/'),
                                  params={
@@ -732,7 +732,7 @@
         try:
             self.checkSessionFlash(response, 'Successfully committed to %s'
                                    % posixpath.join(location, filename))
-            response = self.app.get(url('files_delete_home',
+            response = self.app.get(base.url('files_delete_home',
                                           repo_name=repo.repo_name,
                                           revision='tip', f_path=posixpath.join(location, filename)),
                                     status=302)
@@ -748,7 +748,7 @@
         ## add file
         location = 'vcs'
         filename = 'nodes.py'
-        response = self.app.post(url('files_add_home',
+        response = self.app.post(base.url('files_add_home',
                                       repo_name=repo.repo_name,
                                       revision='tip',
                                       f_path='/'),
@@ -763,7 +763,7 @@
         try:
             self.checkSessionFlash(response, 'Successfully committed to %s'
                                    % posixpath.join(location, filename))
-            response = self.app.post(url('files_delete_home',
+            response = self.app.post(base.url('files_delete_home',
                                           repo_name=repo.repo_name,
                                           revision=repo.scm_instance.DEFAULT_BRANCH_NAME,
                                           f_path=posixpath.join(location, filename)),
@@ -779,16 +779,16 @@
 
     def test_png_diff_no_crash_hg(self):
         self.log_user()
-        response = self.app.get(url('files_diff_home',
-                                    repo_name=HG_REPO,
+        response = self.app.get(base.url('files_diff_home',
+                                    repo_name=base.HG_REPO,
                                     f_path='docs/theme/ADC/static/documentation.png',
                                     diff1='tip', diff2='tip'))
         response.mustcontain("""<pre>Binary file</pre>""")
 
     def test_png_diff_no_crash_git(self):
         self.log_user()
-        response = self.app.get(url('files_diff_home',
-                                    repo_name=GIT_REPO,
+        response = self.app.get(base.url('files_diff_home',
+                                    repo_name=base.GIT_REPO,
                                     f_path='docs/theme/ADC/static/documentation.png',
                                     diff1='master', diff2='master'))
         response.mustcontain("""<pre>Binary file</pre>""")
--- a/kallithea/tests/functional/test_followers.py	Thu Jan 02 00:57:38 2020 +0100
+++ b/kallithea/tests/functional/test_followers.py	Thu Jan 02 00:44:56 2020 +0100
@@ -1,24 +1,24 @@
-from kallithea.tests.base import *
+from kallithea.tests import base
 
 
-class TestFollowersController(TestController):
+class TestFollowersController(base.TestController):
 
     def test_index_hg(self):
         self.log_user()
-        repo_name = HG_REPO
-        response = self.app.get(url(controller='followers',
+        repo_name = base.HG_REPO
+        response = self.app.get(base.url(controller='followers',
                                     action='followers',
                                     repo_name=repo_name))
 
-        response.mustcontain(TEST_USER_ADMIN_LOGIN)
+        response.mustcontain(base.TEST_USER_ADMIN_LOGIN)
         response.mustcontain("""Started following""")
 
     def test_index_git(self):
         self.log_user()
-        repo_name = GIT_REPO
-        response = self.app.get(url(controller='followers',
+        repo_name = base.GIT_REPO
+        response = self.app.get(base.url(controller='followers',
                                     action='followers',
                                     repo_name=repo_name))
 
-        response.mustcontain(TEST_USER_ADMIN_LOGIN)
+        response.mustcontain(base.TEST_USER_ADMIN_LOGIN)
         response.mustcontain("""Started following""")
--- a/kallithea/tests/functional/test_forks.py	Thu Jan 02 00:57:38 2020 +0100
+++ b/kallithea/tests/functional/test_forks.py	Thu Jan 02 00:44:56 2020 +0100
@@ -7,14 +7,14 @@
 from kallithea.model.meta import Session
 from kallithea.model.repo import RepoModel
 from kallithea.model.user import UserModel
-from kallithea.tests.base import *
+from kallithea.tests import base
 from kallithea.tests.fixture import Fixture
 
 
 fixture = Fixture()
 
 
-class _BaseTestCase(TestController):
+class _BaseTestCase(base.TestController):
     """
     Write all tests here
     """
@@ -37,13 +37,13 @@
     def test_index(self):
         self.log_user()
         repo_name = self.REPO
-        response = self.app.get(url(controller='forks', action='forks',
+        response = self.app.get(base.url(controller='forks', action='forks',
                                     repo_name=repo_name))
 
         response.mustcontain("""There are no forks yet""")
 
     def test_no_permissions_to_fork(self):
-        self.log_user(TEST_USER_REGULAR_LOGIN, TEST_USER_REGULAR_PASS)['user_id']
+        self.log_user(base.TEST_USER_REGULAR_LOGIN, base.TEST_USER_REGULAR_PASS)['user_id']
         try:
             user_model = UserModel()
             usr = User.get_default_user()
@@ -52,7 +52,7 @@
             Session().commit()
             # try create a fork
             repo_name = self.REPO
-            self.app.post(url(controller='forks', action='fork_create',
+            self.app.post(base.url(controller='forks', action='fork_create',
                               repo_name=repo_name), {'_session_csrf_secret_token': self.session_csrf_secret_token()}, status=403)
         finally:
             usr = User.get_default_user()
@@ -78,10 +78,10 @@
             'landing_rev': 'rev:tip',
             '_session_csrf_secret_token': self.session_csrf_secret_token()}
 
-        self.app.post(url(controller='forks', action='fork_create',
+        self.app.post(base.url(controller='forks', action='fork_create',
                           repo_name=repo_name), creation_args)
 
-        response = self.app.get(url(controller='forks', action='forks',
+        response = self.app.get(base.url(controller='forks', action='forks',
                                     repo_name=repo_name))
 
         response.mustcontain(
@@ -89,7 +89,7 @@
         )
 
         # remove this fork
-        response = self.app.post(url('delete_repo', repo_name=fork_name),
+        response = self.app.post(base.url('delete_repo', repo_name=fork_name),
             params={'_session_csrf_secret_token': self.session_csrf_secret_token()})
 
     def test_fork_create_into_group(self):
@@ -110,13 +110,13 @@
             'private': 'False',
             'landing_rev': 'rev:tip',
             '_session_csrf_secret_token': self.session_csrf_secret_token()}
-        self.app.post(url(controller='forks', action='fork_create',
+        self.app.post(base.url(controller='forks', action='fork_create',
                           repo_name=repo_name), creation_args)
         repo = Repository.get_by_repo_name(fork_name_full)
         assert repo.fork.repo_name == self.REPO
 
         ## run the check page that triggers the flash message
-        response = self.app.get(url('repo_check_home', repo_name=fork_name_full))
+        response = self.app.get(base.url('repo_check_home', repo_name=fork_name_full))
         # test if we have a message that fork is ok
         self.checkSessionFlash(response,
                 'Forked repository %s as <a href="/%s">%s</a>'
@@ -130,7 +130,7 @@
         assert fork_repo.fork.repo_name == repo_name
 
         # test if the repository is visible in the list ?
-        response = self.app.get(url('summary_home', repo_name=fork_name_full))
+        response = self.app.get(base.url('summary_home', repo_name=fork_name_full))
         response.mustcontain(fork_name_full)
         response.mustcontain(self.REPO_TYPE)
         response.mustcontain('Fork of "<a href="/%s">%s</a>"' % (repo_name, repo_name))
@@ -154,9 +154,9 @@
             'private': 'False',
             'landing_rev': 'rev:tip',
             '_session_csrf_secret_token': self.session_csrf_secret_token()}
-        self.app.post(url(controller='forks', action='fork_create',
+        self.app.post(base.url(controller='forks', action='fork_create',
                           repo_name=repo_name), creation_args)
-        response = self.app.get(url(controller='forks', action='forks',
+        response = self.app.get(base.url(controller='forks', action='forks',
                                     repo_name=repo_name))
         response.mustcontain(
             """<a href="/%s">%s</a>""" % (urllib.quote(fork_name), fork_name)
@@ -175,18 +175,18 @@
             'private': 'False',
             'landing_rev': 'rev:tip',
             '_session_csrf_secret_token': self.session_csrf_secret_token()}
-        self.app.post(url(controller='forks', action='fork_create',
+        self.app.post(base.url(controller='forks', action='fork_create',
                           repo_name=fork_name), creation_args)
-        response = self.app.get(url(controller='forks', action='forks',
+        response = self.app.get(base.url(controller='forks', action='forks',
                                     repo_name=fork_name))
         response.mustcontain(
             """<a href="/%s">%s</a>""" % (urllib.quote(fork_name_2), fork_name_2)
         )
 
         # remove these forks
-        response = self.app.post(url('delete_repo', repo_name=fork_name_2),
+        response = self.app.post(base.url('delete_repo', repo_name=fork_name_2),
             params={'_session_csrf_secret_token': self.session_csrf_secret_token()})
-        response = self.app.post(url('delete_repo', repo_name=fork_name),
+        response = self.app.post(base.url('delete_repo', repo_name=fork_name),
             params={'_session_csrf_secret_token': self.session_csrf_secret_token()})
 
     def test_fork_create_and_permissions(self):
@@ -204,13 +204,13 @@
             'private': 'False',
             'landing_rev': 'rev:tip',
             '_session_csrf_secret_token': self.session_csrf_secret_token()}
-        self.app.post(url(controller='forks', action='fork_create',
+        self.app.post(base.url(controller='forks', action='fork_create',
                           repo_name=repo_name), creation_args)
         repo = Repository.get_by_repo_name(self.REPO_FORK)
         assert repo.fork.repo_name == self.REPO
 
         ## run the check page that triggers the flash message
-        response = self.app.get(url('repo_check_home', repo_name=fork_name))
+        response = self.app.get(base.url('repo_check_home', repo_name=fork_name))
         # test if we have a message that fork is ok
         self.checkSessionFlash(response,
                 'Forked repository %s as <a href="/%s">%s</a>'
@@ -224,7 +224,7 @@
         assert fork_repo.fork.repo_name == repo_name
 
         # test if the repository is visible in the list ?
-        response = self.app.get(url('summary_home', repo_name=fork_name))
+        response = self.app.get(base.url('summary_home', repo_name=fork_name))
         response.mustcontain(fork_name)
         response.mustcontain(self.REPO_TYPE)
         response.mustcontain('Fork of "<a href="/%s">%s</a>"' % (repo_name, repo_name))
@@ -242,7 +242,7 @@
                                           perm='repository.read')
         Session().commit()
 
-        response = self.app.get(url(controller='forks', action='forks',
+        response = self.app.get(base.url(controller='forks', action='forks',
                                     repo_name=repo_name))
 
         response.mustcontain('<div>fork of vcs test</div>')
@@ -257,7 +257,7 @@
             Session().commit()
 
             # fork shouldn't be visible
-            response = self.app.get(url(controller='forks', action='forks',
+            response = self.app.get(base.url(controller='forks', action='forks',
                                         repo_name=repo_name))
             response.mustcontain('There are no forks yet')
 
@@ -270,14 +270,14 @@
 
 
 class TestGIT(_BaseTestCase):
-    REPO = GIT_REPO
-    NEW_REPO = NEW_GIT_REPO
+    REPO = base.GIT_REPO
+    NEW_REPO = base.NEW_GIT_REPO
     REPO_TYPE = 'git'
-    REPO_FORK = GIT_FORK
+    REPO_FORK = base.GIT_FORK
 
 
 class TestHG(_BaseTestCase):
-    REPO = HG_REPO
-    NEW_REPO = NEW_HG_REPO
+    REPO = base.HG_REPO
+    NEW_REPO = base.NEW_HG_REPO
     REPO_TYPE = 'hg'
-    REPO_FORK = HG_FORK
+    REPO_FORK = base.HG_FORK
--- a/kallithea/tests/functional/test_home.py	Thu Jan 02 00:57:38 2020 +0100
+++ b/kallithea/tests/functional/test_home.py	Thu Jan 02 00:44:56 2020 +0100
@@ -4,18 +4,18 @@
 from kallithea.model.meta import Session
 from kallithea.model.repo import RepoModel
 from kallithea.model.repo_group import RepoGroupModel
-from kallithea.tests.base import *
+from kallithea.tests import base
 from kallithea.tests.fixture import Fixture
 
 
 fixture = Fixture()
 
 
-class TestHomeController(TestController):
+class TestHomeController(base.TestController):
 
     def test_index(self):
         self.log_user()
-        response = self.app.get(url(controller='home', action='index'))
+        response = self.app.get(base.url(controller='home', action='index'))
         # if global permission is set
         response.mustcontain('Add Repository')
 
@@ -28,26 +28,26 @@
         )
 
         # html in javascript variable:
-        response.mustcontain(r'href=\"/%s\"' % HG_REPO)
+        response.mustcontain(r'href=\"/%s\"' % base.HG_REPO)
 
         response.mustcontain(r'\x3ci class=\"icon-globe\"')
 
         response.mustcontain(r'\"fixes issue with having custom format for git-log\n\"')
-        response.mustcontain(r'\"/%s/changeset/5f2c6ee195929b0be80749243c18121c9864a3b3\"' % GIT_REPO)
+        response.mustcontain(r'\"/%s/changeset/5f2c6ee195929b0be80749243c18121c9864a3b3\"' % base.GIT_REPO)
 
         response.mustcontain(r'\"disable security checks on hg clone for travis\"')
-        response.mustcontain(r'\"/%s/changeset/96507bd11ecc815ebc6270fdf6db110928c09c1e\"' % HG_REPO)
+        response.mustcontain(r'\"/%s/changeset/96507bd11ecc815ebc6270fdf6db110928c09c1e\"' % base.HG_REPO)
 
     def test_repo_summary_with_anonymous_access_disabled(self):
         with fixture.anon_access(False):
-            response = self.app.get(url(controller='summary',
-                                        action='index', repo_name=HG_REPO),
+            response = self.app.get(base.url(controller='summary',
+                                        action='index', repo_name=base.HG_REPO),
                                         status=302)
             assert 'login' in response.location
 
     def test_index_with_anonymous_access_disabled(self):
         with fixture.anon_access(False):
-            response = self.app.get(url(controller='home', action='index'),
+            response = self.app.get(base.url(controller='home', action='index'),
                                     status=302)
             assert 'login' in response.location
 
@@ -55,7 +55,7 @@
         self.log_user()
         gr = fixture.create_repo_group(u'gr1')
         fixture.create_repo(name=u'gr1/repo_in_group', repo_group=gr)
-        response = self.app.get(url('repos_group_home', group_name=u'gr1'))
+        response = self.app.get(base.url('repos_group_home', group_name=u'gr1'))
 
         try:
             response.mustcontain(u"gr1/repo_in_group")
@@ -67,21 +67,21 @@
     def test_users_and_groups_data(self):
         fixture.create_user('evil', firstname=u'D\'o\'ct"o"r', lastname=u'Évíl')
         fixture.create_user_group(u'grrrr', user_group_description=u"Groüp")
-        response = self.app.get(url('users_and_groups_data', query=u'evi'))
+        response = self.app.get(base.url('users_and_groups_data', query=u'evi'))
         assert response.status_code == 302
-        assert url('login_home') in response.location
-        self.log_user(TEST_USER_REGULAR_LOGIN, TEST_USER_REGULAR_PASS)
-        response = self.app.get(url('users_and_groups_data', query=u'evi'))
+        assert base.url('login_home') in response.location
+        self.log_user(base.TEST_USER_REGULAR_LOGIN, base.TEST_USER_REGULAR_PASS)
+        response = self.app.get(base.url('users_and_groups_data', query=u'evi'))
         result = json.loads(response.body)['results']
         assert result[0].get('fname') == u'D\'o\'ct"o"r'
         assert result[0].get('lname') == u'Évíl'
-        response = self.app.get(url('users_and_groups_data', key=u'evil'))
+        response = self.app.get(base.url('users_and_groups_data', key=u'evil'))
         result = json.loads(response.body)['results']
         assert result[0].get('fname') == u'D\'o\'ct"o"r'
         assert result[0].get('lname') == u'Évíl'
-        response = self.app.get(url('users_and_groups_data', query=u'rrrr'))
+        response = self.app.get(base.url('users_and_groups_data', query=u'rrrr'))
         result = json.loads(response.body)['results']
         assert not result
-        response = self.app.get(url('users_and_groups_data', types='users,groups', query=u'rrrr'))
+        response = self.app.get(base.url('users_and_groups_data', types='users,groups', query=u'rrrr'))
         result = json.loads(response.body)['results']
         assert result[0].get('grname') == u'grrrr'
--- a/kallithea/tests/functional/test_journal.py	Thu Jan 02 00:57:38 2020 +0100
+++ b/kallithea/tests/functional/test_journal.py	Thu Jan 02 00:44:56 2020 +0100
@@ -1,13 +1,13 @@
 import datetime
 
-from kallithea.tests.base import *
+from kallithea.tests import base
 
 
-class TestJournalController(TestController):
+class TestJournalController(base.TestController):
 
     def test_index(self):
         self.log_user()
-        response = self.app.get(url(controller='journal', action='index'))
+        response = self.app.get(base.url(controller='journal', action='index'))
 
         response.mustcontain("""<h4>%s</h4>""" % datetime.date.today())
 
@@ -22,18 +22,18 @@
 #
 #        assert len(followings) == 1, 'Not following any repository'
 #
-#        response = self.app.post(url(controller='journal',
+#        response = self.app.post(base.url(controller='journal',
 #                                     action='toggle_following'),
 #                                     {'follows_repository_id':repo.repo_id})
 
     def test_start_following_repository(self):
         self.log_user()
-        response = self.app.get(url(controller='journal', action='index'),)
+        response = self.app.get(base.url(controller='journal', action='index'),)
 
     def test_public_journal_atom(self):
         self.log_user()
-        response = self.app.get(url(controller='journal', action='public_journal_atom'),)
+        response = self.app.get(base.url(controller='journal', action='public_journal_atom'),)
 
     def test_public_journal_rss(self):
         self.log_user()
-        response = self.app.get(url(controller='journal', action='public_journal_rss'),)
+        response = self.app.get(base.url(controller='journal', action='public_journal_rss'),)
--- a/kallithea/tests/functional/test_login.py	Thu Jan 02 00:57:38 2020 +0100
+++ b/kallithea/tests/functional/test_login.py	Thu Jan 02 00:44:56 2020 +0100
@@ -13,61 +13,61 @@
 from kallithea.model.db import User
 from kallithea.model.meta import Session
 from kallithea.model.user import UserModel
-from kallithea.tests.base import *
+from kallithea.tests import base
 from kallithea.tests.fixture import Fixture
 
 
 fixture = Fixture()
 
 
-class TestLoginController(TestController):
+class TestLoginController(base.TestController):
 
     def test_index(self):
-        response = self.app.get(url(controller='login', action='index'))
+        response = self.app.get(base.url(controller='login', action='index'))
         assert response.status == '200 OK'
         # Test response...
 
     def test_login_admin_ok(self):
-        response = self.app.post(url(controller='login', action='index'),
-                                 {'username': TEST_USER_ADMIN_LOGIN,
-                                  'password': TEST_USER_ADMIN_PASS,
+        response = self.app.post(base.url(controller='login', action='index'),
+                                 {'username': base.TEST_USER_ADMIN_LOGIN,
+                                  'password': base.TEST_USER_ADMIN_PASS,
                                   '_session_csrf_secret_token': self.session_csrf_secret_token()})
         assert response.status == '302 Found'
-        self.assert_authenticated_user(response, TEST_USER_ADMIN_LOGIN)
+        self.assert_authenticated_user(response, base.TEST_USER_ADMIN_LOGIN)
 
         response = response.follow()
-        response.mustcontain('/%s' % HG_REPO)
+        response.mustcontain('/%s' % base.HG_REPO)
 
     def test_login_regular_ok(self):
-        response = self.app.post(url(controller='login', action='index'),
-                                 {'username': TEST_USER_REGULAR_LOGIN,
-                                  'password': TEST_USER_REGULAR_PASS,
+        response = self.app.post(base.url(controller='login', action='index'),
+                                 {'username': base.TEST_USER_REGULAR_LOGIN,
+                                  'password': base.TEST_USER_REGULAR_PASS,
                                   '_session_csrf_secret_token': self.session_csrf_secret_token()})
 
         assert response.status == '302 Found'
-        self.assert_authenticated_user(response, TEST_USER_REGULAR_LOGIN)
+        self.assert_authenticated_user(response, base.TEST_USER_REGULAR_LOGIN)
 
         response = response.follow()
-        response.mustcontain('/%s' % HG_REPO)
+        response.mustcontain('/%s' % base.HG_REPO)
 
     def test_login_regular_email_ok(self):
-        response = self.app.post(url(controller='login', action='index'),
-                                 {'username': TEST_USER_REGULAR_EMAIL,
-                                  'password': TEST_USER_REGULAR_PASS,
+        response = self.app.post(base.url(controller='login', action='index'),
+                                 {'username': base.TEST_USER_REGULAR_EMAIL,
+                                  'password': base.TEST_USER_REGULAR_PASS,
                                   '_session_csrf_secret_token': self.session_csrf_secret_token()})
 
         assert response.status == '302 Found'
-        self.assert_authenticated_user(response, TEST_USER_REGULAR_LOGIN)
+        self.assert_authenticated_user(response, base.TEST_USER_REGULAR_LOGIN)
 
         response = response.follow()
-        response.mustcontain('/%s' % HG_REPO)
+        response.mustcontain('/%s' % base.HG_REPO)
 
     def test_login_ok_came_from(self):
         test_came_from = '/_admin/users'
-        response = self.app.post(url(controller='login', action='index',
+        response = self.app.post(base.url(controller='login', action='index',
                                      came_from=test_came_from),
-                                 {'username': TEST_USER_ADMIN_LOGIN,
-                                  'password': TEST_USER_ADMIN_PASS,
+                                 {'username': base.TEST_USER_ADMIN_LOGIN,
+                                  'password': base.TEST_USER_ADMIN_PASS,
                                   '_session_csrf_secret_token': self.session_csrf_secret_token()})
         assert response.status == '302 Found'
         response = response.follow()
@@ -76,9 +76,9 @@
         response.mustcontain('Users Administration')
 
     def test_login_do_not_remember(self):
-        response = self.app.post(url(controller='login', action='index'),
-                                 {'username': TEST_USER_REGULAR_LOGIN,
-                                  'password': TEST_USER_REGULAR_PASS,
+        response = self.app.post(base.url(controller='login', action='index'),
+                                 {'username': base.TEST_USER_REGULAR_LOGIN,
+                                  'password': base.TEST_USER_REGULAR_PASS,
                                   'remember': False,
                                   '_session_csrf_secret_token': self.session_csrf_secret_token()})
 
@@ -87,9 +87,9 @@
             assert not re.search(r';\s+(Max-Age|Expires)=', cookie, re.IGNORECASE), 'Cookie %r has expiration date, but should be a session cookie' % cookie
 
     def test_login_remember(self):
-        response = self.app.post(url(controller='login', action='index'),
-                                 {'username': TEST_USER_REGULAR_LOGIN,
-                                  'password': TEST_USER_REGULAR_PASS,
+        response = self.app.post(base.url(controller='login', action='index'),
+                                 {'username': base.TEST_USER_REGULAR_LOGIN,
+                                  'password': base.TEST_USER_REGULAR_PASS,
                                   'remember': True,
                                   '_session_csrf_secret_token': self.session_csrf_secret_token()})
 
@@ -98,23 +98,23 @@
             assert re.search(r';\s+(Max-Age|Expires)=', cookie, re.IGNORECASE), 'Cookie %r should have expiration date, but is a session cookie' % cookie
 
     def test_logout(self):
-        response = self.app.post(url(controller='login', action='index'),
-                                 {'username': TEST_USER_REGULAR_LOGIN,
-                                  'password': TEST_USER_REGULAR_PASS,
+        response = self.app.post(base.url(controller='login', action='index'),
+                                 {'username': base.TEST_USER_REGULAR_LOGIN,
+                                  'password': base.TEST_USER_REGULAR_PASS,
                                   '_session_csrf_secret_token': self.session_csrf_secret_token()})
 
         # Verify that a login session has been established.
-        response = self.app.get(url(controller='login', action='index'))
+        response = self.app.get(base.url(controller='login', action='index'))
         response = response.follow()
         assert 'authuser' in response.session
 
         response.click('Log Out')
 
         # Verify that the login session has been terminated.
-        response = self.app.get(url(controller='login', action='index'))
+        response = self.app.get(base.url(controller='login', action='index'))
         assert 'authuser' not in response.session
 
-    @parametrize('url_came_from', [
+    @base.parametrize('url_came_from', [
           ('data:text/html,<script>window.alert("xss")</script>',),
           ('mailto:test@example.com',),
           ('file:///etc/passwd',),
@@ -126,16 +126,16 @@
           ('non-absolute-path',),
     ])
     def test_login_bad_came_froms(self, url_came_from):
-        response = self.app.post(url(controller='login', action='index',
+        response = self.app.post(base.url(controller='login', action='index',
                                      came_from=url_came_from),
-                                 {'username': TEST_USER_ADMIN_LOGIN,
-                                  'password': TEST_USER_ADMIN_PASS,
+                                 {'username': base.TEST_USER_ADMIN_LOGIN,
+                                  'password': base.TEST_USER_ADMIN_PASS,
                                   '_session_csrf_secret_token': self.session_csrf_secret_token()},
                                  status=400)
 
     def test_login_short_password(self):
-        response = self.app.post(url(controller='login', action='index'),
-                                 {'username': TEST_USER_ADMIN_LOGIN,
+        response = self.app.post(base.url(controller='login', action='index'),
+                                 {'username': base.TEST_USER_ADMIN_LOGIN,
                                   'password': 'as',
                                   '_session_csrf_secret_token': self.session_csrf_secret_token()})
         assert response.status == '200 OK'
@@ -143,7 +143,7 @@
         response.mustcontain('Enter 3 characters or more')
 
     def test_login_wrong_username_password(self):
-        response = self.app.post(url(controller='login', action='index'),
+        response = self.app.post(base.url(controller='login', action='index'),
                                  {'username': 'error',
                                   'password': 'test12',
                                   '_session_csrf_secret_token': self.session_csrf_secret_token()})
@@ -151,8 +151,8 @@
         response.mustcontain('Invalid username or password')
 
     def test_login_non_ascii(self):
-        response = self.app.post(url(controller='login', action='index'),
-                                 {'username': TEST_USER_REGULAR_LOGIN,
+        response = self.app.post(base.url(controller='login', action='index'),
+                                 {'username': base.TEST_USER_REGULAR_LOGIN,
                                   'password': 'blåbærgrød',
                                   '_session_csrf_secret_token': self.session_csrf_secret_token()})
 
@@ -160,55 +160,55 @@
 
     # verify that get arguments are correctly passed along login redirection
 
-    @parametrize('args', [
+    @base.parametrize('args', [
         {'foo':'one', 'bar':'two'},
         {'blue': u'blå', 'green': u'grøn'},
     ])
     def test_redirection_to_login_form_preserves_get_args(self, args):
         with fixture.anon_access(False):
-            response = self.app.get(url(controller='summary', action='index',
-                                        repo_name=HG_REPO,
+            response = self.app.get(base.url(controller='summary', action='index',
+                                        repo_name=base.HG_REPO,
                                         **args))
             assert response.status == '302 Found'
             came_from = urlparse.parse_qs(urlparse.urlparse(response.location).query)['came_from'][0]
             came_from_qs = urlparse.parse_qsl(urlparse.urlparse(came_from).query)
             assert sorted(came_from_qs) == sorted((k, v.encode('utf-8')) for k, v in args.items())
 
-    @parametrize('args,args_encoded', [
+    @base.parametrize('args,args_encoded', [
         ({'foo':'one', 'bar':'two'}, ('foo=one', 'bar=two')),
         ({'blue': u'blå', 'green':u'grøn'},
              ('blue=bl%C3%A5', 'green=gr%C3%B8n')),
     ])
     def test_login_form_preserves_get_args(self, args, args_encoded):
-        response = self.app.get(url(controller='login', action='index',
-                                    came_from=url('/_admin/users', **args)))
+        response = self.app.get(base.url(controller='login', action='index',
+                                    came_from=base.url('/_admin/users', **args)))
         came_from = urlparse.parse_qs(urlparse.urlparse(response.form.action).query)['came_from'][0]
         for encoded in args_encoded:
             assert encoded in came_from
 
-    @parametrize('args,args_encoded', [
+    @base.parametrize('args,args_encoded', [
         ({'foo':'one', 'bar':'two'}, ('foo=one', 'bar=two')),
         ({'blue': u'blå', 'green':u'grøn'},
              ('blue=bl%C3%A5', 'green=gr%C3%B8n')),
     ])
     def test_redirection_after_successful_login_preserves_get_args(self, args, args_encoded):
-        response = self.app.post(url(controller='login', action='index',
-                                     came_from=url('/_admin/users', **args)),
-                                 {'username': TEST_USER_ADMIN_LOGIN,
-                                  'password': TEST_USER_ADMIN_PASS,
+        response = self.app.post(base.url(controller='login', action='index',
+                                     came_from=base.url('/_admin/users', **args)),
+                                 {'username': base.TEST_USER_ADMIN_LOGIN,
+                                  'password': base.TEST_USER_ADMIN_PASS,
                                   '_session_csrf_secret_token': self.session_csrf_secret_token()})
         assert response.status == '302 Found'
         for encoded in args_encoded:
             assert encoded in response.location
 
-    @parametrize('args,args_encoded', [
+    @base.parametrize('args,args_encoded', [
         ({'foo':'one', 'bar':'two'}, ('foo=one', 'bar=two')),
         ({'blue': u'blå', 'green':u'grøn'},
              ('blue=bl%C3%A5', 'green=gr%C3%B8n')),
     ])
     def test_login_form_after_incorrect_login_preserves_get_args(self, args, args_encoded):
-        response = self.app.post(url(controller='login', action='index',
-                                     came_from=url('/_admin/users', **args)),
+        response = self.app.post(base.url(controller='login', action='index',
+                                     came_from=base.url('/_admin/users', **args)),
                                  {'username': 'error',
                                   'password': 'test12',
                                   '_session_csrf_secret_token': self.session_csrf_secret_token()})
@@ -222,12 +222,12 @@
     # REGISTRATIONS
     #==========================================================================
     def test_register(self):
-        response = self.app.get(url(controller='login', action='register'))
+        response = self.app.get(base.url(controller='login', action='register'))
         response.mustcontain('Sign Up')
 
     def test_register_err_same_username(self):
-        uname = TEST_USER_ADMIN_LOGIN
-        response = self.app.post(url(controller='login', action='register'),
+        uname = base.TEST_USER_ADMIN_LOGIN
+        response = self.app.post(base.url(controller='login', action='register'),
                                             {'username': uname,
                                              'password': 'test12',
                                              'password_confirmation': 'test12',
@@ -242,11 +242,11 @@
         response.mustcontain(msg)
 
     def test_register_err_same_email(self):
-        response = self.app.post(url(controller='login', action='register'),
+        response = self.app.post(base.url(controller='login', action='register'),
                                             {'username': 'test_admin_0',
                                              'password': 'test12',
                                              'password_confirmation': 'test12',
-                                             'email': TEST_USER_ADMIN_EMAIL,
+                                             'email': base.TEST_USER_ADMIN_EMAIL,
                                              'firstname': 'test',
                                              'lastname': 'test',
                                              '_session_csrf_secret_token': self.session_csrf_secret_token()})
@@ -256,11 +256,11 @@
         response.mustcontain(msg)
 
     def test_register_err_same_email_case_sensitive(self):
-        response = self.app.post(url(controller='login', action='register'),
+        response = self.app.post(base.url(controller='login', action='register'),
                                             {'username': 'test_admin_1',
                                              'password': 'test12',
                                              'password_confirmation': 'test12',
-                                             'email': TEST_USER_ADMIN_EMAIL.title(),
+                                             'email': base.TEST_USER_ADMIN_EMAIL.title(),
                                              'firstname': 'test',
                                              'lastname': 'test',
                                              '_session_csrf_secret_token': self.session_csrf_secret_token()})
@@ -269,7 +269,7 @@
         response.mustcontain(msg)
 
     def test_register_err_wrong_data(self):
-        response = self.app.post(url(controller='login', action='register'),
+        response = self.app.post(base.url(controller='login', action='register'),
                                             {'username': 'xs',
                                              'password': 'test',
                                              'password_confirmation': 'test',
@@ -282,7 +282,7 @@
         response.mustcontain('Enter a value 6 characters long or more')
 
     def test_register_err_username(self):
-        response = self.app.post(url(controller='login', action='register'),
+        response = self.app.post(base.url(controller='login', action='register'),
                                             {'username': 'error user',
                                              'password': 'test12',
                                              'password_confirmation': 'test12',
@@ -298,8 +298,8 @@
                 'alphanumeric character')
 
     def test_register_err_case_sensitive(self):
-        usr = TEST_USER_ADMIN_LOGIN.title()
-        response = self.app.post(url(controller='login', action='register'),
+        usr = base.TEST_USER_ADMIN_LOGIN.title()
+        response = self.app.post(base.url(controller='login', action='register'),
                                             {'username': usr,
                                              'password': 'test12',
                                              'password_confirmation': 'test12',
@@ -315,7 +315,7 @@
         response.mustcontain(msg)
 
     def test_register_special_chars(self):
-        response = self.app.post(url(controller='login', action='register'),
+        response = self.app.post(base.url(controller='login', action='register'),
                                         {'username': 'xxxaxn',
                                          'password': 'ąćźżąśśśś',
                                          'password_confirmation': 'ąćźżąśśśś',
@@ -329,7 +329,7 @@
         response.mustcontain(msg)
 
     def test_register_password_mismatch(self):
-        response = self.app.post(url(controller='login', action='register'),
+        response = self.app.post(base.url(controller='login', action='register'),
                                             {'username': 'xs',
                                              'password': '123qwe',
                                              'password_confirmation': 'qwe123',
@@ -348,7 +348,7 @@
         name = 'testname'
         lastname = 'testlastname'
 
-        response = self.app.post(url(controller='login', action='register'),
+        response = self.app.post(base.url(controller='login', action='register'),
                                             {'username': username,
                                              'password': password,
                                              'password_confirmation': password,
@@ -376,14 +376,14 @@
     def test_forgot_password_wrong_mail(self):
         bad_email = 'username%wrongmail.org'
         response = self.app.post(
-                        url(controller='login', action='password_reset'),
+                        base.url(controller='login', action='password_reset'),
                             {'email': bad_email,
                              '_session_csrf_secret_token': self.session_csrf_secret_token()})
 
         response.mustcontain('An email address must contain a single @')
 
     def test_forgot_password(self):
-        response = self.app.get(url(controller='login',
+        response = self.app.get(base.url(controller='login',
                                     action='password_reset'))
         assert response.status == '200 OK'
 
@@ -404,7 +404,7 @@
         Session().add(new)
         Session().commit()
 
-        response = self.app.post(url(controller='login',
+        response = self.app.post(base.url(controller='login',
                                      action='password_reset'),
                                  {'email': email,
                                   '_session_csrf_secret_token': self.session_csrf_secret_token()})
@@ -417,7 +417,7 @@
 
         token = "bad"
 
-        response = self.app.post(url(controller='login',
+        response = self.app.post(base.url(controller='login',
                                      action='password_reset_confirmation'),
                                  {'email': email,
                                   'timestamp': timestamp,
@@ -437,7 +437,7 @@
         token = UserModel().get_reset_password_token(
             User.get_by_username(username), timestamp, self.session_csrf_secret_token())
 
-        response = self.app.get(url(controller='login',
+        response = self.app.get(base.url(controller='login',
                                     action='password_reset_confirmation',
                                     email=email,
                                     timestamp=timestamp,
@@ -445,7 +445,7 @@
         assert response.status == '200 OK'
         response.mustcontain("You are about to set a new password for the email address %s" % email)
 
-        response = self.app.post(url(controller='login',
+        response = self.app.post(base.url(controller='login',
                                      action='password_reset_confirmation'),
                                  {'email': email,
                                   'timestamp': timestamp,
@@ -481,16 +481,16 @@
                 params = {'api_key': api_key}
                 headers = {'Authorization': 'Bearer ' + str(api_key)}
 
-            self.app.get(url(controller='changeset', action='changeset_raw',
-                             repo_name=HG_REPO, revision='tip', **params),
+            self.app.get(base.url(controller='changeset', action='changeset_raw',
+                             repo_name=base.HG_REPO, revision='tip', **params),
                          status=status)
 
-            self.app.get(url(controller='changeset', action='changeset_raw',
-                             repo_name=HG_REPO, revision='tip'),
+            self.app.get(base.url(controller='changeset', action='changeset_raw',
+                             repo_name=base.HG_REPO, revision='tip'),
                          headers=headers,
                          status=status)
 
-    @parametrize('test_name,api_key,code', [
+    @base.parametrize('test_name,api_key,code', [
         ('none', None, 302),
         ('empty_string', '', 403),
         ('fake_number', '123456', 403),
@@ -502,12 +502,12 @@
         self._api_key_test(api_key, code)
 
     def test_access_page_via_extra_api_key(self):
-        new_api_key = ApiKeyModel().create(TEST_USER_ADMIN_LOGIN, u'test')
+        new_api_key = ApiKeyModel().create(base.TEST_USER_ADMIN_LOGIN, u'test')
         Session().commit()
         self._api_key_test(new_api_key.api_key, status=200)
 
     def test_access_page_via_expired_api_key(self):
-        new_api_key = ApiKeyModel().create(TEST_USER_ADMIN_LOGIN, u'test')
+        new_api_key = ApiKeyModel().create(base.TEST_USER_ADMIN_LOGIN, u'test')
         Session().commit()
         # patch the API key and make it expired
         new_api_key.expires = 0
--- a/kallithea/tests/functional/test_my_account.py	Thu Jan 02 00:57:38 2020 +0100
+++ b/kallithea/tests/functional/test_my_account.py	Thu Jan 02 00:44:56 2020 +0100
@@ -6,14 +6,14 @@
 from kallithea.model.db import Repository, User, UserApiKeys, UserFollowing, UserSshKeys
 from kallithea.model.meta import Session
 from kallithea.model.user import UserModel
-from kallithea.tests.base import *
+from kallithea.tests import base
 from kallithea.tests.fixture import Fixture
 
 
 fixture = Fixture()
 
 
-class TestMyAccountController(TestController):
+class TestMyAccountController(base.TestController):
     test_user_1 = 'testme'
 
     @classmethod
@@ -24,74 +24,74 @@
 
     def test_my_account(self):
         self.log_user()
-        response = self.app.get(url('my_account'))
+        response = self.app.get(base.url('my_account'))
 
-        response.mustcontain('value="%s' % TEST_USER_ADMIN_LOGIN)
+        response.mustcontain('value="%s' % base.TEST_USER_ADMIN_LOGIN)
 
     def test_my_account_my_repos(self):
         self.log_user()
-        response = self.app.get(url('my_account_repos'))
+        response = self.app.get(base.url('my_account_repos'))
         cnt = Repository.query().filter(Repository.owner ==
-                           User.get_by_username(TEST_USER_ADMIN_LOGIN)).count()
-        response.mustcontain('"raw_name": "%s"' % HG_REPO)
-        response.mustcontain('"just_name": "%s"' % GIT_REPO)
+                           User.get_by_username(base.TEST_USER_ADMIN_LOGIN)).count()
+        response.mustcontain('"raw_name": "%s"' % base.HG_REPO)
+        response.mustcontain('"just_name": "%s"' % base.GIT_REPO)
 
     def test_my_account_my_watched(self):
         self.log_user()
-        response = self.app.get(url('my_account_watched'))
+        response = self.app.get(base.url('my_account_watched'))
 
         cnt = UserFollowing.query().filter(UserFollowing.user ==
-                            User.get_by_username(TEST_USER_ADMIN_LOGIN)).count()
-        response.mustcontain('"raw_name": "%s"' % HG_REPO)
-        response.mustcontain('"just_name": "%s"' % GIT_REPO)
+                            User.get_by_username(base.TEST_USER_ADMIN_LOGIN)).count()
+        response.mustcontain('"raw_name": "%s"' % base.HG_REPO)
+        response.mustcontain('"just_name": "%s"' % base.GIT_REPO)
 
     def test_my_account_my_emails(self):
         self.log_user()
-        response = self.app.get(url('my_account_emails'))
+        response = self.app.get(base.url('my_account_emails'))
         response.mustcontain('No additional emails specified')
 
     def test_my_account_my_emails_add_existing_email(self):
         self.log_user()
-        response = self.app.get(url('my_account_emails'))
+        response = self.app.get(base.url('my_account_emails'))
         response.mustcontain('No additional emails specified')
-        response = self.app.post(url('my_account_emails'),
-                                 {'new_email': TEST_USER_REGULAR_EMAIL, '_session_csrf_secret_token': self.session_csrf_secret_token()})
+        response = self.app.post(base.url('my_account_emails'),
+                                 {'new_email': base.TEST_USER_REGULAR_EMAIL, '_session_csrf_secret_token': self.session_csrf_secret_token()})
         self.checkSessionFlash(response, 'This email address is already in use')
 
     def test_my_account_my_emails_add_missing_email_in_form(self):
         self.log_user()
-        response = self.app.get(url('my_account_emails'))
+        response = self.app.get(base.url('my_account_emails'))
         response.mustcontain('No additional emails specified')
-        response = self.app.post(url('my_account_emails'),
+        response = self.app.post(base.url('my_account_emails'),
             {'_session_csrf_secret_token': self.session_csrf_secret_token()})
         self.checkSessionFlash(response, 'Please enter an email address')
 
     def test_my_account_my_emails_add_remove(self):
         self.log_user()
-        response = self.app.get(url('my_account_emails'))
+        response = self.app.get(base.url('my_account_emails'))
         response.mustcontain('No additional emails specified')
 
-        response = self.app.post(url('my_account_emails'),
+        response = self.app.post(base.url('my_account_emails'),
                                  {'new_email': 'barz@example.com', '_session_csrf_secret_token': self.session_csrf_secret_token()})
 
-        response = self.app.get(url('my_account_emails'))
+        response = self.app.get(base.url('my_account_emails'))
 
         from kallithea.model.db import UserEmailMap
         email_id = UserEmailMap.query() \
-            .filter(UserEmailMap.user == User.get_by_username(TEST_USER_ADMIN_LOGIN)) \
+            .filter(UserEmailMap.user == User.get_by_username(base.TEST_USER_ADMIN_LOGIN)) \
             .filter(UserEmailMap.email == 'barz@example.com').one().email_id
 
         response.mustcontain('barz@example.com')
         response.mustcontain('<input id="del_email_id" name="del_email_id" type="hidden" value="%s" />' % email_id)
 
-        response = self.app.post(url('my_account_emails_delete'),
+        response = self.app.post(base.url('my_account_emails_delete'),
                                  {'del_email_id': email_id, '_session_csrf_secret_token': self.session_csrf_secret_token()})
         self.checkSessionFlash(response, 'Removed email from user')
-        response = self.app.get(url('my_account_emails'))
+        response = self.app.get(base.url('my_account_emails'))
         response.mustcontain('No additional emails specified')
 
 
-    @parametrize('name,attrs',
+    @base.parametrize('name,attrs',
         [('firstname', {'firstname': 'new_username'}),
          ('lastname', {'lastname': 'new_username'}),
          ('admin', {'admin': True}),
@@ -123,7 +123,7 @@
         params.update({'_session_csrf_secret_token': self.session_csrf_secret_token()})
 
         params.update(attrs)
-        response = self.app.post(url('my_account'), params)
+        response = self.app.post(base.url('my_account'), params)
 
         self.checkSessionFlash(response,
                                'Your account was updated successfully')
@@ -155,11 +155,11 @@
     def test_my_account_update_err_email_exists(self):
         self.log_user()
 
-        new_email = TEST_USER_REGULAR_EMAIL  # already existing email
-        response = self.app.post(url('my_account'),
+        new_email = base.TEST_USER_REGULAR_EMAIL  # already existing email
+        response = self.app.post(base.url('my_account'),
                                 params=dict(
-                                    username=TEST_USER_ADMIN_LOGIN,
-                                    new_password=TEST_USER_ADMIN_PASS,
+                                    username=base.TEST_USER_ADMIN_LOGIN,
+                                    new_password=base.TEST_USER_ADMIN_PASS,
                                     password_confirmation='test122',
                                     firstname=u'NewName',
                                     lastname=u'NewLastname',
@@ -170,13 +170,13 @@
         response.mustcontain('This email address is already in use')
 
     def test_my_account_update_err(self):
-        self.log_user(TEST_USER_REGULAR2_LOGIN, TEST_USER_REGULAR2_PASS)
+        self.log_user(base.TEST_USER_REGULAR2_LOGIN, base.TEST_USER_REGULAR2_PASS)
 
         new_email = 'newmail.pl'
-        response = self.app.post(url('my_account'),
+        response = self.app.post(base.url('my_account'),
                                  params=dict(
-                                            username=TEST_USER_ADMIN_LOGIN,
-                                            new_password=TEST_USER_ADMIN_PASS,
+                                            username=base.TEST_USER_ADMIN_LOGIN,
+                                            new_password=base.TEST_USER_ADMIN_PASS,
                                             password_confirmation='test122',
                                             firstname=u'NewName',
                                             lastname=u'NewLastname',
@@ -188,25 +188,25 @@
         with test_context(self.app):
             msg = validators.ValidUsername(edit=False, old_data={}) \
                     ._messages['username_exists']
-        msg = h.html_escape(msg % {'username': TEST_USER_ADMIN_LOGIN})
+        msg = h.html_escape(msg % {'username': base.TEST_USER_ADMIN_LOGIN})
         response.mustcontain(msg)
 
     def test_my_account_api_keys(self):
-        usr = self.log_user(TEST_USER_REGULAR2_LOGIN, TEST_USER_REGULAR2_PASS)
+        usr = self.log_user(base.TEST_USER_REGULAR2_LOGIN, base.TEST_USER_REGULAR2_PASS)
         user = User.get(usr['user_id'])
-        response = self.app.get(url('my_account_api_keys'))
+        response = self.app.get(base.url('my_account_api_keys'))
         response.mustcontain(user.api_key)
         response.mustcontain('Expires: Never')
 
-    @parametrize('desc,lifetime', [
+    @base.parametrize('desc,lifetime', [
         ('forever', -1),
         ('5mins', 60*5),
         ('30days', 60*60*24*30),
     ])
     def test_my_account_add_api_keys(self, desc, lifetime):
-        usr = self.log_user(TEST_USER_REGULAR2_LOGIN, TEST_USER_REGULAR2_PASS)
+        usr = self.log_user(base.TEST_USER_REGULAR2_LOGIN, base.TEST_USER_REGULAR2_PASS)
         user = User.get(usr['user_id'])
-        response = self.app.post(url('my_account_api_keys'),
+        response = self.app.post(base.url('my_account_api_keys'),
                                  {'description': desc, 'lifetime': lifetime, '_session_csrf_secret_token': self.session_csrf_secret_token()})
         self.checkSessionFlash(response, 'API key successfully created')
         try:
@@ -220,9 +220,9 @@
                 Session().commit()
 
     def test_my_account_remove_api_key(self):
-        usr = self.log_user(TEST_USER_REGULAR2_LOGIN, TEST_USER_REGULAR2_PASS)
+        usr = self.log_user(base.TEST_USER_REGULAR2_LOGIN, base.TEST_USER_REGULAR2_PASS)
         user = User.get(usr['user_id'])
-        response = self.app.post(url('my_account_api_keys'),
+        response = self.app.post(base.url('my_account_api_keys'),
                                  {'description': 'desc', 'lifetime': -1, '_session_csrf_secret_token': self.session_csrf_secret_token()})
         self.checkSessionFlash(response, 'API key successfully created')
         response = response.follow()
@@ -231,21 +231,21 @@
         keys = UserApiKeys.query().all()
         assert 1 == len(keys)
 
-        response = self.app.post(url('my_account_api_keys_delete'),
+        response = self.app.post(base.url('my_account_api_keys_delete'),
                  {'del_api_key': keys[0].api_key, '_session_csrf_secret_token': self.session_csrf_secret_token()})
         self.checkSessionFlash(response, 'API key successfully deleted')
         keys = UserApiKeys.query().all()
         assert 0 == len(keys)
 
     def test_my_account_reset_main_api_key(self):
-        usr = self.log_user(TEST_USER_REGULAR2_LOGIN, TEST_USER_REGULAR2_PASS)
+        usr = self.log_user(base.TEST_USER_REGULAR2_LOGIN, base.TEST_USER_REGULAR2_PASS)
         user = User.get(usr['user_id'])
         api_key = user.api_key
-        response = self.app.get(url('my_account_api_keys'))
+        response = self.app.get(base.url('my_account_api_keys'))
         response.mustcontain(api_key)
         response.mustcontain('Expires: Never')
 
-        response = self.app.post(url('my_account_api_keys_delete'),
+        response = self.app.post(base.url('my_account_api_keys_delete'),
                  {'del_api_key_builtin': api_key, '_session_csrf_secret_token': self.session_csrf_secret_token()})
         self.checkSessionFlash(response, 'API key successfully reset')
         response = response.follow()
@@ -256,8 +256,8 @@
         public_key = u'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQC6Ycnc2oUZHQnQwuqgZqTTdMDZD7ataf3JM7oG2Fw8JR6cdmz4QZLe5mfDwaFwG2pWHLRpVqzfrD/Pn3rIO++bgCJH5ydczrl1WScfryV1hYMJ/4EzLGM657J1/q5EI+b9SntKjf4ax+KP322L0TNQGbZUHLbfG2MwHMrYBQpHUQ== me@localhost'
         fingerprint = u'Ke3oUCNJM87P0jJTb3D+e3shjceP2CqMpQKVd75E9I8'
 
-        self.log_user(TEST_USER_REGULAR2_LOGIN, TEST_USER_REGULAR2_PASS)
-        response = self.app.post(url('my_account_ssh_keys'),
+        self.log_user(base.TEST_USER_REGULAR2_LOGIN, base.TEST_USER_REGULAR2_PASS)
+        response = self.app.post(base.url('my_account_ssh_keys'),
                                  {'description': description,
                                   'public_key': public_key,
                                   '_session_csrf_secret_token': self.session_csrf_secret_token()})
@@ -277,8 +277,8 @@
         public_key = u'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQC6Ycnc2oUZHQnQwuqgZqTTdMDZD7ataf3JM7oG2Fw8JR6cdmz4QZLe5mfDwaFwG2pWHLRpVqzfrD/Pn3rIO++bgCJH5ydczrl1WScfryV1hYMJ/4EzLGM657J1/q5EI+b9SntKjf4ax+KP322L0TNQGbZUHLbfG2MwHMrYBQpHUQ== me@localhost'
         fingerprint = u'Ke3oUCNJM87P0jJTb3D+e3shjceP2CqMpQKVd75E9I8'
 
-        self.log_user(TEST_USER_REGULAR2_LOGIN, TEST_USER_REGULAR2_PASS)
-        response = self.app.post(url('my_account_ssh_keys'),
+        self.log_user(base.TEST_USER_REGULAR2_LOGIN, base.TEST_USER_REGULAR2_PASS)
+        response = self.app.post(base.url('my_account_ssh_keys'),
                                  {'description': description,
                                   'public_key': public_key,
                                   '_session_csrf_secret_token': self.session_csrf_secret_token()})
@@ -288,7 +288,7 @@
         ssh_key = UserSshKeys.query().filter(UserSshKeys.user_id == user_id).one()
         assert ssh_key.description == u'me@localhost'
 
-        response = self.app.post(url('my_account_ssh_keys_delete'),
+        response = self.app.post(base.url('my_account_ssh_keys_delete'),
                                  {'del_public_key': ssh_key.public_key,
                                   '_session_csrf_secret_token': self.session_csrf_secret_token()})
         self.checkSessionFlash(response, 'SSH key successfully deleted')
--- a/kallithea/tests/functional/test_pullrequests.py	Thu Jan 02 00:57:38 2020 +0100
+++ b/kallithea/tests/functional/test_pullrequests.py	Thu Jan 02 00:44:56 2020 +0100
@@ -5,27 +5,27 @@
 from kallithea.controllers.pullrequests import PullrequestsController
 from kallithea.model.db import PullRequest, User
 from kallithea.model.meta import Session
-from kallithea.tests.base import *
+from kallithea.tests import base
 from kallithea.tests.fixture import Fixture
 
 
 fixture = Fixture()
 
 
-class TestPullrequestsController(TestController):
+class TestPullrequestsController(base.TestController):
 
     def test_index(self):
         self.log_user()
-        response = self.app.get(url(controller='pullrequests', action='index',
-                                    repo_name=HG_REPO))
+        response = self.app.get(base.url(controller='pullrequests', action='index',
+                                    repo_name=base.HG_REPO))
 
     def test_create_trivial(self):
         self.log_user()
-        response = self.app.post(url(controller='pullrequests', action='create',
-                                     repo_name=HG_REPO),
-                                 {'org_repo': HG_REPO,
+        response = self.app.post(base.url(controller='pullrequests', action='create',
+                                     repo_name=base.HG_REPO),
+                                 {'org_repo': base.HG_REPO,
                                   'org_ref': 'branch:stable:4f7e2131323e0749a740c0a56ab68ae9269c562a',
-                                  'other_repo': HG_REPO,
+                                  'other_repo': base.HG_REPO,
                                   'other_ref': 'branch:default:96507bd11ecc815ebc6270fdf6db110928c09c1e',
                                   'pullrequest_title': 'title',
                                   'pullrequest_desc': 'description',
@@ -40,11 +40,11 @@
 
     def test_available(self):
         self.log_user()
-        response = self.app.post(url(controller='pullrequests', action='create',
-                                     repo_name=HG_REPO),
-                                 {'org_repo': HG_REPO,
+        response = self.app.post(base.url(controller='pullrequests', action='create',
+                                     repo_name=base.HG_REPO),
+                                 {'org_repo': base.HG_REPO,
                                   'org_ref': 'rev:94f45ed825a1:94f45ed825a113e61af7e141f44ca578374abef0',
-                                  'other_repo': HG_REPO,
+                                  'other_repo': base.HG_REPO,
                                   'other_ref': 'branch:default:96507bd11ecc815ebc6270fdf6db110928c09c1e',
                                   'pullrequest_title': 'title',
                                   'pullrequest_desc': 'description',
@@ -60,11 +60,11 @@
 
     def test_range(self):
         self.log_user()
-        response = self.app.post(url(controller='pullrequests', action='create',
-                                     repo_name=HG_REPO),
-                                 {'org_repo': HG_REPO,
+        response = self.app.post(base.url(controller='pullrequests', action='create',
+                                     repo_name=base.HG_REPO),
+                                 {'org_repo': base.HG_REPO,
                                   'org_ref': 'branch:stable:4f7e2131323e0749a740c0a56ab68ae9269c562a',
-                                  'other_repo': HG_REPO,
+                                  'other_repo': base.HG_REPO,
                                   'other_ref': 'rev:94f45ed825a1:94f45ed825a113e61af7e141f44ca578374abef0',
                                   'pullrequest_title': 'title',
                                   'pullrequest_desc': 'description',
@@ -78,16 +78,16 @@
 
     def test_update_reviewers(self):
         self.log_user()
-        regular_user = User.get_by_username(TEST_USER_REGULAR_LOGIN)
-        regular_user2 = User.get_by_username(TEST_USER_REGULAR2_LOGIN)
-        admin_user = User.get_by_username(TEST_USER_ADMIN_LOGIN)
+        regular_user = User.get_by_username(base.TEST_USER_REGULAR_LOGIN)
+        regular_user2 = User.get_by_username(base.TEST_USER_REGULAR2_LOGIN)
+        admin_user = User.get_by_username(base.TEST_USER_ADMIN_LOGIN)
 
         # create initial PR
-        response = self.app.post(url(controller='pullrequests', action='create',
-                                     repo_name=HG_REPO),
-                                 {'org_repo': HG_REPO,
+        response = self.app.post(base.url(controller='pullrequests', action='create',
+                                     repo_name=base.HG_REPO),
+                                 {'org_repo': base.HG_REPO,
                                   'org_ref': 'rev:94f45ed825a1:94f45ed825a113e61af7e141f44ca578374abef0',
-                                  'other_repo': HG_REPO,
+                                  'other_repo': base.HG_REPO,
                                   'other_ref': 'branch:default:96507bd11ecc815ebc6270fdf6db110928c09c1e',
                                   'pullrequest_title': 'title',
                                   'pullrequest_desc': 'description',
@@ -95,40 +95,40 @@
                                  },
                                  status=302)
         pull_request1_id = re.search(r'/pull-request/(\d+)/', response.location).group(1)
-        assert response.location == 'http://localhost/%s/pull-request/%s/_/stable' % (HG_REPO, pull_request1_id)
+        assert response.location == 'http://localhost/%s/pull-request/%s/_/stable' % (base.HG_REPO, pull_request1_id)
 
         # create new iteration
-        response = self.app.post(url(controller='pullrequests', action='post',
-                                     repo_name=HG_REPO, pull_request_id=pull_request1_id),
+        response = self.app.post(base.url(controller='pullrequests', action='post',
+                                     repo_name=base.HG_REPO, pull_request_id=pull_request1_id),
                                  {
                                   'updaterev': '4f7e2131323e0749a740c0a56ab68ae9269c562a',
                                   'pullrequest_title': 'title',
                                   'pullrequest_desc': 'description',
-                                  'owner': TEST_USER_ADMIN_LOGIN,
+                                  'owner': base.TEST_USER_ADMIN_LOGIN,
                                   '_session_csrf_secret_token': self.session_csrf_secret_token(),
                                   'review_members': [regular_user.user_id],
                                  },
                                  status=302)
         pull_request2_id = re.search(r'/pull-request/(\d+)/', response.location).group(1)
         assert pull_request2_id != pull_request1_id
-        assert response.location == 'http://localhost/%s/pull-request/%s/_/stable' % (HG_REPO, pull_request2_id)
+        assert response.location == 'http://localhost/%s/pull-request/%s/_/stable' % (base.HG_REPO, pull_request2_id)
         response = response.follow()
         # verify reviewer was added
         response.mustcontain('<input type="hidden" value="%s" name="review_members" />' % regular_user.user_id)
 
         # update without creating new iteration
-        response = self.app.post(url(controller='pullrequests', action='post',
-                                     repo_name=HG_REPO, pull_request_id=pull_request2_id),
+        response = self.app.post(base.url(controller='pullrequests', action='post',
+                                     repo_name=base.HG_REPO, pull_request_id=pull_request2_id),
                                  {
                                   'pullrequest_title': 'Title',
                                   'pullrequest_desc': 'description',
-                                  'owner': TEST_USER_ADMIN_LOGIN,
+                                  'owner': base.TEST_USER_ADMIN_LOGIN,
                                   '_session_csrf_secret_token': self.session_csrf_secret_token(),
                                   'org_review_members': [admin_user.user_id], # fake - just to get some 'meanwhile' warning ... but it is also added ...
                                   'review_members': [regular_user2.user_id, admin_user.user_id],
                                  },
                                  status=302)
-        assert response.location == 'http://localhost/%s/pull-request/%s/_/stable' % (HG_REPO, pull_request2_id)
+        assert response.location == 'http://localhost/%s/pull-request/%s/_/stable' % (base.HG_REPO, pull_request2_id)
         response = response.follow()
         # verify reviewers were added / removed
         response.mustcontain('Meanwhile, the following reviewers have been added: test_regular')
@@ -141,12 +141,12 @@
         invalid_user_id = 99999
         self.log_user()
         # create a valid pull request
-        response = self.app.post(url(controller='pullrequests', action='create',
-                                     repo_name=HG_REPO),
+        response = self.app.post(base.url(controller='pullrequests', action='create',
+                                     repo_name=base.HG_REPO),
                                  {
-                                  'org_repo': HG_REPO,
+                                  'org_repo': base.HG_REPO,
                                   'org_ref': 'rev:94f45ed825a1:94f45ed825a113e61af7e141f44ca578374abef0',
-                                  'other_repo': HG_REPO,
+                                  'other_repo': base.HG_REPO,
                                   'other_ref': 'branch:default:96507bd11ecc815ebc6270fdf6db110928c09c1e',
                                   'pullrequest_title': 'title',
                                   'pullrequest_desc': 'description',
@@ -160,13 +160,13 @@
         pull_request_id = m.group(1)
 
         # update it
-        response = self.app.post(url(controller='pullrequests', action='post',
-                                     repo_name=HG_REPO, pull_request_id=pull_request_id),
+        response = self.app.post(base.url(controller='pullrequests', action='post',
+                                     repo_name=base.HG_REPO, pull_request_id=pull_request_id),
                                  {
                                   'updaterev': '4f7e2131323e0749a740c0a56ab68ae9269c562a',
                                   'pullrequest_title': 'title',
                                   'pullrequest_desc': 'description',
-                                  'owner': TEST_USER_ADMIN_LOGIN,
+                                  'owner': base.TEST_USER_ADMIN_LOGIN,
                                   '_session_csrf_secret_token': self.session_csrf_secret_token(),
                                   'review_members': [str(invalid_user_id)],
                                  },
@@ -177,12 +177,12 @@
         invalid_user_id = 99999
         self.log_user()
         # create a valid pull request
-        response = self.app.post(url(controller='pullrequests', action='create',
-                                     repo_name=HG_REPO),
+        response = self.app.post(base.url(controller='pullrequests', action='create',
+                                     repo_name=base.HG_REPO),
                                  {
-                                  'org_repo': HG_REPO,
+                                  'org_repo': base.HG_REPO,
                                   'org_ref': 'branch:stable:4f7e2131323e0749a740c0a56ab68ae9269c562a',
-                                  'other_repo': HG_REPO,
+                                  'other_repo': base.HG_REPO,
                                   'other_ref': 'branch:default:96507bd11ecc815ebc6270fdf6db110928c09c1e',
                                   'pullrequest_title': 'title',
                                   'pullrequest_desc': 'description',
@@ -196,12 +196,12 @@
         pull_request_id = m.group(1)
 
         # edit it
-        response = self.app.post(url(controller='pullrequests', action='post',
-                                     repo_name=HG_REPO, pull_request_id=pull_request_id),
+        response = self.app.post(base.url(controller='pullrequests', action='post',
+                                     repo_name=base.HG_REPO, pull_request_id=pull_request_id),
                                  {
                                   'pullrequest_title': 'title',
                                   'pullrequest_desc': 'description',
-                                  'owner': TEST_USER_ADMIN_LOGIN,
+                                  'owner': base.TEST_USER_ADMIN_LOGIN,
                                   '_session_csrf_secret_token': self.session_csrf_secret_token(),
                                   'review_members': [str(invalid_user_id)],
                                  },
@@ -226,11 +226,11 @@
 
         # create initial PR
         response = self.app.post(
-            url(controller='pullrequests', action='create', repo_name=HG_REPO),
+            base.url(controller='pullrequests', action='create', repo_name=base.HG_REPO),
             {
-                'org_repo': HG_REPO,
+                'org_repo': base.HG_REPO,
                 'org_ref': 'rev:9e6119747791:9e6119747791ff886a5abe1193a730b6bf874e1c',
-                'other_repo': HG_REPO,
+                'other_repo': base.HG_REPO,
                 'other_ref': 'branch:default:3d1091ee5a533b1f4577ec7d8a226bb315fb1336',
                 'pullrequest_title': 'title',
                 'pullrequest_desc': 'description',
@@ -247,12 +247,12 @@
 
         # create PR 2 (new iteration with same ancestor)
         response = self.app.post(
-            url(controller='pullrequests', action='post', repo_name=HG_REPO, pull_request_id=pr1_id),
+            base.url(controller='pullrequests', action='post', repo_name=base.HG_REPO, pull_request_id=pr1_id),
             {
                 'updaterev': '5ec21f21aafe95220f1fc4843a4a57c378498b71',
                 'pullrequest_title': 'title',
                 'pullrequest_desc': 'description',
-                'owner': TEST_USER_REGULAR_LOGIN,
+                'owner': base.TEST_USER_REGULAR_LOGIN,
                 '_session_csrf_secret_token': self.session_csrf_secret_token(),
              },
              status=302)
@@ -269,12 +269,12 @@
 
         # create PR 3 (new iteration with new ancestor)
         response = self.app.post(
-            url(controller='pullrequests', action='post', repo_name=HG_REPO, pull_request_id=pr2_id),
+            base.url(controller='pullrequests', action='post', repo_name=base.HG_REPO, pull_request_id=pr2_id),
             {
                 'updaterev': 'fb95b340e0d03fa51f33c56c991c08077c99303e',
                 'pullrequest_title': 'title',
                 'pullrequest_desc': 'description',
-                'owner': TEST_USER_REGULAR_LOGIN,
+                'owner': base.TEST_USER_REGULAR_LOGIN,
                 '_session_csrf_secret_token': self.session_csrf_secret_token(),
              },
              status=302)
@@ -289,7 +289,7 @@
 
 
 @pytest.mark.usefixtures("test_context_fixture") # apply fixture for all test methods
-class TestPullrequestsGetRepoRefs(TestController):
+class TestPullrequestsGetRepoRefs(base.TestController):
 
     def setup_method(self, method):
         self.repo_name = u'main'
--- a/kallithea/tests/functional/test_repo_groups.py	Thu Jan 02 00:57:38 2020 +0100
+++ b/kallithea/tests/functional/test_repo_groups.py	Thu Jan 02 00:44:56 2020 +0100
@@ -1,16 +1,16 @@
-from kallithea.tests.base import *
+from kallithea.tests import base
 
 
-class TestRepoGroupsController(TestController):
+class TestRepoGroupsController(base.TestController):
 
     def test_index(self):
         self.log_user()
-        response = self.app.get(url('repos_groups'))
+        response = self.app.get(base.url('repos_groups'))
         response.mustcontain('"records": []')
 
     def test_new(self):
         self.log_user()
-        response = self.app.get(url('new_repos_group'))
+        response = self.app.get(base.url('new_repos_group'))
 
     def test_create(self):
         self.log_user()
@@ -18,14 +18,14 @@
         group_name = 'foo'
 
         # creation with form error
-        response = self.app.post(url('repos_groups'),
+        response = self.app.post(base.url('repos_groups'),
                                          {'group_name': group_name,
                                           '_session_csrf_secret_token': self.session_csrf_secret_token()})
         response.mustcontain('name="group_name" type="text" value="%s"' % group_name)
         response.mustcontain('<!-- for: group_description -->')
 
         # creation
-        response = self.app.post(url('repos_groups'),
+        response = self.app.post(base.url('repos_groups'),
                                          {'group_name': group_name,
                                          'group_description': 'lala',
                                          'parent_group_id': '-1',
@@ -34,18 +34,18 @@
         self.checkSessionFlash(response, 'Created repository group %s' % group_name)
 
         # edit form
-        response = self.app.get(url('edit_repo_group', group_name=group_name))
+        response = self.app.get(base.url('edit_repo_group', group_name=group_name))
         response.mustcontain('>lala<')
 
         # edit with form error
-        response = self.app.post(url('update_repos_group', group_name=group_name),
+        response = self.app.post(base.url('update_repos_group', group_name=group_name),
                                          {'group_name': group_name,
                                           '_session_csrf_secret_token': self.session_csrf_secret_token()})
         response.mustcontain('name="group_name" type="text" value="%s"' % group_name)
         response.mustcontain('<!-- for: group_description -->')
 
         # edit
-        response = self.app.post(url('update_repos_group', group_name=group_name),
+        response = self.app.post(base.url('update_repos_group', group_name=group_name),
                                          {'group_name': group_name,
                                          'group_description': 'lolo',
                                           '_session_csrf_secret_token': self.session_csrf_secret_token()})
@@ -56,22 +56,22 @@
         response.mustcontain('>lolo<')
 
         # listing
-        response = self.app.get(url('repos_groups'))
+        response = self.app.get(base.url('repos_groups'))
         response.mustcontain('raw_name": "%s"' % group_name)
 
         # show
-        response = self.app.get(url('repos_group', group_name=group_name))
+        response = self.app.get(base.url('repos_group', group_name=group_name))
         response.mustcontain('href="/_admin/repo_groups/%s/edit"' % group_name)
 
         # show ignores extra trailing slashes in the URL
-        response = self.app.get(url('repos_group', group_name='%s//' % group_name))
+        response = self.app.get(base.url('repos_group', group_name='%s//' % group_name))
         response.mustcontain('href="/_admin/repo_groups/%s/edit"' % group_name)
 
         # delete
-        response = self.app.post(url('delete_repo_group', group_name=group_name),
+        response = self.app.post(base.url('delete_repo_group', group_name=group_name),
                                  {'_session_csrf_secret_token': self.session_csrf_secret_token()})
         self.checkSessionFlash(response, 'Removed repository group %s' % group_name)
 
     def test_new_by_regular_user(self):
-        self.log_user(TEST_USER_REGULAR_LOGIN, TEST_USER_REGULAR_PASS)
-        response = self.app.get(url('new_repos_group'), status=403)
+        self.log_user(base.TEST_USER_REGULAR_LOGIN, base.TEST_USER_REGULAR_PASS)
+        response = self.app.get(base.url('new_repos_group'), status=403)
--- a/kallithea/tests/functional/test_search.py	Thu Jan 02 00:57:38 2020 +0100
+++ b/kallithea/tests/functional/test_search.py	Thu Jan 02 00:44:56 2020 +0100
@@ -1,13 +1,13 @@
 import mock
 
-from kallithea.tests.base import *
+from kallithea.tests import base
 
 
-class TestSearchController(TestController):
+class TestSearchController(base.TestController):
 
     def test_index(self):
         self.log_user()
-        response = self.app.get(url(controller='search', action='index'))
+        response = self.app.get(base.url(controller='search', action='index'))
 
         response.mustcontain('class="form-control" id="q" name="q" type="text"')
         # Test response...
@@ -20,33 +20,33 @@
             'index_dir': str(tmpdir),
         }
         with mock.patch('kallithea.controllers.search.config', config_mock):
-            response = self.app.get(url(controller='search', action='index'),
-                                    {'q': HG_REPO})
+            response = self.app.get(base.url(controller='search', action='index'),
+                                    {'q': base.HG_REPO})
             response.mustcontain('The server has no search index.')
 
     def test_normal_search(self):
         self.log_user()
-        response = self.app.get(url(controller='search', action='index'),
+        response = self.app.get(base.url(controller='search', action='index'),
                                 {'q': 'def repo'})
         response.mustcontain('58 results')
 
     def test_repo_search(self):
         self.log_user()
-        response = self.app.get(url(controller='search', action='index'),
-                                {'q': 'repository:%s def test' % HG_REPO})
+        response = self.app.get(base.url(controller='search', action='index'),
+                                {'q': 'repository:%s def test' % base.HG_REPO})
 
         response.mustcontain('18 results')
 
     def test_search_last(self):
         self.log_user()
-        response = self.app.get(url(controller='search', action='index'),
+        response = self.app.get(base.url(controller='search', action='index'),
                                 {'q': 'last:t', 'type': 'commit'})
 
         response.mustcontain('2 results')
 
     def test_search_commit_message(self):
         self.log_user()
-        response = self.app.get(url(controller='search', action='index'),
+        response = self.app.get(base.url(controller='search', action='index'),
                     {'q': 'bother to ask where to fetch repo during tests',
                      'type': 'commit'})
 
@@ -56,8 +56,8 @@
 
     def test_search_commit_message_hg_repo(self):
         self.log_user()
-        response = self.app.get(url(controller='search', action='index',
-                                    repo_name=HG_REPO),
+        response = self.app.get(base.url(controller='search', action='index',
+                                    repo_name=base.HG_REPO),
                     {'q': 'bother to ask where to fetch repo during tests',
                      'type': 'commit'})
 
@@ -66,7 +66,7 @@
 
     def test_search_commit_changed_file(self):
         self.log_user()
-        response = self.app.get(url(controller='search', action='index'),
+        response = self.app.get(base.url(controller='search', action='index'),
                                 {'q': 'changed:tests/utils.py',
                                  'type': 'commit'})
 
@@ -74,7 +74,7 @@
 
     def test_search_commit_changed_files_get_commit(self):
         self.log_user()
-        response = self.app.get(url(controller='search', action='index'),
+        response = self.app.get(base.url(controller='search', action='index'),
                                 {'q': 'changed:vcs/utils/archivers.py',
                                  'type': 'commit'})
 
@@ -90,7 +90,7 @@
 
     def test_search_commit_added_file(self):
         self.log_user()
-        response = self.app.get(url(controller='search', action='index'),
+        response = self.app.get(base.url(controller='search', action='index'),
                                 {'q': 'added:README.rst',
                                  'type': 'commit'})
 
@@ -102,7 +102,7 @@
 
     def test_search_author(self):
         self.log_user()
-        response = self.app.get(url(controller='search', action='index'),
+        response = self.app.get(base.url(controller='search', action='index'),
                     {'q': 'author:marcin@python-blog.com raw_id:b986218ba1c9b0d6a259fac9b050b1724ed8e545',
                      'type': 'commit'})
 
@@ -110,7 +110,7 @@
 
     def test_search_file_name(self):
         self.log_user()
-        response = self.app.get(url(controller='search', action='index'),
+        response = self.app.get(base.url(controller='search', action='index'),
                     {'q': 'README.rst', 'type': 'path'})
 
         response.mustcontain('2 results')
--- a/kallithea/tests/functional/test_search_indexing.py	Thu Jan 02 00:57:38 2020 +0100
+++ b/kallithea/tests/functional/test_search_indexing.py	Thu Jan 02 00:44:56 2020 +0100
@@ -5,7 +5,7 @@
 from kallithea.model.meta import Session
 from kallithea.model.repo import RepoModel
 from kallithea.model.repo_group import RepoGroupModel
-from kallithea.tests.base import *
+from kallithea.tests import base
 from kallithea.tests.fixture import Fixture, create_test_index
 
 
@@ -66,10 +66,10 @@
         # (FYI, ENOMEM occurs at forking "git" with python 2.7.3,
         # Linux 3.2.78-1 x86_64, 3GB memory, and no ulimit
         # configuration for memory)
-        create_test_index(TESTS_TMP_PATH, CONFIG, full_index=full_index)
+        create_test_index(base.TESTS_TMP_PATH, CONFIG, full_index=full_index)
 
 
-class TestSearchControllerIndexing(TestController):
+class TestSearchControllerIndexing(base.TestController):
     @classmethod
     def setup_class(cls):
         for reponame, init_or_fork, groupname in repos:
@@ -108,7 +108,7 @@
 
         rebuild_index(full_index=True) # rebuild fully for subsequent tests
 
-    @parametrize('reponame', [
+    @base.parametrize('reponame', [
         (u'indexing_test'),
         (u'indexing_test-fork'),
         (u'group/indexing_test'),
@@ -116,7 +116,7 @@
         (u'*-fork'),
         (u'group/*'),
     ])
-    @parametrize('searchtype,query,hit', [
+    @base.parametrize('searchtype,query,hit', [
         ('content', 'this_should_be_unique_content', 1),
         ('commit', 'this_should_be_unique_commit_log', 1),
         ('path', 'this_should_be_unique_filename.txt', 1),
@@ -125,17 +125,17 @@
         self.log_user()
 
         q = 'repository:%s %s' % (reponame, query)
-        response = self.app.get(url(controller='search', action='index'),
+        response = self.app.get(base.url(controller='search', action='index'),
                                 {'q': q, 'type': searchtype})
         response.mustcontain('>%d results' % hit)
 
-    @parametrize('reponame', [
+    @base.parametrize('reponame', [
         (u'indexing_test'),
         (u'indexing_test-fork'),
         (u'group/indexing_test'),
         (u'this-is-it'),
     ])
-    @parametrize('searchtype,query,hit', [
+    @base.parametrize('searchtype,query,hit', [
         ('content', 'this_should_be_unique_content', 1),
         ('commit', 'this_should_be_unique_commit_log', 1),
         ('path', 'this_should_be_unique_filename.txt', 1),
@@ -143,12 +143,12 @@
     def test_searching_under_repository(self, reponame, searchtype, query, hit):
         self.log_user()
 
-        response = self.app.get(url(controller='search', action='index',
+        response = self.app.get(base.url(controller='search', action='index',
                                     repo_name=reponame),
                                 {'q': query, 'type': searchtype})
         response.mustcontain('>%d results' % hit)
 
-    @parametrize('searchtype,query,hit', [
+    @base.parametrize('searchtype,query,hit', [
         ('content', 'path:this/is/it def test', 1),
         ('commit', 'added:this/is/it bother to ask where', 1),
         # this condition matches against files below, because
@@ -161,12 +161,12 @@
         ('path', 'extension:us', 1),
     ])
     def test_filename_stopword(self, searchtype, query, hit):
-        response = self.app.get(url(controller='search', action='index'),
+        response = self.app.get(base.url(controller='search', action='index'),
                                 {'q': query, 'type': searchtype})
 
         response.mustcontain('>%d results' % hit)
 
-    @parametrize('searchtype,query,hit', [
+    @base.parametrize('searchtype,query,hit', [
         # matching against both 2 files
         ('content', 'owner:"this is it"', 0),
         ('content', 'owner:this-is-it', 0),
@@ -182,7 +182,7 @@
         ('commit', 'author:"this-is-it"', 1),
     ])
     def test_mailaddr_stopword(self, searchtype, query, hit):
-        response = self.app.get(url(controller='search', action='index'),
+        response = self.app.get(base.url(controller='search', action='index'),
                                 {'q': query, 'type': searchtype})
 
         response.mustcontain('>%d results' % hit)
--- a/kallithea/tests/functional/test_summary.py	Thu Jan 02 00:57:38 2020 +0100
+++ b/kallithea/tests/functional/test_summary.py	Thu Jan 02 00:44:56 2020 +0100
@@ -18,7 +18,7 @@
 from kallithea.model.meta import Session
 from kallithea.model.repo import RepoModel
 from kallithea.model.scm import ScmModel
-from kallithea.tests.base import *
+from kallithea.tests import base
 from kallithea.tests.fixture import Fixture
 
 
@@ -32,14 +32,14 @@
         )
 
 
-class TestSummaryController(TestController):
+class TestSummaryController(base.TestController):
 
     def test_index_hg(self, custom_settings):
         self.log_user()
-        ID = Repository.get_by_repo_name(HG_REPO).repo_id
-        response = self.app.get(url(controller='summary',
+        ID = Repository.get_by_repo_name(base.HG_REPO).repo_id
+        response = self.app.get(base.url(controller='summary',
                                     action='index',
-                                    repo_name=HG_REPO))
+                                    repo_name=base.HG_REPO))
 
         # repo type
         response.mustcontain(
@@ -52,24 +52,24 @@
         # clone URLs
         response.mustcontain(
             '''<input class="form-control" size="80" readonly="readonly" value="http://%s@localhost:80/%s"/>''' %
-            (TEST_USER_ADMIN_LOGIN, HG_REPO)
+            (base.TEST_USER_ADMIN_LOGIN, base.HG_REPO)
         )
         response.mustcontain(
             '''<input class="form-control" size="80" readonly="readonly" value="http://%s@localhost:80/_%s"/>''' %
-            (TEST_USER_ADMIN_LOGIN, ID)
+            (base.TEST_USER_ADMIN_LOGIN, ID)
         )
         response.mustcontain(
             '''<input id="ssh_url" class="form-control" size="80" readonly="readonly" value="ssh://ssh_user@ssh_hostname/%s"/>''' %
-            (HG_REPO)
+            (base.HG_REPO)
         )
 
 
     def test_index_git(self, custom_settings):
         self.log_user()
-        ID = Repository.get_by_repo_name(GIT_REPO).repo_id
-        response = self.app.get(url(controller='summary',
+        ID = Repository.get_by_repo_name(base.GIT_REPO).repo_id
+        response = self.app.get(base.url(controller='summary',
                                     action='index',
-                                    repo_name=GIT_REPO))
+                                    repo_name=base.GIT_REPO))
 
         # repo type
         response.mustcontain(
@@ -82,21 +82,21 @@
         # clone URLs
         response.mustcontain(
             '''<input class="form-control" size="80" readonly="readonly" value="http://%s@localhost:80/%s"/>''' %
-            (TEST_USER_ADMIN_LOGIN, GIT_REPO)
+            (base.TEST_USER_ADMIN_LOGIN, base.GIT_REPO)
         )
         response.mustcontain(
             '''<input class="form-control" size="80" readonly="readonly" value="http://%s@localhost:80/_%s"/>''' %
-            (TEST_USER_ADMIN_LOGIN, ID)
+            (base.TEST_USER_ADMIN_LOGIN, ID)
         )
         response.mustcontain(
             '''<input id="ssh_url" class="form-control" size="80" readonly="readonly" value="ssh://ssh_user@ssh_hostname/%s"/>''' %
-            (GIT_REPO)
+            (base.GIT_REPO)
         )
 
     def test_index_by_id_hg(self):
         self.log_user()
-        ID = Repository.get_by_repo_name(HG_REPO).repo_id
-        response = self.app.get(url(controller='summary',
+        ID = Repository.get_by_repo_name(base.HG_REPO).repo_id
+        response = self.app.get(base.url(controller='summary',
                                     action='index',
                                     repo_name='_%s' % ID))
 
@@ -112,7 +112,7 @@
     def test_index_by_repo_having_id_path_in_name_hg(self):
         self.log_user()
         fixture.create_repo(name=u'repo_1')
-        response = self.app.get(url(controller='summary',
+        response = self.app.get(base.url(controller='summary',
                                     action='index',
                                     repo_name='repo_1'))
 
@@ -124,8 +124,8 @@
 
     def test_index_by_id_git(self):
         self.log_user()
-        ID = Repository.get_by_repo_name(GIT_REPO).repo_id
-        response = self.app.get(url(controller='summary',
+        ID = Repository.get_by_repo_name(base.GIT_REPO).repo_id
+        response = self.app.get(base.url(controller='summary',
                                     action='index',
                                     repo_name='_%s' % ID))
 
@@ -146,14 +146,14 @@
     def test_index_trending(self):
         self.log_user()
         # codes stats
-        self._enable_stats(HG_REPO)
+        self._enable_stats(base.HG_REPO)
 
-        ScmModel().mark_for_invalidation(HG_REPO)
+        ScmModel().mark_for_invalidation(base.HG_REPO)
         # generate statistics first
-        response = self.app.get(url(controller='summary', action='statistics',
-                                    repo_name=HG_REPO))
-        response = self.app.get(url(controller='summary', action='index',
-                                    repo_name=HG_REPO))
+        response = self.app.get(base.url(controller='summary', action='statistics',
+                                    repo_name=base.HG_REPO))
+        response = self.app.get(base.url(controller='summary', action='index',
+                                    repo_name=base.HG_REPO))
         response.mustcontain(
             '[["py", {"count": 68, "desc": ["Python"]}], '
             '["rst", {"count": 16, "desc": ["Rst"]}], '
@@ -170,23 +170,23 @@
     def test_index_statistics(self):
         self.log_user()
         # codes stats
-        self._enable_stats(HG_REPO)
+        self._enable_stats(base.HG_REPO)
 
-        ScmModel().mark_for_invalidation(HG_REPO)
-        response = self.app.get(url(controller='summary', action='statistics',
-                                    repo_name=HG_REPO))
+        ScmModel().mark_for_invalidation(base.HG_REPO)
+        response = self.app.get(base.url(controller='summary', action='statistics',
+                                    repo_name=base.HG_REPO))
 
     def test_index_trending_git(self):
         self.log_user()
         # codes stats
-        self._enable_stats(GIT_REPO)
+        self._enable_stats(base.GIT_REPO)
 
-        ScmModel().mark_for_invalidation(GIT_REPO)
+        ScmModel().mark_for_invalidation(base.GIT_REPO)
         # generate statistics first
-        response = self.app.get(url(controller='summary', action='statistics',
-                                    repo_name=GIT_REPO))
-        response = self.app.get(url(controller='summary', action='index',
-                                    repo_name=GIT_REPO))
+        response = self.app.get(base.url(controller='summary', action='statistics',
+                                    repo_name=base.GIT_REPO))
+        response = self.app.get(base.url(controller='summary', action='index',
+                                    repo_name=base.GIT_REPO))
         response.mustcontain(
             '[["py", {"count": 68, "desc": ["Python"]}], '
             '["rst", {"count": 16, "desc": ["Rst"]}], '
@@ -203,8 +203,8 @@
     def test_index_statistics_git(self):
         self.log_user()
         # codes stats
-        self._enable_stats(GIT_REPO)
+        self._enable_stats(base.GIT_REPO)
 
-        ScmModel().mark_for_invalidation(GIT_REPO)
-        response = self.app.get(url(controller='summary', action='statistics',
-                                    repo_name=GIT_REPO))
+        ScmModel().mark_for_invalidation(base.GIT_REPO)
+        response = self.app.get(base.url(controller='summary', action='statistics',
+                                    repo_name=base.GIT_REPO))
--- a/kallithea/tests/models/test_changeset_status.py	Thu Jan 02 00:57:38 2020 +0100
+++ b/kallithea/tests/models/test_changeset_status.py	Thu Jan 02 00:44:56 2020 +0100
@@ -1,6 +1,6 @@
 from kallithea.model.changeset_status import ChangesetStatusModel
 from kallithea.model.db import ChangesetStatus as CS
-from kallithea.tests.base import *
+from kallithea.tests import base
 
 
 class CSM(object): # ChangesetStatusMock
@@ -9,12 +9,12 @@
         self.status = status
 
 
-class TestChangesetStatusCalculation(TestController):
+class TestChangesetStatusCalculation(base.TestController):
 
     def setup_method(self, method):
         self.m = ChangesetStatusModel()
 
-    @parametrize('name,expected_result,statuses', [
+    @base.parametrize('name,expected_result,statuses', [
         ('empty list', CS.STATUS_UNDER_REVIEW, []),
         ('approve', CS.STATUS_APPROVED, [CSM(CS.STATUS_APPROVED)]),
         ('approve2', CS.STATUS_APPROVED, [CSM(CS.STATUS_APPROVED), CSM(CS.STATUS_APPROVED)]),
--- a/kallithea/tests/models/test_comments.py	Thu Jan 02 00:57:38 2020 +0100
+++ b/kallithea/tests/models/test_comments.py	Thu Jan 02 00:44:56 2020 +0100
@@ -3,10 +3,10 @@
 
 from kallithea.model.comment import ChangesetCommentsModel
 from kallithea.model.db import Repository
-from kallithea.tests.base import *
+from kallithea.tests import base
 
 
-class TestComments(TestController):
+class TestComments(base.TestController):
 
     def _check_comment_count(self, repo_id, revision,
             expected_len_comments, expected_len_inline_comments,
@@ -23,7 +23,7 @@
 
     def test_create_delete_general_comment(self):
         with test_context(self.app):
-            repo_id = Repository.get_by_repo_name(HG_REPO).repo_id
+            repo_id = Repository.get_by_repo_name(base.HG_REPO).repo_id
             revision = '9a7b4ff9e8b40bbda72fc75f162325b9baa45cda'
 
             self._check_comment_count(repo_id, revision,
@@ -32,8 +32,8 @@
             text = u'a comment'
             new_comment = ChangesetCommentsModel().create(
                     text=text,
-                    repo=HG_REPO,
-                    author=TEST_USER_REGULAR_LOGIN,
+                    repo=base.HG_REPO,
+                    author=base.TEST_USER_REGULAR_LOGIN,
                     revision=revision,
                     send_email=False)
 
@@ -47,7 +47,7 @@
 
     def test_create_delete_inline_comment(self):
         with test_context(self.app):
-            repo_id = Repository.get_by_repo_name(HG_REPO).repo_id
+            repo_id = Repository.get_by_repo_name(base.HG_REPO).repo_id
             revision = '9a7b4ff9e8b40bbda72fc75f162325b9baa45cda'
 
             self._check_comment_count(repo_id, revision,
@@ -58,8 +58,8 @@
             line_no = u'n50'
             new_comment = ChangesetCommentsModel().create(
                     text=text,
-                    repo=HG_REPO,
-                    author=TEST_USER_REGULAR_LOGIN,
+                    repo=base.HG_REPO,
+                    author=base.TEST_USER_REGULAR_LOGIN,
                     revision=revision,
                     f_path=f_path,
                     line_no=line_no,
@@ -81,7 +81,7 @@
 
     def test_create_delete_multiple_inline_comments(self):
         with test_context(self.app):
-            repo_id = Repository.get_by_repo_name(HG_REPO).repo_id
+            repo_id = Repository.get_by_repo_name(base.HG_REPO).repo_id
             revision = '9a7b4ff9e8b40bbda72fc75f162325b9baa45cda'
 
             self._check_comment_count(repo_id, revision,
@@ -92,8 +92,8 @@
             line_no = u'n50'
             new_comment = ChangesetCommentsModel().create(
                     text=text,
-                    repo=HG_REPO,
-                    author=TEST_USER_REGULAR_LOGIN,
+                    repo=base.HG_REPO,
+                    author=base.TEST_USER_REGULAR_LOGIN,
                     revision=revision,
                     f_path=f_path,
                     line_no=line_no,
@@ -103,8 +103,8 @@
             line_no2 = u'o41'
             new_comment2 = ChangesetCommentsModel().create(
                     text=text2,
-                    repo=HG_REPO,
-                    author=TEST_USER_REGULAR_LOGIN,
+                    repo=base.HG_REPO,
+                    author=base.TEST_USER_REGULAR_LOGIN,
                     revision=revision,
                     f_path=f_path,
                     line_no=line_no2,
@@ -115,8 +115,8 @@
             line_no3 = u'n159'
             new_comment3 = ChangesetCommentsModel().create(
                     text=text3,
-                    repo=HG_REPO,
-                    author=TEST_USER_REGULAR_LOGIN,
+                    repo=base.HG_REPO,
+                    author=base.TEST_USER_REGULAR_LOGIN,
                     revision=revision,
                     f_path=f_path3,
                     line_no=line_no3,
@@ -161,7 +161,7 @@
 
     def test_selective_retrieval_of_inline_comments(self):
         with test_context(self.app):
-            repo_id = Repository.get_by_repo_name(HG_REPO).repo_id
+            repo_id = Repository.get_by_repo_name(base.HG_REPO).repo_id
             revision = '9a7b4ff9e8b40bbda72fc75f162325b9baa45cda'
 
             self._check_comment_count(repo_id, revision,
@@ -172,8 +172,8 @@
             line_no = u'n50'
             new_comment = ChangesetCommentsModel().create(
                     text=text,
-                    repo=HG_REPO,
-                    author=TEST_USER_REGULAR_LOGIN,
+                    repo=base.HG_REPO,
+                    author=base.TEST_USER_REGULAR_LOGIN,
                     revision=revision,
                     f_path=f_path,
                     line_no=line_no,
@@ -183,8 +183,8 @@
             line_no2 = u'o41'
             new_comment2 = ChangesetCommentsModel().create(
                     text=text2,
-                    repo=HG_REPO,
-                    author=TEST_USER_REGULAR_LOGIN,
+                    repo=base.HG_REPO,
+                    author=base.TEST_USER_REGULAR_LOGIN,
                     revision=revision,
                     f_path=f_path,
                     line_no=line_no2,
@@ -195,8 +195,8 @@
             line_no3 = u'n159'
             new_comment3 = ChangesetCommentsModel().create(
                     text=text3,
-                    repo=HG_REPO,
-                    author=TEST_USER_REGULAR_LOGIN,
+                    repo=base.HG_REPO,
+                    author=base.TEST_USER_REGULAR_LOGIN,
                     revision=revision,
                     f_path=f_path3,
                     line_no=line_no3,
--- a/kallithea/tests/models/test_diff_parsers.py	Thu Jan 02 00:57:38 2020 +0100
+++ b/kallithea/tests/models/test_diff_parsers.py	Thu Jan 02 00:44:56 2020 +0100
@@ -1,5 +1,5 @@
 from kallithea.lib.diffs import BIN_FILENODE, CHMOD_FILENODE, COPIED_FILENODE, DEL_FILENODE, MOD_FILENODE, NEW_FILENODE, RENAMED_FILENODE, DiffProcessor
-from kallithea.tests.base import *
+from kallithea.tests import base
 from kallithea.tests.fixture import Fixture
 
 
@@ -271,9 +271,9 @@
 }
 
 
-class TestDiffLib(TestController):
+class TestDiffLib(base.TestController):
 
-    @parametrize('diff_fixture', DIFF_FIXTURES)
+    @base.parametrize('diff_fixture', DIFF_FIXTURES)
     def test_diff(self, diff_fixture):
         raw_diff = fixture.load_resource(diff_fixture, strip=False)
         vcs = 'hg'
--- a/kallithea/tests/models/test_notifications.py	Thu Jan 02 00:57:38 2020 +0100
+++ b/kallithea/tests/models/test_notifications.py	Thu Jan 02 00:44:56 2020 +0100
@@ -11,10 +11,10 @@
 from kallithea.model.meta import Session
 from kallithea.model.notification import EmailNotificationModel, NotificationModel
 from kallithea.model.user import UserModel
-from kallithea.tests.base import *
+from kallithea.tests import base
 
 
-class TestNotifications(TestController):
+class TestNotifications(base.TestController):
 
     def setup_method(self, method):
         Session.remove()
--- a/kallithea/tests/models/test_permissions.py	Thu Jan 02 00:57:38 2020 +0100
+++ b/kallithea/tests/models/test_permissions.py	Thu Jan 02 00:44:56 2020 +0100
@@ -6,14 +6,14 @@
 from kallithea.model.repo_group import RepoGroupModel
 from kallithea.model.user import UserModel
 from kallithea.model.user_group import UserGroupModel
-from kallithea.tests.base import *
+from kallithea.tests import base
 from kallithea.tests.fixture import Fixture
 
 
 fixture = Fixture()
 
 
-class TestPermissions(TestController):
+class TestPermissions(base.TestController):
 
     @classmethod
     def setup_class(cls):
@@ -71,33 +71,33 @@
             'repositories_groups': {},
             'global': set(['hg.create.repository', 'repository.read',
                            'hg.register.manual_activate']),
-            'repositories': {HG_REPO: 'repository.read'}
+            'repositories': {base.HG_REPO: 'repository.read'}
         }
-        assert u1_auth.permissions['repositories'][HG_REPO] == perms['repositories'][HG_REPO]
+        assert u1_auth.permissions['repositories'][base.HG_REPO] == perms['repositories'][base.HG_REPO]
         new_perm = 'repository.write'
-        RepoModel().grant_user_permission(repo=HG_REPO, user=self.u1,
+        RepoModel().grant_user_permission(repo=base.HG_REPO, user=self.u1,
                                           perm=new_perm)
         Session().commit()
 
         u1_auth = AuthUser(user_id=self.u1.user_id)
-        assert u1_auth.permissions['repositories'][HG_REPO] == new_perm
+        assert u1_auth.permissions['repositories'][base.HG_REPO] == new_perm
 
     def test_default_admin_perms_set(self):
         a1_auth = AuthUser(user_id=self.a1.user_id)
         perms = {
             'repositories_groups': {},
             'global': set(['hg.admin', 'hg.create.write_on_repogroup.true']),
-            'repositories': {HG_REPO: 'repository.admin'}
+            'repositories': {base.HG_REPO: 'repository.admin'}
         }
-        assert a1_auth.permissions['repositories'][HG_REPO] == perms['repositories'][HG_REPO]
+        assert a1_auth.permissions['repositories'][base.HG_REPO] == perms['repositories'][base.HG_REPO]
         new_perm = 'repository.write'
-        RepoModel().grant_user_permission(repo=HG_REPO, user=self.a1,
+        RepoModel().grant_user_permission(repo=base.HG_REPO, user=self.a1,
                                           perm=new_perm)
         Session().commit()
         # cannot really downgrade admins permissions !? they still gets set as
         # admin !
         u1_auth = AuthUser(user_id=self.a1.user_id)
-        assert u1_auth.permissions['repositories'][HG_REPO] == perms['repositories'][HG_REPO]
+        assert u1_auth.permissions['repositories'][base.HG_REPO] == perms['repositories'][base.HG_REPO]
 
     def test_default_group_perms(self):
         self.g1 = fixture.create_repo_group(u'test1', skip_if_exists=True)
@@ -106,9 +106,9 @@
         perms = {
             'repositories_groups': {u'test1': 'group.read', u'test2': 'group.read'},
             'global': set(Permission.DEFAULT_USER_PERMISSIONS),
-            'repositories': {HG_REPO: 'repository.read'}
+            'repositories': {base.HG_REPO: 'repository.read'}
         }
-        assert u1_auth.permissions['repositories'][HG_REPO] == perms['repositories'][HG_REPO]
+        assert u1_auth.permissions['repositories'][base.HG_REPO] == perms['repositories'][base.HG_REPO]
         assert u1_auth.permissions['repositories_groups'] == perms['repositories_groups']
         assert u1_auth.permissions['global'] == perms['global']
 
@@ -119,10 +119,10 @@
         perms = {
             'repositories_groups': {u'test1': 'group.admin', u'test2': 'group.admin'},
             'global': set(['hg.admin', 'hg.create.write_on_repogroup.true']),
-            'repositories': {HG_REPO: 'repository.admin'}
+            'repositories': {base.HG_REPO: 'repository.admin'}
         }
 
-        assert a1_auth.permissions['repositories'][HG_REPO] == perms['repositories'][HG_REPO]
+        assert a1_auth.permissions['repositories'][base.HG_REPO] == perms['repositories'][base.HG_REPO]
         assert a1_auth.permissions['repositories_groups'] == perms['repositories_groups']
 
     def test_propagated_permission_from_users_group_by_explicit_perms_exist(self):
@@ -131,19 +131,19 @@
         UserGroupModel().add_user_to_group(self.ug1, self.u1)
 
         # set user permission none
-        RepoModel().grant_user_permission(repo=HG_REPO, user=self.u1, perm='repository.none')
+        RepoModel().grant_user_permission(repo=base.HG_REPO, user=self.u1, perm='repository.none')
         Session().commit()
         u1_auth = AuthUser(user_id=self.u1.user_id)
-        assert u1_auth.permissions['repositories'][HG_REPO] == 'repository.read' # inherit from default user
+        assert u1_auth.permissions['repositories'][base.HG_REPO] == 'repository.read' # inherit from default user
 
         # grant perm for group this should override permission from user
-        RepoModel().grant_user_group_permission(repo=HG_REPO,
+        RepoModel().grant_user_group_permission(repo=base.HG_REPO,
                                                  group_name=self.ug1,
                                                  perm='repository.write')
 
         # verify that user group permissions win
         u1_auth = AuthUser(user_id=self.u1.user_id)
-        assert u1_auth.permissions['repositories'][HG_REPO] == 'repository.write'
+        assert u1_auth.permissions['repositories'][base.HG_REPO] == 'repository.write'
 
     def test_propagated_permission_from_users_group(self):
         # make group
@@ -152,7 +152,7 @@
 
         # grant perm for group this should override default permission from user
         new_perm_gr = 'repository.write'
-        RepoModel().grant_user_group_permission(repo=HG_REPO,
+        RepoModel().grant_user_group_permission(repo=base.HG_REPO,
                                                  group_name=self.ug1,
                                                  perm=new_perm_gr)
         # check perms
@@ -161,9 +161,9 @@
             'repositories_groups': {},
             'global': set(['hg.create.repository', 'repository.read',
                            'hg.register.manual_activate']),
-            'repositories': {HG_REPO: 'repository.read'}
+            'repositories': {base.HG_REPO: 'repository.read'}
         }
-        assert u3_auth.permissions['repositories'][HG_REPO] == new_perm_gr
+        assert u3_auth.permissions['repositories'][base.HG_REPO] == new_perm_gr
         assert u3_auth.permissions['repositories_groups'] == perms['repositories_groups']
 
     def test_propagated_permission_from_users_group_lower_weight(self):
@@ -174,16 +174,16 @@
 
         # set permission to lower
         new_perm_h = 'repository.write'
-        RepoModel().grant_user_permission(repo=HG_REPO, user=self.u1,
+        RepoModel().grant_user_permission(repo=base.HG_REPO, user=self.u1,
                                           perm=new_perm_h)
         Session().commit()
         u1_auth = AuthUser(user_id=self.u1.user_id)
-        assert u1_auth.permissions['repositories'][HG_REPO] == new_perm_h
+        assert u1_auth.permissions['repositories'][base.HG_REPO] == new_perm_h
 
         # grant perm for group this should NOT override permission from user
         # since it's lower than granted
         new_perm_l = 'repository.read'
-        RepoModel().grant_user_group_permission(repo=HG_REPO,
+        RepoModel().grant_user_group_permission(repo=base.HG_REPO,
                                                  group_name=self.ug1,
                                                  perm=new_perm_l)
         # check perms
@@ -192,9 +192,9 @@
             'repositories_groups': {},
             'global': set(['hg.create.repository', 'repository.read',
                            'hg.register.manual_activate']),
-            'repositories': {HG_REPO: 'repository.write'}
+            'repositories': {base.HG_REPO: 'repository.write'}
         }
-        assert u1_auth.permissions['repositories'][HG_REPO] == new_perm_h
+        assert u1_auth.permissions['repositories'][base.HG_REPO] == new_perm_h
         assert u1_auth.permissions['repositories_groups'] == perms['repositories_groups']
 
     def test_repo_in_group_permissions(self):
@@ -641,7 +641,7 @@
         PermissionModel().create_default_permissions(user=self.u1)
         self._test_def_perm_equal(user=self.u1)
 
-    @parametrize('perm,modify_to', [
+    @base.parametrize('perm,modify_to', [
         ('repository.read', 'repository.none'),
         ('group.read', 'group.none'),
         ('usergroup.read', 'usergroup.none'),
--- a/kallithea/tests/models/test_repo_groups.py	Thu Jan 02 00:57:38 2020 +0100
+++ b/kallithea/tests/models/test_repo_groups.py	Thu Jan 02 00:44:56 2020 +0100
@@ -7,7 +7,7 @@
 from kallithea.model.meta import Session
 from kallithea.model.repo import RepoModel
 from kallithea.model.repo_group import RepoGroupModel
-from kallithea.tests.base import *
+from kallithea.tests import base
 from kallithea.tests.fixture import Fixture
 
 
@@ -34,7 +34,7 @@
     return r
 
 
-class TestRepoGroups(TestController):
+class TestRepoGroups(base.TestController):
 
     def setup_method(self, method):
         self.g1 = fixture.create_repo_group(u'test1', skip_if_exists=True)
@@ -48,7 +48,7 @@
         """
         Checks the path for existence !
         """
-        path = [TESTS_TMP_PATH] + list(path)
+        path = [base.TESTS_TMP_PATH] + list(path)
         path = os.path.join(*path)
         return os.path.isdir(path)
 
--- a/kallithea/tests/models/test_repos.py	Thu Jan 02 00:57:38 2020 +0100
+++ b/kallithea/tests/models/test_repos.py	Thu Jan 02 00:44:56 2020 +0100
@@ -4,14 +4,14 @@
 from kallithea.model.db import Repository
 from kallithea.model.meta import Session
 from kallithea.model.repo import RepoModel
-from kallithea.tests.base import *
+from kallithea.tests import base
 from kallithea.tests.fixture import Fixture
 
 
 fixture = Fixture()
 
 
-class TestRepos(TestController):
+class TestRepos(base.TestController):
 
     def teardown_method(self, method):
         Session.remove()
--- a/kallithea/tests/models/test_user_groups.py	Thu Jan 02 00:57:38 2020 +0100
+++ b/kallithea/tests/models/test_user_groups.py	Thu Jan 02 00:44:56 2020 +0100
@@ -1,14 +1,14 @@
 from kallithea.model.db import User, UserGroup
 from kallithea.model.meta import Session
 from kallithea.model.user_group import UserGroupModel
-from kallithea.tests.base import *
+from kallithea.tests import base
 from kallithea.tests.fixture import Fixture
 
 
 fixture = Fixture()
 
 
-class TestUserGroups(TestController):
+class TestUserGroups(base.TestController):
 
     def teardown_method(self, method):
         # delete all groups
@@ -16,7 +16,7 @@
             fixture.destroy_user_group(gr)
         Session().commit()
 
-    @parametrize('pre_existing,regular_should_be,external_should_be,groups,expected', [
+    @base.parametrize('pre_existing,regular_should_be,external_should_be,groups,expected', [
         ([], [], [], [], []),
         ([], [u'regular'], [], [], [u'regular']),  # no changes of regular
         ([u'some_other'], [], [], [u'some_other'], []),   # not added to regular group
@@ -32,7 +32,7 @@
             fixture.destroy_user_group(gr)
         Session().commit()
 
-        user = User.get_by_username(TEST_USER_REGULAR_LOGIN)
+        user = User.get_by_username(base.TEST_USER_REGULAR_LOGIN)
         for gr in pre_existing:
             gr = fixture.create_user_group(gr)
         Session().commit()
@@ -54,6 +54,6 @@
         UserGroupModel().enforce_groups(user, groups, 'container')
         Session().commit()
 
-        user = User.get_by_username(TEST_USER_REGULAR_LOGIN)
+        user = User.get_by_username(base.TEST_USER_REGULAR_LOGIN)
         in_groups = user.group_member
         assert sorted(expected) == sorted(x.users_group.users_group_name for x in in_groups)
--- a/kallithea/tests/models/test_users.py	Thu Jan 02 00:57:38 2020 +0100
+++ b/kallithea/tests/models/test_users.py	Thu Jan 02 00:44:56 2020 +0100
@@ -4,14 +4,14 @@
 from kallithea.model.meta import Session
 from kallithea.model.user import UserModel
 from kallithea.model.user_group import UserGroupModel
-from kallithea.tests.base import *
+from kallithea.tests import base
 from kallithea.tests.fixture import Fixture
 
 
 fixture = Fixture()
 
 
-class TestUser(TestController):
+class TestUser(base.TestController):
 
     @classmethod
     def setup_class(cls):
@@ -101,7 +101,7 @@
         Session().commit()
 
 
-class TestUsers(TestController):
+class TestUsers(base.TestController):
 
     def setup_method(self, method):
         self.u1 = UserModel().create_or_update(username=u'u1',
--- a/kallithea/tests/other/test_libs.py	Thu Jan 02 00:57:38 2020 +0100
+++ b/kallithea/tests/other/test_libs.py	Thu Jan 02 00:44:56 2020 +0100
@@ -33,7 +33,7 @@
 
 from kallithea.lib.utils2 import AttributeDict
 from kallithea.model.db import Repository
-from kallithea.tests.base import *
+from kallithea.tests import base
 
 
 proto = 'http'
@@ -91,19 +91,19 @@
         return self.current_url % kwargs
 
 
-class TestLibs(TestController):
+class TestLibs(base.TestController):
 
-    @parametrize('test_url,expected,expected_creds', TEST_URLS)
+    @base.parametrize('test_url,expected,expected_creds', TEST_URLS)
     def test_uri_filter(self, test_url, expected, expected_creds):
         from kallithea.lib.utils2 import uri_filter
         assert uri_filter(test_url) == expected
 
-    @parametrize('test_url,expected,expected_creds', TEST_URLS)
+    @base.parametrize('test_url,expected,expected_creds', TEST_URLS)
     def test_credentials_filter(self, test_url, expected, expected_creds):
         from kallithea.lib.utils2 import credentials_filter
         assert credentials_filter(test_url) == expected_creds
 
-    @parametrize('str_bool,expected', [
+    @base.parametrize('str_bool,expected', [
                            ('t', True),
                            ('true', True),
                            ('y', True),
@@ -141,7 +141,7 @@
             'marian.user', 'marco-polo', 'marco_polo', 'world'])
         assert expected == set(extract_mentioned_usernames(sample))
 
-    @parametrize('age_args,expected', [
+    @base.parametrize('age_args,expected', [
         (dict(), u'just now'),
         (dict(seconds= -1), u'1 second ago'),
         (dict(seconds= -60 * 2), u'2 minutes ago'),
@@ -165,7 +165,7 @@
             delt = lambda *args, **kwargs: relativedelta.relativedelta(*args, **kwargs)
             assert age(n + delt(**age_args), now=n) == expected
 
-    @parametrize('age_args,expected', [
+    @base.parametrize('age_args,expected', [
         (dict(), u'just now'),
         (dict(seconds= -1), u'1 second ago'),
         (dict(seconds= -60 * 2), u'2 minutes ago'),
@@ -190,7 +190,7 @@
             delt = lambda *args, **kwargs: relativedelta.relativedelta(*args, **kwargs)
             assert age(n + delt(**age_args), show_short_version=True, now=n) == expected
 
-    @parametrize('age_args,expected', [
+    @base.parametrize('age_args,expected', [
         (dict(), u'just now'),
         (dict(seconds=1), u'in 1 second'),
         (dict(seconds=60 * 2), u'in 2 minutes'),
@@ -270,7 +270,7 @@
                 grav = gravatar_url(email_address=em, size=24)
                 assert grav == 'https://example.com/%s/%s' % (_md5(em), 24)
 
-    @parametrize('clone_uri_tmpl,repo_name,username,prefix,expected', [
+    @base.parametrize('clone_uri_tmpl,repo_name,username,prefix,expected', [
         (Repository.DEFAULT_CLONE_URI, 'group/repo1', None, '', 'http://vps1:8000/group/repo1'),
         (Repository.DEFAULT_CLONE_URI, 'group/repo1', 'username', '', 'http://username@vps1:8000/group/repo1'),
         (Repository.DEFAULT_CLONE_URI, 'group/repo1', None, '/prefix', 'http://vps1:8000/prefix/group/repo1'),
@@ -307,7 +307,7 @@
             return tmpl % (url_ or '/repo_name/changeset/%s' % _url, _url)
         return url_pattern.sub(url_func, text)
 
-    @parametrize('sample,expected', [
+    @base.parametrize('sample,expected', [
       ("",
        ""),
       ("git-svn-id: https://svn.apache.org/repos/asf/libcloud/trunk@1441655 13f79535-47bb-0310-9956-ffa450edef68",
@@ -341,7 +341,7 @@
             from kallithea.lib.helpers import urlify_text
             assert urlify_text(sample, 'repo_name') == expected
 
-    @parametrize('sample,expected,url_', [
+    @base.parametrize('sample,expected,url_', [
       ("",
        "",
        ""),
@@ -396,7 +396,7 @@
             from kallithea.lib.helpers import urlify_text
             assert urlify_text(sample, 'repo_name', stylize=True) == expected
 
-    @parametrize('sample,expected', [
+    @base.parametrize('sample,expected', [
       ("deadbeefcafe @mention, and http://foo.bar/ yo",
        """<a class="changeset_hash" href="/repo_name/changeset/deadbeefcafe">deadbeefcafe</a>"""
        """<a class="message-link" href="#the-link"> <b>@mention</b>, and </a>"""
@@ -409,7 +409,7 @@
             from kallithea.lib.helpers import urlify_text
             assert urlify_text(sample, 'repo_name', link_='#the-link') == expected
 
-    @parametrize('issue_pat,issue_server,issue_sub,sample,expected', [
+    @base.parametrize('issue_pat,issue_server,issue_sub,sample,expected', [
         (r'#(\d+)', 'http://foo/{repo}/issue/\\1', '#\\1',
             'issue #123 and issue#456',
             """issue <a class="issue-tracker-link" href="http://foo/repo_name/issue/123">#123</a> and """
@@ -500,7 +500,7 @@
             with mock.patch('kallithea.CONFIG', config_stub):
                 assert urlify_text(sample, 'repo_name') == expected
 
-    @parametrize('sample,expected', [
+    @base.parametrize('sample,expected', [
         ('abc X5', 'abc <a class="issue-tracker-link" href="http://main/repo_name/main/5/">#5</a>'),
         ('abc pullrequest #6 xyz', 'abc <a class="issue-tracker-link" href="http://pr/repo_name/pr/6">PR#6</a> xyz'),
         ('pull request7 #', '<a class="issue-tracker-link" href="http://pr/repo_name/pr/7">PR#7</a> #'),
@@ -533,7 +533,7 @@
             with mock.patch('kallithea.CONFIG', config_stub):
                 assert urlify_text(sample, 'repo_name') == expected
 
-    @parametrize('test,expected', [
+    @base.parametrize('test,expected', [
       ("", None),
       ("/_2", None),
       ("_2", 2),
@@ -542,9 +542,9 @@
     def test_get_permanent_id(self, test, expected):
         from kallithea.lib.utils import _get_permanent_id
         extracted = _get_permanent_id(test)
-        assert extracted == expected, 'url:%s, got:`%s` expected: `%s`' % (test, _test, expected)
+        assert extracted == expected, 'url:%s, got:`%s` expected: `%s`' % (test, base._test, expected)
 
-    @parametrize('test,expected', [
+    @base.parametrize('test,expected', [
       ("", ""),
       ("/", "/"),
       ("/_ID", '/_ID'),
@@ -555,14 +555,14 @@
       ("_IDa", '_IDa'),
     ])
     def test_fix_repo_id_name(self, test, expected):
-        repo = Repository.get_by_repo_name(HG_REPO)
+        repo = Repository.get_by_repo_name(base.HG_REPO)
         test = test.replace('ID', str(repo.repo_id))
         expected = expected.replace('NAME', repo.repo_name).replace('ID', str(repo.repo_id))
         from kallithea.lib.utils import fix_repo_id_name
         replaced = fix_repo_id_name(test)
         assert replaced == expected, 'url:%s, got:`%s` expected: `%s`' % (test, replaced, expected)
 
-    @parametrize('canonical,test,expected', [
+    @base.parametrize('canonical,test,expected', [
         ('http://www.example.org/', '/abc/xyz', 'http://www.example.org/abc/xyz'),
         ('http://www.example.org', '/abc/xyz', 'http://www.example.org/abc/xyz'),
         ('http://www.example.org', '/abc/xyz/', 'http://www.example.org/abc/xyz/'),
@@ -590,7 +590,7 @@
             with mock.patch('kallithea.CONFIG', config_mock):
                 assert canonical_url(test) == expected
 
-    @parametrize('canonical,expected', [
+    @base.parametrize('canonical,expected', [
         ('http://www.example.org', 'www.example.org'),
         ('http://www.example.org/repos/', 'www.example.org'),
         ('http://www.example.org/kallithea/repos/', 'www.example.org'),
--- a/kallithea/tests/other/test_mail.py	Thu Jan 02 00:57:38 2020 +0100
+++ b/kallithea/tests/other/test_mail.py	Thu Jan 02 00:44:56 2020 +0100
@@ -2,7 +2,7 @@
 
 import kallithea
 from kallithea.model.db import User
-from kallithea.tests.base import *
+from kallithea.tests import base
 
 
 class smtplib_mock(object):
@@ -25,7 +25,7 @@
 
 
 @mock.patch('kallithea.lib.rcmail.smtp_mailer.smtplib', smtplib_mock)
-class TestMail(TestController):
+class TestMail(base.TestController):
 
     def test_send_mail_trivial(self):
         mailserver = 'smtp.mailserver.org'
@@ -66,7 +66,7 @@
         with mock.patch('kallithea.lib.celerylib.tasks.config', config_mock):
             kallithea.lib.celerylib.tasks.send_email(recipients, subject, body, html_body)
 
-        assert smtplib_mock.lastdest == set([TEST_USER_ADMIN_EMAIL, email_to])
+        assert smtplib_mock.lastdest == set([base.TEST_USER_ADMIN_EMAIL, email_to])
         assert smtplib_mock.lastsender == envelope_from
         assert 'From: %s' % envelope_from in smtplib_mock.lastmsg
         assert 'Subject: %s' % subject in smtplib_mock.lastmsg
@@ -90,7 +90,7 @@
         with mock.patch('kallithea.lib.celerylib.tasks.config', config_mock):
             kallithea.lib.celerylib.tasks.send_email(recipients, subject, body, html_body)
 
-        assert smtplib_mock.lastdest == set([TEST_USER_ADMIN_EMAIL] + email_to.split(','))
+        assert smtplib_mock.lastdest == set([base.TEST_USER_ADMIN_EMAIL] + email_to.split(','))
         assert smtplib_mock.lastsender == envelope_from
         assert 'From: %s' % envelope_from in smtplib_mock.lastmsg
         assert 'Subject: %s' % subject in smtplib_mock.lastmsg
@@ -112,7 +112,7 @@
         with mock.patch('kallithea.lib.celerylib.tasks.config', config_mock):
             kallithea.lib.celerylib.tasks.send_email(recipients, subject, body, html_body)
 
-        assert smtplib_mock.lastdest == set([TEST_USER_ADMIN_EMAIL])
+        assert smtplib_mock.lastdest == set([base.TEST_USER_ADMIN_EMAIL])
         assert smtplib_mock.lastsender == envelope_from
         assert 'From: %s' % envelope_from in smtplib_mock.lastmsg
         assert 'Subject: %s' % subject in smtplib_mock.lastmsg
@@ -126,7 +126,7 @@
         subject = 'subject'
         body = 'body'
         html_body = 'html_body'
-        author = User.get_by_username(TEST_USER_REGULAR_LOGIN)
+        author = User.get_by_username(base.TEST_USER_REGULAR_LOGIN)
 
         config_mock = {
             'smtp_server': mailserver,
@@ -150,7 +150,7 @@
         subject = 'subject'
         body = 'body'
         html_body = 'html_body'
-        author = User.get_by_username(TEST_USER_REGULAR_LOGIN)
+        author = User.get_by_username(base.TEST_USER_REGULAR_LOGIN)
 
         config_mock = {
             'smtp_server': mailserver,
--- a/kallithea/tests/other/test_validators.py	Thu Jan 02 00:57:38 2020 +0100
+++ b/kallithea/tests/other/test_validators.py	Thu Jan 02 00:44:56 2020 +0100
@@ -6,7 +6,7 @@
 from kallithea.model.meta import Session
 from kallithea.model.repo_group import RepoGroupModel
 from kallithea.model.user_group import UserGroupModel
-from kallithea.tests.base import *
+from kallithea.tests import base
 from kallithea.tests.fixture import Fixture
 
 
@@ -14,7 +14,7 @@
 
 
 @pytest.mark.usefixtures("test_context_fixture") # apply fixture for all test methods
-class TestRepoGroups(TestController):
+class TestRepoGroups(base.TestController):
 
     def teardown_method(self, method):
         Session.remove()
@@ -40,7 +40,7 @@
         with pytest.raises(formencode.Invalid):
             validator.to_python('.,')
         with pytest.raises(formencode.Invalid):
-            validator.to_python(TEST_USER_ADMIN_LOGIN)
+            validator.to_python(base.TEST_USER_ADMIN_LOGIN)
         assert 'test' == validator.to_python('test')
 
         validator = v.ValidUsername(edit=True, old_data={'user_id': 1})
@@ -49,7 +49,7 @@
         validator = v.ValidRepoUser()
         with pytest.raises(formencode.Invalid):
             validator.to_python('nouser')
-        assert TEST_USER_ADMIN_LOGIN == validator.to_python(TEST_USER_ADMIN_LOGIN)
+        assert base.TEST_USER_ADMIN_LOGIN == validator.to_python(base.TEST_USER_ADMIN_LOGIN)
 
     def test_ValidUserGroup(self):
         validator = v.ValidUserGroup()
@@ -82,11 +82,11 @@
         validator = v.ValidRepoGroup()
         model = RepoGroupModel()
         with pytest.raises(formencode.Invalid):
-            validator.to_python({'group_name': HG_REPO, })
+            validator.to_python({'group_name': base.HG_REPO, })
         gr = model.create(group_name=u'test_gr', group_description=u'desc',
                           parent=None,
                           just_db=True,
-                          owner=TEST_USER_ADMIN_LOGIN)
+                          owner=base.TEST_USER_ADMIN_LOGIN)
         with pytest.raises(formencode.Invalid):
             validator.to_python({'group_name': gr.group_name, })
 
@@ -127,8 +127,8 @@
     def test_ValidAuth(self):
         validator = v.ValidAuth()
         valid_creds = {
-            'username': TEST_USER_REGULAR2_LOGIN,
-            'password': TEST_USER_REGULAR2_PASS,
+            'username': base.TEST_USER_REGULAR2_LOGIN,
+            'password': base.TEST_USER_REGULAR2_PASS,
         }
         invalid_creds = {
             'username': 'err',
@@ -145,12 +145,12 @@
             validator.to_python({'repo_name': ''})
 
         with pytest.raises(formencode.Invalid):
-            validator.to_python({'repo_name': HG_REPO})
+            validator.to_python({'repo_name': base.HG_REPO})
 
         gr = RepoGroupModel().create(group_name=u'group_test',
                                       group_description=u'desc',
                                       parent=None,
-                                      owner=TEST_USER_ADMIN_LOGIN)
+                                      owner=base.TEST_USER_ADMIN_LOGIN)
         with pytest.raises(formencode.Invalid):
             validator.to_python({'repo_name': gr.group_name})
 
@@ -163,7 +163,7 @@
         # this uses ValidRepoName validator
         assert True
 
-    @parametrize('name,expected', [
+    @base.parametrize('name,expected', [
         ('test', 'test'), ('lolz!', 'lolz'), ('  aavv', 'aavv'),
         ('ala ma kota', 'ala-ma-kota'), ('@nooo', 'nooo'),
         ('$!haha lolz !', 'haha-lolz'), ('$$$$$', ''), ('{}OK!', 'OK'),
@@ -196,7 +196,7 @@
 
     def test_ValidPath(self):
             validator = v.ValidPath()
-            assert TESTS_TMP_PATH == validator.to_python(TESTS_TMP_PATH)
+            assert base.TESTS_TMP_PATH == validator.to_python(base.TESTS_TMP_PATH)
             with pytest.raises(formencode.Invalid):
                 validator.to_python('/no_such_dir')
 
@@ -205,20 +205,20 @@
 
         assert 'mail@python.org' == validator.to_python('MaiL@Python.org')
 
-        email = TEST_USER_REGULAR2_EMAIL
+        email = base.TEST_USER_REGULAR2_EMAIL
         with pytest.raises(formencode.Invalid):
             validator.to_python(email)
 
     def test_ValidSystemEmail(self):
         validator = v.ValidSystemEmail()
-        email = TEST_USER_REGULAR2_EMAIL
+        email = base.TEST_USER_REGULAR2_EMAIL
 
         assert email == validator.to_python(email)
         with pytest.raises(formencode.Invalid):
             validator.to_python('err')
 
     def test_LdapLibValidator(self):
-        if ldap_lib_installed:
+        if base.ldap_lib_installed:
             validator = v.LdapLibValidator()
             assert "DN" == validator.to_python('DN')
         else:
--- a/kallithea/tests/other/test_vcs_operations.py	Thu Jan 02 00:57:38 2020 +0100
+++ b/kallithea/tests/other/test_vcs_operations.py	Thu Jan 02 00:44:56 2020 +0100
@@ -44,7 +44,7 @@
 from kallithea.model.meta import Session
 from kallithea.model.ssh_key import SshKeyModel
 from kallithea.model.user import UserModel
-from kallithea.tests.base import *
+from kallithea.tests import base
 from kallithea.tests.fixture import Fixture
 
 
@@ -65,12 +65,12 @@
 
 class SshVcsTest(object):
     public_keys = {
-        TEST_USER_REGULAR_LOGIN: u'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQC6Ycnc2oUZHQnQwuqgZqTTdMDZD7ataf3JM7oG2Fw8JR6cdmz4QZLe5mfDwaFwG2pWHLRpVqzfrD/Pn3rIO++bgCJH5ydczrl1WScfryV1hYMJ/4EzLGM657J1/q5EI+b9SntKjf4ax+KP322L0TNQGbZUHLbfG2MwHMrYBQpHUQ== kallithea@localhost',
-        TEST_USER_ADMIN_LOGIN: u'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQC6Ycnc2oUZHQnQwuqgZqTTdMDZD7ataf3JM7oG2Fw8JR6cdmz4QZLe5mfDwaFwG2pWHLRpVqzfrD/Pn3rIO++bgCJH5ydczrl1WScfryV1hYMJ/4EzLGM657J1/q5EI+b9SntKjf4ax+KP322L0TNQGbZUHLbfG2MwHMrYBQpHUq== kallithea@localhost',
+        base.TEST_USER_REGULAR_LOGIN: u'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQC6Ycnc2oUZHQnQwuqgZqTTdMDZD7ataf3JM7oG2Fw8JR6cdmz4QZLe5mfDwaFwG2pWHLRpVqzfrD/Pn3rIO++bgCJH5ydczrl1WScfryV1hYMJ/4EzLGM657J1/q5EI+b9SntKjf4ax+KP322L0TNQGbZUHLbfG2MwHMrYBQpHUQ== kallithea@localhost',
+        base.TEST_USER_ADMIN_LOGIN: u'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQC6Ycnc2oUZHQnQwuqgZqTTdMDZD7ataf3JM7oG2Fw8JR6cdmz4QZLe5mfDwaFwG2pWHLRpVqzfrD/Pn3rIO++bgCJH5ydczrl1WScfryV1hYMJ/4EzLGM657J1/q5EI+b9SntKjf4ax+KP322L0TNQGbZUHLbfG2MwHMrYBQpHUq== kallithea@localhost',
     }
 
     @classmethod
-    def repo_url_param(cls, webserver, repo_name, username=TEST_USER_ADMIN_LOGIN, password=TEST_USER_ADMIN_PASS, client_ip=IP_ADDR):
+    def repo_url_param(cls, webserver, repo_name, username=base.TEST_USER_ADMIN_LOGIN, password=base.TEST_USER_ADMIN_PASS, client_ip=base.IP_ADDR):
         user = User.get_by_username(username)
         if user.ssh_keys:
             ssh_key = user.ssh_keys[0]
@@ -84,11 +84,11 @@
 # Mixins for using Mercurial and Git
 class HgVcsTest(object):
     repo_type = 'hg'
-    repo_name = HG_REPO
+    repo_name = base.HG_REPO
 
 class GitVcsTest(object):
     repo_type = 'git'
-    repo_name = GIT_REPO
+    repo_name = base.GIT_REPO
 
 # Combine mixins to give the combinations we want to parameterize tests with
 class HgHttpVcsTest(HgVcsTest, HttpVcsTest):
@@ -119,17 +119,17 @@
             ssh_key.user_ssh_key_id)
         return "ssh://someuser@somehost/%s""" % repo_name
 
-parametrize_vcs_test = parametrize('vt', [
+parametrize_vcs_test = base.parametrize('vt', [
     HgHttpVcsTest,
     GitHttpVcsTest,
     HgSshVcsTest,
     GitSshVcsTest,
 ])
-parametrize_vcs_test_hg = parametrize('vt', [
+parametrize_vcs_test_hg = base.parametrize('vt', [
     HgHttpVcsTest,
     HgSshVcsTest,
 ])
-parametrize_vcs_test_http = parametrize('vt', [
+parametrize_vcs_test_http = base.parametrize('vt', [
     HgHttpVcsTest,
     GitHttpVcsTest,
 ])
@@ -167,7 +167,7 @@
 
 
 def _get_tmp_dir(prefix='vcs_operations-', suffix=''):
-    return tempfile.mkdtemp(dir=TESTS_TMP_PATH, prefix=prefix, suffix=suffix)
+    return tempfile.mkdtemp(dir=base.TESTS_TMP_PATH, prefix=prefix, suffix=suffix)
 
 
 def _add_files(vcs, dest_dir, files_no=3):
@@ -243,7 +243,7 @@
 
 
 @pytest.mark.usefixtures("test_context_fixture")
-class TestVCSOperations(TestController):
+class TestVCSOperations(base.TestController):
 
     @classmethod
     def setup_class(cls):
@@ -263,16 +263,16 @@
     @pytest.fixture(scope="module")
     def testfork(self):
         # create fork so the repo stays untouched
-        git_fork_name = u'%s_fork%s' % (GIT_REPO, _RandomNameSequence().next())
-        fixture.create_fork(GIT_REPO, git_fork_name)
-        hg_fork_name = u'%s_fork%s' % (HG_REPO, _RandomNameSequence().next())
-        fixture.create_fork(HG_REPO, hg_fork_name)
+        git_fork_name = u'%s_fork%s' % (base.GIT_REPO, _RandomNameSequence().next())
+        fixture.create_fork(base.GIT_REPO, git_fork_name)
+        hg_fork_name = u'%s_fork%s' % (base.HG_REPO, _RandomNameSequence().next())
+        fixture.create_fork(base.HG_REPO, hg_fork_name)
         return {'git': git_fork_name, 'hg': hg_fork_name}
 
     @parametrize_vcs_test
     def test_clone_repo_by_admin(self, webserver, vt):
         clone_url = vt.repo_url_param(webserver, vt.repo_name)
-        stdout, stderr = Command(TESTS_TMP_PATH).execute(vt.repo_type, 'clone', clone_url, _get_tmp_dir())
+        stdout, stderr = Command(base.TESTS_TMP_PATH).execute(vt.repo_type, 'clone', clone_url, _get_tmp_dir())
 
         if vt.repo_type == 'git':
             assert 'Cloning into' in stdout + stderr
@@ -287,26 +287,26 @@
     @parametrize_vcs_test_http
     def test_clone_wrong_credentials(self, webserver, vt):
         clone_url = vt.repo_url_param(webserver, vt.repo_name, password='bad!')
-        stdout, stderr = Command(TESTS_TMP_PATH).execute(vt.repo_type, 'clone', clone_url, _get_tmp_dir(), ignoreReturnCode=True)
+        stdout, stderr = Command(base.TESTS_TMP_PATH).execute(vt.repo_type, 'clone', clone_url, _get_tmp_dir(), ignoreReturnCode=True)
         if vt.repo_type == 'git':
             assert 'fatal: Authentication failed' in stderr
         elif vt.repo_type == 'hg':
             assert 'abort: authorization failed' in stderr
 
     def test_clone_git_dir_as_hg(self, webserver):
-        clone_url = HgHttpVcsTest.repo_url_param(webserver, GIT_REPO)
-        stdout, stderr = Command(TESTS_TMP_PATH).execute('hg clone', clone_url, _get_tmp_dir(), ignoreReturnCode=True)
+        clone_url = HgHttpVcsTest.repo_url_param(webserver, base.GIT_REPO)
+        stdout, stderr = Command(base.TESTS_TMP_PATH).execute('hg clone', clone_url, _get_tmp_dir(), ignoreReturnCode=True)
         assert 'HTTP Error 404: Not Found' in stderr or "not a valid repository" in stdout and 'abort:' in stderr
 
     def test_clone_hg_repo_as_git(self, webserver):
-        clone_url = GitHttpVcsTest.repo_url_param(webserver, HG_REPO)
-        stdout, stderr = Command(TESTS_TMP_PATH).execute('git clone', clone_url, _get_tmp_dir(), ignoreReturnCode=True)
+        clone_url = GitHttpVcsTest.repo_url_param(webserver, base.HG_REPO)
+        stdout, stderr = Command(base.TESTS_TMP_PATH).execute('git clone', clone_url, _get_tmp_dir(), ignoreReturnCode=True)
         assert 'not found' in stderr
 
     @parametrize_vcs_test
     def test_clone_non_existing_path(self, webserver, vt):
         clone_url = vt.repo_url_param(webserver, 'trololo')
-        stdout, stderr = Command(TESTS_TMP_PATH).execute(vt.repo_type, 'clone', clone_url, _get_tmp_dir(), ignoreReturnCode=True)
+        stdout, stderr = Command(base.TESTS_TMP_PATH).execute(vt.repo_type, 'clone', clone_url, _get_tmp_dir(), ignoreReturnCode=True)
         if vt.repo_type == 'git':
             assert 'not found' in stderr or 'abort: Access to %r denied' % 'trololo' in stderr
         elif vt.repo_type == 'hg':
@@ -320,13 +320,13 @@
 
         # Create an empty server repo using the API
         repo_name = u'new_%s_%s' % (vt.repo_type, _RandomNameSequence().next())
-        usr = User.get_by_username(TEST_USER_ADMIN_LOGIN)
+        usr = User.get_by_username(base.TEST_USER_ADMIN_LOGIN)
         params = {
             "id": 7,
             "api_key": usr.api_key,
             "method": 'create_repo',
             "args": dict(repo_name=repo_name,
-                         owner=TEST_USER_ADMIN_LOGIN,
+                         owner=base.TEST_USER_ADMIN_LOGIN,
                          repo_type=vt.repo_type),
         }
         req = urllib2.Request(
@@ -342,7 +342,7 @@
         # Create local clone of the empty server repo
         local_clone_dir = _get_tmp_dir()
         clone_url = vt.repo_url_param(webserver, repo_name)
-        stdout, stderr = Command(TESTS_TMP_PATH).execute(vt.repo_type, 'clone', clone_url, local_clone_dir)
+        stdout, stderr = Command(base.TESTS_TMP_PATH).execute(vt.repo_type, 'clone', clone_url, local_clone_dir)
 
         # Make 3 commits and push to the empty server repo.
         # The server repo doesn't have any other heads than the
@@ -379,7 +379,7 @@
 
         dest_dir = _get_tmp_dir()
         clone_url = vt.repo_url_param(webserver, vt.repo_name)
-        stdout, stderr = Command(TESTS_TMP_PATH).execute(vt.repo_type, 'clone', clone_url, dest_dir)
+        stdout, stderr = Command(base.TESTS_TMP_PATH).execute(vt.repo_type, 'clone', clone_url, dest_dir)
 
         clone_url = vt.repo_url_param(webserver, testfork[vt.repo_type])
         stdout, stderr = _add_files_and_push(webserver, vt, dest_dir, clone_url=clone_url)
@@ -401,7 +401,7 @@
         Session().commit()
 
         dest_dir = _get_tmp_dir()
-        stdout, stderr = Command(TESTS_TMP_PATH).execute(vt.repo_type, 'init', dest_dir)
+        stdout, stderr = Command(base.TESTS_TMP_PATH).execute(vt.repo_type, 'init', dest_dir)
 
         clone_url = vt.repo_url_param(webserver, vt.repo_name)
         stdout, stderr = Command(dest_dir).execute(vt.repo_type, 'pull', clone_url)
@@ -429,7 +429,7 @@
 
         dest_dir = _get_tmp_dir()
         clone_url = vt.repo_url_param(webserver, testfork[vt.repo_type])
-        stdout, stderr = Command(TESTS_TMP_PATH).execute(vt.repo_type, 'clone', clone_url, dest_dir)
+        stdout, stderr = Command(base.TESTS_TMP_PATH).execute(vt.repo_type, 'clone', clone_url, dest_dir)
 
         stdout, stderr = _add_files_and_push(webserver, vt, dest_dir, files_no=1, clone_url=clone_url)
 
@@ -447,7 +447,7 @@
     def test_push_wrong_credentials(self, webserver, vt):
         dest_dir = _get_tmp_dir()
         clone_url = vt.repo_url_param(webserver, vt.repo_name)
-        stdout, stderr = Command(TESTS_TMP_PATH).execute(vt.repo_type, 'clone', clone_url, dest_dir)
+        stdout, stderr = Command(base.TESTS_TMP_PATH).execute(vt.repo_type, 'clone', clone_url, dest_dir)
 
         clone_url = webserver.repo_url(vt.repo_name, username='bad', password='name')
         stdout, stderr = _add_files_and_push(webserver, vt, dest_dir,
@@ -464,8 +464,8 @@
         Session().commit()
 
         dest_dir = _get_tmp_dir()
-        clone_url = vt.repo_url_param(webserver, vt.repo_name, username=TEST_USER_REGULAR_LOGIN, password=TEST_USER_REGULAR_PASS)
-        stdout, stderr = Command(TESTS_TMP_PATH).execute(vt.repo_type, 'clone', clone_url, dest_dir)
+        clone_url = vt.repo_url_param(webserver, vt.repo_name, username=base.TEST_USER_REGULAR_LOGIN, password=base.TEST_USER_REGULAR_PASS)
+        stdout, stderr = Command(base.TESTS_TMP_PATH).execute(vt.repo_type, 'clone', clone_url, dest_dir)
 
         stdout, stderr = _add_files_and_push(webserver, vt, dest_dir, ignoreReturnCode=True, clone_url=clone_url)
 
@@ -482,7 +482,7 @@
     def test_push_back_to_wrong_url(self, webserver, vt):
         dest_dir = _get_tmp_dir()
         clone_url = vt.repo_url_param(webserver, vt.repo_name)
-        stdout, stderr = Command(TESTS_TMP_PATH).execute(vt.repo_type, 'clone', clone_url, dest_dir)
+        stdout, stderr = Command(base.TESTS_TMP_PATH).execute(vt.repo_type, 'clone', clone_url, dest_dir)
 
         stdout, stderr = _add_files_and_push(
             webserver, vt, dest_dir, clone_url='http://%s:%s/tmp' % (
@@ -499,12 +499,12 @@
         user_model = UserModel()
         try:
             # Add IP constraint that excludes the test context:
-            user_model.add_extra_ip(TEST_USER_ADMIN_LOGIN, '10.10.10.10/32')
+            user_model.add_extra_ip(base.TEST_USER_ADMIN_LOGIN, '10.10.10.10/32')
             Session().commit()
             # IP permissions are cached, need to wait for the cache in the server process to expire
             time.sleep(1.5)
             clone_url = vt.repo_url_param(webserver, vt.repo_name)
-            stdout, stderr = Command(TESTS_TMP_PATH).execute(vt.repo_type, 'clone', clone_url, _get_tmp_dir(), ignoreReturnCode=True)
+            stdout, stderr = Command(base.TESTS_TMP_PATH).execute(vt.repo_type, 'clone', clone_url, _get_tmp_dir(), ignoreReturnCode=True)
             if vt.repo_type == 'git':
                 # The message apparently changed in Git 1.8.3, so match it loosely.
                 assert re.search(r'\b403\b', stderr) or 'abort: User test_admin from 127.0.0.127 cannot be authorized' in stderr
@@ -519,7 +519,7 @@
             time.sleep(1.5)
 
         clone_url = vt.repo_url_param(webserver, vt.repo_name)
-        stdout, stderr = Command(TESTS_TMP_PATH).execute(vt.repo_type, 'clone', clone_url, _get_tmp_dir())
+        stdout, stderr = Command(base.TESTS_TMP_PATH).execute(vt.repo_type, 'clone', clone_url, _get_tmp_dir())
 
         if vt.repo_type == 'git':
             assert 'Cloning into' in stdout + stderr
@@ -538,9 +538,9 @@
         Ui.create_or_update_hook('preoutgoing.testhook', 'python:kallithea.tests.fixture.failing_test_hook')
         Session().commit()
         # clone repo
-        clone_url = vt.repo_url_param(webserver, testfork[vt.repo_type], username=TEST_USER_ADMIN_LOGIN, password=TEST_USER_ADMIN_PASS)
+        clone_url = vt.repo_url_param(webserver, testfork[vt.repo_type], username=base.TEST_USER_ADMIN_LOGIN, password=base.TEST_USER_ADMIN_PASS)
         dest_dir = _get_tmp_dir()
-        stdout, stderr = Command(TESTS_TMP_PATH) \
+        stdout, stderr = Command(base.TESTS_TMP_PATH) \
             .execute(vt.repo_type, 'clone', clone_url, dest_dir, ignoreReturnCode=True)
         if vt.repo_type == 'hg':
             assert 'preoutgoing.testhook hook failed' in stdout
@@ -553,9 +553,9 @@
         Ui.create_or_update_hook('prechangegroup.testhook', 'python:kallithea.tests.fixture.failing_test_hook')
         Session().commit()
         # clone repo
-        clone_url = vt.repo_url_param(webserver, testfork[vt.repo_type], username=TEST_USER_ADMIN_LOGIN, password=TEST_USER_ADMIN_PASS)
+        clone_url = vt.repo_url_param(webserver, testfork[vt.repo_type], username=base.TEST_USER_ADMIN_LOGIN, password=base.TEST_USER_ADMIN_PASS)
         dest_dir = _get_tmp_dir()
-        stdout, stderr = Command(TESTS_TMP_PATH).execute(vt.repo_type, 'clone', clone_url, dest_dir)
+        stdout, stderr = Command(base.TESTS_TMP_PATH).execute(vt.repo_type, 'clone', clone_url, dest_dir)
 
         stdout, stderr = _add_files_and_push(webserver, vt, dest_dir, clone_url,
                                              ignoreReturnCode=True)
@@ -596,19 +596,19 @@
 
     def test_add_submodule_git(self, webserver, testfork):
         dest_dir = _get_tmp_dir()
-        clone_url = GitHttpVcsTest.repo_url_param(webserver, GIT_REPO)
+        clone_url = GitHttpVcsTest.repo_url_param(webserver, base.GIT_REPO)
 
         fork_url = GitHttpVcsTest.repo_url_param(webserver, testfork['git'])
 
         # add submodule
-        stdout, stderr = Command(TESTS_TMP_PATH).execute('git clone', fork_url, dest_dir)
+        stdout, stderr = Command(base.TESTS_TMP_PATH).execute('git clone', fork_url, dest_dir)
         stdout, stderr = Command(dest_dir).execute('git submodule add', clone_url, 'testsubmodule')
-        stdout, stderr = Command(dest_dir).execute('git commit -am "added testsubmodule pointing to', clone_url, '"', EMAIL=TEST_USER_ADMIN_EMAIL)
+        stdout, stderr = Command(dest_dir).execute('git commit -am "added testsubmodule pointing to', clone_url, '"', EMAIL=base.TEST_USER_ADMIN_EMAIL)
         stdout, stderr = Command(dest_dir).execute('git push', fork_url, 'master')
 
         # check for testsubmodule link in files page
         self.log_user()
-        response = self.app.get(url(controller='files', action='index',
+        response = self.app.get(base.url(controller='files', action='index',
                                     repo_name=testfork['git'],
                                     revision='tip',
                                     f_path='/'))
@@ -618,7 +618,7 @@
         response.mustcontain('<a class="submodule-dir" href="%s" target="_blank"><i class="icon-file-submodule"></i><span>testsubmodule @ ' % clone_url)
 
         # check that following a submodule link actually works - and redirects
-        response = self.app.get(url(controller='files', action='index',
+        response = self.app.get(base.url(controller='files', action='index',
                                     repo_name=testfork['git'],
                                     revision='tip',
                                     f_path='/testsubmodule'),
--- a/kallithea/tests/performance/test_vcs.py	Thu Jan 02 00:57:38 2020 +0100
+++ b/kallithea/tests/performance/test_vcs.py	Thu Jan 02 00:44:56 2020 +0100
@@ -15,11 +15,11 @@
 import pytest
 
 from kallithea.model.db import Repository
-from kallithea.tests.base import *
+from kallithea.tests import base
 
 
 @pytest.mark.skipif("'TEST_PERFORMANCE' not in os.environ", reason="skipping performance tests, set TEST_PERFORMANCE in environment if desired")
-class TestVCSPerformance(TestController):
+class TestVCSPerformance(base.TestController):
 
     def graphmod(self, repo):
         """ Simple test for running the graph_data function for profiling/testing performance. """
@@ -31,7 +31,7 @@
         jsdata = graph_data(scm_inst, revs)
 
     def test_graphmod_hg(self, benchmark):
-        benchmark(self.graphmod, HG_REPO)
+        benchmark(self.graphmod, base.HG_REPO)
 
     def test_graphmod_git(self, benchmark):
-        benchmark(self.graphmod, GIT_REPO)
+        benchmark(self.graphmod, base.GIT_REPO)