github.com/geneva/gqlgen@v0.17.7-0.20230801155730-7b9317164836/plugin/resolvergen/resolver_test.go (about) 1 package resolvergen 2 3 import ( 4 "fmt" 5 "os" 6 "syscall" 7 "testing" 8 9 "github.com/geneva/gqlgen/codegen" 10 "github.com/geneva/gqlgen/codegen/config" 11 "github.com/stretchr/testify/require" 12 "golang.org/x/tools/go/packages" 13 ) 14 15 func TestLayoutSingleFile(t *testing.T) { 16 _ = syscall.Unlink("testdata/singlefile/out/resolver.go") 17 18 cfg, err := config.LoadConfig("testdata/singlefile/gqlgen.yml") 19 require.NoError(t, err) 20 p := Plugin{} 21 22 require.NoError(t, cfg.Init()) 23 24 data, err := codegen.BuildData(cfg) 25 if err != nil { 26 panic(err) 27 } 28 29 require.NoError(t, p.GenerateCode(data)) 30 assertNoErrors(t, "github.com/geneva/gqlgen/plugin/resolvergen/testdata/singlefile/out") 31 } 32 33 func TestLayoutFollowSchema(t *testing.T) { 34 testFollowSchemaPersistence(t, "testdata/followschema") 35 36 b, err := os.ReadFile("testdata/followschema/out/schema.resolvers.go") 37 require.NoError(t, err) 38 source := string(b) 39 40 require.Contains(t, source, "(_ *customresolver.Resolver, err error)") 41 require.Contains(t, source, "// Named return values are supported.") 42 require.Contains(t, source, "// CustomerResolverType.Name implementation") 43 require.Contains(t, source, "// AUserHelperFunction implementation") 44 } 45 46 func TestLayoutFollowSchemaWithCustomFilename(t *testing.T) { 47 testFollowSchemaPersistence(t, "testdata/filetemplate") 48 49 b, err := os.ReadFile("testdata/filetemplate/out/schema.custom.go") 50 require.NoError(t, err) 51 source := string(b) 52 53 require.Contains(t, source, "// CustomerResolverType.Resolver implementation") 54 require.Contains(t, source, "// CustomerResolverType.Name implementation") 55 require.Contains(t, source, "// AUserHelperFunction implementation") 56 } 57 58 func TestLayoutInvalidModelPath(t *testing.T) { 59 cfg, err := config.LoadConfig("testdata/invalid_model_path/gqlgen.yml") 60 require.NoError(t, err) 61 62 require.NoError(t, cfg.Init()) 63 64 _, err = codegen.BuildData(cfg) 65 require.Error(t, err) 66 } 67 68 func TestOmitTemplateComment(t *testing.T) { 69 _ = syscall.Unlink("testdata/omit_template_comment/resolver.go") 70 71 cfg, err := config.LoadConfig("testdata/omit_template_comment/gqlgen.yml") 72 require.NoError(t, err) 73 p := Plugin{} 74 75 require.NoError(t, cfg.Init()) 76 77 data, err := codegen.BuildData(cfg) 78 if err != nil { 79 panic(err) 80 } 81 82 require.NoError(t, p.GenerateCode(data)) 83 assertNoErrors(t, "github.com/geneva/gqlgen/plugin/resolvergen/testdata/omit_template_comment/out") 84 } 85 86 func TestCustomResolverTemplate(t *testing.T) { 87 _ = syscall.Unlink("testdata/resolvertemplate/out/resolver.go") 88 cfg, err := config.LoadConfig("testdata/resolvertemplate/gqlgen.yml") 89 require.NoError(t, err) 90 p := Plugin{} 91 92 require.NoError(t, cfg.Init()) 93 94 data, err := codegen.BuildData(cfg) 95 if err != nil { 96 panic(err) 97 } 98 99 require.NoError(t, p.GenerateCode(data)) 100 } 101 102 func testFollowSchemaPersistence(t *testing.T, dir string) { 103 _ = syscall.Unlink(dir + "/out/resolver.go") 104 105 cfg, err := config.LoadConfig(dir + "/gqlgen.yml") 106 require.NoError(t, err) 107 p := Plugin{} 108 109 require.NoError(t, cfg.Init()) 110 111 data, err := codegen.BuildData(cfg) 112 if err != nil { 113 panic(err) 114 } 115 116 require.NoError(t, p.GenerateCode(data)) 117 assertNoErrors(t, "github.com/geneva/gqlgen/plugin/resolvergen/"+dir+"/out") 118 } 119 120 func assertNoErrors(t *testing.T, pkg string) { 121 pkgs, err := packages.Load(&packages.Config{ 122 Mode: packages.NeedName | 123 packages.NeedFiles | 124 packages.NeedCompiledGoFiles | 125 packages.NeedImports | 126 packages.NeedTypes | 127 packages.NeedTypesSizes, 128 }, pkg) 129 if err != nil { 130 panic(err) 131 } 132 133 hasErrors := false 134 for _, pkg := range pkgs { 135 for _, err := range pkg.Errors { 136 hasErrors = true 137 fmt.Println(err.Pos + ":" + err.Msg) 138 } 139 } 140 if hasErrors { 141 t.Fatal("see compilation errors above") 142 } 143 }