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:
Родитель
d0f1ae3976
Коммит
1f8e66b848
|
@ -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)
|
Загрузка…
Ссылка в новой задаче