Fix review problem
This commit is contained in:
1 parent
0a8de62041
commit
6480c035fa
13 files changed
+147
-72
No files matched your search
+16
-20
@@ -34,14 +34,13 @@ const (
|
||||
devAppSecurityConfigTool = "update_app_security_config"
|
||||
|
||||
// 机器人能力(op-app MCP 工具,硬编码不走服务发现)。
|
||||
devAppRobotCreateTool = "create_dingtalk_robot"
|
||||
devAppRobotSubmitTool = "submit_robot_create_task"
|
||||
devAppRobotResultTool = "query_robot_create_result"
|
||||
devAppRobotConfigGetTool = "get_open_dev_app_robot_config"
|
||||
devAppRobotConfigCreateTool = "create_open_dev_app_robot_config"
|
||||
devAppRobotConfigUpdateTool = "update_open_dev_app_robot_config"
|
||||
devAppRobotEnableTool = "enable_open_dev_app_robot"
|
||||
devAppRobotOfflineTool = "offline_open_dev_app_robot"
|
||||
devAppRobotCreateTool = "create_dingtalk_robot"
|
||||
devAppRobotSubmitTool = "submit_robot_create_task"
|
||||
devAppRobotResultTool = "query_robot_create_result"
|
||||
devAppRobotConfigGetTool = "get_open_dev_app_robot_config"
|
||||
devAppRobotConfigSetTool = "set_open_dev_app_robot_config"
|
||||
devAppRobotEnableTool = "enable_open_dev_app_robot"
|
||||
devAppRobotOfflineTool = "offline_open_dev_app_robot"
|
||||
|
||||
// 版本发布能力(op-app MCP 工具,硬编码不走服务发现)。
|
||||
devAppVersionCreateTool = "create_open_dev_app_version"
|
||||
@@ -172,8 +171,7 @@ func newDevAppCommand(runner executor.Runner) *cobra.Command {
|
||||
newDevAppRobotSubmitCommand(runner),
|
||||
newDevAppRobotResultCommand(runner),
|
||||
newDevAppRobotConfigGetCommand(runner),
|
||||
newDevAppRobotConfigCommand(runner, "config", "为现有应用创建机器人配置", devAppRobotConfigCreateTool),
|
||||
newDevAppRobotConfigCommand(runner, "update", "更新现有应用机器人配置", devAppRobotConfigUpdateTool),
|
||||
newDevAppRobotConfigCommand(runner, "config", "创建或更新现有应用机器人配置", devAppRobotConfigSetTool),
|
||||
newDevAppRobotConfigCommand(runner, "enable", "启用现有应用机器人能力", devAppRobotEnableTool),
|
||||
newDevAppRobotOfflineCommand(runner),
|
||||
newDevAppRobotConnectCommand(runner),
|
||||
@@ -966,8 +964,8 @@ func newDevAppVersionCreateCommand(runner executor.Runner) *cobra.Command {
|
||||
func newDevAppVersionListCommand(runner executor.Runner) *cobra.Command {
|
||||
cmd := &cobra.Command{
|
||||
Use: "list",
|
||||
Short: "分页查询应用版本列表",
|
||||
Example: " dws devapp version list --unified-app-id UNIFIED_APP_ID --page 1 --page-size 20 --format json",
|
||||
Short: "按 cursor 查询应用版本列表",
|
||||
Example: " dws devapp version list --unified-app-id UNIFIED_APP_ID --page-size 20 --format json\n dws devapp version list --unified-app-id UNIFIED_APP_ID --cursor NEXT_CURSOR --page-size 20 --format json",
|
||||
Args: cobra.NoArgs,
|
||||
DisableAutoGenTag: true,
|
||||
RunE: func(cmd *cobra.Command, args []string) error {
|
||||
@@ -977,14 +975,14 @@ func newDevAppVersionListCommand(runner executor.Runner) *cobra.Command {
|
||||
}
|
||||
params := map[string]any{
|
||||
"unifiedAppId": appID,
|
||||
"currentPage": devAppIntFlag(cmd, "page"),
|
||||
"pageSize": devAppIntFlag(cmd, "page-size"),
|
||||
}
|
||||
devAppPutString(params, "cursor", devAppStringFlag(cmd, "cursor"))
|
||||
return runDevAppTool(runner, cmd, devAppVersionListTool, params)
|
||||
},
|
||||
}
|
||||
addDevAppUnifiedIDFlag(cmd)
|
||||
cmd.Flags().Int("page", 1, "分页页码,从 1 开始")
|
||||
cmd.Flags().String("cursor", "", "服务端返回的不透明分页游标;首次查询留空")
|
||||
cmd.Flags().Int("page-size", 20, "分页大小")
|
||||
preferLegacyLeaf(cmd)
|
||||
return cmd
|
||||
@@ -1022,8 +1020,8 @@ func newDevAppVersionCheckApprovalCommand(runner executor.Runner) *cobra.Command
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
// 复用 publish 工具的服务端预检模式:dryRun=true 只返回审批要求,不发布。
|
||||
params["dryRun"] = true
|
||||
// 复用 publish 工具的服务端预检模式:precheckOnly=true 只返回审批要求,不发布。
|
||||
params["precheckOnly"] = true
|
||||
return runDevAppTool(runner, cmd, devAppVersionPublishTool, params)
|
||||
},
|
||||
}
|
||||
@@ -1047,7 +1045,7 @@ func newDevAppVersionPublishCommand(runner executor.Runner) *cobra.Command {
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
params["dryRun"] = false
|
||||
params["precheckOnly"] = false
|
||||
if cmd.Flags().Changed("confirm-sensitive") {
|
||||
value, _ := cmd.Flags().GetBool("confirm-sensitive")
|
||||
params["confirmedSensitive"] = value
|
||||
@@ -1102,12 +1100,10 @@ func devAppVersionLocator(cmd *cobra.Command) (map[string]any, error) {
|
||||
|
||||
func addDevAppUnifiedIDFlag(cmd *cobra.Command) {
|
||||
cmd.Flags().String("unified-app-id", "", "统一应用 ID (必填)")
|
||||
cmd.Flags().String("app-id", "", "--unified-app-id 的兼容别名")
|
||||
_ = cmd.Flags().MarkHidden("app-id")
|
||||
}
|
||||
|
||||
func requiredDevAppUnifiedID(cmd *cobra.Command) (string, error) {
|
||||
appID := devAppFlagOrFallback(cmd, "unified-app-id", "app-id")
|
||||
appID := devAppStringFlag(cmd, "unified-app-id")
|
||||
if appID == "" {
|
||||
return "", apperrors.NewValidation("--unified-app-id is required")
|
||||
}
|
||||
|
||||
@@ -119,6 +119,15 @@ func TestDevAppCommandHasAppAliasAndCoreCommands(t *testing.T) {
|
||||
t.Fatalf("missing command %q: %v", name, err)
|
||||
}
|
||||
}
|
||||
robotCmd, _, err := root.Find([]string{"robot"})
|
||||
if err != nil {
|
||||
t.Fatalf("missing robot command: %v", err)
|
||||
}
|
||||
for _, cmd := range robotCmd.Commands() {
|
||||
if cmd.Name() == "update" {
|
||||
t.Fatal("robot update command exists, want removed public command")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestDevAppRobotCommandsBuildToolParams(t *testing.T) {
|
||||
@@ -166,7 +175,7 @@ func TestDevAppRobotCommandsBuildToolParams(t *testing.T) {
|
||||
{
|
||||
name: "config create with skills and mode",
|
||||
args: []string{"robot", "config", "--unified-app-id", "u-1", "--name", "小助手", "--brief", "审批助手", "--mode", "2", "--skills", "qa,approval", "--add-scope", "--yes"},
|
||||
wantTool: "create_open_dev_app_robot_config",
|
||||
wantTool: "set_open_dev_app_robot_config",
|
||||
wantParams: map[string]any{
|
||||
"unifiedAppId": "u-1",
|
||||
"name": "小助手",
|
||||
@@ -228,11 +237,11 @@ func TestDevAppVersionCommandsBuildToolParams(t *testing.T) {
|
||||
},
|
||||
{
|
||||
name: "list",
|
||||
args: []string{"version", "list", "--unified-app-id", "u-1", "--page", "2", "--page-size", "5"},
|
||||
args: []string{"version", "list", "--unified-app-id", "u-1", "--cursor", "cursor-1", "--page-size", "5"},
|
||||
wantTool: "list_open_dev_app_versions",
|
||||
wantParams: map[string]any{
|
||||
"unifiedAppId": "u-1",
|
||||
"currentPage": 2,
|
||||
"cursor": "cursor-1",
|
||||
"pageSize": 5,
|
||||
},
|
||||
},
|
||||
@@ -243,19 +252,19 @@ func TestDevAppVersionCommandsBuildToolParams(t *testing.T) {
|
||||
wantParams: map[string]any{"unifiedAppId": "u-1", "versionId": "v-1"},
|
||||
},
|
||||
{
|
||||
name: "check-approval forces dryRun",
|
||||
name: "check-approval prechecks only",
|
||||
args: []string{"version", "check-approval", "--unified-app-id", "u-1", "--version-id", "v-1"},
|
||||
wantTool: "publish_open_dev_app_version",
|
||||
wantParams: map[string]any{"unifiedAppId": "u-1", "versionId": "v-1", "dryRun": true},
|
||||
wantParams: map[string]any{"unifiedAppId": "u-1", "versionId": "v-1", "precheckOnly": true},
|
||||
},
|
||||
{
|
||||
name: "publish sets dryRun false and sensitive",
|
||||
name: "publish disables precheck and sets sensitive",
|
||||
args: []string{"version", "publish", "--unified-app-id", "u-1", "--version-id", "v-1", "--confirm-sensitive", "--approver", "user-1", "--yes"},
|
||||
wantTool: "publish_open_dev_app_version",
|
||||
wantParams: map[string]any{
|
||||
"unifiedAppId": "u-1",
|
||||
"versionId": "v-1",
|
||||
"dryRun": false,
|
||||
"precheckOnly": false,
|
||||
"confirmedSensitive": true,
|
||||
"approverUserId": "user-1",
|
||||
},
|
||||
@@ -359,6 +368,79 @@ func TestDevAppEventSubscribeRequiresEventCode(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestDevAppScopedCommandsRejectLegacyLocators(t *testing.T) {
|
||||
cases := []struct {
|
||||
name string
|
||||
args []string
|
||||
}{
|
||||
{name: "version create", args: []string{"devapp", "version", "create", "--app-id", "u-1", "--version", "1.0.1", "--yes"}},
|
||||
{name: "version list", args: []string{"devapp", "version", "list", "--app-id", "u-1"}},
|
||||
{name: "version get", args: []string{"devapp", "version", "get", "--app-id", "u-1", "--version-id", "v-1"}},
|
||||
{name: "version check approval", args: []string{"devapp", "version", "check-approval", "--app-id", "u-1", "--version-id", "v-1"}},
|
||||
{name: "version publish", args: []string{"devapp", "version", "publish", "--app-id", "u-1", "--version-id", "v-1", "--yes"}},
|
||||
{name: "version status", args: []string{"devapp", "version", "status", "--app-id", "u-1", "--version-id", "v-1"}},
|
||||
{name: "robot get", args: []string{"devapp", "robot", "get", "--app-id", "u-1"}},
|
||||
{name: "robot config", args: []string{"devapp", "robot", "config", "--app-id", "u-1", "--name", "小助手", "--yes"}},
|
||||
{name: "robot enable", args: []string{"devapp", "robot", "enable", "--app-id", "u-1", "--name", "小助手", "--yes"}},
|
||||
{name: "robot offline", args: []string{"devapp", "robot", "offline", "--app-id", "u-1", "--yes"}},
|
||||
{name: "event list", args: []string{"devapp", "event", "list", "--app-id", "u-1"}},
|
||||
{name: "event subscribe", args: []string{"devapp", "event", "subscribe", "--app-id", "u-1", "--event-code", "user_add_org", "--yes"}},
|
||||
{name: "event unsubscribe", args: []string{"devapp", "event", "unsubscribe", "--app-id", "u-1", "--event-code", "user_add_org", "--yes"}},
|
||||
}
|
||||
|
||||
for _, tc := range cases {
|
||||
t.Run(tc.name, func(t *testing.T) {
|
||||
runner := &captureRunner{}
|
||||
root := newDevAppTestRoot(runner)
|
||||
var out bytes.Buffer
|
||||
root.SetOut(&out)
|
||||
root.SetErr(&out)
|
||||
root.SetArgs(tc.args)
|
||||
|
||||
err := root.Execute()
|
||||
if err == nil {
|
||||
t.Fatal("Execute() error = nil, want unknown --app-id flag")
|
||||
}
|
||||
if !strings.Contains(err.Error(), "unknown flag: --app-id") {
|
||||
t.Fatalf("error = %q, want unknown --app-id flag", err.Error())
|
||||
}
|
||||
if runner.last.Tool != "" {
|
||||
t.Fatalf("tool = %q, want no invocation", runner.last.Tool)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestDevAppScopedCommandsRejectAgentAndCustomKeyLocators(t *testing.T) {
|
||||
for _, flag := range []string{"--agent-id", "--custom-key"} {
|
||||
for _, args := range [][]string{
|
||||
{"devapp", "version", "list", flag, "u-1"},
|
||||
{"devapp", "robot", "get", flag, "u-1"},
|
||||
{"devapp", "event", "list", flag, "u-1"},
|
||||
} {
|
||||
t.Run(strings.Join(args[1:3], " ")+" "+flag, func(t *testing.T) {
|
||||
runner := &captureRunner{}
|
||||
root := newDevAppTestRoot(runner)
|
||||
var out bytes.Buffer
|
||||
root.SetOut(&out)
|
||||
root.SetErr(&out)
|
||||
root.SetArgs(args)
|
||||
|
||||
err := root.Execute()
|
||||
if err == nil {
|
||||
t.Fatalf("Execute() error = nil, want unknown %s flag", flag)
|
||||
}
|
||||
if !strings.Contains(err.Error(), "unknown flag: "+flag) {
|
||||
t.Fatalf("error = %q, want unknown %s flag", err.Error(), flag)
|
||||
}
|
||||
if runner.last.Tool != "" {
|
||||
t.Fatalf("tool = %q, want no invocation", runner.last.Tool)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestDevAppRobotAndVersionWritesRequireGuard(t *testing.T) {
|
||||
cases := []struct {
|
||||
name string
|
||||
|
||||
Reference in new issue
Block a user