From f8f81dad7b0976f2f6dc06f93e00c5d937b22260 Mon Sep 17 00:00:00 2001 From: Ben Kraft Date: Thu, 15 Apr 2021 15:42:05 -0700 Subject: [PATCH] snapshots for errors --- generate/generate_test.go | 136 +++++++++++------- generate/testdata/errors/InvalidQuery.go | 5 + .../testdata/errors/InvalidQuery.go.error | 1 + generate/testdata/errors/InvalidQuery.graphql | 1 + .../errors/InvalidQuery.graphql.error | 1 + .../errors/InvalidQuery.schema.graphql | 3 + generate/testdata/errors/InvalidScalar.go | 5 + .../testdata/errors/InvalidScalar.go.error | 1 + .../testdata/errors/InvalidScalar.graphql | 1 + .../errors/InvalidScalar.graphql.error | 1 + .../errors/InvalidScalar.schema.graphql | 3 + generate/testdata/errors/InvalidSchema.go | 5 + .../testdata/errors/InvalidSchema.go.error | 1 + .../testdata/errors/InvalidSchema.graphql | 1 + .../errors/InvalidSchema.graphql.error | 1 + .../errors/InvalidSchema.schema.graphql | 4 + generate/testdata/errors/NoQuery.go | 1 + generate/testdata/errors/NoQuery.go.error | 1 + generate/testdata/errors/NoQuery.graphql | 0 .../testdata/errors/NoQuery.graphql.error | 1 + .../testdata/errors/NoQuery.schema.graphql | 1 + generate/testdata/errors/UnknownScalar.go | 5 + .../testdata/errors/UnknownScalar.go.error | 1 + .../testdata/errors/UnknownScalar.graphql | 1 + .../errors/UnknownScalar.graphql.error | 1 + .../errors/UnknownScalar.schema.graphql | 3 + 26 files changed, 137 insertions(+), 48 deletions(-) create mode 100644 generate/testdata/errors/InvalidQuery.go create mode 100644 generate/testdata/errors/InvalidQuery.go.error create mode 100644 generate/testdata/errors/InvalidQuery.graphql create mode 100644 generate/testdata/errors/InvalidQuery.graphql.error create mode 100644 generate/testdata/errors/InvalidQuery.schema.graphql create mode 100644 generate/testdata/errors/InvalidScalar.go create mode 100644 generate/testdata/errors/InvalidScalar.go.error create mode 100644 generate/testdata/errors/InvalidScalar.graphql create mode 100644 generate/testdata/errors/InvalidScalar.graphql.error create mode 100644 generate/testdata/errors/InvalidScalar.schema.graphql create mode 100644 generate/testdata/errors/InvalidSchema.go create mode 100644 generate/testdata/errors/InvalidSchema.go.error create mode 100644 generate/testdata/errors/InvalidSchema.graphql create mode 100644 generate/testdata/errors/InvalidSchema.graphql.error create mode 100644 generate/testdata/errors/InvalidSchema.schema.graphql create mode 100644 generate/testdata/errors/NoQuery.go create mode 100644 generate/testdata/errors/NoQuery.go.error create mode 100644 generate/testdata/errors/NoQuery.graphql create mode 100644 generate/testdata/errors/NoQuery.graphql.error create mode 100644 generate/testdata/errors/NoQuery.schema.graphql create mode 100644 generate/testdata/errors/UnknownScalar.go create mode 100644 generate/testdata/errors/UnknownScalar.go.error create mode 100644 generate/testdata/errors/UnknownScalar.graphql create mode 100644 generate/testdata/errors/UnknownScalar.graphql.error create mode 100644 generate/testdata/errors/UnknownScalar.schema.graphql diff --git a/generate/generate_test.go b/generate/generate_test.go index 6476641..08a4eb7 100644 --- a/generate/generate_test.go +++ b/generate/generate_test.go @@ -11,19 +11,10 @@ import ( "testing" ) -const dataDir = "testdata/queries" - -func readFile(t *testing.T, filename string, allowNotExist bool) string { - t.Helper() - data, err := ioutil.ReadFile(filepath.Join(dataDir, filename)) - if err != nil { - if allowNotExist && errors.Is(err, os.ErrNotExist) { - return "" - } - t.Fatal(err) - } - return string(data) -} +const ( + dataDir = "testdata/queries" + errorsDir = "testdata/errors" +) func gofmt(filename, src string) (string, error) { src = strings.TrimSpace(src) @@ -34,6 +25,43 @@ func gofmt(filename, src string) (string, error) { return string(formatted), nil } +func checkSnapshot(t *testing.T, filename, content string) { + t.Helper() + update := (os.Getenv("UPDATE_SNAPSHOTS") == "1") + + expectedBytes, err := ioutil.ReadFile(filename) + if err != nil && !(update && errors.Is(err, os.ErrNotExist)) { + t.Fatal(err) + } + expectedContent := string(expectedBytes) + + if strings.HasSuffix(filename, ".go") { + fmted, err := gofmt(filename, expectedContent) + if err != nil { + // Ignore gofmt errors if we are updating + if !update { + t.Fatal(err) + } + } else { + expectedContent = fmted + } + } + + if content != expectedContent { + t.Errorf("mismatch in %v", filename) + if testing.Verbose() { + t.Errorf("got:\n%v\nwant:\n%v\n", content, expectedContent) + } + if update { + t.Log("Updating testdata dir to match") + err = ioutil.WriteFile(filename, []byte(content), 0o644) + if err != nil { + t.Errorf("Unable to update testdata dir: %v", err) + } + } + } +} + // TestGenerate is a snapshot-based test of code-generation. // // This file just has the test runner; the actual data is all in @@ -47,7 +75,6 @@ func gofmt(filename, src string) (string, error) { // update the snapshots. Make sure to check that the output is sensible; the // snapshots don't even get compiled! func TestGenerate(t *testing.T) { - update := (os.Getenv("UPDATE_SNAPSHOTS") == "1") // we can test parts of features even if they're not done yet! allowBrokenFeatures = true @@ -57,17 +84,17 @@ func TestGenerate(t *testing.T) { } for _, file := range files { - graphqlFilename := file.Name() - if graphqlFilename == "schema.graphql" || !strings.HasSuffix(graphqlFilename, ".graphql") { + sourceFilename := file.Name() + if sourceFilename == "schema.graphql" || !strings.HasSuffix(sourceFilename, ".graphql") { continue } - goFilename := graphqlFilename + ".go" - queriesFilename := graphqlFilename + ".json" + goFilename := sourceFilename + ".go" + queriesFilename := sourceFilename + ".json" - t.Run(graphqlFilename, func(t *testing.T) { + t.Run(sourceFilename, func(t *testing.T) { generated, err := Generate(&Config{ Schema: filepath.Join(dataDir, "schema.graphql"), - Operations: []string{filepath.Join(dataDir, graphqlFilename)}, + Operations: []string{filepath.Join(dataDir, sourceFilename)}, Package: "test", Generated: goFilename, ExportOperations: queriesFilename, @@ -82,36 +109,49 @@ func TestGenerate(t *testing.T) { } for filename, content := range generated { - expectedContent := readFile(t, filename, update) - if strings.HasSuffix(filename, ".go") { - fmted, err := gofmt(filename, expectedContent) - if err != nil { - // Ignore gofmt errors if we are updating - if !update { - t.Fatal(err) - } - } else { - expectedContent = fmted - } - } - - if string(content) != expectedContent { - t.Errorf("mismatch in %v", filename) - if testing.Verbose() { - t.Errorf("got:\n%v\nwant:\n%v\n", - string(content), expectedContent) - } - if update { - t.Log("Updating testdata dir to match") - err = ioutil.WriteFile(filepath.Join(dataDir, filename), content, 0o644) - if err != nil { - t.Errorf("Unable to update testdata dir: %v", err) - } - } - } - + checkSnapshot(t, filepath.Join(dataDir, filename), string(content)) // TODO(benkraft): Also check that the code at least builds! } }) } } + +func TestGenerateErrors(t *testing.T) { + // we can test parts of features even if they're not done yet! + allowBrokenFeatures = true + + files, err := ioutil.ReadDir(errorsDir) + if err != nil { + t.Fatal(err) + } + + for _, file := range files { + sourceFilename := file.Name() + if !strings.HasSuffix(sourceFilename, ".graphql") && + !strings.HasSuffix(sourceFilename, ".go") || + strings.HasSuffix(sourceFilename, ".schema.graphql") { + continue + } + + schemaFilename := strings.TrimSuffix(sourceFilename, filepath.Ext(sourceFilename)) + ".schema.graphql" + errorsFilename := sourceFilename + ".error" + + t.Run(sourceFilename, func(t *testing.T) { + _, err := Generate(&Config{ + Schema: filepath.Join(errorsDir, schemaFilename), + Operations: []string{filepath.Join(errorsDir, sourceFilename)}, + Package: "test", + Generated: os.DevNull, + Scalars: map[string]string{ + "ValidScalar": "string", + "InvalidScalar": "bogus", + }, + }) + if err == nil { + t.Fatal("expected an error") + } + + checkSnapshot(t, filepath.Join(errorsDir, errorsFilename), err.Error()) + }) + } +} diff --git a/generate/testdata/errors/InvalidQuery.go b/generate/testdata/errors/InvalidQuery.go new file mode 100644 index 0000000..b4d9076 --- /dev/null +++ b/generate/testdata/errors/InvalidQuery.go @@ -0,0 +1,5 @@ +package errors + +const _ = `# @genqlient + query MyQuery { g } +` diff --git a/generate/testdata/errors/InvalidQuery.go.error b/generate/testdata/errors/InvalidQuery.go.error new file mode 100644 index 0000000..19694bb --- /dev/null +++ b/generate/testdata/errors/InvalidQuery.go.error @@ -0,0 +1 @@ +query-spec does not match schema: testdata/errors/InvalidQuery.go:2: Cannot query field "g" on type "Query". Did you mean "f"? diff --git a/generate/testdata/errors/InvalidQuery.graphql b/generate/testdata/errors/InvalidQuery.graphql new file mode 100644 index 0000000..65c0951 --- /dev/null +++ b/generate/testdata/errors/InvalidQuery.graphql @@ -0,0 +1 @@ +query MyQuery { g } diff --git a/generate/testdata/errors/InvalidQuery.graphql.error b/generate/testdata/errors/InvalidQuery.graphql.error new file mode 100644 index 0000000..10a329c --- /dev/null +++ b/generate/testdata/errors/InvalidQuery.graphql.error @@ -0,0 +1 @@ +query-spec does not match schema: testdata/errors/InvalidQuery.graphql:1: Cannot query field "g" on type "Query". Did you mean "f"? diff --git a/generate/testdata/errors/InvalidQuery.schema.graphql b/generate/testdata/errors/InvalidQuery.schema.graphql new file mode 100644 index 0000000..314f707 --- /dev/null +++ b/generate/testdata/errors/InvalidQuery.schema.graphql @@ -0,0 +1,3 @@ +type Query { + f: String +} diff --git a/generate/testdata/errors/InvalidScalar.go b/generate/testdata/errors/InvalidScalar.go new file mode 100644 index 0000000..fcc5493 --- /dev/null +++ b/generate/testdata/errors/InvalidScalar.go @@ -0,0 +1,5 @@ +package errors + +const _ = `# @genqlient + query InvalidScalar { f } +` diff --git a/generate/testdata/errors/InvalidScalar.go.error b/generate/testdata/errors/InvalidScalar.go.error new file mode 100644 index 0000000..5ab3aa0 --- /dev/null +++ b/generate/testdata/errors/InvalidScalar.go.error @@ -0,0 +1 @@ +unknown name "bogus"; expected a builtin or path/to/package.Name \ No newline at end of file diff --git a/generate/testdata/errors/InvalidScalar.graphql b/generate/testdata/errors/InvalidScalar.graphql new file mode 100644 index 0000000..38536ed --- /dev/null +++ b/generate/testdata/errors/InvalidScalar.graphql @@ -0,0 +1 @@ +query InvalidScalar { f } diff --git a/generate/testdata/errors/InvalidScalar.graphql.error b/generate/testdata/errors/InvalidScalar.graphql.error new file mode 100644 index 0000000..5ab3aa0 --- /dev/null +++ b/generate/testdata/errors/InvalidScalar.graphql.error @@ -0,0 +1 @@ +unknown name "bogus"; expected a builtin or path/to/package.Name \ No newline at end of file diff --git a/generate/testdata/errors/InvalidScalar.schema.graphql b/generate/testdata/errors/InvalidScalar.schema.graphql new file mode 100644 index 0000000..61db0fe --- /dev/null +++ b/generate/testdata/errors/InvalidScalar.schema.graphql @@ -0,0 +1,3 @@ +scalar InvalidScalar + +type Query { f: InvalidScalar } diff --git a/generate/testdata/errors/InvalidSchema.go b/generate/testdata/errors/InvalidSchema.go new file mode 100644 index 0000000..b082005 --- /dev/null +++ b/generate/testdata/errors/InvalidSchema.go @@ -0,0 +1,5 @@ +package errors + +const _ = `# @genqlient + query InvalidSchema { f } +` diff --git a/generate/testdata/errors/InvalidSchema.go.error b/generate/testdata/errors/InvalidSchema.go.error new file mode 100644 index 0000000..3d7c49d --- /dev/null +++ b/generate/testdata/errors/InvalidSchema.go.error @@ -0,0 +1 @@ +invalid schema file testdata/errors/InvalidSchema.schema.graphql: testdata/errors/InvalidSchema.schema.graphql:4: Expected :, found } \ No newline at end of file diff --git a/generate/testdata/errors/InvalidSchema.graphql b/generate/testdata/errors/InvalidSchema.graphql new file mode 100644 index 0000000..a1b217b --- /dev/null +++ b/generate/testdata/errors/InvalidSchema.graphql @@ -0,0 +1 @@ +query InvalidSchema { f } diff --git a/generate/testdata/errors/InvalidSchema.graphql.error b/generate/testdata/errors/InvalidSchema.graphql.error new file mode 100644 index 0000000..3d7c49d --- /dev/null +++ b/generate/testdata/errors/InvalidSchema.graphql.error @@ -0,0 +1 @@ +invalid schema file testdata/errors/InvalidSchema.schema.graphql: testdata/errors/InvalidSchema.schema.graphql:4: Expected :, found } \ No newline at end of file diff --git a/generate/testdata/errors/InvalidSchema.schema.graphql b/generate/testdata/errors/InvalidSchema.schema.graphql new file mode 100644 index 0000000..6c94e4f --- /dev/null +++ b/generate/testdata/errors/InvalidSchema.schema.graphql @@ -0,0 +1,4 @@ +type Query { + f: String! + bogus +} diff --git a/generate/testdata/errors/NoQuery.go b/generate/testdata/errors/NoQuery.go new file mode 100644 index 0000000..04b3218 --- /dev/null +++ b/generate/testdata/errors/NoQuery.go @@ -0,0 +1 @@ +package errors diff --git a/generate/testdata/errors/NoQuery.go.error b/generate/testdata/errors/NoQuery.go.error new file mode 100644 index 0000000..21f742d --- /dev/null +++ b/generate/testdata/errors/NoQuery.go.error @@ -0,0 +1 @@ +no queries found in [testdata/errors/NoQuery.go] \ No newline at end of file diff --git a/generate/testdata/errors/NoQuery.graphql b/generate/testdata/errors/NoQuery.graphql new file mode 100644 index 0000000..e69de29 diff --git a/generate/testdata/errors/NoQuery.graphql.error b/generate/testdata/errors/NoQuery.graphql.error new file mode 100644 index 0000000..e8b70ee --- /dev/null +++ b/generate/testdata/errors/NoQuery.graphql.error @@ -0,0 +1 @@ +no queries found in [testdata/errors/NoQuery.graphql] \ No newline at end of file diff --git a/generate/testdata/errors/NoQuery.schema.graphql b/generate/testdata/errors/NoQuery.schema.graphql new file mode 100644 index 0000000..75cab93 --- /dev/null +++ b/generate/testdata/errors/NoQuery.schema.graphql @@ -0,0 +1 @@ +type Query { f: String } diff --git a/generate/testdata/errors/UnknownScalar.go b/generate/testdata/errors/UnknownScalar.go new file mode 100644 index 0000000..dfc6dff --- /dev/null +++ b/generate/testdata/errors/UnknownScalar.go @@ -0,0 +1,5 @@ +package errors + +const _ = `# @genqlient + query UnknownScalar { f } +` diff --git a/generate/testdata/errors/UnknownScalar.go.error b/generate/testdata/errors/UnknownScalar.go.error new file mode 100644 index 0000000..21c5c29 --- /dev/null +++ b/generate/testdata/errors/UnknownScalar.go.error @@ -0,0 +1 @@ +unknown scalar UnknownScalar: please add it to genqlient.yaml \ No newline at end of file diff --git a/generate/testdata/errors/UnknownScalar.graphql b/generate/testdata/errors/UnknownScalar.graphql new file mode 100644 index 0000000..1095536 --- /dev/null +++ b/generate/testdata/errors/UnknownScalar.graphql @@ -0,0 +1 @@ +query UnknownScalar { f } diff --git a/generate/testdata/errors/UnknownScalar.graphql.error b/generate/testdata/errors/UnknownScalar.graphql.error new file mode 100644 index 0000000..21c5c29 --- /dev/null +++ b/generate/testdata/errors/UnknownScalar.graphql.error @@ -0,0 +1 @@ +unknown scalar UnknownScalar: please add it to genqlient.yaml \ No newline at end of file diff --git a/generate/testdata/errors/UnknownScalar.schema.graphql b/generate/testdata/errors/UnknownScalar.schema.graphql new file mode 100644 index 0000000..64cd77d --- /dev/null +++ b/generate/testdata/errors/UnknownScalar.schema.graphql @@ -0,0 +1,3 @@ +scalar UnknownScalar + +type Query { f: UnknownScalar }