Skip to content
This repository has been archived by the owner on Apr 26, 2021. It is now read-only.

Commit

Permalink
gandalftest: implement removeKey in the testing server
Browse files Browse the repository at this point in the history
  • Loading branch information
Francisco Souza committed Feb 10, 2015
1 parent e7100d4 commit 826f7a2
Show file tree
Hide file tree
Showing 2 changed files with 74 additions and 10 deletions.
47 changes: 37 additions & 10 deletions gandalftest/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,7 @@ func (s *GandalfServer) ServeHTTP(w http.ResponseWriter, r *http.Request) {
func (s *GandalfServer) buildMuxer() {
s.muxer = pat.New()
s.muxer.Post("/user/{name}/key", http.HandlerFunc(s.addKeys))
s.muxer.Delete("/user/{name}/key/{keyname}", http.HandlerFunc(s.removeKey))
s.muxer.Post("/user", http.HandlerFunc(s.createUser))
s.muxer.Delete("/user/{name}", http.HandlerFunc(s.removeUser))
s.muxer.Post("/repository", http.HandlerFunc(s.createRepository))
Expand Down Expand Up @@ -131,8 +132,8 @@ func (s *GandalfServer) createUser(w http.ResponseWriter, r *http.Request) {
}

func (s *GandalfServer) removeUser(w http.ResponseWriter, r *http.Request) {
username := r.URL.Query().Get(":name")
_, index := s.findUser(username)
userName := r.URL.Query().Get(":name")
_, index := s.findUser(userName)
if index < 0 {
http.Error(w, "user not found", http.StatusNotFound)
return
Expand All @@ -142,7 +143,7 @@ func (s *GandalfServer) removeUser(w http.ResponseWriter, r *http.Request) {
last := len(s.users) - 1
s.users[index] = s.users[last]
s.users = s.users[:last]
delete(s.keys, username)
delete(s.keys, userName)
}

func (s *GandalfServer) createRepository(w http.ResponseWriter, r *http.Request) {
Expand All @@ -154,10 +155,10 @@ func (s *GandalfServer) createRepository(w http.ResponseWriter, r *http.Request)
return
}
users := append(repo.Users, repo.ReadOnlyUsers...)
for _, username := range users {
_, index := s.findUser(username)
for _, userName := range users {
_, index := s.findUser(userName)
if index < 0 {
http.Error(w, fmt.Sprintf("user %q not found", username), http.StatusBadRequest)
http.Error(w, fmt.Sprintf("user %q not found", userName), http.StatusBadRequest)
return
}
}
Expand Down Expand Up @@ -200,7 +201,7 @@ func (s *GandalfServer) getRepository(w http.ResponseWriter, r *http.Request) {
}

func (s *GandalfServer) addKeys(w http.ResponseWriter, r *http.Request) {
username := r.URL.Query().Get(":name")
userName := r.URL.Query().Get(":name")
var keys map[string]string
defer r.Body.Close()
err := json.NewDecoder(r.Body).Decode(&keys)
Expand All @@ -210,7 +211,7 @@ func (s *GandalfServer) addKeys(w http.ResponseWriter, r *http.Request) {
}
s.usersLock.Lock()
defer s.usersLock.Unlock()
userKeys, ok := s.keys[username]
userKeys, ok := s.keys[userName]
if !ok {
http.Error(w, "user not found", http.StatusNotFound)
return
Expand All @@ -230,10 +231,36 @@ func (s *GandalfServer) addKeys(w http.ResponseWriter, r *http.Request) {
for name, body := range keys {
userKeys = append(userKeys, key{Name: name, Body: body})
}
s.keys[username] = userKeys
s.keys[userName] = userKeys
}

func (s *GandalfServer) findUser(name string) (username string, index int) {
func (s *GandalfServer) removeKey(w http.ResponseWriter, r *http.Request) {
userName := r.URL.Query().Get(":name")
keyName := r.URL.Query().Get(":keyname")
s.usersLock.Lock()
defer s.usersLock.Unlock()
userKeys, ok := s.keys[userName]
if !ok {
http.Error(w, "user not found", http.StatusNotFound)
return
}
index := -1
for i, userKey := range userKeys {
if userKey.Name == keyName {
index = i
break
}
}
if index < 0 {
http.Error(w, "key not found", http.StatusNotFound)
return
}
last := len(userKeys) - 1
userKeys[index] = userKeys[last]
s.keys[userName] = userKeys[:last]
}

func (s *GandalfServer) findUser(name string) (userName string, index int) {
s.usersLock.RLock()
defer s.usersLock.RUnlock()
for i, user := range s.users {
Expand Down
37 changes: 37 additions & 0 deletions gandalftest/server_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -271,6 +271,43 @@ func (s *S) TestAddKeysInvalid(c *check.C) {
c.Assert(recorder.Body.String(), check.Equals, `key "mykey" is not valid`+"\n")
}

func (s *S) TestRemoveKey(c *check.C) {
server, err := NewServer("127.0.0.1:0")
c.Assert(err, check.IsNil)
defer server.Stop()
server.users = []string{"myuser"}
server.keys["myuser"] = []key{{Name: "mykey", Body: "irrelevant"}}
recorder := httptest.NewRecorder()
request, _ := http.NewRequest("DELETE", "/user/myuser/key/mykey", nil)
server.ServeHTTP(recorder, request)
c.Assert(recorder.Code, check.Equals, http.StatusOK)
c.Assert(server.keys["myuser"], check.HasLen, 0)
}

func (s *S) TestRemoveKeyUserNotFound(c *check.C) {
server, err := NewServer("127.0.0.1:0")
c.Assert(err, check.IsNil)
defer server.Stop()
recorder := httptest.NewRecorder()
request, _ := http.NewRequest("DELETE", "/user/myuser/key/mykey", nil)
server.ServeHTTP(recorder, request)
c.Assert(recorder.Code, check.Equals, http.StatusNotFound)
c.Assert(recorder.Body.String(), check.Equals, "user not found\n")
}

func (s *S) TestRemoveKeyKeyNotFound(c *check.C) {
server, err := NewServer("127.0.0.1:0")
c.Assert(err, check.IsNil)
defer server.Stop()
server.users = []string{"myuser"}
server.keys["myuser"] = []key{{Name: "theirkey", Body: "irrelevant"}}
recorder := httptest.NewRecorder()
request, _ := http.NewRequest("DELETE", "/user/myuser/key/mykey", nil)
server.ServeHTTP(recorder, request)
c.Assert(recorder.Code, check.Equals, http.StatusNotFound)
c.Assert(recorder.Body.String(), check.Equals, "key not found\n")
}

func (s *S) TestPrepareFailure(c *check.C) {
server, err := NewServer("127.0.0.1:0")
c.Assert(err, check.IsNil)
Expand Down

0 comments on commit 826f7a2

Please sign in to comment.