MM-15276: Migrate Team.Update to sync by default (#10693)

* MM-15276: Migrate Team.Update to sync by default

* MM-15276: Addressing review comments and change Update func signature similar to other interface Update method

* update store mocks for update fn

* addressing review comments
Этот коммит содержится в:
Puneeth Reddy
2019-04-25 06:29:02 -07:00
коммит произвёл Jesús Espino
родитель b24013d54c
Коммит ec95793b90
17 изменённых файлов: 109 добавлений и 111 удалений

Просмотреть файл

@@ -602,7 +602,6 @@ func TestUpdatePost(t *testing.T) {
assert.NotEqual(t, rpost3.EditAt, rrupost3.EditAt) assert.NotEqual(t, rpost3.EditAt, rrupost3.EditAt)
assert.NotEqual(t, rpost3.Attachments(), rrupost3.Attachments()) assert.NotEqual(t, rpost3.Attachments(), rrupost3.Attachments())
Client.Logout() Client.Logout()
_, resp = Client.UpdatePost(rpost.Id, rpost) _, resp = Client.UpdatePost(rpost.Id, rpost)
CheckUnauthorizedStatus(t, resp) CheckUnauthorizedStatus(t, resp)

Просмотреть файл

@@ -304,9 +304,8 @@ func TestGetTeamsForScheme(t *testing.T) {
assert.Zero(t, len(l2)) assert.Zero(t, len(l2))
team1.SchemeId = &scheme1.Id team1.SchemeId = &scheme1.Id
result2 := <-th.App.Srv.Store.Team().Update(team1) team1, err := th.App.Srv.Store.Team().Update(team1)
assert.Nil(t, result2.Err) assert.Nil(t, err)
team1 = result2.Data.(*model.Team)
l3, r3 := th.SystemAdminClient.GetTeamsForScheme(scheme1.Id, 0, 100) l3, r3 := th.SystemAdminClient.GetTeamsForScheme(scheme1.Id, 0, 100)
CheckNoError(t, r3) CheckNoError(t, r3)

Просмотреть файл

@@ -136,12 +136,7 @@ func (a *App) UpdateTeam(team *model.Team) (*model.Team, *model.AppError) {
} }
func (a *App) updateTeamUnsanitized(team *model.Team) (*model.Team, *model.AppError) { func (a *App) updateTeamUnsanitized(team *model.Team) (*model.Team, *model.AppError) {
result := <-a.Srv.Store.Team().Update(team) return a.Srv.Store.Team().Update(team)
if result.Err != nil {
return nil, result.Err
}
return result.Data.(*model.Team), nil
} }
// RenameTeam is used to rename the team Name and the DisplayName fields // RenameTeam is used to rename the team Name and the DisplayName fields
@@ -180,8 +175,8 @@ func (a *App) UpdateTeamScheme(team *model.Team) (*model.Team, *model.AppError)
oldTeam.SchemeId = team.SchemeId oldTeam.SchemeId = team.SchemeId
if result := <-a.Srv.Store.Team().Update(oldTeam); result.Err != nil { if oldTeam, err = a.Srv.Store.Team().Update(oldTeam); err != nil {
return nil, result.Err return nil, err
} }
a.sendTeamEvent(oldTeam, model.WEBSOCKET_EVENT_UPDATE_TEAM) a.sendTeamEvent(oldTeam, model.WEBSOCKET_EVENT_UPDATE_TEAM)
@@ -1051,8 +1046,8 @@ func (a *App) PermanentDeleteTeamId(teamId string) *model.AppError {
func (a *App) PermanentDeleteTeam(team *model.Team) *model.AppError { func (a *App) PermanentDeleteTeam(team *model.Team) *model.AppError {
team.DeleteAt = model.GetMillis() team.DeleteAt = model.GetMillis()
if result := <-a.Srv.Store.Team().Update(team); result.Err != nil { if _, err := a.Srv.Store.Team().Update(team); err != nil {
return result.Err return err
} }
if result := <-a.Srv.Store.Channel().GetTeamChannels(team.Id); result.Err != nil { if result := <-a.Srv.Store.Channel().GetTeamChannels(team.Id); result.Err != nil {
@@ -1090,8 +1085,8 @@ func (a *App) SoftDeleteTeam(teamId string) *model.AppError {
} }
team.DeleteAt = model.GetMillis() team.DeleteAt = model.GetMillis()
if result := <-a.Srv.Store.Team().Update(team); result.Err != nil { if team, err = a.Srv.Store.Team().Update(team); err != nil {
return result.Err return err
} }
a.sendTeamEvent(team, model.WEBSOCKET_EVENT_DELETE_TEAM) a.sendTeamEvent(team, model.WEBSOCKET_EVENT_DELETE_TEAM)
@@ -1104,11 +1099,12 @@ func (a *App) RestoreTeam(teamId string) *model.AppError {
if err != nil { if err != nil {
return err return err
} }
team.DeleteAt = 0 team.DeleteAt = 0
result := <-a.Srv.Store.Team().Update(team) if team, err = a.Srv.Store.Team().Update(team); err != nil {
if result.Err != nil { return err
return result.Err
} }
a.sendTeamEvent(team, model.WEBSOCKET_EVENT_RESTORE_TEAM) a.sendTeamEvent(team, model.WEBSOCKET_EVENT_RESTORE_TEAM)
return nil return nil
} }

Просмотреть файл

@@ -181,10 +181,8 @@ func TestPostSanitizeProps(t *testing.T) {
} }
func TestPost_AttachmentsEqual(t *testing.T) { func TestPost_AttachmentsEqual(t *testing.T) {
post1 := &Post { post1 := &Post{}
} post2 := &Post{}
post2 := &Post {
}
for name, tc := range map[string]struct { for name, tc := range map[string]struct {
Attachments1 []*SlackAttachment Attachments1 []*SlackAttachment
Attachments2 []*SlackAttachment Attachments2 []*SlackAttachment
@@ -247,7 +245,7 @@ func TestPost_AttachmentsEqual(t *testing.T) {
"EqualFields": { "EqualFields": {
[]*SlackAttachment{ []*SlackAttachment{
{ {
Fields: []*SlackAttachmentField { Fields: []*SlackAttachmentField{
{ {
Title: "Hello World", Title: "Hello World",
Value: "FooBar", Value: "FooBar",
@@ -261,7 +259,7 @@ func TestPost_AttachmentsEqual(t *testing.T) {
}, },
[]*SlackAttachment{ []*SlackAttachment{
{ {
Fields: []*SlackAttachmentField { Fields: []*SlackAttachmentField{
{ {
Title: "Hello World", Title: "Hello World",
Value: "FooBar", Value: "FooBar",
@@ -278,7 +276,7 @@ func TestPost_AttachmentsEqual(t *testing.T) {
"DifferentFields": { "DifferentFields": {
[]*SlackAttachment{ []*SlackAttachment{
{ {
Fields: []*SlackAttachmentField { Fields: []*SlackAttachmentField{
{ {
Title: "Hello World", Title: "Hello World",
Value: "FooBar", Value: "FooBar",
@@ -288,7 +286,7 @@ func TestPost_AttachmentsEqual(t *testing.T) {
}, },
[]*SlackAttachment{ []*SlackAttachment{
{ {
Fields: []*SlackAttachmentField { Fields: []*SlackAttachmentField{
{ {
Title: "Hello World", Title: "Hello World",
Value: "FooBar", Value: "FooBar",
@@ -310,7 +308,7 @@ func TestPost_AttachmentsEqual(t *testing.T) {
Actions: []*PostAction{ Actions: []*PostAction{
{ {
Name: "FooBar", Name: "FooBar",
Options: []*PostActionOptions { Options: []*PostActionOptions{
{ {
Text: "abcdef", Text: "abcdef",
Value: "abcdef", Value: "abcdef",
@@ -332,7 +330,7 @@ func TestPost_AttachmentsEqual(t *testing.T) {
Actions: []*PostAction{ Actions: []*PostAction{
{ {
Name: "FooBar", Name: "FooBar",
Options: []*PostActionOptions { Options: []*PostActionOptions{
{ {
Text: "abcdef", Text: "abcdef",
Value: "abcdef", Value: "abcdef",
@@ -357,7 +355,7 @@ func TestPost_AttachmentsEqual(t *testing.T) {
Actions: []*PostAction{ Actions: []*PostAction{
{ {
Name: "FooBar", Name: "FooBar",
Options: []*PostActionOptions { Options: []*PostActionOptions{
{ {
Text: "abcdef", Text: "abcdef",
Value: "abcdef", Value: "abcdef",
@@ -379,7 +377,7 @@ func TestPost_AttachmentsEqual(t *testing.T) {
Actions: []*PostAction{ Actions: []*PostAction{
{ {
Name: "FooBar", Name: "FooBar",
Options: []*PostActionOptions { Options: []*PostActionOptions{
{ {
Text: "abcdef", Text: "abcdef",
Value: "abcdef", Value: "abcdef",

Просмотреть файл

@@ -181,7 +181,7 @@ func TestIsOwnIP(t *testing.T) {
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
if got, _ := IsOwnIP(tt.ip); got != tt.want { if got, _ := IsOwnIP(tt.ip); got != tt.want {
t.Errorf("IsOwnIP() = %v, want %v", got, tt.want) t.Errorf("IsOwnIP() = %v, want %v", got, tt.want)
t.Errorf(tt.ip.String()); t.Errorf(tt.ip.String())
} }
}) })
} }

Просмотреть файл

@@ -194,23 +194,22 @@ func (s SqlTeamStore) Save(team *model.Team) store.StoreChannel {
}) })
} }
func (s SqlTeamStore) Update(team *model.Team) store.StoreChannel { func (s SqlTeamStore) Update(team *model.Team) (*model.Team, *model.AppError) {
return store.Do(func(result *store.StoreResult) {
team.PreUpdate() team.PreUpdate()
if result.Err = team.IsValid(); result.Err != nil { if err := team.IsValid(); err != nil {
return return nil, err
} }
oldResult, err := s.GetMaster().Get(model.Team{}, team.Id) oldResult, err := s.GetMaster().Get(model.Team{}, team.Id)
if err != nil { if err != nil {
result.Err = model.NewAppError("SqlTeamStore.Update", "store.sql_team.update.finding.app_error", nil, "id="+team.Id+", "+err.Error(), http.StatusInternalServerError) return nil, model.NewAppError("SqlTeamStore.Update", "store.sql_team.update.finding.app_error", nil, "id="+team.Id+", "+err.Error(), http.StatusInternalServerError)
return
} }
if oldResult == nil { if oldResult == nil {
result.Err = model.NewAppError("SqlTeamStore.Update", "store.sql_team.update.find.app_error", nil, "id="+team.Id, http.StatusBadRequest) return nil, model.NewAppError("SqlTeamStore.Update", "store.sql_team.update.find.app_error", nil, "id="+team.Id, http.StatusBadRequest)
return
} }
oldTeam := oldResult.(*model.Team) oldTeam := oldResult.(*model.Team)
@@ -219,16 +218,13 @@ func (s SqlTeamStore) Update(team *model.Team) store.StoreChannel {
count, err := s.GetMaster().Update(team) count, err := s.GetMaster().Update(team)
if err != nil { if err != nil {
result.Err = model.NewAppError("SqlTeamStore.Update", "store.sql_team.update.updating.app_error", nil, "id="+team.Id+", "+err.Error(), http.StatusInternalServerError) return nil, model.NewAppError("SqlTeamStore.Update", "store.sql_team.update.updating.app_error", nil, "id="+team.Id+", "+err.Error(), http.StatusInternalServerError)
return
} }
if count != 1 { if count != 1 {
result.Err = model.NewAppError("SqlTeamStore.Update", "store.sql_team.update.app_error", nil, "id="+team.Id, http.StatusInternalServerError) return nil, model.NewAppError("SqlTeamStore.Update", "store.sql_team.update.app_error", nil, "id="+team.Id, http.StatusInternalServerError)
return
} }
result.Data = team return team, nil
})
} }
func (s SqlTeamStore) UpdateDisplayName(name string, teamId string) store.StoreChannel { func (s SqlTeamStore) UpdateDisplayName(name string, teamId string) store.StoreChannel {

Просмотреть файл

@@ -82,7 +82,7 @@ type Store interface {
type TeamStore interface { type TeamStore interface {
Save(team *model.Team) StoreChannel Save(team *model.Team) StoreChannel
Update(team *model.Team) StoreChannel Update(team *model.Team) (*model.Team, *model.AppError)
UpdateDisplayName(name string, teamId string) StoreChannel UpdateDisplayName(name string, teamId string) StoreChannel
Get(id string) StoreChannel Get(id string) StoreChannel
GetByName(name string) StoreChannel GetByName(name string) StoreChannel

Просмотреть файл

@@ -1011,16 +1011,16 @@ func testPendingAutoAddTeamMembers(t *testing.T, ss store.Store) {
// No result if Team deleted // No result if Team deleted
team.DeleteAt = model.GetMillis() team.DeleteAt = model.GetMillis()
res = <-ss.Team().Update(team) team, err := ss.Team().Update(team)
require.Nil(t, res.Err) require.Nil(t, err)
res = <-ss.Group().TeamMembersToAdd(0) res = <-ss.Group().TeamMembersToAdd(0)
require.Nil(t, res.Err) require.Nil(t, res.Err)
require.Len(t, res.Data, 0) require.Len(t, res.Data, 0)
// reset state of team and verify // reset state of team and verify
team.DeleteAt = 0 team.DeleteAt = 0
res = <-ss.Team().Update(team) team, err = ss.Team().Update(team)
require.Nil(t, res.Err) require.Nil(t, err)
res = <-ss.Group().TeamMembersToAdd(0) res = <-ss.Group().TeamMembersToAdd(0)
require.Nil(t, res.Err) require.Nil(t, res.Err)
require.Len(t, res.Data, 1) require.Len(t, res.Data, 1)

Просмотреть файл

@@ -606,19 +606,28 @@ func (_m *TeamStore) SearchPrivate(term string) store.StoreChannel {
} }
// Update provides a mock function with given fields: team // Update provides a mock function with given fields: team
func (_m *TeamStore) Update(team *model.Team) store.StoreChannel { func (_m *TeamStore) Update(team *model.Team) (*model.Team, *model.AppError) {
ret := _m.Called(team) ret := _m.Called(team)
var r0 store.StoreChannel var r0 *model.Team
if rf, ok := ret.Get(0).(func(*model.Team) store.StoreChannel); ok { if rf, ok := ret.Get(0).(func(*model.Team) *model.Team); ok {
r0 = rf(team) r0 = rf(team)
} else { } else {
if ret.Get(0) != nil { if ret.Get(0) != nil {
r0 = ret.Get(0).(store.StoreChannel) r0 = ret.Get(0).(*model.Team)
} }
} }
return r0 var r1 *model.AppError
if rf, ok := ret.Get(1).(func(*model.Team) *model.AppError); ok {
r1 = rf(team)
} else {
if ret.Get(1) != nil {
r1 = ret.Get(1).(*model.AppError)
}
}
return r0, r1
} }
// UpdateDisplayName provides a mock function with given fields: name, teamId // UpdateDisplayName provides a mock function with given fields: name, teamId

Просмотреть файл

@@ -27,7 +27,7 @@ func TestTeamStore(t *testing.T, ss store.Store) {
t.Run("SearchAll", func(t *testing.T) { testTeamStoreSearchAll(t, ss) }) t.Run("SearchAll", func(t *testing.T) { testTeamStoreSearchAll(t, ss) })
t.Run("SearchOpen", func(t *testing.T) { testTeamStoreSearchOpen(t, ss) }) t.Run("SearchOpen", func(t *testing.T) { testTeamStoreSearchOpen(t, ss) })
t.Run("SearchPrivate", func(t *testing.T) { testTeamStoreSearchPrivate(t, ss) }) t.Run("SearchPrivate", func(t *testing.T) { testTeamStoreSearchPrivate(t, ss) })
t.Run("GetByIniviteId", func(t *testing.T) { testTeamStoreGetByIniviteId(t, ss) }) t.Run("GetByInviteId", func(t *testing.T) { testTeamStoreGetByInviteId(t, ss) })
t.Run("ByUserId", func(t *testing.T) { testTeamStoreByUserId(t, ss) }) t.Run("ByUserId", func(t *testing.T) { testTeamStoreByUserId(t, ss) })
t.Run("GetAllTeamListing", func(t *testing.T) { testGetAllTeamListing(t, ss) }) t.Run("GetAllTeamListing", func(t *testing.T) { testGetAllTeamListing(t, ss) })
t.Run("GetAllTeamPageListing", func(t *testing.T) { testGetAllTeamPageListing(t, ss) }) t.Run("GetAllTeamPageListing", func(t *testing.T) { testGetAllTeamPageListing(t, ss) })
@@ -86,17 +86,17 @@ func testTeamStoreUpdate(t *testing.T, ss store.Store) {
time.Sleep(100 * time.Millisecond) time.Sleep(100 * time.Millisecond)
if err := (<-ss.Team().Update(&o1)).Err; err != nil { if _, err := ss.Team().Update(&o1); err != nil {
t.Fatal(err) t.Fatal(err)
} }
o1.Id = "missing" o1.Id = "missing"
if err := (<-ss.Team().Update(&o1)).Err; err == nil { if _, err := ss.Team().Update(&o1); err == nil {
t.Fatal("Update should have failed because of missing key") t.Fatal("Update should have failed because of missing key")
} }
o1.Id = model.NewId() o1.Id = model.NewId()
if err := (<-ss.Team().Update(&o1)).Err; err == nil { if _, err := ss.Team().Update(&o1); err == nil {
t.Fatal("Update should have faile because id change") t.Fatal("Update should have faile because id change")
} }
} }
@@ -385,7 +385,7 @@ func testTeamStoreSearchPrivate(t *testing.T, ss store.Store) {
} }
} }
func testTeamStoreGetByIniviteId(t *testing.T, ss store.Store) { func testTeamStoreGetByInviteId(t *testing.T, ss store.Store) {
o1 := model.Team{} o1 := model.Team{}
o1.DisplayName = "DisplayName" o1.DisplayName = "DisplayName"
o1.Name = "z-z-z" + model.NewId() + "b" o1.Name = "z-z-z" + model.NewId() + "b"
@@ -416,7 +416,8 @@ func testTeamStoreGetByIniviteId(t *testing.T, ss store.Store) {
} }
o2.InviteId = "" o2.InviteId = ""
<-ss.Team().Update(&o2) _, err := ss.Team().Update(&o2)
require.Nil(t, err)
if r1 := <-ss.Team().GetByInviteId(o2.Id); r1.Err != nil { if r1 := <-ss.Team().GetByInviteId(o2.Id); r1.Err != nil {
t.Fatal(r1.Err) t.Fatal(r1.Err)

Просмотреть файл

@@ -3513,8 +3513,8 @@ func testUserStoreGetTeamGroupUsers(t *testing.T, ss store.Store) {
// update team to be group-constrained // update team to be group-constrained
team.GroupConstrained = model.NewBool(true) team.GroupConstrained = model.NewBool(true)
res = <-ss.Team().Update(team) team, err := ss.Team().Update(team)
require.Nil(t, res.Err) require.Nil(t, err)
// still returns user (being group-constrained has no effect) // still returns user (being group-constrained has no effect)
requireNUsers(1) requireNUsers(1)