MM-57326: [Shared Channels] Message priority, acknowledgement and persistent notifications need to be synced (#30736)
Этот коммит содержится в:
коммит произвёл
GitHub
родитель
fa1c77d9b0
Коммит
85391de22a
@@ -14,6 +14,54 @@ type PostAcknowledgementStore struct {
|
||||
mock.Mock
|
||||
}
|
||||
|
||||
// BatchDelete provides a mock function with given fields: acknowledgements
|
||||
func (_m *PostAcknowledgementStore) BatchDelete(acknowledgements []*model.PostAcknowledgement) error {
|
||||
ret := _m.Called(acknowledgements)
|
||||
|
||||
if len(ret) == 0 {
|
||||
panic("no return value specified for BatchDelete")
|
||||
}
|
||||
|
||||
var r0 error
|
||||
if rf, ok := ret.Get(0).(func([]*model.PostAcknowledgement) error); ok {
|
||||
r0 = rf(acknowledgements)
|
||||
} else {
|
||||
r0 = ret.Error(0)
|
||||
}
|
||||
|
||||
return r0
|
||||
}
|
||||
|
||||
// BatchSave provides a mock function with given fields: acknowledgements
|
||||
func (_m *PostAcknowledgementStore) BatchSave(acknowledgements []*model.PostAcknowledgement) ([]*model.PostAcknowledgement, error) {
|
||||
ret := _m.Called(acknowledgements)
|
||||
|
||||
if len(ret) == 0 {
|
||||
panic("no return value specified for BatchSave")
|
||||
}
|
||||
|
||||
var r0 []*model.PostAcknowledgement
|
||||
var r1 error
|
||||
if rf, ok := ret.Get(0).(func([]*model.PostAcknowledgement) ([]*model.PostAcknowledgement, error)); ok {
|
||||
return rf(acknowledgements)
|
||||
}
|
||||
if rf, ok := ret.Get(0).(func([]*model.PostAcknowledgement) []*model.PostAcknowledgement); ok {
|
||||
r0 = rf(acknowledgements)
|
||||
} else {
|
||||
if ret.Get(0) != nil {
|
||||
r0 = ret.Get(0).([]*model.PostAcknowledgement)
|
||||
}
|
||||
}
|
||||
|
||||
if rf, ok := ret.Get(1).(func([]*model.PostAcknowledgement) error); ok {
|
||||
r1 = rf(acknowledgements)
|
||||
} else {
|
||||
r1 = ret.Error(1)
|
||||
}
|
||||
|
||||
return r0, r1
|
||||
}
|
||||
|
||||
// Delete provides a mock function with given fields: acknowledgement
|
||||
func (_m *PostAcknowledgementStore) Delete(acknowledgement *model.PostAcknowledgement) error {
|
||||
ret := _m.Called(acknowledgement)
|
||||
@@ -92,6 +140,36 @@ func (_m *PostAcknowledgementStore) GetForPost(postID string) ([]*model.PostAckn
|
||||
return r0, r1
|
||||
}
|
||||
|
||||
// GetForPostSince provides a mock function with given fields: postID, since, excludeRemoteID, inclDeleted
|
||||
func (_m *PostAcknowledgementStore) GetForPostSince(postID string, since int64, excludeRemoteID string, inclDeleted bool) ([]*model.PostAcknowledgement, error) {
|
||||
ret := _m.Called(postID, since, excludeRemoteID, inclDeleted)
|
||||
|
||||
if len(ret) == 0 {
|
||||
panic("no return value specified for GetForPostSince")
|
||||
}
|
||||
|
||||
var r0 []*model.PostAcknowledgement
|
||||
var r1 error
|
||||
if rf, ok := ret.Get(0).(func(string, int64, string, bool) ([]*model.PostAcknowledgement, error)); ok {
|
||||
return rf(postID, since, excludeRemoteID, inclDeleted)
|
||||
}
|
||||
if rf, ok := ret.Get(0).(func(string, int64, string, bool) []*model.PostAcknowledgement); ok {
|
||||
r0 = rf(postID, since, excludeRemoteID, inclDeleted)
|
||||
} else {
|
||||
if ret.Get(0) != nil {
|
||||
r0 = ret.Get(0).([]*model.PostAcknowledgement)
|
||||
}
|
||||
}
|
||||
|
||||
if rf, ok := ret.Get(1).(func(string, int64, string, bool) error); ok {
|
||||
r1 = rf(postID, since, excludeRemoteID, inclDeleted)
|
||||
} else {
|
||||
r1 = ret.Error(1)
|
||||
}
|
||||
|
||||
return r0, r1
|
||||
}
|
||||
|
||||
// GetForPosts provides a mock function with given fields: postIds
|
||||
func (_m *PostAcknowledgementStore) GetForPosts(postIds []string) ([]*model.PostAcknowledgement, error) {
|
||||
ret := _m.Called(postIds)
|
||||
@@ -122,29 +200,59 @@ func (_m *PostAcknowledgementStore) GetForPosts(postIds []string) ([]*model.Post
|
||||
return r0, r1
|
||||
}
|
||||
|
||||
// Save provides a mock function with given fields: postID, userID, acknowledgedAt
|
||||
func (_m *PostAcknowledgementStore) Save(postID string, userID string, acknowledgedAt int64) (*model.PostAcknowledgement, error) {
|
||||
ret := _m.Called(postID, userID, acknowledgedAt)
|
||||
// GetSingle provides a mock function with given fields: userID, postID, remoteID
|
||||
func (_m *PostAcknowledgementStore) GetSingle(userID string, postID string, remoteID string) (*model.PostAcknowledgement, error) {
|
||||
ret := _m.Called(userID, postID, remoteID)
|
||||
|
||||
if len(ret) == 0 {
|
||||
panic("no return value specified for Save")
|
||||
panic("no return value specified for GetSingle")
|
||||
}
|
||||
|
||||
var r0 *model.PostAcknowledgement
|
||||
var r1 error
|
||||
if rf, ok := ret.Get(0).(func(string, string, int64) (*model.PostAcknowledgement, error)); ok {
|
||||
return rf(postID, userID, acknowledgedAt)
|
||||
if rf, ok := ret.Get(0).(func(string, string, string) (*model.PostAcknowledgement, error)); ok {
|
||||
return rf(userID, postID, remoteID)
|
||||
}
|
||||
if rf, ok := ret.Get(0).(func(string, string, int64) *model.PostAcknowledgement); ok {
|
||||
r0 = rf(postID, userID, acknowledgedAt)
|
||||
if rf, ok := ret.Get(0).(func(string, string, string) *model.PostAcknowledgement); ok {
|
||||
r0 = rf(userID, postID, remoteID)
|
||||
} else {
|
||||
if ret.Get(0) != nil {
|
||||
r0 = ret.Get(0).(*model.PostAcknowledgement)
|
||||
}
|
||||
}
|
||||
|
||||
if rf, ok := ret.Get(1).(func(string, string, int64) error); ok {
|
||||
r1 = rf(postID, userID, acknowledgedAt)
|
||||
if rf, ok := ret.Get(1).(func(string, string, string) error); ok {
|
||||
r1 = rf(userID, postID, remoteID)
|
||||
} else {
|
||||
r1 = ret.Error(1)
|
||||
}
|
||||
|
||||
return r0, r1
|
||||
}
|
||||
|
||||
// SaveWithModel provides a mock function with given fields: acknowledgement
|
||||
func (_m *PostAcknowledgementStore) SaveWithModel(acknowledgement *model.PostAcknowledgement) (*model.PostAcknowledgement, error) {
|
||||
ret := _m.Called(acknowledgement)
|
||||
|
||||
if len(ret) == 0 {
|
||||
panic("no return value specified for SaveWithModel")
|
||||
}
|
||||
|
||||
var r0 *model.PostAcknowledgement
|
||||
var r1 error
|
||||
if rf, ok := ret.Get(0).(func(*model.PostAcknowledgement) (*model.PostAcknowledgement, error)); ok {
|
||||
return rf(acknowledgement)
|
||||
}
|
||||
if rf, ok := ret.Get(0).(func(*model.PostAcknowledgement) *model.PostAcknowledgement); ok {
|
||||
r0 = rf(acknowledgement)
|
||||
} else {
|
||||
if ret.Get(0) != nil {
|
||||
r0 = ret.Get(0).(*model.PostAcknowledgement)
|
||||
}
|
||||
}
|
||||
|
||||
if rf, ok := ret.Get(1).(func(*model.PostAcknowledgement) error); ok {
|
||||
r1 = rf(acknowledgement)
|
||||
} else {
|
||||
r1 = ret.Error(1)
|
||||
}
|
||||
|
||||
@@ -14,6 +14,24 @@ type PostPriorityStore struct {
|
||||
mock.Mock
|
||||
}
|
||||
|
||||
// Delete provides a mock function with given fields: postID
|
||||
func (_m *PostPriorityStore) Delete(postID string) error {
|
||||
ret := _m.Called(postID)
|
||||
|
||||
if len(ret) == 0 {
|
||||
panic("no return value specified for Delete")
|
||||
}
|
||||
|
||||
var r0 error
|
||||
if rf, ok := ret.Get(0).(func(string) error); ok {
|
||||
r0 = rf(postID)
|
||||
} else {
|
||||
r0 = ret.Error(0)
|
||||
}
|
||||
|
||||
return r0
|
||||
}
|
||||
|
||||
// GetForPost provides a mock function with given fields: postID
|
||||
func (_m *PostPriorityStore) GetForPost(postID string) (*model.PostPriority, error) {
|
||||
ret := _m.Called(postID)
|
||||
@@ -74,6 +92,36 @@ func (_m *PostPriorityStore) GetForPosts(ids []string) ([]*model.PostPriority, e
|
||||
return r0, r1
|
||||
}
|
||||
|
||||
// Save provides a mock function with given fields: priority
|
||||
func (_m *PostPriorityStore) Save(priority *model.PostPriority) (*model.PostPriority, error) {
|
||||
ret := _m.Called(priority)
|
||||
|
||||
if len(ret) == 0 {
|
||||
panic("no return value specified for Save")
|
||||
}
|
||||
|
||||
var r0 *model.PostPriority
|
||||
var r1 error
|
||||
if rf, ok := ret.Get(0).(func(*model.PostPriority) (*model.PostPriority, error)); ok {
|
||||
return rf(priority)
|
||||
}
|
||||
if rf, ok := ret.Get(0).(func(*model.PostPriority) *model.PostPriority); ok {
|
||||
r0 = rf(priority)
|
||||
} else {
|
||||
if ret.Get(0) != nil {
|
||||
r0 = ret.Get(0).(*model.PostPriority)
|
||||
}
|
||||
}
|
||||
|
||||
if rf, ok := ret.Get(1).(func(*model.PostPriority) error); ok {
|
||||
r1 = rf(priority)
|
||||
} else {
|
||||
r1 = ret.Error(1)
|
||||
}
|
||||
|
||||
return r0, r1
|
||||
}
|
||||
|
||||
// NewPostPriorityStore creates a new instance of PostPriorityStore. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
|
||||
// The first argument is typically a *testing.T value.
|
||||
func NewPostPriorityStore(t interface {
|
||||
|
||||
@@ -17,6 +17,8 @@ func TestPostAcknowledgementsStore(t *testing.T, rctx request.CTX, ss store.Stor
|
||||
t.Run("Save", func(t *testing.T) { testPostAcknowledgementsStoreSave(t, rctx, ss) })
|
||||
t.Run("GetForPost", func(t *testing.T) { testPostAcknowledgementsStoreGetForPost(t, rctx, ss) })
|
||||
t.Run("GetForPosts", func(t *testing.T) { testPostAcknowledgementsStoreGetForPosts(t, rctx, ss) })
|
||||
t.Run("BatchSave", func(t *testing.T) { testPostAcknowledgementsStoreBatchSave(t, rctx, ss) })
|
||||
t.Run("BatchDelete", func(t *testing.T) { testPostAcknowledgementsStoreBatchDelete(t, rctx, ss) })
|
||||
}
|
||||
|
||||
func testPostAcknowledgementsStoreSave(t *testing.T, rctx request.CTX, ss store.Store) {
|
||||
@@ -37,13 +39,16 @@ func testPostAcknowledgementsStoreSave(t *testing.T, rctx request.CTX, ss store.
|
||||
require.NoError(t, err)
|
||||
|
||||
t.Run("consecutive saves should just update the acknowledged at", func(t *testing.T) {
|
||||
_, err := ss.PostAcknowledgement().Save(post.Id, userID1, 0)
|
||||
ack := &model.PostAcknowledgement{PostId: post.Id, UserId: userID1, AcknowledgedAt: 0, ChannelId: post.ChannelId}
|
||||
_, err := ss.PostAcknowledgement().SaveWithModel(ack)
|
||||
require.NoError(t, err)
|
||||
|
||||
_, err = ss.PostAcknowledgement().Save(post.Id, userID1, 0)
|
||||
ack = &model.PostAcknowledgement{PostId: post.Id, UserId: userID1, AcknowledgedAt: 0, ChannelId: post.ChannelId}
|
||||
_, err = ss.PostAcknowledgement().SaveWithModel(ack)
|
||||
require.NoError(t, err)
|
||||
|
||||
ack1, err := ss.PostAcknowledgement().Save(post.Id, userID1, 0)
|
||||
ack1 := &model.PostAcknowledgement{PostId: post.Id, UserId: userID1, AcknowledgedAt: 0, ChannelId: post.ChannelId}
|
||||
ack1, err = ss.PostAcknowledgement().SaveWithModel(ack1)
|
||||
require.NoError(t, err)
|
||||
|
||||
acknowledgements, err := ss.PostAcknowledgement().GetForPost(post.Id)
|
||||
@@ -53,7 +58,8 @@ func testPostAcknowledgementsStoreSave(t *testing.T, rctx request.CTX, ss store.
|
||||
|
||||
t.Run("saving should update the update at of the post", func(t *testing.T) {
|
||||
oldUpdateAt := post.UpdateAt
|
||||
_, err := ss.PostAcknowledgement().Save(post.Id, userID1, 0)
|
||||
ack := &model.PostAcknowledgement{PostId: post.Id, UserId: userID1, AcknowledgedAt: 0, ChannelId: post.ChannelId}
|
||||
_, err := ss.PostAcknowledgement().SaveWithModel(ack)
|
||||
require.NoError(t, err)
|
||||
|
||||
post, err = ss.Post().GetSingle(rctx, post.Id, false)
|
||||
@@ -82,11 +88,14 @@ func testPostAcknowledgementsStoreGetForPost(t *testing.T, rctx request.CTX, ss
|
||||
require.NoError(t, err)
|
||||
|
||||
t.Run("get acknowledgements for post", func(t *testing.T) {
|
||||
ack1, err := ss.PostAcknowledgement().Save(p1.Id, userID1, 0)
|
||||
ack1 := &model.PostAcknowledgement{PostId: p1.Id, UserId: userID1, AcknowledgedAt: 0, ChannelId: p1.ChannelId}
|
||||
ack1, err := ss.PostAcknowledgement().SaveWithModel(ack1)
|
||||
require.NoError(t, err)
|
||||
ack2, err := ss.PostAcknowledgement().Save(p1.Id, userID2, 0)
|
||||
ack2 := &model.PostAcknowledgement{PostId: p1.Id, UserId: userID2, AcknowledgedAt: 0, ChannelId: p1.ChannelId}
|
||||
ack2, err = ss.PostAcknowledgement().SaveWithModel(ack2)
|
||||
require.NoError(t, err)
|
||||
ack3, err := ss.PostAcknowledgement().Save(p1.Id, userID3, 0)
|
||||
ack3 := &model.PostAcknowledgement{PostId: p1.Id, UserId: userID3, AcknowledgedAt: 0, ChannelId: p1.ChannelId}
|
||||
ack3, err = ss.PostAcknowledgement().SaveWithModel(ack3)
|
||||
require.NoError(t, err)
|
||||
|
||||
acknowledgements, err := ss.PostAcknowledgement().GetForPost(p1.Id)
|
||||
@@ -145,13 +154,17 @@ func testPostAcknowledgementsStoreGetForPosts(t *testing.T, rctx request.CTX, ss
|
||||
require.Equal(t, -1, errIdx)
|
||||
|
||||
t.Run("get acknowledgements for post", func(t *testing.T) {
|
||||
ack1, err := ss.PostAcknowledgement().Save(p1.Id, userID1, 0)
|
||||
ack1 := &model.PostAcknowledgement{PostId: p1.Id, UserId: userID1, AcknowledgedAt: 0, ChannelId: p1.ChannelId}
|
||||
ack1, err := ss.PostAcknowledgement().SaveWithModel(ack1)
|
||||
require.NoError(t, err)
|
||||
ack2, err := ss.PostAcknowledgement().Save(p1.Id, userID2, 0)
|
||||
ack2 := &model.PostAcknowledgement{PostId: p1.Id, UserId: userID2, AcknowledgedAt: 0, ChannelId: p1.ChannelId}
|
||||
ack2, err = ss.PostAcknowledgement().SaveWithModel(ack2)
|
||||
require.NoError(t, err)
|
||||
ack3, err := ss.PostAcknowledgement().Save(p2.Id, userID2, 0)
|
||||
ack3 := &model.PostAcknowledgement{PostId: p2.Id, UserId: userID2, AcknowledgedAt: 0, ChannelId: p2.ChannelId}
|
||||
ack3, err = ss.PostAcknowledgement().SaveWithModel(ack3)
|
||||
require.NoError(t, err)
|
||||
ack4, err := ss.PostAcknowledgement().Save(p2.Id, userID3, 0)
|
||||
ack4 := &model.PostAcknowledgement{PostId: p2.Id, UserId: userID3, AcknowledgedAt: 0, ChannelId: p2.ChannelId}
|
||||
ack4, err = ss.PostAcknowledgement().SaveWithModel(ack4)
|
||||
require.NoError(t, err)
|
||||
|
||||
acknowledgements, err := ss.PostAcknowledgement().GetForPosts([]string{p1.Id})
|
||||
@@ -191,3 +204,218 @@ func testPostAcknowledgementsStoreGetForPosts(t *testing.T, rctx request.CTX, ss
|
||||
require.Empty(t, acknowledgements)
|
||||
})
|
||||
}
|
||||
|
||||
func testPostAcknowledgementsStoreBatchSave(t *testing.T, rctx request.CTX, ss store.Store) {
|
||||
userID1 := model.NewId()
|
||||
userID2 := model.NewId()
|
||||
userID3 := model.NewId()
|
||||
|
||||
p1 := model.Post{}
|
||||
p1.ChannelId = model.NewId()
|
||||
p1.UserId = model.NewId()
|
||||
p1.Message = NewTestID()
|
||||
post, err := ss.Post().Save(rctx, &p1)
|
||||
require.NoError(t, err)
|
||||
|
||||
t.Run("batch save acknowledgements for a post", func(t *testing.T) {
|
||||
// Create a batch of acknowledgements
|
||||
acks := []*model.PostAcknowledgement{
|
||||
{
|
||||
PostId: post.Id,
|
||||
UserId: userID1,
|
||||
AcknowledgedAt: model.GetMillis(),
|
||||
},
|
||||
{
|
||||
PostId: post.Id,
|
||||
UserId: userID2,
|
||||
AcknowledgedAt: model.GetMillis(),
|
||||
},
|
||||
{
|
||||
PostId: post.Id,
|
||||
UserId: userID3,
|
||||
AcknowledgedAt: model.GetMillis(),
|
||||
},
|
||||
}
|
||||
|
||||
// Save the batch
|
||||
savedAcks, err := ss.PostAcknowledgement().BatchSave(acks)
|
||||
require.NoError(t, err)
|
||||
require.Len(t, savedAcks, 3)
|
||||
|
||||
// Verify all were saved correctly
|
||||
retrievedAcks, err := ss.PostAcknowledgement().GetForPost(post.Id)
|
||||
require.NoError(t, err)
|
||||
require.Len(t, retrievedAcks, 3)
|
||||
|
||||
// Verify all users are in the saved acknowledgements
|
||||
userIDMap := make(map[string]bool)
|
||||
for _, ack := range retrievedAcks {
|
||||
userIDMap[ack.UserId] = true
|
||||
require.Equal(t, post.Id, ack.PostId)
|
||||
require.Greater(t, ack.AcknowledgedAt, int64(0))
|
||||
}
|
||||
|
||||
require.True(t, userIDMap[userID1])
|
||||
require.True(t, userIDMap[userID2])
|
||||
require.True(t, userIDMap[userID3])
|
||||
})
|
||||
|
||||
t.Run("batch save empty list of acknowledgements", func(t *testing.T) {
|
||||
// Create an empty batch of acknowledgements
|
||||
acks := []*model.PostAcknowledgement{}
|
||||
|
||||
// Save the empty batch
|
||||
savedAcks, err := ss.PostAcknowledgement().BatchSave(acks)
|
||||
require.NoError(t, err)
|
||||
require.Empty(t, savedAcks)
|
||||
})
|
||||
|
||||
t.Run("batch save should update existing acknowledgements", func(t *testing.T) {
|
||||
// First, delete all existing acknowledgements
|
||||
acks, err := ss.PostAcknowledgement().GetForPost(post.Id)
|
||||
require.NoError(t, err)
|
||||
|
||||
for _, ack := range acks {
|
||||
err = ss.PostAcknowledgement().Delete(ack)
|
||||
require.NoError(t, err)
|
||||
}
|
||||
|
||||
// Create initial acknowledgement
|
||||
ack := &model.PostAcknowledgement{PostId: post.Id, UserId: userID1, AcknowledgedAt: model.GetMillis(), ChannelId: post.ChannelId}
|
||||
ack, err = ss.PostAcknowledgement().SaveWithModel(ack)
|
||||
require.NoError(t, err)
|
||||
|
||||
initialAckTime := ack.AcknowledgedAt
|
||||
|
||||
// Create a batch with updated timestamp
|
||||
newTimestamp := model.GetMillis() + 1000
|
||||
updatedAcks := []*model.PostAcknowledgement{
|
||||
{
|
||||
PostId: post.Id,
|
||||
UserId: userID1,
|
||||
AcknowledgedAt: newTimestamp,
|
||||
},
|
||||
}
|
||||
|
||||
// Batch save should update the existing acknowledgement
|
||||
savedAcks, err := ss.PostAcknowledgement().BatchSave(updatedAcks)
|
||||
require.NoError(t, err)
|
||||
require.Len(t, savedAcks, 1)
|
||||
require.Equal(t, newTimestamp, savedAcks[0].AcknowledgedAt)
|
||||
require.Greater(t, savedAcks[0].AcknowledgedAt, initialAckTime)
|
||||
|
||||
// Verify the acknowledgement was updated
|
||||
retrievedAcks, err := ss.PostAcknowledgement().GetForPost(post.Id)
|
||||
require.NoError(t, err)
|
||||
require.Len(t, retrievedAcks, 1)
|
||||
require.Equal(t, newTimestamp, retrievedAcks[0].AcknowledgedAt)
|
||||
})
|
||||
|
||||
t.Run("batch save should update post's update_at", func(t *testing.T) {
|
||||
// First, check the current post update timestamp
|
||||
currentPost, err := ss.Post().GetSingle(rctx, post.Id, false)
|
||||
require.NoError(t, err)
|
||||
oldUpdateAt := currentPost.UpdateAt
|
||||
|
||||
// Create a batch of new acknowledgements
|
||||
acks := []*model.PostAcknowledgement{
|
||||
{
|
||||
PostId: post.Id,
|
||||
UserId: model.NewId(),
|
||||
AcknowledgedAt: model.GetMillis(),
|
||||
},
|
||||
}
|
||||
|
||||
// Save the batch
|
||||
_, err = ss.PostAcknowledgement().BatchSave(acks)
|
||||
require.NoError(t, err)
|
||||
|
||||
// Verify post's update_at was updated
|
||||
updatedPost, err := ss.Post().GetSingle(rctx, post.Id, false)
|
||||
require.NoError(t, err)
|
||||
require.Greater(t, updatedPost.UpdateAt, oldUpdateAt)
|
||||
})
|
||||
}
|
||||
|
||||
func testPostAcknowledgementsStoreBatchDelete(t *testing.T, rctx request.CTX, ss store.Store) {
|
||||
userID1 := model.NewId()
|
||||
userID2 := model.NewId()
|
||||
userID3 := model.NewId()
|
||||
|
||||
p1 := model.Post{}
|
||||
p1.ChannelId = model.NewId()
|
||||
p1.UserId = model.NewId()
|
||||
p1.Message = NewTestID()
|
||||
post, err := ss.Post().Save(rctx, &p1)
|
||||
require.NoError(t, err)
|
||||
|
||||
t.Run("batch delete all acknowledgements for a post", func(t *testing.T) {
|
||||
// Create multiple acknowledgements
|
||||
ack1 := &model.PostAcknowledgement{PostId: post.Id, UserId: userID1, AcknowledgedAt: 0, ChannelId: post.ChannelId}
|
||||
ack1, err = ss.PostAcknowledgement().SaveWithModel(ack1)
|
||||
require.NoError(t, err)
|
||||
ack2 := &model.PostAcknowledgement{PostId: post.Id, UserId: userID2, AcknowledgedAt: 0, ChannelId: post.ChannelId}
|
||||
ack2, err = ss.PostAcknowledgement().SaveWithModel(ack2)
|
||||
require.NoError(t, err)
|
||||
ack3 := &model.PostAcknowledgement{PostId: post.Id, UserId: userID3, AcknowledgedAt: 0, ChannelId: post.ChannelId}
|
||||
ack3, err = ss.PostAcknowledgement().SaveWithModel(ack3)
|
||||
require.NoError(t, err)
|
||||
|
||||
// Verify acknowledgements were created
|
||||
acks, pErr := ss.PostAcknowledgement().GetForPost(post.Id)
|
||||
require.NoError(t, pErr)
|
||||
require.Len(t, acks, 3)
|
||||
|
||||
// Delete all acknowledgements in batch
|
||||
err = ss.PostAcknowledgement().BatchDelete([]*model.PostAcknowledgement{ack1, ack2, ack3})
|
||||
require.NoError(t, err)
|
||||
|
||||
// Verify all acknowledgements were deleted
|
||||
acks, err = ss.PostAcknowledgement().GetForPost(post.Id)
|
||||
require.NoError(t, err)
|
||||
require.Empty(t, acks)
|
||||
})
|
||||
|
||||
t.Run("batch delete should update post's update_at", func(t *testing.T) {
|
||||
// Create acknowledgements
|
||||
ack1 := &model.PostAcknowledgement{PostId: post.Id, UserId: userID1, AcknowledgedAt: 0, ChannelId: post.ChannelId}
|
||||
ack1, err = ss.PostAcknowledgement().SaveWithModel(ack1)
|
||||
require.NoError(t, err)
|
||||
ack2 := &model.PostAcknowledgement{PostId: post.Id, UserId: userID2, AcknowledgedAt: 0, ChannelId: post.ChannelId}
|
||||
ack2, err = ss.PostAcknowledgement().SaveWithModel(ack2)
|
||||
require.NoError(t, err)
|
||||
|
||||
// Get current post update timestamp
|
||||
currentPost, err := ss.Post().GetSingle(rctx, post.Id, false)
|
||||
require.NoError(t, err)
|
||||
oldUpdateAt := currentPost.UpdateAt
|
||||
|
||||
// Delete acknowledgements in batch
|
||||
err = ss.PostAcknowledgement().BatchDelete([]*model.PostAcknowledgement{ack1, ack2})
|
||||
require.NoError(t, err)
|
||||
|
||||
// Verify post's update_at was updated
|
||||
updatedPost, err := ss.Post().GetSingle(rctx, post.Id, false)
|
||||
require.NoError(t, err)
|
||||
require.Greater(t, updatedPost.UpdateAt, oldUpdateAt)
|
||||
})
|
||||
|
||||
t.Run("batch delete with empty list should not error", func(t *testing.T) {
|
||||
// Delete with empty list should not error
|
||||
err := ss.PostAcknowledgement().BatchDelete([]*model.PostAcknowledgement{})
|
||||
require.NoError(t, err)
|
||||
})
|
||||
|
||||
t.Run("batch delete with non-existent acknowledgements should not error", func(t *testing.T) {
|
||||
// Create non-existent acknowledgements
|
||||
nonExistentAck := &model.PostAcknowledgement{
|
||||
PostId: model.NewId(),
|
||||
UserId: model.NewId(),
|
||||
AcknowledgedAt: model.GetMillis(),
|
||||
}
|
||||
|
||||
// Delete non-existent acknowledgement should not error
|
||||
err := ss.PostAcknowledgement().BatchDelete([]*model.PostAcknowledgement{nonExistentAck})
|
||||
require.NoError(t, err)
|
||||
})
|
||||
}
|
||||
|
||||
Ссылка в новой задаче
Block a user