Skip to content

Commit

Permalink
Add users package with List method and structures
Browse files Browse the repository at this point in the history
Add package to work with users of the Resell v2 API. Implement basic
structures and List method.
  • Loading branch information
ozerovandrei committed Apr 7, 2018
1 parent 701d5c4 commit 10e1249
Show file tree
Hide file tree
Showing 5 changed files with 165 additions and 0 deletions.
15 changes: 15 additions & 0 deletions selvpcclient/resell/v2/users/doc.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
/*
Package users provides the ability to retrieve and manage users through the
Resell v2 API.
Example of getting all users
allUsers, _, err := users.List(ctx, resellClient)
if err != nil {
log.Fatal(err)
}
for _, user := range allUsers {
fmt.Println(user)
}
*/
package users
33 changes: 33 additions & 0 deletions selvpcclient/resell/v2/users/requests.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package users

import (
"context"
"strings"

"github.com/selectel/go-selvpcclient/selvpcclient"
)

const resourceURL = "users"

// List gets a list of users in the current domain.
func List(ctx context.Context, client *selvpcclient.ServiceClient) ([]*User, *selvpcclient.ResponseResult, error) {
url := strings.Join([]string{client.Endpoint, resourceURL}, "/")
responseResult, err := client.DoRequest(ctx, "GET", url, nil)
if err != nil {
return nil, nil, err
}
if responseResult.Err != nil {
return nil, responseResult, responseResult.Err
}

// Extract users from the response body.
var result struct {
Users []*User `json:"users"`
}
err = responseResult.ExtractResult(&result)
if err != nil {
return nil, responseResult, err
}

return result.Users, responseResult, nil
}
13 changes: 13 additions & 0 deletions selvpcclient/resell/v2/users/schemas.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package users

// User represents a single user of a Resell project.
type User struct {
// ID is a unique id of a user.
ID string `json:"id"`

// Name represents the name of a user.
Name string `json:"name"`

// Enabled shows if user is active or it was disabled.
Enabled bool `json:"enabled"`
}
43 changes: 43 additions & 0 deletions selvpcclient/resell/v2/users/testing/fixtures.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package testing

import "github.com/selectel/go-selvpcclient/selvpcclient/resell/v2/users"

// TestListUsersResponseRaw represents a raw response from the List request.
const TestListUsersResponseRaw = `
{
"users": [
{
"enabled": false,
"id": "c4b7e0581b964c52a1597fe0931eccdf",
"name": "User2"
},
{
"enabled": true,
"id": "4b2e452ed4c940bd87a88499eaf14c4f",
"name": "User1"
}
]
}
`

// TestListUsersSingleUserResponseRaw represents a raw response with a single user from the List request.
const TestListUsersSingleUserResponseRaw = `
{
"users": [
{
"enabled": true,
"id": "4b2e452ed4c940bd87a88499eaf14c4f",
"name": "User1"
}
]
}
`

// TestListUsersSingleUserResponse represents the unmarshalled TestListUsersSingleUserResponseRaw response.
var TestListUsersSingleUserResponse = []*users.User{
{
Enabled: true,
Name: "User1",
ID: "4b2e452ed4c940bd87a88499eaf14c4f",
},
}
61 changes: 61 additions & 0 deletions selvpcclient/resell/v2/users/testing/requests_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
package testing

import (
"context"
"fmt"
"net/http"
"reflect"
"testing"

"github.com/selectel/go-selvpcclient/selvpcclient/resell/v2/users"
"github.com/selectel/go-selvpcclient/selvpcclient/testutils"
)

func TestListUsers(t *testing.T) {
testEnv := testutils.SetupTestEnv()
defer testEnv.TearDownTestEnv()
testEnv.NewTestResellV2Client()
testEnv.Mux.HandleFunc("/resell/v2/users", func(w http.ResponseWriter, r *http.Request) {
w.Header().Add("Content-Type", "application/json")
fmt.Fprintf(w, TestListUsersResponseRaw)
})

ctx := context.Background()
actual, _, err := users.List(ctx, testEnv.Client)
if err != nil {
t.Fatal(err)
}

if actual == nil {
t.Fatal("didn't get users")
}
actualKind := reflect.TypeOf(actual).Kind()
if actualKind != reflect.Slice {
t.Errorf("expected slice of pointers to users, but got %v", actualKind)
}
if len(actual) != 2 {
t.Errorf("expected 2 users, but got %d", len(actual))
}
}

func TestListUsersSingle(t *testing.T) {
testEnv := testutils.SetupTestEnv()
defer testEnv.TearDownTestEnv()
testEnv.NewTestResellV2Client()
testEnv.Mux.HandleFunc("/resell/v2/users", func(w http.ResponseWriter, r *http.Request) {
w.Header().Add("Content-Type", "application/json")
fmt.Fprintf(w, TestListUsersSingleUserResponseRaw)
})

ctx := context.Background()
actual, _, err := users.List(ctx, testEnv.Client)
if err != nil {
t.Fatal(err)
}

expected := TestListUsersSingleUserResponse

if !reflect.DeepEqual(actual, expected) {
t.Fatalf("expected %#v, but got %#v", expected, actual)
}
}

0 comments on commit 10e1249

Please sign in to comment.