chore: import upstream snapshot with attribution
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

This commit is contained in:
wehub-resource-sync
2026-07-13 12:22:54 +08:00
commit bf9395e022
2349 changed files with 588574 additions and 0 deletions
+21
View File
@@ -0,0 +1,21 @@
# Note CLI E2E Coverage
## Metrics
- Denominator: 2 leaf commands
- Dry-run covered: 2
- Dry-run coverage: 100.0%
- Live covered: 0
- Live coverage: 0.0%
Live E2E is intentionally not counted yet because both commands require meeting-generated note artifacts; stable create/use/cleanup fixtures are not available in this test suite.
## Summary
- TestNoteDetailDryRun: dry-run coverage for `note +detail`; asserts the detail request method and `/open-apis/vc/v1/notes/{note_id}` URL without calling live APIs.
- TestNoteTranscriptDryRun: dry-run coverage for `note +transcript`; asserts the two-step request shape (`note detail` precheck, then `unified_note_transcript`), transcript query parameters, and that `--transcript-format` coexists with the global `--format` output flag.
## Command Table
| Status | Cmd | Type | Testcase | Key parameter shapes | Notes / uncovered reason |
| --- | --- | --- | --- | --- | --- |
| dry-run ✓ / live ✕ | note +detail | shortcut | note_dryrun_test.go::TestNoteDetailDryRun | `--note-id`; user identity | live note fixtures depend on meeting-generated artifacts |
| dry-run ✓ / live ✕ | note +transcript | shortcut | note_dryrun_test.go::TestNoteTranscriptDryRun | `--note-id`; `--transcript-format`; `--format json`; transcript API `format/page_size/locale` params | live unified-note fixtures depend on generated VC note artifacts |
+97
View File
@@ -0,0 +1,97 @@
// Copyright (c) 2026 Lark Technologies Pte. Ltd.
// SPDX-License-Identifier: MIT
package note
import (
"context"
"testing"
"time"
clie2e "github.com/larksuite/cli/tests/cli_e2e"
"github.com/stretchr/testify/require"
"github.com/tidwall/gjson"
)
func TestNoteDetailDryRun(t *testing.T) {
setNoteDryRunEnv(t)
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
t.Cleanup(cancel)
result, err := clie2e.RunCmd(ctx, clie2e.Request{
Args: []string{
"note", "+detail",
"--note-id", "note_dryrun",
"--dry-run",
},
DefaultAs: "user",
})
require.NoError(t, err)
result.AssertExitCode(t, 0)
out := result.Stdout
if got := gjson.Get(out, "api.0.method").String(); got != "GET" {
t.Fatalf("method=%q, want GET\nstdout:\n%s", got, out)
}
if got := gjson.Get(out, "api.0.url").String(); got != "/open-apis/vc/v1/notes/note_dryrun" {
t.Fatalf("url=%q, want note detail endpoint\nstdout:\n%s", got, out)
}
}
func TestNoteTranscriptDryRun(t *testing.T) {
setNoteDryRunEnv(t)
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
t.Cleanup(cancel)
result, err := clie2e.RunCmd(ctx, clie2e.Request{
Args: []string{
"note", "+transcript",
"--note-id", "note_dryrun",
"--transcript-format", "plain_text",
"--dry-run",
},
DefaultAs: "user",
Format: "json",
})
require.NoError(t, err)
result.AssertExitCode(t, 0)
out := result.Stdout
if got := gjson.Get(out, "api.#").Int(); got != 2 {
t.Fatalf("api count=%d, want 2\nstdout:\n%s", got, out)
}
if got := gjson.Get(out, "api.0.method").String(); got != "GET" {
t.Fatalf("detail method=%q, want GET\nstdout:\n%s", got, out)
}
if got := gjson.Get(out, "api.0.url").String(); got != "/open-apis/vc/v1/notes/note_dryrun" {
t.Fatalf("detail url=%q, want note detail endpoint\nstdout:\n%s", got, out)
}
if got := gjson.Get(out, "api.1.method").String(); got != "GET" {
t.Fatalf("transcript method=%q, want GET\nstdout:\n%s", got, out)
}
if got := gjson.Get(out, "api.1.url").String(); got != "/open-apis/vc/v1/notes/note_dryrun/unified_note_transcript" {
t.Fatalf("transcript url=%q, want unified transcript endpoint\nstdout:\n%s", got, out)
}
if got := gjson.Get(out, "api.1.params.format").String(); got != "plain_text" {
t.Fatalf("transcript API format=%q, want plain_text\nstdout:\n%s", got, out)
}
if got := gjson.Get(out, "api.1.params.page_size").Int(); got != 200 {
t.Fatalf("page_size=%d, want 200\nstdout:\n%s", got, out)
}
if got := gjson.Get(out, "api.1.params.locale").String(); got != "zh_cn" {
t.Fatalf("locale=%q, want zh_cn\nstdout:\n%s", got, out)
}
if got := gjson.Get(out, "transcript_format").String(); got != "plain_text" {
t.Fatalf("transcript_format=%q, want plain_text\nstdout:\n%s", got, out)
}
}
func setNoteDryRunEnv(t *testing.T) {
t.Helper()
t.Setenv("LARKSUITE_CLI_CONFIG_DIR", t.TempDir())
t.Setenv("LARKSUITE_CLI_APP_ID", "note_dryrun_test")
t.Setenv("LARKSUITE_CLI_APP_SECRET", "note_dryrun_secret")
t.Setenv("LARKSUITE_CLI_BRAND", "feishu")
}