##// END OF EJS Templates
testing: added webhook tests and fixed tags adding
super-admin -
r4879:e11d95c4 default
parent child Browse files
Show More
@@ -0,0 +1,80 b''
1 # -*- coding: utf-8 -*-
2
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
5 # This program is free software: you can redistribute it and/or modify
6 # it under the terms of the GNU Affero General Public License, version 3
7 # (only), as published by the Free Software Foundation.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU Affero General Public License
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
16 #
17 # This program is dual-licensed. If you wish to learn more about the
18 # RhodeCode Enterprise Edition, including its added features, Support services,
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20
21 """
22 Test suite for making push/pull operations, on specially modified INI files
23
24 .. important::
25
26 You must have git >= 1.8.5 for tests to work fine. With 68b939b git started
27 to redirect things to stderr instead of stdout.
28 """
29
30 import pytest
31 import requests
32
33 from rhodecode.tests import GIT_REPO, HG_REPO
34 from rhodecode.tests.vcs_operations import Command, _add_files_and_push
35
36
37 def check_connection():
38 try:
39 response = requests.get('http://httpbin.org')
40 return response.status_code == 200
41 except Exception as e:
42 print(e)
43
44 return False
45
46
47 connection_available = pytest.mark.skipif(
48 not check_connection(), reason="No outside internet connection available")
49
50
51 @pytest.mark.usefixtures("baseapp", "enable_webhook_push_integration")
52 class TestVCSOperationsOnCustomIniConfig(object):
53
54 def test_push_with_webhook_hg(self, rc_web_server, tmpdir):
55 clone_url = rc_web_server.repo_clone_url(HG_REPO)
56
57 stdout, stderr = Command('/tmp').execute(
58 'hg clone', clone_url, tmpdir.strpath)
59
60 push_url = rc_web_server.repo_clone_url(HG_REPO)
61 _add_files_and_push('hg', tmpdir.strpath, clone_url=push_url)
62
63 rc_log = rc_web_server.get_rc_log()
64 assert 'ERROR' not in rc_log
65 assert "executing task TASK:<@task: rhodecode.integrations.types.webhook.post_to_webhook" in rc_log
66 assert "handling event repo-push with integration <rhodecode.integrations.types.webhook.WebhookIntegrationType" in rc_log
67
68 def test_push_with_webhook_gut(self, rc_web_server, tmpdir):
69 clone_url = rc_web_server.repo_clone_url(GIT_REPO)
70
71 stdout, stderr = Command('/tmp').execute(
72 'git clone', clone_url, tmpdir.strpath)
73
74 push_url = rc_web_server.repo_clone_url(GIT_REPO)
75 _add_files_and_push('git', tmpdir.strpath, clone_url=push_url)
76
77 rc_log = rc_web_server.get_rc_log()
78 assert 'ERROR' not in rc_log
79 assert "executing task TASK:<@task: rhodecode.integrations.types.webhook.post_to_webhook" in rc_log
80 assert "handling event repo-push with integration <rhodecode.integrations.types.webhook.WebhookIntegrationType" in rc_log
@@ -989,7 +989,7 b' class TestModifyFilesWithWebInterface(ob'
989 commit_id=backend.default_head_id,
989 commit_id=backend.default_head_id,
990 f_path='vcs/nodes.py'),
990 f_path='vcs/nodes.py'),
991 params={
991 params={
992 'message': 'i commited',
992 'message': 'i committed',
993 'csrf_token': csrf_token,
993 'csrf_token': csrf_token,
994 },
994 },
995 status=302)
995 status=302)
@@ -754,7 +754,7 b' class ScmModel(BaseModel):'
754 only for git
754 only for git
755 :param trigger_push_hook: trigger push hooks
755 :param trigger_push_hook: trigger push hooks
756
756
757 :returns: new commited commit
757 :returns: new committed commit
758 """
758 """
759
759
760 user = self._get_user(user)
760 user = self._get_user(user)
@@ -1,6 +1,6 b''
1 ## -*- coding: utf-8 -*-
1 ## -*- coding: utf-8 -*-
2
2
3 ${_('%(user)s commited on %(date)s UTC') % {
3 ${_('%(user)s committed on %(date)s UTC') % {
4 'user': h.person(commit.author),
4 'user': h.person(commit.author),
5 'date': h.format_date(commit.date)
5 'date': h.format_date(commit.date)
6 }}
6 }}
@@ -30,6 +30,7 b' import subprocess32'
30 import time
30 import time
31 import uuid
31 import uuid
32 import dateutil.tz
32 import dateutil.tz
33 import logging
33
34
34 import mock
35 import mock
35 import pyramid.testing
36 import pyramid.testing
@@ -66,6 +67,7 b' from rhodecode.tests.utils import Custom'
66 from rhodecode.tests.fixture import Fixture
67 from rhodecode.tests.fixture import Fixture
67 from rhodecode.config import utils as config_utils
68 from rhodecode.config import utils as config_utils
68
69
70 log = logging.getLogger(__name__)
69
71
70 def _split_comma(value):
72 def _split_comma(value):
71 return value.split(',')
73 return value.split(',')
@@ -268,7 +270,7 b' def baseapp(ini_config, vcsserver, http_'
268 from rhodecode.lib.pyramid_utils import get_app_config
270 from rhodecode.lib.pyramid_utils import get_app_config
269 from rhodecode.config.middleware import make_pyramid_app
271 from rhodecode.config.middleware import make_pyramid_app
270
272
271 print("Using the RhodeCode configuration:{}".format(ini_config))
273 log.info("Using the RhodeCode configuration:{}".format(ini_config))
272 pyramid.paster.setup_logging(ini_config)
274 pyramid.paster.setup_logging(ini_config)
273
275
274 settings = get_app_config(ini_config)
276 settings = get_app_config(ini_config)
@@ -206,7 +206,7 b' def get_available_port(min_port=40000, m'
206 @pytest.fixture(scope='session')
206 @pytest.fixture(scope='session')
207 def rcserver_port(request):
207 def rcserver_port(request):
208 port = get_available_port()
208 port = get_available_port()
209 print('Using rcserver port {}'.format(port))
209 print('Using rhodecode port {}'.format(port))
210 return port
210 return port
211
211
212
212
@@ -25,6 +25,7 b' import tempfile'
25 import pytest
25 import pytest
26 import subprocess32
26 import subprocess32
27 import configobj
27 import configobj
28 import logging
28
29
29 from urllib2 import urlopen, URLError
30 from urllib2 import urlopen, URLError
30 from pyramid.compat import configparser
31 from pyramid.compat import configparser
@@ -33,6 +34,8 b' from pyramid.compat import configparser'
33 from rhodecode.tests import TEST_USER_ADMIN_LOGIN, TEST_USER_ADMIN_PASS
34 from rhodecode.tests import TEST_USER_ADMIN_LOGIN, TEST_USER_ADMIN_PASS
34 from rhodecode.tests.utils import is_url_reachable
35 from rhodecode.tests.utils import is_url_reachable
35
36
37 log = logging.getLogger(__name__)
38
36
39
37 def get_port(pyramid_config):
40 def get_port(pyramid_config):
38 config = configparser.ConfigParser()
41 config = configparser.ConfigParser()
@@ -68,7 +71,7 b' class ServerBase(object):'
68 tempfile.gettempdir(), self.log_file_name)
71 tempfile.gettempdir(), self.log_file_name)
69 self.process = None
72 self.process = None
70 self.server_out = None
73 self.server_out = None
71 print("Using the {} configuration:{}".format(
74 log.info("Using the {} configuration:{}".format(
72 self.__class__.__name__, config_file))
75 self.__class__.__name__, config_file))
73
76
74 if not os.path.isfile(config_file):
77 if not os.path.isfile(config_file):
@@ -108,7 +111,7 b' class ServerBase(object):'
108 "seconds. cmd: `{}`".format(
111 "seconds. cmd: `{}`".format(
109 self.__class__.__name__, timeout, self.command))
112 self.__class__.__name__, timeout, self.command))
110
113
111 print('Server of {} ready at url {}'.format(
114 log.info('Server of {} ready at url {}'.format(
112 self.__class__.__name__, status_url))
115 self.__class__.__name__, status_url))
113
116
114 def shutdown(self):
117 def shutdown(self):
@@ -144,10 +147,10 b' class RcVCSServer(ServerBase):'
144 host_url = self.host_url()
147 host_url = self.host_url()
145 assert_no_running_instance(host_url)
148 assert_no_running_instance(host_url)
146
149
147 print('rhodecode-vcsserver start command: {}'.format(' '.join(self._args)))
150 log.info('rhodecode-vcsserver start command: {}'.format(' '.join(self._args)))
148 print('rhodecode-vcsserver starting at: {}'.format(host_url))
151 log.info('rhodecode-vcsserver starting at: {}'.format(host_url))
149 print('rhodecode-vcsserver command: {}'.format(self.command))
152 log.info('rhodecode-vcsserver command: {}'.format(self.command))
150 print('rhodecode-vcsserver logfile: {}'.format(self.log_file))
153 log.info('rhodecode-vcsserver logfile: {}'.format(self.log_file))
151
154
152 self.process = subprocess32.Popen(
155 self.process = subprocess32.Popen(
153 self._args, bufsize=0, env=env,
156 self._args, bufsize=0, env=env,
@@ -177,9 +180,9 b' class RcWebServer(ServerBase):'
177 host_url = self.host_url()
180 host_url = self.host_url()
178 assert_no_running_instance(host_url)
181 assert_no_running_instance(host_url)
179
182
180 print('rhodecode-web starting at: {}'.format(host_url))
183 log.info('rhodecode-web starting at: {}'.format(host_url))
181 print('rhodecode-web command: {}'.format(self.command))
184 log.info('rhodecode-web command: {}'.format(self.command))
182 print('rhodecode-web logfile: {}'.format(self.log_file))
185 log.info('rhodecode-web logfile: {}'.format(self.log_file))
183
186
184 self.process = subprocess32.Popen(
187 self.process = subprocess32.Popen(
185 self._args, bufsize=0, env=env,
188 self._args, bufsize=0, env=env,
@@ -77,14 +77,13 b' class Command(object):'
77 assert self.process.returncode == 0
77 assert self.process.returncode == 0
78
78
79
79
80 def _add_files(vcs, dest, clone_url=None, tags=None, target_branch=None,
80 def _add_files(vcs, dest, clone_url=None, tags=None, target_branch=None, new_branch=False, **kwargs):
81 new_branch=False, **kwargs):
82 git_ident = "git config user.name {} && git config user.email {}".format(
81 git_ident = "git config user.name {} && git config user.email {}".format(
83 'Marcin KuΕΊminski', 'me@email.com')
82 'Marcin KuΕΊminski', 'me@email.com')
84 cwd = path = jn(dest)
83 cwd = path = jn(dest)
85
84
86 tags = tags or []
85 tags = tags or []
87 added_file = jn(path, '%ssetup.py' % tempfile._RandomNameSequence().next())
86 added_file = jn(path, '%s_setup.py' % tempfile._RandomNameSequence().next())
88 Command(cwd).execute('touch %s' % added_file)
87 Command(cwd).execute('touch %s' % added_file)
89 Command(cwd).execute('%s add %s' % (vcs, added_file))
88 Command(cwd).execute('%s add %s' % (vcs, added_file))
90 author_str = 'Marcin KuΕΊminski <me@email.com>'
89 author_str = 'Marcin KuΕΊminski <me@email.com>'
@@ -92,19 +91,20 b' def _add_files(vcs, dest, clone_url=None'
92 for i in range(kwargs.get('files_no', 3)):
91 for i in range(kwargs.get('files_no', 3)):
93 cmd = """echo 'added_line%s' >> %s""" % (i, added_file)
92 cmd = """echo 'added_line%s' >> %s""" % (i, added_file)
94 Command(cwd).execute(cmd)
93 Command(cwd).execute(cmd)
94
95 if vcs == 'hg':
95 if vcs == 'hg':
96 cmd = """hg commit -m 'commited new %s' -u '%s' %s """ % (
96 cmd = """hg commit -m 'committed new %s' -u '%s' %s """ % (
97 i, author_str, added_file
97 i, author_str, added_file
98 )
98 )
99 elif vcs == 'git':
99 elif vcs == 'git':
100 cmd = """%s && git commit -m 'commited new %s' %s""" % (
100 cmd = """%s && git commit -m 'committed new %s' %s""" % (
101 git_ident, i, added_file)
101 git_ident, i, added_file)
102 Command(cwd).execute(cmd)
102 Command(cwd).execute(cmd)
103
103
104 for tag in tags:
104 for tag in tags:
105 if vcs == 'hg':
105 if vcs == 'hg':
106 Command(cwd).execute(
106 Command(cwd).execute(
107 'hg tag', tag['name'])
107 'hg tag -m "{}" -u "{}" '.format(tag['commit'], author_str), tag['name'])
108 elif vcs == 'git':
108 elif vcs == 'git':
109 if tag['commit']:
109 if tag['commit']:
110 # annotated tag
110 # annotated tag
@@ -31,6 +31,7 b' import os'
31 import tempfile
31 import tempfile
32 import textwrap
32 import textwrap
33 import pytest
33 import pytest
34 import logging
34
35
35 from rhodecode import events
36 from rhodecode import events
36 from rhodecode.model.db import Integration, UserRepoToPerm, Permission, \
37 from rhodecode.model.db import Integration, UserRepoToPerm, Permission, \
@@ -49,6 +50,8 b" REPO_GROUP = 'a_repo_group'"
49 HG_REPO_WITH_GROUP = '%s/%s' % (REPO_GROUP, HG_REPO)
50 HG_REPO_WITH_GROUP = '%s/%s' % (REPO_GROUP, HG_REPO)
50 GIT_REPO_WITH_GROUP = '%s/%s' % (REPO_GROUP, GIT_REPO)
51 GIT_REPO_WITH_GROUP = '%s/%s' % (REPO_GROUP, GIT_REPO)
51
52
53 log = logging.getLogger(__name__)
54
52
55
53 @pytest.fixture(scope="module")
56 @pytest.fixture(scope="module")
54 def rcextensions(request, db_connection, tmpdir_factory):
57 def rcextensions(request, db_connection, tmpdir_factory):
@@ -126,10 +129,10 b' def rc_web_server('
126 Run the web server as a subprocess. with it's own instance of vcsserver
129 Run the web server as a subprocess. with it's own instance of vcsserver
127 """
130 """
128 rcweb_port = available_port_factory()
131 rcweb_port = available_port_factory()
129 print('Using rcweb ops test port {}'.format(rcweb_port))
132 log.info('Using rcweb ops test port {}'.format(rcweb_port))
130
133
131 vcsserver_port = available_port_factory()
134 vcsserver_port = available_port_factory()
132 print('Using vcsserver ops test port {}'.format(vcsserver_port))
135 log.info('Using vcsserver ops test port {}'.format(vcsserver_port))
133
136
134 vcs_log = os.path.join(tempfile.gettempdir(), 'rc_op_vcs.log')
137 vcs_log = os.path.join(tempfile.gettempdir(), 'rc_op_vcs.log')
135 vcsserver_factory(
138 vcsserver_factory(
General Comments 0
You need to be logged in to leave comments. Login now