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 }