From 9da9a9416c3700dbc3f56be319d1ed28cdcfffba Mon Sep 17 00:00:00 2001 From: Travis Prescott Date: Wed, 20 Sep 2023 10:34:21 -0700 Subject: [PATCH] Fix #2347. --- ...enapi3-DuplicateRefs_2023-09-20-17-37.json | 10 +++++++++ ...enapi3-DuplicateRefs_2023-09-20-17-37.json | 10 +++++++++ packages/http/src/responses.ts | 3 ++- packages/openapi3/test/openapi-output.test.ts | 22 +++++++++++++++++++ 4 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 common/changes/@typespec/http/openapi3-DuplicateRefs_2023-09-20-17-37.json create mode 100644 common/changes/@typespec/openapi3/openapi3-DuplicateRefs_2023-09-20-17-37.json diff --git a/common/changes/@typespec/http/openapi3-DuplicateRefs_2023-09-20-17-37.json b/common/changes/@typespec/http/openapi3-DuplicateRefs_2023-09-20-17-37.json new file mode 100644 index 0000000000..e59b9bb12e --- /dev/null +++ b/common/changes/@typespec/http/openapi3-DuplicateRefs_2023-09-20-17-37.json @@ -0,0 +1,10 @@ +{ + "changes": [ + { + "packageName": "@typespec/http", + "comment": "", + "type": "none" + } + ], + "packageName": "@typespec/http" +} \ No newline at end of file diff --git a/common/changes/@typespec/openapi3/openapi3-DuplicateRefs_2023-09-20-17-37.json b/common/changes/@typespec/openapi3/openapi3-DuplicateRefs_2023-09-20-17-37.json new file mode 100644 index 0000000000..98cb3b0806 --- /dev/null +++ b/common/changes/@typespec/openapi3/openapi3-DuplicateRefs_2023-09-20-17-37.json @@ -0,0 +1,10 @@ +{ + "changes": [ + { + "packageName": "@typespec/openapi3", + "comment": "Fix issue where response schemas would sometimes appear as \"anyOf\" with duplicate identical references when they should just be a single schema reference.", + "type": "none" + } + ], + "packageName": "@typespec/openapi3" +} \ No newline at end of file diff --git a/packages/http/src/responses.ts b/packages/http/src/responses.ts index c78e901fae..2fb3f3d1e5 100644 --- a/packages/http/src/responses.ts +++ b/packages/http/src/responses.ts @@ -140,7 +140,8 @@ function getResponseStatusCodes( } } - return codes; + // eliminate duplicate status codes + return [...new Set(codes)]; } /** diff --git a/packages/openapi3/test/openapi-output.test.ts b/packages/openapi3/test/openapi-output.test.ts index a6f128ece1..6b63675ce5 100644 --- a/packages/openapi3/test/openapi-output.test.ts +++ b/packages/openapi3/test/openapi-output.test.ts @@ -167,6 +167,28 @@ describe("openapi3: operations", () => { strictEqual(res.paths["/"].get.deprecated, true); }); + + it("define operation response structure", async () => { + const res = await openApiFor( + ` + model CustomUnauthorizedResponse { + @statusCode _: 401; + @body body: UnauthorizedResponse; + } + + op list(): CustomUnauthorizedResponse; + ` + ); + const responses = res.paths["/"].get.responses; + ok(responses); + ok(responses["401"]); + ok(responses["401"].content); + ok(responses["401"].content["application/json"]); + ok(responses["401"].content["application/json"].schema); + deepStrictEqual(responses["401"].content["application/json"].schema, { + $ref: "#/components/schemas/TypeSpec.Http.UnauthorizedResponse", + }); + }); }); describe("openapi3: request", () => {