Fixed: Made object id optional (#1166)

* Fixed: Made object id optional

* Comment changes

* run style changes

* Negative test case added

* UT added

Co-authored-by: Roshan-sy <roshan-sy@github.com>
This commit is contained in:
Roshan Soni 2021-08-05 16:06:36 +05:30 коммит произвёл GitHub
Родитель d0f1ae3976
Коммит 1f8e66b848
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
4 изменённых файлов: 2126 добавлений и 1 удалений

Просмотреть файл

@ -4,6 +4,7 @@
# --------------------------------------------------------------------------------------------
from knack.log import get_logger
from knack.util import CLIError
from azext_devops.devops_sdk.v5_0.git.models import GitRefUpdate
from azext_devops.dev.common.git import resolve_git_refs
from azext_devops.dev.common.services import (get_git_client,
@ -56,7 +57,7 @@ def create_ref(name, object_id, repository=None, organization=None, project=None
project=project)[0]
def delete_ref(name, object_id, repository=None, organization=None, project=None, detect=None):
def delete_ref(name, object_id=None, repository=None, organization=None, project=None, detect=None):
"""Delete a reference.
:param str name: Name of the reference to delete (example: heads/my_branch).
:param str object_id: Id of the reference to delete.
@ -70,6 +71,15 @@ def delete_ref(name, object_id, repository=None, organization=None, project=None
project=project,
repo=repository)
client = get_git_client(organization)
if object_id is None:
ref = client.get_refs(repository_id=repository, project=project, filter=name)
if not ref or len(ref) != 1:
logger.error('ref not found')
raise CLIError("Failed to find object_id for ref " + name + ". Please provide object_id.")
object_id = ref[0].object_id
ref_update = GitRefUpdate(name=resolve_git_refs(name),
new_object_id='0000000000000000000000000000000000000000',
old_object_id=object_id)

Просмотреть файл

@ -12,12 +12,17 @@ except ImportError:
# Attempt to load mock (works on Python version below 3.3)
from mock import patch, ANY
from knack.util import CLIError
from azext_devops.devops_sdk.v5_0.git.git_client import GitClient
from azext_devops.dev.common.services import clear_connection_cache
from azext_devops.dev.repos.ref import (list_refs, create_ref, delete_ref, lock_ref, unlock_ref)
from azext_devops.test.utils.authentication import AuthenticatedTests
from azext_devops.test.utils.helper import get_client_mock_helper, TEST_DEVOPS_ORG_URL
class MockRef(object):
def __init__(self, object_id):
self.object_id = object_id
class TestRefMethods(AuthenticatedTests):
@ -95,6 +100,31 @@ class TestRefMethods(AuthenticatedTests):
ref_updates=ANY,
repository_id=None)
def test_delete_ref_without_obj_id(self):
refs = []
refs.append(MockRef("0"))
self.mock_get_refs.return_value = refs;
response = delete_ref(name='sample_ref',
organization=TEST_DEVOPS_ORG_URL,
project='sample_project')
# assert
self.mock_update_refs.assert_called_once_with(project='sample_project',
ref_updates=ANY,
repository_id=None)
def test_delete_ref_without_obj_id_invalid_ref_name(self):
sample_invalid_ref = "sample_invalid_ref"
try:
response = delete_ref(name=sample_invalid_ref,
organization=TEST_DEVOPS_ORG_URL,
project='sample_project')
self.fail('we should have received an error')
except CLIError as ex:
self.assertEqual(str(ex), f'Failed to find object_id for ref {sample_invalid_ref}. Please provide object_id.')
if __name__ == '__main__':
unittest.main()

Разница между файлами не показана из-за своего большого размера Загрузить разницу

Просмотреть файл

@ -0,0 +1,79 @@
# --------------------------------------------------------------------------------------------
# Copyright (c) Microsoft Corporation. All rights reserved.
# Licensed under the MIT License. See License.txt in the project root for license information.
# --------------------------------------------------------------------------------------------
import os
from azure_devtools.scenario_tests import AllowLargeResponse
from .utilities.helper import (DevopsScenarioTest,
disable_telemetry,
get_random_name,
set_authentication,
get_test_org_from_env_variable)
DEVOPS_CLI_TEST_ORGANIZATION = get_test_org_from_env_variable() or 'Https://dev.azure.com/azuredevopsclitest'
class ReposRefDeleteFlowTests(DevopsScenarioTest):
@AllowLargeResponse(size_kb=3072)
@disable_telemetry
@set_authentication
def test_ref_createDeleteFlow(self):
random_project_name = self.create_random_name(prefix='refsTests', length=15)
random_repo_name = self.create_random_name(prefix='refsTests', length=15)
self.cmd('az devops configure --defaults organization=' + DEVOPS_CLI_TEST_ORGANIZATION + ' project=' + random_project_name)
created_project_id = None
try:
create_project_command = 'az devops project create --name ' + random_project_name + ' --output json --detect false'
project_create_output = self.cmd(create_project_command).get_output_in_json()
created_project_id = project_create_output["id"]
create_repo_command = 'az repos create --name ' + random_repo_name + ' -p ' + created_project_id + ' --output json --detect false'
repo_create_output = self.cmd(create_repo_command).get_output_in_json()
create_repo_id = repo_create_output["id"]
import_repo_command = 'az repos import create --git-url https://github.com/hkasera/snakes-and-ladders.git' + ' -p ' + created_project_id + ' -r ' + create_repo_id + ' --output json --detect false'
import_repo_output = self.cmd(import_repo_command)
REPO_NAME = '--repository {random_repo_name} --output json --detect false'.format(random_repo_name=random_repo_name)
REF_NAME = 'heads/branchnametocreate'
UNKNOWN_REF_NAME = 'heads/unknownbranchname'
list_command = 'az repos ref list {}'.format(REPO_NAME)
list_refs = self.cmd(list_command).get_output_in_json()
refs_nbre = len(list_refs)
assert refs_nbre > 0
master_object_id = list_refs[0]['objectId']
assert master_object_id is not None
# create a new reference
create_command = 'az repos ref create --name {} --object-id {} {}'.format(REF_NAME, master_object_id, REPO_NAME)
created_ref = self.cmd(create_command).get_output_in_json()
assert created_ref['newObjectId'] is not None
assert created_ref['updateStatus'] == 'succeeded'
assert created_ref['success'] is True
# delete the reference
delete_command = 'az repos ref delete --name {} {}'.format(REF_NAME, REPO_NAME)
deleted_ref = self.cmd(delete_command).get_output_in_json()
assert deleted_ref is not None
assert created_ref['updateStatus'] == 'succeeded'
assert created_ref['success'] is True
# delete an unknown reference
with self.assertRaises(Exception) as exc:
delete_command = 'az repos ref delete --name {} {}'.format(UNKNOWN_REF_NAME, REPO_NAME)
delete_response = self.cmd(delete_command).get_output_in_json()
self.assertIn(f'Failed to find object_id for ref {UNKNOWN_REF_NAME}. Please provide object_id.' , str(exc.exception))
finally:
if created_project_id is not None:
delete_project_command = 'az devops project delete --id ' + created_project_id + ' --output json --detect false -y'
self.cmd(delete_project_command)