diff --git a/src/GraphQL.Client.LocalExecution/GraphQL.Client.LocalExecution.csproj b/src/GraphQL.Client.LocalExecution/GraphQL.Client.LocalExecution.csproj index ebef7ea0..e8e162cb 100644 --- a/src/GraphQL.Client.LocalExecution/GraphQL.Client.LocalExecution.csproj +++ b/src/GraphQL.Client.LocalExecution/GraphQL.Client.LocalExecution.csproj @@ -15,6 +15,7 @@ + diff --git a/src/GraphQL.Client.LocalExecution/GraphQLLocalExecutionClient.cs b/src/GraphQL.Client.LocalExecution/GraphQLLocalExecutionClient.cs index f8fe6503..65098ae8 100644 --- a/src/GraphQL.Client.LocalExecution/GraphQLLocalExecutionClient.cs +++ b/src/GraphQL.Client.LocalExecution/GraphQLLocalExecutionClient.cs @@ -8,6 +8,7 @@ using System.Threading; using System.Threading.Tasks; using GraphQL.Client.Abstractions; +using GraphQL.Client.Serializer.Newtonsoft; using GraphQL.Subscription; using GraphQL.Types; using Newtonsoft.Json; @@ -31,7 +32,7 @@ public class GraphQLLocalExecutionClient : IGraphQLClient where TSchema ContractResolver = new CamelCasePropertyNamesContractResolver(), Converters = new List { - new GraphQLEnumConverter() + new ConstantCaseEnumConverter() } }; @@ -50,7 +51,7 @@ public GraphQLLocalExecutionClient(TSchema schema, IGraphQLJsonSerializer serial Schema.Initialize(); _documentExecuter = new DocumentExecuter(); } - + public void Dispose() { } public Task> SendQueryAsync(GraphQLRequest request, CancellationToken cancellationToken = default) @@ -80,7 +81,7 @@ private async Task>> ExecuteSubscriptionA { var result = await ExecuteAsync(request, cancellationToken); var stream = ((SubscriptionExecutionResult)result).Streams?.Values.SingleOrDefault(); - + return stream == null ? Observable.Throw>(new InvalidOperationException("the GraphQL execution did not return an observable")) : stream.SelectMany(executionResult => Observable.FromAsync(token => ExecutionResultToGraphQLResponse(executionResult, token))); diff --git a/src/GraphQL.Client.LocalExecution/GraphQLEnumConverter.cs b/src/GraphQL.Client.Serializer.Newtonsoft/ConstantCaseEnumConverter.cs similarity index 82% rename from src/GraphQL.Client.LocalExecution/GraphQLEnumConverter.cs rename to src/GraphQL.Client.Serializer.Newtonsoft/ConstantCaseEnumConverter.cs index a02cf935..5eb45f73 100644 --- a/src/GraphQL.Client.LocalExecution/GraphQLEnumConverter.cs +++ b/src/GraphQL.Client.Serializer.Newtonsoft/ConstantCaseEnumConverter.cs @@ -1,13 +1,13 @@ using System; using System.Linq; using System.Reflection; -using GraphQL.Utilities; using Newtonsoft.Json; using Newtonsoft.Json.Converters; +using Panic.StringUtils.Extensions; -namespace GraphQL.Client.LocalExecution +namespace GraphQL.Client.Serializer.Newtonsoft { - public class GraphQLEnumConverter : StringEnumConverter + public class ConstantCaseEnumConverter : StringEnumConverter { public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { @@ -29,7 +29,7 @@ public override void WriteJson(JsonWriter writer, object value, JsonSerializer s } else { - writer.WriteValue(StringUtils.ToConstantCase(memberName)); + writer.WriteValue(memberName.ToConstantCase()); } } } diff --git a/src/GraphQL.Client.Serializer.Newtonsoft/GraphQL.Client.Serializer.Newtonsoft.csproj b/src/GraphQL.Client.Serializer.Newtonsoft/GraphQL.Client.Serializer.Newtonsoft.csproj index 4bbcb784..f603fc93 100644 --- a/src/GraphQL.Client.Serializer.Newtonsoft/GraphQL.Client.Serializer.Newtonsoft.csproj +++ b/src/GraphQL.Client.Serializer.Newtonsoft/GraphQL.Client.Serializer.Newtonsoft.csproj @@ -9,6 +9,7 @@ + diff --git a/src/GraphQL.Client.Serializer.Newtonsoft/NewtonsoftJsonSerializer.cs b/src/GraphQL.Client.Serializer.Newtonsoft/NewtonsoftJsonSerializer.cs index 5ec06c1a..e7cae90f 100644 --- a/src/GraphQL.Client.Serializer.Newtonsoft/NewtonsoftJsonSerializer.cs +++ b/src/GraphQL.Client.Serializer.Newtonsoft/NewtonsoftJsonSerializer.cs @@ -15,7 +15,8 @@ public class NewtonsoftJsonSerializer : IGraphQLWebsocketJsonSerializer public static JsonSerializerSettings DefaultJsonSerializerSettings => new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver { IgnoreIsSpecifiedMembers = true }, - MissingMemberHandling = MissingMemberHandling.Ignore + MissingMemberHandling = MissingMemberHandling.Ignore, + Converters = { new ConstantCaseEnumConverter() } }; public JsonSerializerSettings JsonSerializerSettings { get; } diff --git a/src/GraphQL.Client.Serializer.SystemTextJson/ConstantCaseJsonNamingPolicy.cs b/src/GraphQL.Client.Serializer.SystemTextJson/ConstantCaseJsonNamingPolicy.cs new file mode 100644 index 00000000..b2ea49eb --- /dev/null +++ b/src/GraphQL.Client.Serializer.SystemTextJson/ConstantCaseJsonNamingPolicy.cs @@ -0,0 +1,10 @@ +using System.Text.Json; +using Panic.StringUtils.Extensions; + +namespace GraphQL.Client.Serializer.SystemTextJson +{ + public class ConstantCaseJsonNamingPolicy: JsonNamingPolicy + { + public override string ConvertName(string name) => name.ToConstantCase(); + } +} diff --git a/src/GraphQL.Client.Serializer.SystemTextJson/GraphQL.Client.Serializer.SystemTextJson.csproj b/src/GraphQL.Client.Serializer.SystemTextJson/GraphQL.Client.Serializer.SystemTextJson.csproj index 9433b8dd..93fe58af 100644 --- a/src/GraphQL.Client.Serializer.SystemTextJson/GraphQL.Client.Serializer.SystemTextJson.csproj +++ b/src/GraphQL.Client.Serializer.SystemTextJson/GraphQL.Client.Serializer.SystemTextJson.csproj @@ -15,4 +15,8 @@ + + + + diff --git a/src/GraphQL.Client.Serializer.SystemTextJson/SystemTextJsonSerializer.cs b/src/GraphQL.Client.Serializer.SystemTextJson/SystemTextJsonSerializer.cs index a1667ec8..d0325464 100644 --- a/src/GraphQL.Client.Serializer.SystemTextJson/SystemTextJsonSerializer.cs +++ b/src/GraphQL.Client.Serializer.SystemTextJson/SystemTextJsonSerializer.cs @@ -1,6 +1,7 @@ using System; using System.IO; using System.Text.Json; +using System.Text.Json.Serialization; using System.Threading; using System.Threading.Tasks; using GraphQL.Client.Abstractions; @@ -12,7 +13,8 @@ public class SystemTextJsonSerializer : IGraphQLWebsocketJsonSerializer { public static JsonSerializerOptions DefaultJsonSerializerOptions => new JsonSerializerOptions { - PropertyNamingPolicy = JsonNamingPolicy.CamelCase + PropertyNamingPolicy = JsonNamingPolicy.CamelCase, + Converters = { new JsonStringEnumConverter(new ConstantCaseJsonNamingPolicy(), false)} }.SetupImmutableConverter(); public JsonSerializerOptions Options { get; } diff --git a/tests/GraphQL.Client.Serializer.Tests/NewtonsoftSerializerTest.cs b/tests/GraphQL.Client.Serializer.Tests/NewtonsoftSerializerTest.cs index 00b6d03b..43ade957 100644 --- a/tests/GraphQL.Client.Serializer.Tests/NewtonsoftSerializerTest.cs +++ b/tests/GraphQL.Client.Serializer.Tests/NewtonsoftSerializerTest.cs @@ -11,6 +11,6 @@ public NewtonsoftSerializerTest() : base(new NewtonsoftJsonSerializer()) { } public class NewtonsoftSerializeNoCamelCaseTest : BaseSerializeNoCamelCaseTest { public NewtonsoftSerializeNoCamelCaseTest() - : base(new NewtonsoftJsonSerializer(new JsonSerializerSettings())) { } + : base(new NewtonsoftJsonSerializer(new JsonSerializerSettings(){ Converters = { new ConstantCaseEnumConverter() } })) { } } } diff --git a/tests/GraphQL.Client.Serializer.Tests/SystemTextJsonSerializerTests.cs b/tests/GraphQL.Client.Serializer.Tests/SystemTextJsonSerializerTests.cs index 217c9da1..153bcd4d 100644 --- a/tests/GraphQL.Client.Serializer.Tests/SystemTextJsonSerializerTests.cs +++ b/tests/GraphQL.Client.Serializer.Tests/SystemTextJsonSerializerTests.cs @@ -1,4 +1,5 @@ using System.Text.Json; +using System.Text.Json.Serialization; using GraphQL.Client.Serializer.SystemTextJson; namespace GraphQL.Client.Serializer.Tests @@ -11,6 +12,6 @@ public SystemTextJsonSerializerTests() : base(new SystemTextJsonSerializer()) { public class SystemTextJsonSerializeNoCamelCaseTest : BaseSerializeNoCamelCaseTest { public SystemTextJsonSerializeNoCamelCaseTest() - : base(new SystemTextJsonSerializer(new JsonSerializerOptions().SetupImmutableConverter())) { } + : base(new SystemTextJsonSerializer(new JsonSerializerOptions(){Converters = { new JsonStringEnumConverter(new ConstantCaseJsonNamingPolicy(), false)}}.SetupImmutableConverter())) { } } } diff --git a/tests/GraphQL.Client.Serializer.Tests/TestData/SerializeToStringTestData.cs b/tests/GraphQL.Client.Serializer.Tests/TestData/SerializeToStringTestData.cs index 06208c21..e5285681 100644 --- a/tests/GraphQL.Client.Serializer.Tests/TestData/SerializeToStringTestData.cs +++ b/tests/GraphQL.Client.Serializer.Tests/TestData/SerializeToStringTestData.cs @@ -1,5 +1,7 @@ +using System; using System.Collections; using System.Collections.Generic; +using System.Linq; namespace GraphQL.Client.Serializer.Tests.TestData { @@ -19,8 +21,22 @@ public IEnumerator GetEnumerator() "{\"query\":\"simplequerystring\",\"variables\":null,\"operationName\":null,\"authentication\":\"an-authentication-token\"}", new GraphQLRequest("simple query string"){{"authentication", "an-authentication-token"}} }; + yield return new object[] { + "{\"query\":\"enumtest\",\"variables\":{\"enums\":[\"REGULAR\",\"PASCAL_CASE\",\"CAMEL_CASE\",\"LOWER\",\"UPPER\",\"CONSTANT_CASE\"]},\"operationName\":null}", + new GraphQLRequest("enumtest", new { enums = Enum.GetValues(typeof(TestEnum)).Cast()}) + }; } IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); + + public enum TestEnum + { + Regular, + PascalCase, + camelCase, + lower, + UPPER, + CONSTANT_CASE + } } }