updated test/user tests

This commit is contained in:
Matthew R Kasun 2021-04-30 11:30:19 -04:00
parent 2e5511a0ab
commit c533bf7183
3 changed files with 45 additions and 33 deletions

View file

@ -50,13 +50,13 @@ func authenticateUser(response http.ResponseWriter, request *http.Request) {
jwt, err := VerifyAuthRequest(authRequest) jwt, err := VerifyAuthRequest(authRequest)
if err != nil { if err != nil {
errorResponse.Code = http.StatusBadRequest returnErrorResponse(response, request, formatError(err, "badrequest"))
errorResponse.Message = err.Error() return
returnErrorResponse(response, request, errorResponse)
} }
if jwt == "" { if jwt == "" {
returnErrorResponse(response, request, errorResponse) //very unlikely that err is !nil and no jwt returned, but handle it anyways.
returnErrorResponse(response, request, formatError(errors.New("No token returned"), "internal"))
return return
} }
@ -122,18 +122,13 @@ func VerifyAuthRequest(authRequest models.UserAuthParams) (string, error) {
//TODO: Consider better RBAC implementations //TODO: Consider better RBAC implementations
func authorizeUser(next http.Handler) http.HandlerFunc { func authorizeUser(next http.Handler) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) { return func(w http.ResponseWriter, r *http.Request) {
var errorResponse = models.ErrorResponse{
Code: http.StatusInternalServerError, Message: "W1R3: It's not you it's me.",
}
w.Header().Set("Content-Type", "application/json") w.Header().Set("Content-Type", "application/json")
//get the auth token //get the auth token
bearerToken := r.Header.Get("Authorization") bearerToken := r.Header.Get("Authorization")
err := ValidateToken(bearerToken) err := ValidateToken(bearerToken)
if err != nil { if err != nil {
returnErrorResponse(w, r, errorResponse) returnErrorResponse(w, r, formatError(err, "unauthorized"))
return return
} }
next.ServeHTTP(w, r) next.ServeHTTP(w, r)
@ -286,8 +281,9 @@ func createAdmin(w http.ResponseWriter, r *http.Request) {
_ = json.NewDecoder(r.Body).Decode(&admin) _ = json.NewDecoder(r.Body).Decode(&admin)
admin, err := CreateUser(admin) admin, err := CreateUser(admin)
if err != nil { if err != nil {
json.NewEncoder(w).Encode(err) returnErrorResponse(w, r, formatError(err, "badrequest"))
return return
} }
@ -377,7 +373,7 @@ func updateUser(w http.ResponseWriter, r *http.Request) {
user, err = UpdateUser(userchange, user) user, err = UpdateUser(userchange, user)
if err != nil { if err != nil {
json.NewEncoder(w).Encode(err) returnErrorResponse(w, r, formatError(err, "badrequest"))
return return
} }

View file

@ -31,7 +31,7 @@ func TestMain(m *testing.M) {
func TestHasAdmin(t *testing.T) { func TestHasAdmin(t *testing.T) {
_, err := DeleteUser("admin") _, err := DeleteUser("admin")
assert.Nil(t, err) assert.Nil(t, err)
user := models.User{"admin", "admin", true} user := models.User{"admin", "password", true}
_, err = CreateUser(user) _, err = CreateUser(user)
assert.Nil(t, err, err) assert.Nil(t, err, err)
t.Run("AdminExists", func(t *testing.T) { t.Run("AdminExists", func(t *testing.T) {
@ -49,7 +49,7 @@ func TestHasAdmin(t *testing.T) {
} }
func TestCreateUser(t *testing.T) { func TestCreateUser(t *testing.T) {
user := models.User{"admin", "admin", true} user := models.User{"admin", "password", true}
t.Run("NoUser", func(t *testing.T) { t.Run("NoUser", func(t *testing.T) {
_, err := DeleteUser("admin") _, err := DeleteUser("admin")
assert.Nil(t, err, err) assert.Nil(t, err, err)
@ -68,7 +68,7 @@ func TestDeleteUser(t *testing.T) {
hasadmin, err := HasAdmin() hasadmin, err := HasAdmin()
assert.Nil(t, err, err) assert.Nil(t, err, err)
if !hasadmin { if !hasadmin {
user := models.User{"admin", "admin", true} user := models.User{"admin", "pasword", true}
_, err := CreateUser(user) _, err := CreateUser(user)
assert.Nil(t, err, err) assert.Nil(t, err, err)
} }
@ -95,7 +95,7 @@ func TestValidateUser(t *testing.T) {
}) })
t.Run("ValidUpdate", func(t *testing.T) { t.Run("ValidUpdate", func(t *testing.T) {
user.UserName = "admin" user.UserName = "admin"
user.Password = "admin" user.Password = "password"
err := ValidateUser("update", user) err := ValidateUser("update", user)
assert.Nil(t, err, err) assert.Nil(t, err, err)
}) })
@ -122,10 +122,14 @@ func TestValidateUser(t *testing.T) {
} }
func TestGetUser(t *testing.T) { func TestGetUser(t *testing.T) {
user := models.User{"admin", "admin", true}
t.Run("UserExisits", func(t *testing.T) { t.Run("UserExisits", func(t *testing.T) {
_, err := CreateUser(user) user := models.User{"admin", "password", true}
hasadmin, err := HasAdmin()
assert.Nil(t, err, err) assert.Nil(t, err, err)
if !hasadmin {
_, err := CreateUser(user)
assert.Nil(t, err, err)
}
admin, err := GetUser("admin") admin, err := GetUser("admin")
assert.Nil(t, err, err) assert.Nil(t, err, err)
assert.Equal(t, user.UserName, admin.UserName) assert.Equal(t, user.UserName, admin.UserName)
@ -140,7 +144,7 @@ func TestGetUser(t *testing.T) {
} }
func TestUpdateUser(t *testing.T) { func TestUpdateUser(t *testing.T) {
user := models.User{"admin", "admin", true} user := models.User{"admin", "password", true}
newuser := models.User{"hello", "world", true} newuser := models.User{"hello", "world", true}
t.Run("UserExisits", func(t *testing.T) { t.Run("UserExisits", func(t *testing.T) {
_, err := DeleteUser("admin") _, err := DeleteUser("admin")
@ -220,7 +224,7 @@ func TestVerifyAuthRequest(t *testing.T) {
}) })
t.Run("WrongPassword", func(t *testing.T) { t.Run("WrongPassword", func(t *testing.T) {
_, err := DeleteUser("admin") _, err := DeleteUser("admin")
user := models.User{"admin", "admin", true} user := models.User{"admin", "password", true}
_, err = CreateUser(user) _, err = CreateUser(user)
assert.Nil(t, err) assert.Nil(t, err)
authRequest := models.UserAuthParams{"admin", "badpass"} authRequest := models.UserAuthParams{"admin", "badpass"}
@ -230,7 +234,7 @@ func TestVerifyAuthRequest(t *testing.T) {
assert.Equal(t, "Wrong Password", err.Error()) assert.Equal(t, "Wrong Password", err.Error())
}) })
t.Run("Success", func(t *testing.T) { t.Run("Success", func(t *testing.T) {
authRequest := models.UserAuthParams{"admin", "admin"} authRequest := models.UserAuthParams{"admin", "password"}
jwt, err := VerifyAuthRequest(authRequest) jwt, err := VerifyAuthRequest(authRequest)
assert.Nil(t, err, err) assert.Nil(t, err, err)
assert.NotNil(t, jwt) assert.NotNil(t, jwt)

View file

@ -2,6 +2,7 @@ package main
import ( import (
"encoding/json" "encoding/json"
"io/ioutil"
"net/http" "net/http"
"testing" "testing"
@ -38,11 +39,9 @@ func TestAdminCreation(t *testing.T) {
var message models.ErrorResponse var message models.ErrorResponse
err = json.NewDecoder(response.Body).Decode(&message) err = json.NewDecoder(response.Body).Decode(&message)
assert.Nil(t, err, err) assert.Nil(t, err, err)
assert.Equal(t, http.StatusUnauthorized, response.StatusCode) assert.Equal(t, http.StatusBadRequest, response.StatusCode)
assert.Equal(t, http.StatusUnauthorized, message.Code) assert.Equal(t, "Admin already Exists", message.Message)
assert.Equal(t, "W1R3: Admin already exists! ", message.Message)
}) })
} }
func TestGetUser(t *testing.T) { func TestGetUser(t *testing.T) {
@ -70,12 +69,13 @@ func TestGetUser(t *testing.T) {
assert.Nil(t, err, err) assert.Nil(t, err, err)
assert.Equal(t, http.StatusUnauthorized, response.StatusCode) assert.Equal(t, http.StatusUnauthorized, response.StatusCode)
assert.Equal(t, http.StatusUnauthorized, message.Code) assert.Equal(t, http.StatusUnauthorized, message.Code)
assert.Equal(t, "W1R3: Error Verifying Auth Token.", message.Message) assert.Equal(t, "Error Verifying Auth Token", message.Message)
}) })
} }
func TestUpdateUser(t *testing.T) { func TestUpdateUser(t *testing.T) {
deleteAdmin(t)
if !adminExists(t) { if !adminExists(t) {
addAdmin(t) addAdmin(t)
} }
@ -92,7 +92,7 @@ func TestUpdateUser(t *testing.T) {
defer response.Body.Close() defer response.Body.Close()
err = json.NewDecoder(response.Body).Decode(&message) err = json.NewDecoder(response.Body).Decode(&message)
assert.Nil(t, err, err) assert.Nil(t, err, err)
assert.Equal(t, "W1R3: Error Verifying Auth Token.", message.Message) assert.Equal(t, "Error Verifying Auth Token", message.Message)
assert.Equal(t, http.StatusUnauthorized, response.StatusCode) assert.Equal(t, http.StatusUnauthorized, response.StatusCode)
}) })
t.Run("UpdateSuccess", func(t *testing.T) { t.Run("UpdateSuccess", func(t *testing.T) {
@ -107,6 +107,18 @@ func TestUpdateUser(t *testing.T) {
assert.Equal(t, true, user.IsAdmin) assert.Equal(t, true, user.IsAdmin)
assert.Equal(t, http.StatusOK, response.StatusCode) assert.Equal(t, http.StatusOK, response.StatusCode)
}) })
t.Run("ShortPassword", func(t *testing.T) {
admin.UserName = "user"
admin.Password = "123"
response, err := api(t, admin, http.MethodPut, "http://localhost:8081/api/users/admin", token)
assert.Nil(t, err, err)
defer response.Body.Close()
message, err := ioutil.ReadAll(response.Body)
assert.Nil(t, err, err)
assert.Contains(t, string(message), "Field validation for 'Password' failed")
assert.Equal(t, http.StatusBadRequest, response.StatusCode)
})
} }
func TestDeleteUser(t *testing.T) { func TestDeleteUser(t *testing.T) {
@ -123,7 +135,7 @@ func TestDeleteUser(t *testing.T) {
assert.Equal(t, http.StatusUnauthorized, response.StatusCode) assert.Equal(t, http.StatusUnauthorized, response.StatusCode)
var message models.ErrorResponse var message models.ErrorResponse
json.NewDecoder(response.Body).Decode(&message) json.NewDecoder(response.Body).Decode(&message)
assert.Equal(t, "W1R3: Error Verifying Auth Token.", message.Message) assert.Equal(t, "Error Verifying Auth Token", message.Message)
assert.Equal(t, http.StatusUnauthorized, response.StatusCode) assert.Equal(t, http.StatusUnauthorized, response.StatusCode)
}) })
t.Run("DeleteUser-ValidCredentials", func(t *testing.T) { t.Run("DeleteUser-ValidCredentials", func(t *testing.T) {
@ -155,7 +167,7 @@ func TestAuthenticateUser(t *testing.T) {
password: "password", password: "password",
code: http.StatusBadRequest, code: http.StatusBadRequest,
tokenExpected: false, tokenExpected: false,
errMessage: "W1R3: User invaliduser not found.", errMessage: "User invaliduser not found",
}, },
AuthorizeTestCase{ AuthorizeTestCase{
testname: "empty user", testname: "empty user",
@ -163,7 +175,7 @@ func TestAuthenticateUser(t *testing.T) {
password: "password", password: "password",
code: http.StatusBadRequest, code: http.StatusBadRequest,
tokenExpected: false, tokenExpected: false,
errMessage: "W1R3: Username can't be empty", errMessage: "Username can't be empty",
}, },
AuthorizeTestCase{ AuthorizeTestCase{
testname: "empty password", testname: "empty password",
@ -171,15 +183,15 @@ func TestAuthenticateUser(t *testing.T) {
password: "", password: "",
code: http.StatusBadRequest, code: http.StatusBadRequest,
tokenExpected: false, tokenExpected: false,
errMessage: "W1R3: Password can't be empty", errMessage: "Password can't be empty",
}, },
AuthorizeTestCase{ AuthorizeTestCase{
testname: "Invalid Password", testname: "Invalid Password",
name: "admin", name: "admin",
password: "xxxxxxx", password: "xxxxxxx",
code: http.StatusUnauthorized, code: http.StatusBadRequest,
tokenExpected: false, tokenExpected: false,
errMessage: "W1R3: Wrong Password.", errMessage: "Wrong Password",
}, },
AuthorizeTestCase{ AuthorizeTestCase{
testname: "Valid User", testname: "Valid User",