From f811aff1d802e25beee94a35e6179411ba6c7d34 Mon Sep 17 00:00:00 2001 From: Yuchao Yan Date: Tue, 30 Jan 2024 16:42:42 +0800 Subject: [PATCH 01/12] init --- .../projection/client-encoded-name/main.tsp | 180 ++++++++++++++++++ .../projection/client-encoded-name/mockapi.ts | 75 ++++++++ 2 files changed, 255 insertions(+) create mode 100644 packages/cadl-ranch-specs/http/projection/client-encoded-name/main.tsp create mode 100644 packages/cadl-ranch-specs/http/projection/client-encoded-name/mockapi.ts diff --git a/packages/cadl-ranch-specs/http/projection/client-encoded-name/main.tsp b/packages/cadl-ranch-specs/http/projection/client-encoded-name/main.tsp new file mode 100644 index 000000000..983d7adfd --- /dev/null +++ b/packages/cadl-ranch-specs/http/projection/client-encoded-name/main.tsp @@ -0,0 +1,180 @@ +import "@typespec/http"; +import "@azure-tools/cadl-ranch-expect"; +import "@azure-tools/typespec-client-generator-core"; + +using TypeSpec.Http; +using Azure.ClientGenerator.Core; + +@doc("Projection") +@supportedBy("dpg") +@scenarioService("/projection/client-encoded-name") +namespace Projection.ClientEncodedName; + +@route("/property") +@operationGroup +namespace Property { + model LanguageClientEncodedNameModel { + @doc("Pass in true") + @clientName("_DoNotUseMeAsAName_") // Should be ignored + @clientName("CSName", "csharp") + @clientName("GoName", "go") + @clientName("JavaName", "java") + @clientName("TSName", "javascript") + @clientName("python_name", "python") + defaultName: boolean; + } + + model JsonClientEncodedNameModel { + @doc("Pass in true") + @encodedName("application/json", "wireName") + defaultName: boolean; + } + + model ClientClientEncodedNameModel { + @doc("Pass in true") + @clientName("clientName") + defaultName: boolean; + } + + model JsonAndClientClientEncodedNameModel { + @doc("Pass in true") + @clientName("clientName") + @encodedName("application/json", "wireName") + defaultName: boolean; + } + + @scenario + @scenarioDoc(""" + Testing that we can project the JSON name on the wire from defaultName -> wireName. + Your generated SDK should generate JsonClientEncodedNameModel with one property `defaultName` with wire name `wireName`. + + Expected request body: + ```json + {"wireName": true} + ``` + """) + @route("/json") + @post + op json(...JsonClientEncodedNameModel): NoContentResponse; + + @scenario + @scenarioDoc(""" +Testing that we can project the client name in our generated SDKs. +Your generated SDK should generate ClientClientEncodedNameModel with one property `clientName` with wire name `defaultName`. + +Expected request body: +```json +{"defaultName": true} +``` +""") + @route("/client") + @post + op client(...ClientClientEncodedNameModel): NoContentResponse; + + @scenario + @scenarioDoc(""" +Testing that we can project the language specific name in our generated SDKs. +Your generated SDK should generate ClientClientEncodedNameModel with one property with your language specific property name and wire name `defaultName`. + +Expected request body: +```json +{"defaultName": true} +``` +""") + @route("/language") + @post + op language(...LanguageClientEncodedNameModel): NoContentResponse; + + @scenario + @scenarioDoc(""" +Testing that we can project the client name and the wire name. +Your generated SDK should generate JsonAndClientClientEncodedNameModel with one property with client name `clientName` and wire name `wireName`. + +Expected request body: +```json +{"wireName": true} +``` +""") + @route("/json-and-client") + @post + op jsonAndClient(...JsonAndClientClientEncodedNameModel): NoContentResponse; +} + +// May add query/header project after https://github.com/microsoft/cadl/issues/1487 + +@scenario +@scenarioDoc(""" +Testing that we can project the operation name. +Your generated SDK should generate an operation called `clientName`. + +Expected status code: 204 +""") +@route("/operation") +@clientName("clientName") +@post +op operation(): NoContentResponse; + +@scenario +@scenarioDoc(""" +Testing that we can project a parameter name. +Your generated SDK should generate an operation `parameter` with a single parameter called `clientName`. + +Expected query parameter: `default-name="true"` + +""") +@route("/parameter") +@post +op parameter( + @clientName("clientName") + @query + `default-name`: string, +): NoContentResponse; + +@route("/model") +@operationGroup +namespace Model { + @clientName("_NotUseMeAsAName_") // Should be ignored + @clientName("CSModel", "csharp") + @clientName("GoModel", "go") + @clientName("JavaModel", "java") + @clientName("TSModel", "javascript") + @clientName("PythonModel", "python") + model ModelWithLanguageClientEncodedName { + @doc("Pass in true") + defaultName: boolean; + } + + @clientName("ClientModel") + model ModelWithClientClientEncodedName { + @doc("Pass in true") + defaultName: boolean; + } + + @scenario + @scenarioDoc(""" +Testing that we can project the client name in our generated SDKs. +Your generated SDK should generate the model with name `ClientModel`. + +Expected request body: +```json +{"defaultName": true} +``` +""") + @route("/client") + @post + op client(...ModelWithClientClientEncodedName): NoContentResponse; + + @scenario + @scenarioDoc(""" +Testing that we can project the language specific name in our generated SDKs. +Your generated SDK should generate the model with your language specific model name. + +Expected request body: +```json +{"defaultName": true} +``` +""") + @route("/language") + @post + op language(...ModelWithLanguageClientEncodedName): NoContentResponse; +} diff --git a/packages/cadl-ranch-specs/http/projection/client-encoded-name/mockapi.ts b/packages/cadl-ranch-specs/http/projection/client-encoded-name/mockapi.ts new file mode 100644 index 000000000..0940fd368 --- /dev/null +++ b/packages/cadl-ranch-specs/http/projection/client-encoded-name/mockapi.ts @@ -0,0 +1,75 @@ +import { passOnSuccess, mockapi } from "@azure-tools/cadl-ranch-api"; +import { ScenarioMockApi } from "@azure-tools/cadl-ranch-api"; + +export const Scenarios: Record = {}; + +Scenarios.Projection_ProjectedName_Property_json = passOnSuccess( + mockapi.post("/projection/projected-name/property/json", (req) => { + req.expect.bodyEquals({ wireName: true }); + return { + status: 204, + }; + }), +); + +Scenarios.Projection_ProjectedName_Property_client = passOnSuccess( + mockapi.post("/projection/projected-name/property/client", (req) => { + req.expect.bodyEquals({ defaultName: true }); + return { + status: 204, + }; + }), +); + +Scenarios.Projection_ProjectedName_Property_language = passOnSuccess( + mockapi.post("/projection/projected-name/property/language", (req) => { + req.expect.bodyEquals({ defaultName: true }); + return { + status: 204, + }; + }), +); + +Scenarios.Projection_ProjectedName_Property_jsonAndClient = passOnSuccess( + mockapi.post("/projection/projected-name/property/json-and-client", (req) => { + req.expect.bodyEquals({ wireName: true }); + return { + status: 204, + }; + }), +); + +Scenarios.Projection_ProjectedName_operation = passOnSuccess( + mockapi.post("/projection/projected-name/operation", (req) => { + return { + status: 204, + }; + }), +); + +Scenarios.Projection_ProjectedName_parameter = passOnSuccess( + mockapi.post("/projection/projected-name/parameter", (req) => { + req.expect.containsQueryParam("default-name", "true"); + return { + status: 204, + }; + }), +); + +Scenarios.Projection_ProjectedName_Model_client = passOnSuccess( + mockapi.post("/projection/projected-name/model/client", (req) => { + req.expect.bodyEquals({ defaultName: true }); + return { + status: 204, + }; + }), +); + +Scenarios.Projection_ProjectedName_Model_language = passOnSuccess( + mockapi.post("/projection/projected-name/model/language", (req) => { + req.expect.bodyEquals({ defaultName: true }); + return { + status: 204, + }; + }), +); From 96fd6071164850897bd268a68b034dc899bfb54b Mon Sep 17 00:00:00 2001 From: Yuchao Yan Date: Tue, 30 Jan 2024 17:16:23 +0800 Subject: [PATCH 02/12] add test --- .changeset/early-panthers-wait.md | 5 + .../cadl-ranch-specs/cadl-ranch-summary.md | 96 +++++++++++++++++++ .../projection/client-encoded-name/main.tsp | 38 ++++---- .../projection/client-encoded-name/mockapi.ts | 32 +++---- 4 files changed, 135 insertions(+), 36 deletions(-) create mode 100644 .changeset/early-panthers-wait.md diff --git a/.changeset/early-panthers-wait.md b/.changeset/early-panthers-wait.md new file mode 100644 index 000000000..b44d33f0b --- /dev/null +++ b/.changeset/early-panthers-wait.md @@ -0,0 +1,5 @@ +--- +"@azure-tools/cadl-ranch-specs": patch +--- + +add test case for `@clientName` and `@encodedName` diff --git a/packages/cadl-ranch-specs/cadl-ranch-summary.md b/packages/cadl-ranch-specs/cadl-ranch-summary.md index 227c029cf..a927fe2cc 100644 --- a/packages/cadl-ranch-specs/cadl-ranch-summary.md +++ b/packages/cadl-ranch-specs/cadl-ranch-summary.md @@ -2023,6 +2023,102 @@ maxpagesize=3 } ``` +### Projection_ClientNameAndEncodedName_Model_client + +- Endpoint: `post /projection/client-name-and-encoded-name/model/client` + +Testing that we can project the client name in our generated SDKs. +Your generated SDK should generate the model with name `ClientModel`. + +Expected request body: + +```json +{ "defaultName": true } +``` + +### Projection_ClientNameAndEncodedName_Model_language + +- Endpoint: `post /projection/client-name-and-encoded-name/model/language` + +Testing that we can project the language specific name in our generated SDKs. +Your generated SDK should generate the model with your language specific model name. + +Expected request body: + +```json +{ "defaultName": true } +``` + +### Projection_ClientNameAndEncodedName_operation + +- Endpoint: `post /projection/client-name-and-encoded-name/operation` + +Testing that we can project the operation name. +Your generated SDK should generate an operation called `clientName`. + +Expected status code: 204 + +### Projection_ClientNameAndEncodedName_parameter + +- Endpoint: `post /projection/client-name-and-encoded-name/parameter` + +Testing that we can project a parameter name. +Your generated SDK should generate an operation `parameter` with a single parameter called `clientName`. + +Expected query parameter: `default-name="true"` + +### Projection_ClientNameAndEncodedName_Property_client + +- Endpoint: `post /projection/client-name-and-encoded-name/property/client` + +Testing that we can project the client name in our generated SDKs. +Your generated SDK should generate ClientClientNameAndEncodedNameModel with one property `clientName` with wire name `defaultName`. + +Expected request body: + +```json +{ "defaultName": true } +``` + +### Projection_ClientNameAndEncodedName_Property_json + +- Endpoint: `post /projection/client-name-and-encoded-name/property/json` + +Testing that we can project the JSON name on the wire from defaultName -> wireName. +Your generated SDK should generate JsonClientNameAndEncodedNameModel with one property `defaultName` with wire name `wireName`. + +Expected request body: + +```json +{ "wireName": true } +``` + +### Projection_ClientNameAndEncodedName_Property_jsonAndClient + +- Endpoint: `post /projection/client-name-and-encoded-name/property/json-and-client` + +Testing that we can project the client name and the wire name. +Your generated SDK should generate JsonAndClientClientNameAndEncodedNameModel with one property with client name `clientName` and wire name `wireName`. + +Expected request body: + +```json +{ "wireName": true } +``` + +### Projection_ClientNameAndEncodedName_Property_language + +- Endpoint: `post /projection/client-name-and-encoded-name/property/language` + +Testing that we can project the language specific name in our generated SDKs. +Your generated SDK should generate ClientClientNameAndEncodedNameModel with one property with your language specific property name and wire name `defaultName`. + +Expected request body: + +```json +{ "defaultName": true } +``` + ### Projection_ProjectedName_Model_client - Endpoint: `post /projection/projected-name/model/client` diff --git a/packages/cadl-ranch-specs/http/projection/client-encoded-name/main.tsp b/packages/cadl-ranch-specs/http/projection/client-encoded-name/main.tsp index 983d7adfd..294f05bcf 100644 --- a/packages/cadl-ranch-specs/http/projection/client-encoded-name/main.tsp +++ b/packages/cadl-ranch-specs/http/projection/client-encoded-name/main.tsp @@ -7,15 +7,14 @@ using Azure.ClientGenerator.Core; @doc("Projection") @supportedBy("dpg") -@scenarioService("/projection/client-encoded-name") -namespace Projection.ClientEncodedName; +@scenarioService("/projection/client-name-and-encoded-name") +namespace Projection.ClientNameAndEncodedName; @route("/property") @operationGroup namespace Property { - model LanguageClientEncodedNameModel { + model LanguageClientNameAndEncodedNameModel { @doc("Pass in true") - @clientName("_DoNotUseMeAsAName_") // Should be ignored @clientName("CSName", "csharp") @clientName("GoName", "go") @clientName("JavaName", "java") @@ -24,19 +23,19 @@ namespace Property { defaultName: boolean; } - model JsonClientEncodedNameModel { + model JsonClientNameAndEncodedNameModel { @doc("Pass in true") @encodedName("application/json", "wireName") defaultName: boolean; } - model ClientClientEncodedNameModel { + model ClientClientNameAndEncodedNameModel { @doc("Pass in true") @clientName("clientName") defaultName: boolean; } - model JsonAndClientClientEncodedNameModel { + model JsonAndClientClientNameAndEncodedNameModel { @doc("Pass in true") @clientName("clientName") @encodedName("application/json", "wireName") @@ -46,7 +45,7 @@ namespace Property { @scenario @scenarioDoc(""" Testing that we can project the JSON name on the wire from defaultName -> wireName. - Your generated SDK should generate JsonClientEncodedNameModel with one property `defaultName` with wire name `wireName`. + Your generated SDK should generate JsonClientNameAndEncodedNameModel with one property `defaultName` with wire name `wireName`. Expected request body: ```json @@ -55,12 +54,12 @@ namespace Property { """) @route("/json") @post - op json(...JsonClientEncodedNameModel): NoContentResponse; + op json(...JsonClientNameAndEncodedNameModel): NoContentResponse; @scenario @scenarioDoc(""" Testing that we can project the client name in our generated SDKs. -Your generated SDK should generate ClientClientEncodedNameModel with one property `clientName` with wire name `defaultName`. +Your generated SDK should generate ClientClientNameAndEncodedNameModel with one property `clientName` with wire name `defaultName`. Expected request body: ```json @@ -69,12 +68,12 @@ Expected request body: """) @route("/client") @post - op client(...ClientClientEncodedNameModel): NoContentResponse; + op client(...ClientClientNameAndEncodedNameModel): NoContentResponse; @scenario @scenarioDoc(""" Testing that we can project the language specific name in our generated SDKs. -Your generated SDK should generate ClientClientEncodedNameModel with one property with your language specific property name and wire name `defaultName`. +Your generated SDK should generate ClientClientNameAndEncodedNameModel with one property with your language specific property name and wire name `defaultName`. Expected request body: ```json @@ -83,12 +82,12 @@ Expected request body: """) @route("/language") @post - op language(...LanguageClientEncodedNameModel): NoContentResponse; + op language(...LanguageClientNameAndEncodedNameModel): NoContentResponse; @scenario @scenarioDoc(""" Testing that we can project the client name and the wire name. -Your generated SDK should generate JsonAndClientClientEncodedNameModel with one property with client name `clientName` and wire name `wireName`. +Your generated SDK should generate JsonAndClientClientNameAndEncodedNameModel with one property with client name `clientName` and wire name `wireName`. Expected request body: ```json @@ -97,7 +96,7 @@ Expected request body: """) @route("/json-and-client") @post - op jsonAndClient(...JsonAndClientClientEncodedNameModel): NoContentResponse; + op jsonAndClient(...JsonAndClientClientNameAndEncodedNameModel): NoContentResponse; } // May add query/header project after https://github.com/microsoft/cadl/issues/1487 @@ -133,19 +132,18 @@ op parameter( @route("/model") @operationGroup namespace Model { - @clientName("_NotUseMeAsAName_") // Should be ignored @clientName("CSModel", "csharp") @clientName("GoModel", "go") @clientName("JavaModel", "java") @clientName("TSModel", "javascript") @clientName("PythonModel", "python") - model ModelWithLanguageClientEncodedName { + model ModelWithLanguageClientNameAndEncodedName { @doc("Pass in true") defaultName: boolean; } @clientName("ClientModel") - model ModelWithClientClientEncodedName { + model ModelWithClientClientNameAndEncodedName { @doc("Pass in true") defaultName: boolean; } @@ -162,7 +160,7 @@ Expected request body: """) @route("/client") @post - op client(...ModelWithClientClientEncodedName): NoContentResponse; + op client(...ModelWithClientClientNameAndEncodedName): NoContentResponse; @scenario @scenarioDoc(""" @@ -176,5 +174,5 @@ Expected request body: """) @route("/language") @post - op language(...ModelWithLanguageClientEncodedName): NoContentResponse; + op language(...ModelWithLanguageClientNameAndEncodedName): NoContentResponse; } diff --git a/packages/cadl-ranch-specs/http/projection/client-encoded-name/mockapi.ts b/packages/cadl-ranch-specs/http/projection/client-encoded-name/mockapi.ts index 0940fd368..d2c8d0ba6 100644 --- a/packages/cadl-ranch-specs/http/projection/client-encoded-name/mockapi.ts +++ b/packages/cadl-ranch-specs/http/projection/client-encoded-name/mockapi.ts @@ -3,8 +3,8 @@ import { ScenarioMockApi } from "@azure-tools/cadl-ranch-api"; export const Scenarios: Record = {}; -Scenarios.Projection_ProjectedName_Property_json = passOnSuccess( - mockapi.post("/projection/projected-name/property/json", (req) => { +Scenarios.Projection_ClientNameAndEncodedName_Property_json = passOnSuccess( + mockapi.post("/projection/client-name-and-encoded-name/property/json", (req) => { req.expect.bodyEquals({ wireName: true }); return { status: 204, @@ -12,8 +12,8 @@ Scenarios.Projection_ProjectedName_Property_json = passOnSuccess( }), ); -Scenarios.Projection_ProjectedName_Property_client = passOnSuccess( - mockapi.post("/projection/projected-name/property/client", (req) => { +Scenarios.Projection_ClientNameAndEncodedName_Property_client = passOnSuccess( + mockapi.post("/projection/client-name-and-encoded-name/property/client", (req) => { req.expect.bodyEquals({ defaultName: true }); return { status: 204, @@ -21,8 +21,8 @@ Scenarios.Projection_ProjectedName_Property_client = passOnSuccess( }), ); -Scenarios.Projection_ProjectedName_Property_language = passOnSuccess( - mockapi.post("/projection/projected-name/property/language", (req) => { +Scenarios.Projection_ClientNameAndEncodedName_Property_language = passOnSuccess( + mockapi.post("/projection/client-name-and-encoded-name/property/language", (req) => { req.expect.bodyEquals({ defaultName: true }); return { status: 204, @@ -30,8 +30,8 @@ Scenarios.Projection_ProjectedName_Property_language = passOnSuccess( }), ); -Scenarios.Projection_ProjectedName_Property_jsonAndClient = passOnSuccess( - mockapi.post("/projection/projected-name/property/json-and-client", (req) => { +Scenarios.Projection_ClientNameAndEncodedName_Property_jsonAndClient = passOnSuccess( + mockapi.post("/projection/client-name-and-encoded-name/property/json-and-client", (req) => { req.expect.bodyEquals({ wireName: true }); return { status: 204, @@ -39,16 +39,16 @@ Scenarios.Projection_ProjectedName_Property_jsonAndClient = passOnSuccess( }), ); -Scenarios.Projection_ProjectedName_operation = passOnSuccess( - mockapi.post("/projection/projected-name/operation", (req) => { +Scenarios.Projection_ClientNameAndEncodedName_operation = passOnSuccess( + mockapi.post("/projection/client-name-and-encoded-name/operation", (req) => { return { status: 204, }; }), ); -Scenarios.Projection_ProjectedName_parameter = passOnSuccess( - mockapi.post("/projection/projected-name/parameter", (req) => { +Scenarios.Projection_ClientNameAndEncodedName_parameter = passOnSuccess( + mockapi.post("/projection/client-name-and-encoded-name/parameter", (req) => { req.expect.containsQueryParam("default-name", "true"); return { status: 204, @@ -56,8 +56,8 @@ Scenarios.Projection_ProjectedName_parameter = passOnSuccess( }), ); -Scenarios.Projection_ProjectedName_Model_client = passOnSuccess( - mockapi.post("/projection/projected-name/model/client", (req) => { +Scenarios.Projection_ClientNameAndEncodedName_Model_client = passOnSuccess( + mockapi.post("/projection/client-name-and-encoded-name/model/client", (req) => { req.expect.bodyEquals({ defaultName: true }); return { status: 204, @@ -65,8 +65,8 @@ Scenarios.Projection_ProjectedName_Model_client = passOnSuccess( }), ); -Scenarios.Projection_ProjectedName_Model_language = passOnSuccess( - mockapi.post("/projection/projected-name/model/language", (req) => { +Scenarios.Projection_ClientNameAndEncodedName_Model_language = passOnSuccess( + mockapi.post("/projection/client-name-and-encoded-name/model/language", (req) => { req.expect.bodyEquals({ defaultName: true }); return { status: 204, From c5a0050e60e9e9128439d88910bf7b3715dbdfa4 Mon Sep 17 00:00:00 2001 From: Qiaoqiao Zhang Date: Tue, 20 Feb 2024 11:18:25 +0800 Subject: [PATCH 03/12] resolve model name comments --- .../http/projection/client-encoded-name/main.tsp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/cadl-ranch-specs/http/projection/client-encoded-name/main.tsp b/packages/cadl-ranch-specs/http/projection/client-encoded-name/main.tsp index 294f05bcf..757dc542a 100644 --- a/packages/cadl-ranch-specs/http/projection/client-encoded-name/main.tsp +++ b/packages/cadl-ranch-specs/http/projection/client-encoded-name/main.tsp @@ -137,13 +137,13 @@ namespace Model { @clientName("JavaModel", "java") @clientName("TSModel", "javascript") @clientName("PythonModel", "python") - model ModelWithLanguageClientNameAndEncodedName { + model ModelWithLanguageClientName { @doc("Pass in true") defaultName: boolean; } @clientName("ClientModel") - model ModelWithClientClientNameAndEncodedName { + model ModelWithClientClientName { @doc("Pass in true") defaultName: boolean; } @@ -160,7 +160,7 @@ Expected request body: """) @route("/client") @post - op client(...ModelWithClientClientNameAndEncodedName): NoContentResponse; + op client(...ModelWithClientClientName): NoContentResponse; @scenario @scenarioDoc(""" @@ -174,5 +174,5 @@ Expected request body: """) @route("/language") @post - op language(...ModelWithLanguageClientNameAndEncodedName): NoContentResponse; + op language(...ModelWithLanguageClientName): NoContentResponse; } From b87b190160b84e89f0484728bcdffb046212a798 Mon Sep 17 00:00:00 2001 From: Qiaoqiao Zhang Date: Tue, 20 Feb 2024 13:36:57 +0800 Subject: [PATCH 04/12] resolve comments --- .../cadl-ranch-specs/cadl-ranch-summary.md | 19 ++++++-- .../projection/client-encoded-name/main.tsp | 47 +++++++++++++------ .../projection/client-encoded-name/mockapi.ts | 11 ++++- 3 files changed, 57 insertions(+), 20 deletions(-) diff --git a/packages/cadl-ranch-specs/cadl-ranch-summary.md b/packages/cadl-ranch-specs/cadl-ranch-summary.md index a2c4bca87..392580128 100644 --- a/packages/cadl-ranch-specs/cadl-ranch-summary.md +++ b/packages/cadl-ranch-specs/cadl-ranch-summary.md @@ -2023,6 +2023,15 @@ maxpagesize=3 } ``` +### Projection_ClientNameAndEncodedName_header + +- Endpoint: `post /projection/client-name-and-encoded-name/header` + +Testing that we can project a header name. +Your generated SDK should generate an operation header `parameter` with a single parameter called `clientName`. + +Expected header parameter: `header-name="true"` + ### Projection_ClientNameAndEncodedName_Model_client - Endpoint: `post /projection/client-name-and-encoded-name/model/client` @@ -2065,14 +2074,14 @@ Expected status code: 204 Testing that we can project a parameter name. Your generated SDK should generate an operation `parameter` with a single parameter called `clientName`. -Expected query parameter: `default-name="true"` +Expected query parameter: `query-name="true"` ### Projection_ClientNameAndEncodedName_Property_client - Endpoint: `post /projection/client-name-and-encoded-name/property/client` Testing that we can project the client name in our generated SDKs. -Your generated SDK should generate ClientClientNameAndEncodedNameModel with one property `clientName` with wire name `defaultName`. +Your generated SDK should generate ClientNameModel with one property `clientName` with wire name `defaultName`. Expected request body: @@ -2085,7 +2094,7 @@ Expected request body: - Endpoint: `post /projection/client-name-and-encoded-name/property/json` Testing that we can project the JSON name on the wire from defaultName -> wireName. -Your generated SDK should generate JsonClientNameAndEncodedNameModel with one property `defaultName` with wire name `wireName`. +Your generated SDK should generate JsonEncodedNameModel with one property `defaultName` with wire name `wireName`. Expected request body: @@ -2098,7 +2107,7 @@ Expected request body: - Endpoint: `post /projection/client-name-and-encoded-name/property/json-and-client` Testing that we can project the client name and the wire name. -Your generated SDK should generate JsonAndClientClientNameAndEncodedNameModel with one property with client name `clientName` and wire name `wireName`. +Your generated SDK should generate ClientNameAndJsonEncodedNameModel with one property with client name `clientName` and wire name `wireName`. Expected request body: @@ -2111,7 +2120,7 @@ Expected request body: - Endpoint: `post /projection/client-name-and-encoded-name/property/language` Testing that we can project the language specific name in our generated SDKs. -Your generated SDK should generate ClientClientNameAndEncodedNameModel with one property with your language specific property name and wire name `defaultName`. +Your generated SDK should generate LanguageClientNameModel with one property with your language specific property name and wire name `defaultName`. Expected request body: diff --git a/packages/cadl-ranch-specs/http/projection/client-encoded-name/main.tsp b/packages/cadl-ranch-specs/http/projection/client-encoded-name/main.tsp index 757dc542a..8883eec86 100644 --- a/packages/cadl-ranch-specs/http/projection/client-encoded-name/main.tsp +++ b/packages/cadl-ranch-specs/http/projection/client-encoded-name/main.tsp @@ -13,7 +13,7 @@ namespace Projection.ClientNameAndEncodedName; @route("/property") @operationGroup namespace Property { - model LanguageClientNameAndEncodedNameModel { + model LanguageClientNameModel { @doc("Pass in true") @clientName("CSName", "csharp") @clientName("GoName", "go") @@ -23,19 +23,19 @@ namespace Property { defaultName: boolean; } - model JsonClientNameAndEncodedNameModel { + model JsonEncodedNameModel { @doc("Pass in true") @encodedName("application/json", "wireName") defaultName: boolean; } - model ClientClientNameAndEncodedNameModel { + model ClientNameModel { @doc("Pass in true") @clientName("clientName") defaultName: boolean; } - model JsonAndClientClientNameAndEncodedNameModel { + model ClientNameAndJsonEncodedNameModel { @doc("Pass in true") @clientName("clientName") @encodedName("application/json", "wireName") @@ -45,7 +45,7 @@ namespace Property { @scenario @scenarioDoc(""" Testing that we can project the JSON name on the wire from defaultName -> wireName. - Your generated SDK should generate JsonClientNameAndEncodedNameModel with one property `defaultName` with wire name `wireName`. + Your generated SDK should generate JsonEncodedNameModel with one property `defaultName` with wire name `wireName`. Expected request body: ```json @@ -54,12 +54,12 @@ namespace Property { """) @route("/json") @post - op json(...JsonClientNameAndEncodedNameModel): NoContentResponse; + op json(...JsonEncodedNameModel): NoContentResponse; @scenario @scenarioDoc(""" Testing that we can project the client name in our generated SDKs. -Your generated SDK should generate ClientClientNameAndEncodedNameModel with one property `clientName` with wire name `defaultName`. +Your generated SDK should generate ClientNameModel with one property `clientName` with wire name `defaultName`. Expected request body: ```json @@ -68,12 +68,12 @@ Expected request body: """) @route("/client") @post - op client(...ClientClientNameAndEncodedNameModel): NoContentResponse; + op client(...ClientNameModel): NoContentResponse; @scenario @scenarioDoc(""" Testing that we can project the language specific name in our generated SDKs. -Your generated SDK should generate ClientClientNameAndEncodedNameModel with one property with your language specific property name and wire name `defaultName`. +Your generated SDK should generate LanguageClientNameModel with one property with your language specific property name and wire name `defaultName`. Expected request body: ```json @@ -82,12 +82,12 @@ Expected request body: """) @route("/language") @post - op language(...LanguageClientNameAndEncodedNameModel): NoContentResponse; + op language(...LanguageClientNameModel): NoContentResponse; @scenario @scenarioDoc(""" Testing that we can project the client name and the wire name. -Your generated SDK should generate JsonAndClientClientNameAndEncodedNameModel with one property with client name `clientName` and wire name `wireName`. +Your generated SDK should generate ClientNameAndJsonEncodedNameModel with one property with client name `clientName` and wire name `wireName`. Expected request body: ```json @@ -96,7 +96,7 @@ Expected request body: """) @route("/json-and-client") @post - op jsonAndClient(...JsonAndClientClientNameAndEncodedNameModel): NoContentResponse; + op jsonAndClient(...ClientNameAndJsonEncodedNameModel): NoContentResponse; } // May add query/header project after https://github.com/microsoft/cadl/issues/1487 @@ -118,15 +118,34 @@ op operation(): NoContentResponse; Testing that we can project a parameter name. Your generated SDK should generate an operation `parameter` with a single parameter called `clientName`. -Expected query parameter: `default-name="true"` +Expected query parameter: `query-name="true"` """) @route("/parameter") @post op parameter( @clientName("clientName") + @encodedName("application/json", "query-name") @query - `default-name`: string, + defaultName: string, +): NoContentResponse; + +@scenario +@scenarioDoc(""" +Testing that we can project a header name. +Your generated SDK should generate an operation header `parameter` with a single parameter called `clientName`. + +Expected header parameter: `header-name="true"` + +""") + +@route("/header") +@post +op header( + @clientName("clientName") + @encodedName("application/json", "header-name") + @header + defaultName: string, ): NoContentResponse; @route("/model") diff --git a/packages/cadl-ranch-specs/http/projection/client-encoded-name/mockapi.ts b/packages/cadl-ranch-specs/http/projection/client-encoded-name/mockapi.ts index d2c8d0ba6..e0e953703 100644 --- a/packages/cadl-ranch-specs/http/projection/client-encoded-name/mockapi.ts +++ b/packages/cadl-ranch-specs/http/projection/client-encoded-name/mockapi.ts @@ -49,7 +49,16 @@ Scenarios.Projection_ClientNameAndEncodedName_operation = passOnSuccess( Scenarios.Projection_ClientNameAndEncodedName_parameter = passOnSuccess( mockapi.post("/projection/client-name-and-encoded-name/parameter", (req) => { - req.expect.containsQueryParam("default-name", "true"); + req.expect.containsQueryParam("query-name", "true"); + return { + status: 204, + }; + }), +); + +Scenarios.Projection_ClientNameAndEncodedName_header = passOnSuccess( + mockapi.post("/projection/client-name-and-encoded-name/header", (req) => { + req.expect.containsHeader("header-name", "true"); return { status: 204, }; From 88e116dcbe09a10344803a5db1e1f812c03ed544 Mon Sep 17 00:00:00 2001 From: Qiaoqiao Zhang Date: Tue, 20 Feb 2024 13:43:11 +0800 Subject: [PATCH 05/12] check format --- .../http/projection/client-encoded-name/main.tsp | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/cadl-ranch-specs/http/projection/client-encoded-name/main.tsp b/packages/cadl-ranch-specs/http/projection/client-encoded-name/main.tsp index 8883eec86..920e3ad0f 100644 --- a/packages/cadl-ranch-specs/http/projection/client-encoded-name/main.tsp +++ b/packages/cadl-ranch-specs/http/projection/client-encoded-name/main.tsp @@ -138,7 +138,6 @@ Your generated SDK should generate an operation header `parameter` with a single Expected header parameter: `header-name="true"` """) - @route("/header") @post op header( From 59c3b373d2a04e365b212ccb808be84b9d1daf0d Mon Sep 17 00:00:00 2001 From: Qiaoqiao Zhang Date: Tue, 20 Feb 2024 15:30:53 +0800 Subject: [PATCH 06/12] add header response and resolve comments --- .../http/projection/client-encoded-name/main.tsp | 8 ++++++-- .../http/projection/client-encoded-name/mockapi.ts | 3 +++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/packages/cadl-ranch-specs/http/projection/client-encoded-name/main.tsp b/packages/cadl-ranch-specs/http/projection/client-encoded-name/main.tsp index 920e3ad0f..e1361c73c 100644 --- a/packages/cadl-ranch-specs/http/projection/client-encoded-name/main.tsp +++ b/packages/cadl-ranch-specs/http/projection/client-encoded-name/main.tsp @@ -99,7 +99,6 @@ Expected request body: op jsonAndClient(...ClientNameAndJsonEncodedNameModel): NoContentResponse; } -// May add query/header project after https://github.com/microsoft/cadl/issues/1487 @scenario @scenarioDoc(""" @@ -145,10 +144,15 @@ op header( @encodedName("application/json", "header-name") @header defaultName: string, -): NoContentResponse; +): { + @header + @encodedName("application/json", "header-name") + defaultName: string; +}; @route("/model") @operationGroup +@clientName("ClientModel") namespace Model { @clientName("CSModel", "csharp") @clientName("GoModel", "go") diff --git a/packages/cadl-ranch-specs/http/projection/client-encoded-name/mockapi.ts b/packages/cadl-ranch-specs/http/projection/client-encoded-name/mockapi.ts index e0e953703..78e1335c2 100644 --- a/packages/cadl-ranch-specs/http/projection/client-encoded-name/mockapi.ts +++ b/packages/cadl-ranch-specs/http/projection/client-encoded-name/mockapi.ts @@ -61,6 +61,9 @@ Scenarios.Projection_ClientNameAndEncodedName_header = passOnSuccess( req.expect.containsHeader("header-name", "true"); return { status: 204, + headers: { + "header-name": "true" + } }; }), ); From 755b59ae084d0b0d687fa0633d4c24fa20f21fbe Mon Sep 17 00:00:00 2001 From: qiaozha Date: Wed, 21 Feb 2024 12:02:28 +0800 Subject: [PATCH 07/12] remove encoded name for query and header --- packages/cadl-ranch-specs/cadl-ranch-summary.md | 5 +++-- .../http/projection/client-encoded-name/main.tsp | 14 ++++++-------- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/packages/cadl-ranch-specs/cadl-ranch-summary.md b/packages/cadl-ranch-specs/cadl-ranch-summary.md index 392580128..491a0ef45 100644 --- a/packages/cadl-ranch-specs/cadl-ranch-summary.md +++ b/packages/cadl-ranch-specs/cadl-ranch-summary.md @@ -2030,7 +2030,8 @@ maxpagesize=3 Testing that we can project a header name. Your generated SDK should generate an operation header `parameter` with a single parameter called `clientName`. -Expected header parameter: `header-name="true"` +Expected header parameter: `default-name="true"` +Expected response header: `default-name="true"` ### Projection_ClientNameAndEncodedName_Model_client @@ -2074,7 +2075,7 @@ Expected status code: 204 Testing that we can project a parameter name. Your generated SDK should generate an operation `parameter` with a single parameter called `clientName`. -Expected query parameter: `query-name="true"` +Expected query parameter: `defaultName="true"` ### Projection_ClientNameAndEncodedName_Property_client diff --git a/packages/cadl-ranch-specs/http/projection/client-encoded-name/main.tsp b/packages/cadl-ranch-specs/http/projection/client-encoded-name/main.tsp index e1361c73c..5cf76c5d9 100644 --- a/packages/cadl-ranch-specs/http/projection/client-encoded-name/main.tsp +++ b/packages/cadl-ranch-specs/http/projection/client-encoded-name/main.tsp @@ -117,14 +117,13 @@ op operation(): NoContentResponse; Testing that we can project a parameter name. Your generated SDK should generate an operation `parameter` with a single parameter called `clientName`. -Expected query parameter: `query-name="true"` +Expected query parameter: `defaultName="true"` """) @route("/parameter") @post op parameter( @clientName("clientName") - @encodedName("application/json", "query-name") @query defaultName: string, ): NoContentResponse; @@ -134,20 +133,19 @@ op parameter( Testing that we can project a header name. Your generated SDK should generate an operation header `parameter` with a single parameter called `clientName`. -Expected header parameter: `header-name="true"` - +Expected header parameter: `default-name="true"` +Expected response header: `default-name="true"` """) @route("/header") @post op header( @clientName("clientName") - @encodedName("application/json", "header-name") @header - defaultName: string, + `default-name`: string, ): { + @clientName("clientName") @header - @encodedName("application/json", "header-name") - defaultName: string; + `default-name`: string; }; @route("/model") From 0b3c22bcce51da6fae81d034258530d774dce868 Mon Sep 17 00:00:00 2001 From: qiaozha Date: Wed, 21 Feb 2024 12:08:24 +0800 Subject: [PATCH 08/12] fix format --- packages/cadl-ranch-api/src/types.ts | 5 ++--- packages/cadl-ranch-expect/src/decorators.ts | 4 ++-- .../http/projection/client-encoded-name/main.tsp | 1 - .../http/projection/client-encoded-name/mockapi.ts | 4 ++-- packages/cadl-ranch/src/server/server.ts | 4 ++-- 5 files changed, 8 insertions(+), 10 deletions(-) diff --git a/packages/cadl-ranch-api/src/types.ts b/packages/cadl-ranch-api/src/types.ts index 524b6e1ac..c70c0db53 100644 --- a/packages/cadl-ranch-api/src/types.ts +++ b/packages/cadl-ranch-api/src/types.ts @@ -42,9 +42,8 @@ export type KeyedMockRequestHandler = ( export type HttpMethod = "get" | "post" | "put" | "patch" | "delete" | "head" | "options"; -export type MockApiForHandler = Handler extends KeyedMockRequestHandler - ? KeyedMockApi - : MockApi; +export type MockApiForHandler = + Handler extends KeyedMockRequestHandler ? KeyedMockApi : MockApi; export interface MockApi { method: HttpMethod; diff --git a/packages/cadl-ranch-expect/src/decorators.ts b/packages/cadl-ranch-expect/src/decorators.ts index 34c29f6fe..b706467af 100644 --- a/packages/cadl-ranch-expect/src/decorators.ts +++ b/packages/cadl-ranch-expect/src/decorators.ts @@ -127,8 +127,8 @@ function getRouteSegments(program: Program, target: Operation | Interface | Name return target.interface ? [...getRouteSegments(program, target.interface), ...seg] : target.namespace - ? [...getRouteSegments(program, target.namespace), ...seg] - : seg; + ? [...getRouteSegments(program, target.namespace), ...seg] + : seg; } } diff --git a/packages/cadl-ranch-specs/http/projection/client-encoded-name/main.tsp b/packages/cadl-ranch-specs/http/projection/client-encoded-name/main.tsp index 5cf76c5d9..1963431b8 100644 --- a/packages/cadl-ranch-specs/http/projection/client-encoded-name/main.tsp +++ b/packages/cadl-ranch-specs/http/projection/client-encoded-name/main.tsp @@ -99,7 +99,6 @@ Expected request body: op jsonAndClient(...ClientNameAndJsonEncodedNameModel): NoContentResponse; } - @scenario @scenarioDoc(""" Testing that we can project the operation name. diff --git a/packages/cadl-ranch-specs/http/projection/client-encoded-name/mockapi.ts b/packages/cadl-ranch-specs/http/projection/client-encoded-name/mockapi.ts index 78e1335c2..a1d8582c0 100644 --- a/packages/cadl-ranch-specs/http/projection/client-encoded-name/mockapi.ts +++ b/packages/cadl-ranch-specs/http/projection/client-encoded-name/mockapi.ts @@ -62,8 +62,8 @@ Scenarios.Projection_ClientNameAndEncodedName_header = passOnSuccess( return { status: 204, headers: { - "header-name": "true" - } + "header-name": "true", + }, }; }), ); diff --git a/packages/cadl-ranch/src/server/server.ts b/packages/cadl-ranch/src/server/server.ts index b7f75fd6c..c6c45cb40 100644 --- a/packages/cadl-ranch/src/server/server.ts +++ b/packages/cadl-ranch/src/server/server.ts @@ -17,8 +17,8 @@ const errorHandler: ErrorRequestHandler = (err, _req, res, _next) => { const errResponse = err.toJSON ? err.toJSON() : err instanceof Error - ? { name: err.name, message: err.message, stack: err.stack } - : err; + ? { name: err.name, message: err.message, stack: err.stack } + : err; res.status(err.status || 500); res.contentType("application/json").send(errResponse).end(); From ea7268b172125725f2cdf6edac73017c398ad786 Mon Sep 17 00:00:00 2001 From: Qiaoqiao Zhang <55688292+qiaozha@users.noreply.github.com> Date: Wed, 21 Feb 2024 12:14:01 +0800 Subject: [PATCH 09/12] Update packages/cadl-ranch-api/src/types.ts --- packages/cadl-ranch-api/src/types.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/cadl-ranch-api/src/types.ts b/packages/cadl-ranch-api/src/types.ts index c70c0db53..524b6e1ac 100644 --- a/packages/cadl-ranch-api/src/types.ts +++ b/packages/cadl-ranch-api/src/types.ts @@ -42,8 +42,9 @@ export type KeyedMockRequestHandler = ( export type HttpMethod = "get" | "post" | "put" | "patch" | "delete" | "head" | "options"; -export type MockApiForHandler = - Handler extends KeyedMockRequestHandler ? KeyedMockApi : MockApi; +export type MockApiForHandler = Handler extends KeyedMockRequestHandler + ? KeyedMockApi + : MockApi; export interface MockApi { method: HttpMethod; From f1cc098c58ea929ba19130bfb4eb86967297b7ac Mon Sep 17 00:00:00 2001 From: Qiaoqiao Zhang <55688292+qiaozha@users.noreply.github.com> Date: Wed, 21 Feb 2024 12:14:07 +0800 Subject: [PATCH 10/12] Update packages/cadl-ranch-expect/src/decorators.ts --- packages/cadl-ranch-expect/src/decorators.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/cadl-ranch-expect/src/decorators.ts b/packages/cadl-ranch-expect/src/decorators.ts index b706467af..34c29f6fe 100644 --- a/packages/cadl-ranch-expect/src/decorators.ts +++ b/packages/cadl-ranch-expect/src/decorators.ts @@ -127,8 +127,8 @@ function getRouteSegments(program: Program, target: Operation | Interface | Name return target.interface ? [...getRouteSegments(program, target.interface), ...seg] : target.namespace - ? [...getRouteSegments(program, target.namespace), ...seg] - : seg; + ? [...getRouteSegments(program, target.namespace), ...seg] + : seg; } } From 500348b2607f7a51e0cacb2c108a29952b2ca558 Mon Sep 17 00:00:00 2001 From: Qiaoqiao Zhang <55688292+qiaozha@users.noreply.github.com> Date: Wed, 21 Feb 2024 12:14:13 +0800 Subject: [PATCH 11/12] Update packages/cadl-ranch/src/server/server.ts --- packages/cadl-ranch/src/server/server.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/cadl-ranch/src/server/server.ts b/packages/cadl-ranch/src/server/server.ts index c6c45cb40..b7f75fd6c 100644 --- a/packages/cadl-ranch/src/server/server.ts +++ b/packages/cadl-ranch/src/server/server.ts @@ -17,8 +17,8 @@ const errorHandler: ErrorRequestHandler = (err, _req, res, _next) => { const errResponse = err.toJSON ? err.toJSON() : err instanceof Error - ? { name: err.name, message: err.message, stack: err.stack } - : err; + ? { name: err.name, message: err.message, stack: err.stack } + : err; res.status(err.status || 500); res.contentType("application/json").send(errResponse).end(); From 55fe246fd2890c5d63b28f303643a372a68bff7b Mon Sep 17 00:00:00 2001 From: qiaozha Date: Wed, 21 Feb 2024 12:22:03 +0800 Subject: [PATCH 12/12] fix mock api --- .../http/projection/client-encoded-name/mockapi.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/cadl-ranch-specs/http/projection/client-encoded-name/mockapi.ts b/packages/cadl-ranch-specs/http/projection/client-encoded-name/mockapi.ts index a1d8582c0..bd9bbefa4 100644 --- a/packages/cadl-ranch-specs/http/projection/client-encoded-name/mockapi.ts +++ b/packages/cadl-ranch-specs/http/projection/client-encoded-name/mockapi.ts @@ -49,7 +49,7 @@ Scenarios.Projection_ClientNameAndEncodedName_operation = passOnSuccess( Scenarios.Projection_ClientNameAndEncodedName_parameter = passOnSuccess( mockapi.post("/projection/client-name-and-encoded-name/parameter", (req) => { - req.expect.containsQueryParam("query-name", "true"); + req.expect.containsQueryParam("defaultName", "true"); return { status: 204, }; @@ -58,11 +58,11 @@ Scenarios.Projection_ClientNameAndEncodedName_parameter = passOnSuccess( Scenarios.Projection_ClientNameAndEncodedName_header = passOnSuccess( mockapi.post("/projection/client-name-and-encoded-name/header", (req) => { - req.expect.containsHeader("header-name", "true"); + req.expect.containsHeader("default-name", "true"); return { status: 204, headers: { - "header-name": "true", + "default-name": "true", }, }; }),