Skip to content

Commit

Permalink
added unit tests to cover some new functionality
Browse files Browse the repository at this point in the history
  • Loading branch information
darklynx committed Jun 1, 2022
1 parent 433b254 commit 01cd268
Show file tree
Hide file tree
Showing 4 changed files with 89 additions and 13 deletions.
16 changes: 9 additions & 7 deletions config.go
Original file line number Diff line number Diff line change
Expand Up @@ -64,14 +64,8 @@ func CreateConfig() *ServerConfig {

var baskets arrayFlags
flag.Var(&baskets, "basket", "Name of a basket to auto-create during service startup (can be specified multiple times)")

flag.Parse()

pathPrefix := *prefix
if (len(pathPrefix) > 0) && (pathPrefix[0:1] != "/") {
pathPrefix = "/" + pathPrefix
}

var token = *masterToken
if len(token) == 0 {
token, _ = GenerateToken()
Expand All @@ -89,5 +83,13 @@ func CreateConfig() *ServerConfig {
DbFile: *dbFile,
DbConnection: *dbConnection,
Baskets: baskets,
PathPrefix: pathPrefix}
PathPrefix: normalizePrefix(*prefix)}
}

func normalizePrefix(prefix string) string {
if (len(prefix) > 0) && (prefix[0:1] != "/") {
return "/" + prefix
} else {
return prefix
}
}
8 changes: 8 additions & 0 deletions config_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,3 +28,11 @@ func TestArrayFlags(t *testing.T) {

assert.Equal(t, "123,abc,xyz,abc", flags.String(), "unexpected list of flags")
}

func TestNormalizePrefix(t *testing.T) {
assert.Empty(t, normalizePrefix(""), "expected empty prefix after normalization")
assert.Equal(t, "/xyz", normalizePrefix("/xyz"), "unexpected result of normalization")
assert.Equal(t, "/abc", normalizePrefix("abc"), "unexpected result of normalization")
assert.Equal(t, "/services/baskets", normalizePrefix("services/baskets"), "unexpected result of normalization")
assert.Equal(t, "/abc/def/ghi", normalizePrefix("/abc/def/ghi"), "unexpected result of normalization")
}
12 changes: 6 additions & 6 deletions handlers.go
Original file line number Diff line number Diff line change
Expand Up @@ -377,7 +377,7 @@ func WebBasketPage(w http.ResponseWriter, r *http.Request, ps httprouter.Params)

// AcceptBasketRequests accepts and handles HTTP requests passed to different baskets
func AcceptBasketRequests(w http.ResponseWriter, r *http.Request) {
name, publicErr, err := getBasketName(r)
name, publicErr, err := getBasketNameOfAcceptedRequest(r, pathPrefix)
if err != nil {
log.Printf("[error] %s", err)
http.Error(w, publicErr, http.StatusBadRequest)
Expand All @@ -401,13 +401,13 @@ func AcceptBasketRequests(w http.ResponseWriter, r *http.Request) {
}
}

func getBasketName(r *http.Request) (string, string, error) {
func getBasketNameOfAcceptedRequest(r *http.Request, prefix string) (string, string, error) {
path := r.URL.Path
if len(pathPrefix) > 0 {
if strings.HasPrefix(path, pathPrefix) {
path = strings.TrimPrefix(path, pathPrefix)
if len(prefix) > 0 {
if strings.HasPrefix(path, prefix) {
path = strings.TrimPrefix(path, prefix)
} else {
publicErr := "incoming request is outside of configured path prefix: " + pathPrefix
publicErr := "incoming request is outside of configured path prefix: " + prefix
return "", publicErr, fmt.Errorf("%s; request: %s %s", publicErr, r.Method, r.URL.Path)
}
}
Expand Down
66 changes: 66 additions & 0 deletions handlers_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1846,3 +1846,69 @@ func TestAcceptBasketRequests_WithProxyResponse_InternalServerError(t *testing.T
}
}
}

func TestGetBasketNameOfAcceptedRequest_NoPrefix_Valid(t *testing.T) {
r, err := http.NewRequest("GET", "http://localhost:55555/basket200", strings.NewReader(""))
if assert.NoError(t, err) {
name, pubErr, err := getBasketNameOfAcceptedRequest(r, "")
assert.Equal(t, "basket200", name, "unexpected basket name")
assert.Empty(t, pubErr)
assert.Nil(t, err)
}
}

func TestGetBasketNameOfAcceptedRequest_NoPrefix_ValidWithSubpath(t *testing.T) {
r, err := http.NewRequest("DELETE", "http://localhost:55555/basket210/api/users/123", strings.NewReader(""))
if assert.NoError(t, err) {
name, pubErr, err := getBasketNameOfAcceptedRequest(r, "")
assert.Equal(t, "basket210", name, "unexpected basket name")
assert.Empty(t, pubErr)
assert.Nil(t, err)
}
}

func TestGetBasketNameOfAcceptedRequest_NoPrefix_Invalid(t *testing.T) {
r, err := http.NewRequest("PUT", "http://localhost:55555/basket~220/objects/404", strings.NewReader("{}"))
if assert.NoError(t, err) {
name, pubErr, err := getBasketNameOfAcceptedRequest(r, "")
assert.Empty(t, name, "basket name is invalid, hence unexpected")
assert.Equal(t, pubErr, "invalid basket name; the name does not match pattern: "+basketNamePattern)
if assert.NotNil(t, err) {
assert.Equal(t, err.Error(), "invalid basket name; the name does not match pattern: "+
basketNamePattern+"; request: PUT /basket~220/objects/404")
}
}
}

func TestGetBasketNameOfAcceptedRequest_WithPrefix_Valid(t *testing.T) {
r, err := http.NewRequest("GET", "http://localhost:55555/abc/basket300", strings.NewReader(""))
if assert.NoError(t, err) {
name, pubErr, err := getBasketNameOfAcceptedRequest(r, "/abc")
assert.Equal(t, "basket300", name, "unexpected basket name")
assert.Empty(t, pubErr)
assert.Nil(t, err)
}
}

func TestGetBasketNameOfAcceptedRequest_WithPrefix_ValidWithSubpath(t *testing.T) {
r, err := http.NewRequest("PATCH", "http://localhost:55555/xyz/basket310/api/users/123", strings.NewReader("{}"))
if assert.NoError(t, err) {
name, pubErr, err := getBasketNameOfAcceptedRequest(r, "/xyz")
assert.Equal(t, "basket310", name, "unexpected basket name")
assert.Empty(t, pubErr)
assert.Nil(t, err)
}
}

func TestGetBasketNameOfAcceptedRequest_WithPrefix_OutsideOfContext(t *testing.T) {
r, err := http.NewRequest("POST", "http://localhost:55555/api/objects", strings.NewReader("{}"))
if assert.NoError(t, err) {
name, pubErr, err := getBasketNameOfAcceptedRequest(r, "/baskets")
assert.Empty(t, name, "URL is out of context, hence no basket name is expected")
assert.Equal(t, pubErr, "incoming request is outside of configured path prefix: /baskets")
if assert.NotNil(t, err) {
assert.Equal(t, err.Error(), "incoming request is outside of configured path prefix: /baskets"+
"; request: POST /api/objects")
}
}
}

0 comments on commit 01cd268

Please sign in to comment.