Skip to content

Commit c901374

Browse files
authored
Add PE users endpoints. (#91)
1 parent dbd6cdb commit c901374

File tree

6 files changed

+212
-5
lines changed

6 files changed

+212
-5
lines changed

pkg/rbac/common_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ func init() {
1717
httpmock.ActivateNonDefault(rbacClient.resty.GetClient())
1818
}
1919

20-
func setUpOKResponder(t *testing.T, httpMethod string, path string, responseFilePath string) {
20+
func setUpOKResponder(t *testing.T, path string, responseFilePath string) {
2121
httpmock.Reset()
2222

2323
responseBody, err := os.ReadFile(responseFilePath)
@@ -26,7 +26,7 @@ func setUpOKResponder(t *testing.T, httpMethod string, path string, responseFile
2626
response := httpmock.NewBytesResponse(http.StatusOK, responseBody)
2727
response.Header.Set("Content-Type", "application/json")
2828

29-
httpmock.RegisterResponder(httpMethod, rbacAPIOrigin+path, httpmock.ResponderFromResponse(response))
29+
httpmock.RegisterResponder(http.MethodGet, rbacAPIOrigin+path, httpmock.ResponderFromResponse(response))
3030
response.Body.Close()
3131
}
3232

pkg/rbac/roles_test.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package rbac
22

33
import (
44
"encoding/json"
5-
"net/http"
65
"os"
76
"strconv"
87
"strings"
@@ -26,7 +25,7 @@ func TestGetRoles(t *testing.T) {
2625
err = json.NewDecoder(expectedRolesJSONFile).Decode(&expectedRoles)
2726
require.Nil(t, err, "error decoding expected roles")
2827

29-
setUpOKResponder(t, http.MethodGet, rolesPath, getRolesResponseFilePath)
28+
setUpOKResponder(t, rolesPath, getRolesResponseFilePath)
3029

3130
actualRoles, err := rbacClient.GetRoles(token)
3231
require.Nil(t, err)
@@ -43,7 +42,7 @@ func TestGetRole(t *testing.T) {
4342
require.Nil(t, err, "error decoding expected role")
4443

4544
rolePathWithID := strings.ReplaceAll(rolePath, "{id}", strconv.Itoa(int(expectedRole.ID)))
46-
setUpOKResponder(t, http.MethodGet, rolePathWithID, getRoleResponseFilePath)
45+
setUpOKResponder(t, rolePathWithID, getRoleResponseFilePath)
4746

4847
actualRole, err := rbacClient.GetRole(expectedRole.ID, token)
4948
require.Nil(t, err)
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
{"id": "fe62d770-5886-11e4-8ed6-0800200c9a66",
2+
"login": "Amari",
3+
"email": "[email protected]",
4+
"display_name": "Amari Perez",
5+
"role_ids": [1,2,3],
6+
"is_group" : false,
7+
"is_remote" : false,
8+
"is_superuser" : false,
9+
"is_revoked": false,
10+
"last_login": "2014-05-04T02:32:00Z"}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
[{
2+
"id": "fe62d770-5886-11e4-8ed6-0800200c9a66",
3+
"login": "Kalo",
4+
"email": "[email protected]",
5+
"display_name": "Kalo Hill",
6+
"role_ids": [1,2,3],
7+
"is_group" : false,
8+
"is_remote" : false,
9+
"is_superuser" : true,
10+
"is_revoked": false,
11+
"last_login": "2014-05-04T02:32:00Z"
12+
},{
13+
"id": "07d9c8e0-5887-11e4-8ed6-0800200c9a66",
14+
"login": "Jean",
15+
"email": "[email protected]",
16+
"display_name": "Jean Jackson",
17+
"role_ids": [2, 3],
18+
"inherited_role_ids": [5],
19+
"is_group" : false,
20+
"is_remote" : true,
21+
"is_superuser" : false,
22+
"group_ids": ["2ca57e30-5887-11e4-8ed6-0800200c9a66"],
23+
"is_revoked": false,
24+
"last_login": "2014-05-04T02:32:00Z"
25+
},{
26+
"id": "1cadd0e0-5887-11e4-8ed6-0800200c9a66",
27+
"login": "Amari",
28+
"email": "[email protected]",
29+
"display_name": "Amari Perez",
30+
"role_ids": [2, 3],
31+
"inherited_role_ids": [5],
32+
"is_group" : false,
33+
"is_remote" : true,
34+
"is_superuser" : false,
35+
"group_ids": ["2ca57e30-5887-11e4-8ed6-0800200c9a66"],
36+
"is_revoked": false,
37+
"last_login": "2014-05-04T02:32:00Z"
38+
}]

pkg/rbac/users.go

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
package rbac
2+
3+
import (
4+
"fmt"
5+
"time"
6+
)
7+
8+
const (
9+
requestUsersURI = "/users" // #nosec - this is the uri to g et RBAC tokens
10+
requestCurrentUserURI = "/users/current" // #nosec - this is the uri to authenticate RBAC tokens
11+
requestUserURI = "/users/" // #nosec - this is the uri to revoke individual RBAC tokens
12+
)
13+
14+
// User describes the user keys.
15+
type User struct {
16+
ID string `json:"id"`
17+
Login string `json:"login"`
18+
Email string `json:"email,omitempty"`
19+
DisplayName string `json:"display_name,omitempty"`
20+
RoleIDs []int `json:"role_ids,omitempty"`
21+
IsGroup bool `json:"is_group,omitempty"`
22+
IsRemote bool `json:"is_remote,omitempty"`
23+
IsUser bool `json:"is_user,omitempty"`
24+
IsSuperUser bool `json:"is_superuser,omitempty"`
25+
IsRevoked bool `json:"is_revoked,omitempty"`
26+
LastLogin time.Time `json:"last_login,omitempty"`
27+
InheritedRoleIDs []int `json:"inherited_role_ids,omitempty"`
28+
GroupIDs []string `json:"group_ids,omitempty"`
29+
}
30+
31+
// GetUsers returns all the users in the system.
32+
func (c *Client) GetUsers(token string) ([]User, error) {
33+
users := []User{}
34+
r, err := c.resty.R().
35+
SetHeader("X-Authentication", token).
36+
SetResult(&users).
37+
Get(requestUsersURI)
38+
if err != nil {
39+
return nil, FormatError(r, err.Error())
40+
}
41+
if r.IsError() {
42+
if r.Error() != nil {
43+
return nil, FormatError(r)
44+
}
45+
return nil, FormatError(r)
46+
}
47+
return users, nil
48+
}
49+
50+
// GetCurrentUser will return the current user details.
51+
func (c *Client) GetCurrentUser(token string) (*User, error) {
52+
user := User{}
53+
r, err := c.resty.R().
54+
SetHeader("X-Authentication", token).
55+
SetResult(&user).
56+
Get(requestCurrentUserURI)
57+
if err != nil {
58+
return nil, FormatError(r, err.Error())
59+
}
60+
if r.IsError() {
61+
if r.Error() != nil {
62+
return nil, FormatError(r)
63+
}
64+
return nil, FormatError(r)
65+
}
66+
return &user, nil
67+
}
68+
69+
// GetSpecificUser will return a specific user details
70+
func (c *Client) GetSpecificUser(token string, sid string) (*User, error) {
71+
user := User{}
72+
r, err := c.resty.R().
73+
SetHeader("X-Authentication", token).
74+
SetResult(&user).
75+
Get(fmt.Sprintf("%s%s", requestUserURI, sid))
76+
if err != nil {
77+
return nil, FormatError(r, err.Error())
78+
}
79+
if r.IsError() {
80+
if r.Error() != nil {
81+
return nil, FormatError(r)
82+
}
83+
return nil, FormatError(r)
84+
}
85+
return &user, nil
86+
}

pkg/rbac/users_test.go

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
package rbac
2+
3+
import (
4+
"encoding/json"
5+
"fmt"
6+
"os"
7+
"reflect"
8+
"testing"
9+
10+
"github.com/stretchr/testify/require"
11+
)
12+
13+
const (
14+
getUserResponseFilePath = "testdata/apidocs/GetUser-response.json"
15+
getUsersResponseFilePath = "testdata/apidocs/GetUsers-response.json"
16+
)
17+
18+
func TestGetUsers(t *testing.T) {
19+
var expectedUsers []User
20+
21+
expectedUsersJSONFile, err := os.Open(getUsersResponseFilePath)
22+
require.Nil(t, err, "failed to open expected users JSON file")
23+
24+
err = json.NewDecoder(expectedUsersJSONFile).Decode(&expectedUsers)
25+
require.Nil(t, err, "error decoding expected users")
26+
27+
setUpOKResponder(t, requestUsersURI, getUsersResponseFilePath)
28+
29+
actualUsers, err := rbacClient.GetUsers(token)
30+
require.Nil(t, err)
31+
require.NotNil(t, actualUsers)
32+
33+
require.Equal(t, len(expectedUsers), len(actualUsers))
34+
}
35+
36+
func TestGetCurrentUser(t *testing.T) {
37+
var expectedUser User
38+
39+
expectedUserJSONFile, err := os.Open(getUserResponseFilePath)
40+
require.Nil(t, err, "failed to open expected user JSON file")
41+
42+
err = json.NewDecoder(expectedUserJSONFile).Decode(&expectedUser)
43+
require.Nil(t, err, "error decoding expected role")
44+
45+
setUpOKResponder(t, requestCurrentUserURI, getUserResponseFilePath)
46+
47+
actualUser, err := rbacClient.GetCurrentUser(token)
48+
require.Nil(t, err)
49+
50+
match := reflect.DeepEqual(expectedUser, *actualUser)
51+
require.True(t, match, "Expected and actual output do not match.")
52+
}
53+
54+
func TestGetSpecificUser(t *testing.T) {
55+
specificUserID := "specific-user-test"
56+
57+
var expectedUser User
58+
59+
expectedUserJSONFile, err := os.Open(getUserResponseFilePath)
60+
require.Nil(t, err, "failed to open expected user JSON file")
61+
62+
err = json.NewDecoder(expectedUserJSONFile).Decode(&expectedUser)
63+
require.Nil(t, err, "error decoding expected role")
64+
65+
specificURI := fmt.Sprintf("%s%s", requestUserURI, specificUserID)
66+
67+
setUpOKResponder(t, specificURI, getUserResponseFilePath)
68+
69+
actualUser, err := rbacClient.GetSpecificUser(token, specificUserID)
70+
require.Nil(t, err)
71+
72+
match := reflect.DeepEqual(expectedUser, *actualUser)
73+
require.True(t, match, "Expected and actual output do not match.")
74+
}

0 commit comments

Comments
 (0)