From 1ec11c175a61685f2ddadd15a7615d34b1d61152 Mon Sep 17 00:00:00 2001 From: Andy Wang Date: Sun, 18 Oct 2020 21:21:51 +0100 Subject: [PATCH] POST to /admin/users/{UID} will POST json string directly, rather than being encoded in FormData --- internal/server/usermanager/api_router.go | 7 +-- .../server/usermanager/api_router_test.go | 47 ++++++++++++++++ .../server/usermanager/localmanager_test.go | 56 +++++++------------ 3 files changed, 69 insertions(+), 41 deletions(-) create mode 100644 internal/server/usermanager/api_router_test.go diff --git a/internal/server/usermanager/api_router.go b/internal/server/usermanager/api_router.go index d27e7e9..bd85173 100644 --- a/internal/server/usermanager/api_router.go +++ b/internal/server/usermanager/api_router.go @@ -92,13 +92,8 @@ func (ar *APIRouter) writeUserInfoHlr(w http.ResponseWriter, r *http.Request) { return } - jsonUinfo := r.FormValue("UserInfo") - if jsonUinfo == "" { - http.Error(w, "UserInfo cannot be empty", http.StatusBadRequest) - return - } var uinfo UserInfo - err = json.Unmarshal([]byte(jsonUinfo), &uinfo) + err = json.NewDecoder(r.Body).Decode(&uinfo) if err != nil { http.Error(w, err.Error(), http.StatusBadRequest) return diff --git a/internal/server/usermanager/api_router_test.go b/internal/server/usermanager/api_router_test.go new file mode 100644 index 0000000..4444333 --- /dev/null +++ b/internal/server/usermanager/api_router_test.go @@ -0,0 +1,47 @@ +package usermanager + +import ( + "bytes" + "encoding/base64" + "encoding/json" + "io/ioutil" + "net/http" + "net/http/httptest" + "os" + "testing" +) + +var mockUIDb64 = base64.StdEncoding.EncodeToString(mockUID) + +func makeRouter(t *testing.T) (router *APIRouter, cleaner func()) { + var tmpDB, _ = ioutil.TempFile("", "ck_user_info") + cleaner = func() { os.Remove(tmpDB.Name()) } + mgr, err := MakeLocalManager(tmpDB.Name(), mockWorldState) + if err != nil { + t.Fatal(err) + } + router = APIRouterOf(mgr) + return router, cleaner +} + +func TestWriteUserInfoHlr(t *testing.T) { + router, cleaner := makeRouter(t) + defer cleaner() + rr := httptest.NewRecorder() + + marshalled, err := json.Marshal(mockUserInfo) + if err != nil { + t.Fatal(err) + } + + req, err := http.NewRequest("POST", "/admin/users/"+mockUIDb64, bytes.NewBuffer(marshalled)) + if err != nil { + t.Fatal(err) + } + router.ServeHTTP(rr, req) + + if status := rr.Code; status != http.StatusCreated { + t.Errorf("handler returned wrong status code: got %v with body %v, want %v", + status, rr.Body, http.StatusCreated) + } +} diff --git a/internal/server/usermanager/localmanager_test.go b/internal/server/usermanager/localmanager_test.go index 6c58d41..9e9370b 100644 --- a/internal/server/usermanager/localmanager_test.go +++ b/internal/server/usermanager/localmanager_test.go @@ -25,28 +25,29 @@ var mockUserInfo = UserInfo{ ExpiryTime: 100, } -func TestLocalManager_WriteUserInfo(t *testing.T) { +func makeManager(t *testing.T) (mgr *localManager, cleaner func()) { var tmpDB, _ = ioutil.TempFile("", "ck_user_info") - defer os.Remove(tmpDB.Name()) + cleaner = func() { os.Remove(tmpDB.Name()) } mgr, err := MakeLocalManager(tmpDB.Name(), mockWorldState) if err != nil { t.Fatal(err) } + return mgr, cleaner +} - err = mgr.WriteUserInfo(mockUserInfo) +func TestLocalManager_WriteUserInfo(t *testing.T) { + mgr, cleaner := makeManager(t) + defer cleaner() + err := mgr.WriteUserInfo(mockUserInfo) if err != nil { t.Error(err) } } func TestLocalManager_GetUserInfo(t *testing.T) { - var tmpDB, _ = ioutil.TempFile("", "ck_user_info") - defer os.Remove(tmpDB.Name()) - mgr, err := MakeLocalManager(tmpDB.Name(), mockWorldState) - if err != nil { - t.Fatal(err) - } + mgr, cleaner := makeManager(t) + defer cleaner() t.Run("simple fetch", func(t *testing.T) { _ = mgr.WriteUserInfo(mockUserInfo) @@ -64,7 +65,7 @@ func TestLocalManager_GetUserInfo(t *testing.T) { updatedUserInfo := mockUserInfo updatedUserInfo.SessionsCap = mockUserInfo.SessionsCap + 1 - err = mgr.WriteUserInfo(updatedUserInfo) + err := mgr.WriteUserInfo(updatedUserInfo) if err != nil { t.Error(err) } @@ -87,15 +88,11 @@ func TestLocalManager_GetUserInfo(t *testing.T) { } func TestLocalManager_DeleteUser(t *testing.T) { - var tmpDB, _ = ioutil.TempFile("", "ck_user_info") - defer os.Remove(tmpDB.Name()) - mgr, err := MakeLocalManager(tmpDB.Name(), mockWorldState) - if err != nil { - t.Fatal(err) - } + mgr, cleaner := makeManager(t) + defer cleaner() _ = mgr.WriteUserInfo(mockUserInfo) - err = mgr.DeleteUser(mockUID) + err := mgr.DeleteUser(mockUID) if err != nil { t.Error(err) } @@ -169,12 +166,8 @@ func TestLocalManager_AuthenticateUser(t *testing.T) { } func TestLocalManager_AuthoriseNewSession(t *testing.T) { - var tmpDB, _ = ioutil.TempFile("", "ck_user_info") - defer os.Remove(tmpDB.Name()) - mgr, err := MakeLocalManager(tmpDB.Name(), mockWorldState) - if err != nil { - t.Fatal(err) - } + mgr, cleaner := makeManager(t) + defer cleaner() t.Run("normal auth", func(t *testing.T) { _ = mgr.WriteUserInfo(validUserInfo) @@ -212,12 +205,9 @@ func TestLocalManager_AuthoriseNewSession(t *testing.T) { } func TestLocalManager_UploadStatus(t *testing.T) { - var tmpDB, _ = ioutil.TempFile("", "ck_user_info") - defer os.Remove(tmpDB.Name()) - mgr, err := MakeLocalManager(tmpDB.Name(), mockWorldState) - if err != nil { - t.Fatal(err) - } + mgr, cleaner := makeManager(t) + defer cleaner() + t.Run("simple update", func(t *testing.T) { _ = mgr.WriteUserInfo(validUserInfo) @@ -318,12 +308,8 @@ func TestLocalManager_UploadStatus(t *testing.T) { } func TestLocalManager_ListAllUsers(t *testing.T) { - var tmpDB, _ = ioutil.TempFile("", "ck_user_info") - defer os.Remove(tmpDB.Name()) - mgr, err := MakeLocalManager(tmpDB.Name(), mockWorldState) - if err != nil { - t.Fatal(err) - } + mgr, cleaner := makeManager(t) + defer cleaner() var wg sync.WaitGroup var users []UserInfo