Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
changeKind: feature
packages:
- "@typespec/http-specs"
---

Add tests for array encode.
84 changes: 84 additions & 0 deletions packages/http-specs/spec-summary.md
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,90 @@ Expected behavior: Should handle nested and combined formatting.
Test italic text formatting using _single asterisks_.
Expected behavior: Text between \* should render as italic.

### Encode_Array_Property_commaDelimited

- Endpoint: `post /encode/array/property/comma-delimited`

Test operation with request and response model contains a string array property with commaDelimited 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`

Test operation with request and response model contains a string array property with newlineDelimited encode.
Expected request body:

```json
{
"value": "blue\nred\ngreen"
}
```

Expected response body:

```json
{
"value": "blue\nred\ngreen"
}
```

### Encode_Array_Property_pipeDelimited

- Endpoint: `post /encode/array/property/pipe-delimited`

Test operation with request and response model contains a string array property with pipeDelimited encode.
Expected request body:

```json
{
"value": "blue|red|green"
}
```

Expected response body:

```json
{
"value": "blue|red|green"
}
```

### Encode_Array_Property_spaceDelimited

- Endpoint: `post /encode/array/property/space-delimited`

Test operation with request and response model contains a string array property with spaceDelimited encode.
Expected request body:

```json
{
"value": "blue red green"
}
```

Expected response body:

```json
{
"value": "blue red green"
}
```

### Encode_Bytes_Header_base64

- Endpoint: `get /encode/bytes/header/base64`
Expand Down
112 changes: 112 additions & 0 deletions packages/http-specs/specs/encode/array/main.tsp
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
import "@typespec/http";
import "@typespec/spector";

using Http;
using Spector;

@doc("Test for encode decorator on array.")
@scenarioService("/encode/array")
namespace Encode.Array;

model CommaDelimitedArrayProperty {
@encode(ArrayEncoding.commaDelimited)
value: string[];
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

hope we won't have a int32[] or utcDateTime[]...

}

model SpaceDelimitedArrayProperty {
@encode(ArrayEncoding.spaceDelimited)
value: string[];
}

model PipeDelimitedArrayProperty {
@encode(ArrayEncoding.pipeDelimited)
value: string[];
}

model NewlineDelimitedArrayProperty {
@encode(ArrayEncoding.newlineDelimited)
value: string[];
}

@route("/property")
namespace Property {
@route("/comma-delimited")
@scenario
@scenarioDoc("""
Test operation with request and response model contains a string array property with commaDelimited encode.
Expected request body:
```json
{
"value": "blue,red,green"
}
```
Expected response body:
```json
{
"value": "blue,red,green"
}
```
""")
@post
op commaDelimited(@body body: CommaDelimitedArrayProperty): CommaDelimitedArrayProperty;

@route("/space-delimited")
@scenario
@scenarioDoc("""
Test operation with request and response model contains a string array property with spaceDelimited encode.
Expected request body:
```json
{
"value": "blue red green"
}
```
Expected response body:
```json
{
"value": "blue red green"
}
```
""")
@post
op spaceDelimited(@body body: SpaceDelimitedArrayProperty): SpaceDelimitedArrayProperty;

@route("/pipe-delimited")
@scenario
@scenarioDoc("""
Test operation with request and response model contains a string array property with pipeDelimited encode.
Expected request body:
```json
{
"value": "blue|red|green"
}
```
Expected response body:
```json
{
"value": "blue|red|green"
}
```
""")
@post
op pipeDelimited(@body body: PipeDelimitedArrayProperty): PipeDelimitedArrayProperty;

@route("/newline-delimited")
@scenario
@scenarioDoc("""
Test operation with request and response model contains a string array property with newlineDelimited encode.
Expected request body:
```json
{
"value": "blue\\nred\\ngreen"
}
```
Expected response body:
```json
{
"value": "blue\\nred\\ngreen"
}
```
""")
@post
op newlineDelimited(@body body: NewlineDelimitedArrayProperty): NewlineDelimitedArrayProperty;
}
43 changes: 43 additions & 0 deletions packages/http-specs/specs/encode/array/mockapi.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
import { json, passOnSuccess, ScenarioMockApi } from "@typespec/spec-api";

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

const colors = ["blue", "red", "green"];

function createPropertyServerTests(uri: string, delimiter: string) {
const encodedValue = colors.join(delimiter);
return passOnSuccess({
uri,
method: "post",
request: {
body: json({
value: encodedValue,
}),
},
response: {
status: 200,
body: json({ value: encodedValue }),
},
kind: "MockApiDefinition",
});
}

Scenarios.Encode_Array_Property_commaDelimited = createPropertyServerTests(
"/encode/array/property/comma-delimited",
",",
);

Scenarios.Encode_Array_Property_spaceDelimited = createPropertyServerTests(
"/encode/array/property/space-delimited",
" ",
);

Scenarios.Encode_Array_Property_pipeDelimited = createPropertyServerTests(
"/encode/array/property/pipe-delimited",
"|",
);

Scenarios.Encode_Array_Property_newlineDelimited = createPropertyServerTests(
"/encode/array/property/newline-delimited",
"\n",
);
Loading