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 }