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 |
|
|
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 r |
|
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 |
|
|
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 |
|
|
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 |
|
|
150 | log.info('rhodecode-vcsserver start command: {}'.format(' '.join(self._args))) | |
148 |
|
|
151 | log.info('rhodecode-vcsserver starting at: {}'.format(host_url)) | |
149 |
|
|
152 | log.info('rhodecode-vcsserver command: {}'.format(self.command)) | |
150 |
|
|
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 |
|
|
183 | log.info('rhodecode-web starting at: {}'.format(host_url)) | |
181 |
|
|
184 | log.info('rhodecode-web command: {}'.format(self.command)) | |
182 |
|
|
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 |
|
|
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 |
|
|
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