From dbc4f1e4a51a4d4640957c5df9f50e9a5fd147a5 Mon Sep 17 00:00:00 2001 From: Mike Minutillo Date: Wed, 5 Jun 2024 13:56:34 +0800 Subject: [PATCH 1/2] Do not serialize null properties --- .../QueryBuilderTests.cs | 6 ++-- .../Core/Serializers/QuerySerializer.cs | 34 ++++++++++++------- 2 files changed, 24 insertions(+), 16 deletions(-) diff --git a/Octokit.GraphQL.Core.UnitTests/QueryBuilderTests.cs b/Octokit.GraphQL.Core.UnitTests/QueryBuilderTests.cs index 3d6af5a1..ef55b6e3 100644 --- a/Octokit.GraphQL.Core.UnitTests/QueryBuilderTests.cs +++ b/Octokit.GraphQL.Core.UnitTests/QueryBuilderTests.cs @@ -388,7 +388,7 @@ public void InputObject_Parameter() [Fact] public void InputObject_Parameter_With_Null_Field() { - var expected = "query{addComment(input:{subjectId:\"x\",body:null,clientMutationId:\"1\"}){body}}"; + var expected = "query{addComment(input:{subjectId:\"x\",clientMutationId:\"1\"}){body}}"; var input = new AddCommentInput { @@ -578,7 +578,7 @@ public void Backslash_In_String_Arg_Is_Escaped() [Fact] public void Double_Quotes_In_InputObject_Arg_Are_Escaped() { - var expected = "query{addComment(input:{subjectId:\"\",body:null,clientMutationId:\"string with \\\"quotes\\\" in it\"}){body}}"; + var expected = "query{addComment(input:{subjectId:\"\",clientMutationId:\"string with \\\"quotes\\\" in it\"}){body}}"; var expression = new Query() .AddComment(new AddCommentInput { ClientMutationId = "string with \"quotes\" in it" }) @@ -592,7 +592,7 @@ public void Double_Quotes_In_InputObject_Arg_Are_Escaped() [Fact] public void Backslash_In_InputObject_Arg_Is_Escaped() { - var expected = "query{addComment(input:{subjectId:\"\",body:null,clientMutationId:\"string with \\\\ in it\"}){body}}"; + var expected = "query{addComment(input:{subjectId:\"\",clientMutationId:\"string with \\\\ in it\"}){body}}"; var expression = new Query() .AddComment(new AddCommentInput { ClientMutationId = "string with \\ in it" }) diff --git a/Octokit.GraphQL.Core/Core/Serializers/QuerySerializer.cs b/Octokit.GraphQL.Core/Core/Serializers/QuerySerializer.cs index 1f840327..612a03be 100644 --- a/Octokit.GraphQL.Core/Core/Serializers/QuerySerializer.cs +++ b/Octokit.GraphQL.Core/Core/Serializers/QuerySerializer.cs @@ -247,27 +247,35 @@ private void SerializeValue(StringBuilder builder, object value) //Cache Hit } + var openedBrace = false; + for (var index = 0; index < properties.Length; index++) { var property = properties[index]; - if (index == 0) - { - OpenBrace(builder); - } - else - { - builder.Append(","); - } - - builder.Append(property.Item1.LowerFirstCharacter()).Append(colon); - SerializeValue(builder, property.Item2.Invoke(value, null)); + var propertyValue = property.Item2.Invoke(value, null); - if (index + 1 == properties.Length) + if (propertyValue != null) { - CloseBrace(builder); + if(openedBrace) + { + builder.Append(','); + } + else + { + OpenBrace(builder); + openedBrace = true; + } + + builder.Append(property.Item1.LowerFirstCharacter()).Append(colon); + SerializeValue(builder, propertyValue); } } + + if(openedBrace) + { + CloseBrace(builder); + } } } From 93de4f626fa21fc4ef72bf3ee1d9fe11a9eaa1e3 Mon Sep 17 00:00:00 2001 From: Mike Minutillo Date: Wed, 5 Jun 2024 14:19:47 +0800 Subject: [PATCH 2/2] Add test --- .../QueryBuilderTests.cs | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/Octokit.GraphQL.UnitTests/QueryBuilderTests.cs b/Octokit.GraphQL.UnitTests/QueryBuilderTests.cs index 81128f38..9e91fd31 100644 --- a/Octokit.GraphQL.UnitTests/QueryBuilderTests.cs +++ b/Octokit.GraphQL.UnitTests/QueryBuilderTests.cs @@ -394,5 +394,36 @@ ... on RepositoryOwner { } + + [Fact] + public void UpdateProjectV2ItemFieldValue_OnlyIncludesProvidedValue() + { + var expected = @"mutation { + updateProjectV2ItemFieldValue(input: { + projectId: ""ProjectId"",itemId: ""ItemId"",fieldId: ""FieldId"",value: { + singleSelectOptionId: ""OptionId"" + } + }) { + clientMutationId + } +}"; + + var mutation = new Mutation() + .UpdateProjectV2ItemFieldValue( + new UpdateProjectV2ItemFieldValueInput + { + FieldId = new ID("FieldId"), + ProjectId = new ID("ProjectId"), + ItemId = new ID("ItemId"), + Value = new ProjectV2FieldValue + { + SingleSelectOptionId = "OptionId" + } + } + ).Select(x => x.ClientMutationId) + .Compile(); + + Assert.Equal(expected, mutation.ToString(), ignoreLineEndingDifferences: true); + } } }