ChilliCream / graphql-platform

Welcome to the home of the Hot Chocolate GraphQL server for .NET, the Strawberry Shake GraphQL client for .NET and Banana Cake Pop the awesome Monaco based GraphQL IDE.
https://chillicream.com
MIT License
5.24k stars 744 forks source link

Using DefaultValueAttribute on enum input type field gives Int in schema on F# #7040

Open cmeeren opened 7 months ago

cmeeren commented 7 months ago

Product

Hot Chocolate

Version

14.0.0-p.85

Link to minimal reproduction

See zip below

Steps to reproduce

Repro solution: HotChocolateRepro.zip

Repro code for reference:

open Microsoft.AspNetCore.Builder
open Microsoft.Extensions.DependencyInjection
open Microsoft.Extensions.Hosting

type MyEnum =
    | Value1 = 0
    | Value2 = 1

type MyType() =

    [<HotChocolate.Types.DefaultValue(MyEnum.Value1)>]
    member val Enum: MyEnum = MyEnum.Value1 with get, set

type Query() =

    member _.Test(arg: MyType) = ""

module Program =

    [<EntryPoint>]
    let main args =
        let builder = WebApplication.CreateBuilder(args)
        builder.Services.AddGraphQLServer().AddQueryType<Query>() |> ignore
        let app = builder.Build()
        app.MapGraphQL() |> ignore
        app.Run()
        0

What is expected?

type Query {
  test(arg: MyTypeInput): String
}

input MyTypeInput {
  enum: MyEnum! = VALUE1
}

enum MyEnum {
  VALUE1
  VALUE2
}

What is actually happening?

type Query {
  test(arg: MyTypeInput): String
}

input MyTypeInput {
  enum: Int! = 0
}

Relevant log output

No response

Additional context

Strangely enough, the following C# code, which as far as I know is equivalent to the F# code above, does not exhibit the problem, and produces the expected schema:

var builder = WebApplication.CreateBuilder(args);

builder
    .Services
    .AddGraphQLServer()
    .AddQueryType<Query>();

var app = builder.Build();

app.MapGraphQL();
app.Run();

public enum MyEnum
{
    Value1 = 0,
    Value2 = 1
}

public class MyType
{
    [HotChocolate.Types.DefaultValue(MyEnum.Value1)] public MyEnum Enum { get; set; }
}

public class Query
{
    public string Test(MyType arg) => "";
}

I tried also adding the GraphQLType(typeof<MyEnum>) attribute to the field. This did not help.

The following workaround seems to work (requires removing the [DefaultValue] attribute from the property to avoid other bugs):

type MyTypeDescriptor() =
    inherit InputObjectType<MyType>()

    override this.Configure(descriptor: IInputObjectTypeDescriptor<MyType>) : unit =
        descriptor.Field("enum").Type(typeof<MyEnum>).DefaultValue(MyEnum.Value1)
        |> ignore

// In the builder:
.AddType<MyTypeDescriptor>()
SvdSinner commented 6 months ago

Why was my comment deleted? I spent more than a day of research on that comment and I come back to check and it is deleted without comment? Please explain.

cmeeren commented 6 months ago

I did not delete it, but since it was off-topic, I reported it as such after several days of inactivity had passed. My intention was for the owners of this repo to hide it as off-topic in order to clean up this thread, but apparently it was deleted (along with my reply suggesting that you open a separate issue).

SvdSinner commented 6 months ago

I did open another issue, but initially, I was told on the slack channel to post into this thread. The two are most likely related as they post deal specifically with default values of enums. Not sure why you assumed it was off topic.

cmeeren commented 6 months ago

There may be many issues related to default enum values. Yours clearly seems to be a completely separate issue for the following reasons, as I described in my (now deleted) original comment:

These two points clearly point to these two bugs not overlapping in any meaningful way. That is why I suggested you open a different issue, and why after some time, I reported the comment as off-topic.