From 33dfba230d544a27da536ef5f7fa853ca04e26cc Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 16 Mar 2026 22:40:12 +0000 Subject: [PATCH 1/3] Initial plan From 36ad36356c743f8f75b3beaa77076800d7115708 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 16 Mar 2026 23:01:53 +0000 Subject: [PATCH 2/3] Update Python tests for Azure/typespec-azure PR #3997: @operationGroup to @client migration Co-authored-by: msyyc <70930885+msyyc@users.noreply.github.com> --- ...ation-group-to-client-2026-3-16-22-50-0.md | 7 ++ ...ager_multi_service_older_versions_async.py | 111 ------------------ .../asynctests/test_client_naming_async.py | 10 +- .../asynctests/test_client_structure_async.py | 22 ++-- ...nt_structure_clientoperationgroup_async.py | 8 +- ...ce_manager_multi_service_older_versions.py | 107 ----------------- .../mock_api_tests/test_client_naming.py | 10 +- .../mock_api_tests/test_client_structure.py | 18 +-- ...t_client_structure_clientoperationgroup.py | 8 +- .../generator/test/azure/requirements.txt | 1 - packages/http-client-python/package-lock.json | 20 ++-- packages/http-client-python/package.json | 2 +- 12 files changed, 56 insertions(+), 268 deletions(-) create mode 100644 .chronus/changes/python-test-client-operation-group-to-client-2026-3-16-22-50-0.md delete mode 100644 packages/http-client-python/generator/test/azure/mock_api_tests/asynctests/test_azure_resource_manager_multi_service_older_versions_async.py delete mode 100644 packages/http-client-python/generator/test/azure/mock_api_tests/test_azure_resource_manager_multi_service_older_versions.py diff --git a/.chronus/changes/python-test-client-operation-group-to-client-2026-3-16-22-50-0.md b/.chronus/changes/python-test-client-operation-group-to-client-2026-3-16-22-50-0.md new file mode 100644 index 00000000000..9c58a6411d7 --- /dev/null +++ b/.chronus/changes/python-test-client-operation-group-to-client-2026-3-16-22-50-0.md @@ -0,0 +1,7 @@ +--- +changeKind: internal +packages: + - "@typespec/http-client-python" +--- + +Update test cases for Azure/typespec-azure#3997: replace `@operationGroup` with `@client` decorator changes. Remove deleted `multi-service-older-versions` tests and update client structure, naming tests to reflect new flat client hierarchy. diff --git a/packages/http-client-python/generator/test/azure/mock_api_tests/asynctests/test_azure_resource_manager_multi_service_older_versions_async.py b/packages/http-client-python/generator/test/azure/mock_api_tests/asynctests/test_azure_resource_manager_multi_service_older_versions_async.py deleted file mode 100644 index d9f36f938f3..00000000000 --- a/packages/http-client-python/generator/test/azure/mock_api_tests/asynctests/test_azure_resource_manager_multi_service_older_versions_async.py +++ /dev/null @@ -1,111 +0,0 @@ -# ------------------------------------------------------------------------- -# Copyright (c) Microsoft Corporation. All rights reserved. -# Licensed under the MIT License. See License.txt in the project root for -# license information. -# -------------------------------------------------------------------------- -import pytest -from azure.resourcemanager.multiserviceolderversions.combined.aio import CombinedClient -from azure.resourcemanager.multiserviceolderversions.combined.models import ( - VirtualMachine, - Disk, - VirtualMachineProperties, - DiskProperties, -) - - -@pytest.fixture -async def client(credential, authentication_policy): - """Create a Combined async client for testing.""" - return CombinedClient( - credential=credential, - subscription_id="00000000-0000-0000-0000-000000000000", - base_url="http://localhost:3000", - authentication_policy=authentication_policy, - polling_interval=0.1, - ) - - -@pytest.mark.asyncio -async def test_virtual_machines_get(client): - """Test getting a virtual machine.""" - resource_group_name = "test-rg" - vm_name = "vm-old1" - - result = await client.virtual_machines.get(resource_group_name=resource_group_name, vm_name=vm_name) - - assert result is not None - assert isinstance(result, VirtualMachine) - assert result.name == vm_name - assert result.location == "eastus" - assert result.properties is not None - assert result.properties.provisioning_state == "Succeeded" - assert result.properties.size == "Standard_D2s_v3" - - -@pytest.mark.asyncio -async def test_virtual_machines_create_or_update(client): - """Test creating or updating a virtual machine.""" - resource_group_name = "test-rg" - vm_name = "vm-old1" - - vm_resource = VirtualMachine( - location="eastus", - properties=VirtualMachineProperties(size="Standard_D2s_v3"), - ) - - poller = await client.virtual_machines.begin_create_or_update( - resource_group_name=resource_group_name, - vm_name=vm_name, - resource=vm_resource, - ) - - result = await poller.result() - assert result is not None - assert isinstance(result, VirtualMachine) - assert result.location == "eastus" - assert result.properties is not None - assert result.properties.provisioning_state == "Succeeded" - assert result.properties.size == "Standard_D2s_v3" - - -@pytest.mark.asyncio -async def test_disks_get(client): - """Test getting a disk.""" - resource_group_name = "test-rg" - disk_name = "disk-old1" - - result = await client.disks.get(resource_group_name=resource_group_name, disk_name=disk_name) - - assert result is not None - assert isinstance(result, Disk) - assert result.name == disk_name - assert result.location == "eastus" - assert result.properties is not None - assert result.properties.provisioning_state == "Succeeded" - assert result.properties.disk_size_gb == 128 - - -@pytest.mark.asyncio -async def test_disks_create_or_update(client): - """Test creating or updating a disk.""" - resource_group_name = "test-rg" - disk_name = "disk-old1" - - disk_resource = Disk( - location="eastus", - properties=DiskProperties(disk_size_gb=128), - ) - - poller = await client.disks.begin_create_or_update( - resource_group_name=resource_group_name, - disk_name=disk_name, - resource=disk_resource, - ) - - result = await poller.result() - assert result is not None - assert isinstance(result, Disk) - assert result.location == "eastus" - assert result.properties is not None - assert result.properties.provisioning_state == "Succeeded" - assert result.properties.disk_size_gb == 128 diff --git a/packages/http-client-python/generator/test/azure/mock_api_tests/asynctests/test_client_naming_async.py b/packages/http-client-python/generator/test/azure/mock_api_tests/asynctests/test_client_naming_async.py index 39a26924925..4ccd786e801 100644 --- a/packages/http-client-python/generator/test/azure/mock_api_tests/asynctests/test_client_naming_async.py +++ b/packages/http-client-python/generator/test/azure/mock_api_tests/asynctests/test_client_naming_async.py @@ -16,17 +16,17 @@ async def client(): @pytest.mark.asyncio async def test_client(client: NamingClient): - await client.client(models.ClientNameModel(client_name=True)) + await client.property.client(models.ClientNameModel(client_name=True)) @pytest.mark.asyncio async def test_language(client: NamingClient): - await client.language(models.LanguageClientNameModel(python_name=True)) + await client.property.language(models.LanguageClientNameModel(python_name=True)) @pytest.mark.asyncio async def test_compatible_with_encoded_name(client: NamingClient): - await client.compatible_with_encoded_name(models.ClientNameAndJsonEncodedNameModel(client_name=True)) + await client.property.compatible_with_encoded_name(models.ClientNameAndJsonEncodedNameModel(client_name=True)) @pytest.mark.asyncio @@ -41,12 +41,12 @@ async def test_parameter(client: NamingClient): @pytest.mark.asyncio async def test_header_request(client: NamingClient): - await client.request(client_name="true") + await client.header.request(client_name="true") @pytest.mark.asyncio async def test_header_response(client: NamingClient): - assert (await client.response(cls=lambda x, y, z: z))["default-name"] == "true" + assert (await client.header.response(cls=lambda x, y, z: z))["default-name"] == "true" @pytest.mark.asyncio diff --git a/packages/http-client-python/generator/test/azure/mock_api_tests/asynctests/test_client_structure_async.py b/packages/http-client-python/generator/test/azure/mock_api_tests/asynctests/test_client_structure_async.py index be39934d896..0dd3cf01cf0 100644 --- a/packages/http-client-python/generator/test/azure/mock_api_tests/asynctests/test_client_structure_async.py +++ b/packages/http-client-python/generator/test/azure/mock_api_tests/asynctests/test_client_structure_async.py @@ -45,18 +45,18 @@ async def test_structure_renamed_operation(): await client.renamed_three() await client.renamed_five() - await client.group.renamed_two() - await client.group.renamed_four() - await client.group.renamed_six() + await client.renamed_two() + await client.renamed_four() + await client.renamed_six() @pytest.mark.asyncio async def test_structure_two_operation_group(): - client = TwoOperationGroupClient(endpoint="http://localhost:3000", client=ClientType.RENAMED_OPERATION) - await client.group1.one() - await client.group1.three() - await client.group1.four() - - await client.group2.two() - await client.group2.five() - await client.group2.six() + client = TwoOperationGroupClient(endpoint="http://localhost:3000", client=ClientType.TWO_OPERATION_GROUP) + await client.one() + await client.three() + await client.four() + + await client.two() + await client.five() + await client.six() diff --git a/packages/http-client-python/generator/test/azure/mock_api_tests/asynctests/test_client_structure_clientoperationgroup_async.py b/packages/http-client-python/generator/test/azure/mock_api_tests/asynctests/test_client_structure_clientoperationgroup_async.py index 96f1157418b..5e3edcfa808 100644 --- a/packages/http-client-python/generator/test/azure/mock_api_tests/asynctests/test_client_structure_clientoperationgroup_async.py +++ b/packages/http-client-python/generator/test/azure/mock_api_tests/asynctests/test_client_structure_clientoperationgroup_async.py @@ -14,10 +14,10 @@ async def test_first_client_operations(): await client.one() - await client.group3.two() - await client.group3.three() + await client.two() + await client.three() - await client.group4.four() + await client.four() @pytest.mark.asyncio @@ -26,4 +26,4 @@ async def test_second_client_operations(): await client.five() - await client.group5.six() + await client.six() diff --git a/packages/http-client-python/generator/test/azure/mock_api_tests/test_azure_resource_manager_multi_service_older_versions.py b/packages/http-client-python/generator/test/azure/mock_api_tests/test_azure_resource_manager_multi_service_older_versions.py deleted file mode 100644 index e98b0e07796..00000000000 --- a/packages/http-client-python/generator/test/azure/mock_api_tests/test_azure_resource_manager_multi_service_older_versions.py +++ /dev/null @@ -1,107 +0,0 @@ -# ------------------------------------------------------------------------- -# Copyright (c) Microsoft Corporation. All rights reserved. -# Licensed under the MIT License. See License.txt in the project root for -# license information. -# -------------------------------------------------------------------------- -import pytest -from azure.resourcemanager.multiserviceolderversions.combined import CombinedClient -from azure.resourcemanager.multiserviceolderversions.combined.models import ( - VirtualMachine, - Disk, - VirtualMachineProperties, - DiskProperties, -) - - -@pytest.fixture -def client(credential, authentication_policy): - """Create a Combined client for testing.""" - return CombinedClient( - credential=credential, - subscription_id="00000000-0000-0000-0000-000000000000", - base_url="http://localhost:3000", - authentication_policy=authentication_policy, - polling_interval=0.1, - ) - - -def test_virtual_machines_get(client): - """Test getting a virtual machine.""" - resource_group_name = "test-rg" - vm_name = "vm-old1" - - result = client.virtual_machines.get(resource_group_name=resource_group_name, vm_name=vm_name) - - assert result is not None - assert isinstance(result, VirtualMachine) - assert result.name == vm_name - assert result.location == "eastus" - assert result.properties is not None - assert result.properties.provisioning_state == "Succeeded" - assert result.properties.size == "Standard_D2s_v3" - - -def test_virtual_machines_create_or_update(client): - """Test creating or updating a virtual machine.""" - resource_group_name = "test-rg" - vm_name = "vm-old1" - - vm_resource = VirtualMachine( - location="eastus", - properties=VirtualMachineProperties(size="Standard_D2s_v3"), - ) - - poller = client.virtual_machines.begin_create_or_update( - resource_group_name=resource_group_name, - vm_name=vm_name, - resource=vm_resource, - ) - - result = poller.result() - assert result is not None - assert isinstance(result, VirtualMachine) - assert result.location == "eastus" - assert result.properties is not None - assert result.properties.provisioning_state == "Succeeded" - assert result.properties.size == "Standard_D2s_v3" - - -def test_disks_get(client): - """Test getting a disk.""" - resource_group_name = "test-rg" - disk_name = "disk-old1" - - result = client.disks.get(resource_group_name=resource_group_name, disk_name=disk_name) - - assert result is not None - assert isinstance(result, Disk) - assert result.name == disk_name - assert result.location == "eastus" - assert result.properties is not None - assert result.properties.provisioning_state == "Succeeded" - assert result.properties.disk_size_gb == 128 - - -def test_disks_create_or_update(client): - """Test creating or updating a disk.""" - resource_group_name = "test-rg" - disk_name = "disk-old1" - - disk_resource = Disk( - location="eastus", - properties=DiskProperties(disk_size_gb=128), - ) - - poller = client.disks.begin_create_or_update( - resource_group_name=resource_group_name, - disk_name=disk_name, - resource=disk_resource, - ) - - result = poller.result() - assert result is not None - assert isinstance(result, Disk) - assert result.location == "eastus" - assert result.properties is not None - assert result.properties.provisioning_state == "Succeeded" - assert result.properties.disk_size_gb == 128 diff --git a/packages/http-client-python/generator/test/azure/mock_api_tests/test_client_naming.py b/packages/http-client-python/generator/test/azure/mock_api_tests/test_client_naming.py index b0d12844958..94ef8c2d3bb 100644 --- a/packages/http-client-python/generator/test/azure/mock_api_tests/test_client_naming.py +++ b/packages/http-client-python/generator/test/azure/mock_api_tests/test_client_naming.py @@ -14,15 +14,15 @@ def client(): def test_client(client: NamingClient): - client.client(models.ClientNameModel(client_name=True)) + client.property.client(models.ClientNameModel(client_name=True)) def test_language(client: NamingClient): - client.language(models.LanguageClientNameModel(python_name=True)) + client.property.language(models.LanguageClientNameModel(python_name=True)) def test_compatible_with_encoded_name(client: NamingClient): - client.compatible_with_encoded_name(models.ClientNameAndJsonEncodedNameModel(client_name=True)) + client.property.compatible_with_encoded_name(models.ClientNameAndJsonEncodedNameModel(client_name=True)) def test_operation(client: NamingClient): @@ -34,11 +34,11 @@ def test_parameter(client: NamingClient): def test_header_request(client: NamingClient): - client.request(client_name="true") + client.header.request(client_name="true") def test_header_response(client: NamingClient): - assert client.response(cls=lambda x, y, z: z)["default-name"] == "true" + assert client.header.response(cls=lambda x, y, z: z)["default-name"] == "true" def test_model_client(client: NamingClient): diff --git a/packages/http-client-python/generator/test/azure/mock_api_tests/test_client_structure.py b/packages/http-client-python/generator/test/azure/mock_api_tests/test_client_structure.py index d28827376c0..b3328454a26 100644 --- a/packages/http-client-python/generator/test/azure/mock_api_tests/test_client_structure.py +++ b/packages/http-client-python/generator/test/azure/mock_api_tests/test_client_structure.py @@ -41,17 +41,17 @@ def test_structure_renamed_operation(): client.renamed_three() client.renamed_five() - client.group.renamed_two() - client.group.renamed_four() - client.group.renamed_six() + client.renamed_two() + client.renamed_four() + client.renamed_six() def test_structure_two_operation_group(): client = TwoOperationGroupClient(endpoint="http://localhost:3000", client=ClientType.TWO_OPERATION_GROUP) - client.group1.one() - client.group1.three() - client.group1.four() + client.one() + client.three() + client.four() - client.group2.two() - client.group2.five() - client.group2.six() + client.two() + client.five() + client.six() diff --git a/packages/http-client-python/generator/test/azure/mock_api_tests/test_client_structure_clientoperationgroup.py b/packages/http-client-python/generator/test/azure/mock_api_tests/test_client_structure_clientoperationgroup.py index 3990830ebdb..9cad78e78b3 100644 --- a/packages/http-client-python/generator/test/azure/mock_api_tests/test_client_structure_clientoperationgroup.py +++ b/packages/http-client-python/generator/test/azure/mock_api_tests/test_client_structure_clientoperationgroup.py @@ -12,10 +12,10 @@ def test_first_client_operations(): client.one() - client.group3.two() - client.group3.three() + client.two() + client.three() - client.group4.four() + client.four() def test_second_client_operations(): @@ -23,4 +23,4 @@ def test_second_client_operations(): client.five() - client.group5.six() + client.six() diff --git a/packages/http-client-python/generator/test/azure/requirements.txt b/packages/http-client-python/generator/test/azure/requirements.txt index 996b8b767cb..68f042b32e7 100644 --- a/packages/http-client-python/generator/test/azure/requirements.txt +++ b/packages/http-client-python/generator/test/azure/requirements.txt @@ -40,7 +40,6 @@ azure-mgmt-core==1.6.0 -e ./generated/azure-resource-manager-resources -e ./generated/azure-resource-manager-method-subscription-id -e ./generated/azure-resource-manager-multi-service --e ./generated/azure-resource-manager-multi-service-older-versions -e ./generated/azure-resource-manager-multi-service-shared-models -e ./generated/azure-versioning-previewversion -e ./generated/client-namespace diff --git a/packages/http-client-python/package-lock.json b/packages/http-client-python/package-lock.json index d1f50e5651a..e293257866b 100644 --- a/packages/http-client-python/package-lock.json +++ b/packages/http-client-python/package-lock.json @@ -17,7 +17,7 @@ "tsx": "^4.21.0" }, "devDependencies": { - "@azure-tools/azure-http-specs": "0.1.0-alpha.38", + "@azure-tools/azure-http-specs": "0.1.0-alpha.39-dev.2", "@azure-tools/typespec-autorest": "~0.66.0", "@azure-tools/typespec-azure-core": "~0.66.0", "@azure-tools/typespec-azure-resource-manager": "~0.66.0", @@ -66,25 +66,25 @@ } }, "node_modules/@azure-tools/azure-http-specs": { - "version": "0.1.0-alpha.38", - "resolved": "https://registry.npmjs.org/@azure-tools/azure-http-specs/-/azure-http-specs-0.1.0-alpha.38.tgz", - "integrity": "sha512-OkwmMhmSNOV4PO4UA4Tm4ufyA0UPcOrWgZuhybQjWzUq0bbryW9y5ODyknvUV0Z0IOAInW1dUJQ2wRX9pLqNCA==", + "version": "0.1.0-alpha.39-dev.2", + "resolved": "https://registry.npmjs.org/@azure-tools/azure-http-specs/-/azure-http-specs-0.1.0-alpha.39-dev.2.tgz", + "integrity": "sha512-zdztuxkOAvho9oHFLi2DzE79Qnbys5/511FlKNkW+6vA4GfbVlLhNkXsIdIyI4+IkXqiHVtI1JHl9KMdVWlfyQ==", "dev": true, "license": "MIT", "dependencies": { - "@typespec/spec-api": "^0.1.0-alpha.13", - "@typespec/spector": "^0.1.0-alpha.24" + "@typespec/spec-api": "^0.1.0-alpha.13 || >=0.1.0-alpha.14-dev <0.1.0-alpha.14", + "@typespec/spector": "^0.1.0-alpha.24 || >=0.1.0-alpha.25-dev <0.1.0-alpha.25" }, "engines": { "node": ">=20.0.0" }, "peerDependencies": { - "@azure-tools/typespec-azure-core": "^0.66.0", + "@azure-tools/typespec-azure-core": "^0.66.0 || >=0.67.0-dev <0.67.0", "@typespec/compiler": "^1.10.0", "@typespec/http": "^1.10.0", - "@typespec/rest": "^0.80.0", - "@typespec/versioning": "^0.80.0", - "@typespec/xml": "^0.80.0" + "@typespec/rest": "^0.80.0 || >=0.81.0-dev <0.81.0", + "@typespec/versioning": "^0.80.0 || >=0.81.0-dev <0.81.0", + "@typespec/xml": "^0.80.0 || >=0.81.0-dev <0.81.0" } }, "node_modules/@azure-tools/typespec-autorest": { diff --git a/packages/http-client-python/package.json b/packages/http-client-python/package.json index c5305783f37..a40ceb77d43 100644 --- a/packages/http-client-python/package.json +++ b/packages/http-client-python/package.json @@ -82,7 +82,7 @@ "@azure-tools/typespec-azure-resource-manager": "~0.66.0", "@azure-tools/typespec-azure-rulesets": "~0.65.1", "@azure-tools/typespec-client-generator-core": "~0.66.1", - "@azure-tools/azure-http-specs": "0.1.0-alpha.38", + "@azure-tools/azure-http-specs": "0.1.0-alpha.39-dev.2", "@typespec/compiler": "^1.10.0", "@typespec/http": "^1.10.0", "@typespec/openapi": "^1.10.0", From 073c8fea3a2f169267b460b42940cb160235e976 Mon Sep 17 00:00:00 2001 From: Yuchao Yan Date: Tue, 17 Mar 2026 06:56:25 +0000 Subject: [PATCH 3/3] update --- packages/http-client-python/.gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/http-client-python/.gitignore b/packages/http-client-python/.gitignore index 5cdaba90a6c..094f6579dc5 100644 --- a/packages/http-client-python/.gitignore +++ b/packages/http-client-python/.gitignore @@ -7,3 +7,6 @@ generator/test/.diff-summary.md # Regeneration marker (tracks when generated code was last regenerated) .last-regenerate + +# local folder for debug +alpha