If requested, validate binding-types get the right fields (#70)
## Summary: One sharp edge of the new `bindings` setting (when used for composite types) is this: the (presumably struct) type to which you're binding may expect to have particular fields, but it's GraphQL so you could have requested some other set of fields. Now, if you ask us, we check. Specifically, I've added a new setting under the `bindings` items, which says: everywhere we query this must select these fields. (Or use its own inline `# @genqlient(bind: ...)`.) It must select exactly those fields, in order, no more, no less. This was fairly easy to implement; actually comparing the selections was surprisingly much code but it's all pretty straightforward. ## Test plan: make check Author: benjaminjkraft Reviewers: dnerdy, aberkan, csilvers, MiguelCastillo Required Reviewers: Approved by: dnerdy Checks: ✅ Test (1.17), ✅ Test (1.16), ✅ Test (1.15), ✅ Test (1.14), ✅ Test (1.13), ✅ Lint, ✅ Test (1.17), ✅ Test (1.16), ✅ Test (1.15), ✅ Test (1.14), ✅ Test (1.13), ✅ Lint Pull request URL: https://github.com/Khan/genqlient/pull/70
This commit is contained in:
@@ -52,11 +52,14 @@ func TestGenerate(t *testing.T) {
|
||||
Generated: goFilename,
|
||||
ExportOperations: queriesFilename,
|
||||
Bindings: map[string]*TypeBinding{
|
||||
"ID": {Type: "github.com/Khan/genqlient/internal/testutil.ID"},
|
||||
"DateTime": {Type: "time.Time"},
|
||||
"Junk": {Type: "interface{}"},
|
||||
"ComplexJunk": {Type: "[]map[string]*[]*map[string]interface{}"},
|
||||
"Pokemon": {Type: "github.com/Khan/genqlient/internal/testutil.Pokemon"},
|
||||
"ID": {Type: "github.com/Khan/genqlient/internal/testutil.ID"},
|
||||
"DateTime": {Type: "time.Time"},
|
||||
"Junk": {Type: "interface{}"},
|
||||
"ComplexJunk": {Type: "[]map[string]*[]*map[string]interface{}"},
|
||||
"Pokemon": {
|
||||
Type: "github.com/Khan/genqlient/internal/testutil.Pokemon",
|
||||
ExpectExactFields: "{ species level }",
|
||||
},
|
||||
"PokemonInput": {Type: "github.com/Khan/genqlient/internal/testutil.Pokemon"},
|
||||
},
|
||||
AllowBrokenFeatures: true,
|
||||
@@ -117,6 +120,14 @@ func TestGenerate(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
// TestGenerate is a snapshot-based test of error text.
|
||||
//
|
||||
// For each .go or .graphql file in testdata/errors, and corresponding
|
||||
// .schema.graphql file, it asserts that the given query returns an error, and
|
||||
// that that error's string-text matches the snapshot. The snapshotting is
|
||||
// useful to ensure we don't accidentally make the text less readable, drop the
|
||||
// line numbers, etc. We include both .go and .graphql tests, to make sure the
|
||||
// line numbers work in both cases.
|
||||
func TestGenerateErrors(t *testing.T) {
|
||||
files, err := ioutil.ReadDir(errorsDir)
|
||||
if err != nil {
|
||||
@@ -143,6 +154,10 @@ func TestGenerateErrors(t *testing.T) {
|
||||
Bindings: map[string]*TypeBinding{
|
||||
"ValidScalar": {Type: "string"},
|
||||
"InvalidScalar": {Type: "bogus"},
|
||||
"Pokemon": {
|
||||
Type: "github.com/Khan/genqlient/internal/testutil.Pokemon",
|
||||
ExpectExactFields: "{ species level }",
|
||||
},
|
||||
},
|
||||
AllowBrokenFeatures: true,
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user