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:
parent
923d5e9b7b
commit
3bf0d4ae96
5 changed files with 72 additions and 46 deletions
|
@ -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) {
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
})
|
||||
}
|
||||
|
|
|
@ -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),
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue