From ab2d153009d28a95e0ebbed9b851fee9af288b64 Mon Sep 17 00:00:00 2001 From: Marcin Wyszynski Date: Mon, 29 Aug 2016 22:09:05 +0200 Subject: [PATCH] Explicitly show the required number of approvals --- remote/github/github.go | 13 +-- remote/mock/remote.go | 204 +++++++++++++++++++++++----------------- remote/remote.go | 6 +- store/mock/store.go | 151 ++++++++++++++++------------- web/hook.go | 2 +- 5 files changed, 215 insertions(+), 161 deletions(-) diff --git a/remote/github/github.go b/remote/github/github.go index 65e3abe..5dc79e4 100644 --- a/remote/github/github.go +++ b/remote/github/github.go @@ -274,7 +274,7 @@ func (g *Github) GetContents(u *model.User, r *model.Repo, path string) ([]byte, return content.Decode() } -func (g *Github) SetStatus(u *model.User, r *model.Repo, num int, ok bool) error { +func (g *Github) SetStatus(u *model.User, r *model.Repo, num, granted, required int) error { client := setupClient(g.API, u.Token) pr, _, err := client.PullRequests.Get(r.Owner, r.Name, num) @@ -282,11 +282,12 @@ func (g *Github) SetStatus(u *model.User, r *model.Repo, num int, ok bool) error return err } - status := "pending" - desc := "this commit is pending approval" - if ok { - status = "success" - desc = "this commit looks good" + status := "success" + desc := "this commit looks good" + + if granted < required { + status = "pending" + desc = fmt.Sprintf("%d of %d required approvals granted", granted, required) } data := github.RepoStatus{ diff --git a/remote/mock/remote.go b/remote/mock/remote.go index 98d361f..8152cb4 100644 --- a/remote/mock/remote.go +++ b/remote/mock/remote.go @@ -1,75 +1,101 @@ package mock -import "github.com/stretchr/testify/mock" +import ( + "net/http" -import "net/http" -import "github.com/lgtmco/lgtm/model" + "github.com/lgtmco/lgtm/model" + "github.com/stretchr/testify/mock" +) +// Remote is an autogenerated mock type for the Remote type type Remote struct { mock.Mock } -func (_m *Remote) GetUser(_a0 http.ResponseWriter, _a1 *http.Request) (*model.User, error) { - ret := _m.Called(_a0, _a1) +// DelHook provides a mock function with given fields: _a0, _a1, _a2 +func (_m *Remote) DelHook(_a0 *model.User, _a1 *model.Repo, _a2 string) error { + ret := _m.Called(_a0, _a1, _a2) - var r0 *model.User - if rf, ok := ret.Get(0).(func(http.ResponseWriter, *http.Request) *model.User); ok { - r0 = rf(_a0, _a1) + var r0 error + if rf, ok := ret.Get(0).(func(*model.User, *model.Repo, string) error); ok { + r0 = rf(_a0, _a1, _a2) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// GetComments provides a mock function with given fields: _a0, _a1, _a2 +func (_m *Remote) GetComments(_a0 *model.User, _a1 *model.Repo, _a2 int) ([]*model.Comment, error) { + ret := _m.Called(_a0, _a1, _a2) + + var r0 []*model.Comment + if rf, ok := ret.Get(0).(func(*model.User, *model.Repo, int) []*model.Comment); ok { + r0 = rf(_a0, _a1, _a2) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).(*model.User) + r0 = ret.Get(0).([]*model.Comment) } } var r1 error - if rf, ok := ret.Get(1).(func(http.ResponseWriter, *http.Request) error); ok { - r1 = rf(_a0, _a1) + if rf, ok := ret.Get(1).(func(*model.User, *model.Repo, int) error); ok { + r1 = rf(_a0, _a1, _a2) } else { r1 = ret.Error(1) } return r0, r1 } -func (_m *Remote) GetUserToken(_a0 string) (string, error) { - ret := _m.Called(_a0) - var r0 string - if rf, ok := ret.Get(0).(func(string) string); ok { - r0 = rf(_a0) +// GetContents provides a mock function with given fields: _a0, _a1, _a2 +func (_m *Remote) GetContents(_a0 *model.User, _a1 *model.Repo, _a2 string) ([]byte, error) { + ret := _m.Called(_a0, _a1, _a2) + + var r0 []byte + if rf, ok := ret.Get(0).(func(*model.User, *model.Repo, string) []byte); ok { + r0 = rf(_a0, _a1, _a2) } else { - r0 = ret.Get(0).(string) + if ret.Get(0) != nil { + r0 = ret.Get(0).([]byte) + } } var r1 error - if rf, ok := ret.Get(1).(func(string) error); ok { - r1 = rf(_a0) + if rf, ok := ret.Get(1).(func(*model.User, *model.Repo, string) error); ok { + r1 = rf(_a0, _a1, _a2) } else { r1 = ret.Error(1) } return r0, r1 } -func (_m *Remote) GetTeams(_a0 *model.User) ([]*model.Team, error) { - ret := _m.Called(_a0) - var r0 []*model.Team - if rf, ok := ret.Get(0).(func(*model.User) []*model.Team); ok { - r0 = rf(_a0) +// GetHook provides a mock function with given fields: r +func (_m *Remote) GetHook(r *http.Request) (*model.Hook, error) { + ret := _m.Called(r) + + var r0 *model.Hook + if rf, ok := ret.Get(0).(func(*http.Request) *model.Hook); ok { + r0 = rf(r) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).([]*model.Team) + r0 = ret.Get(0).(*model.Hook) } } var r1 error - if rf, ok := ret.Get(1).(func(*model.User) error); ok { - r1 = rf(_a0) + if rf, ok := ret.Get(1).(func(*http.Request) error); ok { + r1 = rf(r) } else { r1 = ret.Error(1) } return r0, r1 } + +// GetMembers provides a mock function with given fields: _a0, _a1 func (_m *Remote) GetMembers(_a0 *model.User, _a1 string) ([]*model.Member, error) { ret := _m.Called(_a0, _a1) @@ -91,15 +117,17 @@ func (_m *Remote) GetMembers(_a0 *model.User, _a1 string) ([]*model.Member, erro return r0, r1 } -func (_m *Remote) GetRepo(_a0 *model.User, _a1 string, _a2 string) (*model.Repo, error) { + +// GetPerm provides a mock function with given fields: _a0, _a1, _a2 +func (_m *Remote) GetPerm(_a0 *model.User, _a1 string, _a2 string) (*model.Perm, error) { ret := _m.Called(_a0, _a1, _a2) - var r0 *model.Repo - if rf, ok := ret.Get(0).(func(*model.User, string, string) *model.Repo); ok { + var r0 *model.Perm + if rf, ok := ret.Get(0).(func(*model.User, string, string) *model.Perm); ok { r0 = rf(_a0, _a1, _a2) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).(*model.Repo) + r0 = ret.Get(0).(*model.Perm) } } @@ -112,15 +140,17 @@ func (_m *Remote) GetRepo(_a0 *model.User, _a1 string, _a2 string) (*model.Repo, return r0, r1 } -func (_m *Remote) GetPerm(_a0 *model.User, _a1 string, _a2 string) (*model.Perm, error) { + +// GetRepo provides a mock function with given fields: _a0, _a1, _a2 +func (_m *Remote) GetRepo(_a0 *model.User, _a1 string, _a2 string) (*model.Repo, error) { ret := _m.Called(_a0, _a1, _a2) - var r0 *model.Perm - if rf, ok := ret.Get(0).(func(*model.User, string, string) *model.Perm); ok { + var r0 *model.Repo + if rf, ok := ret.Get(0).(func(*model.User, string, string) *model.Repo); ok { r0 = rf(_a0, _a1, _a2) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).(*model.Perm) + r0 = ret.Get(0).(*model.Repo) } } @@ -133,6 +163,8 @@ func (_m *Remote) GetPerm(_a0 *model.User, _a1 string, _a2 string) (*model.Perm, return r0, r1 } + +// GetRepos provides a mock function with given fields: _a0 func (_m *Remote) GetRepos(_a0 *model.User) ([]*model.Repo, error) { ret := _m.Called(_a0) @@ -154,102 +186,98 @@ func (_m *Remote) GetRepos(_a0 *model.User) ([]*model.Repo, error) { return r0, r1 } -func (_m *Remote) SetHook(_a0 *model.User, _a1 *model.Repo, _a2 string) error { - ret := _m.Called(_a0, _a1, _a2) - var r0 error - if rf, ok := ret.Get(0).(func(*model.User, *model.Repo, string) error); ok { - r0 = rf(_a0, _a1, _a2) +// GetTeams provides a mock function with given fields: _a0 +func (_m *Remote) GetTeams(_a0 *model.User) ([]*model.Team, error) { + ret := _m.Called(_a0) + + var r0 []*model.Team + if rf, ok := ret.Get(0).(func(*model.User) []*model.Team); ok { + r0 = rf(_a0) } else { - r0 = ret.Error(0) + if ret.Get(0) != nil { + r0 = ret.Get(0).([]*model.Team) + } } - return r0 -} -func (_m *Remote) DelHook(_a0 *model.User, _a1 *model.Repo, _a2 string) error { - ret := _m.Called(_a0, _a1, _a2) - - var r0 error - if rf, ok := ret.Get(0).(func(*model.User, *model.Repo, string) error); ok { - r0 = rf(_a0, _a1, _a2) + var r1 error + if rf, ok := ret.Get(1).(func(*model.User) error); ok { + r1 = rf(_a0) } else { - r0 = ret.Error(0) + r1 = ret.Error(1) } - return r0 + return r0, r1 } -func (_m *Remote) GetComments(_a0 *model.User, _a1 *model.Repo, _a2 int) ([]*model.Comment, error) { - ret := _m.Called(_a0, _a1, _a2) - var r0 []*model.Comment - if rf, ok := ret.Get(0).(func(*model.User, *model.Repo, int) []*model.Comment); ok { - r0 = rf(_a0, _a1, _a2) +// GetUser provides a mock function with given fields: _a0, _a1 +func (_m *Remote) GetUser(_a0 http.ResponseWriter, _a1 *http.Request) (*model.User, error) { + ret := _m.Called(_a0, _a1) + + var r0 *model.User + if rf, ok := ret.Get(0).(func(http.ResponseWriter, *http.Request) *model.User); ok { + r0 = rf(_a0, _a1) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).([]*model.Comment) + r0 = ret.Get(0).(*model.User) } } var r1 error - if rf, ok := ret.Get(1).(func(*model.User, *model.Repo, int) error); ok { - r1 = rf(_a0, _a1, _a2) + if rf, ok := ret.Get(1).(func(http.ResponseWriter, *http.Request) error); ok { + r1 = rf(_a0, _a1) } else { r1 = ret.Error(1) } return r0, r1 } -func (_m *Remote) GetContents(_a0 *model.User, _a1 *model.Repo, _a2 string) ([]byte, error) { - ret := _m.Called(_a0, _a1, _a2) - var r0 []byte - if rf, ok := ret.Get(0).(func(*model.User, *model.Repo, string) []byte); ok { - r0 = rf(_a0, _a1, _a2) +// GetUserToken provides a mock function with given fields: _a0 +func (_m *Remote) GetUserToken(_a0 string) (string, error) { + ret := _m.Called(_a0) + + var r0 string + if rf, ok := ret.Get(0).(func(string) string); ok { + r0 = rf(_a0) } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).([]byte) - } + r0 = ret.Get(0).(string) } var r1 error - if rf, ok := ret.Get(1).(func(*model.User, *model.Repo, string) error); ok { - r1 = rf(_a0, _a1, _a2) + if rf, ok := ret.Get(1).(func(string) error); ok { + r1 = rf(_a0) } else { r1 = ret.Error(1) } return r0, r1 } -func (_m *Remote) SetStatus(_a0 *model.User, _a1 *model.Repo, _a2 int, _a3 bool) error { - ret := _m.Called(_a0, _a1, _a2, _a3) + +// SetHook provides a mock function with given fields: _a0, _a1, _a2 +func (_m *Remote) SetHook(_a0 *model.User, _a1 *model.Repo, _a2 string) error { + ret := _m.Called(_a0, _a1, _a2) var r0 error - if rf, ok := ret.Get(0).(func(*model.User, *model.Repo, int, bool) error); ok { - r0 = rf(_a0, _a1, _a2, _a3) + if rf, ok := ret.Get(0).(func(*model.User, *model.Repo, string) error); ok { + r0 = rf(_a0, _a1, _a2) } else { r0 = ret.Error(0) } return r0 } -func (_m *Remote) GetHook(r *http.Request) (*model.Hook, error) { - ret := _m.Called(r) - var r0 *model.Hook - if rf, ok := ret.Get(0).(func(*http.Request) *model.Hook); ok { - r0 = rf(r) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*model.Hook) - } - } +// SetStatus provides a mock function with given fields: _a0, _a1, _a2, _a3, _a4 +func (_m *Remote) SetStatus(_a0 *model.User, _a1 *model.Repo, _a2 int, _a3 int, _a4 int) error { + ret := _m.Called(_a0, _a1, _a2, _a3, _a4) - var r1 error - if rf, ok := ret.Get(1).(func(*http.Request) error); ok { - r1 = rf(r) + var r0 error + if rf, ok := ret.Get(0).(func(*model.User, *model.Repo, int, int, int) error); ok { + r0 = rf(_a0, _a1, _a2, _a3, _a4) } else { - r1 = ret.Error(1) + r0 = ret.Error(0) } - return r0, r1 + return r0 } diff --git a/remote/remote.go b/remote/remote.go index 77a0d8b..bbe9627 100644 --- a/remote/remote.go +++ b/remote/remote.go @@ -45,7 +45,7 @@ type Remote interface { GetContents(*model.User, *model.Repo, string) ([]byte, error) // SetStatus adds or updates the pull request status in the remote system. - SetStatus(*model.User, *model.Repo, int, bool) error + SetStatus(*model.User, *model.Repo, int, int, int) error // GetHook gets the hook from the http Request. GetHook(r *http.Request) (*model.Hook, error) @@ -108,8 +108,8 @@ func DelHook(c context.Context, u *model.User, r *model.Repo, hook string) error } // SetStatus adds or updates the pull request status in the remote system. -func SetStatus(c context.Context, u *model.User, r *model.Repo, num int, ok bool) error { - return FromContext(c).SetStatus(u, r, num, ok) +func SetStatus(c context.Context, u *model.User, r *model.Repo, num, granted, required int) error { + return FromContext(c).SetStatus(u, r, num, granted, required) } // GetHook gets the hook from the http Request. diff --git a/store/mock/store.go b/store/mock/store.go index 506f50e..6a3d49e 100644 --- a/store/mock/store.go +++ b/store/mock/store.go @@ -1,55 +1,30 @@ -package mock +package mocks -import "github.com/stretchr/testify/mock" - -import "github.com/lgtmco/lgtm/model" +import ( + "github.com/lgtmco/lgtm/model" + "github.com/stretchr/testify/mock" +) +// Store is an autogenerated mock type for the Store type type Store struct { mock.Mock } -func (_m *Store) GetUser(_a0 int64) (*model.User, error) { +// CreateRepo provides a mock function with given fields: _a0 +func (_m *Store) CreateRepo(_a0 *model.Repo) error { ret := _m.Called(_a0) - var r0 *model.User - if rf, ok := ret.Get(0).(func(int64) *model.User); ok { + var r0 error + if rf, ok := ret.Get(0).(func(*model.Repo) error); ok { r0 = rf(_a0) } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*model.User) - } - } - - var r1 error - if rf, ok := ret.Get(1).(func(int64) error); ok { - r1 = rf(_a0) - } else { - r1 = ret.Error(1) + r0 = ret.Error(0) } - return r0, r1 + return r0 } -func (_m *Store) GetUserLogin(_a0 string) (*model.User, error) { - ret := _m.Called(_a0) - - var r0 *model.User - if rf, ok := ret.Get(0).(func(string) *model.User); ok { - r0 = rf(_a0) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*model.User) - } - } - var r1 error - if rf, ok := ret.Get(1).(func(string) error); ok { - r1 = rf(_a0) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} +// CreateUser provides a mock function with given fields: _a0 func (_m *Store) CreateUser(_a0 *model.User) error { ret := _m.Called(_a0) @@ -62,11 +37,13 @@ func (_m *Store) CreateUser(_a0 *model.User) error { return r0 } -func (_m *Store) UpdateUser(_a0 *model.User) error { + +// DeleteRepo provides a mock function with given fields: _a0 +func (_m *Store) DeleteRepo(_a0 *model.Repo) error { ret := _m.Called(_a0) var r0 error - if rf, ok := ret.Get(0).(func(*model.User) error); ok { + if rf, ok := ret.Get(0).(func(*model.Repo) error); ok { r0 = rf(_a0) } else { r0 = ret.Error(0) @@ -74,6 +51,8 @@ func (_m *Store) UpdateUser(_a0 *model.User) error { return r0 } + +// DeleteUser provides a mock function with given fields: _a0 func (_m *Store) DeleteUser(_a0 *model.User) error { ret := _m.Called(_a0) @@ -86,6 +65,8 @@ func (_m *Store) DeleteUser(_a0 *model.User) error { return r0 } + +// GetRepo provides a mock function with given fields: _a0 func (_m *Store) GetRepo(_a0 int64) (*model.Repo, error) { ret := _m.Called(_a0) @@ -107,33 +88,37 @@ func (_m *Store) GetRepo(_a0 int64) (*model.Repo, error) { return r0, r1 } -func (_m *Store) GetRepoSlug(_a0 string) (*model.Repo, error) { + +// GetRepoMulti provides a mock function with given fields: _a0 +func (_m *Store) GetRepoMulti(_a0 ...string) ([]*model.Repo, error) { ret := _m.Called(_a0) - var r0 *model.Repo - if rf, ok := ret.Get(0).(func(string) *model.Repo); ok { - r0 = rf(_a0) + var r0 []*model.Repo + if rf, ok := ret.Get(0).(func(...string) []*model.Repo); ok { + r0 = rf(_a0...) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).(*model.Repo) + r0 = ret.Get(0).([]*model.Repo) } } var r1 error - if rf, ok := ret.Get(1).(func(string) error); ok { - r1 = rf(_a0) + if rf, ok := ret.Get(1).(func(...string) error); ok { + r1 = rf(_a0...) } else { r1 = ret.Error(1) } return r0, r1 } -func (_m *Store) GetRepoMulti(_a0 ...string) ([]*model.Repo, error) { + +// GetRepoOwner provides a mock function with given fields: _a0 +func (_m *Store) GetRepoOwner(_a0 string) ([]*model.Repo, error) { ret := _m.Called(_a0) var r0 []*model.Repo - if rf, ok := ret.Get(0).(func(...string) []*model.Repo); ok { - r0 = rf(_a0...) + if rf, ok := ret.Get(0).(func(string) []*model.Repo); ok { + r0 = rf(_a0) } else { if ret.Get(0) != nil { r0 = ret.Get(0).([]*model.Repo) @@ -141,23 +126,25 @@ func (_m *Store) GetRepoMulti(_a0 ...string) ([]*model.Repo, error) { } var r1 error - if rf, ok := ret.Get(1).(func(...string) error); ok { - r1 = rf(_a0...) + if rf, ok := ret.Get(1).(func(string) error); ok { + r1 = rf(_a0) } else { r1 = ret.Error(1) } return r0, r1 } -func (_m *Store) GetRepoOwner(_a0 string) ([]*model.Repo, error) { + +// GetRepoSlug provides a mock function with given fields: _a0 +func (_m *Store) GetRepoSlug(_a0 string) (*model.Repo, error) { ret := _m.Called(_a0) - var r0 []*model.Repo - if rf, ok := ret.Get(0).(func(string) []*model.Repo); ok { + var r0 *model.Repo + if rf, ok := ret.Get(0).(func(string) *model.Repo); ok { r0 = rf(_a0) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).([]*model.Repo) + r0 = ret.Get(0).(*model.Repo) } } @@ -170,18 +157,54 @@ func (_m *Store) GetRepoOwner(_a0 string) ([]*model.Repo, error) { return r0, r1 } -func (_m *Store) CreateRepo(_a0 *model.Repo) error { + +// GetUser provides a mock function with given fields: _a0 +func (_m *Store) GetUser(_a0 int64) (*model.User, error) { ret := _m.Called(_a0) - var r0 error - if rf, ok := ret.Get(0).(func(*model.Repo) error); ok { + var r0 *model.User + if rf, ok := ret.Get(0).(func(int64) *model.User); ok { r0 = rf(_a0) } else { - r0 = ret.Error(0) + if ret.Get(0) != nil { + r0 = ret.Get(0).(*model.User) + } } - return r0 + var r1 error + if rf, ok := ret.Get(1).(func(int64) error); ok { + r1 = rf(_a0) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetUserLogin provides a mock function with given fields: _a0 +func (_m *Store) GetUserLogin(_a0 string) (*model.User, error) { + ret := _m.Called(_a0) + + var r0 *model.User + if rf, ok := ret.Get(0).(func(string) *model.User); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*model.User) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(string) error); ok { + r1 = rf(_a0) + } else { + r1 = ret.Error(1) + } + + return r0, r1 } + +// UpdateRepo provides a mock function with given fields: _a0 func (_m *Store) UpdateRepo(_a0 *model.Repo) error { ret := _m.Called(_a0) @@ -194,11 +217,13 @@ func (_m *Store) UpdateRepo(_a0 *model.Repo) error { return r0 } -func (_m *Store) DeleteRepo(_a0 *model.Repo) error { + +// UpdateUser provides a mock function with given fields: _a0 +func (_m *Store) UpdateUser(_a0 *model.User) error { ret := _m.Called(_a0) var r0 error - if rf, ok := ret.Get(0).(func(*model.Repo) error); ok { + if rf, ok := ret.Get(0).(func(*model.User) error); ok { r0 = rf(_a0) } else { r0 = ret.Error(0) diff --git a/web/hook.go b/web/hook.go index 1378415..b4976ec 100644 --- a/web/hook.go +++ b/web/hook.go @@ -78,7 +78,7 @@ func Hook(c *gin.Context) { } approvers := getApprovers(config, maintainer, hook.Issue, comments) approved := len(approvers) >= config.Approvals - err = remote.SetStatus(c, user, repo, hook.Issue.Number, approved) + err = remote.SetStatus(c, user, repo, hook.Issue.Number, len(approvers), config.Approvals) if err != nil { log.Errorf("Error setting status for %s pr %d. %s", repo.Slug, hook.Issue.Number, err) c.String(500, "Error setting status. %s.", err)