mirror of
https://github.com/larksuite/cli.git
synced 2026-09-14 18:42:53 +08:00
20ef0af8a7
* fix(event): preserve UTF-8 in truncated diagnostics * test(event): preserve preflight decode cause coverage
69 lines
3.0 KiB
Go
69 lines
3.0 KiB
Go
// Copyright (c) 2026 Lark Technologies Pte. Ltd.
|
||
// SPDX-License-Identifier: MIT
|
||
|
||
package event
|
||
|
||
import (
|
||
"errors"
|
||
"strings"
|
||
"testing"
|
||
"unicode/utf8"
|
||
)
|
||
|
||
const realisticPermError = `API GET /open-apis/application/v6/applications/cli_XXXXXXXXXXXXXXXX/app_versions?lang=zh_cn&page_size=2 returned 400: {"code":99991672,"msg":"Access denied. One of the following scopes is required: [application:application:self_manage, application:application.app_version:readonly].应用尚未开通所需的应用身份权限:[application:application:self_manage, application:application.app_version:readonly],点击链接申请并开通任一权限即可:https://open.feishu.cn/app/cli_XXXXXXXXXXXXXXXX/auth?q=application:application:self_manage,application:application.app_version:readonly&op_from=openapi&token_type=tenant","error":{"message":"Refer to the documentation...","log_id":"20260421101203E2A5F141245B6F43B3A6"}}`
|
||
|
||
func TestDescribeAppMetaErr_PermissionDeniedShort(t *testing.T) {
|
||
got := describeAppMetaErr(errors.New(realisticPermError))
|
||
if len(got) > 400 {
|
||
t.Errorf("summary too long (%d chars): %q", len(got), got)
|
||
}
|
||
if !strings.Contains(got, "scope") {
|
||
t.Errorf("summary should mention scope requirement, got: %q", got)
|
||
}
|
||
wantURL := "https://open.feishu.cn/app/cli_XXXXXXXXXXXXXXXX/auth?q=application:application:self_manage,application:application.app_version:readonly&op_from=openapi&token_type=tenant"
|
||
if !strings.Contains(got, wantURL) {
|
||
t.Errorf("summary missing grant URL\ngot: %q\nwant: %q", got, wantURL)
|
||
}
|
||
for _, noise := range []string{"log_id", `"error":`, "Refer to the documentation"} {
|
||
if strings.Contains(got, noise) {
|
||
t.Errorf("summary leaked noise %q: %q", noise, got)
|
||
}
|
||
}
|
||
}
|
||
|
||
func TestDescribeAppMetaErr_UnknownErrorTruncated(t *testing.T) {
|
||
long := strings.Repeat("x", 500)
|
||
got := describeAppMetaErr(errors.New(long))
|
||
if len(got) > 220 {
|
||
t.Errorf("unknown error not truncated, len=%d", len(got))
|
||
}
|
||
}
|
||
|
||
func TestDescribeAppMetaErr_TruncationPreservesUTF8(t *testing.T) {
|
||
got := describeAppMetaErr(errors.New(strings.Repeat("x", 199) + "界tail"))
|
||
if !utf8.ValidString(got) {
|
||
t.Fatalf("truncated summary is not valid UTF-8: %q", got)
|
||
}
|
||
if !strings.HasSuffix(got, "…") {
|
||
t.Fatalf("truncated summary suffix = %q, want ellipsis", got)
|
||
}
|
||
if prefix := strings.TrimSuffix(got, "…"); len(prefix) > 200 {
|
||
t.Fatalf("truncated prefix is %d bytes, want at most 200", len(prefix))
|
||
}
|
||
}
|
||
|
||
func TestDescribeAppMetaErr_ShortErrorPassesThrough(t *testing.T) {
|
||
got := describeAppMetaErr(errors.New("network unreachable"))
|
||
if got != "network unreachable" {
|
||
t.Errorf("short err should pass through unchanged, got: %q", got)
|
||
}
|
||
}
|
||
|
||
func TestDescribeAppMetaErr_LarkOfficeDomain(t *testing.T) {
|
||
msg := `... grant link: https://open.larksuite.com/app/cli_xyz/auth?q=application:application:self_manage&op_from=openapi&token_type=tenant ...`
|
||
got := describeAppMetaErr(errors.New(msg))
|
||
if !strings.Contains(got, "open.larksuite.com") {
|
||
t.Errorf("want larksuite URL extracted, got: %q", got)
|
||
}
|
||
}
|