diff --git a/.chronus/changes/specs-multiServiceSimple-2025-11-2-16-19-14.md b/.chronus/changes/specs-multiServiceSimple-2025-11-2-16-19-14.md new file mode 100644 index 0000000000..87200ec1d6 --- /dev/null +++ b/.chronus/changes/specs-multiServiceSimple-2025-11-2-16-19-14.md @@ -0,0 +1,7 @@ +--- +changeKind: feature +packages: + - "@azure-tools/azure-http-specs" +--- + +Add data plane test for combined multi service. diff --git a/packages/azure-http-specs/spec-summary.md b/packages/azure-http-specs/spec-summary.md index aeaaf8e3d9..a5011b5a0d 100644 --- a/packages/azure-http-specs/spec-summary.md +++ b/packages/azure-http-specs/spec-summary.md @@ -4216,3 +4216,23 @@ With the above two calls, we test the following configurations from this service - A client generated from the second service spec can call the second deployment of a service with api version v2 with the updated changes Tests that we can grow up an operation from accepting one required parameter to accepting a required parameter and an optional parameter. + +### Service_MultiService_ServiceA_Foo_test + +- Endpoint: `get /service/multi-service/service-a/foo/test` + + Test that a client can expose operations from multiple services. This operaton should be called like this: `client.foo.test(...)`. + + Expected path: /service/multi-service/service-a/foo/test + Expected query parameter: api-version=av2 + Expected 204 response. + +### Service_MultiService_ServiceB_Bar_test + +- Endpoint: `get /service/multi-service/service-b/bar/test` + + Test that a client can expose operations from multiple services. This operaton should be called like this: `client.bar.test(...)`. + + Expected path: /service/multi-service/service-b/bar/test + Expected query parameter: api-version=bv2 + Expected 204 response. diff --git a/packages/azure-http-specs/specs/service/multi-service/client.tsp b/packages/azure-http-specs/specs/service/multi-service/client.tsp new file mode 100644 index 0000000000..53215701eb --- /dev/null +++ b/packages/azure-http-specs/specs/service/multi-service/client.tsp @@ -0,0 +1,14 @@ +import "./main.tsp"; +import "@azure-tools/typespec-client-generator-core"; +import "@typespec/spector"; +import "@typespec/http"; +import "@typespec/versioning"; + +using Azure.ClientGenerator.Core; +using Spector; +using Versioning; + +@client({ + service: [Service.MultiService.ServiceA, Service.MultiService.ServiceB], +}) +namespace Service.MultiService.Combined; diff --git a/packages/azure-http-specs/specs/service/multi-service/main.tsp b/packages/azure-http-specs/specs/service/multi-service/main.tsp new file mode 100644 index 0000000000..6f71022f93 --- /dev/null +++ b/packages/azure-http-specs/specs/service/multi-service/main.tsp @@ -0,0 +1,61 @@ +import "@typespec/versioning"; +import "@typespec/http"; +import "@typespec/spector"; + +using Versioning; +using Http; +using Spector; + +namespace Service.MultiService; + +/* + * First service definition in a multi-service package with versioning + */ +@scenarioService("/service/multi-service/service-a") +@versioned(VersionsA) +namespace ServiceA { + enum VersionsA { + av1, + av2, + } + + @route("foo") + interface Foo { + @scenario + @scenarioDoc(""" + Test that a client can expose operations from multiple services. This operaton should be called like this: `client.foo.test(...)`. + + Expected path: /service/multi-service/service-a/foo/test + Expected query parameter: api-version=av2 + Expected 204 response. + """) + @route("/test") + test(@query("api-version") apiVersion: VersionsA): void; + } +} + +/** + * Second service definition in a multi-service package with versioning + */ +@scenarioService("/service/multi-service/service-b") +@versioned(VersionsB) +namespace ServiceB { + enum VersionsB { + bv1, + bv2, + } + + @route("bar") + interface Bar { + @scenario + @scenarioDoc(""" + Test that a client can expose operations from multiple services. This operaton should be called like this: `client.bar.test(...)`. + + Expected path: /service/multi-service/service-b/bar/test + Expected query parameter: api-version=bv2 + Expected 204 response. + """) + @route("/test") + test(@query("api-version") apiVersion: VersionsB): void; + } +} diff --git a/packages/azure-http-specs/specs/service/multi-service/mockapi.ts b/packages/azure-http-specs/specs/service/multi-service/mockapi.ts new file mode 100644 index 0000000000..0f81972235 --- /dev/null +++ b/packages/azure-http-specs/specs/service/multi-service/mockapi.ts @@ -0,0 +1,27 @@ +import { passOnSuccess, ScenarioMockApi } from "@typespec/spec-api"; + +export const Scenarios: Record = {}; + +Scenarios.Service_MultiService_ServiceA_Foo_test = passOnSuccess({ + uri: "/service/multi-service/service-a/foo/test", + method: "get", + request: { + query: { + "api-version": "av2", + }, + }, + response: { status: 204 }, + kind: "MockApiDefinition", +}); + +Scenarios.Service_MultiService_ServiceB_Bar_test = passOnSuccess({ + uri: "/service/multi-service/service-b/bar/test", + method: "get", + request: { + query: { + "api-version": "bv2", + }, + }, + response: { status: 204 }, + kind: "MockApiDefinition", +});