101 lines
4.4 KiB
Go
101 lines
4.4 KiB
Go
// Copyright 2026 Alibaba Group
|
||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||
// you may not use this file except in compliance with the License.
|
||
// You may obtain a copy of the License at
|
||
//
|
||
// http://www.apache.org/licenses/LICENSE-2.0
|
||
//
|
||
// Unless required by applicable law or agreed to in writing, software
|
||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
// See the License for the specific language governing permissions and
|
||
// limitations under the License.
|
||
|
||
package helpers
|
||
|
||
import (
|
||
"strings"
|
||
"testing"
|
||
|
||
"github.com/spf13/cobra"
|
||
)
|
||
|
||
// TestDevLeafFormatFlagVisibility 是队列 B189 的 dev 域叶子 --format flag 可见性
|
||
// 断言。--format 是生产根命令的持久 flag(internal/app/flags.go bindPersistentFlags),
|
||
// 叶子自身不声明 local --format,而是经 cmd.InheritedFlags() 继承可见。本测试:
|
||
//
|
||
// 1. 在完整命令树下执行 dev app/dev connect 叶子,--format 必须被 resolveCommandFormat
|
||
// 识别(table 生效),证明其可见;
|
||
//
|
||
// 2. 叶子 --help 必须展示 --format 于 Global Flags 段(继承可见性的人读证据)。
|
||
func TestDevLeafFormatFlagVisibility(t *testing.T) {
|
||
leaves := []struct {
|
||
name string
|
||
args []string
|
||
helpPath []string
|
||
}{
|
||
{"dev-app-get", []string{"dev", "app", "get", "--unified-app-id", "u-1"}, []string{"dev", "app", "get"}},
|
||
{"dev-app-list", []string{"dev", "app", "list", "--name", "DemoApp"}, []string{"dev", "app", "list"}},
|
||
{"dev-version-list", []string{"dev", "app", "version", "list", "--unified-app-id", "u-1"}, []string{"dev", "app", "version", "list"}},
|
||
{"dev-event-list", []string{"dev", "app", "event", "list", "--unified-app-id", "u-1"}, []string{"dev", "app", "event", "list"}},
|
||
{"dev-permission-list", []string{"dev", "app", "permission", "list", "--unified-app-id", "u-1"}, []string{"dev", "app", "permission", "list"}},
|
||
{"dev-member-list", []string{"dev", "app", "member", "list", "--unified-app-id", "u-1"}, []string{"dev", "app", "member", "list"}},
|
||
}
|
||
|
||
for _, lc := range leaves {
|
||
t.Run(lc.name, func(t *testing.T) {
|
||
// --format table 必须生效:输出为表(含列头/业务值),且不泄漏信封外壳键。
|
||
args := append(append([]string{}, lc.args...), "--format", "table")
|
||
root := newDevAppTestRoot(devAppFamilyContentRunner(map[string]any{"items": []any{map[string]any{"id": "one"}}}))
|
||
out, errBuf, err := runRootBuffered(t, root, args...)
|
||
if err != nil {
|
||
t.Fatalf("Execute() error = %v\nstdout:\n%s\nstderr:\n%s", err, out.String(), errBuf.String())
|
||
}
|
||
s := out.String()
|
||
if strings.Contains(s, `"outcome"`) || strings.Contains(s, `"ok":`) {
|
||
t.Fatalf("--format table not effective (envelope shell leaked):\n%s", s)
|
||
}
|
||
if strings.TrimSpace(s) == "" {
|
||
t.Fatalf("--format table produced empty stdout (format not visible?):\n%s", s)
|
||
}
|
||
|
||
// --help 必须展示 --format 于 Global Flags 段。
|
||
helpArgs := append(append([]string{}, lc.helpPath...), "--help")
|
||
helpRoot := newDevAppTestRoot(&captureRunner{})
|
||
helpOut, _, herr := runRootBuffered(t, helpRoot, helpArgs...)
|
||
if herr != nil {
|
||
t.Fatalf("--help error = %v", herr)
|
||
}
|
||
if !strings.Contains(helpOut.String(), "--format") {
|
||
t.Fatalf("leaf --help must expose --format (global inherited flag):\n%s", helpOut.String())
|
||
}
|
||
})
|
||
}
|
||
}
|
||
|
||
// TestDevLeafFormatFlagHelpShowsGlobalSection 是队列 B189 的补充观察断言:dev 叶子
|
||
// 的 --help 中 --format 出现在 "Global Flags" 段而非本地 Flags 段(flag 可见性来源
|
||
// 为根命令持久继承,而非叶子自声明)。这是 B189 结论的形式化——若某叶子把
|
||
// --format 放回本地段,本测试会因 --format 出现在非 Global 段而暴露。
|
||
func TestDevLeafFormatFlagHelpShowsGlobalSection(t *testing.T) {
|
||
root := newDevAppTestRoot(&captureRunner{})
|
||
out, _, err := runRootBuffered(t, root, "dev", "app", "get", "--help")
|
||
if err != nil {
|
||
t.Fatalf("--help error = %v", err)
|
||
}
|
||
help := out.String()
|
||
globalIdx := strings.Index(help, "Global Flags")
|
||
if globalIdx < 0 {
|
||
t.Fatalf("leaf help missing 'Global Flags' section:\n%s", help)
|
||
}
|
||
formatIdx := strings.LastIndex(help, "--format")
|
||
if formatIdx < 0 {
|
||
t.Fatalf("leaf help missing --format in Global Flags:\n%s", help)
|
||
}
|
||
if formatIdx < globalIdx {
|
||
t.Fatalf("--format found before 'Global Flags' section (should be inherited global):\n%s", help)
|
||
}
|
||
}
|
||
|
||
var _ = cobra.Command{}
|