mirror of
https://github.com/gravitl/netmaker.git
synced 2024-11-10 17:48:25 +08:00
everying is there, still some issues with DeleteUser
This commit is contained in:
parent
0646ab47f8
commit
06a60e8163
1 changed files with 140 additions and 168 deletions
308
user_test.go
308
user_test.go
|
@ -3,40 +3,33 @@ package main
|
|||
import (
|
||||
"bytes"
|
||||
"encoding/json"
|
||||
"io/ioutil"
|
||||
"net/http"
|
||||
"os"
|
||||
"sync"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/chromedp/cdproto/database"
|
||||
controller "github.com/gravitl/netmaker/controllers"
|
||||
"github.com/gravitl/netmaker/models"
|
||||
"github.com/gravitl/netmaker/mongoconn"
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
//change this --- there is an existing type
|
||||
type AuthorizationResponse struct {
|
||||
Username string
|
||||
AuthToken string
|
||||
}
|
||||
|
||||
type databaseError struct {
|
||||
Inner *int
|
||||
Errors int
|
||||
}
|
||||
|
||||
type goodResponse struct {
|
||||
//should be use models.SuccessResponse and models.SuccessfulUserLoginResponse
|
||||
//rather than creating new type but having trouble decoding that way
|
||||
type Auth struct {
|
||||
Username string
|
||||
AuthToken string
|
||||
}
|
||||
type Success struct {
|
||||
Code int
|
||||
Message string
|
||||
Response AuthorizationResponse
|
||||
}
|
||||
|
||||
type badResponse struct {
|
||||
Code int
|
||||
Message string
|
||||
Response Auth
|
||||
}
|
||||
|
||||
type AuthorizeTestCase struct {
|
||||
|
@ -54,7 +47,7 @@ func TestMain(m *testing.M) {
|
|||
waitgroup.Add(1)
|
||||
go controller.HandleRESTRequests(&waitgroup)
|
||||
//wait for http server to start
|
||||
time.Sleep(time.Second * 1)
|
||||
time.Sleep(time.Second * 30)
|
||||
os.Exit(m.Run())
|
||||
}
|
||||
|
||||
|
@ -66,82 +59,53 @@ func TestUsers(t *testing.T) {
|
|||
// })
|
||||
}
|
||||
func TestAdminCreation(t *testing.T) {
|
||||
t.Skip()
|
||||
var admin, user models.User
|
||||
var admin models.UserAuthParams
|
||||
var user models.User
|
||||
admin.UserName = "admin"
|
||||
admin.Password = "password"
|
||||
if !adminExists(t) {
|
||||
t.Run("AdminCreationValid", func(t *testing.T) {
|
||||
response, err := api(t, admin, http.MethodPost, "http://localhost:8081/users/createadmin", "")
|
||||
assert.NotNil(t, err, "create admin")
|
||||
if err != nil {
|
||||
t.Fatal("....")
|
||||
}
|
||||
defer response.Body.Close()
|
||||
json.NewDecoder(response.Body).Decode(&user)
|
||||
assert.Equal(t, admin.UserName, user.UserName)
|
||||
assert.Equal(t, true, user.IsAdmin)
|
||||
assert.Equal(t, http.StatusOK, response.StatusCode)
|
||||
assert.True(t, adminExists(t), "Admin creation failed")
|
||||
})
|
||||
t.Run("AdminCreationInvalid", func(t *testing.T) {
|
||||
response, err := api(t, admin, http.MethodPost, "http://localhost:8081/users/createadmin", "")
|
||||
if err != nil {
|
||||
t.Error("error calling createadmin", err)
|
||||
}
|
||||
defer response.Body.Close()
|
||||
var message badResponse
|
||||
json.NewDecoder(response.Body).Decode(&message)
|
||||
assert.Equal(t, http.StatusUnauthorized, response.StatusCode)
|
||||
assert.Equal(t, http.StatusUnauthorized, message.Code)
|
||||
assert.Equal(t, "W1R3: Admin already exists! ", message.Message)
|
||||
})
|
||||
} else {
|
||||
t.Run("AdminCreationInvalid", func(t *testing.T) {
|
||||
response, err := api(t, admin, http.MethodPost, "http://localhost:8081/users/createadmin", "")
|
||||
assert.NotNil(t, err, "createadmin")
|
||||
defer response.Body.Close()
|
||||
var message badResponse
|
||||
json.NewDecoder(response.Body).Decode(&message)
|
||||
assert.Equal(t, http.StatusUnauthorized, response.StatusCode)
|
||||
assert.Equal(t, http.StatusUnauthorized, message.Code)
|
||||
assert.Equal(t, "W1R3: Admin already exists! ", message.Message)
|
||||
})
|
||||
//deleteAdmin()
|
||||
t.Run("Admin Creation - Valid", func(t *testing.T) {
|
||||
t.Skip()
|
||||
response, err := api(t, admin, http.MethodPost, "http://localhost:8081/users/createadmin", "")
|
||||
if err != nil {
|
||||
t.Error("error calling createadmin", err)
|
||||
}
|
||||
defer response.Body.Close()
|
||||
json.NewDecoder(response.Body).Decode(&user)
|
||||
assert.Equal(t, admin.UserName, user.UserName)
|
||||
assert.Equal(t, true, user.IsAdmin)
|
||||
assert.Equal(t, http.StatusOK, response.StatusCode)
|
||||
assert.True(t, adminExists(t), "Admin creation failed")
|
||||
})
|
||||
}
|
||||
t.Run("AdminCreationSuccess", func(t *testing.T) {
|
||||
if adminExists(t) {
|
||||
deleteAdmin(t)
|
||||
}
|
||||
response, err := api(t, admin, http.MethodPost, "http://localhost:8081/users/createadmin", "")
|
||||
assert.Nil(t, err, err)
|
||||
defer response.Body.Close()
|
||||
err = json.NewDecoder(response.Body).Decode(&user)
|
||||
assert.Nil(t, err, err)
|
||||
assert.Equal(t, admin.UserName, user.UserName)
|
||||
assert.Equal(t, true, user.IsAdmin)
|
||||
assert.Equal(t, http.StatusOK, response.StatusCode)
|
||||
assert.True(t, adminExists(t), "Admin creation failed")
|
||||
})
|
||||
t.Run("AdminCreationFailure", func(t *testing.T) {
|
||||
if !adminExists(t) {
|
||||
addAdmin(t)
|
||||
}
|
||||
response, err := api(t, admin, http.MethodPost, "http://localhost:8081/users/createadmin", "")
|
||||
assert.Nil(t, err, err)
|
||||
defer response.Body.Close()
|
||||
var message models.ErrorResponse
|
||||
err = json.NewDecoder(response.Body).Decode(&message)
|
||||
assert.Nil(t, err, err)
|
||||
assert.Equal(t, http.StatusUnauthorized, response.StatusCode)
|
||||
assert.Equal(t, http.StatusUnauthorized, message.Code)
|
||||
assert.Equal(t, "W1R3: Admin already exists! ", message.Message)
|
||||
})
|
||||
|
||||
}
|
||||
|
||||
func TestGetUser(t *testing.T) {
|
||||
|
||||
t.Skip()
|
||||
//ensure admin exists
|
||||
if !adminExists(t) {
|
||||
t.Error("admin account does not exist")
|
||||
return
|
||||
addAdmin(t)
|
||||
}
|
||||
//authenticate
|
||||
t.Run("GetUser ValidToken", func(t *testing.T) {
|
||||
t.Run("GetUserWithValidToken", func(t *testing.T) {
|
||||
token, err := authenticate(t)
|
||||
if err != nil {
|
||||
t.Error("could not authenticate")
|
||||
}
|
||||
assert.Nil(t, err, err)
|
||||
response, err := api(t, "", http.MethodGet, "http://localhost:8081/users/admin", token)
|
||||
if err != nil {
|
||||
t.Error("could not get user")
|
||||
}
|
||||
assert.Nil(t, err, err)
|
||||
defer response.Body.Close()
|
||||
var user models.User
|
||||
json.NewDecoder(response.Body).Decode(&user)
|
||||
|
@ -149,71 +113,63 @@ func TestGetUser(t *testing.T) {
|
|||
assert.Equal(t, "admin", user.UserName)
|
||||
assert.Equal(t, true, user.IsAdmin)
|
||||
})
|
||||
t.Run("GetUser InvalidToken", func(t *testing.T) {
|
||||
t.Run("GetUserWithInvalidToken", func(t *testing.T) {
|
||||
//skip until sort out what should be returned
|
||||
t.Skip()
|
||||
response, err := api(t, "", http.MethodGet, "http://localhost:8081/users/admin", "xxxx")
|
||||
if err != nil {
|
||||
t.Error("error getting user")
|
||||
}
|
||||
response, err := api(t, "", http.MethodGet, "http://localhost:8081/users/admin", "secretkey")
|
||||
assert.Nil(t, err, err)
|
||||
defer response.Body.Close()
|
||||
///not sure what this should be
|
||||
var something string
|
||||
json.NewDecoder(response.Body).Decode(something)
|
||||
assert.Equal(t, "Some error message", something)
|
||||
t.Log(response.Body)
|
||||
//var something string
|
||||
|
||||
//json.NewDecoder(response.Body).Decode(something)
|
||||
//assert.Equal(t, "Some error message", something)
|
||||
})
|
||||
}
|
||||
|
||||
func TestUpdateUser(t *testing.T) {
|
||||
t.Skip()
|
||||
if !adminExists(t) {
|
||||
addAdmin(t)
|
||||
}
|
||||
//token, err := authenticate(t)
|
||||
//if err != nil {
|
||||
// t.Error("could not authenticate")
|
||||
//}
|
||||
|
||||
var admin, user models.User
|
||||
admin.UserName = "admin"
|
||||
admin.Password = "admin"
|
||||
|
||||
//payload := map[string]string{"username": "admin", "password": "admin"}
|
||||
payload, _ := json.Marshal(admin)
|
||||
request, err := http.NewRequest(http.MethodPut, "http://localhost:8081/users/admin", bytes.NewBuffer(payload))
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
request.Header.Set("Authorization", "Bearer secretkey")
|
||||
request.Header.Set("Content-Type", "application/json")
|
||||
client := &http.Client{}
|
||||
response, err := client.Do(request)
|
||||
if err != nil {
|
||||
t.Error("error calling createadmin", err)
|
||||
}
|
||||
defer response.Body.Close()
|
||||
body, _ := ioutil.ReadAll(response.Body)
|
||||
t.Log(string(body))
|
||||
_ = json.Unmarshal(body, &user)
|
||||
assert.Equal(t, admin.UserName, user.UserName)
|
||||
assert.Equal(t, true, user.IsAdmin)
|
||||
assert.Equal(t, http.StatusOK, response.StatusCode)
|
||||
}
|
||||
|
||||
func TestDeleteUser(t *testing.T) {
|
||||
expectedError := databaseError{
|
||||
Inner: nil,
|
||||
Errors: 1,
|
||||
}
|
||||
|
||||
if !adminExists(t) {
|
||||
addAdmin(t)
|
||||
}
|
||||
token, err := authenticate(t)
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
assert.Nil(t, err, err)
|
||||
var admin models.UserAuthParams
|
||||
var user models.User
|
||||
var message models.ErrorResponse
|
||||
t.Run("UpdateWrongToken", func(t *testing.T) {
|
||||
admin.UserName = "admin"
|
||||
admin.Password = "admin"
|
||||
response, err := api(t, admin, http.MethodPut, "http://localhost:8081/users/admin", "secretkey")
|
||||
assert.Nil(t, err, err)
|
||||
defer response.Body.Close()
|
||||
err = json.NewDecoder(response.Body).Decode(&message)
|
||||
assert.Nil(t, err, err)
|
||||
assert.Equal(t, "W1R3: Error Verifying Auth Token.", message.Message)
|
||||
assert.Equal(t, http.StatusUnauthorized, response.StatusCode)
|
||||
})
|
||||
t.Run("UpdateSuccess", func(t *testing.T) {
|
||||
admin.UserName = "admin"
|
||||
admin.Password = "password"
|
||||
response, err := api(t, admin, http.MethodPut, "http://localhost:8081/users/admin", token)
|
||||
assert.Nil(t, err, err)
|
||||
defer response.Body.Close()
|
||||
err = json.NewDecoder(response.Body).Decode(&user)
|
||||
assert.Nil(t, err, err)
|
||||
assert.Equal(t, admin.UserName, user.UserName)
|
||||
assert.Equal(t, true, user.IsAdmin)
|
||||
assert.Equal(t, http.StatusOK, response.StatusCode)
|
||||
})
|
||||
|
||||
}
|
||||
|
||||
func TestDeleteUser(t *testing.T) {
|
||||
if !adminExists(t) {
|
||||
addAdmin(t)
|
||||
}
|
||||
token, err := authenticate(t)
|
||||
assert.Nil(t, err, err)
|
||||
t.Run("DeleteUser-WongAdmin", func(t *testing.T) {
|
||||
//skip for now ... shouldn't panic
|
||||
t.Skip()
|
||||
function := func() {
|
||||
_, _ = api(t, "", http.MethodDelete, "http://localhost:8081/users/xxxx", token)
|
||||
|
@ -222,33 +178,29 @@ func TestDeleteUser(t *testing.T) {
|
|||
})
|
||||
t.Run("DeleteUser-InvalidCredentials", func(t *testing.T) {
|
||||
response, err := api(t, "", http.MethodDelete, "http://localhost:8081/users/admin", "secretkey")
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
var body database.Error
|
||||
json.NewDecoder(response.Body).Decode(body)
|
||||
assert.Equal(t, expectedError, body)
|
||||
assert.Nil(t, err, err)
|
||||
var message models.ErrorResponse
|
||||
json.NewDecoder(response.Body).Decode(message)
|
||||
assert.Equal(t, "W1R3: Error Verifying Auth Token.", message.Message)
|
||||
assert.Equal(t, http.StatusUnauthorized, response.StatusCode)
|
||||
})
|
||||
t.Run("DeleteUser-ValidCredentials", func(t *testing.T) {
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
response, err := api(t, "", http.MethodDelete, "http://localhost:8081/users/admin", token)
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
assert.Nil(t, err, err)
|
||||
var body string
|
||||
json.NewDecoder(response.Body).Decode(body)
|
||||
assert.Equal(t, "admin deleted.", body)
|
||||
assert.Equal(t, http.StatusOK, response.StatusCode)
|
||||
})
|
||||
t.Run("DeletUser-NoAdmin", func(t *testing.T) {
|
||||
//skip for now ... shouldn't panic
|
||||
t.Skip()
|
||||
function := func() {
|
||||
_, _ = api(t, "", http.MethodDelete, "http://localhost:8081/users/admin", token)
|
||||
}
|
||||
assert.Panics(t, function, "")
|
||||
})
|
||||
addAdmin(t)
|
||||
}
|
||||
|
||||
func TestAuthenticateUser(t *testing.T) {
|
||||
|
@ -259,7 +211,7 @@ func TestAuthenticateUser(t *testing.T) {
|
|||
password: "password",
|
||||
code: http.StatusBadRequest,
|
||||
tokenExpected: false,
|
||||
errMessage: "W1R3: It's not you it's me.",
|
||||
errMessage: "W1R3: User invaliduser not found.",
|
||||
},
|
||||
AuthorizeTestCase{
|
||||
testname: "empty user",
|
||||
|
@ -281,9 +233,9 @@ func TestAuthenticateUser(t *testing.T) {
|
|||
testname: "Invalid Passord",
|
||||
name: "admin",
|
||||
password: "xxxxxxx",
|
||||
code: http.StatusBadRequest,
|
||||
code: http.StatusUnauthorized,
|
||||
tokenExpected: false,
|
||||
errMessage: "W1R3: It's not you it's me.",
|
||||
errMessage: "W1R3: Wrong Password.",
|
||||
},
|
||||
AuthorizeTestCase{
|
||||
testname: "Valid User",
|
||||
|
@ -305,16 +257,18 @@ func TestAuthenticateUser(t *testing.T) {
|
|||
admin.Password = tc.password
|
||||
response, err := api(t, admin, http.MethodPost, "http://localhost:8081/users/authenticate", "secretkey")
|
||||
assert.Nil(t, err, err)
|
||||
defer response.Body.Close()
|
||||
if tc.tokenExpected {
|
||||
var body goodResponse
|
||||
json.NewDecoder(response.Body).Decode(&body)
|
||||
var body Success
|
||||
err = json.NewDecoder(response.Body).Decode(&body)
|
||||
assert.Nil(t, err, err)
|
||||
assert.NotEmpty(t, body.Response.AuthToken, "token not returned")
|
||||
assert.Equal(t, "W1R3: Device admin Authorized", body.Message)
|
||||
} //else {
|
||||
// var bad badResponse
|
||||
// json.NewDecoder(response.Body).Decode(&bad)
|
||||
// assert.Equal(t, tc.errMessage, bad.Message)
|
||||
//}
|
||||
} else {
|
||||
var bad models.ErrorResponse
|
||||
json.NewDecoder(response.Body).Decode(&bad)
|
||||
assert.Equal(t, tc.errMessage, bad.Message)
|
||||
}
|
||||
assert.Equal(t, tc.code, response.StatusCode)
|
||||
})
|
||||
}
|
||||
|
@ -331,13 +285,18 @@ func adminExists(t *testing.T) bool {
|
|||
}
|
||||
|
||||
func api(t *testing.T, data interface{}, method, url, authorization string) (*http.Response, error) {
|
||||
payload, err := json.Marshal(data)
|
||||
assert.Nil(t, err, err)
|
||||
return nil, err
|
||||
request, err := http.NewRequest(method, url, bytes.NewBuffer(payload))
|
||||
assert.Nil(t, err, err)
|
||||
return nil, err
|
||||
request.Header.Set("Content-Type", "application/json")
|
||||
var request *http.Request
|
||||
var err error
|
||||
if data != "" {
|
||||
payload, err := json.Marshal(data)
|
||||
assert.Nil(t, err, err)
|
||||
request, err = http.NewRequest(method, url, bytes.NewBuffer(payload))
|
||||
assert.Nil(t, err, err)
|
||||
request.Header.Set("Content-Type", "application/json")
|
||||
} else {
|
||||
request, err = http.NewRequest(method, url, nil)
|
||||
assert.Nil(t, err, err)
|
||||
}
|
||||
if authorization != "" {
|
||||
request.Header.Set("Authorization", "Bearer "+authorization)
|
||||
}
|
||||
|
@ -351,8 +310,7 @@ func addAdmin(t *testing.T) {
|
|||
admin.Password = "password"
|
||||
response, err := api(t, admin, http.MethodPost, "http://localhost:8081/users/createadmin", "secretkey")
|
||||
assert.Nil(t, err, err)
|
||||
t.Log(response)
|
||||
//assert.Equal(t, http.StatusOK, response.StatusCode)
|
||||
assert.Equal(t, http.StatusOK, response.StatusCode)
|
||||
}
|
||||
|
||||
func authenticate(t *testing.T) (string, error) {
|
||||
|
@ -360,9 +318,23 @@ func authenticate(t *testing.T) (string, error) {
|
|||
admin.UserName = "admin"
|
||||
admin.Password = "password"
|
||||
response, err := api(t, admin, http.MethodPost, "http://localhost:8081/users/authenticate", "secretkey")
|
||||
assert.NotNil(t, err, "authenticate")
|
||||
var body goodResponse
|
||||
json.NewDecoder(response.Body).Decode(&body)
|
||||
token := body.Response.AuthToken
|
||||
return token, nil
|
||||
assert.Nil(t, err, err)
|
||||
|
||||
var body Success
|
||||
err = json.NewDecoder(response.Body).Decode(&body)
|
||||
assert.Nil(t, err, err)
|
||||
assert.NotEmpty(t, body.Response.AuthToken, "token not returned")
|
||||
assert.Equal(t, "W1R3: Device admin Authorized", body.Message)
|
||||
|
||||
return body.Response.AuthToken, nil
|
||||
}
|
||||
|
||||
func deleteAdmin(t *testing.T) {
|
||||
if !adminExists(t) {
|
||||
return
|
||||
}
|
||||
token, err := authenticate(t)
|
||||
assert.Nil(t, err, err)
|
||||
_, err = api(t, "", http.MethodDelete, "http://localhost:8081/users/admin", token)
|
||||
assert.Nil(t, err, err)
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue