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

Commit

Permalink
gandalftest: implement createRepository 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 fcaaf02 commit 3c2acfc
Show file tree
Hide file tree
Showing 2 changed files with 85 additions and 8 deletions.
50 changes: 42 additions & 8 deletions gandalftest/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import (
"sync"

"github.com/gorilla/pat"
"github.com/tsuru/gandalf/repository"
)

type user struct {
Expand Down Expand Up @@ -40,7 +41,9 @@ type GandalfServer struct {
muxer *pat.Router
users []string
keys map[string][]key
usersLock sync.Mutex
repos []repository.Repository
usersLock sync.RWMutex
repoLock sync.Mutex
failures chan Failure
}

Expand Down Expand Up @@ -98,6 +101,7 @@ func (s *GandalfServer) buildMuxer() {
s.muxer = pat.New()
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))
}

func (s *GandalfServer) createUser(w http.ResponseWriter, r *http.Request) {
Expand Down Expand Up @@ -126,13 +130,7 @@ func (s *GandalfServer) removeUser(w http.ResponseWriter, r *http.Request) {
username := r.URL.Query().Get(":name")
s.usersLock.Lock()
defer s.usersLock.Unlock()
index := -1
for i, user := range s.users {
if user == username {
index = i
break
}
}
_, index := s.findUser(username)
if index < 0 {
http.Error(w, "user not found", http.StatusNotFound)
return
Expand All @@ -143,6 +141,42 @@ func (s *GandalfServer) removeUser(w http.ResponseWriter, r *http.Request) {
delete(s.keys, username)
}

func (s *GandalfServer) createRepository(w http.ResponseWriter, r *http.Request) {
var repo repository.Repository
defer r.Body.Close()
err := json.NewDecoder(r.Body).Decode(&repo)
if err != nil {
http.Error(w, err.Error(), http.StatusBadRequest)
return
}
users := append(repo.Users, repo.ReadOnlyUsers...)
for _, username := range users {
_, index := s.findUser(username)
if index < 0 {
http.Error(w, fmt.Sprintf("user %q not found", username), http.StatusBadRequest)
return
}
}
s.repoLock.Lock()
defer s.repoLock.Unlock()
for _, r := range s.repos {
if r.Name == repo.Name {
http.Error(w, "repository already exists", http.StatusConflict)
return
}
}
s.repos = append(s.repos, repo)
}

func (s *GandalfServer) findUser(name string) (username string, index int) {
for i, user := range s.users {
if user == name {
return user, i
}
}
return "", -1
}

func (s *GandalfServer) getFailure(method, path string) (Failure, bool) {
var f Failure
select {
Expand Down
43 changes: 43 additions & 0 deletions gandalftest/server_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import (
"strings"
"testing"

"github.com/tsuru/gandalf/repository"
"gopkg.in/check.v1"
)

Expand Down Expand Up @@ -122,6 +123,48 @@ func (s *S) TestRemoveUserNotFound(c *check.C) {
c.Assert(recorder.Body.String(), check.Equals, "user not found\n")
}

func (s *S) TestCreateRepository(c *check.C) {
server, err := NewServer("127.0.0.1:0")
c.Assert(err, check.IsNil)
defer server.Stop()
server.users = []string{"user1", "user2", "user3"}
recorder := httptest.NewRecorder()
body := strings.NewReader(`{"Name":"myrepo","Users":["user1","user2"],"ReadOnlyUsers":["user3"],"IsPublic":true}`)
request, _ := http.NewRequest("POST", "/repository", body)
server.ServeHTTP(recorder, request)
c.Assert(recorder.Code, check.Equals, http.StatusOK)
c.Assert(server.repos, check.HasLen, 1)
c.Assert(server.repos[0].Name, check.Equals, "myrepo")
c.Assert(server.repos[0].Users, check.DeepEquals, []string{"user1", "user2"})
c.Assert(server.repos[0].ReadOnlyUsers, check.DeepEquals, []string{"user3"})
c.Assert(server.repos[0].IsPublic, check.Equals, true)
}

func (s *S) TestCreateRepositoryDuplicateName(c *check.C) {
server, err := NewServer("127.0.0.1:0")
c.Assert(err, check.IsNil)
defer server.Stop()
server.repos = []repository.Repository{{Name: "somerepo"}}
recorder := httptest.NewRecorder()
body := strings.NewReader(`{"Name":"somerepo","IsPublic":false}`)
request, _ := http.NewRequest("POST", "/repository", body)
server.ServeHTTP(recorder, request)
c.Assert(recorder.Code, check.Equals, http.StatusConflict)
c.Assert(recorder.Body.String(), check.Equals, "repository already exists\n")
}

func (s *S) TestCreateRepositoryUserNotFound(c *check.C) {
server, err := NewServer("127.0.0.1:0")
c.Assert(err, check.IsNil)
defer server.Stop()
recorder := httptest.NewRecorder()
body := strings.NewReader(`{"Name":"myrepo","Users":["user1","user2"],"ReadOnlyUsers":["user3"],"IsPublic":true}`)
request, _ := http.NewRequest("POST", "/repository", body)
server.ServeHTTP(recorder, request)
c.Assert(recorder.Code, check.Equals, http.StatusBadRequest)
c.Assert(recorder.Body.String(), check.Equals, `user "user1" 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 3c2acfc

Please sign in to comment.