Verified Commit 222dd41a authored by Jeremy T's avatar Jeremy T 💬
Browse files

feat(projects): add merge_train_enforcement to project structs

Changelog: Improvements
parent b626a602
Loading
Loading
Loading
Loading
+3 −0
Changes for projects.go: 3 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -510,6 +510,7 @@ type Project struct {
	MergePipelinesEnabled                     bool                                        `json:"merge_pipelines_enabled"`
	MergeTrainsEnabled                        bool                                        `json:"merge_trains_enabled"`
	MergeTrainsSkipTrainAllowed               bool                                        `json:"merge_trains_skip_train_allowed"`
	MergeTrainEnforcement                     MergeTrainEnforcementValue                  `json:"merge_train_enforcement"`
	CIPipelineVariablesMinimumOverrideRole    CIPipelineVariablesMinimumOverrideRoleValue `json:"ci_pipeline_variables_minimum_override_role"`
	MergeCommitTemplate                       string                                      `json:"merge_commit_template"`
	SquashCommitTemplate                      string                                      `json:"squash_commit_template"`
@@ -938,6 +939,7 @@ type CreateProjectOptions struct {
	MergeMethod                               *MergeMethodValue                    `url:"merge_method,omitempty" json:"merge_method,omitempty"`
	MergePipelinesEnabled                     *bool                                `url:"merge_pipelines_enabled,omitempty" json:"merge_pipelines_enabled,omitempty"`
	MergeRequestsAccessLevel                  *AccessControlValue                  `url:"merge_requests_access_level,omitempty" json:"merge_requests_access_level,omitempty"`
	MergeTrainEnforcement                     *MergeTrainEnforcementValue          `url:"merge_train_enforcement,omitempty" json:"merge_train_enforcement,omitempty"`
	MergeTrainsEnabled                        *bool                                `url:"merge_trains_enabled,omitempty" json:"merge_trains_enabled,omitempty"`
	MergeTrainsSkipTrainAllowed               *bool                                `url:"merge_trains_skip_train_allowed,omitempty" json:"merge_trains_skip_train_allowed,omitempty"`
	Mirror                                    *bool                                `url:"mirror,omitempty" json:"mirror,omitempty"`
@@ -1146,6 +1148,7 @@ type EditProjectOptions struct {
	MergePipelinesEnabled                     *bool                                        `url:"merge_pipelines_enabled,omitempty" json:"merge_pipelines_enabled,omitempty"`
	MergeRequestsAccessLevel                  *AccessControlValue                          `url:"merge_requests_access_level,omitempty" json:"merge_requests_access_level,omitempty"`
	MergeRequestsTemplate                     *string                                      `url:"merge_requests_template,omitempty" json:"merge_requests_template,omitempty"`
	MergeTrainEnforcement                     *MergeTrainEnforcementValue                  `url:"merge_train_enforcement,omitempty" json:"merge_train_enforcement,omitempty"`
	MergeTrainsEnabled                        *bool                                        `url:"merge_trains_enabled,omitempty" json:"merge_trains_enabled,omitempty"`
	MergeTrainsSkipTrainAllowed               *bool                                        `url:"merge_trains_skip_train_allowed,omitempty" json:"merge_trains_skip_train_allowed,omitempty"`
	Mirror                                    *bool                                        `url:"mirror,omitempty" json:"mirror,omitempty"`
+70 −0
Changes for projects_test.go: 70 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -81,6 +81,17 @@ func TestListProjects(t *testing.T) {
			`[{"id":1, "automatic_rebase_enabled": false},{"id":2}]`,
			[]*Project{{ID: 1, AutomaticRebaseEnabled: false}, {ID: 2}},
		},
		{
			// GIVEN a project response with merge_train_enforcement set
			// WHEN the response is deserialized
			// THEN the field should hold the enforcement level
			"with merge_train_enforcement",
			`[{"id":1, "merge_train_enforcement": "enforce_for_all_users"},{"id":2}]`,
			[]*Project{
				{ID: 1, MergeTrainEnforcement: EnforceForAllUsersMergeTrainEnforcement},
				{ID: 2},
			},
		},
	}

	for _, testCase := range testCases {
@@ -542,6 +553,37 @@ func TestEditProjectWithAutomaticRebaseEnabled(t *testing.T) {
	assert.True(t, project.AutomaticRebaseEnabled)
}

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

	// GIVEN edit options that set the merge train enforcement level
	opt := &EditProjectOptions{
		MergeTrainEnforcement: new(EnforceWithOwnerOverrideMergeTrainEnforcement),
	}

	// THEN the enforcement level is sent as merge_train_enforcement
	mux.HandleFunc("/api/v4/projects/1", func(w http.ResponseWriter, r *http.Request) {
		testMethod(t, r, http.MethodPut)
		testBodyJSON(t, r, map[string]any{
			"merge_train_enforcement": "enforce_with_owner_override",
		})

		fmt.Fprint(w, `{
			"id": 1,
			"merge_train_enforcement": "enforce_with_owner_override"
		}`)
	})

	// WHEN the project is edited
	project, resp, err := client.Projects.EditProject(1, opt)

	// THEN the enforcement level returned by the API is exposed
	assert.NoError(t, err)
	assert.Equal(t, http.StatusOK, resp.StatusCode)
	assert.Equal(t, EnforceWithOwnerOverrideMergeTrainEnforcement, project.MergeTrainEnforcement)
}

func TestEditProjectContainerExpirationPolicyNameRegex(t *testing.T) {
	t.Parallel()

@@ -639,6 +681,34 @@ func TestCreateProjectContainerExpirationPolicyNameRegex(t *testing.T) {
	assert.Equal(t, "delete-me", project.ContainerExpirationPolicy.NameRegex)
}

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

	// GIVEN create options that set the merge train enforcement level
	opt := &CreateProjectOptions{
		Name:                  new("n"),
		MergeTrainEnforcement: new(EnforceForAllUsersMergeTrainEnforcement),
	}

	// THEN the enforcement level is sent as merge_train_enforcement
	mux.HandleFunc("/api/v4/projects", func(w http.ResponseWriter, r *http.Request) {
		testMethod(t, r, http.MethodPost)
		testBodyJSON(t, r, map[string]any{
			"name":                    "n",
			"merge_train_enforcement": "enforce_for_all_users",
		})
		fmt.Fprint(w, `{"id":1,"merge_train_enforcement":"enforce_for_all_users"}`)
	})

	// WHEN the project is created
	project, _, err := client.Projects.CreateProject(opt)

	// THEN the enforcement level returned by the API is exposed
	assert.NoError(t, err)
	assert.Equal(t, EnforceForAllUsersMergeTrainEnforcement, project.MergeTrainEnforcement)
}

func TestListStarredProjects(t *testing.T) {
	t.Parallel()
	mux, client := setup(t)
+15 −0
Changes for types.go: 15 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -676,6 +676,21 @@ const (
	RebaseMerge        MergeMethodValue = "rebase_merge"
)

// MergeTrainEnforcementValue represents the merge train enforcement level of
// a project within GitLab. It has no effect unless merge trains are enabled.
//
// GitLab API docs: https://docs.gitlab.com/api/projects/
type MergeTrainEnforcementValue string

// List of available merge train enforcement values.
//
// GitLab API docs: https://docs.gitlab.com/api/projects/
const (
	AllowBypassMergeTrainEnforcement              MergeTrainEnforcementValue = "allow_bypass"
	EnforceForAllUsersMergeTrainEnforcement       MergeTrainEnforcementValue = "enforce_for_all_users"
	EnforceWithOwnerOverrideMergeTrainEnforcement MergeTrainEnforcementValue = "enforce_with_owner_override"
)

// NoteTypeValue represents the type of a Note.
type NoteTypeValue string