github.com/minio/console@v1.3.0/integration/users_test.go (about)

     1  // This file is part of MinIO Console Server
     2  // Copyright (c) 2022 MinIO, Inc.
     3  //
     4  // This program is free software: you can redistribute it and/or modify
     5  // it under the terms of the GNU Affero General Public License as published by
     6  // the Free Software Foundation, either version 3 of the License, or
     7  // (at your option) any later version.
     8  //
     9  // This program is distributed in the hope that it will be useful,
    10  // but WITHOUT ANY WARRANTY; without even the implied warranty of
    11  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    12  // GNU Affero General Public License for more details.
    13  //
    14  // You should have received a copy of the GNU Affero General Public License
    15  // along with this program.  If not, see <http://www.gnu.org/licenses/>.
    16  
    17  package integration
    18  
    19  import (
    20  	"bytes"
    21  	"encoding/base64"
    22  	"encoding/json"
    23  	"fmt"
    24  	"io"
    25  	"log"
    26  	"net/http"
    27  	"strconv"
    28  	"strings"
    29  	"testing"
    30  	"time"
    31  
    32  	"github.com/stretchr/testify/assert"
    33  )
    34  
    35  func AddUser(accessKey, secretKey string, groups, policies []string) (*http.Response, error) {
    36  	/*
    37  		This is an atomic function to add user and can be reused across
    38  		different functions.
    39  	*/
    40  	client := &http.Client{
    41  		Timeout: 3 * time.Second,
    42  	}
    43  
    44  	requestDataAdd := map[string]interface{}{
    45  		"accessKey": accessKey,
    46  		"secretKey": secretKey,
    47  		"groups":    groups,
    48  		"policies":  policies,
    49  	}
    50  
    51  	requestDataJSON, _ := json.Marshal(requestDataAdd)
    52  	requestDataBody := bytes.NewReader(requestDataJSON)
    53  	request, err := http.NewRequest(
    54  		"POST", "http://localhost:9090/api/v1/users", requestDataBody)
    55  	if err != nil {
    56  		log.Println(err)
    57  	}
    58  	request.Header.Add("Cookie", fmt.Sprintf("token=%s", token))
    59  	request.Header.Add("Content-Type", "application/json")
    60  
    61  	response, err := client.Do(request)
    62  	return response, err
    63  }
    64  
    65  func DeleteUser(userName string) (*http.Response, error) {
    66  	userName = base64.StdEncoding.EncodeToString([]byte(userName))
    67  	/*
    68  		This is an atomic function to delete user and can be reused across
    69  		different functions.
    70  	*/
    71  	client := &http.Client{
    72  		Timeout: 3 * time.Second,
    73  	}
    74  	request, err := http.NewRequest(
    75  		"DELETE", "http://localhost:9090/api/v1/user/"+userName, nil)
    76  	if err != nil {
    77  		log.Println(err)
    78  	}
    79  	request.Header.Add("Cookie", fmt.Sprintf("token=%s", token))
    80  	request.Header.Add("Content-Type", "application/json")
    81  	response, err := client.Do(request)
    82  	return response, err
    83  }
    84  
    85  func ListUsers(offset, limit string) (*http.Response, error) {
    86  	/*
    87  		This is an atomic function to list users.
    88  		{{baseUrl}}/users?offset=-5480083&limit=-5480083
    89  	*/
    90  	client := &http.Client{
    91  		Timeout: 3 * time.Second,
    92  	}
    93  	request, err := http.NewRequest(
    94  		"GET",
    95  		"http://localhost:9090/api/v1/users?offset="+offset+"&limit="+limit,
    96  		nil)
    97  	if err != nil {
    98  		log.Println(err)
    99  	}
   100  	request.Header.Add("Cookie", fmt.Sprintf("token=%s", token))
   101  	request.Header.Add("Content-Type", "application/json")
   102  	response, err := client.Do(request)
   103  	return response, err
   104  }
   105  
   106  func GetUserInformation(userName string) (*http.Response, error) {
   107  	userName = base64.StdEncoding.EncodeToString([]byte(userName))
   108  	/*
   109  		Helper function to get user information via API:
   110  		{{baseUrl}}/user?name=proident velit
   111  	*/
   112  	client := &http.Client{
   113  		Timeout: 3 * time.Second,
   114  	}
   115  	request, err := http.NewRequest(
   116  		"GET",
   117  		"http://localhost:9090/api/v1/user/"+userName,
   118  		nil)
   119  	if err != nil {
   120  		log.Println(err)
   121  	}
   122  	request.Header.Add("Cookie", fmt.Sprintf("token=%s", token))
   123  	request.Header.Add("Content-Type", "application/json")
   124  	response, err := client.Do(request)
   125  	return response, err
   126  }
   127  
   128  func UpdateUserInformation(name, status string, groups []string) (*http.Response, error) {
   129  	name = base64.StdEncoding.EncodeToString([]byte(name))
   130  	/*
   131  		Helper function to update user information:
   132  		PUT: {{baseUrl}}/user?name=proident velit
   133  		Body:
   134  		{
   135  			"status": "nisi voluptate amet ea",
   136  			"groups": [
   137  				"ipsum eu cupidatat",
   138  				"aliquip non nulla"
   139  			]
   140  		}
   141  	*/
   142  	client := &http.Client{
   143  		Timeout: 3 * time.Second,
   144  	}
   145  	requestDataAdd := map[string]interface{}{
   146  		"status": status,
   147  		"groups": groups,
   148  	}
   149  	requestDataJSON, _ := json.Marshal(requestDataAdd)
   150  	requestDataBody := bytes.NewReader(requestDataJSON)
   151  	request, err := http.NewRequest(
   152  		"PUT", "http://localhost:9090/api/v1/user/"+name, requestDataBody)
   153  	if err != nil {
   154  		log.Println(err)
   155  	}
   156  	request.Header.Add("Cookie", fmt.Sprintf("token=%s", token))
   157  	request.Header.Add("Content-Type", "application/json")
   158  	response, err := client.Do(request)
   159  	return response, err
   160  }
   161  
   162  func RemoveUser(name string) (*http.Response, error) {
   163  	name = base64.StdEncoding.EncodeToString([]byte(name))
   164  	/*
   165  		Helper function to remove user.
   166  		DELETE: {{baseUrl}}/user?name=proident velit
   167  	*/
   168  	client := &http.Client{
   169  		Timeout: 3 * time.Second,
   170  	}
   171  	request, err := http.NewRequest(
   172  		"DELETE", "http://localhost:9090/api/v1/user/"+name, nil)
   173  	if err != nil {
   174  		log.Println(err)
   175  	}
   176  	request.Header.Add("Cookie", fmt.Sprintf("token=%s", token))
   177  	request.Header.Add("Content-Type", "application/json")
   178  	response, err := client.Do(request)
   179  	return response, err
   180  }
   181  
   182  func UpdateGroupsForAUser(userName string, groups []string) (*http.Response, error) {
   183  	userName = base64.StdEncoding.EncodeToString([]byte(userName))
   184  	/*
   185  		Helper function to update groups for a user
   186  		PUT: {{baseUrl}}/user/groups?name=username
   187  		{
   188  			"groups":[
   189  				"groupone",
   190  				"grouptwo"
   191  			]
   192  		}
   193  	*/
   194  	client := &http.Client{
   195  		Timeout: 3 * time.Second,
   196  	}
   197  	requestDataAdd := map[string]interface{}{
   198  		"groups": groups,
   199  	}
   200  	requestDataJSON, _ := json.Marshal(requestDataAdd)
   201  	requestDataBody := bytes.NewReader(requestDataJSON)
   202  	request, err := http.NewRequest(
   203  		"PUT",
   204  		"http://localhost:9090/api/v1/user/"+userName+"/groups",
   205  		requestDataBody,
   206  	)
   207  	if err != nil {
   208  		log.Println(err)
   209  	}
   210  	request.Header.Add("Cookie", fmt.Sprintf("token=%s", token))
   211  	request.Header.Add("Content-Type", "application/json")
   212  	response, err := client.Do(request)
   213  	return response, err
   214  }
   215  
   216  func CreateServiceAccountForUser(userName, policy string) (*http.Response, error) {
   217  	userName = base64.StdEncoding.EncodeToString([]byte(userName))
   218  	/*
   219  		Helper function to Create Service Account for user
   220  		POST: api/v1/user/username/service-accounts
   221  		{
   222  			"policy": "ad magna"
   223  		}
   224  	*/
   225  	client := &http.Client{
   226  		Timeout: 3 * time.Second,
   227  	}
   228  	requestDataAdd := map[string]interface{}{
   229  		"policy": policy,
   230  	}
   231  	requestDataJSON, _ := json.Marshal(requestDataAdd)
   232  	requestDataBody := bytes.NewReader(requestDataJSON)
   233  	request, err := http.NewRequest(
   234  		"POST",
   235  		"http://localhost:9090/api/v1/user/"+userName+"/service-accounts",
   236  		requestDataBody,
   237  	)
   238  	if err != nil {
   239  		log.Println(err)
   240  	}
   241  	request.Header.Add("Cookie", fmt.Sprintf("token=%s", token))
   242  	request.Header.Add("Content-Type", "application/json")
   243  	response, err := client.Do(request)
   244  	return response, err
   245  }
   246  
   247  func CreateServiceAccountForUserWithCredentials(userName, policy, accessKey, secretKey string) (*http.Response, error) {
   248  	userName = base64.StdEncoding.EncodeToString([]byte(userName))
   249  	// Helper function to test "Create Service Account for User With Credentials" end point.
   250  	client := &http.Client{
   251  		Timeout: 3 * time.Second,
   252  	}
   253  	requestDataAdd := map[string]interface{}{
   254  		"policy":    policy,
   255  		"accessKey": accessKey,
   256  		"secretKey": secretKey,
   257  	}
   258  	requestDataJSON, _ := json.Marshal(requestDataAdd)
   259  	requestDataBody := bytes.NewReader(requestDataJSON)
   260  	request, err := http.NewRequest(
   261  		"POST",
   262  		"http://localhost:9090/api/v1/user/"+userName+"/service-account-credentials",
   263  		requestDataBody,
   264  	)
   265  	if err != nil {
   266  		log.Println(err)
   267  	}
   268  	request.Header.Add("Cookie", fmt.Sprintf("token=%s", token))
   269  	request.Header.Add("Content-Type", "application/json")
   270  	response, err := client.Do(request)
   271  	return response, err
   272  }
   273  
   274  func ReturnsAListOfServiceAccountsForAUser(userName string) (*http.Response, error) {
   275  	userName = base64.StdEncoding.EncodeToString([]byte(userName))
   276  	/*
   277  		Helper function to return a list of service accounts for a user.
   278  		GET: {{baseUrl}}/user/:name/service-accounts
   279  	*/
   280  	client := &http.Client{
   281  		Timeout: 3 * time.Second,
   282  	}
   283  	request, err := http.NewRequest(
   284  		"GET",
   285  		"http://localhost:9090/api/v1/user/"+userName+"/service-accounts",
   286  		nil,
   287  	)
   288  	if err != nil {
   289  		log.Println(err)
   290  	}
   291  	request.Header.Add("Cookie", fmt.Sprintf("token=%s", token))
   292  	request.Header.Add("Content-Type", "application/json")
   293  	response, err := client.Do(request)
   294  	return response, err
   295  }
   296  
   297  func AddGroup(group string, members []string) (*http.Response, error) {
   298  	/*
   299  		Helper function to add a group.
   300  	*/
   301  	client := &http.Client{
   302  		Timeout: 3 * time.Second,
   303  	}
   304  	requestDataAdd := map[string]interface{}{
   305  		"group":   group,
   306  		"members": members,
   307  	}
   308  	requestDataJSON, _ := json.Marshal(requestDataAdd)
   309  	requestDataBody := bytes.NewReader(requestDataJSON)
   310  	request, err := http.NewRequest(
   311  		"POST",
   312  		"http://localhost:9090/api/v1/groups",
   313  		requestDataBody,
   314  	)
   315  	if err != nil {
   316  		log.Println(err)
   317  	}
   318  	request.Header.Add("Cookie", fmt.Sprintf("token=%s", token))
   319  	request.Header.Add("Content-Type", "application/json")
   320  	response, err := client.Do(request)
   321  	return response, err
   322  }
   323  
   324  func UsersGroupsBulk(users, groups []string) (*http.Response, error) {
   325  	/*
   326  		Helper function to test Bulk functionality to Add Users to Groups.
   327  		PUT: {{baseUrl}}/users-groups-bulk
   328  		{
   329  			"users": [
   330  				"magna id",
   331  				"enim sit tempor incididunt"
   332  			],
   333  			"groups": [
   334  				"nisi est esse",
   335  				"fugiat eu"
   336  			]
   337  		}
   338  	*/
   339  	requestDataAdd := map[string]interface{}{
   340  		"users":  users,
   341  		"groups": groups,
   342  	}
   343  	requestDataJSON, _ := json.Marshal(requestDataAdd)
   344  	requestDataBody := bytes.NewReader(requestDataJSON)
   345  	request, err := http.NewRequest(
   346  		"PUT",
   347  		"http://localhost:9090/api/v1/users-groups-bulk",
   348  		requestDataBody,
   349  	)
   350  	if err != nil {
   351  		log.Println(err)
   352  	}
   353  	request.Header.Add("Cookie", fmt.Sprintf("token=%s", token))
   354  	request.Header.Add("Content-Type", "application/json")
   355  	client := &http.Client{
   356  		Timeout: 2 * time.Second,
   357  	}
   358  	response, err := client.Do(request)
   359  	return response, err
   360  }
   361  
   362  func TestAddUser(t *testing.T) {
   363  	/*
   364  		This is an API Test to add a user via api/v1/users, the intention
   365  		is simple, add a user and make sure the response is 201 meaning that the
   366  		user got added successfully.
   367  		After test completion, it is expected that user is removed, so other
   368  		tests like users.ts can run over clean data and we don't collide against
   369  		it.
   370  	*/
   371  
   372  	assert := assert.New(t)
   373  
   374  	// With no groups & no policies
   375  	groups := []string{}
   376  	policies := []string{}
   377  	response, err := AddUser("accessKey", "secretKey", groups, policies)
   378  	if err != nil {
   379  		log.Println(err)
   380  		return
   381  	}
   382  	if response != nil {
   383  		fmt.Println("POST StatusCode:", response.StatusCode)
   384  		assert.Equal(201, response.StatusCode, "Status Code is incorrect")
   385  	}
   386  
   387  	response, err = DeleteUser("accessKey")
   388  	if err != nil {
   389  		log.Println(err)
   390  		return
   391  	}
   392  	if response != nil {
   393  		fmt.Println("DELETE StatusCode:", response.StatusCode)
   394  		assert.Equal(204, response.StatusCode, "has to be 204 when delete user")
   395  	}
   396  }
   397  
   398  func TestListUsers(t *testing.T) {
   399  	/*
   400  		This test is intended to list users via API.
   401  		1. First, it creates the users
   402  		2. Then, it lists the users <------ 200 is expected when listing them.
   403  		3. Finally, it deletes the users
   404  	*/
   405  
   406  	assert := assert.New(t)
   407  
   408  	// With no groups & no policies
   409  	groups := []string{}
   410  	policies := []string{}
   411  
   412  	// 1. Create the users
   413  	numberOfUsers := 5
   414  	for i := 1; i < numberOfUsers; i++ {
   415  		response, err := AddUser(
   416  			strconv.Itoa(i)+"accessKey"+strconv.Itoa(i),
   417  			"secretKey"+strconv.Itoa(i), groups, policies)
   418  		if err != nil {
   419  			log.Println(err)
   420  			return
   421  		}
   422  		if response != nil {
   423  			fmt.Println("POST StatusCode:", response.StatusCode)
   424  			assert.Equal(201, response.StatusCode,
   425  				"Status Code is incorrect on index: "+strconv.Itoa(i))
   426  		}
   427  
   428  		b, err := io.ReadAll(response.Body)
   429  		if err != nil {
   430  			log.Fatalln(err)
   431  		}
   432  		fmt.Println(string(b))
   433  	}
   434  
   435  	// 2. List the users
   436  	listResponse, listError := ListUsers("-5480083", "-5480083")
   437  	if listError != nil {
   438  		log.Fatalln(listError)
   439  	}
   440  	if listResponse != nil {
   441  		fmt.Println("POST StatusCode:", listResponse.StatusCode)
   442  		assert.Equal(200, listResponse.StatusCode,
   443  			"TestListUsers(): Status Code is incorrect when listing users")
   444  	}
   445  	b, err := io.ReadAll(listResponse.Body)
   446  	if err != nil {
   447  		log.Fatalln(err)
   448  	}
   449  	fmt.Println(string(b))
   450  
   451  	// 3. Delete the users
   452  	for i := 1; i < numberOfUsers; i++ {
   453  		response, err := DeleteUser(
   454  			strconv.Itoa(i) + "accessKey" + strconv.Itoa(i))
   455  		if err != nil {
   456  			log.Println(err)
   457  			return
   458  		}
   459  		if response != nil {
   460  			fmt.Println("DELETE StatusCode:", response.StatusCode)
   461  			assert.Equal(204,
   462  				response.StatusCode, "has to be 204 when delete user")
   463  		}
   464  	}
   465  }
   466  
   467  func TestGetUserInfo(t *testing.T) {
   468  	/*
   469  		Test to get the user information via API.
   470  	*/
   471  
   472  	// 1. Create the user
   473  	fmt.Println("TestGetUserInfo(): 1. Create the user")
   474  	assert := assert.New(t)
   475  	groups := []string{}
   476  	policies := []string{}
   477  	response, err := AddUser("accessKey", "secretKey", groups, policies)
   478  	if err != nil {
   479  		log.Println(err)
   480  		return
   481  	}
   482  	if response != nil {
   483  		fmt.Println("POST StatusCode:", response.StatusCode)
   484  		assert.Equal(201, response.StatusCode, "Status Code is incorrect")
   485  	}
   486  
   487  	// 2. Get user information
   488  	fmt.Println("TestGetUserInfo(): 2. Get user information")
   489  	response, err = GetUserInformation("accessKey")
   490  	if err != nil {
   491  		log.Println(err)
   492  		assert.Fail("There was an error in the response")
   493  		return
   494  	}
   495  
   496  	// 3. Verify user information
   497  	fmt.Println("TestGetUserInfo(): 3. Verify user information")
   498  	if response != nil {
   499  		fmt.Println("POST StatusCode:", response.StatusCode)
   500  		assert.Equal(200, response.StatusCode, "Status Code is incorrect")
   501  	}
   502  	b, err := io.ReadAll(response.Body)
   503  	if err != nil {
   504  		log.Fatalln(err)
   505  	}
   506  	fmt.Println(string(b))
   507  	expected := "{\"accessKey\":\"accessKey\",\"memberOf\":null,\"policy\":[],\"status\":\"enabled\"}\n"
   508  	obtained := string(b)
   509  	assert.Equal(expected, obtained, "User Information is wrong")
   510  }
   511  
   512  func TestUpdateUserInfoSuccessfulResponse(t *testing.T) {
   513  	/*
   514  		Update User Information Test with Successful Response
   515  	*/
   516  
   517  	assert := assert.New(t)
   518  
   519  	// 1. Create an active user
   520  	groups := []string{}
   521  	policies := []string{}
   522  	addUserResponse, addUserError := AddUser(
   523  		"updateuser", "secretKey", groups, policies)
   524  	if addUserError != nil {
   525  		log.Println(addUserError)
   526  		return
   527  	}
   528  	if addUserResponse != nil {
   529  		fmt.Println("StatusCode:", addUserResponse.StatusCode)
   530  		assert.Equal(
   531  			201, addUserResponse.StatusCode, "Status Code is incorrect")
   532  	}
   533  
   534  	// 2. Deactivate the user
   535  	// '{"status":"disabled","groups":[]}'
   536  	updateUserResponse, UpdateUserError := UpdateUserInformation(
   537  		"updateuser", "disabled", groups)
   538  
   539  	// 3. Verify user got deactivated
   540  	if UpdateUserError != nil {
   541  		log.Println(UpdateUserError)
   542  		return
   543  	}
   544  	if updateUserResponse != nil {
   545  		fmt.Println("StatusCode:", updateUserResponse.StatusCode)
   546  		assert.Equal(
   547  			200, updateUserResponse.StatusCode, "Status Code is incorrect")
   548  	}
   549  	b, err := io.ReadAll(updateUserResponse.Body)
   550  	if err != nil {
   551  		log.Fatalln(err)
   552  	}
   553  	assert.True(strings.Contains(string(b), "disabled"))
   554  }
   555  
   556  func TestUpdateUserInfoGenericErrorResponse(t *testing.T) {
   557  	/*
   558  		Update User Information Test with Generic Error Response
   559  	*/
   560  
   561  	assert := assert.New(t)
   562  
   563  	// 1. Create an active user
   564  	groups := []string{}
   565  	policies := []string{}
   566  	addUserResponse, addUserError := AddUser(
   567  		"updateusererror", "secretKey", groups, policies)
   568  	if addUserError != nil {
   569  		log.Println(addUserError)
   570  		return
   571  	}
   572  	if addUserResponse != nil {
   573  		fmt.Println("StatusCode:", addUserResponse.StatusCode)
   574  		assert.Equal(
   575  			201, addUserResponse.StatusCode, "Status Code is incorrect")
   576  	}
   577  
   578  	// 2. Deactivate the user with wrong status
   579  	updateUserResponse, UpdateUserError := UpdateUserInformation(
   580  		"updateusererror", "inactive", groups)
   581  
   582  	// 3. Verify user got deactivated
   583  	if UpdateUserError != nil {
   584  		log.Println(UpdateUserError)
   585  		assert.Fail("There was an error while updating user info")
   586  		return
   587  	}
   588  	if updateUserResponse != nil {
   589  		fmt.Println("StatusCode:", updateUserResponse.StatusCode)
   590  		assert.Equal(
   591  			500, updateUserResponse.StatusCode, "Status Code is incorrect")
   592  	}
   593  	b, err := io.ReadAll(updateUserResponse.Body)
   594  	if err != nil {
   595  		log.Fatalln(err)
   596  	}
   597  	assert.True(strings.Contains(string(b), "status not valid"))
   598  }
   599  
   600  func TestRemoveUserSuccessfulResponse(t *testing.T) {
   601  	/*
   602  		To test removing a user from API
   603  	*/
   604  
   605  	assert := assert.New(t)
   606  
   607  	// 1. Create an active user
   608  	groups := []string{}
   609  	policies := []string{}
   610  	addUserResponse, addUserError := AddUser(
   611  		"testremoveuser1", "secretKey", groups, policies)
   612  	if addUserError != nil {
   613  		log.Println(addUserError)
   614  		return
   615  	}
   616  	if addUserResponse != nil {
   617  		fmt.Println("StatusCode:", addUserResponse.StatusCode)
   618  		assert.Equal(
   619  			201, addUserResponse.StatusCode, "Status Code is incorrect")
   620  	}
   621  
   622  	// 2. Remove the user
   623  	removeUserResponse, removeUserError := RemoveUser("testremoveuser1")
   624  	if removeUserError != nil {
   625  		log.Println(removeUserError)
   626  		return
   627  	}
   628  	if removeUserResponse != nil {
   629  		fmt.Println("StatusCode:", removeUserResponse.StatusCode)
   630  		assert.Equal(
   631  			204, removeUserResponse.StatusCode, "Status Code is incorrect")
   632  	}
   633  
   634  	// 3. Verify the user got removed
   635  	getUserInfoResponse, getUserInfoError := GetUserInformation(
   636  		"testremoveuser1")
   637  	if getUserInfoError != nil {
   638  		log.Println(getUserInfoError)
   639  		assert.Fail("There was an error in the response")
   640  		return
   641  	}
   642  	if getUserInfoResponse != nil {
   643  		fmt.Println("StatusCode:", getUserInfoResponse.StatusCode)
   644  		assert.Equal(
   645  			404, getUserInfoResponse.StatusCode, "Status Code is incorrect")
   646  	}
   647  	finalResponse := inspectHTTPResponse(getUserInfoResponse)
   648  	fmt.Println(finalResponse)
   649  	assert.True(strings.Contains(
   650  		finalResponse, "The specified user does not exist"), finalResponse)
   651  }
   652  
   653  func TestUpdateGroupsForAUser(t *testing.T) {
   654  	/*
   655  		To test Update Groups For a User End Point.
   656  	*/
   657  
   658  	// 1. Create the user
   659  	numberOfGroups := 3
   660  	groupName := "updategroupforausergroup"
   661  	userName := "updategroupsforauser1"
   662  	assert := assert.New(t)
   663  	groups := []string{}
   664  	policies := []string{}
   665  	response, err := AddUser(userName, "secretKey", groups, policies)
   666  	if err != nil {
   667  		log.Println(err)
   668  		return
   669  	}
   670  	if response != nil {
   671  		fmt.Println("StatusCode:", response.StatusCode)
   672  		assert.Equal(201, response.StatusCode, "Status Code is incorrect")
   673  	}
   674  
   675  	// 2. Update the groups of the created user with newGroups
   676  	newGroups := make([]string, 3)
   677  	for i := 0; i < numberOfGroups; i++ {
   678  		newGroups[i] = groupName + strconv.Itoa(i)
   679  	}
   680  	response, err = UpdateGroupsForAUser(userName, newGroups)
   681  	if err != nil {
   682  		log.Println(err)
   683  		return
   684  	}
   685  	if response != nil {
   686  		fmt.Println("StatusCode:", response.StatusCode)
   687  		assert.Equal(200, response.StatusCode, "Status Code is incorrect")
   688  	}
   689  
   690  	// 3. Verify the newGroups were updated accordingly
   691  	getUserInfoResponse, getUserInfoErr := GetUserInformation(userName)
   692  	if getUserInfoErr != nil {
   693  		log.Println(getUserInfoErr)
   694  		assert.Fail("There was an error in the response")
   695  		return
   696  	}
   697  	if getUserInfoResponse != nil {
   698  		fmt.Println("StatusCode:", getUserInfoResponse.StatusCode)
   699  		assert.Equal(
   700  			200, getUserInfoResponse.StatusCode, "Status Code is incorrect")
   701  	}
   702  	finalResponse := inspectHTTPResponse(getUserInfoResponse)
   703  	for i := 0; i < numberOfGroups; i++ {
   704  		assert.True(strings.Contains(
   705  			finalResponse, groupName+strconv.Itoa(i)), finalResponse)
   706  	}
   707  }
   708  
   709  func TestCreateServiceAccountForUser(t *testing.T) {
   710  	/*
   711  		To test creation of service account for a user.
   712  	*/
   713  
   714  	// Test's variables
   715  	userName := "testcreateserviceaccountforuser1"
   716  	assert := assert.New(t)
   717  	policy := ""
   718  
   719  	// 1. Create the user
   720  	groups := []string{}
   721  	policies := []string{}
   722  	response, err := AddUser(userName, "secretKey", groups, policies)
   723  	if err != nil {
   724  		log.Println(err)
   725  		return
   726  	}
   727  	if response != nil {
   728  		fmt.Println("StatusCode:", response.StatusCode)
   729  		assert.Equal(201, response.StatusCode, "Status Code is incorrect")
   730  	}
   731  
   732  	// 2. Create the service account for the user
   733  	createServiceAccountResponse,
   734  		createServiceAccountError := CreateServiceAccountForUser(
   735  		userName,
   736  		policy,
   737  	)
   738  	if createServiceAccountError != nil {
   739  		log.Println(createServiceAccountError)
   740  		assert.Fail("Error in createServiceAccountError")
   741  	}
   742  	if createServiceAccountResponse != nil {
   743  		fmt.Println("StatusCode:", createServiceAccountResponse.StatusCode)
   744  		assert.Equal(
   745  			201, createServiceAccountResponse.StatusCode,
   746  			inspectHTTPResponse(createServiceAccountResponse),
   747  		)
   748  	}
   749  
   750  	// 3. Verify the service account for the user
   751  	listOfAccountsResponse, listOfAccountsError := ReturnsAListOfServiceAccountsForAUser(userName)
   752  
   753  	fmt.Println(listOfAccountsResponse, listOfAccountsError)
   754  
   755  	if listOfAccountsError != nil {
   756  		log.Println(listOfAccountsError)
   757  		assert.Fail("Error in listOfAccountsError")
   758  	}
   759  	finalResponse := inspectHTTPResponse(listOfAccountsResponse)
   760  	if listOfAccountsResponse != nil {
   761  		fmt.Println("StatusCode:", listOfAccountsResponse.StatusCode)
   762  		assert.Equal(
   763  			200, listOfAccountsResponse.StatusCode,
   764  			finalResponse,
   765  		)
   766  	}
   767  }
   768  
   769  func TestUsersGroupsBulk(t *testing.T) {
   770  	/*
   771  		To test UsersGroupsBulk End Point
   772  	*/
   773  
   774  	// Vars
   775  	assert := assert.New(t)
   776  	numberOfUsers := 5
   777  	numberOfGroups := 1
   778  	// var groups = []string{}
   779  	policies := []string{}
   780  	username := "testusersgroupbulk"
   781  	groupName := "testusersgroupsbulkgroupone"
   782  	members := []string{}
   783  	users := make([]string, numberOfUsers)
   784  	groups := make([]string, numberOfGroups)
   785  
   786  	// 1. Create some users
   787  	for i := 0; i < numberOfUsers; i++ {
   788  		users[i] = username + strconv.Itoa(i)
   789  		response, err := AddUser(
   790  			users[i],
   791  			"secretKey"+strconv.Itoa(i), []string{}, policies)
   792  		if err != nil {
   793  			log.Println(err)
   794  			return
   795  		}
   796  		if response != nil {
   797  			fmt.Println("POST StatusCode:", response.StatusCode)
   798  			assert.Equal(201, response.StatusCode,
   799  				"Status Code is incorrect on index: "+strconv.Itoa(i))
   800  		}
   801  	}
   802  
   803  	// 2. Create a group with no members
   804  	responseAddGroup, errorAddGroup := AddGroup(groupName, members)
   805  	if errorAddGroup != nil {
   806  		log.Println(errorAddGroup)
   807  		return
   808  	}
   809  	finalResponse := inspectHTTPResponse(responseAddGroup)
   810  	if responseAddGroup != nil {
   811  		fmt.Println("POST StatusCode:", responseAddGroup.StatusCode)
   812  		assert.Equal(
   813  			201,
   814  			responseAddGroup.StatusCode,
   815  			finalResponse,
   816  		)
   817  	}
   818  
   819  	// 3. Add users to the group
   820  	groups[0] = groupName
   821  	responseUsersGroupsBulk, errorUsersGroupsBulk := UsersGroupsBulk(
   822  		users,
   823  		groups,
   824  	)
   825  	if errorUsersGroupsBulk != nil {
   826  		log.Println(errorUsersGroupsBulk)
   827  		return
   828  	}
   829  	finalResponse = inspectHTTPResponse(responseUsersGroupsBulk)
   830  	if responseUsersGroupsBulk != nil {
   831  		fmt.Println("POST StatusCode:", responseUsersGroupsBulk.StatusCode)
   832  		assert.Equal(
   833  			200,
   834  			responseUsersGroupsBulk.StatusCode,
   835  			finalResponse,
   836  		)
   837  	}
   838  
   839  	// 4. Verify users got added to the group
   840  	for i := 0; i < numberOfUsers; i++ {
   841  		responseGetUserInfo, errGetUserInfo := GetUserInformation(
   842  			username + strconv.Itoa(i),
   843  		)
   844  		if errGetUserInfo != nil {
   845  			log.Println(errGetUserInfo)
   846  			assert.Fail("There was an error in the response")
   847  			return
   848  		}
   849  		finalResponse = inspectHTTPResponse(responseGetUserInfo)
   850  		if responseGetUserInfo != nil {
   851  			assert.Equal(200, responseGetUserInfo.StatusCode, finalResponse)
   852  		}
   853  		// Make sure the user belongs to the created group
   854  		assert.True(strings.Contains(finalResponse, groupName))
   855  	}
   856  }
   857  
   858  func Test_GetUserPolicyAPI(t *testing.T) {
   859  	assert := assert.New(t)
   860  
   861  	// 1. Create an active user with valid policy
   862  	groups := []string{}
   863  	policies := []string{"readwrite"}
   864  	addUserResponse, addUserError := AddUser(
   865  		"getpolicyuser", "secretKey", groups, policies)
   866  	if addUserError != nil {
   867  		log.Println(addUserError)
   868  		return
   869  	}
   870  	if addUserResponse != nil {
   871  		fmt.Println("StatusCode:", addUserResponse.StatusCode)
   872  		assert.Equal(
   873  			201, addUserResponse.StatusCode, "Status Code is incorrect")
   874  	}
   875  
   876  	type args struct {
   877  		api string
   878  	}
   879  	tests := []struct {
   880  		name           string
   881  		args           args
   882  		expectedStatus int
   883  		expectedError  error
   884  	}{
   885  		{
   886  			name: "Get User Policies",
   887  			args: args{
   888  				api: "/user/policy",
   889  			},
   890  			expectedStatus: 200,
   891  			expectedError:  nil,
   892  		},
   893  	}
   894  
   895  	for _, tt := range tests {
   896  		t.Run(tt.name, func(_ *testing.T) {
   897  			client := &http.Client{
   898  				Timeout: 3 * time.Second,
   899  			}
   900  
   901  			request, err := http.NewRequest(
   902  				"GET", fmt.Sprintf("http://localhost:9090/api/v1%s", tt.args.api), nil)
   903  			if err != nil {
   904  				log.Println(err)
   905  				return
   906  			}
   907  			request.Header.Add("Cookie", fmt.Sprintf("token=%s", token))
   908  			request.Header.Add("Content-Type", "application/json")
   909  			response, err := client.Do(request)
   910  			if err != nil {
   911  				log.Println(err)
   912  				return
   913  			}
   914  			if response != nil {
   915  				assert.Equal(tt.expectedStatus, response.StatusCode, tt.name+" Failed")
   916  			}
   917  		})
   918  	}
   919  }