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 testGraphql(test T, p graphql.Params, t *testing.T) { result := graphql.Do(p) if len(result.Errors) > 0 { t.Fatalf("wrong result, unexpected errors: %v", result.Errors) } if !reflect.DeepEqual(result, test.Expected) { t.Fatalf("wrong result, query: %v, graphql result diff: %v", test.Query, testutil.Diff(test.Expected, result)) } }
func executeQuery(query string, schema graphql.Schema) *graphql.Result { result := graphql.Do(graphql.Params{ Schema: schema, RequestString: query, }) if len(result.Errors) > 0 { fmt.Printf("wrong result, unexpected errors: %v", result.Errors) } return result }
func TestBasicGraphQLExample(t *testing.T) { // taken from `graphql-js` README helloFieldResolved := func(p graphql.ResolveParams) interface{} { return "world" } schema, err := graphql.NewSchema(graphql.SchemaConfig{ Query: graphql.NewObject(graphql.ObjectConfig{ Name: "RootQueryType", Fields: graphql.Fields{ "hello": &graphql.Field{ Description: "Returns `world`", Type: graphql.String, Resolve: helloFieldResolved, }, }, }), }) if err != nil { t.Fatalf("wrong result, unexpected errors: %v", err.Error()) } query := "{ hello }" var expected interface{} expected = map[string]interface{}{ "hello": "world", } result := graphql.Do(graphql.Params{ Schema: schema, RequestString: query, }) if len(result.Errors) > 0 { t.Fatalf("wrong result, unexpected errors: %v", result.Errors) } if !reflect.DeepEqual(result.Data, expected) { t.Fatalf("wrong result, query: %v, graphql result diff: %v", query, testutil.Diff(expected, result)) } }
func TestResolveTypeOnUnionYieldsUsefulError(t *testing.T) { humanType := graphql.NewObject(graphql.ObjectConfig{ Name: "Human", Fields: graphql.Fields{ "name": &graphql.Field{ Type: graphql.String, Resolve: func(p graphql.ResolveParams) interface{} { if human, ok := p.Source.(*testHuman); ok { return human.Name } return nil }, }, }, }) dogType := graphql.NewObject(graphql.ObjectConfig{ Name: "Dog", IsTypeOf: func(value interface{}, info graphql.ResolveInfo) bool { _, ok := value.(*testDog) return ok }, Fields: graphql.Fields{ "name": &graphql.Field{ Type: graphql.String, Resolve: func(p graphql.ResolveParams) interface{} { if dog, ok := p.Source.(*testDog); ok { return dog.Name } return nil }, }, "woofs": &graphql.Field{ Type: graphql.Boolean, Resolve: func(p graphql.ResolveParams) interface{} { if dog, ok := p.Source.(*testDog); ok { return dog.Woofs } return nil }, }, }, }) catType := graphql.NewObject(graphql.ObjectConfig{ Name: "Cat", IsTypeOf: func(value interface{}, info graphql.ResolveInfo) bool { _, ok := value.(*testCat) return ok }, Fields: graphql.Fields{ "name": &graphql.Field{ Type: graphql.String, Resolve: func(p graphql.ResolveParams) interface{} { if cat, ok := p.Source.(*testCat); ok { return cat.Name } return nil }, }, "meows": &graphql.Field{ Type: graphql.Boolean, Resolve: func(p graphql.ResolveParams) interface{} { if cat, ok := p.Source.(*testCat); ok { return cat.Meows } return nil }, }, }, }) petType := graphql.NewUnion(graphql.UnionConfig{ Name: "Pet", Types: []*graphql.Object{ dogType, catType, }, ResolveType: func(value interface{}, info graphql.ResolveInfo) *graphql.Object { if _, ok := value.(*testCat); ok { return catType } if _, ok := value.(*testDog); ok { return dogType } if _, ok := value.(*testHuman); ok { return humanType } return nil }, }) schema, err := graphql.NewSchema(graphql.SchemaConfig{ Query: graphql.NewObject(graphql.ObjectConfig{ Name: "Query", Fields: graphql.Fields{ "pets": &graphql.Field{ Type: graphql.NewList(petType), Resolve: func(p graphql.ResolveParams) interface{} { return []interface{}{ &testDog{"Odie", true}, &testCat{"Garfield", false}, &testHuman{"Jon"}, } }, }, }, }), }) if err != nil { t.Fatalf("Error in schema %v", err.Error()) } query := `{ pets { name ... on Dog { woofs } ... on Cat { meows } } }` expected := &graphql.Result{ Data: map[string]interface{}{ "pets": []interface{}{ map[string]interface{}{ "name": "Odie", "woofs": bool(true), }, map[string]interface{}{ "name": "Garfield", "meows": bool(false), }, nil, }, }, Errors: []gqlerrors.FormattedError{ gqlerrors.FormattedError{ Message: `Runtime Object type "Human" is not a possible type for "Pet".`, Locations: []location.SourceLocation{}, }, }, } result := graphql.Do(graphql.Params{ Schema: schema, RequestString: query, }) if len(result.Errors) == 0 { t.Fatalf("wrong result, expected errors: %v, got: %v", len(expected.Errors), len(result.Errors)) } if !reflect.DeepEqual(expected, result) { t.Fatalf("Unexpected result, Diff: %v", testutil.Diff(expected, result)) } }
func TestIsTypeOfUsedToResolveRuntimeTypeForInterface(t *testing.T) { petType := graphql.NewInterface(graphql.InterfaceConfig{ Name: "Pet", Fields: graphql.Fields{ "name": &graphql.Field{ Type: graphql.String, }, }, }) // ie declare that Dog belongs to Pet interface _ = graphql.NewObject(graphql.ObjectConfig{ Name: "Dog", Interfaces: []*graphql.Interface{ petType, }, IsTypeOf: func(value interface{}, info graphql.ResolveInfo) bool { _, ok := value.(*testDog) return ok }, Fields: graphql.Fields{ "name": &graphql.Field{ Type: graphql.String, Resolve: func(p graphql.ResolveParams) interface{} { if dog, ok := p.Source.(*testDog); ok { return dog.Name } return nil }, }, "woofs": &graphql.Field{ Type: graphql.Boolean, Resolve: func(p graphql.ResolveParams) interface{} { if dog, ok := p.Source.(*testDog); ok { return dog.Woofs } return nil }, }, }, }) // ie declare that Cat belongs to Pet interface _ = graphql.NewObject(graphql.ObjectConfig{ Name: "Cat", Interfaces: []*graphql.Interface{ petType, }, IsTypeOf: func(value interface{}, info graphql.ResolveInfo) bool { _, ok := value.(*testCat) return ok }, Fields: graphql.Fields{ "name": &graphql.Field{ Type: graphql.String, Resolve: func(p graphql.ResolveParams) interface{} { if cat, ok := p.Source.(*testCat); ok { return cat.Name } return nil }, }, "meows": &graphql.Field{ Type: graphql.Boolean, Resolve: func(p graphql.ResolveParams) interface{} { if cat, ok := p.Source.(*testCat); ok { return cat.Meows } return nil }, }, }, }) schema, err := graphql.NewSchema(graphql.SchemaConfig{ Query: graphql.NewObject(graphql.ObjectConfig{ Name: "Query", Fields: graphql.Fields{ "pets": &graphql.Field{ Type: graphql.NewList(petType), Resolve: func(p graphql.ResolveParams) interface{} { return []interface{}{ &testDog{"Odie", true}, &testCat{"Garfield", false}, } }, }, }, }), }) if err != nil { t.Fatalf("Error in schema %v", err.Error()) } query := `{ pets { name ... on Dog { woofs } ... on Cat { meows } } }` expected := &graphql.Result{ Data: map[string]interface{}{ "pets": []interface{}{ map[string]interface{}{ "name": "Odie", "woofs": bool(true), }, map[string]interface{}{ "name": "Garfield", "meows": bool(false), }, }, }, Errors: nil, } result := graphql.Do(graphql.Params{ Schema: schema, RequestString: query, }) 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 g(t *testing.T, p graphql.Params) *graphql.Result { return graphql.Do(p) }