Switch to cupaloy for snapshots
Slightly uglier filenames, but less code and free diffing! Approved in ADR-466 for Khan use. Fixes #23.
This commit is contained in:
@@ -1,13 +1,13 @@
|
||||
package generate
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"go/format"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"github.com/Khan/genqlient/internal/testutil"
|
||||
)
|
||||
|
||||
const (
|
||||
@@ -15,52 +15,6 @@ const (
|
||||
errorsDir = "testdata/errors"
|
||||
)
|
||||
|
||||
func gofmt(filename, src string) (string, error) {
|
||||
src = strings.TrimSpace(src)
|
||||
formatted, err := format.Source([]byte(src))
|
||||
if err != nil {
|
||||
return src, errorf(nil, "go parse error in %v: %v", filename, err)
|
||||
}
|
||||
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
|
||||
@@ -109,7 +63,9 @@ func TestGenerate(t *testing.T) {
|
||||
}
|
||||
|
||||
for filename, content := range generated {
|
||||
checkSnapshot(t, filepath.Join(dataDir, filename), string(content))
|
||||
t.Run(filename, func(t *testing.T) {
|
||||
testutil.Cupaloy.SnapshotT(t, string(content))
|
||||
})
|
||||
// TODO(benkraft): Also check that the code at least builds!
|
||||
}
|
||||
})
|
||||
@@ -133,8 +89,8 @@ func TestGenerateErrors(t *testing.T) {
|
||||
continue
|
||||
}
|
||||
|
||||
schemaFilename := strings.TrimSuffix(sourceFilename, filepath.Ext(sourceFilename)) + ".schema.graphql"
|
||||
errorsFilename := sourceFilename + ".error"
|
||||
baseFilename := strings.TrimSuffix(sourceFilename, filepath.Ext(sourceFilename))
|
||||
schemaFilename := baseFilename + ".schema.graphql"
|
||||
|
||||
t.Run(sourceFilename, func(t *testing.T) {
|
||||
_, err := Generate(&Config{
|
||||
@@ -151,7 +107,7 @@ func TestGenerateErrors(t *testing.T) {
|
||||
t.Fatal("expected an error")
|
||||
}
|
||||
|
||||
checkSnapshot(t, filepath.Join(errorsDir, errorsFilename), err.Error())
|
||||
testutil.Cupaloy.SnapshotT(t, err.Error())
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -40,6 +40,7 @@ func getTestQueries(t *testing.T, ext string) *ast.QueryDocument {
|
||||
// produces equivalent results. We do not test the results it produces (that's
|
||||
// covered by TestGenerate), just that they are equivalent in different
|
||||
// languages (since TestGenerate only uses .graphql as input).
|
||||
// TODO: redo this as more standard snapshot tests?
|
||||
func TestParse(t *testing.T) {
|
||||
extensions := []string{"go"}
|
||||
|
||||
|
||||
-1
@@ -1 +0,0 @@
|
||||
no queries found, looked in: testdata/errors/NoQuery.go
|
||||
@@ -1 +0,0 @@
|
||||
no queries found, looked in: testdata/errors/NoQuery.graphql
|
||||
+1
@@ -37,3 +37,4 @@ query convertTimezone ($dt: DateTime!, $tz: String) {
|
||||
)
|
||||
return &retval, err
|
||||
}
|
||||
|
||||
+1
-1
@@ -6,4 +6,4 @@
|
||||
"sourceLocation": "testdata/queries/DateTime.graphql"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
+1
@@ -30,3 +30,4 @@ query EmptyInterface {
|
||||
)
|
||||
return &retval, err
|
||||
}
|
||||
|
||||
+1
-1
@@ -6,4 +6,4 @@
|
||||
"sourceLocation": "testdata/queries/EmptyInterface.graphql"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
+1
@@ -62,3 +62,4 @@ query InputEnumQuery ($role: Role!) {
|
||||
)
|
||||
return &retval, err
|
||||
}
|
||||
|
||||
+1
-1
@@ -6,4 +6,4 @@
|
||||
"sourceLocation": "testdata/queries/InputEnum.graphql"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
+1
@@ -79,3 +79,4 @@ query InputObjectQuery ($query: UserQueryInput) {
|
||||
)
|
||||
return &retval, err
|
||||
}
|
||||
|
||||
+1
-1
@@ -6,4 +6,4 @@
|
||||
"sourceLocation": "testdata/queries/InputObject.graphql"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
+1
@@ -401,3 +401,4 @@ query InterfaceNesting {
|
||||
)
|
||||
return &retval, err
|
||||
}
|
||||
|
||||
+1
-1
@@ -6,4 +6,4 @@
|
||||
"sourceLocation": "testdata/queries/InterfaceNesting.graphql"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
+1
@@ -131,3 +131,4 @@ query InterfaceNoFragmentsQuery {
|
||||
)
|
||||
return &retval, err
|
||||
}
|
||||
|
||||
+1
-1
@@ -6,4 +6,4 @@
|
||||
"sourceLocation": "testdata/queries/InterfaceNoFragments.graphql"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
+1
@@ -51,3 +51,4 @@ query ListInputQuery ($names: [String]) {
|
||||
)
|
||||
return &retval, err
|
||||
}
|
||||
|
||||
+1
-1
@@ -6,4 +6,4 @@
|
||||
"sourceLocation": "testdata/queries/ListInput.graphql"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
+1
@@ -28,3 +28,4 @@ query ListOfListsOfLists {
|
||||
)
|
||||
return &retval, err
|
||||
}
|
||||
|
||||
+1
-1
@@ -6,4 +6,4 @@
|
||||
"sourceLocation": "testdata/queries/ListOfListsOfLists.graphql"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
+1
@@ -123,3 +123,4 @@ query OmitEmptyQuery ($query: UserQueryInput, $queries: [UserQueryInput], $dt: D
|
||||
)
|
||||
return &retval, err
|
||||
}
|
||||
|
||||
+1
-1
@@ -6,4 +6,4 @@
|
||||
"sourceLocation": "testdata/queries/Omitempty.graphql"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
+1
@@ -114,3 +114,4 @@ query PointersQuery ($query: UserQueryInput, $dt: DateTime, $tz: String) {
|
||||
)
|
||||
return &retval, err
|
||||
}
|
||||
|
||||
+1
-1
@@ -6,4 +6,4 @@
|
||||
"sourceLocation": "testdata/queries/Pointers.graphql"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
+1
@@ -114,3 +114,4 @@ query PointersQuery ($query: UserQueryInput, $dt: DateTime, $tz: String) {
|
||||
)
|
||||
return &retval, err
|
||||
}
|
||||
|
||||
+1
-1
@@ -6,4 +6,4 @@
|
||||
"sourceLocation": "testdata/queries/PointersInline.graphql"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
+1
@@ -51,3 +51,4 @@ query QueryWithAlias {
|
||||
)
|
||||
return &retval, err
|
||||
}
|
||||
|
||||
+1
-1
@@ -6,4 +6,4 @@
|
||||
"sourceLocation": "testdata/queries/QueryWithAlias.graphql"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
+1
@@ -51,3 +51,4 @@ query QueryWithDoubleAlias {
|
||||
)
|
||||
return &retval, err
|
||||
}
|
||||
|
||||
+1
-1
@@ -6,4 +6,4 @@
|
||||
"sourceLocation": "testdata/queries/QueryWithDoubleAlias.graphql"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
+1
@@ -72,3 +72,4 @@ query QueryWithEnums {
|
||||
)
|
||||
return &retval, err
|
||||
}
|
||||
|
||||
+1
-1
@@ -6,4 +6,4 @@
|
||||
"sourceLocation": "testdata/queries/QueryWithEnums.graphql"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
+1
@@ -48,3 +48,4 @@ query QueryWithSlices {
|
||||
)
|
||||
return &retval, err
|
||||
}
|
||||
|
||||
+1
-1
@@ -6,4 +6,4 @@
|
||||
"sourceLocation": "testdata/queries/QueryWithSlices.graphql"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
+1
@@ -51,3 +51,4 @@ query QueryWithStructs {
|
||||
)
|
||||
return &retval, err
|
||||
}
|
||||
|
||||
+1
-1
@@ -6,4 +6,4 @@
|
||||
"sourceLocation": "testdata/queries/QueryWithStructs.graphql"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
+1
@@ -51,3 +51,4 @@ query SimpleInputQuery ($name: String!) {
|
||||
)
|
||||
return &retval, err
|
||||
}
|
||||
|
||||
+1
-1
@@ -6,4 +6,4 @@
|
||||
"sourceLocation": "testdata/queries/SimpleInput.graphql"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
+1
@@ -53,3 +53,4 @@ mutation SimpleMutation ($name: String!) {
|
||||
)
|
||||
return &retval, err
|
||||
}
|
||||
|
||||
+1
-1
@@ -6,4 +6,4 @@
|
||||
"sourceLocation": "testdata/queries/SimpleMutation.graphql"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
+1
@@ -46,3 +46,4 @@ query SimpleQuery {
|
||||
)
|
||||
return &retval, err
|
||||
}
|
||||
|
||||
+1
-1
@@ -6,4 +6,4 @@
|
||||
"sourceLocation": "testdata/queries/SimpleQuery.graphql"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
+1
@@ -48,3 +48,4 @@ query TypeNameQuery {
|
||||
)
|
||||
return &retval, err
|
||||
}
|
||||
|
||||
+1
-1
@@ -6,4 +6,4 @@
|
||||
"sourceLocation": "testdata/queries/TypeName.graphql"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
+1
@@ -97,3 +97,4 @@ query UnionNoFragmentsQuery {
|
||||
)
|
||||
return &retval, err
|
||||
}
|
||||
|
||||
+1
-1
@@ -6,4 +6,4 @@
|
||||
"sourceLocation": "testdata/queries/UnionNoFragments.graphql"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
+1
@@ -72,3 +72,4 @@ query UsesEnumTwiceQuery {
|
||||
)
|
||||
return &retval, err
|
||||
}
|
||||
|
||||
+1
-1
@@ -6,4 +6,4 @@
|
||||
"sourceLocation": "testdata/queries/UsesEnumTwice.graphql"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
+1
@@ -79,3 +79,4 @@ query unexported ($query: UserQueryInput) {
|
||||
)
|
||||
return &retval, err
|
||||
}
|
||||
|
||||
+1
-1
@@ -6,4 +6,4 @@
|
||||
"sourceLocation": "testdata/queries/unexported.graphql"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -1 +1 @@
|
||||
testdata/errors/InvalidQuery.go:4: query-spec does not match schema: Cannot query field "g" on type "Query". Did you mean "f"?
|
||||
testdata/errors/InvalidQuery.go:4: query-spec does not match schema: Cannot query field "g" on type "Query". Did you mean "f"?
|
||||
+1
-1
@@ -1 +1 @@
|
||||
testdata/errors/InvalidQuery.graphql:1: query-spec does not match schema: Cannot query field "g" on type "Query". Did you mean "f"?
|
||||
testdata/errors/InvalidQuery.graphql:1: query-spec does not match schema: Cannot query field "g" on type "Query". Did you mean "f"?
|
||||
+1
-1
@@ -1 +1 @@
|
||||
invalid type-name "bogus" (unknown type-name "bogus"); expected a builtin, path/to/package.Name, interface{}, or a slice, map, or pointer of those
|
||||
invalid type-name "bogus" (unknown type-name "bogus"); expected a builtin, path/to/package.Name, interface{}, or a slice, map, or pointer of those
|
||||
+1
-1
@@ -1 +1 @@
|
||||
invalid type-name "bogus" (unknown type-name "bogus"); expected a builtin, path/to/package.Name, interface{}, or a slice, map, or pointer of those
|
||||
invalid type-name "bogus" (unknown type-name "bogus"); expected a builtin, path/to/package.Name, interface{}, or a slice, map, or pointer of those
|
||||
+1
-1
@@ -1 +1 @@
|
||||
testdata/errors/InvalidSchema.schema.graphql:4: invalid schema file testdata/errors/InvalidSchema.schema.graphql: Expected :, found }
|
||||
testdata/errors/InvalidSchema.schema.graphql:4: invalid schema file testdata/errors/InvalidSchema.schema.graphql: Expected :, found }
|
||||
+1
-1
@@ -1 +1 @@
|
||||
testdata/errors/InvalidSchema.schema.graphql:4: invalid schema file testdata/errors/InvalidSchema.schema.graphql: Expected :, found }
|
||||
testdata/errors/InvalidSchema.schema.graphql:4: invalid schema file testdata/errors/InvalidSchema.schema.graphql: Expected :, found }
|
||||
@@ -0,0 +1 @@
|
||||
no queries found, looked in: testdata/errors/NoQuery.go
|
||||
@@ -0,0 +1 @@
|
||||
no queries found, looked in: testdata/errors/NoQuery.graphql
|
||||
+1
-1
@@ -1 +1 @@
|
||||
testdata/errors/UnknownScalar.schema.graphql:3: unknown scalar UnknownScalar: please add it to genqlient.yaml
|
||||
testdata/errors/UnknownScalar.schema.graphql:3: unknown scalar UnknownScalar: please add it to genqlient.yaml
|
||||
+1
-1
@@ -1 +1 @@
|
||||
testdata/errors/UnknownScalar.schema.graphql:3: unknown scalar UnknownScalar: please add it to genqlient.yaml
|
||||
testdata/errors/UnknownScalar.schema.graphql:3: unknown scalar UnknownScalar: please add it to genqlient.yaml
|
||||
Reference in New Issue
Block a user