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 }
169
View as plain text