Adding list() to client & api route.

This commit is contained in:
Matthew Dillon 2014-09-30 09:51:07 -08:00
parent da7be2e150
commit 76d5264474
5 changed files with 98 additions and 2 deletions

View file

@ -48,6 +48,33 @@ func NewClient(httpClient *http.Client) *Client {
return c return c
} }
// ListOptions specifies general pagination options for fetching a list of results
type ListOptions struct {
PerPage int `url:",omitempty" json:",omitempty"`
Page int `url:",moitempty" json:",omitempty"`
}
func (o ListOptions) PageOrDefault() int {
if o.Page <= 0 {
return 1
}
return o.Page
}
func (o ListOptions) Offset() int {
return (o.PageOrDefault() - 1) * o.PerPageOrDefault()
}
func (o ListOptions) PerPageOrDefault() int {
if o.PerPage <= 0 {
return DefaultPerPage
}
return o.PerPage
}
// DefaultPerPage is the default number of items to return in a paginated result set
const DefaultPerPage = 10
// apiRouter is used to generate URLs for bactdb's HTTP API. // apiRouter is used to generate URLs for bactdb's HTTP API.
var apiRouter = router.API() var apiRouter = router.API()

View file

@ -20,6 +20,9 @@ type User struct {
type UsersService interface { type UsersService interface {
// Get a user. // Get a user.
Get(id int64) (*User, error) Get(id int64) (*User, error)
// List all users.
List(opt *UserListOptions) ([]*User, error)
} }
type usersService struct { type usersService struct {
@ -50,8 +53,33 @@ func (s *usersService) Get(id int64) (*User, error) {
return user, nil return user, nil
} }
type UserListOptions struct {
ListOptions
}
func (s *usersService) List(opt *UserListOptions) ([]*User, error) {
url, err := s.client.url(router.Users, nil, opt)
if err != nil {
return nil, err
}
req, err := s.client.NewRequest("GET", url.String(), nil)
if err != nil {
return nil, err
}
var users []*User
_, err = s.client.Do(req, &users)
if err != nil {
return nil, err
}
return users, nil
}
type MockUsersService struct { type MockUsersService struct {
Get_ func(id int64) (*User, error) Get_ func(id int64) (*User, error)
List_ func(opt *UserListOptions) ([]*User, error)
} }
func (s *MockUsersService) Get(id int64) (*User, error) { func (s *MockUsersService) Get(id int64) (*User, error) {
@ -60,3 +88,10 @@ func (s *MockUsersService) Get(id int64) (*User, error) {
} }
return s.Get_(id) return s.Get_(id)
} }
func (s *MockUsersService) List(opt *UserListOptions) ([]*User, error) {
if s.List_ == nil {
return nil, nil
}
return s.List_(opt)
}

View file

@ -37,3 +37,35 @@ func TestUsersService_Get(t *testing.T) {
t.Errorf("Users.Get returned %+v, want %+v", user, want) t.Errorf("Users.Get returned %+v, want %+v", user, want)
} }
} }
func TestUsersService_List(t *testing.T) {
setup()
defer teardown()
want := []*User{{Id: 1, UserName: "Test User"}}
var called bool
mux.HandleFunc(urlPath(t, router.Users, nil), func(w http.ResponseWriter, r *http.Request) {
called = true
testMethod(t, r, "GET")
testFormValues(t, r, values{})
writeJSON(w, want)
})
users, err := client.Users.List(nil)
if err != nil {
t.Errorf("Users.List returned error: %v", err)
}
if !called {
t.Fatal("!called")
}
for _, u := range want {
normalizeTime(&u.CreatedAt, &u.UpdatedAt, &u.DeletedAt)
}
if !reflect.DeepEqual(users, want) {
t.Errorf("Users.List return %+v, want %+v", users, want)
}
}

View file

@ -4,6 +4,7 @@ import "github.com/gorilla/mux"
func API() *mux.Router { func API() *mux.Router {
m := mux.NewRouter() m := mux.NewRouter()
m.Path("/users").Methods("GET").Name(Users)
m.Path("/users/{Id:.+}").Methods("GET").Name(User) m.Path("/users/{Id:.+}").Methods("GET").Name(User)
return m return m
} }

View file

@ -2,4 +2,5 @@ package router
const ( const (
User = "user" User = "user"
Users = "users"
) )