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