diff --git a/.chronus/changes/specs-noAuth-2026-0-6-16-4-0.md b/.chronus/changes/specs-noAuth-2026-0-6-16-4-0.md new file mode 100644 index 00000000000..536fd92c327 --- /dev/null +++ b/.chronus/changes/specs-noAuth-2026-0-6-16-4-0.md @@ -0,0 +1,7 @@ +--- +changeKind: feature +packages: + - "@typespec/http-specs" +--- + +Add test for services that accept `NoAuth` unioned with other auth type \ No newline at end of file diff --git a/cspell.yaml b/cspell.yaml index d00edc56709..a726a71c8f9 100644 --- a/cspell.yaml +++ b/cspell.yaml @@ -166,6 +166,7 @@ words: - nexted - nihao - nint + - noauth - NODEFS - noformat - nologo diff --git a/packages/http-specs/spec-summary.md b/packages/http-specs/spec-summary.md index a265b83066f..a943273eea8 100644 --- a/packages/http-specs/spec-summary.md +++ b/packages/http-specs/spec-summary.md @@ -39,6 +39,18 @@ Expect error code 403 and error body: Expects header 'Authorization': 'SharedAccessKey valid-key' +### Authentication_Noauth_Union_validNoAuth + +- Endpoint: `get /authentication/noauth/union/valid` + +Expects no authentication. The server accepts requests without any authentication header. + +### Authentication_Noauth_Union_validToken + +- Endpoint: `get /authentication/noauth/union/validtoken` + +Expects header 'authorization': 'Bearer https://security.microsoft.com/.default' + ### Authentication_OAuth2_invalid - Endpoint: `get /authentication/oauth2/invalid` diff --git a/packages/http-specs/specs/authentication/noauth/union/main.tsp b/packages/http-specs/specs/authentication/noauth/union/main.tsp new file mode 100644 index 00000000000..b7b208a31b2 --- /dev/null +++ b/packages/http-specs/specs/authentication/noauth/union/main.tsp @@ -0,0 +1,30 @@ +import "@typespec/http"; +import "@typespec/spector"; + +using Http; +using Spector; + +@scenarioService("/authentication/noauth/union") +@doc("Illustrates clients generated with NoAuth and OAuth2 authentication union.") +@useAuth(NoAuth | OAuth2Auth<[MyFlow]>) +namespace Authentication.Noauth.Union; + +model MyFlow { + type: OAuth2FlowType.implicit; + authorizationUrl: "https://login.microsoftonline.com/common/oauth2/authorize"; + scopes: ["https://security.microsoft.com/.default"]; +} + +@scenario +@scenarioDoc("Expects no authentication. The server accepts requests without any authentication header.") +@doc("Check whether client can make a request without authentication") +@get +@route("/valid") +op validNoAuth(): NoContentResponse; + +@scenario +@scenarioDoc("Expects header 'authorization': 'Bearer https://security.microsoft.com/.default'") +@doc("Check whether client is authenticated with OAuth2 token") +@get +@route("/validtoken") +op validToken(): NoContentResponse; diff --git a/packages/http-specs/specs/authentication/noauth/union/mockapi.ts b/packages/http-specs/specs/authentication/noauth/union/mockapi.ts new file mode 100644 index 00000000000..4aee49b0c56 --- /dev/null +++ b/packages/http-specs/specs/authentication/noauth/union/mockapi.ts @@ -0,0 +1,27 @@ +import { passOnSuccess, ScenarioMockApi } from "@typespec/spec-api"; + +export const Scenarios: Record = {}; + +Scenarios.Authentication_Noauth_Union_validNoAuth = passOnSuccess({ + uri: `/authentication/noauth/union/valid`, + method: "get", + request: {}, + response: { + status: 204, + }, + kind: "MockApiDefinition", +}); + +Scenarios.Authentication_Noauth_Union_validToken = passOnSuccess({ + uri: `/authentication/noauth/union/validtoken`, + method: "get", + request: { + headers: { + authorization: "Bearer https://security.microsoft.com/.default", + }, + }, + response: { + status: 204, + }, + kind: "MockApiDefinition", +});