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  }