github.com/99designs/gqlgen@v0.17.45/codegen/testserver/singlefile/maps_test.go (about) 1 package singlefile 2 3 import ( 4 "context" 5 "testing" 6 7 "github.com/stretchr/testify/require" 8 9 "github.com/99designs/gqlgen/client" 10 "github.com/99designs/gqlgen/graphql/handler" 11 ) 12 13 func TestMaps(t *testing.T) { 14 resolver := &Stub{} 15 resolver.QueryResolver.MapStringInterface = func(ctx context.Context, in map[string]interface{}) (i map[string]interface{}, e error) { 16 validateMapItemsType(t, in) 17 return in, nil 18 } 19 resolver.QueryResolver.MapNestedStringInterface = func(ctx context.Context, in *NestedMapInput) (i map[string]interface{}, e error) { 20 if in == nil { 21 return nil, nil 22 } 23 validateMapItemsType(t, in.Map) 24 return in.Map, nil 25 } 26 27 c := client.New(handler.NewDefaultServer( 28 NewExecutableSchema(Config{Resolvers: resolver}), 29 )) 30 t.Run("unset", func(t *testing.T) { 31 var resp struct { 32 MapStringInterface map[string]interface{} 33 } 34 err := c.Post(`query { mapStringInterface { a, b, c, nested { value } } }`, &resp) 35 require.NoError(t, err) 36 require.Nil(t, resp.MapStringInterface) 37 }) 38 39 t.Run("nil", func(t *testing.T) { 40 var resp struct { 41 MapStringInterface map[string]interface{} 42 } 43 err := c.Post(`query { mapStringInterface(in: null) { a, b, c, nested { value } } }`, &resp) 44 require.NoError(t, err) 45 require.Nil(t, resp.MapStringInterface) 46 }) 47 48 t.Run("values", func(t *testing.T) { 49 var resp struct { 50 MapStringInterface map[string]interface{} 51 } 52 err := c.Post(`query($value: CustomScalar!) { mapStringInterface(in: { a: "a", b: null, c: 42, nested: { value: $value } }) { a, b, c, nested { value } } }`, &resp, client.Var("value", "17")) 53 require.NoError(t, err) 54 require.Equal(t, "a", resp.MapStringInterface["a"]) 55 require.Nil(t, resp.MapStringInterface["b"]) 56 require.Equal(t, "42", resp.MapStringInterface["c"]) 57 require.NotNil(t, resp.MapStringInterface["nested"]) 58 require.IsType(t, map[string]interface{}{}, resp.MapStringInterface["nested"]) 59 require.Equal(t, "17", (resp.MapStringInterface["nested"].(map[string]interface{}))["value"]) 60 }) 61 62 t.Run("nested", func(t *testing.T) { 63 var resp struct { 64 MapNestedStringInterface map[string]interface{} 65 } 66 err := c.Post(`query { mapNestedStringInterface(in: { map: { a: "a", c: "42", nested: { value: 31 } } }) { a, b, c, nested { value } } }`, &resp) 67 require.NoError(t, err) 68 require.Equal(t, "a", resp.MapNestedStringInterface["a"]) 69 require.Nil(t, resp.MapNestedStringInterface["b"]) 70 require.Equal(t, "42", resp.MapNestedStringInterface["c"]) 71 require.NotNil(t, resp.MapNestedStringInterface["nested"]) 72 require.IsType(t, map[string]interface{}{}, resp.MapNestedStringInterface["nested"]) 73 require.Equal(t, "31", (resp.MapNestedStringInterface["nested"].(map[string]interface{}))["value"]) 74 }) 75 76 t.Run("nested nil", func(t *testing.T) { 77 var resp struct { 78 MapNestedStringInterface map[string]interface{} 79 } 80 err := c.Post(`query { mapNestedStringInterface(in: { map: null }) { a, b, c, nested { value } } }`, &resp) 81 require.NoError(t, err) 82 require.Nil(t, resp.MapNestedStringInterface) 83 }) 84 } 85 86 func validateMapItemsType(t *testing.T, in map[string]interface{}) { 87 for k, v := range in { 88 switch k { 89 case "a": 90 require.IsType(t, "", v) 91 case "b": 92 require.IsType(t, new(int), v) 93 case "c": 94 require.IsType(t, new(CustomScalar), v) 95 case "nested": 96 require.IsType(t, new(MapNested), v) 97 default: 98 require.Failf(t, "unexpected key in map", "key %q was not expected in map", k) 99 } 100 } 101 }