From 4bbb6eee8830a9ed240e110e11697350502ad3df Mon Sep 17 00:00:00 2001 From: Samir Jafferali Date: Tue, 17 Oct 2023 16:23:47 -0700 Subject: [PATCH] Add user tests (#51) * Add more user tests * Add more user tests * Add linebreaks * Test error conditions * Dont overwrite err * Test error conditions for methods with no output * Actually return errors * Add linebreaks --- pfsenseapi/testdata/addprivilegestouser.json | 9 + pfsenseapi/testdata/addusertogroups.json | 9 + pfsenseapi/testdata/badjson.json | 6 + pfsenseapi/testdata/createuser.json | 18 ++ pfsenseapi/testdata/error.json | 7 + pfsenseapi/user.go | 4 +- pfsenseapi/user_test.go | 224 ++++++++++++++++++- pfsenseapi/utils_test.go | 44 ++++ 8 files changed, 311 insertions(+), 10 deletions(-) create mode 100644 pfsenseapi/testdata/addprivilegestouser.json create mode 100644 pfsenseapi/testdata/addusertogroups.json create mode 100644 pfsenseapi/testdata/badjson.json create mode 100644 pfsenseapi/testdata/createuser.json create mode 100644 pfsenseapi/testdata/error.json create mode 100644 pfsenseapi/utils_test.go diff --git a/pfsenseapi/testdata/addprivilegestouser.json b/pfsenseapi/testdata/addprivilegestouser.json new file mode 100644 index 0000000..c084169 --- /dev/null +++ b/pfsenseapi/testdata/addprivilegestouser.json @@ -0,0 +1,9 @@ +{ + "status": "ok", + "code": 200, + "return": 0, + "message": "Success", + "data": [ + "system-xmlrpc-ha-sync" + ] +} diff --git a/pfsenseapi/testdata/addusertogroups.json b/pfsenseapi/testdata/addusertogroups.json new file mode 100644 index 0000000..8762730 --- /dev/null +++ b/pfsenseapi/testdata/addusertogroups.json @@ -0,0 +1,9 @@ +{ + "status": "ok", + "code": 200, + "return": 0, + "message": "Success", + "data": [ + "admins" + ] +} diff --git a/pfsenseapi/testdata/badjson.json b/pfsenseapi/testdata/badjson.json new file mode 100644 index 0000000..13c2697 --- /dev/null +++ b/pfsenseapi/testdata/badjson.json @@ -0,0 +1,6 @@ +{ + "status": "bad request", + "code": 400, + "return": 5001, + "message": "User does not exist", + "data": [] diff --git a/pfsenseapi/testdata/createuser.json b/pfsenseapi/testdata/createuser.json new file mode 100644 index 0000000..0d90c82 --- /dev/null +++ b/pfsenseapi/testdata/createuser.json @@ -0,0 +1,18 @@ +{ + "status": "ok", + "code": 200, + "return": 0, + "message": "Success", + "data": { + "uid": "2002", + "scope": "user", + "name": "testing123", + "bcrypt-hash": "$2y$10$JDvXIS.ac5yuO.fI5DEtW.K1Xei3USarsVb22Cj6lq1iAwq1jUfQC", + "priv": [], + "descr": "testing123", + "expires": "10/17/2023", + "cert": [], + "authorizedkeys": "", + "ipsecpsk": "" + } +} diff --git a/pfsenseapi/testdata/error.json b/pfsenseapi/testdata/error.json new file mode 100644 index 0000000..4bb96e8 --- /dev/null +++ b/pfsenseapi/testdata/error.json @@ -0,0 +1,7 @@ +{ + "status": "bad request", + "code": 400, + "return": 5001, + "message": "User does not exist", + "data": [] +} diff --git a/pfsenseapi/user.go b/pfsenseapi/user.go index 74d7d21..05f1b9c 100644 --- a/pfsenseapi/user.go +++ b/pfsenseapi/user.go @@ -255,7 +255,7 @@ func (s UserService) AddUserToGroups(ctx context.Context, username string, group return err } - if _, err = s.client.post(ctx, groupMemberEndpoint, nil, jsonData); err != nil { + if _, err := s.client.post(ctx, groupMemberEndpoint, nil, jsonData); err != nil { return err } return nil @@ -310,7 +310,7 @@ func (s UserService) AddPrivilegesToUser(ctx context.Context, username string, p return err } - if _, err = s.client.post(ctx, privilegeEndpoint, nil, jsonData); err != nil { + if _, err := s.client.post(ctx, privilegeEndpoint, nil, jsonData); err != nil { return err } return nil diff --git a/pfsenseapi/user_test.go b/pfsenseapi/user_test.go index bc4c3a8..073c2c9 100644 --- a/pfsenseapi/user_test.go +++ b/pfsenseapi/user_test.go @@ -11,11 +11,12 @@ import ( ) func TestUserService_ListGroups(t *testing.T) { - data := mustReadFileString(t, "testdata/listgroups.json") + data := makeResultList(t, mustReadFileString(t, "testdata/listgroups.json")) handler := func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json") - _, _ = io.WriteString(w, data) + w.WriteHeader(data.popStatus()) + _, _ = io.WriteString(w, data.popResult()) } server := httptest.NewServer(http.HandlerFunc(handler)) @@ -25,14 +26,23 @@ func TestUserService_ListGroups(t *testing.T) { response, err := newClient.User.ListGroups(context.Background()) require.NoError(t, err) require.Len(t, response, 2) + + response, err = newClient.User.ListGroups(context.Background()) + require.Error(t, err) + require.Nil(t, response) + + response, err = newClient.User.ListGroups(context.Background()) + require.Error(t, err) + require.Nil(t, response) } func TestUserService_ListUsers(t *testing.T) { - data := mustReadFileString(t, "testdata/listusers.json") + data := makeResultList(t, mustReadFileString(t, "testdata/listusers.json")) handler := func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json") - _, _ = io.WriteString(w, data) + w.WriteHeader(data.popStatus()) + _, _ = io.WriteString(w, data.popResult()) } server := httptest.NewServer(http.HandlerFunc(handler)) @@ -42,14 +52,95 @@ func TestUserService_ListUsers(t *testing.T) { response, err := newClient.User.ListUsers(context.Background()) require.NoError(t, err) require.Len(t, response, 2) + + response, err = newClient.User.ListUsers(context.Background()) + require.Error(t, err) + require.Nil(t, response) + + response, err = newClient.User.ListUsers(context.Background()) + require.Error(t, err) + require.Nil(t, response) +} + +func TestUserService_CreateUser(t *testing.T) { + data := makeResultList(t, mustReadFileString(t, "testdata/createuser.json")) + + handler := func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(data.popStatus()) + _, _ = io.WriteString(w, data.popResult()) + } + + server := httptest.NewServer(http.HandlerFunc(handler)) + defer server.Close() + + newClient := NewClientWithNoAuth(server.URL) + response, err := newClient.User.CreateUser(context.Background(), UserRequest{}) + require.NotNil(t, response) + require.NoError(t, err) + + response, err = newClient.User.CreateUser(context.Background(), UserRequest{}) + require.Nil(t, response) + require.Error(t, err) + + response, err = newClient.User.CreateUser(context.Background(), UserRequest{}) + require.Nil(t, response) + require.Error(t, err) +} + +func TestUserService_UpdateUser(t *testing.T) { + data := makeResultList(t, mustReadFileString(t, "testdata/createuser.json")) + + handler := func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(data.popStatus()) + _, _ = io.WriteString(w, data.popResult()) + } + + server := httptest.NewServer(http.HandlerFunc(handler)) + defer server.Close() + + newClient := NewClientWithNoAuth(server.URL) + response, err := newClient.User.UpdateUser(context.Background(), UserRequest{}) + require.NotNil(t, response) + require.NoError(t, err) + + response, err = newClient.User.UpdateUser(context.Background(), UserRequest{}) + require.Nil(t, response) + require.Error(t, err) + + response, err = newClient.User.UpdateUser(context.Background(), UserRequest{}) + require.Nil(t, response) + require.Error(t, err) +} + +func TestUserService_DeleteUser(t *testing.T) { + data := makeResultList(t, mustReadFileString(t, "testdata/createuser.json")) + + handler := func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(data.popStatus()) + _, _ = io.WriteString(w, data.popResult()) + } + + server := httptest.NewServer(http.HandlerFunc(handler)) + defer server.Close() + + newClient := NewClientWithNoAuth(server.URL) + err := newClient.User.DeleteUser(context.Background(), "testing123") + require.NoError(t, err) + + err = newClient.User.DeleteUser(context.Background(), "testing123") + require.Error(t, err) } func TestUserService_CreateGroup(t *testing.T) { - data := mustReadFileString(t, "testdata/creategroup.json") + data := makeResultList(t, mustReadFileString(t, "testdata/creategroup.json")) handler := func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json") - _, _ = io.WriteString(w, data) + w.WriteHeader(data.popStatus()) + _, _ = io.WriteString(w, data.popResult()) } server := httptest.NewServer(http.HandlerFunc(handler)) @@ -59,14 +150,23 @@ func TestUserService_CreateGroup(t *testing.T) { response, err := newClient.User.CreateGroup(context.Background(), GroupRequest{}) require.NotNil(t, response) require.NoError(t, err) + + response, err = newClient.User.CreateGroup(context.Background(), GroupRequest{}) + require.Nil(t, response) + require.Error(t, err) + + response, err = newClient.User.CreateGroup(context.Background(), GroupRequest{}) + require.Nil(t, response) + require.Error(t, err) } func TestUserService_UpdateGroup(t *testing.T) { - data := mustReadFileString(t, "testdata/creategroup.json") + data := makeResultList(t, mustReadFileString(t, "testdata/creategroup.json")) handler := func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json") - _, _ = io.WriteString(w, data) + w.WriteHeader(data.popStatus()) + _, _ = io.WriteString(w, data.popResult()) } server := httptest.NewServer(http.HandlerFunc(handler)) @@ -76,4 +176,112 @@ func TestUserService_UpdateGroup(t *testing.T) { response, err := newClient.User.UpdateGroup(context.Background(), "admin", GroupRequest{}) require.NotNil(t, response) require.NoError(t, err) + + response, err = newClient.User.UpdateGroup(context.Background(), "admin", GroupRequest{}) + require.Nil(t, response) + require.Error(t, err) + + response, err = newClient.User.UpdateGroup(context.Background(), "admin", GroupRequest{}) + require.Nil(t, response) + require.Error(t, err) +} + +func TestUserService_DeleteGroup(t *testing.T) { + data := makeResultList(t, mustReadFileString(t, "testdata/creategroup.json")) + + handler := func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(data.popStatus()) + _, _ = io.WriteString(w, data.popResult()) + } + + server := httptest.NewServer(http.HandlerFunc(handler)) + defer server.Close() + + newClient := NewClientWithNoAuth(server.URL) + err := newClient.User.DeleteGroup(context.Background(), "admin") + require.NoError(t, err) + + err = newClient.User.DeleteGroup(context.Background(), "admin") + require.Error(t, err) +} + +func TestUserService_RemoveUserFromGroup(t *testing.T) { + data := makeResultList(t, mustReadFileString(t, "testdata/addusertogroups.json")) + + handler := func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(data.popStatus()) + _, _ = io.WriteString(w, data.popResult()) + } + + server := httptest.NewServer(http.HandlerFunc(handler)) + defer server.Close() + + newClient := NewClientWithNoAuth(server.URL) + err := newClient.User.RemoveUserFromGroup(context.Background(), "admin", "admins") + require.NoError(t, err) + + err = newClient.User.RemoveUserFromGroup(context.Background(), "admin", "admins") + require.Error(t, err) +} + +func TestUserService_AddUserToGroups(t *testing.T) { + data := makeResultList(t, mustReadFileString(t, "testdata/addusertogroups.json")) + + handler := func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(data.popStatus()) + _, _ = io.WriteString(w, data.popResult()) + } + + server := httptest.NewServer(http.HandlerFunc(handler)) + defer server.Close() + + newClient := NewClientWithNoAuth(server.URL) + err := newClient.User.AddUserToGroups(context.Background(), "admin", []string{"admins"}) + require.NoError(t, err) + + err = newClient.User.AddUserToGroups(context.Background(), "admin", []string{"admins"}) + require.Error(t, err) +} + +func TestUserService_RemovePrivilegeFromUser(t *testing.T) { + data := makeResultList(t, mustReadFileString(t, "testdata/addprivilegestouser.json")) + + handler := func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(data.popStatus()) + _, _ = io.WriteString(w, data.popResult()) + } + + server := httptest.NewServer(http.HandlerFunc(handler)) + defer server.Close() + + newClient := NewClientWithNoAuth(server.URL) + err := newClient.User.RemovePrivilegeFromUser(context.Background(), "admin", "system-xmlrpc-ha-sync") + require.NoError(t, err) + + err = newClient.User.RemovePrivilegeFromUser(context.Background(), "admin", "system-xmlrpc-ha-sync") + require.Error(t, err) +} + +func TestUserService_AddPrivilegesToUser(t *testing.T) { + data := makeResultList(t, mustReadFileString(t, "testdata/addprivilegestouser.json")) + + handler := func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(data.popStatus()) + _, _ = io.WriteString(w, data.popResult()) + } + + server := httptest.NewServer(http.HandlerFunc(handler)) + defer server.Close() + + newClient := NewClientWithNoAuth(server.URL) + err := newClient.User.AddPrivilegesToUser(context.Background(), "admin", []string{"system-xmlrpc-ha-sync"}) + require.NoError(t, err) + + err = newClient.User.AddPrivilegesToUser(context.Background(), "admin", []string{"system-xmlrpc-ha-sync"}) + require.Error(t, err) } diff --git a/pfsenseapi/utils_test.go b/pfsenseapi/utils_test.go new file mode 100644 index 0000000..10edeed --- /dev/null +++ b/pfsenseapi/utils_test.go @@ -0,0 +1,44 @@ +package pfsenseapi + +import ( + "net/http" + "testing" +) + +func popSlice[K comparable](slice []K, s int) []K { + return append(slice[:s], slice[s+1:]...) +} + +type resultList struct { + resultsData []string + resultsStatus []int +} + +func (s *resultList) popResult() string { + response := s.resultsData[0] + + s.resultsData = popSlice(s.resultsData, 0) + return response +} + +func (s *resultList) popStatus() int { + response := s.resultsStatus[0] + + s.resultsStatus = popSlice(s.resultsStatus, 0) + return response +} + +func makeResultList(t *testing.T, data string) *resultList { + return &resultList{ + resultsData: []string{ + data, + mustReadFileString(t, "testdata/error.json"), + mustReadFileString(t, "testdata/badjson.json"), + }, + resultsStatus: []int{ + http.StatusOK, + http.StatusBadRequest, + http.StatusOK, + }, + } +}