Loading gitlab_test/projects_integration_test.go +25 −0 Original line number Diff line number Diff line Loading @@ -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) } projects.go +3 −0 Original line number Diff line number Diff line Loading @@ -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"` Loading Loading @@ -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 Loading Loading @@ -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"` Loading projects_test.go +13 −3 Original line number Diff line number Diff line Loading @@ -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) { Loading @@ -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 Loading @@ -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" }`) }) Loading @@ -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) { Loading Loading @@ -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) } Loading Loading
gitlab_test/projects_integration_test.go +25 −0 Original line number Diff line number Diff line Loading @@ -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) }
projects.go +3 −0 Original line number Diff line number Diff line Loading @@ -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"` Loading Loading @@ -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 Loading Loading @@ -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"` Loading
projects_test.go +13 −3 Original line number Diff line number Diff line Loading @@ -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) { Loading @@ -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 Loading @@ -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" }`) }) Loading @@ -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) { Loading Loading @@ -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) } Loading