Commit 5c17773c authored by Hannes Lange's avatar Hannes Lange Committed by Timo Furrer
Browse files

feat: add admin compliance policy settings API

Changelog: Improvements
parent 25c5c89b
Loading
Loading
Loading
Loading
+85 −0
Original line number Diff line number Diff line
//
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//

package gitlab

import (
	"net/http"
)

type (
	AdminCompliancePolicySettingsServiceInterface interface {
		// GetCompliancePolicySettings gets the current security policy settings for the GitLab instance.
		//
		// GitLab API docs:
		// https://docs.gitlab.com/api/compliance_policy_settings/#get-security-policy-settings
		GetCompliancePolicySettings(options ...RequestOptionFunc) (*AdminCompliancePolicySettings, *Response, error)

		// UpdateCompliancePolicySettings updates the security policy settings for the GitLab instance.
		//
		// GitLab API docs:
		// https://docs.gitlab.com/api/compliance_policy_settings/#update-security-policy-settings
		UpdateCompliancePolicySettings(opt *UpdateAdminCompliancePolicySettingsOptions, options ...RequestOptionFunc) (*AdminCompliancePolicySettings, *Response, error)
	}

	// AdminCompliancePolicySettingsService handles communication with the
	// admin compliance policy settings related methods of the GitLab API.
	//
	// GitLab API docs:
	// https://docs.gitlab.com/api/compliance_policy_settings/
	AdminCompliancePolicySettingsService struct {
		client *Client
	}
)

var _ AdminCompliancePolicySettingsServiceInterface = (*AdminCompliancePolicySettingsService)(nil)

// AdminCompliancePolicySettings represents the GitLab admin compliance policy settings.
//
// GitLab API docs:
// https://docs.gitlab.com/api/compliance_policy_settings/
type AdminCompliancePolicySettings struct {
	CSPNamespaceID *int64 `json:"csp_namespace_id"`
}

func (s AdminCompliancePolicySettings) String() string {
	return Stringify(s)
}

func (s *AdminCompliancePolicySettingsService) GetCompliancePolicySettings(options ...RequestOptionFunc) (*AdminCompliancePolicySettings, *Response, error) {
	return do[*AdminCompliancePolicySettings](s.client,
		withMethod(http.MethodGet),
		withPath("admin/security/compliance_policy_settings"),
		withRequestOpts(options...),
	)
}

// UpdateAdminCompliancePolicySettingsOptions represents the available
// UpdateCompliancePolicySettings() options.
//
// GitLab API docs:
// https://docs.gitlab.com/api/compliance_policy_settings/#update-security-policy-settings
type UpdateAdminCompliancePolicySettingsOptions struct {
	CSPNamespaceID *int64 `url:"csp_namespace_id,omitempty" json:"csp_namespace_id,omitempty"`
}

func (s *AdminCompliancePolicySettingsService) UpdateCompliancePolicySettings(opt *UpdateAdminCompliancePolicySettingsOptions, options ...RequestOptionFunc) (*AdminCompliancePolicySettings, *Response, error) {
	return do[*AdminCompliancePolicySettings](s.client,
		withMethod(http.MethodPut),
		withPath("admin/security/compliance_policy_settings"),
		withAPIOpts(opt),
		withRequestOpts(options...),
	)
}
+156 −0
Original line number Diff line number Diff line
package gitlab

import (
	"fmt"
	"net/http"
	"testing"

	"github.com/stretchr/testify/require"
)

func TestAdminCompliancePolicySettingsService_GetCompliancePolicySettings(t *testing.T) {
	t.Parallel()
	mux, client := setup(t)

	mux.HandleFunc("/api/v4/admin/security/compliance_policy_settings", func(w http.ResponseWriter, r *http.Request) {
		testMethod(t, r, http.MethodGet)
		fmt.Fprintf(w, `
			{
				"csp_namespace_id": 42
			}
		`)
	})

	cspNamespaceID := int64(42)
	want := &AdminCompliancePolicySettings{
		CSPNamespaceID: &cspNamespaceID,
	}

	settings, resp, err := client.AdminCompliancePolicySettings.GetCompliancePolicySettings()
	require.NoError(t, err)
	require.NotNil(t, resp)
	require.Equal(t, want, settings)

	settings, resp, err = client.AdminCompliancePolicySettings.GetCompliancePolicySettings(errorOption)
	require.EqualError(t, err, "RequestOptionFunc returns an error")
	require.Nil(t, resp)
	require.Nil(t, settings)
}

func TestAdminCompliancePolicySettingsService_GetCompliancePolicySettings_NullNamespace(t *testing.T) {
	t.Parallel()
	mux, client := setup(t)

	mux.HandleFunc("/api/v4/admin/security/compliance_policy_settings", func(w http.ResponseWriter, r *http.Request) {
		testMethod(t, r, http.MethodGet)
		fmt.Fprintf(w, `
			{
				"csp_namespace_id": null
			}
		`)
	})

	want := &AdminCompliancePolicySettings{
		CSPNamespaceID: nil,
	}

	settings, resp, err := client.AdminCompliancePolicySettings.GetCompliancePolicySettings()
	require.NoError(t, err)
	require.NotNil(t, resp)
	require.Equal(t, want, settings)
}

func TestAdminCompliancePolicySettingsService_GetCompliancePolicySettings_StatusNotFound(t *testing.T) {
	t.Parallel()
	mux, client := setup(t)

	mux.HandleFunc("/api/v4/admin/security/compliance_policy_settings", func(w http.ResponseWriter, r *http.Request) {
		testMethod(t, r, http.MethodGet)
		w.WriteHeader(http.StatusNotFound)
	})

	settings, resp, err := client.AdminCompliancePolicySettings.GetCompliancePolicySettings()
	require.Error(t, err)
	require.Nil(t, settings)
	require.Equal(t, http.StatusNotFound, resp.StatusCode)
}

func TestAdminCompliancePolicySettingsService_UpdateCompliancePolicySettings(t *testing.T) {
	t.Parallel()
	mux, client := setup(t)

	mux.HandleFunc("/api/v4/admin/security/compliance_policy_settings", func(w http.ResponseWriter, r *http.Request) {
		testMethod(t, r, http.MethodPut)
		fmt.Fprintf(w, `
			{
				"csp_namespace_id": 42
			}
		`)
	})

	cspNamespaceID := int64(42)
	want := &AdminCompliancePolicySettings{
		CSPNamespaceID: &cspNamespaceID,
	}

	opt := &UpdateAdminCompliancePolicySettingsOptions{
		CSPNamespaceID: &cspNamespaceID,
	}

	settings, resp, err := client.AdminCompliancePolicySettings.UpdateCompliancePolicySettings(opt)
	require.NoError(t, err)
	require.NotNil(t, resp)
	require.Equal(t, want, settings)

	settings, resp, err = client.AdminCompliancePolicySettings.UpdateCompliancePolicySettings(opt, errorOption)
	require.EqualError(t, err, "RequestOptionFunc returns an error")
	require.Nil(t, resp)
	require.Nil(t, settings)
}

func TestAdminCompliancePolicySettingsService_UpdateCompliancePolicySettings_ClearNamespace(t *testing.T) {
	t.Parallel()
	mux, client := setup(t)

	mux.HandleFunc("/api/v4/admin/security/compliance_policy_settings", func(w http.ResponseWriter, r *http.Request) {
		testMethod(t, r, http.MethodPut)
		fmt.Fprintf(w, `
			{
				"csp_namespace_id": null
			}
		`)
	})

	want := &AdminCompliancePolicySettings{
		CSPNamespaceID: nil,
	}

	opt := &UpdateAdminCompliancePolicySettingsOptions{
		CSPNamespaceID: nil,
	}

	settings, resp, err := client.AdminCompliancePolicySettings.UpdateCompliancePolicySettings(opt)
	require.NoError(t, err)
	require.NotNil(t, resp)
	require.Equal(t, want, settings)
}

func TestAdminCompliancePolicySettingsService_UpdateCompliancePolicySettings_StatusInternalServerError(t *testing.T) {
	t.Parallel()
	mux, client := setup(t)

	mux.HandleFunc("/api/v4/admin/security/compliance_policy_settings", func(w http.ResponseWriter, r *http.Request) {
		testMethod(t, r, http.MethodPut)
		w.WriteHeader(http.StatusInternalServerError)
	})

	cspNamespaceID := int64(42)
	opt := &UpdateAdminCompliancePolicySettingsOptions{
		CSPNamespaceID: &cspNamespaceID,
	}

	settings, resp, err := client.AdminCompliancePolicySettings.UpdateCompliancePolicySettings(opt)
	require.Error(t, err)
	require.Nil(t, settings)
	require.Equal(t, http.StatusInternalServerError, resp.StatusCode)
}
+2 −0
Original line number Diff line number Diff line
@@ -119,6 +119,7 @@ type Client struct {

	// Services used for talking to different parts of the GitLab API.
	AccessRequests                   AccessRequestsServiceInterface
	AdminCompliancePolicySettings    AdminCompliancePolicySettingsServiceInterface
	AlertManagement                  AlertManagementServiceInterface
	Appearance                       AppearanceServiceInterface
	Applications                     ApplicationsServiceInterface
@@ -434,6 +435,7 @@ func NewAuthSourceClient(as AuthSource, options ...ClientOptionFunc) (*Client, e

	// Create all the public services.
	c.AccessRequests = &AccessRequestsService{client: c}
	c.AdminCompliancePolicySettings = &AdminCompliancePolicySettingsService{client: c}
	c.AlertManagement = &AlertManagementService{client: c}
	c.Appearance = &AppearanceService{client: c}
	c.Applications = &ApplicationsService{client: c}
+1 −0
Original line number Diff line number Diff line
@@ -4,6 +4,7 @@ package gitlab

var serviceMap = map[any]any{
	&AccessRequestsService{}:                   (*AccessRequestsServiceInterface)(nil),
	&AdminCompliancePolicySettingsService{}:    (*AdminCompliancePolicySettingsServiceInterface)(nil),
	&AlertManagementService{}:                  (*AlertManagementServiceInterface)(nil),
	&AppearanceService{}:                       (*AppearanceServiceInterface)(nil),
	&ApplicationStatisticsService{}:            (*ApplicationStatisticsServiceInterface)(nil),
+129 −0
Original line number Diff line number Diff line
// Code generated by MockGen. DO NOT EDIT.
// Source: gitlab.com/gitlab-org/api/client-go (interfaces: AdminCompliancePolicySettingsServiceInterface)
//
// Generated by this command:
//
//	mockgen -typed -destination=admin_compliance_policy_settings_mock.go -write_package_comment=false -package=testing gitlab.com/gitlab-org/api/client-go AdminCompliancePolicySettingsServiceInterface
//

package testing

import (
	reflect "reflect"

	gitlab "gitlab.com/gitlab-org/api/client-go"
	gomock "go.uber.org/mock/gomock"
)

// MockAdminCompliancePolicySettingsServiceInterface is a mock of AdminCompliancePolicySettingsServiceInterface interface.
type MockAdminCompliancePolicySettingsServiceInterface struct {
	ctrl     *gomock.Controller
	recorder *MockAdminCompliancePolicySettingsServiceInterfaceMockRecorder
	isgomock struct{}
}

// MockAdminCompliancePolicySettingsServiceInterfaceMockRecorder is the mock recorder for MockAdminCompliancePolicySettingsServiceInterface.
type MockAdminCompliancePolicySettingsServiceInterfaceMockRecorder struct {
	mock *MockAdminCompliancePolicySettingsServiceInterface
}

// NewMockAdminCompliancePolicySettingsServiceInterface creates a new mock instance.
func NewMockAdminCompliancePolicySettingsServiceInterface(ctrl *gomock.Controller) *MockAdminCompliancePolicySettingsServiceInterface {
	mock := &MockAdminCompliancePolicySettingsServiceInterface{ctrl: ctrl}
	mock.recorder = &MockAdminCompliancePolicySettingsServiceInterfaceMockRecorder{mock}
	return mock
}

// EXPECT returns an object that allows the caller to indicate expected use.
func (m *MockAdminCompliancePolicySettingsServiceInterface) EXPECT() *MockAdminCompliancePolicySettingsServiceInterfaceMockRecorder {
	return m.recorder
}

// GetCompliancePolicySettings mocks base method.
func (m *MockAdminCompliancePolicySettingsServiceInterface) GetCompliancePolicySettings(options ...gitlab.RequestOptionFunc) (*gitlab.AdminCompliancePolicySettings, *gitlab.Response, error) {
	m.ctrl.T.Helper()
	varargs := []any{}
	for _, a := range options {
		varargs = append(varargs, a)
	}
	ret := m.ctrl.Call(m, "GetCompliancePolicySettings", varargs...)
	ret0, _ := ret[0].(*gitlab.AdminCompliancePolicySettings)
	ret1, _ := ret[1].(*gitlab.Response)
	ret2, _ := ret[2].(error)
	return ret0, ret1, ret2
}

// GetCompliancePolicySettings indicates an expected call of GetCompliancePolicySettings.
func (mr *MockAdminCompliancePolicySettingsServiceInterfaceMockRecorder) GetCompliancePolicySettings(options ...any) *MockAdminCompliancePolicySettingsServiceInterfaceGetCompliancePolicySettingsCall {
	mr.mock.ctrl.T.Helper()
	call := mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetCompliancePolicySettings", reflect.TypeOf((*MockAdminCompliancePolicySettingsServiceInterface)(nil).GetCompliancePolicySettings), options...)
	return &MockAdminCompliancePolicySettingsServiceInterfaceGetCompliancePolicySettingsCall{Call: call}
}

// MockAdminCompliancePolicySettingsServiceInterfaceGetCompliancePolicySettingsCall wrap *gomock.Call
type MockAdminCompliancePolicySettingsServiceInterfaceGetCompliancePolicySettingsCall struct {
	*gomock.Call
}

// Return rewrite *gomock.Call.Return
func (c *MockAdminCompliancePolicySettingsServiceInterfaceGetCompliancePolicySettingsCall) Return(arg0 *gitlab.AdminCompliancePolicySettings, arg1 *gitlab.Response, arg2 error) *MockAdminCompliancePolicySettingsServiceInterfaceGetCompliancePolicySettingsCall {
	c.Call = c.Call.Return(arg0, arg1, arg2)
	return c
}

// Do rewrite *gomock.Call.Do
func (c *MockAdminCompliancePolicySettingsServiceInterfaceGetCompliancePolicySettingsCall) Do(f func(...gitlab.RequestOptionFunc) (*gitlab.AdminCompliancePolicySettings, *gitlab.Response, error)) *MockAdminCompliancePolicySettingsServiceInterfaceGetCompliancePolicySettingsCall {
	c.Call = c.Call.Do(f)
	return c
}

// DoAndReturn rewrite *gomock.Call.DoAndReturn
func (c *MockAdminCompliancePolicySettingsServiceInterfaceGetCompliancePolicySettingsCall) DoAndReturn(f func(...gitlab.RequestOptionFunc) (*gitlab.AdminCompliancePolicySettings, *gitlab.Response, error)) *MockAdminCompliancePolicySettingsServiceInterfaceGetCompliancePolicySettingsCall {
	c.Call = c.Call.DoAndReturn(f)
	return c
}

// UpdateCompliancePolicySettings mocks base method.
func (m *MockAdminCompliancePolicySettingsServiceInterface) UpdateCompliancePolicySettings(opt *gitlab.UpdateAdminCompliancePolicySettingsOptions, options ...gitlab.RequestOptionFunc) (*gitlab.AdminCompliancePolicySettings, *gitlab.Response, error) {
	m.ctrl.T.Helper()
	varargs := []any{opt}
	for _, a := range options {
		varargs = append(varargs, a)
	}
	ret := m.ctrl.Call(m, "UpdateCompliancePolicySettings", varargs...)
	ret0, _ := ret[0].(*gitlab.AdminCompliancePolicySettings)
	ret1, _ := ret[1].(*gitlab.Response)
	ret2, _ := ret[2].(error)
	return ret0, ret1, ret2
}

// UpdateCompliancePolicySettings indicates an expected call of UpdateCompliancePolicySettings.
func (mr *MockAdminCompliancePolicySettingsServiceInterfaceMockRecorder) UpdateCompliancePolicySettings(opt any, options ...any) *MockAdminCompliancePolicySettingsServiceInterfaceUpdateCompliancePolicySettingsCall {
	mr.mock.ctrl.T.Helper()
	varargs := append([]any{opt}, options...)
	call := mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateCompliancePolicySettings", reflect.TypeOf((*MockAdminCompliancePolicySettingsServiceInterface)(nil).UpdateCompliancePolicySettings), varargs...)
	return &MockAdminCompliancePolicySettingsServiceInterfaceUpdateCompliancePolicySettingsCall{Call: call}
}

// MockAdminCompliancePolicySettingsServiceInterfaceUpdateCompliancePolicySettingsCall wrap *gomock.Call
type MockAdminCompliancePolicySettingsServiceInterfaceUpdateCompliancePolicySettingsCall struct {
	*gomock.Call
}

// Return rewrite *gomock.Call.Return
func (c *MockAdminCompliancePolicySettingsServiceInterfaceUpdateCompliancePolicySettingsCall) Return(arg0 *gitlab.AdminCompliancePolicySettings, arg1 *gitlab.Response, arg2 error) *MockAdminCompliancePolicySettingsServiceInterfaceUpdateCompliancePolicySettingsCall {
	c.Call = c.Call.Return(arg0, arg1, arg2)
	return c
}

// Do rewrite *gomock.Call.Do
func (c *MockAdminCompliancePolicySettingsServiceInterfaceUpdateCompliancePolicySettingsCall) Do(f func(*gitlab.UpdateAdminCompliancePolicySettingsOptions, ...gitlab.RequestOptionFunc) (*gitlab.AdminCompliancePolicySettings, *gitlab.Response, error)) *MockAdminCompliancePolicySettingsServiceInterfaceUpdateCompliancePolicySettingsCall {
	c.Call = c.Call.Do(f)
	return c
}

// DoAndReturn rewrite *gomock.Call.DoAndReturn
func (c *MockAdminCompliancePolicySettingsServiceInterfaceUpdateCompliancePolicySettingsCall) DoAndReturn(f func(*gitlab.UpdateAdminCompliancePolicySettingsOptions, ...gitlab.RequestOptionFunc) (*gitlab.AdminCompliancePolicySettings, *gitlab.Response, error)) *MockAdminCompliancePolicySettingsServiceInterfaceUpdateCompliancePolicySettingsCall {
	c.Call = c.Call.DoAndReturn(f)
	return c
}
Loading