github.com/operandinc/gqlgen@v0.16.1/plugin/modelgen/models_test.go (about)

     1  package modelgen
     2  
     3  import (
     4  	"go/parser"
     5  	"go/token"
     6  	"io/ioutil"
     7  	"strings"
     8  	"testing"
     9  
    10  	"github.com/operandinc/gqlgen/codegen/config"
    11  	"github.com/operandinc/gqlgen/plugin/modelgen/out"
    12  	"github.com/stretchr/testify/require"
    13  )
    14  
    15  func TestModelGeneration(t *testing.T) {
    16  	cfg, err := config.LoadConfig("testdata/gqlgen.yml")
    17  	require.NoError(t, err)
    18  	require.NoError(t, cfg.Init())
    19  	p := Plugin{
    20  		MutateHook: mutateHook,
    21  		FieldHook:  defaultFieldMutateHook,
    22  	}
    23  	require.NoError(t, p.MutateConfig(cfg))
    24  
    25  	require.True(t, cfg.Models.UserDefined("MissingTypeNotNull"))
    26  	require.True(t, cfg.Models.UserDefined("MissingTypeNullable"))
    27  	require.True(t, cfg.Models.UserDefined("MissingEnum"))
    28  	require.True(t, cfg.Models.UserDefined("MissingUnion"))
    29  	require.True(t, cfg.Models.UserDefined("MissingInterface"))
    30  	require.True(t, cfg.Models.UserDefined("TypeWithDescription"))
    31  	require.True(t, cfg.Models.UserDefined("EnumWithDescription"))
    32  	require.True(t, cfg.Models.UserDefined("InterfaceWithDescription"))
    33  	require.True(t, cfg.Models.UserDefined("UnionWithDescription"))
    34  
    35  	t.Run("no pointer pointers", func(t *testing.T) {
    36  		generated, err := ioutil.ReadFile("./out/generated.go")
    37  		require.NoError(t, err)
    38  		require.NotContains(t, string(generated), "**")
    39  	})
    40  
    41  	t.Run("description is generated", func(t *testing.T) {
    42  		node, err := parser.ParseFile(token.NewFileSet(), "./out/generated.go", nil, parser.ParseComments)
    43  		require.NoError(t, err)
    44  		for _, commentGroup := range node.Comments {
    45  			text := commentGroup.Text()
    46  			words := strings.Split(text, " ")
    47  			require.True(t, len(words) > 1, "expected description %q to have more than one word", text)
    48  		}
    49  	})
    50  
    51  	t.Run("tags are applied", func(t *testing.T) {
    52  		file, err := ioutil.ReadFile("./out/generated.go")
    53  		require.NoError(t, err)
    54  
    55  		fileText := string(file)
    56  
    57  		expectedTags := []string{
    58  			`json:"missing2" database:"MissingTypeNotNullmissing2"`,
    59  			`json:"name" database:"MissingInputname"`,
    60  			`json:"missing2" database:"MissingTypeNullablemissing2"`,
    61  			`json:"name" database:"TypeWithDescriptionname"`,
    62  		}
    63  
    64  		for _, tag := range expectedTags {
    65  			require.True(t, strings.Contains(fileText, tag))
    66  		}
    67  	})
    68  
    69  	t.Run("field hooks are applied", func(t *testing.T) {
    70  		file, err := ioutil.ReadFile("./out/generated.go")
    71  		require.NoError(t, err)
    72  
    73  		fileText := string(file)
    74  
    75  		expectedTags := []string{
    76  			`json:"name" anotherTag:"tag"`,
    77  			`json:"enum" yetAnotherTag:"12"`,
    78  			`json:"noVal" yaml:"noVal"`,
    79  			`json:"repeated" someTag:"value" repeated:"true"`,
    80  		}
    81  
    82  		for _, tag := range expectedTags {
    83  			require.True(t, strings.Contains(fileText, tag))
    84  		}
    85  	})
    86  
    87  	t.Run("concrete types implement interface", func(t *testing.T) {
    88  		var _ out.FooBarer = out.FooBarr{}
    89  	})
    90  }
    91  
    92  func mutateHook(b *ModelBuild) *ModelBuild {
    93  	for _, model := range b.Models {
    94  		for _, field := range model.Fields {
    95  			field.Tag += ` database:"` + model.Name + field.Name + `"`
    96  		}
    97  	}
    98  
    99  	return b
   100  }