Verified Commit 6d49417d authored by Giannis Kepas's avatar Giannis Kepas Committed by GitLab
Browse files

Add mr_default_title_template to projects

Changelog: Improvements
parent e344b013
Loading
Loading
Loading
Loading
+25 −0
Original line number Diff line number Diff line
@@ -221,3 +221,28 @@ func TestEditMergeRequestTitleRegex_Integration(t *testing.T) {
	assert.Equal(t, mergeTitle, retrievedProject.MergeRequestTitleRegex)
	assert.Equal(t, mergeTitleDescription, retrievedProject.MergeRequestTitleRegexDescription)
}

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

	// GIVEN a GitLab client and a test project
	client := SetupIntegrationClient(t)
	project := CreateTestProject(t, client)

	titleTemplate := fmt.Sprintf("Default MR title %d", time.Now().UnixNano())

	// WHEN editing the project to set the MR default title template
	editProj, _, err := client.Projects.EditProject(project.ID, &gitlab.EditProjectOptions{
		MRDefaultTitleTemplate: gitlab.Ptr(titleTemplate),
	})
	require.NoError(t, err, "Failed to edit MRDefaultTitleTemplate")

	// THEN verify the value returned from the edit API
	assert.Equal(t, titleTemplate, editProj.MRDefaultTitleTemplate)

	// AND verify by retrieving the project again
	retrievedProject, _, err := client.Projects.GetProject(project.ID, nil)
	require.NoError(t, err, "Failed to retrieve project after edit")

	assert.Equal(t, titleTemplate, retrievedProject.MRDefaultTitleTemplate)
}
+3 −0
Original line number Diff line number Diff line
@@ -489,6 +489,7 @@ type Project struct {
	SecurityAndComplianceEnabled              bool                                        `json:"security_and_compliance_enabled"`
	SecurityAndComplianceAccessLevel          AccessControlValue                          `json:"security_and_compliance_access_level"`
	MergeRequestDefaultTargetSelf             bool                                        `json:"mr_default_target_self"`
	MRDefaultTitleTemplate                    string                                      `json:"mr_default_title_template"`
	ModelExperimentsAccessLevel               AccessControlValue                          `json:"model_experiments_access_level"`
	ModelRegistryAccessLevel                  AccessControlValue                          `json:"model_registry_access_level"`
	PreReceiveSecretDetectionEnabled          bool                                        `json:"pre_receive_secret_detection_enabled"`
@@ -934,6 +935,7 @@ type CreateProjectOptions struct {
	WikiAccessLevel                           *AccessControlValue                  `url:"wiki_access_level,omitempty" json:"wiki_access_level,omitempty"`
	MergeRequestTitleRegex                    *string                              `url:"merge_request_title_regex,omitempty" json:"merge_request_title_regex,omitempty"`
	MergeRequestTitleRegexDescription         *string                              `url:"merge_request_title_regex_description,omitempty" json:"merge_request_title_regex_description,omitempty"`
	MRDefaultTitleTemplate                    *string                              `url:"mr_default_title_template,omitempty" json:"mr_default_title_template,omitempty"`
	// Deprecated: Use PackageRegistryAccessLevel instead.
	PackagesEnabled *bool `url:"packages_enabled,omitempty" json:"packages_enabled,omitempty"`
	// Deprecated: use Merge Request Approvals API instead
@@ -1091,6 +1093,7 @@ type EditProjectOptions struct {
	MaxArtifactsSize                          *int64                                       `url:"max_artifacts_size,omitempty" json:"max_artifacts_size,omitempty"`
	MergeCommitTemplate                       *string                                      `url:"merge_commit_template,omitempty" json:"merge_commit_template,omitempty"`
	MergeRequestDefaultTargetSelf             *bool                                        `url:"mr_default_target_self,omitempty" json:"mr_default_target_self,omitempty"`
	MRDefaultTitleTemplate                    *string                                      `url:"mr_default_title_template,omitempty" json:"mr_default_title_template,omitempty"`
	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"`
+13 −3
Original line number Diff line number Diff line
@@ -347,6 +347,7 @@ func TestEditProject(t *testing.T) {
		MaxArtifactsSize:                       Ptr(int64(100)),
		CIRestrictPipelineCancellationRole:     Ptr(developerRole),
		CIPipelineVariablesMinimumOverrideRole: Ptr(developerPipelineVariablesRole),
		MRDefaultTitleTemplate:                 Ptr("Default MR title"),
	}

	mux.HandleFunc("/api/v4/projects/1", func(w http.ResponseWriter, r *http.Request) {
@@ -355,6 +356,7 @@ func TestEditProject(t *testing.T) {
			"max_artifacts_size":                          100.0,
			"ci_restrict_pipeline_cancellation_role":      "developer",
			"ci_pipeline_variables_minimum_override_role": "developer",
			"mr_default_title_template":                   "Default MR title",
		})

		// Print the start of the mock example from https://docs.gitlab.com/api/projects/#edit-a-project
@@ -372,7 +374,8 @@ func TestEditProject(t *testing.T) {
			"readme_url": "http://example.com/diaspora/diaspora-project-site/blob/main/README.md",
			"ci_restrict_pipeline_cancellation_role": "developer",
			"ci_pipeline_variables_minimum_override_role": "developer",
			"ci_delete_pipelines_in_seconds": 14
			"ci_delete_pipelines_in_seconds": 14,
			"mr_default_title_template": "Default MR title"
		}`)
	})

@@ -382,6 +385,7 @@ func TestEditProject(t *testing.T) {
	assert.Equal(t, developerRole, project.CIRestrictPipelineCancellationRole)
	assert.Equal(t, developerPipelineVariablesRole, project.CIPipelineVariablesMinimumOverrideRole)
	assert.Equal(t, int64(14), project.CIDeletePipelinesInSeconds)
	assert.Equal(t, "Default MR title", project.MRDefaultTitleTemplate)
}

func TestEditProjectWithReviewerAssignmentStrategy(t *testing.T) {
@@ -560,19 +564,25 @@ func TestCreateProject(t *testing.T) {

	mux.HandleFunc("/api/v4/projects", func(w http.ResponseWriter, r *http.Request) {
		testMethod(t, r, http.MethodPost)
		fmt.Fprint(w, `{"id":1}`)
		testBodyJSON(t, r, map[string]any{
			"name":                      "n",
			"merge_method":              "rebase_merge",
			"mr_default_title_template": "Default MR title",
		})
		fmt.Fprint(w, `{"id":1,"mr_default_title_template":"Default MR title"}`)
	})

	opt := &CreateProjectOptions{
		Name:                   Ptr("n"),
		MergeMethod:            Ptr(RebaseMerge),
		MRDefaultTitleTemplate: Ptr("Default MR title"),
	}

	project, resp, err := client.Projects.CreateProject(opt)
	assert.NoError(t, err)
	assert.NotNil(t, resp)

	want := &Project{ID: 1}
	want := &Project{ID: 1, MRDefaultTitleTemplate: "Default MR title"}
	assert.Equal(t, want, project)
}