mirror of
https://github.com/larksuite/cli.git
synced 2026-07-08 02:00:19 +08:00
* ci: consolidate 6 workflows into layered CI pyramid with results gate Merge tests.yml, lint.yml, coverage.yml, cli-e2e.yml, gitleaks.yml, and license-header.yml into a single ci.yml with fail-fast layering: - L1 fast-gate: build, vet, gofmt, go mod tidy - L2 quality: unit-test, lint, coverage (40% threshold + Codecov), deadcode (incremental) - L3 e2e: dry-run (no secrets) + live (with secrets, fork-skip) - L4 security: gitleaks, govulncheck, go-licenses, license-header Results gate aggregates all jobs as the single required check for branch protection. Also adds: - arch-audit.yml: weekly cron for dead code, complexity, deps, E2E gaps - .golangci.yml: depguard shortcuts-no-raw-http, forbidigo fmt.Print/log.Fatal - AGENTS.md: E2E testing conventions, updated pre-PR checks Change-Id: I2e21067a9e9e12d366d1b1a092227e9f7d60fe41
54 lines
1.3 KiB
Go
54 lines
1.3 KiB
Go
// Copyright (c) 2026 Lark Technologies Pte. Ltd.
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
package util
|
|
|
|
import "testing"
|
|
|
|
func TestTruncateStr(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
s string
|
|
n int
|
|
want string
|
|
}{
|
|
{"short string", "hello", 10, "hello"},
|
|
{"exact length", "hello", 5, "hello"},
|
|
{"truncate", "hello world", 5, "hello"},
|
|
{"empty", "", 5, ""},
|
|
{"zero limit", "hello", 0, ""},
|
|
{"CJK characters", "你好世界测试", 4, "你好世界"},
|
|
}
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
if got := TruncateStr(tt.s, tt.n); got != tt.want {
|
|
t.Errorf("TruncateStr(%q, %d) = %q, want %q", tt.s, tt.n, got, tt.want)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestTruncateStrWithEllipsis(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
s string
|
|
n int
|
|
want string
|
|
}{
|
|
{"short string", "hello", 10, "hello"},
|
|
{"exact length", "hello", 5, "hello"},
|
|
{"truncate with ellipsis", "hello world", 8, "hello..."},
|
|
{"limit less than 3", "hello", 2, "he"},
|
|
{"limit equals 3", "hello world", 3, "..."},
|
|
{"empty", "", 5, ""},
|
|
{"CJK with ellipsis", "你好世界测试", 5, "你好..."},
|
|
}
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
if got := TruncateStrWithEllipsis(tt.s, tt.n); got != tt.want {
|
|
t.Errorf("TruncateStrWithEllipsis(%q, %d) = %q, want %q", tt.s, tt.n, got, tt.want)
|
|
}
|
|
})
|
|
}
|
|
}
|