github.com/nathanstitt/genqlient@v0.3.1-0.20211028004951-a2bda3c41ab8/internal/integration/server/server.go (about) 1 package server 2 3 import ( 4 "context" 5 "fmt" 6 "net/http/httptest" 7 8 "github.com/99designs/gqlgen/graphql/handler" 9 "github.com/99designs/gqlgen/graphql/handler/transport" 10 ) 11 12 func strptr(v string) *string { return &v } 13 func intptr(v int) *int { return &v } 14 15 var users = []*User{ 16 { 17 ID: "1", Name: "Yours Truly", LuckyNumber: intptr(17), 18 Birthdate: strptr("2025-01-01"), 19 Hair: &Hair{Color: strptr("Black")}, 20 }, 21 {ID: "2", Name: "Raven", LuckyNumber: intptr(-1), Hair: nil}, 22 } 23 24 func init() { 25 users[0].Friends = []*User{users[1]} // (obviously a lie, but) 26 users[1].Friends = users // try to crash the system 27 } 28 29 var animals = []*Animal{ 30 { 31 ID: "3", Name: "Fido", Species: SpeciesDog, Owner: userByID("1"), 32 Hair: &BeingsHair{HasHair: true}, 33 }, 34 { 35 ID: "4", Name: "Old One", Species: SpeciesCoelacanth, Owner: nil, 36 Hair: &BeingsHair{HasHair: false}, 37 }, 38 } 39 40 func userByID(id string) *User { 41 for _, user := range users { 42 if id == user.ID { 43 return user 44 } 45 } 46 return nil 47 } 48 49 func usersByBirthdates(dates []string) []*User { 50 var retval []*User 51 for _, date := range dates { 52 for _, user := range users { 53 if user.Birthdate != nil && *user.Birthdate == date { 54 retval = append(retval, user) 55 } 56 } 57 } 58 return retval 59 } 60 61 func beingByID(id string) Being { 62 for _, user := range users { 63 if id == user.ID { 64 return user 65 } 66 } 67 for _, animal := range animals { 68 if id == animal.ID { 69 return animal 70 } 71 } 72 return nil 73 } 74 75 func (r *queryResolver) Me(ctx context.Context) (*User, error) { 76 return userByID("1"), nil 77 } 78 79 func (r *queryResolver) User(ctx context.Context, id *string) (*User, error) { 80 if id == nil { 81 return userByID("1"), nil 82 } 83 return userByID(*id), nil 84 } 85 86 func (r *queryResolver) Being(ctx context.Context, id string) (Being, error) { 87 return beingByID(id), nil 88 } 89 90 func (r *queryResolver) Beings(ctx context.Context, ids []string) ([]Being, error) { 91 ret := make([]Being, len(ids)) 92 for i, id := range ids { 93 ret[i] = beingByID(id) 94 } 95 return ret, nil 96 } 97 98 func (r *queryResolver) LotteryWinner(ctx context.Context, number int) (Lucky, error) { 99 for _, user := range users { 100 if user.LuckyNumber != nil && *user.LuckyNumber == number { 101 return user, nil 102 } 103 } 104 return nil, nil 105 } 106 107 func (r *queryResolver) UsersBornOn(ctx context.Context, date string) ([]*User, error) { 108 return usersByBirthdates([]string{date}), nil 109 } 110 111 func (r *queryResolver) UsersBornOnDates(ctx context.Context, dates []string) ([]*User, error) { 112 return usersByBirthdates(dates), nil 113 } 114 115 func (r *queryResolver) UserSearch(ctx context.Context, birthdate *string, id *string) ([]*User, error) { 116 switch { 117 case birthdate == nil && id != nil: 118 return []*User{userByID(*id)}, nil 119 case birthdate != nil && id == nil: 120 return usersByBirthdates([]string{*birthdate}), nil 121 default: 122 return nil, fmt.Errorf("need exactly one of birthdate or id") 123 } 124 } 125 126 func (r *queryResolver) Fail(ctx context.Context) (*bool, error) { 127 f := true 128 return &f, fmt.Errorf("oh no") 129 } 130 131 func RunServer() *httptest.Server { 132 gqlgenServer := handler.New(NewExecutableSchema(Config{Resolvers: &resolver{}})) 133 gqlgenServer.AddTransport(transport.POST{}) 134 return httptest.NewServer(gqlgenServer) 135 } 136 137 type ( 138 resolver struct{} 139 queryResolver struct{} 140 ) 141 142 func (r *resolver) Query() QueryResolver { return &queryResolver{} } 143 144 //go:generate go run github.com/99designs/gqlgen