graphql-platform icon indicating copy to clipboard operation
graphql-platform copied to clipboard

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

Open cmeeren opened this issue 1 year ago • 4 comments

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>()

cmeeren avatar Apr 05 '24 11:04 cmeeren

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.

SvdSinner avatar Apr 23 '24 15:04 SvdSinner

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).

cmeeren avatar Apr 23 '24 16:04 cmeeren

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.

SvdSinner avatar Apr 24 '24 15:04 SvdSinner

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:

  • Your bug is about AddMutationConventions throwing. I do not experience that; it is not a symptom of my bug.
  • My bug is specifically about F# and does not repro on C#.

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.

cmeeren avatar Apr 24 '24 18:04 cmeeren