diff --git a/constants.go b/constants.go index e46cf63..1c887f4 100644 --- a/constants.go +++ b/constants.go @@ -23,4 +23,7 @@ const ( // TestUserPhoneNumberWithPin is used by integration tests TestUserPhoneNumberWithPin = "+254778990088" + + // The role used to run tests + TestRoleName = "Test Role" ) diff --git a/go.sum b/go.sum index e85d35e..79c18fb 100644 --- a/go.sum +++ b/go.sum @@ -284,37 +284,26 @@ github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1: github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/savannahghi/converterandformatter v0.0.3 h1:wRUC/Mv1tLfVbbMlatZj9/5du2C51b816NVJhtY8KW4= -github.com/savannahghi/converterandformatter v0.0.3/go.mod h1:0o7yieYU10WabPqKuqj+5QL52eTL1eGElxjb+A68bbA= github.com/savannahghi/converterandformatter v0.0.10 h1:sE67P1/NDIuVWUfPu+cw/5DS9pM5LthqxrJszCtLv2o= github.com/savannahghi/converterandformatter v0.0.10/go.mod h1:DNqyfHojHOrll1/l6Y9UUSl97/TBiB08zcRWjaXbXRM= -github.com/savannahghi/enumutils v0.0.0-20210622094023-d347744e1825 h1:fsQJI6leJba47gc06wrLyLlCYJzvNaVLubCYR7Ve7Uk= github.com/savannahghi/enumutils v0.0.0-20210622094023-d347744e1825/go.mod h1:DDdjQBO1qyf5BxLzhTs1uN91drCIHH2Lvr8aLdJwu/o= github.com/savannahghi/enumutils v0.0.3 h1:0IPGS/Q27B8mZw+0YOb1r7Au1MgJQldfuwYid3byUx0= github.com/savannahghi/enumutils v0.0.3/go.mod h1:DDdjQBO1qyf5BxLzhTs1uN91drCIHH2Lvr8aLdJwu/o= -github.com/savannahghi/errorcodeutil v0.0.1 h1:q5JYMrzXDAJ9/99fV7Mj2bFF1XOidlRgSlYHy73q2GA= github.com/savannahghi/errorcodeutil v0.0.1/go.mod h1:nNBaBjatvoRusnDr2aRoNr4Rpmz9Z779mjcL0tr/IXk= github.com/savannahghi/errorcodeutil v0.0.3 h1:mT46aTtRXvCxSiaIsoNxCr8yGycAEncB0udwtjQ+Mo8= github.com/savannahghi/errorcodeutil v0.0.3/go.mod h1:QdORFt+S/bBdFIHNuCi8M/LCTP4d981QqbRVvbm675k= -github.com/savannahghi/feedlib v0.0.0-20210628122532-ef88e353d4d6 h1:KKb7B/X+k5VHEfka8sM8x9p7s9HPbb9C+lMmEaByGVE= github.com/savannahghi/feedlib v0.0.0-20210628122532-ef88e353d4d6/go.mod h1:P6YHmWsa/TK/qTb2U1ryjuASotTQmbarArB0LYLjMo4= github.com/savannahghi/feedlib v0.0.4 h1:CF3vOKMOkMCSNqX+q0Ypa/6LUtiMU6QGX8Kkf82RH0A= github.com/savannahghi/feedlib v0.0.4/go.mod h1:PzEP7gw4w1Xuw36uIRr1H2ffd+kozWHyJCuGWO06AtQ= github.com/savannahghi/firebasetools v0.0.5/go.mod h1:obAxyBfPaGTx/g86LF19gSmmEh5x+Tbnziatk514mUQ= github.com/savannahghi/firebasetools v0.0.6/go.mod h1:obAxyBfPaGTx/g86LF19gSmmEh5x+Tbnziatk514mUQ= -github.com/savannahghi/firebasetools v0.0.13 h1:2eBFwzsnmhRUzxfgQZxOjedlMuyef2dz4tvpw59pJkE= -github.com/savannahghi/firebasetools v0.0.13/go.mod h1:0xgpolbK6P2GzUveYSeF9DcMTkJvF8pIWLes1LLtTEE= github.com/savannahghi/firebasetools v0.0.15 h1:/i/VyddxLmBO1Fn4W1rcj6nKUut2x+mgX4BOU0ogiPY= github.com/savannahghi/firebasetools v0.0.15/go.mod h1:2Qhj483I+CiKzObf+T3cKhf1YYsEQWz8e+KPE+6LyBk= -github.com/savannahghi/profileutils v0.0.6 h1:eUtU5Q2ElEytQqgx8zED6ts7UsyCLzL/gvDkDmdUXWY= -github.com/savannahghi/profileutils v0.0.6/go.mod h1:Ct0sjzOW9zjDN58ynT5GTV6M2hHMY3nsFDV08I6gpO4= github.com/savannahghi/profileutils v0.0.16 h1:JKc7M/58M1vMpI9+R2OTgIiTstc6ZK/Q1F78tNkEOsQ= github.com/savannahghi/profileutils v0.0.16/go.mod h1:Ct0sjzOW9zjDN58ynT5GTV6M2hHMY3nsFDV08I6gpO4= github.com/savannahghi/scalarutils v0.0.0-20210622091443-bad5089abdad h1:v3QPK6KIGkOozqZ/DqMwbmF1LcqJO6k25arenLls9SY= github.com/savannahghi/scalarutils v0.0.0-20210622091443-bad5089abdad/go.mod h1:Z+Dl3wc3vy5zKvthctHAtYzol1p8w27zEVRfOYueoks= -github.com/savannahghi/server_utils v0.0.1 h1:q6SL4BRvkpYJujXvWwCl4vU1U+VTzKRGfNXnl0H6tfw= github.com/savannahghi/server_utils v0.0.1/go.mod h1:Tldm4Op4ARxk8xaP3BA0V52XVZEJenkq0ck4FCdEp+I= -github.com/savannahghi/serverutils v0.0.2 h1:ZVRRdyRH47qlqZCiZ3FKOd8W4ufhtvHQLLZxAQZonqk= github.com/savannahghi/serverutils v0.0.2/go.mod h1:sLX0El0i0DKN/9cUkB8xqm5cVMP79qCZvK60EzB7Pa4= github.com/savannahghi/serverutils v0.0.4 h1:mQGAwhNgS1NPSBXqCeyywuGQFnvRxiOmHJEHPgzhWQE= github.com/savannahghi/serverutils v0.0.4/go.mod h1:3VCEJ8BTHf/DW3WFjLqV4SznzrXaul/As2RJ5eNOO7U= @@ -336,6 +325,7 @@ github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb6 github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.3.0 h1:NGXK3lHquSN08v5vWalVI/L8XU9hdzE/G6xsrze47As= github.com/stretchr/objx v0.3.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= @@ -770,7 +760,6 @@ gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20191120175047-4206685974f2/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/test_utils.go b/test_utils.go index 2c1d24e..68dc5b2 100644 --- a/test_utils.go +++ b/test_utils.go @@ -1,10 +1,12 @@ package interserviceclient import ( + "bytes" "context" "encoding/json" "fmt" "io/ioutil" + "log" "net/http" "strconv" "strings" @@ -28,6 +30,9 @@ const ( removeUserByPhone = "testing/remove_user" addAdmin = "testing/add_admin_permissions" updateBioData = "testing/update_user_profile" + createRole = "roles/create_role" + assignRole = "roles/assign_role" + removeRoleByName = "roles/remove_role" ) // ContextKey is used as a type for the UID key for the Firebase *auth.Token on context.Context. @@ -76,6 +81,24 @@ func GetPhoneNumberAuthenticatedContextAndToken( return authenticatedContext, authToken, nil } +// GetTestAuthorizedContextAndToken returns an authorized phone number with permissions logged in context +// and an auth Token that contains the the test user UID useful for test purposes +func GetTestAuthorizedContextAndToken( + t *testing.T, + onboardingClient *InterServiceClient, +) (context.Context, *auth.Token, error) { + ctx := context.Background() + userResponse, err := CreateOrLoginTestPhoneNumberAuthorizedUser(t, onboardingClient) + if err != nil { + return nil, nil, err + } + authToken := &auth.Token{ + UID: userResponse.Auth.UID, + } + authenticatedContext := context.WithValue(ctx, firebasetools.AuthTokenContextKey, authToken) + return authenticatedContext, authToken, nil +} + // GetDefaultHeaders returns headers used in inter service communication acceptance tests func GetDefaultHeaders(t *testing.T, rootDomain string, serviceName string) map[string]string { return req.Header{ @@ -175,41 +198,6 @@ func LoginTestPhoneUser( return response, nil } -// AddAdminPermissions adds ADMIN permissions to our test user -func AddAdminPermissions( - t *testing.T, - onboardingClient *InterServiceClient, - phone string, -) error { - ctx := context.Background() - - phonePayload := map[string]interface{}{ - "phoneNumber": phone, - } - - resp, err := onboardingClient.MakeRequest( - ctx, - http.MethodPost, - addAdmin, - phonePayload, - ) - - if err != nil { - return fmt.Errorf("unable to make add admin request: %w", err) - } - - body, err := ioutil.ReadAll(resp.Body) - if err != nil { - return fmt.Errorf("unable to convert response to string: %v", err) - } - - if resp.StatusCode != http.StatusOK { - return fmt.Errorf("got status code %v with resp body: %s", resp.StatusCode, string(body)) - } - - return nil -} - // UpdateBioData adds Bio Data to our test user func UpdateBioData( t *testing.T, @@ -253,7 +241,6 @@ func UpdateBioData( // authenticated user response // For documentation and test purposes only func CreateOrLoginTestPhoneNumberUser(t *testing.T, onboardingClient *InterServiceClient) (*profileutils.UserResponse, error) { - ctx := context.Background() phone := TestUserPhoneNumber PIN := TestUserPin @@ -280,14 +267,6 @@ func CreateOrLoginTestPhoneNumberUser(t *testing.T, onboardingClient *InterServi return nil, fmt.Errorf("unable to log in the test user: %v", err) } - perms := userResponse.Profile.Permissions - if len(perms) == 0 { - err = AddAdminPermissions(t, onboardingClient, phone) - if err != nil { - return nil, fmt.Errorf("unable to add admin permissions: %v", err) - } - } - if userResponse.Profile.UserBioData.FirstName == nil { err = UpdateBioData(t, onboardingClient, userResponse.Auth.UID) if err != nil { @@ -300,6 +279,65 @@ func CreateOrLoginTestPhoneNumberUser(t *testing.T, onboardingClient *InterServi return nil, fmt.Errorf("failed to verify test phone number: %v", err) } + + response, err := CreateTestPhoneNumberUser(t, onboardingClient, otp) + if err != nil { + return nil, fmt.Errorf("unable to create test user:%v", err) + } + + return response, nil +} + +// CreateOrLoginTestPhoneNumberAuthorizedUser creates an phone number test user if they +// do not exist or `Logs them in` if the test user exists to retrieve +// authenticated user response +// For documentation and test purposes only +func CreateOrLoginTestPhoneNumberAuthorizedUser(t *testing.T, onboardingClient *InterServiceClient) (*profileutils.UserResponse, error) { + userResponse, err := CreateOrLoginTestPhoneNumberUser(t, onboardingClient) + if err != nil { + return nil, err + } + + userScopes := userResponse.Auth.Scopes + expectedScopes := testScopes() + if len(userScopes) != len(expectedScopes) { + var role profileutils.Role + + if len(userScopes) == 0 { + r, err := CreateTestRole(t, *userResponse, onboardingClient.RequestRootDomain, TestRoleName) + if err != nil { + return nil, fmt.Errorf("unable to create test role: %v", err) + } + role = *r + } else { + _, err := RemoveTestRole(t, *userResponse, onboardingClient.RequestRootDomain, TestRoleName) + if err != nil { + return nil, fmt.Errorf("unable to remove test role: %v", err) + } + r, err := CreateTestRole(t, *userResponse, onboardingClient.RequestRootDomain, TestRoleName) + if err != nil { + return nil, fmt.Errorf("unable to create test role: %v", err) + } + role = *r + } + + _, err = AssignTestRole(t, *userResponse, onboardingClient.RequestRootDomain, userResponse.Profile.ID, role.ID) + if err != nil { + return nil, fmt.Errorf("unable to assign test role: %v", err) + } + } + + return userResponse, nil +} + +// CreateTestPhoneNumberUser creates the user for test phone number +func CreateTestPhoneNumberUser(t *testing.T, onboardingClient *InterServiceClient, otp string) (*profileutils.UserResponse, error) { + ctx := context.Background() + + phone := TestUserPhoneNumber + PIN := TestUserPin + flavour := feedlib.FlavourConsumer + createUserPayload := map[string]interface{}{ "phoneNumber": phone, "pin": PIN, @@ -335,14 +373,6 @@ func CreateOrLoginTestPhoneNumberUser(t *testing.T, onboardingClient *InterServi return nil, fmt.Errorf("failed to unmarshal OTP: %v", err) } - perms := response.Profile.Permissions - if len(perms) == 0 { - err = AddAdminPermissions(t, onboardingClient, phone) - if err != nil { - return nil, fmt.Errorf("unable to add admin permissions: %v", err) - } - } - if response.Profile.UserBioData.FirstName == nil { err = UpdateBioData(t, onboardingClient, response.Auth.UID) if err != nil { @@ -385,6 +415,39 @@ func RemoveTestPhoneNumberUser( return nil } +// RemoveTestPhoneNumberAuthorizedUser removes the records created by the +// test phonenumber user +func RemoveTestPhoneNumberAuthorizedUser( + t *testing.T, + onboardingClient *InterServiceClient, +) error { + if onboardingClient == nil { + return fmt.Errorf("nil ISC client") + } + + phone := TestUserPhoneNumber + PIN := TestUserPin + flavour := feedlib.FlavourConsumer + + userResponse, err := LoginTestPhoneUser( + t, + phone, + PIN, + flavour, + onboardingClient, + ) + if err != nil { + return nil // This is a test utility. Do not block if the user is not found + } + + _, err = RemoveTestRole(t, *userResponse, onboardingClient.RequestRootDomain, TestRoleName) + if err != nil { + return nil // This is a test utility. Do not block if the role is not removed + } + + return RemoveTestPhoneNumberUser(t, onboardingClient) +} + // GetTestGraphQLHeaders gets relevant GraphQLHeaders for running // GraphQL acceptance tests func GetTestGraphQLHeaders( @@ -415,3 +478,138 @@ func GetTestBearerTokenHeader( return fmt.Sprintf("Bearer %s", *user.Auth.IDToken), nil } + +func testScopes() []string { + ctx := context.Background() + allPerms, _ := profileutils.AllPermissions(ctx) + + scopes := []string{} + for _, perm := range allPerms { + scopes = append(scopes, perm.Scope) + } + + return scopes +} + +// CreateTestRole creates a role that is used for testing +func CreateTestRole(t *testing.T, user profileutils.UserResponse, rootDomain, roleName string) (*profileutils.Role, error) { + type Response struct { + ID string `json:"id"` + Name string `json:"name"` + Description string `json:"description"` + Active bool `json:"active"` + Scopes []string `json:"scopes"` + Permissions []profileutils.Permission `json:"permissions"` + } + + createRolePayload := map[string]interface{}{ + "name": roleName, + "description": "A role for running tests", + "scopes": testScopes(), + } + + bs, _ := json.Marshal(createRolePayload) + payload := bytes.NewBuffer(bs) + url := fmt.Sprintf("%s/%s", rootDomain, createRole) + + req, _ := http.NewRequest(http.MethodPost, url, payload) + + req.Header.Add("Accept", "application/json") + req.Header.Add("Content-Type", "application/json") + req.Header.Add("Authorization", fmt.Sprintf("Bearer %s", *user.Auth.IDToken)) + + client := http.DefaultClient + + resp, err := client.Do(req) + if err != nil { + return nil, fmt.Errorf("HTTP error: %v", err) + + } + + if resp.StatusCode != http.StatusCreated { + return nil, fmt.Errorf("failed to create test role: expected status to be %v got %v ", http.StatusCreated, resp.StatusCode) + } + + data, err := ioutil.ReadAll(resp.Body) + if err != nil { + log.Printf("HTTP error: %v", err) + } + + var r Response + err = json.Unmarshal(data, &r) + if err != nil { + return nil, fmt.Errorf("unable to unmarshall response: %v", err) + } + + role := &profileutils.Role{ + ID: r.ID, + Name: r.Name, + Description: r.Description, + Active: r.Active, + Scopes: r.Scopes, + } + + return role, nil +} + +// AssignTestRole assigns the given role to a user +func AssignTestRole(t *testing.T, user profileutils.UserResponse, rootDomain, userID, roleID string) (bool, error) { + assignRolePayload := map[string]string{ + "userID": userID, + "roleID": roleID, + } + + bs, _ := json.Marshal(assignRolePayload) + payload := bytes.NewBuffer(bs) + url := fmt.Sprintf("%s/%s", rootDomain, assignRole) + + req, _ := http.NewRequest(http.MethodPost, url, payload) + + req.Header.Add("Accept", "application/json") + req.Header.Add("Content-Type", "application/json") + req.Header.Add("Authorization", fmt.Sprintf("Bearer %s", *user.Auth.IDToken)) + + client := http.DefaultClient + + resp, err := client.Do(req) + if err != nil { + return false, fmt.Errorf("HTTP error: %v", err) + + } + if resp.StatusCode != http.StatusOK { + return false, fmt.Errorf("failed to assign test role: expected status to be %v got %v ", http.StatusCreated, resp.StatusCode) + } + + return true, nil +} + +// RemoveTestRole removes the test role +func RemoveTestRole(t *testing.T, user profileutils.UserResponse, rootDomain, roleName string) (bool, error) { + deleteRolePayload := map[string]string{ + "name": roleName, + } + + bs, _ := json.Marshal(deleteRolePayload) + payload := bytes.NewBuffer(bs) + url := fmt.Sprintf("%s/%s", rootDomain, removeRoleByName) + + req, _ := http.NewRequest(http.MethodPost, url, payload) + + req.Header.Add("Accept", "application/json") + req.Header.Add("Content-Type", "application/json") + req.Header.Add("Authorization", fmt.Sprintf("Bearer %s", *user.Auth.IDToken)) + + client := http.DefaultClient + + resp, err := client.Do(req) + if err != nil { + return false, fmt.Errorf("HTTP error: %v", err) + + } + + if resp.StatusCode != http.StatusOK { + return false, fmt.Errorf("failed to assign test role: expected status to be %v got %v ", http.StatusCreated, resp.StatusCode) + } + + return true, nil +} diff --git a/test_utils_test.go b/test_utils_test.go index fafe91d..ca9cc92 100644 --- a/test_utils_test.go +++ b/test_utils_test.go @@ -6,6 +6,7 @@ import ( "testing" "github.com/savannahghi/interserviceclient" + "github.com/savannahghi/profileutils" "github.com/sirupsen/logrus" ) @@ -219,6 +220,13 @@ func TestCreateOrLoginTestPhoneNumberUser(t *testing.T) { } }) } + + // clean up + err = interserviceclient.RemoveTestPhoneNumberUser(t, onboardingClient) + if err != nil { + t.Errorf("failed to remove test user: %v", err) + return + } } func TestRemoveTestPhoneNumberUser(t *testing.T) { @@ -319,9 +327,155 @@ func TestUpdateBioData(t *testing.T) { } }) } + + // clean up + err = interserviceclient.RemoveTestPhoneNumberUser(t, onboardingClient) + if err != nil { + t.Errorf("failed to remove test user: %v", err) + return + } +} + +func TestCreateTestRole(t *testing.T) { + onboardingClient, err := onboardingISCClient() + if err != nil { + t.Errorf("failed to initialize onboarding test ISC client") + return + } + + response, err := interserviceclient.CreateOrLoginTestPhoneNumberUser(t, onboardingClient) + if err != nil { + t.Errorf("unable to create user %v", err) + return + } + + // used in test clean up + var userID, roleID, roleName string + userID = response.Profile.ID + roleName = "Test Create Role" + + type args struct { + t *testing.T + user profileutils.UserResponse + rootDomain string + roleName string + } + tests := []struct { + name string + args args + want *profileutils.Role + wantErr bool + }{ + { + name: "success: create test role", + args: args{ + t: t, + user: *response, + rootDomain: OnboardingRootDomain, + roleName: roleName, + }, + wantErr: false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := interserviceclient.CreateTestRole(tt.args.t, tt.args.user, tt.args.rootDomain, tt.args.roleName) + if (err != nil) != tt.wantErr { + t.Errorf("CreateTestRole() error = %v, wantErr %v", err, tt.wantErr) + return + } + if !tt.wantErr && got == nil { + t.Errorf("CreateTestRole() = %v, want %v", got, tt.want) + } + roleID = got.ID + }) + } + + // clean up + interserviceclient.AssignTestRole(t, *response, OnboardingRootDomain, userID, roleID) + interserviceclient.RemoveTestRole(t, *response, OnboardingRootDomain, roleName) + err = interserviceclient.RemoveTestPhoneNumberUser(t, onboardingClient) + if err != nil { + t.Errorf("failed to remove test user: %v", err) + return + } +} + +func TestAssignTestRole(t *testing.T) { + onboardingClient, err := onboardingISCClient() + if err != nil { + t.Errorf("failed to initialize onboarding test ISC client") + return + } + + response, err := interserviceclient.CreateOrLoginTestPhoneNumberUser(t, onboardingClient) + if err != nil { + t.Errorf("unable to create user %v", err) + return + } + + // used in test clean up + roleName := "Test Assign Role" + + role, err := interserviceclient.CreateTestRole(t, *response, OnboardingRootDomain, roleName) + if err != nil { + t.Errorf("unable to create test role %v", err) + return + } + + type args struct { + t *testing.T + user profileutils.UserResponse + rootDomain string + userID string + roleID string + } + tests := []struct { + name string + args args + want bool + wantErr bool + }{ + { + name: "success: assign test role", + args: args{ + t: t, + user: *response, + rootDomain: OnboardingRootDomain, + userID: response.Profile.ID, + roleID: role.ID, + }, + want: true, + wantErr: false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := interserviceclient.AssignTestRole(tt.args.t, tt.args.user, tt.args.rootDomain, tt.args.userID, tt.args.roleID) + if (err != nil) != tt.wantErr { + t.Errorf("AssignTestRole() error = %v, wantErr %v", err, tt.wantErr) + return + } + if got != tt.want { + t.Errorf("AssignTestRole() = %v, want %v", got, tt.want) + } + }) + } + + // clean up + _, err = interserviceclient.RemoveTestRole(t, *response, OnboardingRootDomain, roleName) + if err != nil { + t.Errorf("failed to remove test role: %v", err) + return + } + err = interserviceclient.RemoveTestPhoneNumberUser(t, onboardingClient) + if err != nil { + t.Errorf("failed to remove test user: %v", err) + return + } } -func TestAddAdminPermissions(t *testing.T) { +func TestRemoveTestRole(t *testing.T) { onboardingClient, err := onboardingISCClient() if err != nil { t.Errorf("failed to initialize onboarding test ISC client") @@ -334,40 +488,113 @@ func TestAddAdminPermissions(t *testing.T) { return } + roleName := "Test Delete Role" + + role, err := interserviceclient.CreateTestRole(t, *response, OnboardingRootDomain, roleName) + if err != nil { + t.Errorf("unable to create test role %v", err) + return + } + + _, err = interserviceclient.AssignTestRole(t, *response, OnboardingRootDomain, response.Profile.ID, role.ID) + if err != nil { + t.Errorf("unable to assign test role %v", err) + return + } + + type args struct { + t *testing.T + user profileutils.UserResponse + rootDomain string + roleName string + } + tests := []struct { + name string + args args + want bool + wantErr bool + }{ + { + name: "success: remove test role", + args: args{ + t: t, + user: *response, + rootDomain: OnboardingRootDomain, + roleName: roleName, + }, + want: true, + wantErr: false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := interserviceclient.RemoveTestRole(tt.args.t, tt.args.user, tt.args.rootDomain, tt.args.roleName) + if (err != nil) != tt.wantErr { + t.Errorf("RemoveTestRole() error = %v, wantErr %v", err, tt.wantErr) + return + } + if got != tt.want { + t.Errorf("RemoveTestRole() = %v, want %v", got, tt.want) + } + }) + } + + // clean up + err = interserviceclient.RemoveTestPhoneNumberUser(t, onboardingClient) + if err != nil { + t.Errorf("failed to remove test user: %v", err) + return + } +} + +func TestCreateOrLoginTestPhoneNumberAuthorizedUser(t *testing.T) { + onboardingClient, err := onboardingISCClient() + if err != nil { + t.Errorf("failed to initialize onboarding test ISC client") + } + type args struct { t *testing.T onboardingClient *interserviceclient.InterServiceClient - phone string } tests := []struct { name string args args + want *profileutils.UserResponse wantErr bool }{ { - name: "happy case :)", + name: "success: create a test user successfully", args: args{ - t: t, onboardingClient: onboardingClient, - phone: *response.Profile.PrimaryPhone, }, wantErr: false, }, { - name: "sad case :(", + name: "failure: failed to create a test user successfully", args: args{ - t: t, - onboardingClient: onboardingClient, - phone: "not-a-phone-number", + onboardingClient: nil, }, wantErr: true, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if err := interserviceclient.AddAdminPermissions(tt.args.t, tt.args.onboardingClient, tt.args.phone); (err != nil) != tt.wantErr { - t.Errorf("AddAdminPermissions() error = %v, wantErr %v", err, tt.wantErr) + got, err := interserviceclient.CreateOrLoginTestPhoneNumberAuthorizedUser(tt.args.t, tt.args.onboardingClient) + if (err != nil) != tt.wantErr { + t.Errorf("CreateOrLoginTestPhoneNumberAuthorizedUser() error = %v, wantErr %v", err, tt.wantErr) + return + } + if !tt.wantErr && got == nil { + t.Errorf("CreateOrLoginTestPhoneNumberAuthorizedUser() = %v, want %v", got, tt.want) } }) } + + // clean up + err = interserviceclient.RemoveTestPhoneNumberAuthorizedUser(t, onboardingClient) + if err != nil { + t.Errorf("failed to remove test user: %v", err) + return + } }