# Copyright (C) 2010-2024 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 . # # 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 random import pytest from rhodecode.api.utils import get_origin from rhodecode.lib.ext_json import json def jsonify(obj): return json.loads(json.dumps(obj)) API_URL = '/_admin/api' def assert_call_ok(id_, given): expected = jsonify({ 'id': id_, 'error': None, 'result': None }) given = json.loads(given) assert expected['id'] == given['id'] assert expected['error'] == given['error'] return given['result'] def assert_ok(id_, expected, given): given = json.loads(given) if given.get('error'): err = given['error'] pytest.fail(f"Unexpected ERROR in expected success response: `{err}`") expected = jsonify({ 'id': id_, 'error': None, 'result': expected }) assert expected == given def assert_error(id_, expected, given): expected = jsonify({ 'id': id_, 'error': expected, 'result': None }) given = json.loads(given) assert expected == given def build_data(apikey, method, **kw): """ Builds API data with given random ID """ random_id = random.randrange(1, 9999) return random_id, json.dumps({ "id": random_id, "api_key": apikey, "method": method, "args": kw }) def api_call(app, params, status=None, assert_no_error=False): response = app.post( API_URL, content_type='application/json', params=params, status=status, headers=[('Content-Type', 'application/json')]) if assert_no_error: err_resp = response.json.get('error') if err_resp: raise AssertionError(f'ERROR in response: {err_resp}') return response def crash(*args, **kwargs): raise Exception('Total Crash !') def expected_permissions(object_with_permissions): """ Returns the expected permissions structure for the given object. The object is expected to be a `Repository`, `RepositoryGroup`, or `UserGroup`. They all implement the same permission handling API. """ permissions = [] for _user in object_with_permissions.permissions(): user_data = { 'name': _user.username, 'permission': _user.permission, 'origin': get_origin(_user), 'type': "user", } permissions.append(user_data) for _user_group in object_with_permissions.permission_user_groups(): user_group_data = { 'name': _user_group.users_group_name, 'permission': _user_group.permission, 'origin': get_origin(_user_group), 'type': "user_group", } permissions.append(user_group_data) return permissions