diff --git a/.chronus/changes/copilot-add-enum-array-test-2026-0-15-14-32-1.md b/.chronus/changes/copilot-add-enum-array-test-2026-0-15-14-32-1.md new file mode 100644 index 00000000000..7c90fe8ad55 --- /dev/null +++ b/.chronus/changes/copilot-add-enum-array-test-2026-0-15-14-32-1.md @@ -0,0 +1,7 @@ +--- +changeKind: feature +packages: + - "@typespec/http-specs" +--- + +Add array encoding test for enum and extensible enum arrays. \ No newline at end of file diff --git a/packages/http-specs/spec-summary.md b/packages/http-specs/spec-summary.md index 5f681324c59..af295728cc2 100644 --- a/packages/http-specs/spec-summary.md +++ b/packages/http-specs/spec-summary.md @@ -138,6 +138,174 @@ Expected response body: } ``` +### Encode_Array_Property_enumCommaDelimited + +- Endpoint: `post /encode/array/property/enum/comma-delimited` + +Test operation with request and response model contains an enum array property with commaDelimited encode. +Expected request body: + +```json +{ + "value": "blue,red,green" +} +``` + +Expected response body: + +```json +{ + "value": "blue,red,green" +} +``` + +### Encode_Array_Property_enumNewlineDelimited + +- Endpoint: `post /encode/array/property/enum/newline-delimited` + +Test operation with request and response model contains an enum array property with newlineDelimited encode. +Expected request body: + +```json +{ + "value": "blue\nred\ngreen" +} +``` + +Expected response body: + +```json +{ + "value": "blue\nred\ngreen" +} +``` + +### Encode_Array_Property_enumPipeDelimited + +- Endpoint: `post /encode/array/property/enum/pipe-delimited` + +Test operation with request and response model contains an enum array property with pipeDelimited encode. +Expected request body: + +```json +{ + "value": "blue|red|green" +} +``` + +Expected response body: + +```json +{ + "value": "blue|red|green" +} +``` + +### Encode_Array_Property_enumSpaceDelimited + +- Endpoint: `post /encode/array/property/enum/space-delimited` + +Test operation with request and response model contains an enum array property with spaceDelimited encode. +Expected request body: + +```json +{ + "value": "blue red green" +} +``` + +Expected response body: + +```json +{ + "value": "blue red green" +} +``` + +### Encode_Array_Property_extensibleEnumCommaDelimited + +- Endpoint: `post /encode/array/property/extensible-enum/comma-delimited` + +Test operation with request and response model contains an extensible enum (union) array property with commaDelimited encode. +Expected request body: + +```json +{ + "value": "blue,red,green" +} +``` + +Expected response body: + +```json +{ + "value": "blue,red,green" +} +``` + +### Encode_Array_Property_extensibleEnumNewlineDelimited + +- Endpoint: `post /encode/array/property/extensible-enum/newline-delimited` + +Test operation with request and response model contains an extensible enum (union) array property with newlineDelimited encode. +Expected request body: + +```json +{ + "value": "blue\nred\ngreen" +} +``` + +Expected response body: + +```json +{ + "value": "blue\nred\ngreen" +} +``` + +### Encode_Array_Property_extensibleEnumPipeDelimited + +- Endpoint: `post /encode/array/property/extensible-enum/pipe-delimited` + +Test operation with request and response model contains an extensible enum (union) array property with pipeDelimited encode. +Expected request body: + +```json +{ + "value": "blue|red|green" +} +``` + +Expected response body: + +```json +{ + "value": "blue|red|green" +} +``` + +### Encode_Array_Property_extensibleEnumSpaceDelimited + +- Endpoint: `post /encode/array/property/extensible-enum/space-delimited` + +Test operation with request and response model contains an extensible enum (union) array property with spaceDelimited encode. +Expected request body: + +```json +{ + "value": "blue red green" +} +``` + +Expected response body: + +```json +{ + "value": "blue red green" +} +``` + ### Encode_Array_Property_newlineDelimited - Endpoint: `post /encode/array/property/newline-delimited` diff --git a/packages/http-specs/specs/encode/array/main.tsp b/packages/http-specs/specs/encode/array/main.tsp index 4e707eeb41d..5ee5fef6eeb 100644 --- a/packages/http-specs/specs/encode/array/main.tsp +++ b/packages/http-specs/specs/encode/array/main.tsp @@ -8,6 +8,19 @@ using Spector; @scenarioService("/encode/array") namespace Encode.Array; +enum Colors { + Blue: "blue", + Red: "red", + Green: "green", +} + +union ColorsExtensibleEnum { + string, + Blue: "blue", + Red: "red", + Green: "green", +} + model CommaDelimitedArrayProperty { @encode(ArrayEncoding.commaDelimited) value: string[]; @@ -28,6 +41,46 @@ model NewlineDelimitedArrayProperty { value: string[]; } +model CommaDelimitedEnumArrayProperty { + @encode(ArrayEncoding.commaDelimited) + value: Colors[]; +} + +model SpaceDelimitedEnumArrayProperty { + @encode(ArrayEncoding.spaceDelimited) + value: Colors[]; +} + +model PipeDelimitedEnumArrayProperty { + @encode(ArrayEncoding.pipeDelimited) + value: Colors[]; +} + +model NewlineDelimitedEnumArrayProperty { + @encode(ArrayEncoding.newlineDelimited) + value: Colors[]; +} + +model CommaDelimitedExtensibleEnumArrayProperty { + @encode(ArrayEncoding.commaDelimited) + value: ColorsExtensibleEnum[]; +} + +model SpaceDelimitedExtensibleEnumArrayProperty { + @encode(ArrayEncoding.spaceDelimited) + value: ColorsExtensibleEnum[]; +} + +model PipeDelimitedExtensibleEnumArrayProperty { + @encode(ArrayEncoding.pipeDelimited) + value: ColorsExtensibleEnum[]; +} + +model NewlineDelimitedExtensibleEnumArrayProperty { + @encode(ArrayEncoding.newlineDelimited) + value: ColorsExtensibleEnum[]; +} + @route("/property") namespace Property { @route("/comma-delimited") @@ -109,4 +162,178 @@ namespace Property { """) @post op newlineDelimited(@body body: NewlineDelimitedArrayProperty): NewlineDelimitedArrayProperty; + + @route("/enum/comma-delimited") + @scenario + @scenarioDoc(""" + Test operation with request and response model contains an enum array property with commaDelimited encode. + Expected request body: + ```json + { + "value": "blue,red,green" + } + ``` + Expected response body: + ```json + { + "value": "blue,red,green" + } + ``` + """) + @post + op enumCommaDelimited( + @body body: CommaDelimitedEnumArrayProperty, + ): CommaDelimitedEnumArrayProperty; + + @route("/enum/space-delimited") + @scenario + @scenarioDoc(""" + Test operation with request and response model contains an enum array property with spaceDelimited encode. + Expected request body: + ```json + { + "value": "blue red green" + } + ``` + Expected response body: + ```json + { + "value": "blue red green" + } + ``` + """) + @post + op enumSpaceDelimited( + @body body: SpaceDelimitedEnumArrayProperty, + ): SpaceDelimitedEnumArrayProperty; + + @route("/enum/pipe-delimited") + @scenario + @scenarioDoc(""" + Test operation with request and response model contains an enum array property with pipeDelimited encode. + Expected request body: + ```json + { + "value": "blue|red|green" + } + ``` + Expected response body: + ```json + { + "value": "blue|red|green" + } + ``` + """) + @post + op enumPipeDelimited(@body body: PipeDelimitedEnumArrayProperty): PipeDelimitedEnumArrayProperty; + + @route("/enum/newline-delimited") + @scenario + @scenarioDoc(""" + Test operation with request and response model contains an enum array property with newlineDelimited encode. + Expected request body: + ```json + { + "value": "blue\\nred\\ngreen" + } + ``` + Expected response body: + ```json + { + "value": "blue\\nred\\ngreen" + } + ``` + """) + @post + op enumNewlineDelimited( + @body body: NewlineDelimitedEnumArrayProperty, + ): NewlineDelimitedEnumArrayProperty; + + @route("/extensible-enum/comma-delimited") + @scenario + @scenarioDoc(""" + Test operation with request and response model contains an extensible enum (union) array property with commaDelimited encode. + Expected request body: + ```json + { + "value": "blue,red,green" + } + ``` + Expected response body: + ```json + { + "value": "blue,red,green" + } + ``` + """) + @post + op extensibleEnumCommaDelimited( + @body body: CommaDelimitedExtensibleEnumArrayProperty, + ): CommaDelimitedExtensibleEnumArrayProperty; + + @route("/extensible-enum/space-delimited") + @scenario + @scenarioDoc(""" + Test operation with request and response model contains an extensible enum (union) array property with spaceDelimited encode. + Expected request body: + ```json + { + "value": "blue red green" + } + ``` + Expected response body: + ```json + { + "value": "blue red green" + } + ``` + """) + @post + op extensibleEnumSpaceDelimited( + @body body: SpaceDelimitedExtensibleEnumArrayProperty, + ): SpaceDelimitedExtensibleEnumArrayProperty; + + @route("/extensible-enum/pipe-delimited") + @scenario + @scenarioDoc(""" + Test operation with request and response model contains an extensible enum (union) array property with pipeDelimited encode. + Expected request body: + ```json + { + "value": "blue|red|green" + } + ``` + Expected response body: + ```json + { + "value": "blue|red|green" + } + ``` + """) + @post + op extensibleEnumPipeDelimited( + @body body: PipeDelimitedExtensibleEnumArrayProperty, + ): PipeDelimitedExtensibleEnumArrayProperty; + + @route("/extensible-enum/newline-delimited") + @scenario + @scenarioDoc(""" + Test operation with request and response model contains an extensible enum (union) array property with newlineDelimited encode. + Expected request body: + ```json + { + "value": "blue\\nred\\ngreen" + } + ``` + Expected response body: + ```json + { + "value": "blue\\nred\\ngreen" + } + ``` + """) + @post + op extensibleEnumNewlineDelimited( + @body body: NewlineDelimitedExtensibleEnumArrayProperty, + ): NewlineDelimitedExtensibleEnumArrayProperty; } diff --git a/packages/http-specs/specs/encode/array/mockapi.ts b/packages/http-specs/specs/encode/array/mockapi.ts index 8b22eeb67ea..f7ceec959e5 100644 --- a/packages/http-specs/specs/encode/array/mockapi.ts +++ b/packages/http-specs/specs/encode/array/mockapi.ts @@ -41,3 +41,43 @@ Scenarios.Encode_Array_Property_newlineDelimited = createPropertyServerTests( "/encode/array/property/newline-delimited", "\n", ); + +Scenarios.Encode_Array_Property_enumCommaDelimited = createPropertyServerTests( + "/encode/array/property/enum/comma-delimited", + ",", +); + +Scenarios.Encode_Array_Property_enumSpaceDelimited = createPropertyServerTests( + "/encode/array/property/enum/space-delimited", + " ", +); + +Scenarios.Encode_Array_Property_enumPipeDelimited = createPropertyServerTests( + "/encode/array/property/enum/pipe-delimited", + "|", +); + +Scenarios.Encode_Array_Property_enumNewlineDelimited = createPropertyServerTests( + "/encode/array/property/enum/newline-delimited", + "\n", +); + +Scenarios.Encode_Array_Property_extensibleEnumCommaDelimited = createPropertyServerTests( + "/encode/array/property/extensible-enum/comma-delimited", + ",", +); + +Scenarios.Encode_Array_Property_extensibleEnumSpaceDelimited = createPropertyServerTests( + "/encode/array/property/extensible-enum/space-delimited", + " ", +); + +Scenarios.Encode_Array_Property_extensibleEnumPipeDelimited = createPropertyServerTests( + "/encode/array/property/extensible-enum/pipe-delimited", + "|", +); + +Scenarios.Encode_Array_Property_extensibleEnumNewlineDelimited = createPropertyServerTests( + "/encode/array/property/extensible-enum/newline-delimited", + "\n", +);