Verified Commit c87ee790 authored by Zubeen's avatar Zubeen 🤖 Committed by GitLab
Browse files

feat(milestones): add promote and burndown events endpoints

Changelog: Improvements
parent 7f1dadc7
Loading
Loading
Loading
Loading
+39 −0
Changes for milestones.go: 39 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -24,8 +24,10 @@ import (
var (
	routeProjectsIDMilestones                = route("projects/%s/milestones")
	routeProjectsIDMilestonesID              = route("projects/%s/milestones/%d")
	routeProjectsIDMilestonesIDBurndown      = route("projects/%s/milestones/%d/burndown_events")
	routeProjectsIDMilestonesIDIssues        = route("projects/%s/milestones/%d/issues")
	routeProjectsIDMilestonesIDMergeRequests = route("projects/%s/milestones/%d/merge_requests")
	routeProjectsIDMilestonesIDPromote       = route("projects/%s/milestones/%d/promote")
)

type (
@@ -66,6 +68,17 @@ type (
		// GitLab API docs:
		// https://docs.gitlab.com/api/milestones/#get-all-merge-requests-assigned-to-a-single-milestone
		GetMilestoneMergeRequests(pid any, milestone int64, opt *GetMilestoneMergeRequestsOptions, options ...RequestOptionFunc) ([]*BasicMergeRequest, *Response, error)
		// PromoteMilestone promotes a project milestone to a group milestone.
		//
		// GitLab API docs:
		// https://docs.gitlab.com/api/milestones/#promote-a-milestone-to-group-milestone
		PromoteMilestone(pid any, milestone int64, options ...RequestOptionFunc) (*Response, error)
		// GetMilestoneBurndownChartEvents lists all burndown chart events for a
		// single project milestone.
		//
		// GitLab API docs:
		// https://docs.gitlab.com/api/milestones/#list-all-burndown-chart-events-for-a-milestone
		GetMilestoneBurndownChartEvents(pid any, milestone int64, opt *GetMilestoneBurndownChartEventsOptions, options ...RequestOptionFunc) ([]*BurndownChartEvent, *Response, error)
	}

	// MilestonesService handles communication with the milestone related methods
@@ -215,3 +228,29 @@ func (s *MilestonesService) GetMilestoneMergeRequests(pid any, milestone int64,
		withRequestOpts(options...),
	)
}

func (s *MilestonesService) PromoteMilestone(pid any, milestone int64, options ...RequestOptionFunc) (*Response, error) {
	_, resp, err := do[none](s.client,
		withMethod(http.MethodPost),
		withPath(routeProjectsIDMilestonesIDPromote, ProjectID{pid}, milestone),
		withRequestOpts(options...),
	)
	return resp, err
}

// GetMilestoneBurndownChartEventsOptions represents the available
// GetMilestoneBurndownChartEvents() options.
//
// GitLab API docs:
// https://docs.gitlab.com/api/milestones/#list-all-burndown-chart-events-for-a-milestone
type GetMilestoneBurndownChartEventsOptions struct {
	ListOptions
}

func (s *MilestonesService) GetMilestoneBurndownChartEvents(pid any, milestone int64, opt *GetMilestoneBurndownChartEventsOptions, options ...RequestOptionFunc) ([]*BurndownChartEvent, *Response, error) {
	return do[[]*BurndownChartEvent](s.client,
		withPath(routeProjectsIDMilestonesIDBurndown, ProjectID{pid}, milestone),
		withAPIOpts(opt),
		withRequestOpts(options...),
	)
}
+67 −0
Changes for milestones_test.go: 67 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -565,3 +565,70 @@ func TestMilestonesService_GetMilestoneMergeRequests(t *testing.T) {
	require.Nil(t, mrs)
	require.Equal(t, http.StatusNotFound, resp.StatusCode)
}

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

	mux.HandleFunc("/api/v4/projects/5/milestones/12/promote", func(w http.ResponseWriter, r *http.Request) {
		testMethod(t, r, http.MethodPost)
	})

	resp, err := client.Milestones.PromoteMilestone(5, 12, nil)
	require.NoError(t, err)
	require.NotNil(t, resp)

	resp, err = client.Milestones.PromoteMilestone(5.01, 12, nil)
	require.ErrorIs(t, err, ErrInvalidIDType)
	require.Nil(t, resp)

	resp, err = client.Milestones.PromoteMilestone(5, 12, nil, errorOption)
	require.ErrorIs(t, err, errRequestOptionFunc)
	require.Nil(t, resp)

	resp, err = client.Milestones.PromoteMilestone(3, 12, nil)
	require.Error(t, err)
	require.Equal(t, http.StatusNotFound, resp.StatusCode)
}

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

	mux.HandleFunc("/api/v4/projects/5/milestones/12/burndown_events", func(w http.ResponseWriter, r *http.Request) {
		testMethod(t, r, http.MethodGet)
		fmt.Fprintf(w, `
			[
				{
					"weight": 10,
					"action": "update"
				}
			]
		`)
	})

	want := []*BurndownChartEvent{{
		Weight: new(int64(10)),
		Action: new("update"),
	}}

	bces, resp, err := client.Milestones.GetMilestoneBurndownChartEvents(5, 12, nil, nil)
	require.NoError(t, err)
	require.NotNil(t, resp)
	require.Equal(t, want, bces)

	bces, resp, err = client.Milestones.GetMilestoneBurndownChartEvents(5.01, 12, nil, nil)
	require.ErrorIs(t, err, ErrInvalidIDType)
	require.Nil(t, resp)
	require.Nil(t, bces)

	bces, resp, err = client.Milestones.GetMilestoneBurndownChartEvents(5, 12, nil, nil, errorOption)
	require.ErrorIs(t, err, errRequestOptionFunc)
	require.Nil(t, resp)
	require.Nil(t, bces)

	bces, resp, err = client.Milestones.GetMilestoneBurndownChartEvents(3, 12, nil, nil)
	require.Error(t, err)
	require.Nil(t, bces)
	require.Equal(t, http.StatusNotFound, resp.StatusCode)
}
+89 −0
Changes for testing/milestones_mock.go: 89 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -173,6 +173,51 @@ func (c *MockMilestonesServiceInterfaceGetMilestoneCall) DoAndReturn(f func(any,
	return c
}

// GetMilestoneBurndownChartEvents mocks base method.
func (m *MockMilestonesServiceInterface) GetMilestoneBurndownChartEvents(pid any, milestone int64, opt *gitlab.GetMilestoneBurndownChartEventsOptions, options ...gitlab.RequestOptionFunc) ([]*gitlab.BurndownChartEvent, *gitlab.Response, error) {
	m.ctrl.T.Helper()
	varargs := []any{pid, milestone, opt}
	for _, a := range options {
		varargs = append(varargs, a)
	}
	ret := m.ctrl.Call(m, "GetMilestoneBurndownChartEvents", varargs...)
	ret0, _ := ret[0].([]*gitlab.BurndownChartEvent)
	ret1, _ := ret[1].(*gitlab.Response)
	ret2, _ := ret[2].(error)
	return ret0, ret1, ret2
}

// GetMilestoneBurndownChartEvents indicates an expected call of GetMilestoneBurndownChartEvents.
func (mr *MockMilestonesServiceInterfaceMockRecorder) GetMilestoneBurndownChartEvents(pid, milestone, opt any, options ...any) *MockMilestonesServiceInterfaceGetMilestoneBurndownChartEventsCall {
	mr.mock.ctrl.T.Helper()
	varargs := append([]any{pid, milestone, opt}, options...)
	call := mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetMilestoneBurndownChartEvents", reflect.TypeOf((*MockMilestonesServiceInterface)(nil).GetMilestoneBurndownChartEvents), varargs...)
	return &MockMilestonesServiceInterfaceGetMilestoneBurndownChartEventsCall{Call: call}
}

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

// Return rewrite *gomock.Call.Return
func (c *MockMilestonesServiceInterfaceGetMilestoneBurndownChartEventsCall) Return(arg0 []*gitlab.BurndownChartEvent, arg1 *gitlab.Response, arg2 error) *MockMilestonesServiceInterfaceGetMilestoneBurndownChartEventsCall {
	c.Call = c.Call.Return(arg0, arg1, arg2)
	return c
}

// Do rewrite *gomock.Call.Do
func (c *MockMilestonesServiceInterfaceGetMilestoneBurndownChartEventsCall) Do(f func(any, int64, *gitlab.GetMilestoneBurndownChartEventsOptions, ...gitlab.RequestOptionFunc) ([]*gitlab.BurndownChartEvent, *gitlab.Response, error)) *MockMilestonesServiceInterfaceGetMilestoneBurndownChartEventsCall {
	c.Call = c.Call.Do(f)
	return c
}

// DoAndReturn rewrite *gomock.Call.DoAndReturn
func (c *MockMilestonesServiceInterfaceGetMilestoneBurndownChartEventsCall) DoAndReturn(f func(any, int64, *gitlab.GetMilestoneBurndownChartEventsOptions, ...gitlab.RequestOptionFunc) ([]*gitlab.BurndownChartEvent, *gitlab.Response, error)) *MockMilestonesServiceInterfaceGetMilestoneBurndownChartEventsCall {
	c.Call = c.Call.DoAndReturn(f)
	return c
}

// GetMilestoneIssues mocks base method.
func (m *MockMilestonesServiceInterface) GetMilestoneIssues(pid any, milestone int64, opt *gitlab.GetMilestoneIssuesOptions, options ...gitlab.RequestOptionFunc) ([]*gitlab.Issue, *gitlab.Response, error) {
	m.ctrl.T.Helper()
@@ -308,6 +353,50 @@ func (c *MockMilestonesServiceInterfaceListMilestonesCall) DoAndReturn(f func(an
	return c
}

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

// PromoteMilestone indicates an expected call of PromoteMilestone.
func (mr *MockMilestonesServiceInterfaceMockRecorder) PromoteMilestone(pid, milestone any, options ...any) *MockMilestonesServiceInterfacePromoteMilestoneCall {
	mr.mock.ctrl.T.Helper()
	varargs := append([]any{pid, milestone}, options...)
	call := mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PromoteMilestone", reflect.TypeOf((*MockMilestonesServiceInterface)(nil).PromoteMilestone), varargs...)
	return &MockMilestonesServiceInterfacePromoteMilestoneCall{Call: call}
}

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

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

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

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

// UpdateMilestone mocks base method.
func (m *MockMilestonesServiceInterface) UpdateMilestone(pid any, milestone int64, opt *gitlab.UpdateMilestoneOptions, options ...gitlab.RequestOptionFunc) (*gitlab.Milestone, *gitlab.Response, error) {
	m.ctrl.T.Helper()