...

Source file src/github.com/99designs/gqlgen/plugin/resolvergen/resolver_test.go

Documentation: github.com/99designs/gqlgen/plugin/resolvergen

     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