bf9395e022
CI / license-header (push) Has been skipped
CI / e2e-dry-run (push) Has been skipped
CI / fast-gate (push) Failing after 0s
Test PR Label Logic / test-pr-labels (push) Failing after 1s
Skill Format Check / check-format (push) Failing after 2s
CI / security (push) Failing after 5s
CI / unit-test (push) Has been skipped
CI / lint (push) Has been skipped
CI / script-test (push) Has been skipped
CI / deterministic-gate (push) Has been skipped
CI / coverage (push) Has been skipped
CI / results (push) Has been cancelled
CI / deadcode (push) Has been cancelled
CI / e2e-live (push) Has been cancelled
93 lines
2.4 KiB
Go
93 lines
2.4 KiB
Go
// Copyright (c) 2026 Lark Technologies Pte. Ltd.
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
package mail
|
|
|
|
import (
|
|
"encoding/base64"
|
|
"encoding/json"
|
|
"fmt"
|
|
"reflect"
|
|
"strings"
|
|
"testing"
|
|
|
|
"github.com/larksuite/cli/internal/httpmock"
|
|
)
|
|
|
|
func TestMailMessagesExecuteChunksMoreThanTwentyIDs(t *testing.T) {
|
|
f, stdout, _, reg := mailShortcutTestFactory(t)
|
|
ids := make([]string, 21)
|
|
for i := range ids {
|
|
ids[i] = base64.URLEncoding.EncodeToString([]byte(fmt.Sprintf("biz-%03d", i)))
|
|
}
|
|
|
|
reg.Register(&httpmock.Stub{
|
|
Method: "POST",
|
|
URL: "/user_mailboxes/me/messages/batch_get",
|
|
BodyFilter: requestMessageIDsEqual(ids[:20]),
|
|
Body: batchGetMessagesResponse(ids[:20]),
|
|
})
|
|
reg.Register(&httpmock.Stub{
|
|
Method: "POST",
|
|
URL: "/user_mailboxes/me/messages/batch_get",
|
|
BodyFilter: requestMessageIDsEqual(ids[20:]),
|
|
Body: batchGetMessagesResponse(ids[20:]),
|
|
})
|
|
|
|
err := runMountedMailShortcut(t, MailMessages, []string{
|
|
"+messages", "--message-ids", strings.Join(ids, ","),
|
|
}, f, stdout)
|
|
if err != nil {
|
|
t.Fatalf("expected no error, got %v", err)
|
|
}
|
|
|
|
out := decodeShortcutEnvelopeData(t, stdout)
|
|
if got := int(out["total"].(float64)); got != len(ids) {
|
|
t.Fatalf("total = %d, want %d; stdout=%s", got, len(ids), stdout.String())
|
|
}
|
|
messages, ok := out["messages"].([]interface{})
|
|
if !ok {
|
|
t.Fatalf("messages has unexpected type %T", out["messages"])
|
|
}
|
|
if len(messages) != len(ids) {
|
|
t.Fatalf("messages length = %d, want %d", len(messages), len(ids))
|
|
}
|
|
for i, item := range messages {
|
|
msg, ok := item.(map[string]interface{})
|
|
if !ok {
|
|
t.Fatalf("messages[%d] has unexpected type %T", i, item)
|
|
}
|
|
if got := msg["message_id"]; got != ids[i] {
|
|
t.Fatalf("messages[%d].message_id = %v, want %s", i, got, ids[i])
|
|
}
|
|
}
|
|
}
|
|
|
|
func requestMessageIDsEqual(want []string) func([]byte) bool {
|
|
return func(body []byte) bool {
|
|
var payload struct {
|
|
MessageIDs []string `json:"message_ids"`
|
|
}
|
|
if err := json.Unmarshal(body, &payload); err != nil {
|
|
return false
|
|
}
|
|
return reflect.DeepEqual(payload.MessageIDs, want)
|
|
}
|
|
}
|
|
|
|
func batchGetMessagesResponse(ids []string) map[string]interface{} {
|
|
messages := make([]map[string]interface{}, 0, len(ids))
|
|
for _, id := range ids {
|
|
messages = append(messages, map[string]interface{}{
|
|
"message_id": id,
|
|
"subject": id,
|
|
})
|
|
}
|
|
return map[string]interface{}{
|
|
"code": 0,
|
|
"data": map[string]interface{}{
|
|
"messages": messages,
|
|
},
|
|
}
|
|
}
|