1
0
Fork 0
mirror of https://github.com/anyproto/anytype-heart.git synced 2025-06-09 09:35:00 +09:00

GO-4727: Fix tests

This commit is contained in:
Sergey 2025-03-07 13:11:23 +01:00
parent 923d5e9b7b
commit 3bf0d4ae96
No known key found for this signature in database
GPG key ID: 3B6BEF79160221C6
5 changed files with 72 additions and 46 deletions

View file

@ -18,7 +18,7 @@ type Service interface {
EditMessage(ctx context.Context, chatObjectId string, messageId string, newMessage *model.ChatMessage) error
ToggleMessageReaction(ctx context.Context, chatObjectId string, messageId string, emoji string) error
DeleteMessage(ctx context.Context, chatObjectId string, messageId string) error
GetMessages(ctx context.Context, chatObjectId string, req chatobject.GetMessagesRequest) ([]*model.ChatMessage, *model.ChatState, error)
GetMessages(ctx context.Context, chatObjectId string, req chatobject.GetMessagesRequest) (*chatobject.GetMessagesResponse, error)
GetMessagesByIds(ctx context.Context, chatObjectId string, messageIds []string) ([]*model.ChatMessage, error)
SubscribeLastMessages(ctx context.Context, chatObjectId string, limit int) ([]*model.ChatMessage, int, *model.ChatState, error)
ReadMessages(ctx context.Context, chatObjectId string, afterOrderId, beforeOrderId string, lastDbState int64) error
@ -75,21 +75,17 @@ func (s *service) DeleteMessage(ctx context.Context, chatObjectId string, messag
})
}
func (s *service) GetMessages(ctx context.Context, chatObjectId string, req chatobject.GetMessagesRequest) ([]*model.ChatMessage, *model.ChatState, error) {
var (
msgs []*model.ChatMessage
chatState *model.ChatState
err error
)
err = cache.Do(s.objectGetter, chatObjectId, func(sb chatobject.StoreObject) error {
msgs, chatState, err = sb.GetMessages(ctx, req)
func (s *service) GetMessages(ctx context.Context, chatObjectId string, req chatobject.GetMessagesRequest) (*chatobject.GetMessagesResponse, error) {
var resp *chatobject.GetMessagesResponse
err := cache.Do(s.objectGetter, chatObjectId, func(sb chatobject.StoreObject) error {
var err error
resp, err = sb.GetMessages(ctx, req)
if err != nil {
return err
}
return nil
})
return msgs, chatState, err
return resp, err
}
func (s *service) GetMessagesByIds(ctx context.Context, chatObjectId string, messageIds []string) ([]*model.ChatMessage, error) {

View file

@ -39,7 +39,7 @@ type StoreObject interface {
anystoredebug.AnystoreDebug
AddMessage(ctx context.Context, sessionCtx session.Context, message *model.ChatMessage) (string, error)
GetMessages(ctx context.Context, req GetMessagesRequest) ([]*model.ChatMessage, *model.ChatState, error)
GetMessages(ctx context.Context, req GetMessagesRequest) (*GetMessagesResponse, error)
GetMessagesByIds(ctx context.Context, messageIds []string) ([]*model.ChatMessage, error)
EditMessage(ctx context.Context, messageId string, newMessage *model.ChatMessage) error
ToggleMessageReaction(ctx context.Context, messageId string, emoji string) error
@ -334,10 +334,15 @@ func (s *storeObject) GetMessagesByIds(ctx context.Context, messageIds []string)
return messages, txn.Commit()
}
func (s *storeObject) GetMessages(ctx context.Context, req GetMessagesRequest) ([]*model.ChatMessage, *model.ChatState, error) {
type GetMessagesResponse struct {
Messages []*model.ChatMessage
ChatState *model.ChatState
}
func (s *storeObject) GetMessages(ctx context.Context, req GetMessagesRequest) (*GetMessagesResponse, error) {
coll, err := s.store.Collection(ctx, collectionName)
if err != nil {
return nil, nil, fmt.Errorf("get collection: %w", err)
return nil, fmt.Errorf("get collection: %w", err)
}
var qry anystore.Query
if req.AfterOrderId != "" {
@ -352,13 +357,16 @@ func (s *storeObject) GetMessages(ctx context.Context, req GetMessagesRequest) (
// todo here is possible race if new messages are added between the flush and the query
msgs, err := s.queryMessages(ctx, qry)
if err != nil {
return nil, nil, fmt.Errorf("query messages: %w", err)
return nil, fmt.Errorf("query messages: %w", err)
}
sort.Slice(msgs, func(i, j int) bool {
return msgs[i].OrderId < msgs[j].OrderId
})
return msgs, chatState, nil
return &GetMessagesResponse{
Messages: msgs,
ChatState: chatState,
}, nil
}
func (s *storeObject) queryMessages(ctx context.Context, query anystore.Query) ([]*model.ChatMessage, error) {

View file

@ -75,6 +75,7 @@ func newFixture(t *testing.T) *fixture {
source := mock_source.NewMockStore(t)
source.EXPECT().ReadStoreDoc(ctx, mock.Anything, mock.Anything).Return(nil)
source.EXPECT().PushStoreChange(mock.Anything, mock.Anything).RunAndReturn(fx.applyToStore).Maybe()
source.EXPECT().SetDiffManagerOnRemoveHook(mock.Anything).Return().Maybe()
fx.source = source
err = object.Init(&smartblock.InitContext{
@ -99,17 +100,17 @@ func TestAddMessage(t *testing.T) {
assert.NotEmpty(t, messageId)
assert.NotEmpty(t, sessionCtx.GetMessages())
messages, err := fx.GetMessages(ctx, GetMessagesRequest{})
messagesResp, err := fx.GetMessages(ctx, GetMessagesRequest{})
require.NoError(t, err)
require.Len(t, messages, 1)
require.Len(t, messagesResp.Messages, 1)
want := givenMessage()
want.Id = messageId
want.Creator = testCreator
want.Read = true
got := messages[0]
got := messagesResp.Messages[0]
assertMessagesEqual(t, want, got)
}
@ -125,29 +126,29 @@ func TestGetMessages(t *testing.T) {
assert.NotEmpty(t, messageId)
}
messages, err := fx.GetMessages(ctx, GetMessagesRequest{Limit: 5})
messagesResp, err := fx.GetMessages(ctx, GetMessagesRequest{Limit: 5})
require.NoError(t, err)
wantTexts := []string{"text 6", "text 7", "text 8", "text 9", "text 10"}
for i, msg := range messages {
for i, msg := range messagesResp.Messages {
assert.Equal(t, wantTexts[i], msg.Message.Text)
}
t.Run("with requested BeforeOrderId", func(t *testing.T) {
lastOrderId := messages[0].OrderId // text 6
lastOrderId := messagesResp.Messages[0].OrderId // text 6
gotMessages, err := fx.GetMessages(ctx, GetMessagesRequest{BeforeOrderId: lastOrderId, Limit: 5})
require.NoError(t, err)
wantTexts = []string{"text 1", "text 2", "text 3", "text 4", "text 5"}
for i, msg := range gotMessages {
for i, msg := range gotMessages.Messages {
assert.Equal(t, wantTexts[i], msg.Message.Text)
}
})
t.Run("with requested AfterOrderId", func(t *testing.T) {
lastOrderId := messages[0].OrderId // text 6
lastOrderId := messagesResp.Messages[0].OrderId // text 6
gotMessages, err := fx.GetMessages(ctx, GetMessagesRequest{AfterOrderId: lastOrderId, Limit: 2})
require.NoError(t, err)
wantTexts = []string{"text 7", "text 8"}
for i, msg := range gotMessages {
for i, msg := range gotMessages.Messages {
assert.Equal(t, wantTexts[i], msg.Message.Text)
}
})
@ -194,15 +195,15 @@ func TestEditMessage(t *testing.T) {
err = fx.EditMessage(ctx, messageId, editedMessage)
require.NoError(t, err)
messages, err := fx.GetMessages(ctx, GetMessagesRequest{})
messagesResp, err := fx.GetMessages(ctx, GetMessagesRequest{})
require.NoError(t, err)
require.Len(t, messages, 1)
require.Len(t, messagesResp.Messages, 1)
want := editedMessage
want.Id = messageId
want.Creator = testCreator
got := messages[0]
got := messagesResp.Messages[0]
assert.True(t, got.ModifiedAt > 0)
got.ModifiedAt = 0
assertMessagesEqual(t, want, got)
@ -229,15 +230,15 @@ func TestEditMessage(t *testing.T) {
require.Error(t, err)
// Check that nothing is changed
messages, err := fx.GetMessages(ctx, GetMessagesRequest{})
messagesResp, err := fx.GetMessages(ctx, GetMessagesRequest{})
require.NoError(t, err)
require.Len(t, messages, 1)
require.Len(t, messagesResp.Messages, 1)
want := inputMessage
want.Id = messageId
want.Creator = testCreator
got := messages[0]
got := messagesResp.Messages[0]
assertMessagesEqual(t, want, got)
})
@ -285,11 +286,11 @@ func TestToggleReaction(t *testing.T) {
require.NoError(t, err)
})
messages, err := fx.GetMessages(ctx, GetMessagesRequest{})
messagesResp, err := fx.GetMessages(ctx, GetMessagesRequest{})
require.NoError(t, err)
require.Len(t, messages, 1)
require.Len(t, messagesResp.Messages, 1)
got := messages[0].Reactions
got := messagesResp.Messages[0].Reactions
want := &model.ChatMessageReactions{
Reactions: map[string]*model.ChatMessageReactionsIdentityList{
@ -334,6 +335,7 @@ func givenMessage() *model.ChatMessage {
Id: "",
OrderId: "",
Creator: "",
Read: true,
ReplyToMessageId: "replyToMessageId1",
Message: &model.ChatMessageMessageContent{
Text: "text!",
@ -386,5 +388,9 @@ func assertMessagesEqual(t *testing.T, want, got *model.ChatMessage) {
// Cleanup timestamp
assert.NotZero(t, got.CreatedAt)
got.CreatedAt = 0
assert.NotZero(t, got.AddedAt)
got.AddedAt = 0
assert.Equal(t, want, got)
}

View file

@ -21,7 +21,7 @@ func TestSubscription(t *testing.T) {
assert.NotEmpty(t, messageId)
}
messages, _, err := fx.SubscribeLastMessages(ctx, 5)
messages, _, _, err := fx.SubscribeLastMessages(ctx, 5)
require.NoError(t, err)
wantTexts := []string{"text 6", "text 7", "text 8", "text 9", "text 10"}
for i, msg := range messages {
@ -29,37 +29,47 @@ func TestSubscription(t *testing.T) {
}
t.Run("add message", func(t *testing.T) {
fx.events = nil
messageId, err := fx.AddMessage(ctx, nil, givenMessage())
require.NoError(t, err)
require.Len(t, fx.events, 1)
require.Len(t, fx.events, 2)
ev := fx.events[0].GetChatAdd()
require.NotNil(t, ev)
assert.Equal(t, messageId, ev.Id)
fx.events = nil
evState := fx.events[1].GetChatStateUpdate()
require.NotNil(t, evState)
assert.NotZero(t, evState.State.DbTimestamp)
})
t.Run("edit message", func(t *testing.T) {
fx.events = nil
edited := givenMessage()
edited.Message.Text = "edited text"
err = fx.EditMessage(ctx, messages[0].Id, edited)
require.NoError(t, err)
require.Len(t, fx.events, 1)
require.Len(t, fx.events, 2)
ev := fx.events[0].GetChatUpdate()
require.NotNil(t, ev)
assert.Equal(t, messages[0].Id, ev.Id)
assert.Equal(t, edited.Message.Text, ev.Message.Message.Text)
fx.events = nil
evState := fx.events[1].GetChatStateUpdate()
require.NotNil(t, evState)
assert.NotZero(t, evState.State.DbTimestamp)
})
t.Run("toggle message reaction", func(t *testing.T) {
fx.events = nil
err = fx.ToggleMessageReaction(ctx, messages[0].Id, "👍")
require.NoError(t, err)
require.Len(t, fx.events, 1)
require.Len(t, fx.events, 2)
ev := fx.events[0].GetChatUpdateReactions()
require.NotNil(t, ev)
@ -67,18 +77,24 @@ func TestSubscription(t *testing.T) {
_, ok := ev.Reactions.Reactions["👍"]
assert.True(t, ok)
fx.events = nil
evState := fx.events[1].GetChatStateUpdate()
require.NotNil(t, evState)
assert.NotZero(t, evState.State.DbTimestamp)
})
t.Run("delete message", func(t *testing.T) {
fx.events = nil
err = fx.DeleteMessage(ctx, messages[0].Id)
require.NoError(t, err)
require.Len(t, fx.events, 1)
require.Len(t, fx.events, 2)
ev := fx.events[0].GetChatDelete()
require.NotNil(t, ev)
assert.Equal(t, messages[0].Id, ev.Id)
fx.events = nil
evState := fx.events[1].GetChatStateUpdate()
require.NotNil(t, evState)
assert.NotZero(t, evState.State.DbTimestamp)
})
}

View file

@ -68,15 +68,15 @@ func (mw *Middleware) ChatDeleteMessage(cctx context.Context, req *pb.RpcChatDel
func (mw *Middleware) ChatGetMessages(cctx context.Context, req *pb.RpcChatGetMessagesRequest) *pb.RpcChatGetMessagesResponse {
chatService := mustService[chats.Service](mw)
messages, chatState, err := chatService.GetMessages(cctx, req.ChatObjectId, chatobject.GetMessagesRequest{
resp, err := chatService.GetMessages(cctx, req.ChatObjectId, chatobject.GetMessagesRequest{
AfterOrderId: req.AfterOrderId,
BeforeOrderId: req.BeforeOrderId,
Limit: int(req.Limit),
})
code := mapErrorCode[pb.RpcChatGetMessagesResponseErrorCode](err)
return &pb.RpcChatGetMessagesResponse{
Messages: messages,
ChatState: chatState,
Messages: resp.Messages,
ChatState: resp.ChatState,
Error: &pb.RpcChatGetMessagesResponseError{
Code: code,
Description: getErrorDescription(err),