From 4172f09c469c435549e199b1ccb49653d1619c95 Mon Sep 17 00:00:00 2001 From: auyer Date: Wed, 17 Jan 2024 11:59:06 -0300 Subject: [PATCH 1/5] Fixes pointer values being overwritten in loop --- access_users.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/access_users.go b/access_users.go index 690bc446e0..233ceb2bb6 100644 --- a/access_users.go +++ b/access_users.go @@ -223,7 +223,7 @@ func (api *API) ListAccessUsers(ctx context.Context, rc *ResourceContainer, para } var accessUsers []AccessUser - var r AccessUserListResponse + var resultInfo *ResultInfo = nil for { uri := buildURI(baseURL, params) @@ -231,6 +231,8 @@ func (api *API) ListAccessUsers(ctx context.Context, rc *ResourceContainer, para if err != nil { return []AccessUser{}, &ResultInfo{}, fmt.Errorf("%s: %w", errMakeRequestError, err) } + var r AccessUserListResponse + resultInfo = &r.ResultInfo err = json.Unmarshal(res, &r) if err != nil { @@ -243,7 +245,7 @@ func (api *API) ListAccessUsers(ctx context.Context, rc *ResourceContainer, para } } - return accessUsers, &r.ResultInfo, nil + return accessUsers, resultInfo, nil } // GetAccessUserActiveSessions returns a list of active sessions for an user. From 63134641813da20077a48b32698f61a68d2684d5 Mon Sep 17 00:00:00 2001 From: auyer Date: Wed, 17 Jan 2024 15:17:46 -0300 Subject: [PATCH 2/5] adds a test with paggination --- access_users_test.go | 108 ++++++++++++++++++++++++++++++------------- 1 file changed, 75 insertions(+), 33 deletions(-) diff --git a/access_users_test.go b/access_users_test.go index 0d2e4bee0c..e514cdd324 100644 --- a/access_users_test.go +++ b/access_users_test.go @@ -13,18 +13,33 @@ var ( testAccessUserID = "access-user-id" testAccessUserSessionID = "access-user-session-id" - expectedListAccessUserResult = AccessUser{ - AccessSeat: BoolPtr(false), - ActiveDeviceCount: 2, - CreatedAt: "2014-01-01T05:20:00.12345Z", - Email: "jdoe@example.com", - GatewaySeat: BoolPtr(false), - ID: "f3b12456-80dd-4e89-9f5f-ba3dfff12365", - LastSuccessfulLogin: "2020-07-01T05:20:00Z", - Name: "Jane Doe", - SeatUID: "", - UID: "", - UpdatedAt: "2014-01-01T05:20:00.12345Z", + expectedListAccessUserResult = []AccessUser{ + { + AccessSeat: BoolPtr(false), + ActiveDeviceCount: 2, + CreatedAt: "2014-01-01T05:20:00.12345Z", + Email: "jdoe@example.com", + GatewaySeat: BoolPtr(false), + ID: "f3b12456-80dd-4e89-9f5f-ba3dfff12365", + LastSuccessfulLogin: "2020-07-01T05:20:00Z", + Name: "Jane Doe", + SeatUID: "", + UID: "", + UpdatedAt: "2014-01-01T05:20:00.12345Z", + }, + { + AccessSeat: BoolPtr(true), + ActiveDeviceCount: 2, + CreatedAt: "2024-01-01T05:20:00.12345Z", + Email: "jhondoe@example.com", + GatewaySeat: BoolPtr(true), + ID: "c3b12456-80dd-4e89-9f5f-ba3dfff12367", + LastSuccessfulLogin: "2020-07-01T05:20:00Z", + Name: "Jhon Doe", + SeatUID: "", + UID: "", + UpdatedAt: "2014-01-01T05:20:00.12345Z", + }, } expectedGetAccessUserActiveSessionsResult = AccessUserActiveSessionResult{ @@ -217,41 +232,68 @@ func TestListAccessUsers(t *testing.T) { handler := func(w http.ResponseWriter, r *http.Request) { assert.Equal(t, http.MethodGet, r.Method, "Expected method 'GET', got %s", r.Method) w.Header().Set("content-type", "application/json") + userList, err := json.Marshal(expectedListAccessUserResult) + assert.NoError(t, err, "Error marshaling expectedListAccessUserResult") + fmt.Fprintf(w, `{ "errors": [], "messages": [], - "result": [ - { - "access_seat": false, - "active_device_count": 2, - "created_at": "2014-01-01T05:20:00.12345Z", - "email": "jdoe@example.com", - "gateway_seat": false, - "id": "f3b12456-80dd-4e89-9f5f-ba3dfff12365", - "last_successful_login": "2020-07-01T05:20:00Z", - "name": "Jane Doe", - "seat_uid": null, - "uid": null, - "updated_at": "2014-01-01T05:20:00.12345Z" - } - ], + "result": %s, "success": true, "result_info": { - "count": 1, + "count": 2, "page": 1, "per_page": 100, - "total_count": 1 + "total_count": 2 } - } - `) + }`, string(userList)) } - mux.HandleFunc("/accounts/"+testAccountID+"/access/users", handler) actual, _, err := client.ListAccessUsers(context.Background(), testAccountRC, AccessUserParams{}) if assert.NoError(t, err) { - assert.Equal(t, []AccessUser{expectedListAccessUserResult}, actual) + assert.Equal(t, expectedListAccessUserResult, actual) + } +} + +func TestListAccessUsersWithPaggination(t *testing.T) { + setup() + defer teardown() + // page 1 of 2 + page := 1 + + handler := func(w http.ResponseWriter, r *http.Request) { + assert.Equal(t, http.MethodGet, r.Method, "Expected method 'GET', got %s", r.Method) + w.Header().Set("content-type", "application/json") + + userList, err := json.Marshal(expectedListAccessUserResult) + assert.NoError(t, err, "Error marshaling expectedListAccessUserResult") + + fmt.Fprintf(w, `{ + "errors": [], + "messages": [], + "result": %s, + "success": true, + "result_info": { + "count": 2, + "page": %d, + "per_page": 2, + "total_count": 4 + } + }`, string(userList), page) + // increment page for the next call + page++ + } + mux.HandleFunc("/accounts/"+testAccountID+"/access/users", handler) + + actual, _, err := client.ListAccessUsers(context.Background(), testAccountRC, AccessUserParams{}) + expected := []AccessUser{} + // two pages of the same expectedResult + expected = append(expected, expectedListAccessUserResult...) + expected = append(expected, expectedListAccessUserResult...) + if assert.NoError(t, err) { + assert.Equal(t, expected, actual) } } From 0c68af90b8fd61c9ae78e6b364010806118c24b3 Mon Sep 17 00:00:00 2001 From: auyer Date: Wed, 17 Jan 2024 15:28:13 -0300 Subject: [PATCH 3/5] adds release changelog --- .changelog/1482.txt | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .changelog/1482.txt diff --git a/.changelog/1482.txt b/.changelog/1482.txt new file mode 100644 index 0000000000..54712fef46 --- /dev/null +++ b/.changelog/1482.txt @@ -0,0 +1,3 @@ +```release-note:bug +access_users: ListAccessUsers was returning wrong values in pointer fields due to variable missused in loop +``` From f103dced601e2548403ef7a858aa3883ef15884c Mon Sep 17 00:00:00 2001 From: auyer Date: Wed, 17 Jan 2024 15:29:47 -0300 Subject: [PATCH 4/5] fixes typo pagination --- access_users_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/access_users_test.go b/access_users_test.go index e514cdd324..905cf1f072 100644 --- a/access_users_test.go +++ b/access_users_test.go @@ -257,7 +257,7 @@ func TestListAccessUsers(t *testing.T) { } } -func TestListAccessUsersWithPaggination(t *testing.T) { +func TestListAccessUsersWithPagination(t *testing.T) { setup() defer teardown() // page 1 of 2 From d08928b788a163fd8f66281295696c00f9684b55 Mon Sep 17 00:00:00 2001 From: auyer Date: Mon, 29 Jan 2024 11:18:25 -0300 Subject: [PATCH 5/5] add encoding/json import that was removed by merge --- access_users_test.go | 1 + 1 file changed, 1 insertion(+) diff --git a/access_users_test.go b/access_users_test.go index 905cf1f072..dd24d3f1f3 100644 --- a/access_users_test.go +++ b/access_users_test.go @@ -2,6 +2,7 @@ package cloudflare import ( "context" + "encoding/json" "fmt" "net/http" "testing"