From 703c2612182bbe4af86a59cc28ed2250e529165f Mon Sep 17 00:00:00 2001 From: zubeen Date: Fri, 3 Oct 2025 19:17:21 +0530 Subject: [PATCH 1/5] test: add test for ApproveOrRejectProjectDeployment --- deployments_test.go | 46 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/deployments_test.go b/deployments_test.go index e95d8934..e901082e 100644 --- a/deployments_test.go +++ b/deployments_test.go @@ -794,3 +794,49 @@ func TestDeploymentsService_UpdateProjectDeployment(t *testing.T) { require.Nil(t, d) require.Equal(t, http.StatusNotFound, resp.StatusCode) } + +func TestDeploymentsService_ApproveOrRejectProjectDeployment(t *testing.T) { + t.Parallel() + mux, client := setup(t) + + mux.HandleFunc("/api/v4/projects/1/deployments/1/approval", func(w http.ResponseWriter, r *http.Request) { + testMethod(t, r, http.MethodPost) + fmt.Fprint(w, `{ + "id": 1, + "status": "approved", + "user": { + "id": 1, + "name": "Administrator", + "username": "root", + "state": "active", + "avatar_url": "http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon", + "web_url": "http://localhost:3000/root" + } + }`) + }) + + // Approve deployment successfully + resp, err := client.Deployments.ApproveOrRejectProjectDeployment(1, 1, nil) + require.NoError(t, err) + require.NotNil(t, resp) + require.Equal(t, 200, resp.StatusCode) + + // Invalid project ID type + resp, err = client.Deployments.ApproveOrRejectProjectDeployment(1.01, 1, nil) + require.ErrorIs(t, err, ErrInvalidIDType) + require.Nil(t, resp) + + // Request option error + resp, err = client.Deployments.ApproveOrRejectProjectDeployment(1, 1, nil, errorOption) + require.ErrorIs(t, err, errRequestOptionFunc) + require.Nil(t, resp) + + // Non-existent project + mux.HandleFunc("/api/v4/projects/3/deployments/1/approval", func(w http.ResponseWriter, r *http.Request) { + http.Error(w, "Not Found", http.StatusNotFound) + }) + resp, err = client.Deployments.ApproveOrRejectProjectDeployment(3, 1, nil) + require.Error(t, err) + require.NotNil(t, resp) + require.Equal(t, http.StatusNotFound, resp.StatusCode) +} -- GitLab From b70ac5b45383c7cd308b66e5ac7bb0b6bb296ba0 Mon Sep 17 00:00:00 2001 From: zubeen Date: Sat, 4 Oct 2025 01:17:01 +0530 Subject: [PATCH 2/5] test: add unit tests for cluster agents and deployments --- cluster_agents_test.go | 34 ++++++++++++++++++++++++++++++++++ deployments_test.go | 36 ++++++++++-------------------------- 2 files changed, 44 insertions(+), 26 deletions(-) diff --git a/cluster_agents_test.go b/cluster_agents_test.go index 3151d09c..ea9429db 100644 --- a/cluster_agents_test.go +++ b/cluster_agents_test.go @@ -349,3 +349,37 @@ func TestRegisterAgentToken(t *testing.T) { t.Errorf("ClusterAgents.CreateAgentToken returned %+v, want %+v", clusterAgentToken, want) } } + +func TestDeleteClusterAgent(t *testing.T) { + mux, client := setup(t) + + mux.HandleFunc("/api/v4/projects/20/cluster_agents/1", func(w http.ResponseWriter, r *http.Request) { + testMethod(t, r, http.MethodDelete) + w.WriteHeader(http.StatusNoContent) + }) + + resp, err := client.ClusterAgents.DeleteAgent(20, 1) + if err != nil { + t.Errorf("ClusterAgents.DeleteAgent returned error: %v", err) + } + if resp.StatusCode != http.StatusNoContent { + t.Errorf("ClusterAgents.DeleteAgent returned status %v, want %v", resp.StatusCode, http.StatusNoContent) + } +} + +func TestRevokeAgentToken(t *testing.T) { + mux, client := setup(t) + + mux.HandleFunc("/api/v4/projects/20/cluster_agents/5/tokens/1", func(w http.ResponseWriter, r *http.Request) { + testMethod(t, r, http.MethodDelete) + w.WriteHeader(http.StatusNoContent) + }) + + resp, err := client.ClusterAgents.RevokeAgentToken(20, 5, 1) + if err != nil { + t.Errorf("ClusterAgents.RevokeAgentToken returned error: %v", err) + } + if resp.StatusCode != http.StatusNoContent { + t.Errorf("ClusterAgents.RevokeAgentToken returned status %v, want %v", resp.StatusCode, http.StatusNoContent) + } +} diff --git a/deployments_test.go b/deployments_test.go index e901082e..890d944b 100644 --- a/deployments_test.go +++ b/deployments_test.go @@ -795,48 +795,32 @@ func TestDeploymentsService_UpdateProjectDeployment(t *testing.T) { require.Equal(t, http.StatusNotFound, resp.StatusCode) } -func TestDeploymentsService_ApproveOrRejectProjectDeployment(t *testing.T) { +func TestDeploymentsService_DeleteProjectDeployment(t *testing.T) { t.Parallel() mux, client := setup(t) - mux.HandleFunc("/api/v4/projects/1/deployments/1/approval", func(w http.ResponseWriter, r *http.Request) { - testMethod(t, r, http.MethodPost) - fmt.Fprint(w, `{ - "id": 1, - "status": "approved", - "user": { - "id": 1, - "name": "Administrator", - "username": "root", - "state": "active", - "avatar_url": "http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon", - "web_url": "http://localhost:3000/root" - } - }`) + mux.HandleFunc("/api/v4/projects/1/deployments/1", func(w http.ResponseWriter, r *http.Request) { + testMethod(t, r, http.MethodDelete) + w.WriteHeader(http.StatusNoContent) }) - // Approve deployment successfully - resp, err := client.Deployments.ApproveOrRejectProjectDeployment(1, 1, nil) + resp, err := client.Deployments.DeleteProjectDeployment(1, 1, nil) require.NoError(t, err) require.NotNil(t, resp) - require.Equal(t, 200, resp.StatusCode) + require.Equal(t, http.StatusNoContent, resp.StatusCode) - // Invalid project ID type - resp, err = client.Deployments.ApproveOrRejectProjectDeployment(1.01, 1, nil) + resp, err = client.Deployments.DeleteProjectDeployment(1.01, 1, nil) require.ErrorIs(t, err, ErrInvalidIDType) require.Nil(t, resp) - // Request option error - resp, err = client.Deployments.ApproveOrRejectProjectDeployment(1, 1, nil, errorOption) + resp, err = client.Deployments.DeleteProjectDeployment(1, 1, errorOption) require.ErrorIs(t, err, errRequestOptionFunc) require.Nil(t, resp) - // Non-existent project - mux.HandleFunc("/api/v4/projects/3/deployments/1/approval", func(w http.ResponseWriter, r *http.Request) { + mux.HandleFunc("/api/v4/projects/3/deployments/1", func(w http.ResponseWriter, r *http.Request) { http.Error(w, "Not Found", http.StatusNotFound) }) - resp, err = client.Deployments.ApproveOrRejectProjectDeployment(3, 1, nil) + resp, err = client.Deployments.DeleteProjectDeployment(3, 1, nil) require.Error(t, err) - require.NotNil(t, resp) require.Equal(t, http.StatusNotFound, resp.StatusCode) } -- GitLab From 704508e108c7597c9d1ea1792b8e4c0a7d7fc985 Mon Sep 17 00:00:00 2001 From: zubeen Date: Sat, 18 Oct 2025 01:17:35 +0530 Subject: [PATCH 3/5] Refactor --- cluster_agents_test.go | 66 +++++++++++------------------------------- 1 file changed, 17 insertions(+), 49 deletions(-) diff --git a/cluster_agents_test.go b/cluster_agents_test.go index ea9429db..7814f9a2 100644 --- a/cluster_agents_test.go +++ b/cluster_agents_test.go @@ -18,8 +18,8 @@ package gitlab import ( "fmt" + "github.com/stretchr/testify/assert" "net/http" - "reflect" "testing" "time" ) @@ -67,9 +67,7 @@ func TestListClusterAgents(t *testing.T) { opt := &ListAgentsOptions{} clusterAgents, _, err := client.ClusterAgents.ListAgents(20, opt) - if err != nil { - t.Errorf("ClusterAgents.ListClusterAgents returned error: %v", err) - } + assert.NoError(t, err) want := []*Agent{ { @@ -104,9 +102,7 @@ func TestListClusterAgents(t *testing.T) { }, } - if !reflect.DeepEqual(want, clusterAgents) { - t.Errorf("ClusterAgents.ListClusterAgents returned %+v, want %+v", clusterAgents, want) - } + assert.Equal(t, want, clusterAgents) } func TestGetClusterAgent(t *testing.T) { @@ -134,9 +130,7 @@ func TestGetClusterAgent(t *testing.T) { }) clusterAgent, _, err := client.ClusterAgents.GetAgent(20, 1) - if err != nil { - t.Errorf("ClusterAgents.GetClusterAgent returned error: %v", err) - } + assert.NoError(t, err) want := &Agent{ ID: 1, @@ -153,9 +147,7 @@ func TestGetClusterAgent(t *testing.T) { CreatedAt: Ptr(time.Date(2022, time.April, 20, 20, 42, 40, 221000000, time.UTC)), CreatedByUserID: 42, } - if !reflect.DeepEqual(want, clusterAgent) { - t.Errorf("ClusterAgents.GetClusterAgent returned %+v, want %+v", clusterAgent, want) - } + assert.Equal(t, want, clusterAgent) } func TestRegisterClusterAgent(t *testing.T) { @@ -184,9 +176,7 @@ func TestRegisterClusterAgent(t *testing.T) { opt := &RegisterAgentOptions{Name: Ptr("agent-1")} clusterAgent, _, err := client.ClusterAgents.RegisterAgent(20, opt) - if err != nil { - t.Errorf("ClusterAgents.RegisterClusterAgent returned error: %v", err) - } + assert.NoError(t, err) want := &Agent{ ID: 1, @@ -203,9 +193,7 @@ func TestRegisterClusterAgent(t *testing.T) { CreatedAt: Ptr(time.Date(2022, time.April, 20, 20, 42, 40, 221000000, time.UTC)), CreatedByUserID: 42, } - if !reflect.DeepEqual(want, clusterAgent) { - t.Errorf("ClusterAgents.RegisterClusterAgent returned %+v, want %+v", clusterAgent, want) - } + assert.Equal(t, want, clusterAgent) } func TestListAgentTokens(t *testing.T) { @@ -239,9 +227,7 @@ func TestListAgentTokens(t *testing.T) { opt := &ListAgentTokensOptions{} clusterAgentTokens, _, err := client.ClusterAgents.ListAgentTokens(20, 5, opt) - if err != nil { - t.Errorf("ClusterAgents.ListAgentTokens returned error: %v", err) - } + assert.NoError(t, err) want := []*AgentToken{ { @@ -264,9 +250,7 @@ func TestListAgentTokens(t *testing.T) { }, } - if !reflect.DeepEqual(want, clusterAgentTokens) { - t.Errorf("ClusterAgents.ListAgentTokens returned %+v, want %+v", clusterAgentTokens, want) - } + assert.Equal(t, want, clusterAgentTokens) } func TestGetAgentToken(t *testing.T) { @@ -289,9 +273,7 @@ func TestGetAgentToken(t *testing.T) { }) clusterAgentToken, _, err := client.ClusterAgents.GetAgentToken(20, 5, 1) - if err != nil { - t.Errorf("ClusterAgents.GetAgentToken returned error: %v", err) - } + assert.NoError(t, err) want := &AgentToken{ ID: 1, @@ -303,9 +285,7 @@ func TestGetAgentToken(t *testing.T) { CreatedByUserID: 1, LastUsedAt: nil, } - if !reflect.DeepEqual(want, clusterAgentToken) { - t.Errorf("ClusterAgents.GetAgentToken returned %+v, want %+v", clusterAgentToken, want) - } + assert.Equal(t, want, clusterAgentToken) } func TestRegisterAgentToken(t *testing.T) { @@ -330,9 +310,7 @@ func TestRegisterAgentToken(t *testing.T) { opt := &CreateAgentTokenOptions{Name: Ptr("abcd"), Description: Ptr("Some token")} clusterAgentToken, _, err := client.ClusterAgents.CreateAgentToken(20, 5, opt) - if err != nil { - t.Errorf("ClusterAgents.CreateAgentToken returned error: %v", err) - } + assert.NoError(t, err) want := &AgentToken{ ID: 1, @@ -345,9 +323,7 @@ func TestRegisterAgentToken(t *testing.T) { LastUsedAt: nil, Token: "qeY8UVRisx9y3Loxo1scLxFuRxYcgeX3sxsdrpP_fR3Loq4xyg", } - if !reflect.DeepEqual(want, clusterAgentToken) { - t.Errorf("ClusterAgents.CreateAgentToken returned %+v, want %+v", clusterAgentToken, want) - } + assert.Equal(t, want, clusterAgentToken) } func TestDeleteClusterAgent(t *testing.T) { @@ -359,12 +335,8 @@ func TestDeleteClusterAgent(t *testing.T) { }) resp, err := client.ClusterAgents.DeleteAgent(20, 1) - if err != nil { - t.Errorf("ClusterAgents.DeleteAgent returned error: %v", err) - } - if resp.StatusCode != http.StatusNoContent { - t.Errorf("ClusterAgents.DeleteAgent returned status %v, want %v", resp.StatusCode, http.StatusNoContent) - } + assert.NoError(t, err) + assert.Equal(t, http.StatusNoContent, resp.StatusCode) } func TestRevokeAgentToken(t *testing.T) { @@ -376,10 +348,6 @@ func TestRevokeAgentToken(t *testing.T) { }) resp, err := client.ClusterAgents.RevokeAgentToken(20, 5, 1) - if err != nil { - t.Errorf("ClusterAgents.RevokeAgentToken returned error: %v", err) - } - if resp.StatusCode != http.StatusNoContent { - t.Errorf("ClusterAgents.RevokeAgentToken returned status %v, want %v", resp.StatusCode, http.StatusNoContent) - } + assert.NoError(t, err) + assert.Equal(t, http.StatusNoContent, resp.StatusCode) } -- GitLab From 603c2c9ec5e8008f5f9025f5d342dd31390a6376 Mon Sep 17 00:00:00 2001 From: zubeen Date: Sat, 18 Oct 2025 15:12:07 +0530 Subject: [PATCH 4/5] fix pipeline --- cluster_agents_test.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cluster_agents_test.go b/cluster_agents_test.go index 7814f9a2..09a46b32 100644 --- a/cluster_agents_test.go +++ b/cluster_agents_test.go @@ -18,10 +18,11 @@ package gitlab import ( "fmt" - "github.com/stretchr/testify/assert" "net/http" "testing" "time" + + "github.com/stretchr/testify/assert" ) func TestListClusterAgents(t *testing.T) { -- GitLab From d320f0d12c11d68590771e5262b4d581664db218 Mon Sep 17 00:00:00 2001 From: zubeen Date: Tue, 21 Oct 2025 02:09:13 +0530 Subject: [PATCH 5/5] fix linters --- cluster_agents_test.go | 2 ++ deployments_test.go | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/cluster_agents_test.go b/cluster_agents_test.go index 36145ad9..a58fc1ff 100644 --- a/cluster_agents_test.go +++ b/cluster_agents_test.go @@ -340,6 +340,7 @@ func TestRegisterAgentToken(t *testing.T) { } func TestDeleteClusterAgent(t *testing.T) { + t.Parallel() mux, client := setup(t) mux.HandleFunc("/api/v4/projects/20/cluster_agents/1", func(w http.ResponseWriter, r *http.Request) { @@ -353,6 +354,7 @@ func TestDeleteClusterAgent(t *testing.T) { } func TestRevokeAgentToken(t *testing.T) { + t.Parallel() mux, client := setup(t) mux.HandleFunc("/api/v4/projects/20/cluster_agents/5/tokens/1", func(w http.ResponseWriter, r *http.Request) { diff --git a/deployments_test.go b/deployments_test.go index 7443adf1..a736b8a0 100644 --- a/deployments_test.go +++ b/deployments_test.go @@ -880,5 +880,5 @@ func TestDeploymentsService_DeleteProjectDeployment(t *testing.T) { }) resp, err = client.Deployments.DeleteProjectDeployment(3, 1, nil) require.Error(t, err) -require.Equal(t, http.StatusNotFound, resp.StatusCode) + require.Equal(t, http.StatusNotFound, resp.StatusCode) } -- GitLab