Skip to content
Merged
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
3 changes: 0 additions & 3 deletions paket.dependencies
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,6 @@ nuget Microsoft.OpenApi ~> 2 # https://github.com/microsoft/OpenAPI.NET/blob/mai
nuget Microsoft.OpenApi.YamlReader
nuget NETStandard.Library.NETFramework

# delete when we drop custom parser for v2
nuget YamlDotNet

# THis lines are used by Paket to get the latest version of the Type Provider SDK files
github fsprojects/FSharp.TypeProviders.SDK src/ProvidedTypes.fsi
github fsprojects/FSharp.TypeProviders.SDK src/ProvidedTypes.fs
Expand Down
9 changes: 4 additions & 5 deletions paket.lock
Original file line number Diff line number Diff line change
Expand Up @@ -42,14 +42,13 @@ NUGET
System.Threading.Tasks.Extensions (4.6.3) - restriction: || (>= net462) (&& (< net6.0) (>= netstandard2.0)) (&& (>= netstandard2.0) (< netstandard2.1))
System.Runtime.CompilerServices.Unsafe (>= 6.1.2) - restriction: || (>= net462) (&& (< netcoreapp2.1) (>= netstandard2.0) (< netstandard2.1))
System.ValueTuple (4.6.2) - restriction: >= net462
YamlDotNet (16.3)
GITHUB
remote: fsprojects/FSharp.TypeProviders.SDK
src/ProvidedTypes.fs (75ac6119896431f6573bfcfb663bac2fe3d3df63)
src/ProvidedTypes.fsi (75ac6119896431f6573bfcfb663bac2fe3d3df63)
src/ProvidedTypes.fs (bbea8e0f0858e8cc78159c248baf6bec0636ecfc)
src/ProvidedTypes.fsi (bbea8e0f0858e8cc78159c248baf6bec0636ecfc)
remote: fsprojects/FSharp.Data
src/FSharp.Data.Runtime.Utilities/NameUtils.fs (a1ee1414cacb3d2e6fa26b2726a164f563502728)
src/FSharp.Data.Runtime.Utilities/Pluralizer.fs (a1ee1414cacb3d2e6fa26b2726a164f563502728)
src/FSharp.Data.Runtime.Utilities/NameUtils.fs (e4031d0ce7301da50ba15a5f5084ec9171d8200f)
src/FSharp.Data.Runtime.Utilities/Pluralizer.fs (e4031d0ce7301da50ba15a5f5084ec9171d8200f)
GROUP Server
RESTRICTION: == net10.0
NUGET
Expand Down
2 changes: 0 additions & 2 deletions src/SwaggerProvider.DesignTime/paket.references
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,3 @@ File: NameUtils.fs
System.Text.Json
Microsoft.OpenApi
Microsoft.OpenApi.YamlReader

YamlDotNet
141 changes: 141 additions & 0 deletions tests/SwaggerProvider.Tests/Schema.OperationCompilationTests.fs
Original file line number Diff line number Diff line change
Expand Up @@ -499,3 +499,144 @@ let ``required header parameter is not optional``() =
let headerParam = parameters |> Array.find(fun p -> p.Name = "xApiVersion")
headerParam.IsOptional |> shouldEqual false
headerParam.ParameterType |> shouldEqual typeof<string>

// ── Cookie parameters ──────────────────────────────────────────────────────────

let private cookieParamSchema =
"""openapi: "3.0.0"
info:
title: CookieParamTest
version: "1.0.0"
paths:
/session:
get:
operationId: getSession
parameters:
- name: sessionId
in: cookie
required: true
schema:
type: string
- name: theme
in: cookie
required: false
schema:
type: string
responses:
"200":
description: OK
content:
application/json:
schema:
type: string
components:
schemas: {}
"""

[<Fact>]
let ``cookie parameter is included as a method parameter``() =
let types = compileTaskSchema cookieParamSchema
let method = (findMethod types "GetSession").Value
let parameters = method.GetParameters()
// sessionId (required string) + theme (optional string) + cancellationToken
parameters.Length |> shouldEqual 3
let paramNames = parameters |> Array.map(fun p -> p.Name)
paramNames |> shouldContain "sessionId"
paramNames |> shouldContain "theme"

[<Fact>]
let ``required cookie parameter is not optional``() =
let types = compileTaskSchema cookieParamSchema
let method = (findMethod types "GetSession").Value
let parameters = method.GetParameters()
let cookieParam = parameters |> Array.find(fun p -> p.Name = "sessionId")
cookieParam.IsOptional |> shouldEqual false
cookieParam.ParameterType |> shouldEqual typeof<string>

[<Fact>]
let ``optional cookie parameter is optional``() =
let types = compileTaskSchema cookieParamSchema
let method = (findMethod types "GetSession").Value
let parameters = method.GetParameters()
let themeParam = parameters |> Array.find(fun p -> p.Name = "theme")
themeParam.IsOptional |> shouldEqual true

// ── text/plain response ────────────────────────────────────────────────────────

let private textPlainResponseSchema =
"""openapi: "3.0.0"
info:
title: TextPlainTest
version: "1.0.0"
paths:
/health:
get:
operationId: getHealth
responses:
"200":
description: OK
content:
text/plain:
schema:
type: string
components:
schemas: {}
"""

[<Fact>]
let ``text/plain response produces Task<string> return type``() =
let types = compileTaskSchema textPlainResponseSchema
let method = (findMethod types "GetHealth").Value
method.ReturnType.IsGenericType |> shouldEqual true

method.ReturnType.GetGenericTypeDefinition()
|> shouldEqual typedefof<Task<_>>

method.ReturnType.GetGenericArguments()[0]
|> shouldEqual typeof<string>

[<Fact>]
let ``text/plain response in async mode produces Async<string> return type``() =
let types = compileAsyncSchema textPlainResponseSchema
let method = (findMethod types "GetHealth").Value
method.ReturnType.IsGenericType |> shouldEqual true

method.ReturnType.GetGenericTypeDefinition()
|> shouldEqual typedefof<Async<_>>

method.ReturnType.GetGenericArguments()[0]
|> shouldEqual typeof<string>

// ── default response ───────────────────────────────────────────────────────────

let private defaultResponseSchema =
"""openapi: "3.0.0"
info:
title: DefaultResponseTest
version: "1.0.0"
paths:
/data:
get:
operationId: getData
responses:
default:
description: Default response
content:
application/json:
schema:
type: string
components:
schemas: {}
"""

[<Fact>]
let ``default response is used as return type when no 2xx response is defined``() =
let types = compileTaskSchema defaultResponseSchema
let method = (findMethod types "GetData").Value
method.ReturnType.IsGenericType |> shouldEqual true

method.ReturnType.GetGenericTypeDefinition()
|> shouldEqual typedefof<Task<_>>
// The string schema from the default response should produce Task<string>
method.ReturnType.GetGenericArguments()[0]
|> shouldEqual typeof<string>
Loading