diff --git a/selvpcclient/resell/v2/roles/doc.go b/selvpcclient/resell/v2/roles/doc.go index a005b38..fa0c202 100644 --- a/selvpcclient/resell/v2/roles/doc.go +++ b/selvpcclient/resell/v2/roles/doc.go @@ -2,6 +2,16 @@ Package roles provides the ability to retrieve and manage roles through the Resell v2 API. +Example of getting roles in the current domain + + allRoles, _, err = roles.List(context, resellClient) + if err != nil { + log.Fatal(err) + } + for _, myRole := range allRoles { + fmt.Println(myRole) + } + Example of getting roles in the specified project allRoles, _, err := roles.ListProject(context, resellClient, projectID) diff --git a/selvpcclient/resell/v2/roles/requests.go b/selvpcclient/resell/v2/roles/requests.go index 0417bee..bfa5c8d 100644 --- a/selvpcclient/resell/v2/roles/requests.go +++ b/selvpcclient/resell/v2/roles/requests.go @@ -12,6 +12,29 @@ import ( const resourceURL = "roles" +// List returns all roles in the current domain. +func List(ctx context.Context, client *selvpcclient.ServiceClient) ([]*Role, *selvpcclient.ResponseResult, error) { + url := strings.Join([]string{client.Endpoint, resourceURL}, "/") + responseResult, err := client.DoRequest(ctx, http.MethodGet, url, nil) + if err != nil { + return nil, nil, err + } + if responseResult.Err != nil { + return nil, responseResult, responseResult.Err + } + + //Extract roles from the response body. + var result struct { + Roles []*Role `json:"roles"` + } + err = responseResult.ExtractResult(&result) + if err != nil { + return nil, responseResult, err + } + + return result.Roles, responseResult, nil +} + // ListProject returns all roles in the specified project. func ListProject(ctx context.Context, client *selvpcclient.ServiceClient, id string) ([]*Role, *selvpcclient.ResponseResult, error) { url := strings.Join([]string{client.Endpoint, resourceURL, "projects", id}, "/") diff --git a/selvpcclient/resell/v2/roles/testing/fixtures.go b/selvpcclient/resell/v2/roles/testing/fixtures.go index 2a9576b..08dfc26 100644 --- a/selvpcclient/resell/v2/roles/testing/fixtures.go +++ b/selvpcclient/resell/v2/roles/testing/fixtures.go @@ -2,6 +2,26 @@ package testing import "github.com/selectel/go-selvpcclient/selvpcclient/resell/v2/roles" +// TestListResponseRaw represents a raw response from List requests. +const TestListResponseRaw = ` +{ + "roles": [ + { + "project_id": "49338ac045f448e294b25d013f890317", + "user_id": "b006a55e3a904472824061d64d61be75" + }, + { + "project_id": "49338ac045f448e294b25d013f890317", + "user_id": "763eecfaeb0c8e9b76ab12a82eb4c11" + }, + { + "project_id": "d7452adc9769422a908edfd2281d7c55", + "user_id": "763eecfaeb0c8e9b76ab12a82eb4c11" + } + ] +} +` + // TestListProjectResponseRaw represents a raw response from ListProject requests. const TestListProjectResponseRaw = ` { diff --git a/selvpcclient/resell/v2/roles/testing/requests_test.go b/selvpcclient/resell/v2/roles/testing/requests_test.go index 1570919..8776914 100644 --- a/selvpcclient/resell/v2/roles/testing/requests_test.go +++ b/selvpcclient/resell/v2/roles/testing/requests_test.go @@ -10,6 +10,146 @@ import ( "github.com/selectel/go-selvpcclient/selvpcclient/testutils" ) +func TestListRoles(t *testing.T) { + endpointCalled := false + + testEnv := testutils.SetupTestEnv() + defer testEnv.TearDownTestEnv() + testEnv.NewTestResellV2Client() + testutils.HandleReqWithoutBody(t, &testutils.HandleReqOpts{ + Mux: testEnv.Mux, + URL: "/resell/v2/roles", + RawResponse: TestListResponseRaw, + Method: http.MethodGet, + Status: http.StatusOK, + CallFlag: &endpointCalled, + }) + + ctx := context.Background() + actual, _, err := roles.List(ctx, testEnv.Client) + if err != nil { + t.Fatal(err) + } + if !endpointCalled { + t.Fatal("didn't get roles") + } + actualKind := reflect.TypeOf(actual).Kind() + if actualKind != reflect.Slice { + t.Errorf("expected Slice of pointers to roles, but got %v", actualKind) + } + if len(actual) != 3 { + t.Errorf("expected 3 roles, but got %d", len(actual)) + } +} + +func TestListRolesSingle(t *testing.T) { + endpointCalled := false + + testEnv := testutils.SetupTestEnv() + defer testEnv.TearDownTestEnv() + testEnv.NewTestResellV2Client() + testutils.HandleReqWithoutBody(t, &testutils.HandleReqOpts{ + Mux: testEnv.Mux, + URL: "/resell/v2/roles", + RawResponse: TestListResponseSingleRaw, + Method: http.MethodGet, + Status: http.StatusOK, + CallFlag: &endpointCalled, + }) + + ctx := context.Background() + actual, _, err := roles.List(ctx, testEnv.Client) + if err != nil { + t.Fatal(err) + } + expected := TestListResponseSingle + if !endpointCalled { + t.Fatal("endpoint wasn't called") + } + if !reflect.DeepEqual(actual, expected) { + t.Fatalf("expected %#v, but got %#v", expected, actual) + } +} + +func TestListRolesHTTPError(t *testing.T) { + endpointCalled := false + + testEnv := testutils.SetupTestEnv() + defer testEnv.TearDownTestEnv() + testEnv.NewTestResellV2Client() + testutils.HandleReqWithoutBody(t, &testutils.HandleReqOpts{ + Mux: testEnv.Mux, + URL: "/resell/v2/roles", + RawResponse: TestListResponseRaw, + Method: http.MethodGet, + Status: http.StatusBadGateway, + CallFlag: &endpointCalled, + }) + + ctx := context.Background() + allRoles, httpResponse, err := roles.List(ctx, testEnv.Client) + + if !endpointCalled { + t.Fatal("endpoint wasn't called") + } + if allRoles != nil { + t.Fatal("expected no roles from the Get method") + } + if err == nil { + t.Fatal("expected error from the Get method") + } + if httpResponse.StatusCode != http.StatusBadGateway { + t.Fatalf("expected %d status in the HTTP response, but got %d", + http.StatusBadGateway, httpResponse.StatusCode) + } +} + +func TestListRolesTimeoutError(t *testing.T) { + testEnv := testutils.SetupTestEnv() + testEnv.Server.Close() + defer testEnv.TearDownTestEnv() + testEnv.NewTestResellV2Client() + + ctx := context.Background() + allRoles, _, err := roles.List(ctx, testEnv.Client) + + if allRoles != nil { + t.Fatal("expected no roles from the List method") + } + if err == nil { + t.Fatal("expected error from the List method") + } +} + +func TestListRolesUnmarshalError(t *testing.T) { + endpointCalled := false + + testEnv := testutils.SetupTestEnv() + defer testEnv.TearDownTestEnv() + testEnv.NewTestResellV2Client() + testutils.HandleReqWithoutBody(t, &testutils.HandleReqOpts{ + Mux: testEnv.Mux, + URL: "/resell/v2/roles", + RawResponse: TestManyRolesInvalidResponseRaw, + Method: http.MethodGet, + Status: http.StatusOK, + CallFlag: &endpointCalled, + }) + + ctx := context.Background() + allRoles, _, err := roles.List(ctx, testEnv.Client) + + if !endpointCalled { + t.Fatal("endpoint wasn't called") + } + if allRoles != nil { + t.Fatal("expected no roles from the List method") + } + if err == nil { + t.Fatal("expected error from the List method") + } +} + func TestListRolesProject(t *testing.T) { endpointCalled := false