Skip to content
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
changeKind: feature
packages:
- "@azure-tools/azure-http-specs"
---

Add multi-service test scenarios for older API versions and shared models.
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import "./service1.tsp";
import "./service2.tsp";
import "@azure-tools/typespec-client-generator-core";

using Versioning;
using Azure.Core;
using Azure.ResourceManager;
using Azure.ClientGenerator.Core;

@client({
service: [
Azure.ResourceManager.MultiServiceOlderVersions.Compute,
Azure.ResourceManager.MultiServiceOlderVersions.ComputeDisk
],
})
@useDependency(
Azure.ResourceManager.MultiServiceOlderVersions.Compute.Versions.v2024_11_01,
Azure.ResourceManager.MultiServiceOlderVersions.ComputeDisk.Versions.v2024_03_02
)
namespace Azure.ResourceManager.MultiServiceOlderVersions.Combined;
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
import { json, passOnSuccess, ScenarioMockApi } from "@typespec/spec-api";

export const Scenarios: Record<string, ScenarioMockApi> = {};

// Mock data for Compute (VirtualMachine)
const SUBSCRIPTION_ID = "00000000-0000-0000-0000-000000000000";
const RESOURCE_GROUP = "test-rg";
const LOCATION = "eastus";

const virtualMachine = {
id: `/subscriptions/${SUBSCRIPTION_ID}/resourceGroups/${RESOURCE_GROUP}/providers/Microsoft.Compute/virtualMachinesOld/vm-old1`,
name: "vm-old1",
type: "Microsoft.Compute/virtualMachinesOld",
location: LOCATION,
properties: {
provisioningState: "Succeeded",
size: "Standard_D2s_v3",
},
};

// Mock data for ComputeDisk (Disk)
const disk = {
id: `/subscriptions/${SUBSCRIPTION_ID}/resourceGroups/${RESOURCE_GROUP}/providers/Microsoft.Compute/disksOld/disk-old1`,
name: "disk-old1",
type: "Microsoft.Compute/disksOld",
location: LOCATION,
properties: {
provisioningState: "Succeeded",
diskSizeGB: 128,
},
};

// Scenario: Get Virtual Machine
Scenarios.Azure_ResourceManager_MultiServiceOlderVersions_Compute_VirtualMachines_get =
passOnSuccess([
{
uri: `/subscriptions/${SUBSCRIPTION_ID}/resourceGroups/${RESOURCE_GROUP}/providers/Microsoft.Compute/virtualMachinesOld/vm-old1`,
method: "get",
request: {
query: {
"api-version": "2024-11-01",
},
},
response: {
status: 200,
body: json(virtualMachine),
},
kind: "MockApiDefinition",
},
]);

// Scenario: Create or Update Virtual Machine
Scenarios.Azure_ResourceManager_MultiServiceOlderVersions_Compute_VirtualMachines_createOrUpdate =
passOnSuccess([
{
uri: `/subscriptions/${SUBSCRIPTION_ID}/resourceGroups/${RESOURCE_GROUP}/providers/Microsoft.Compute/virtualMachinesOld/vm-old1`,
method: "put",
request: {
query: {
"api-version": "2024-11-01",
},
body: json({
location: LOCATION,
properties: {
size: "Standard_D2s_v3",
},
}),
},
response: {
status: 200,
body: json(virtualMachine),
},
kind: "MockApiDefinition",
},
]);

// Scenario: Get Disk
Scenarios.Azure_ResourceManager_MultiServiceOlderVersions_ComputeDisk_Disks_get = passOnSuccess([
{
uri: `/subscriptions/${SUBSCRIPTION_ID}/resourceGroups/${RESOURCE_GROUP}/providers/Microsoft.Compute/disksOld/disk-old1`,
method: "get",
request: {
query: {
"api-version": "2024-03-02",
},
},
response: {
status: 200,
body: json(disk),
},
kind: "MockApiDefinition",
},
]);

// Scenario: Create or Update Disk
Scenarios.Azure_ResourceManager_MultiServiceOlderVersions_ComputeDisk_Disks_createOrUpdate =
passOnSuccess([
{
uri: `/subscriptions/${SUBSCRIPTION_ID}/resourceGroups/${RESOURCE_GROUP}/providers/Microsoft.Compute/disksOld/disk-old1`,
method: "put",
request: {
query: {
"api-version": "2024-03-02",
},
body: json({
location: LOCATION,
properties: {
diskSizeGB: 128,
},
}),
},
response: {
status: 200,
body: json(disk),
},
kind: "MockApiDefinition",
},
]);
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
import "@typespec/versioning";
import "@azure-tools/typespec-azure-resource-manager";
import "@typespec/spector";

using TypeSpec.Versioning;
using Spector;

/**
* Compute Client
*/
@armProviderNamespace("Microsoft.Compute")
@service(#{ title: "Azure Compute resource management API." })
@versioned(Versions)
namespace Azure.ResourceManager.MultiServiceOlderVersions.Compute;

/**
* The available API versions.
*/
enum Versions {
/**
* The 2024-11-01 API version.
*/
@armCommonTypesVersion(Azure.ResourceManager.CommonTypes.Versions.v3)
v2024_11_01: "2024-11-01",

/**
* The 2025-04-01 API version.
*/
@armCommonTypesVersion(Azure.ResourceManager.CommonTypes.Versions.v3)
v2025_04_01: "2025-04-01",
}

/**
* Describes a Virtual Machine.
*/
model VirtualMachine is Azure.ResourceManager.TrackedResource<VirtualMachineProperties> {
...ResourceNameParameter<
Resource = VirtualMachine,
KeyName = "vmName",
SegmentName = "virtualMachinesOld",
NamePattern = ""
>;
}

model VirtualMachineProperties {
@visibility(Lifecycle.Read)
provisioningState?: ResourceProvisioningState;

/**
* Size of the virtual machine. Only available in version 2024-11-01.
*/
@added(Versions.v2024_11_01)
@removed(Versions.v2025_04_01)
size?: string;
}

@armResourceOperations
interface VirtualMachines {
/**
* Retrieves information about the model view or the instance view of a virtual machine.
*/
@scenario
@scenarioDoc("""
Test that a client can expose operations from multiple services using older API versions. This operation should be called like this: `client.virtualMachines.get(...)`.

GET a Virtual Machine.
Expected path: /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/test-rg/providers/Microsoft.Compute/virtualMachinesOld/vm-old1
Expected query parameter: api-version=2024-11-01

Expected response body:
```json
{
"id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/test-rg/providers/Microsoft.Compute/virtualMachinesOld/vm-old1",
"name": "vm-old1",
"type": "Microsoft.Compute/virtualMachinesOld",
"location": "eastus",
"properties": {
"provisioningState": "Succeeded",
"size": "Standard_D2s_v3"
}
}
```
""")
get is ArmResourceRead<VirtualMachine>;

/**
* The operation to create or update a virtual machine. Please note some properties can be set only during virtual machine creation.
*/
@scenario
@scenarioDoc("""
Test that a client can expose operations from multiple services using older API versions. This operation should be called like this: `client.virtualMachines.createOrUpdate(...)`.

PUT (create or update) a Virtual Machine.
Expected path: /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/test-rg/providers/Microsoft.Compute/virtualMachinesOld/vm-old1
Expected query parameter: api-version=2024-11-01
Expected request body:
```json
{
"location": "eastus",
"properties": {
"size": "Standard_D2s_v3"
}
}
```
Expected response body:
```json
{
"id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/test-rg/providers/Microsoft.Compute/virtualMachinesOld/vm-old1",
"name": "vm-old1",
"type": "Microsoft.Compute/virtualMachinesOld",
"location": "eastus",
"properties": {
"provisioningState": "Succeeded",
"size": "Standard_D2s_v3"
}
}
```
""")
createOrUpdate is ArmResourceCreateOrUpdateAsync<VirtualMachine>;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,123 @@
import "@typespec/versioning";
import "@azure-tools/typespec-azure-resource-manager";
import "@typespec/spector";

using TypeSpec.Versioning;
using Spector;

/**
* Compute Disk Client
*/
@armProviderNamespace("Microsoft.Compute")
@service(#{ title: "Azure Compute Disk resource management API." })
@versioned(Versions)
namespace Azure.ResourceManager.MultiServiceOlderVersions.ComputeDisk;

/**
* The available API versions.
*/
enum Versions {
/**
* The 2024-03-02 API version.
*/
@armCommonTypesVersion(Azure.ResourceManager.CommonTypes.Versions.v3)
v2024_03_02: "2024-03-02",

/**
* The 2025-01-02 API version.
*/
@armCommonTypesVersion(Azure.ResourceManager.CommonTypes.Versions.v3)
v2025_01_02: "2025-01-02",
}

/**
* Disk resource.
*/
model Disk is Azure.ResourceManager.TrackedResource<DiskProperties> {
...ResourceNameParameter<
Resource = Disk,
KeyName = "diskName",
SegmentName = "disksOld",
NamePattern = ""
>;
}

/**
* Disk resource properties.
*/
model DiskProperties {
@visibility(Lifecycle.Read)
provisioningState?: ResourceProvisioningState;

/**
* Size of the disk in GB. Only available in version 2024-03-02.
*/
@added(Versions.v2024_03_02)
@removed(Versions.v2025_01_02)
diskSizeGB?: int32;
}

@armResourceOperations
interface Disks {
/**
* Gets information about a disk.
*/
@scenario
@scenarioDoc("""
Test that a client can expose operations from multiple services using older API versions. This operation should be called like this: `client.disks.get(...)`.

GET a Disk resource.
Expected path: /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/test-rg/providers/Microsoft.Compute/disksOld/disk-old1
Expected query parameter: api-version=2024-03-02

Expected response body:
```json
{
"id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/test-rg/providers/Microsoft.Compute/disksOld/disk-old1",
"name": "disk-old1",
"type": "Microsoft.Compute/disksOld",
"location": "eastus",
"properties": {
"provisioningState": "Succeeded",
"diskSizeGB": 128
}
}
```
""")
get is ArmResourceRead<Disk>;

/**
* Creates or updates a disk.
*/
@scenario
@scenarioDoc("""
Test that a client can expose operations from multiple services using older API versions. This operation should be called like this: `client.disks.createOrUpdate(...)`.

PUT (create or update) a Disk resource.
Expected path: /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/test-rg/providers/Microsoft.Compute/disksOld/disk-old1
Expected query parameter: api-version=2024-03-02
Expected request body:
```json
{
"location": "eastus",
"properties": {
"diskSizeGB": 128
}
}
```
Expected response body:
```json
{
"id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/test-rg/providers/Microsoft.Compute/disksOld/disk-old1",
"name": "disk-old1",
"type": "Microsoft.Compute/disksOld",
"location": "eastus",
"properties": {
"provisioningState": "Succeeded",
"diskSizeGB": 128
}
}
```
""")
createOrUpdate is ArmResourceCreateOrUpdateAsync<Disk>;
}
Loading
Loading