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