diff --git a/samples/star-wars-api/Startup.fs b/samples/star-wars-api/Startup.fs index f423b7a86..1d07bb1cb 100644 --- a/samples/star-wars-api/Startup.fs +++ b/samples/star-wars-api/Startup.fs @@ -15,6 +15,12 @@ type Startup private () = let rootFactory (ctx) : Root = Root (ctx) + /// Added for testing purposes because in .NET 8 JsonSerializerOptions become frozen after the first use + /// and using this function caused an exception. + let configure (options : GraphQLOptions<_>) = + options.SerializerOptions.Converters.Add (new System.Text.Json.Serialization.JsonStringEnumConverter ()) + options + new (configuration : IConfiguration) as this = Startup () then this.Configuration <- configuration @@ -22,7 +28,7 @@ type Startup private () = member _.ConfigureServices (services : IServiceCollection) = services .AddGiraffe() - .AddGraphQLOptions (Schema.executor, rootFactory) + .AddGraphQLOptions (Schema.executor, rootFactory, configure = configure) |> ignore member _.Configure diff --git a/src/FSharp.Data.GraphQL.Server.AspNetCore/Serialization/JSON.fs b/src/FSharp.Data.GraphQL.Server.AspNetCore/Serialization/JSON.fs index 2d949f2ac..71fe1e035 100644 --- a/src/FSharp.Data.GraphQL.Server.AspNetCore/Serialization/JSON.fs +++ b/src/FSharp.Data.GraphQL.Server.AspNetCore/Serialization/JSON.fs @@ -49,4 +49,3 @@ let getWSSerializerOptions (additionalConverters: JsonConverter seq) = options |> configureDefaultWSSerializerOptions additionalConverters options -let serializerOptions = getWSSerializerOptions Seq.empty diff --git a/src/FSharp.Data.GraphQL.Server.AspNetCore/StartupExtensions.fs b/src/FSharp.Data.GraphQL.Server.AspNetCore/StartupExtensions.fs index fa4bf4c39..dada40484 100644 --- a/src/FSharp.Data.GraphQL.Server.AspNetCore/StartupExtensions.fs +++ b/src/FSharp.Data.GraphQL.Server.AspNetCore/StartupExtensions.fs @@ -16,7 +16,7 @@ module ServiceCollectionExtensions = SchemaExecutor = executor RootFactory = rootFactory ReadBufferSize = GraphQLOptionsDefaults.ReadBufferSize - SerializerOptions = Json.serializerOptions + SerializerOptions = Json.getWSSerializerOptions Seq.empty WebsocketOptions = { EndpointUrl = endpointUrl ConnectionInitTimeout = TimeSpan.FromMilliseconds (GraphQLOptionsDefaults.WebSocketConnectionInitTimeoutInMs) diff --git a/tests/FSharp.Data.GraphQL.Tests/AspNetCore/InvalidMessageTests.fs b/tests/FSharp.Data.GraphQL.Tests/AspNetCore/InvalidMessageTests.fs index 7075962f9..076d39bde 100644 --- a/tests/FSharp.Data.GraphQL.Tests/AspNetCore/InvalidMessageTests.fs +++ b/tests/FSharp.Data.GraphQL.Tests/AspNetCore/InvalidMessageTests.fs @@ -6,7 +6,6 @@ open FSharp.Data.GraphQL.Server.AspNetCore open FSharp.Data.GraphQL.Server.AspNetCore.WebSockets let toClientMessage (theInput : string) = - let serializerOptions = Json.serializerOptions JsonSerializer.Deserialize (theInput, serializerOptions) let willResultInInvalidMessage expectedExplanation input = diff --git a/tests/FSharp.Data.GraphQL.Tests/AspNetCore/SerializationTests.fs b/tests/FSharp.Data.GraphQL.Tests/AspNetCore/SerializationTests.fs index 05bcab916..c36faa8d0 100644 --- a/tests/FSharp.Data.GraphQL.Tests/AspNetCore/SerializationTests.fs +++ b/tests/FSharp.Data.GraphQL.Tests/AspNetCore/SerializationTests.fs @@ -7,8 +7,6 @@ open FSharp.Data.GraphQL.Server.AspNetCore open FSharp.Data.GraphQL.Server.AspNetCore.WebSockets open System.Text.Json.Serialization -let serializerOptions = Json.serializerOptions - [] let ``Deserializes ConnectionInit correctly`` () = diff --git a/tests/FSharp.Data.GraphQL.Tests/ExecutionTests.fs b/tests/FSharp.Data.GraphQL.Tests/ExecutionTests.fs index 99ffafa01..410ef1e9f 100644 --- a/tests/FSharp.Data.GraphQL.Tests/ExecutionTests.fs +++ b/tests/FSharp.Data.GraphQL.Tests/ExecutionTests.fs @@ -16,7 +16,6 @@ open FSharp.Data.GraphQL open FSharp.Data.GraphQL.Types open FSharp.Data.GraphQL.Parser open FSharp.Data.GraphQL.Execution -open FSharp.Data.GraphQL.Server.AspNetCore type TestSubject = { a: string @@ -131,7 +130,7 @@ let ``Execution handles basic tasks: executes arbitrary code`` () = let schema = Schema(DataType) let schemaProcessor = Executor(schema) - let params' = JsonDocument.Parse("""{"size":100}""").RootElement.Deserialize>(Json.serializerOptions) + let params' = JsonDocument.Parse("""{"size":100}""").RootElement.Deserialize>(serializerOptions) let result = sync <| schemaProcessor.AsyncExecute(ast, data, variables = params', operationName = "Example") ensureDirect result <| fun data errors -> empty errors diff --git a/tests/FSharp.Data.GraphQL.Tests/Helpers.fs b/tests/FSharp.Data.GraphQL.Tests/Helpers.fs index ebed4962d..bd1ee38c3 100644 --- a/tests/FSharp.Data.GraphQL.Tests/Helpers.fs +++ b/tests/FSharp.Data.GraphQL.Tests/Helpers.fs @@ -11,6 +11,9 @@ open System.Threading open System.Threading.Tasks open Xunit open FSharp.Data.GraphQL +open FSharp.Data.GraphQL.Server.AspNetCore + +let serializerOptions = Json.getWSSerializerOptions Seq.empty let isType<'a> actual = Assert.IsAssignableFrom<'a>(actual) let isSeq<'a> actual = isType<'a seq> actual @@ -74,11 +77,10 @@ let greaterThanOrEqual expected actual = open System.Text.Json open FSharp.Data.GraphQL.Types -open FSharp.Data.GraphQL.Server.AspNetCore let stringifyArg name (ctx : ResolveFieldContext) () = let arg = ctx.TryArg name |> Option.toObj - JsonSerializer.Serialize (arg, Json.serializerOptions) + JsonSerializer.Serialize (arg, serializerOptions) let stringifyInput = stringifyArg "input" diff --git a/tests/FSharp.Data.GraphQL.Tests/Variables and Inputs/InputComplexTests.fs b/tests/FSharp.Data.GraphQL.Tests/Variables and Inputs/InputComplexTests.fs index ecebe84e4..86c3d4913 100644 --- a/tests/FSharp.Data.GraphQL.Tests/Variables and Inputs/InputComplexTests.fs +++ b/tests/FSharp.Data.GraphQL.Tests/Variables and Inputs/InputComplexTests.fs @@ -16,7 +16,6 @@ open FSharp.Data.GraphQL.Ast open FSharp.Data.GraphQL.Types open FSharp.Data.GraphQL.Parser open FSharp.Data.GraphQL.Execution -open FSharp.Data.GraphQL.Server.AspNetCore open ErrorHelpers let TestComplexScalar = @@ -113,7 +112,7 @@ let variablesWithInput inputName input = $"""{{"%s{inputName}":%s{input}}}""" let paramsWithValueInput input = JsonDocument .Parse(variablesWithInput "input" input) - .RootElement.Deserialize> (Json.serializerOptions) + .RootElement.Deserialize> (serializerOptions) let testInputObject = """{"mand":"baz","opt1":"foo","opt2":null,"optSeq":["bar"],"voptSeq":["bar"],"optArr":null,"voptArr":null}""" diff --git a/tests/FSharp.Data.GraphQL.Tests/Variables and Inputs/InputEnumTests.fs b/tests/FSharp.Data.GraphQL.Tests/Variables and Inputs/InputEnumTests.fs index 5229b190b..6ef3387ad 100644 --- a/tests/FSharp.Data.GraphQL.Tests/Variables and Inputs/InputEnumTests.fs +++ b/tests/FSharp.Data.GraphQL.Tests/Variables and Inputs/InputEnumTests.fs @@ -14,11 +14,10 @@ open FSharp.Data.GraphQL open FSharp.Data.GraphQL.Types open FSharp.Data.GraphQL.Parser open FSharp.Data.GraphQL.Execution -open FSharp.Data.GraphQL.Server.AspNetCore let stringifyArg name (ctx : ResolveFieldContext) () = let arg = ctx.TryArg name |> Option.toObj - JsonSerializer.Serialize (arg, Json.serializerOptions) + JsonSerializer.Serialize (arg, serializerOptions) let stringifyInput = stringifyArg "input" @@ -45,7 +44,7 @@ let variablesWithInput inputName input = $"""{{"%s{inputName}":%s{input}}}""" let paramsWithEnumInput input = JsonDocument .Parse(variablesWithInput "enumVar" input) - .RootElement.Deserialize> (Json.serializerOptions) + .RootElement.Deserialize> (serializerOptions) [] let ``Execute handles enum input as variable`` () = diff --git a/tests/FSharp.Data.GraphQL.Tests/Variables and Inputs/InputListTests.fs b/tests/FSharp.Data.GraphQL.Tests/Variables and Inputs/InputListTests.fs index d5b8de7eb..96c0d3ea0 100644 --- a/tests/FSharp.Data.GraphQL.Tests/Variables and Inputs/InputListTests.fs +++ b/tests/FSharp.Data.GraphQL.Tests/Variables and Inputs/InputListTests.fs @@ -14,12 +14,11 @@ open FSharp.Data.GraphQL open FSharp.Data.GraphQL.Types open FSharp.Data.GraphQL.Parser open FSharp.Data.GraphQL.Execution -open FSharp.Data.GraphQL.Server.AspNetCore open ErrorHelpers let stringifyArg name (ctx : ResolveFieldContext) () = let arg = ctx.TryArg name |> Option.toObj - JsonSerializer.Serialize (arg, Json.serializerOptions) + JsonSerializer.Serialize (arg, serializerOptions) let stringifyInput = stringifyArg "input" @@ -41,7 +40,7 @@ let variablesWithInput inputName input = $"""{{"%s{inputName}":%s{input}}}""" let paramsWithValueInput input = JsonDocument .Parse(variablesWithInput "input" input) - .RootElement.Deserialize> (Json.serializerOptions) + .RootElement.Deserialize> (serializerOptions) [] let ``Execute handles list inputs and nullability and allows lists to be null`` () = diff --git a/tests/FSharp.Data.GraphQL.Tests/Variables and Inputs/InputNestedTests.fs b/tests/FSharp.Data.GraphQL.Tests/Variables and Inputs/InputNestedTests.fs index 2ba48355d..466537726 100644 --- a/tests/FSharp.Data.GraphQL.Tests/Variables and Inputs/InputNestedTests.fs +++ b/tests/FSharp.Data.GraphQL.Tests/Variables and Inputs/InputNestedTests.fs @@ -13,7 +13,6 @@ open FSharp.Data.GraphQL open FSharp.Data.GraphQL.Types open FSharp.Data.GraphQL.Parser open FSharp.Data.GraphQL.Execution -open FSharp.Data.GraphQL.Server.AspNetCore let InputArrayOf (innerDef : #TypeDef<'Val>) : ListOfDef<'Val, 'Val array> = ListOf innerDef @@ -60,7 +59,7 @@ let rec TestRecursiveInputObject = let stringifyArg name (ctx : ResolveFieldContext) () = let arg = ctx.TryArg name |> Option.toObj - JsonSerializer.Serialize (arg, Json.serializerOptions) + JsonSerializer.Serialize (arg, serializerOptions) let stringifyInput = stringifyArg "input" diff --git a/tests/FSharp.Data.GraphQL.Tests/Variables and Inputs/InputNullableStringTests.fs b/tests/FSharp.Data.GraphQL.Tests/Variables and Inputs/InputNullableStringTests.fs index 9ae2386b7..5d4288b87 100644 --- a/tests/FSharp.Data.GraphQL.Tests/Variables and Inputs/InputNullableStringTests.fs +++ b/tests/FSharp.Data.GraphQL.Tests/Variables and Inputs/InputNullableStringTests.fs @@ -14,12 +14,11 @@ open FSharp.Data.GraphQL open FSharp.Data.GraphQL.Types open FSharp.Data.GraphQL.Parser open FSharp.Data.GraphQL.Execution -open FSharp.Data.GraphQL.Server.AspNetCore open ErrorHelpers let stringifyArg name (ctx : ResolveFieldContext) () = let arg = ctx.TryArg name |> Option.toObj - JsonSerializer.Serialize (arg, Json.serializerOptions) + JsonSerializer.Serialize (arg, serializerOptions) let stringifyInput = stringifyArg "input" @@ -46,7 +45,7 @@ let variablesWithInput inputName input = $"""{{"%s{inputName}":%s{input}}}""" let paramsWithValueInput input = JsonDocument .Parse(variablesWithInput "input" input) - .RootElement.Deserialize> (Json.serializerOptions) + .RootElement.Deserialize> (serializerOptions) [] let ``Execute handles variables and allows nullable inputs to be omitted`` () = @@ -99,7 +98,7 @@ let ``Execute handles variables and allows nullable inputs to be set to a value let paramsWithValueInput input = JsonDocument .Parse(variablesWithInput "value" input) - .RootElement.Deserialize> (Json.serializerOptions) + .RootElement.Deserialize> (serializerOptions) let testInputValue = "\"a\"" let params' = paramsWithValueInput testInputValue @@ -130,7 +129,7 @@ let ``Execute handles non-nullable scalars and does not allow non-nullable input let paramsWithValueInput input = JsonDocument .Parse(variablesWithInput "value" input) - .RootElement.Deserialize> (Json.serializerOptions) + .RootElement.Deserialize> (serializerOptions) let testInputValue = "null" let params' = paramsWithValueInput testInputValue @@ -149,7 +148,7 @@ let ``Execute handles non-nullable scalars and allows non-nullable inputs to be let paramsWithValueInput input = JsonDocument .Parse(variablesWithInput "value" input) - .RootElement.Deserialize> (Json.serializerOptions) + .RootElement.Deserialize> (serializerOptions) let testInputValue = "\"a\"" let params' = paramsWithValueInput testInputValue @@ -181,7 +180,7 @@ let ``Execute uses argument default value when no argument was provided`` () = let paramsWithOptionalInput input = JsonDocument .Parse(variablesWithInput "optional" input) - .RootElement.Deserialize> (Json.serializerOptions) + .RootElement.Deserialize> (serializerOptions) [] let ``Execute uses argument default value when nullable variable provided`` () = diff --git a/tests/FSharp.Data.GraphQL.Tests/Variables and Inputs/InputObjectValidatorTests.fs b/tests/FSharp.Data.GraphQL.Tests/Variables and Inputs/InputObjectValidatorTests.fs index d9bb21a16..879a3e82e 100644 --- a/tests/FSharp.Data.GraphQL.Tests/Variables and Inputs/InputObjectValidatorTests.fs +++ b/tests/FSharp.Data.GraphQL.Tests/Variables and Inputs/InputObjectValidatorTests.fs @@ -15,7 +15,6 @@ open FSharp.Data.GraphQL.Parser open FSharp.Data.GraphQL.Execution open FSharp.Data.GraphQL.Validation open FSharp.Data.GraphQL.Validation.ValidationResult -open FSharp.Data.GraphQL.Server.AspNetCore open ErrorHelpers type InputRecord = { Country : string; ZipCode : string; City : string } @@ -158,7 +157,7 @@ let variablesWithAllInputs (record, record1, record2, record3) = let paramsWithValues variables = JsonDocument .Parse(variables : string) - .RootElement.Deserialize> (Json.serializerOptions) + .RootElement.Deserialize> (serializerOptions) [] let ``Execute handles validation of valid input records from variables with all fields`` () = diff --git a/tests/FSharp.Data.GraphQL.Tests/Variables and Inputs/InputRecordTests.fs b/tests/FSharp.Data.GraphQL.Tests/Variables and Inputs/InputRecordTests.fs index cf38f0ac7..7c1cf78ae 100644 --- a/tests/FSharp.Data.GraphQL.Tests/Variables and Inputs/InputRecordTests.fs +++ b/tests/FSharp.Data.GraphQL.Tests/Variables and Inputs/InputRecordTests.fs @@ -11,7 +11,6 @@ open System.Text.Json open FSharp.Data.GraphQL open FSharp.Data.GraphQL.Types open FSharp.Data.GraphQL.Parser -open FSharp.Data.GraphQL.Server.AspNetCore type InputRecord = { a : string; b : string; c : string } @@ -143,7 +142,7 @@ let variablesWithAllInputs (record, optRecord) = let paramsWithValues variables = JsonDocument .Parse(variables : string) - .RootElement.Deserialize> (Json.serializerOptions) + .RootElement.Deserialize> (serializerOptions) [] let ``Execute handles creation of input records from variables with all fields`` () = diff --git a/tests/FSharp.Data.GraphQL.Tests/Variables and Inputs/OptionalsNormalizationTests.fs b/tests/FSharp.Data.GraphQL.Tests/Variables and Inputs/OptionalsNormalizationTests.fs index 1fb88fc2e..555a16997 100644 --- a/tests/FSharp.Data.GraphQL.Tests/Variables and Inputs/OptionalsNormalizationTests.fs +++ b/tests/FSharp.Data.GraphQL.Tests/Variables and Inputs/OptionalsNormalizationTests.fs @@ -13,7 +13,6 @@ open System.Text.Json open FSharp.Data.GraphQL open FSharp.Data.GraphQL.Types open FSharp.Data.GraphQL.Parser -open FSharp.Data.GraphQL.Server.AspNetCore module Phantom =