##// END OF EJS Templates
feat(ssh-wrapper): added pre/post pull hooks on top of git for ssh backend....
feat(ssh-wrapper): added pre/post pull hooks on top of git for ssh backend. - this makes it consistent with the http backend and actually adds audit logging into the ssh pulls for git

File last commit:

r5088:8f6d1ed6 default
r5302:399d1dbe default
Show More
test_repo.py
170 lines | 5.7 KiB | text/x-python | PythonLexer
# Copyright (C) 2010-2023 RhodeCode GmbH
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License, version 3
# (only), as published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
# This program is dual-licensed. If you wish to learn more about the
# RhodeCode Enterprise Edition, including its added features, Support services,
# and proprietary license terms, please see https://rhodecode.com/licenses/
import pytest
from rhodecode.events import UserPermissionsChange
from rhodecode.lib.utils2 import StrictAttributeDict
from rhodecode.tests.events.conftest import EventCatcher
from rhodecode.lib import hooks_base, utils2
from rhodecode.model.repo import RepoModel
from rhodecode.events.repo import (
RepoPrePullEvent, RepoPullEvent,
RepoPrePushEvent, RepoPushEvent,
RepoPreCreateEvent, RepoCreateEvent,
RepoPreDeleteEvent, RepoDeleteEvent,
RepoCommitCommentEvent, RepoCommitCommentEditEvent
)
@pytest.fixture()
def scm_extras(user_regular, repo_stub):
extras = utils2.AttributeDict({
'ip': '127.0.0.1',
'username': user_regular.username,
'user_id': user_regular.user_id,
'action': '',
'repository': repo_stub.repo_name,
'scm': repo_stub.scm_instance().alias,
'config': '',
'repo_store': '',
'server_url': 'http://example.com',
'make_lock': None,
'user_agent': 'some-client',
'locked_by': [None],
'commit_ids': ['a' * 40] * 3,
'hook_type': 'scm_extras_test',
'is_shadow_repo': False,
})
return extras
# TODO: dan: make the serialization tests complete json comparisons
@pytest.mark.parametrize('EventClass', [
RepoPreCreateEvent, RepoCreateEvent,
RepoPreDeleteEvent, RepoDeleteEvent,
])
def test_repo_events_serialized(config_stub, repo_stub, EventClass):
event = EventClass(repo_stub)
data = event.as_dict()
assert data['name'] == EventClass.name
assert data['repo']['repo_name'] == repo_stub.repo_name
assert data['repo']['url']
assert data['repo']['permalink_url']
@pytest.mark.parametrize('EventClass', [
RepoPrePullEvent, RepoPullEvent, RepoPrePushEvent
])
def test_vcs_repo_events_serialize(config_stub, repo_stub, scm_extras, EventClass):
event = EventClass(repo_name=repo_stub.repo_name, extras=scm_extras)
data = event.as_dict()
assert data['name'] == EventClass.name
assert data['repo']['repo_name'] == repo_stub.repo_name
assert data['repo']['url']
assert data['repo']['permalink_url']
@pytest.mark.parametrize('EventClass', [RepoPushEvent])
def test_vcs_repo_push_event_serialize(config_stub, repo_stub, scm_extras, EventClass):
event = EventClass(repo_name=repo_stub.repo_name,
pushed_commit_ids=scm_extras['commit_ids'],
extras=scm_extras)
data = event.as_dict()
assert data['name'] == EventClass.name
assert data['repo']['repo_name'] == repo_stub.repo_name
assert data['repo']['url']
assert data['repo']['permalink_url']
def test_create_delete_repo_fires_events(backend):
with EventCatcher() as event_catcher:
repo = backend.create_repo()
assert event_catcher.events_types == [RepoPreCreateEvent, RepoCreateEvent, UserPermissionsChange]
with EventCatcher() as event_catcher:
RepoModel().delete(repo)
assert event_catcher.events_types == [RepoPreDeleteEvent, RepoDeleteEvent]
def test_pull_fires_events(scm_extras):
with EventCatcher() as event_catcher:
hooks_base.pre_push(scm_extras)
assert event_catcher.events_types == [RepoPrePushEvent]
with EventCatcher() as event_catcher:
hooks_base.post_push(scm_extras)
assert event_catcher.events_types == [RepoPushEvent]
def test_push_fires_events(scm_extras):
with EventCatcher() as event_catcher:
hooks_base.pre_pull(scm_extras)
assert event_catcher.events_types == [RepoPrePullEvent]
with EventCatcher() as event_catcher:
hooks_base.post_pull(scm_extras)
assert event_catcher.events_types == [RepoPullEvent]
@pytest.mark.parametrize('EventClass', [RepoCommitCommentEvent])
def test_repo_commit_event(config_stub, repo_stub, EventClass):
commit = StrictAttributeDict({
'raw_id': 'raw_id',
'message': 'message',
'branch': 'branch',
})
comment = StrictAttributeDict({
'comment_id': 'comment_id',
'text': 'text',
'comment_type': 'comment_type',
'f_path': 'f_path',
'line_no': 'line_no',
'last_version': 0,
})
event = EventClass(repo=repo_stub, commit=commit, comment=comment)
data = event.as_dict()
assert data['commit']['commit_id']
assert data['comment']['comment_id']
@pytest.mark.parametrize('EventClass', [RepoCommitCommentEditEvent])
def test_repo_commit_edit_event(config_stub, repo_stub, EventClass):
commit = StrictAttributeDict({
'raw_id': 'raw_id',
'message': 'message',
'branch': 'branch',
})
comment = StrictAttributeDict({
'comment_id': 'comment_id',
'text': 'text',
'comment_type': 'comment_type',
'f_path': 'f_path',
'line_no': 'line_no',
'last_version': 0,
})
event = EventClass(repo=repo_stub, commit=commit, comment=comment)
data = event.as_dict()
assert data['commit']['commit_id']
assert data['comment']['comment_id']