feat(telegram): mark business messages as read and add tests for handling
- Implement markBusinessMessageRead function to mark messages as read - Add tests for successful message read and failure scenarios
This commit is contained in:
parent
fd405ef860
commit
4aa6ffb043
2 changed files with 108 additions and 0 deletions
|
|
@ -787,9 +787,33 @@ func (c *TelegramChannel) handleBusinessMessage(ctx context.Context, message *te
|
||||||
if businessConnectionID == "" {
|
if businessConnectionID == "" {
|
||||||
return fmt.Errorf("business message missing business_connection_id")
|
return fmt.Errorf("business message missing business_connection_id")
|
||||||
}
|
}
|
||||||
|
c.markBusinessMessageRead(ctx, businessConnectionID, message.Chat.ID, message.MessageID)
|
||||||
return c.handleTelegramMessage(ctx, message, businessConnectionID)
|
return c.handleTelegramMessage(ctx, message, businessConnectionID)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *TelegramChannel) markBusinessMessageRead(
|
||||||
|
ctx context.Context,
|
||||||
|
businessConnectionID string,
|
||||||
|
chatID int64,
|
||||||
|
messageID int,
|
||||||
|
) {
|
||||||
|
if c == nil || c.bot == nil || strings.TrimSpace(businessConnectionID) == "" || chatID == 0 || messageID == 0 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if err := c.bot.ReadBusinessMessage(ctx, &telego.ReadBusinessMessageParams{
|
||||||
|
BusinessConnectionID: businessConnectionID,
|
||||||
|
ChatID: chatID,
|
||||||
|
MessageID: messageID,
|
||||||
|
}); err != nil {
|
||||||
|
logger.DebugCF("telegram", "Failed to mark business message as read", map[string]any{
|
||||||
|
"business_connection_id": businessConnectionID,
|
||||||
|
"chat_id": chatID,
|
||||||
|
"message_id": messageID,
|
||||||
|
"error": err.Error(),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (c *TelegramChannel) handleBusinessConnection(_ context.Context, connection telego.BusinessConnection) error {
|
func (c *TelegramChannel) handleBusinessConnection(_ context.Context, connection telego.BusinessConnection) error {
|
||||||
if !c.businessModeEnabled() {
|
if !c.businessModeEnabled() {
|
||||||
return nil
|
return nil
|
||||||
|
|
|
||||||
|
|
@ -150,6 +150,90 @@ func newTestChannelWithConstructor(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestHandleBusinessMessage_MarksMessageRead(t *testing.T) {
|
||||||
|
messageBus := bus.NewMessageBus()
|
||||||
|
caller := &stubCaller{
|
||||||
|
callFn: func(ctx context.Context, url string, data *ta.RequestData) (*ta.Response, error) {
|
||||||
|
if !strings.Contains(url, "readBusinessMessage") {
|
||||||
|
t.Fatalf("unexpected API call: %s", url)
|
||||||
|
}
|
||||||
|
b, err := json.Marshal(true)
|
||||||
|
require.NoError(t, err)
|
||||||
|
return &ta.Response{Ok: true, Result: b}, nil
|
||||||
|
},
|
||||||
|
}
|
||||||
|
ch := newTestChannel(t, caller)
|
||||||
|
ch.BaseChannel = channels.NewBaseChannel("telegram", nil, messageBus, nil)
|
||||||
|
ch.BaseChannel.SetOwner(ch)
|
||||||
|
ch.ctx = context.Background()
|
||||||
|
ch.tgCfg.BusinessMode = true
|
||||||
|
|
||||||
|
msg := &telego.Message{
|
||||||
|
Text: "hello from business",
|
||||||
|
MessageID: 17,
|
||||||
|
BusinessConnectionID: "biz-conn-1",
|
||||||
|
Chat: telego.Chat{
|
||||||
|
ID: 777,
|
||||||
|
Type: "private",
|
||||||
|
},
|
||||||
|
From: &telego.User{
|
||||||
|
ID: 42,
|
||||||
|
FirstName: "Alice",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
require.NoError(t, ch.handleBusinessMessage(context.Background(), msg))
|
||||||
|
require.Len(t, caller.calls, 1)
|
||||||
|
assert.Contains(t, caller.calls[0].URL, "readBusinessMessage")
|
||||||
|
|
||||||
|
var params struct {
|
||||||
|
BusinessConnectionID string `json:"business_connection_id"`
|
||||||
|
ChatID int64 `json:"chat_id"`
|
||||||
|
MessageID int `json:"message_id"`
|
||||||
|
}
|
||||||
|
require.NoError(t, json.Unmarshal(caller.calls[0].Data.BodyRaw, ¶ms))
|
||||||
|
assert.Equal(t, "biz-conn-1", params.BusinessConnectionID)
|
||||||
|
assert.Equal(t, int64(777), params.ChatID)
|
||||||
|
assert.Equal(t, 17, params.MessageID)
|
||||||
|
|
||||||
|
inbound := <-messageBus.InboundChan()
|
||||||
|
assert.Equal(t, "hello from business", inbound.Content)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestHandleBusinessMessage_ReadFailureStillForwardsMessage(t *testing.T) {
|
||||||
|
messageBus := bus.NewMessageBus()
|
||||||
|
caller := &stubCaller{
|
||||||
|
callFn: func(ctx context.Context, url string, data *ta.RequestData) (*ta.Response, error) {
|
||||||
|
return nil, errors.New("missing can_read_messages")
|
||||||
|
},
|
||||||
|
}
|
||||||
|
ch := newTestChannel(t, caller)
|
||||||
|
ch.BaseChannel = channels.NewBaseChannel("telegram", nil, messageBus, nil)
|
||||||
|
ch.BaseChannel.SetOwner(ch)
|
||||||
|
ch.ctx = context.Background()
|
||||||
|
ch.tgCfg.BusinessMode = true
|
||||||
|
|
||||||
|
msg := &telego.Message{
|
||||||
|
Text: "still forward me",
|
||||||
|
MessageID: 18,
|
||||||
|
BusinessConnectionID: "biz-conn-1",
|
||||||
|
Chat: telego.Chat{
|
||||||
|
ID: 777,
|
||||||
|
Type: "private",
|
||||||
|
},
|
||||||
|
From: &telego.User{
|
||||||
|
ID: 42,
|
||||||
|
FirstName: "Alice",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
require.NoError(t, ch.handleBusinessMessage(context.Background(), msg))
|
||||||
|
require.Len(t, caller.calls, 1)
|
||||||
|
|
||||||
|
inbound := <-messageBus.InboundChan()
|
||||||
|
assert.Equal(t, "still forward me", inbound.Content)
|
||||||
|
}
|
||||||
|
|
||||||
func TestSendMedia_ImageFallbacksToDocumentOnInvalidDimensions(t *testing.T) {
|
func TestSendMedia_ImageFallbacksToDocumentOnInvalidDimensions(t *testing.T) {
|
||||||
constructor := &multipartRecordingConstructor{}
|
constructor := &multipartRecordingConstructor{}
|
||||||
caller := &stubCaller{
|
caller := &stubCaller{
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue