Add All route & operation for Chronograf Users

Signed-off-by: Jared Scheib <jared.scheib@gmail.com>
pull/10616/head
Michael de Sa 2017-10-09 15:03:50 -07:00 committed by Jared Scheib
parent eb6c212023
commit b8970c8ed1
4 changed files with 114 additions and 3 deletions

View File

@ -146,7 +146,7 @@ func NewMux(opts MuxOpts, service Service) http.Handler {
// Users associated with Chronograf // Users associated with Chronograf
router.GET("/chronograf/v1/me", service.Me) router.GET("/chronograf/v1/me", service.Me)
// router.GET("/chronograf/v1/users", service.Users) router.GET("/chronograf/v1/users", service.Users)
router.POST("/chronograf/v1/users", service.NewUser) router.POST("/chronograf/v1/users", service.NewUser)
router.GET("/chronograf/v1/users/:id", service.UserID) router.GET("/chronograf/v1/users/:id", service.UserID)

View File

@ -82,7 +82,7 @@ func (h *Service) SourceUsers(w http.ResponseWriter, r *http.Request) {
ur[i] = *usr ur[i] = *usr
} }
res := usersResponse{ res := sourceUsersResponse{
Users: ur, Users: ur,
} }
@ -240,7 +240,7 @@ func (r *sourceUserRequest) ValidCreate() error {
return validPermissions(&r.Permissions) return validPermissions(&r.Permissions)
} }
type usersResponse struct { type sourceUsersResponse struct {
Users []sourceUserResponse `json:"users"` Users []sourceUserResponse `json:"users"`
} }

View File

@ -57,6 +57,24 @@ func newUserResponse(u *chronograf.User) *userResponse {
} }
} }
type usersResponse struct {
Links selfLinks `json:"links"`
Users []*userResponse `json:"users"`
}
func newUsersResponse(users []chronograf.User) *usersResponse {
usersResp := make([]*userResponse, len(users))
for i, user := range users {
usersResp[i] = newUserResponse(&user)
}
return &usersResponse{
Users: usersResp,
Links: selfLinks{
Self: "/chronograf/v1/users",
},
}
}
func (s *Service) UserID(w http.ResponseWriter, r *http.Request) { func (s *Service) UserID(w http.ResponseWriter, r *http.Request) {
ctx := r.Context() ctx := r.Context()
@ -151,3 +169,16 @@ func (s *Service) UpdateUser(w http.ResponseWriter, r *http.Request) {
w.Header().Add("Location", cu.Links.Self) w.Header().Add("Location", cu.Links.Self)
encodeJSON(w, http.StatusOK, cu, s.Logger) encodeJSON(w, http.StatusOK, cu, s.Logger)
} }
func (s *Service) Users(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()
users, err := s.UsersStore.All(ctx)
if err != nil {
Error(w, http.StatusBadRequest, err.Error(), s.Logger)
return
}
res := newUsersResponse(users)
encodeJSON(w, http.StatusOK, res, s.Logger)
}

View File

@ -371,6 +371,86 @@ func TestService_UpdateUser(t *testing.T) {
} }
} }
func TestService_Users(t *testing.T) {
type fields struct {
UsersStore chronograf.UsersStore
Logger chronograf.Logger
}
type args struct {
w *httptest.ResponseRecorder
r *http.Request
}
tests := []struct {
name string
fields fields
args args
wantStatus int
wantContentType string
wantBody string
}{
{
name: "Get all Chronograf users",
fields: fields{
Logger: log.New(log.DebugLevel),
UsersStore: &mocks.UsersStore{
AllF: func(ctx context.Context) ([]chronograf.User, error) {
return []chronograf.User{
{
ID: 1337,
Name: "billysteve",
Provider: "Google",
Scheme: "OAuth2",
},
{
ID: 1338,
Name: "bobbettastuhvetta",
Provider: "Auth0",
Scheme: "LDAP",
},
}, nil
},
},
},
args: args{
w: httptest.NewRecorder(),
r: httptest.NewRequest(
"GET",
"http://any.url", // can be any valid URL as we are bypassing mux
nil,
),
},
wantStatus: http.StatusOK,
wantContentType: "application/json",
wantBody: `{"users":[{"id":1337,"name":"billysteve","provider":"Google","scheme":"OAuth2","links":{"self":"/chronograf/v1/users/1337"}},{"id":1338,"name":"bobbettastuhvetta","provider":"Auth0","scheme":"LDAP","links":{"self":"/chronograf/v1/users/1338"}}],"links":{"self":"/chronograf/v1/users"}}`,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
s := &Service{
UsersStore: tt.fields.UsersStore,
Logger: tt.fields.Logger,
}
s.Users(tt.args.w, tt.args.r)
resp := tt.args.w.Result()
content := resp.Header.Get("Content-Type")
body, _ := ioutil.ReadAll(resp.Body)
if resp.StatusCode != tt.wantStatus {
t.Errorf("%q. Users() = %v, want %v", tt.name, resp.StatusCode, tt.wantStatus)
}
if tt.wantContentType != "" && content != tt.wantContentType {
t.Errorf("%q. Users() = %v, want %v", tt.name, content, tt.wantContentType)
}
if eq, _ := jsonEqual(string(body), tt.wantBody); tt.wantBody != "" && !eq {
t.Errorf("%q. Users() = \n***%v***\n,\nwant\n***%v***", tt.name, string(body), tt.wantBody)
}
})
}
}
func jsonEqual(s1, s2 string) (eq bool, err error) { func jsonEqual(s1, s2 string) (eq bool, err error) {
var o1, o2 interface{} var o1, o2 interface{}