github.com/maeglindeveloper/gqlgen@v0.13.1-0.20210413081235-57808b12a0a0/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/99designs/gqlgen/codegen/config" 11 "github.com/99designs/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 } 22 require.NoError(t, p.MutateConfig(cfg)) 23 24 require.True(t, cfg.Models.UserDefined("MissingTypeNotNull")) 25 require.True(t, cfg.Models.UserDefined("MissingTypeNullable")) 26 require.True(t, cfg.Models.UserDefined("MissingEnum")) 27 require.True(t, cfg.Models.UserDefined("MissingUnion")) 28 require.True(t, cfg.Models.UserDefined("MissingInterface")) 29 require.True(t, cfg.Models.UserDefined("TypeWithDescription")) 30 require.True(t, cfg.Models.UserDefined("EnumWithDescription")) 31 require.True(t, cfg.Models.UserDefined("InterfaceWithDescription")) 32 require.True(t, cfg.Models.UserDefined("UnionWithDescription")) 33 34 t.Run("no pointer pointers", func(t *testing.T) { 35 generated, err := ioutil.ReadFile("./out/generated.go") 36 require.NoError(t, err) 37 require.NotContains(t, string(generated), "**") 38 }) 39 40 t.Run("description is generated", func(t *testing.T) { 41 node, err := parser.ParseFile(token.NewFileSet(), "./out/generated.go", nil, parser.ParseComments) 42 require.NoError(t, err) 43 for _, commentGroup := range node.Comments { 44 text := commentGroup.Text() 45 words := strings.Split(text, " ") 46 require.True(t, len(words) > 1, "expected description %q to have more than one word", text) 47 } 48 }) 49 50 t.Run("tags are applied", func(t *testing.T) { 51 file, err := ioutil.ReadFile("./out/generated.go") 52 require.NoError(t, err) 53 54 fileText := string(file) 55 56 expectedTags := []string{ 57 `json:"missing2" database:"MissingTypeNotNullmissing2"`, 58 `json:"name" database:"MissingInputname"`, 59 `json:"missing2" database:"MissingTypeNullablemissing2"`, 60 `json:"name" database:"TypeWithDescriptionname"`, 61 } 62 63 for _, tag := range expectedTags { 64 require.True(t, strings.Contains(fileText, tag)) 65 } 66 }) 67 68 t.Run("concrete types implement interface", func(t *testing.T) { 69 var _ out.FooBarer = out.FooBarr{} 70 }) 71 } 72 73 func mutateHook(b *ModelBuild) *ModelBuild { 74 for _, model := range b.Models { 75 for _, field := range model.Fields { 76 field.Tag += ` database:"` + model.Name + field.Name + `"` 77 } 78 } 79 80 return b 81 }