func init() { globalIDTestUserType = graphql.NewObject(graphql.ObjectConfig{ Name: "User", Fields: graphql.Fields{ "id": relay.GlobalIDField("User", nil), "name": &graphql.Field{ Type: graphql.String, }, }, Interfaces: []*graphql.Interface{globalIDTestDef.NodeInterface}, }) photoIDFetcher := func(obj interface{}, info graphql.ResolveInfo) string { switch obj := obj.(type) { case *photo2: return fmt.Sprintf("%v", obj.PhotoId) } return "" } globalIDTestPhotoType = graphql.NewObject(graphql.ObjectConfig{ Name: "Photo", Fields: graphql.Fields{ "id": relay.GlobalIDField("Photo", photoIDFetcher), "width": &graphql.Field{ Type: graphql.Int, }, }, Interfaces: []*graphql.Interface{globalIDTestDef.NodeInterface}, }) globalIDTestSchema, _ = graphql.NewSchema(graphql.SchemaConfig{ Query: globalIDTestQueryType, }) }
func init() { nodeTestUserType = graphql.NewObject(graphql.ObjectConfig{ Name: "User", Fields: graphql.FieldConfigMap{ "id": &graphql.FieldConfig{ Type: graphql.NewNonNull(graphql.ID), }, "name": &graphql.FieldConfig{ Type: graphql.String, }, }, Interfaces: []*graphql.Interface{nodeTestDef.NodeInterface}, }) nodeTestPhotoType = graphql.NewObject(graphql.ObjectConfig{ Name: "Photo", Fields: graphql.FieldConfigMap{ "id": &graphql.FieldConfig{ Type: graphql.NewNonNull(graphql.ID), }, "width": &graphql.FieldConfig{ Type: graphql.Int, }, }, Interfaces: []*graphql.Interface{nodeTestDef.NodeInterface}, }) nodeTestSchema, _ = graphql.NewSchema(graphql.SchemaConfig{ Query: nodeTestQueryType, }) }
func schemaWithArgOfType(ttype graphql.Type) (graphql.Schema, error) { badObject := graphql.NewObject(graphql.ObjectConfig{ Name: "BadObject", Fields: graphql.FieldConfigMap{ "badField": &graphql.FieldConfig{ Type: graphql.String, Args: graphql.FieldConfigArgument{ "badArg": &graphql.ArgumentConfig{ Type: ttype, }, }, }, }, }) return graphql.NewSchema(graphql.SchemaConfig{ Query: graphql.NewObject(graphql.ObjectConfig{ Name: "Query", Fields: graphql.FieldConfigMap{ "f": &graphql.FieldConfig{ Type: badObject, }, }, }), }) }
func TestMutation_ExecutionAddsErrorsFromFieldResolveFn(t *testing.T) { mError := errors.New("mutationError") q := graphql.NewObject(graphql.ObjectConfig{ Name: "Query", Fields: graphql.Fields{ "a": &graphql.Field{ Type: graphql.String, }, }, }) m := graphql.NewObject(graphql.ObjectConfig{ Name: "Mutation", Fields: graphql.Fields{ "foo": &graphql.Field{ Type: graphql.String, Args: graphql.FieldConfigArgument{ "f": &graphql.ArgumentConfig{ Type: graphql.String, }, }, Resolve: func(p graphql.ResolveParams) (interface{}, error) { return nil, mError }, }, "bar": &graphql.Field{ Type: graphql.String, Args: graphql.FieldConfigArgument{ "b": &graphql.ArgumentConfig{ Type: graphql.String, }, }, Resolve: func(p graphql.ResolveParams) (interface{}, error) { return "ok", nil }, }, }, }) schema, err := graphql.NewSchema(graphql.SchemaConfig{ Query: q, Mutation: m, }) if err != nil { t.Fatalf("unexpected error, got: %v", err) } query := "mutation _ { newFoo: foo(f:\"title\") }" result := graphql.Do(graphql.Params{ Schema: schema, RequestString: query, }) if len(result.Errors) == 0 { t.Fatal("wrong result, expected errors, got no errors") } if result.Errors[0].Error() != mError.Error() { t.Fatalf("wrong result, unexpected error, got: %v, expected: %v", result.Errors[0], mError) } }
func TestTypeSystem_DefinitionExample_IncludesNestedInputObjectsInTheMap(t *testing.T) { nestedInputObject := graphql.NewInputObject(graphql.InputObjectConfig{ Name: "NestedInputObject", Fields: graphql.InputObjectConfigFieldMap{ "value": &graphql.InputObjectFieldConfig{ Type: graphql.String, }, }, }) someInputObject := graphql.NewInputObject(graphql.InputObjectConfig{ Name: "SomeInputObject", Fields: graphql.InputObjectConfigFieldMap{ "nested": &graphql.InputObjectFieldConfig{ Type: nestedInputObject, }, }, }) someMutation := graphql.NewObject(graphql.ObjectConfig{ Name: "SomeMutation", Fields: graphql.Fields{ "mutateSomething": &graphql.Field{ Type: blogArticle, Args: graphql.FieldConfigArgument{ "input": &graphql.ArgumentConfig{ Type: someInputObject, }, }, }, }, }) someSubscription := graphql.NewObject(graphql.ObjectConfig{ Name: "SomeSubscription", Fields: graphql.Fields{ "subscribeToSomething": &graphql.Field{ Type: blogArticle, Args: graphql.FieldConfigArgument{ "input": &graphql.ArgumentConfig{ Type: someInputObject, }, }, }, }, }) schema, err := graphql.NewSchema(graphql.SchemaConfig{ Query: blogQuery, Mutation: someMutation, Subscription: someSubscription, }) if err != nil { t.Fatalf("unexpected error, got: %v", err) } if schema.Type("NestedInputObject") != nestedInputObject { t.Fatalf(`schema.GetType("NestedInputObject") expected to equal nestedInputObject, got: %v`, schema.Type("NestedInputObject")) } }
func TestUsesTheSubscriptionSchemaForSubscriptions(t *testing.T) { doc := `query Q { a } subscription S { a }` data := map[string]interface{}{ "a": "b", "c": "d", } expected := &graphql.Result{ Data: map[string]interface{}{ "a": "b", }, } schema, err := graphql.NewSchema(graphql.SchemaConfig{ Query: graphql.NewObject(graphql.ObjectConfig{ Name: "Q", Fields: graphql.Fields{ "a": &graphql.Field{ Type: graphql.String, }, }, }), Subscription: graphql.NewObject(graphql.ObjectConfig{ Name: "S", Fields: graphql.Fields{ "a": &graphql.Field{ Type: graphql.String, }, }, }), }) if err != nil { t.Fatalf("Error in schema %v", err.Error()) } // parse query ast := testutil.TestParse(t, doc) // execute ep := graphql.ExecuteParams{ Schema: schema, AST: ast, Root: data, OperationName: "S", } result := testutil.TestExecute(t, ep) if len(result.Errors) > 0 { t.Fatalf("wrong result, unexpected errors: %v", result.Errors) } if !reflect.DeepEqual(expected, result) { t.Fatalf("Unexpected result, Diff: %v", testutil.Diff(expected, result)) } }
func TestTypeSystem_SchemaMustContainUniquelyNamedTypes_RejectsASchemaWhichHaveSameNamedObjectsImplementingAnInterface(t *testing.T) { anotherInterface := graphql.NewInterface(graphql.InterfaceConfig{ Name: "AnotherInterface", ResolveType: func(p graphql.ResolveTypeParams) *graphql.Object { return nil }, Fields: graphql.Fields{ "f": &graphql.Field{ Type: graphql.String, }, }, }) FirstBadObject := graphql.NewObject(graphql.ObjectConfig{ Name: "BadObject", Interfaces: []*graphql.Interface{ anotherInterface, }, Fields: graphql.Fields{ "f": &graphql.Field{ Type: graphql.String, }, }, }) SecondBadObject := graphql.NewObject(graphql.ObjectConfig{ Name: "BadObject", Interfaces: []*graphql.Interface{ anotherInterface, }, Fields: graphql.Fields{ "f": &graphql.Field{ Type: graphql.String, }, }, }) queryType := graphql.NewObject(graphql.ObjectConfig{ Name: "Query", Fields: graphql.Fields{ "iface": &graphql.Field{ Type: anotherInterface, }, }, }) _, err := graphql.NewSchema(graphql.SchemaConfig{ Query: queryType, Types: []graphql.Type{FirstBadObject, SecondBadObject}, }) expectedError := `Schema must contain unique named types but contains multiple types named "BadObject".` if err == nil || err.Error() != expectedError { t.Fatalf("Expected error: %v, got %v", expectedError, err) } }
func getUserSchema(context *application.MyContext) graphql.Schema { var userType = graphql.Fields{ "user": &graphql.Field{ Type: graphql.NewObject( graphql.ObjectConfig{ Name: "User", Fields: graphql.Fields{ "id": &graphql.Field{ Type: graphql.String, }, "name": &graphql.Field{ Type: graphql.String, }, "password": &graphql.Field{ Type: graphql.String, }, }, }, ), Args: graphql.FieldConfigArgument{ "id": &graphql.ArgumentConfig{ Type: graphql.String, }, }, Resolve: func(p graphql.ResolveParams) (interface{}, error) { id, isOK := p.Args["id"].(string) if isOK { var dbConnection = (context.GetDbConnection()).(*mgo.Database) var result = user_models.UserStruct{} err := dbConnection.C("users").Find(bson.M{"_id": bson.ObjectIdHex(id)}).One(&result) if err != nil { panic(err) } return result, nil } return nil, nil }, }, } var schema, _ = graphql.NewSchema( graphql.SchemaConfig{ Query: graphql.NewObject( graphql.ObjectConfig{ Name: "UserQuery", Fields: userType, }), }, ) return schema }
func TestDoesNotIncludeIllegalFieldsInOutput(t *testing.T) { doc := `mutation M { thisIsIllegalDontIncludeMe }` expected := &graphql.Result{ Data: map[string]interface{}{}, } schema, err := graphql.NewSchema(graphql.SchemaConfig{ Query: graphql.NewObject(graphql.ObjectConfig{ Name: "Q", Fields: graphql.Fields{ "a": &graphql.Field{ Type: graphql.String, }, }, }), Mutation: graphql.NewObject(graphql.ObjectConfig{ Name: "M", Fields: graphql.Fields{ "c": &graphql.Field{ Type: graphql.String, }, }, }), }) if err != nil { t.Fatalf("Error in schema %v", err.Error()) } // parse query ast := testutil.TestParse(t, doc) // execute ep := graphql.ExecuteParams{ Schema: schema, AST: ast, } result := testutil.TestExecute(t, ep) if len(result.Errors) != 0 { t.Fatalf("wrong result, expected len(%v) errors, got len(%v)", len(expected.Errors), len(result.Errors)) } if !reflect.DeepEqual(expected, result) { t.Fatalf("Unexpected result, Diff: %v", testutil.Diff(expected, result)) } }
func TestTypeSystem_InterfaceTypesMustBeResolvable_AcceptsAnInterfaceTypeDefiningResolveType(t *testing.T) { anotherInterfaceType := graphql.NewInterface(graphql.InterfaceConfig{ Name: "AnotherInterface", ResolveType: func(p graphql.ResolveTypeParams) *graphql.Object { return nil }, Fields: graphql.Fields{ "f": &graphql.Field{ Type: graphql.String, }, }, }) _, err := schemaWithFieldType(graphql.NewObject(graphql.ObjectConfig{ Name: "SomeObject", Interfaces: []*graphql.Interface{anotherInterfaceType}, Fields: graphql.Fields{ "f": &graphql.Field{ Type: graphql.String, }, }, })) if err != nil { t.Fatalf("unexpected error: %v", err) } }
func TestQuery_ExecutionDoesNotAddErrorsFromFieldResolveFn(t *testing.T) { qError := errors.New("queryError") q := graphql.NewObject(graphql.ObjectConfig{ Name: "Query", Fields: graphql.Fields{ "a": &graphql.Field{ Type: graphql.String, Resolve: func(p graphql.ResolveParams) (interface{}, error) { return nil, qError }, }, "b": &graphql.Field{ Type: graphql.String, Resolve: func(p graphql.ResolveParams) (interface{}, error) { return "ok", nil }, }, }, }) blogSchema, err := graphql.NewSchema(graphql.SchemaConfig{ Query: q, }) if err != nil { t.Fatalf("unexpected error, got: %v", err) } query := "{ b }" result := graphql.Do(graphql.Params{ Schema: blogSchema, RequestString: query, }) if len(result.Errors) != 0 { t.Fatalf("wrong result, unexpected errors: %+v", result.Errors) } }
func main() { // Schema fields := graphql.Fields{ "hello": &graphql.Field{ Type: graphql.String, Resolve: func(p graphql.ResolveParams) interface{} { return "world" }, }, } rootQuery := graphql.ObjectConfig{Name: "RootQuery", Fields: fields} schemaConfig := graphql.SchemaConfig{Query: graphql.NewObject(rootQuery)} schema, err := graphql.NewSchema(schemaConfig) if err != nil { log.Fatalf("failed to create new schema, error: %v", err) } // Query query := ` { hello } ` params := graphql.Params{Schema: schema, RequestString: query} r := graphql.Do(params) if len(r.Errors) > 0 { log.Fatalf("failed to execute graphql operation, errors: %+v", r.Errors) } rJSON, _ := json.Marshal(r) fmt.Printf("%s \n", rJSON) // {“data”:{“hello”:”world”}} }
func main() { queryType := graphql.ObjectConfig{ Name: "Ping", Description: "Ping to get pong...", Fields: graphql.Fields{ "ping": &graphql.Field{ Type: graphql.String, Resolve: func(p graphql.ResolveParams) (interface{}, error) { return "pong", nil }, }, }, } schema, err := graphql.NewSchema(graphql.SchemaConfig{ Query: graphql.NewObject(queryType), }) if err != nil { panic(err) } http.HandleFunc("/graphql", customHandler(&schema)) http.ListenAndServe(":8888", nil) }
func TestDirectives_DirectiveNameMustBeValid(t *testing.T) { invalidDirective := graphql.NewDirective(graphql.DirectiveConfig{ Name: "123invalid name", Locations: []string{ graphql.DirectiveLocationField, }, }) _, err := graphql.NewSchema(graphql.SchemaConfig{ Query: graphql.NewObject(graphql.ObjectConfig{ Name: "TestType", Fields: graphql.Fields{ "a": &graphql.Field{ Type: graphql.String, }, }, }), Directives: []*graphql.Directive{invalidDirective}, }) expectedErr := gqlerrors.FormattedError{ Message: `Names must match /^[_a-zA-Z][_a-zA-Z0-9]*$/ but "123invalid name" does not.`, Locations: []location.SourceLocation{}, } if !reflect.DeepEqual(expectedErr, err) { t.Fatalf("Expected error to be equal, got: %v", testutil.Diff(expectedErr, err)) } }
func TestDirectives_DirectivesMustBeNamed(t *testing.T) { invalidDirective := graphql.NewDirective(graphql.DirectiveConfig{ Locations: []string{ graphql.DirectiveLocationField, }, }) _, err := graphql.NewSchema(graphql.SchemaConfig{ Query: graphql.NewObject(graphql.ObjectConfig{ Name: "TestType", Fields: graphql.Fields{ "a": &graphql.Field{ Type: graphql.String, }, }, }), Directives: []*graphql.Directive{invalidDirective}, }) expectedErr := gqlerrors.FormattedError{ Message: "Directive must be named.", Locations: []location.SourceLocation{}, } if !reflect.DeepEqual(expectedErr, err) { t.Fatalf("Expected error to be equal, got: %v", testutil.Diff(expectedErr, err)) } }
func newRootQuery(idx resource.Index) *graphql.Object { t := types{} if c, ok := idx.(schema.Compiler); ok { if err := c.Compile(); err != nil { log.Fatal(err) } } flds := graphql.Fields{} for _, r := range idx.GetResources() { if r.Conf().IsModeAllowed(resource.Read) { flds[r.Name()] = t.getGetQuery(idx, r) } if r.Conf().IsModeAllowed(resource.List) { flds[r.Name()+"List"] = t.getListQuery(idx, r, nil) for _, a := range r.GetAliases() { params, _ := r.GetAlias(a) flds[r.Name()+strings.Title(a)] = t.getListQuery(idx, r, params) } } } return graphql.NewObject(graphql.ObjectConfig{ Name: "RootQuery", Fields: flds, }) }
func TestTypeSystem_ObjectInterfacesMustBeArray_AcceptsAnObjectTypeWithArrayInterfaces(t *testing.T) { anotherInterfaceType := graphql.NewInterface(graphql.InterfaceConfig{ Name: "AnotherInterface", ResolveType: func(p graphql.ResolveTypeParams) *graphql.Object { return nil }, Fields: graphql.Fields{ "f": &graphql.Field{ Type: graphql.String, }, }, }) _, err := schemaWithFieldType(graphql.NewObject(graphql.ObjectConfig{ Name: "SomeObject", Interfaces: (graphql.InterfacesThunk)(func() []*graphql.Interface { return []*graphql.Interface{anotherInterfaceType} }), Fields: graphql.Fields{ "f": &graphql.Field{ Type: graphql.String, }, }, })) if err != nil { t.Fatalf("unexpected error: %v", err) } }
func TestTypeSystem_ObjectsMustAdhereToInterfaceTheyImplement_RejectsAnObjectWithASupersetNullableInterfaceFieldType(t *testing.T) { anotherInterface := graphql.NewInterface(graphql.InterfaceConfig{ Name: "AnotherInterface", ResolveType: func(p graphql.ResolveTypeParams) *graphql.Object { return nil }, Fields: graphql.Fields{ "field": &graphql.Field{ Type: graphql.NewNonNull(graphql.String), }, }, }) anotherObject := graphql.NewObject(graphql.ObjectConfig{ Name: "AnotherObject", Interfaces: []*graphql.Interface{anotherInterface}, Fields: graphql.Fields{ "field": &graphql.Field{ Type: graphql.String, }, }, }) _, err := schemaWithFieldType(anotherObject) expectedError := `AnotherInterface.field expects type "String!" but AnotherObject.field provides type "String".` if err == nil || err.Error() != expectedError { t.Fatalf("Expected error: %v, got %v", expectedError, err) } }
func TestTypeSystem_ObjectsMustAdhereToInterfaceTheyImplement_AcceptsAnObjectWithSubsetNonNullInterfaceFieldType(t *testing.T) { anotherInterface := graphql.NewInterface(graphql.InterfaceConfig{ Name: "AnotherInterface", ResolveType: func(p graphql.ResolveTypeParams) *graphql.Object { return nil }, Fields: graphql.Fields{ "field": &graphql.Field{ Type: graphql.String, }, }, }) anotherObject := graphql.NewObject(graphql.ObjectConfig{ Name: "AnotherObject", Interfaces: []*graphql.Interface{anotherInterface}, Fields: graphql.Fields{ "field": &graphql.Field{ Type: graphql.NewNonNull(graphql.String), }, }, }) _, err := schemaWithFieldType(anotherObject) if err != nil { t.Fatalf(`unexpected error: %v for type "%v"`, err, anotherObject) } }
func TestTypeSystem_ObjectsMustAdhereToInterfaceTheyImplement_AcceptsAnObjectWithASubtypedInterfaceField_Interface(t *testing.T) { var anotherInterface *graphql.Interface anotherInterface = graphql.NewInterface(graphql.InterfaceConfig{ Name: "AnotherInterface", ResolveType: func(p graphql.ResolveTypeParams) *graphql.Object { return nil }, Fields: (graphql.FieldsThunk)(func() graphql.Fields { return graphql.Fields{ "field": &graphql.Field{ Type: anotherInterface, }, } }), }) var anotherObject *graphql.Object anotherObject = graphql.NewObject(graphql.ObjectConfig{ Name: "AnotherObject", Interfaces: []*graphql.Interface{anotherInterface}, Fields: (graphql.FieldsThunk)(func() graphql.Fields { return graphql.Fields{ "field": &graphql.Field{ Type: anotherObject, }, } }), }) _, err := schemaWithFieldType(anotherObject) if err != nil { t.Fatalf(`unexpected error: %v for type "%v"`, err, anotherObject) } }
func TestTypeSystem_InterfaceTypesMustBeResolvable_AcceptsAnInterfaceTypeDefiningResolveTypeWithImplementingTypeDefiningIsTypeOf(t *testing.T) { anotherInterfaceType := graphql.NewInterface(graphql.InterfaceConfig{ Name: "AnotherInterface", ResolveType: func(value interface{}, info graphql.ResolveInfo) *graphql.Object { return nil }, Fields: graphql.FieldConfigMap{ "f": &graphql.FieldConfig{ Type: graphql.String, }, }, }) _, err := schemaWithFieldType(graphql.NewObject(graphql.ObjectConfig{ Name: "SomeObject", Interfaces: []*graphql.Interface{anotherInterfaceType}, IsTypeOf: func(value interface{}, info graphql.ResolveInfo) bool { return true }, Fields: graphql.FieldConfigMap{ "f": &graphql.FieldConfig{ Type: graphql.String, }, }, })) if err != nil { t.Fatalf("unexpected error: %v", err) } }
func TestTypeSystem_ObjectInterfacesMustBeArray_AcceptsAnObjectTypeWithInterfacesAsFunctionReturningAnArray(t *testing.T) { anotherInterfaceType := graphql.NewInterface(graphql.InterfaceConfig{ Name: "AnotherInterface", ResolveType: func(value interface{}, info graphql.ResolveInfo) *graphql.Object { return nil }, Fields: graphql.FieldConfigMap{ "f": &graphql.FieldConfig{ Type: graphql.String, }, }, }) _, err := schemaWithFieldType(graphql.NewObject(graphql.ObjectConfig{ Name: "SomeObject", Interfaces: []*graphql.Interface{anotherInterfaceType}, Fields: graphql.FieldConfigMap{ "f": &graphql.FieldConfig{ Type: graphql.String, }, }, })) if err != nil { t.Fatalf("unexpected error: %v", err) } }
func getFields(idx resource.Index, s schema.Schema) graphql.Fields { flds := graphql.Fields{} // Iter fields for name, def := range s.Fields { if def.Hidden { continue } if _, ok := def.Validator.(*schema.Reference); ok { // Handled by addConnections to prevent dead loops } var typ graphql.Output if def.Schema != nil { typ = graphql.NewObject(graphql.ObjectConfig{ Name: name, Fields: getFields(idx, *def.Schema), }) } else { typ = getFType(def.Validator) } flds[name] = &graphql.Field{ Description: def.Description, Type: typ, Args: getFArgs(def.Params), Resolve: getFResolver(name, def), } } return flds }
func TestTypeSystem_ObjectsMustAdhereToInterfaceTheyImplement_RejectsAnObjectWithADifferentlyModifiedInterfaceFieldType(t *testing.T) { anotherInterface := graphql.NewInterface(graphql.InterfaceConfig{ Name: "AnotherInterface", ResolveType: func(value interface{}, info graphql.ResolveInfo) *graphql.Object { return nil }, Fields: graphql.FieldConfigMap{ "field": &graphql.FieldConfig{ Type: graphql.String, }, }, }) anotherObject := graphql.NewObject(graphql.ObjectConfig{ Name: "AnotherObject", Interfaces: []*graphql.Interface{anotherInterface}, Fields: graphql.FieldConfigMap{ "field": &graphql.FieldConfig{ Type: graphql.NewNonNull(graphql.String), }, }, }) _, err := schemaWithObjectFieldOfType(anotherObject) expectedError := `AnotherInterface.field expects type "String" but AnotherObject.field provides type "String!".` if err == nil || err.Error() != expectedError { t.Fatalf("Expected error: %v, got %v", expectedError, err) } }
func TestTypeSystem_SchemaMustContainUniquelyNamedTypes_RejectsASchemaWhichRedefinesABuiltInType(t *testing.T) { fakeString := graphql.NewScalar(graphql.ScalarConfig{ Name: "String", Serialize: func(value interface{}) interface{} { return nil }, }) queryType := graphql.NewObject(graphql.ObjectConfig{ Name: "Query", Fields: graphql.FieldConfigMap{ "normal": &graphql.FieldConfig{ Type: graphql.String, }, "fake": &graphql.FieldConfig{ Type: fakeString, }, }, }) _, err := graphql.NewSchema(graphql.SchemaConfig{ Query: queryType, }) expectedError := `Schema must contain unique named types but contains multiple types named "String".` if err == nil || err.Error() != expectedError { t.Fatalf("Expected error: %v, got %v", expectedError, err) } }
func TestTypeSystem_ObjectsMustAdhereToInterfaceTheyImplement_AcceptsAnObjectWithAnEquivalentlyModifiedInterfaceField(t *testing.T) { anotherInterface := graphql.NewInterface(graphql.InterfaceConfig{ Name: "AnotherInterface", ResolveType: func(value interface{}, info graphql.ResolveInfo) *graphql.Object { return nil }, Fields: graphql.FieldConfigMap{ "field": &graphql.FieldConfig{ Type: graphql.NewNonNull(graphql.NewList(graphql.String)), }, }, }) anotherObject := graphql.NewObject(graphql.ObjectConfig{ Name: "AnotherObject", Interfaces: []*graphql.Interface{anotherInterface}, Fields: graphql.FieldConfigMap{ "field": &graphql.FieldConfig{ Type: graphql.NewNonNull(graphql.NewList(graphql.String)), }, }, }) _, err := schemaWithObjectFieldOfType(anotherObject) if err != nil { t.Fatalf(`unexpected error: %v for type "%v"`, err, anotherObject) } }
func TestTypeSystem_ObjectsMustAdhereToInterfaceTheyImplement_RejectsAnObjectMissingAnInterfaceArgument(t *testing.T) { anotherInterface := graphql.NewInterface(graphql.InterfaceConfig{ Name: "AnotherInterface", ResolveType: func(value interface{}, info graphql.ResolveInfo) *graphql.Object { return nil }, Fields: graphql.FieldConfigMap{ "field": &graphql.FieldConfig{ Type: graphql.String, Args: graphql.FieldConfigArgument{ "input": &graphql.ArgumentConfig{ Type: graphql.String, }, }, }, }, }) anotherObject := graphql.NewObject(graphql.ObjectConfig{ Name: "AnotherObject", Interfaces: []*graphql.Interface{anotherInterface}, Fields: graphql.FieldConfigMap{ "field": &graphql.FieldConfig{ Type: graphql.String, }, }, }) _, err := schemaWithObjectFieldOfType(anotherObject) expectedError := `AnotherInterface.field expects argument "input" but AnotherObject.field does not provide it.` if err == nil || err.Error() != expectedError { t.Fatalf("Expected error: %v, got %v", expectedError, err) } }
func TestIntrospection_IdentifiesDeprecatedFields(t *testing.T) { testType := graphql.NewObject(graphql.ObjectConfig{ Name: "TestType", Fields: graphql.Fields{ "nonDeprecated": &graphql.Field{ Type: graphql.String, }, "deprecated": &graphql.Field{ Type: graphql.String, DeprecationReason: "Removed in 1.0", }, }, }) schema, err := graphql.NewSchema(graphql.SchemaConfig{ Query: testType, }) if err != nil { t.Fatalf("Error creating Schema: %v", err.Error()) } query := ` { __type(name: "TestType") { name fields(includeDeprecated: true) { name isDeprecated, deprecationReason } } } ` expected := &graphql.Result{ Data: map[string]interface{}{ "__type": map[string]interface{}{ "name": "TestType", "fields": []interface{}{ map[string]interface{}{ "name": "nonDeprecated", "isDeprecated": false, "deprecationReason": nil, }, map[string]interface{}{ "name": "deprecated", "isDeprecated": true, "deprecationReason": "Removed in 1.0", }, }, }, }, } result := g(t, graphql.Params{ Schema: schema, RequestString: query, }) if !testutil.ContainSubset(result.Data.(map[string]interface{}), expected.Data.(map[string]interface{})) { t.Fatalf("Unexpected result, Diff: %v", testutil.Diff(expected, result)) } }
func TestGraphqlTag(t *testing.T) { typeObjectType := graphql.NewObject(graphql.ObjectConfig{ Name: "Type", Fields: graphql.Fields{ "fooBar": &graphql.Field{Type: graphql.String}, }, }) var baz = &graphql.Field{ Type: typeObjectType, Description: "typeObjectType", Resolve: func(p graphql.ResolveParams) (interface{}, error) { t := struct { FooBar string `graphql:"fooBar"` }{"foo bar value"} return t, nil }, } q := graphql.NewObject(graphql.ObjectConfig{ Name: "Query", Fields: graphql.Fields{ "baz": baz, }, }) schema, err := graphql.NewSchema(graphql.SchemaConfig{ Query: q, }) if err != nil { t.Fatalf("unexpected error, got: %v", err) } query := "{ baz { fooBar } }" result := graphql.Do(graphql.Params{ Schema: schema, RequestString: query, }) if len(result.Errors) != 0 { t.Fatalf("wrong result, unexpected errors: %+v", result.Errors) } expectedData := map[string]interface{}{ "baz": map[string]interface{}{ "fooBar": "foo bar value", }, } if !reflect.DeepEqual(result.Data, expectedData) { t.Fatalf("unexpected result, got: %+v, expected: %+v", expectedData, result.Data) } }
func TestCorrectlyThreadsArguments(t *testing.T) { query := ` query Example { b(numArg: 123, stringArg: "foo") } ` var resolvedArgs map[string]interface{} schema, err := graphql.NewSchema(graphql.SchemaConfig{ Query: graphql.NewObject(graphql.ObjectConfig{ Name: "Type", Fields: graphql.Fields{ "b": &graphql.Field{ Args: graphql.FieldConfigArgument{ "numArg": &graphql.ArgumentConfig{ Type: graphql.Int, }, "stringArg": &graphql.ArgumentConfig{ Type: graphql.String, }, }, Type: graphql.String, Resolve: func(p graphql.ResolveParams) (interface{}, error) { resolvedArgs = p.Args return resolvedArgs, nil }, }, }, }), }) if err != nil { t.Fatalf("Error in schema %v", err.Error()) } // parse query ast := testutil.TestParse(t, query) // execute ep := graphql.ExecuteParams{ Schema: schema, AST: ast, } result := testutil.TestExecute(t, ep) if len(result.Errors) > 0 { t.Fatalf("wrong result, unexpected errors: %v", result.Errors) } expectedNum := 123 expectedString := "foo" if resolvedArgs["numArg"] != expectedNum { t.Fatalf("Expected args.numArg to equal `%v`, got `%v`", expectedNum, resolvedArgs["numArg"]) } if resolvedArgs["stringArg"] != expectedString { t.Fatalf("Expected args.stringArg to equal `%v`, got `%v`", expectedNum, resolvedArgs["stringArg"]) } }