|
| 1 | +package otsutil |
| 2 | + |
| 3 | +import ( |
| 4 | + "bytes" |
| 5 | + "os" |
| 6 | + "path/filepath" |
| 7 | + "testing" |
| 8 | + |
| 9 | + "github.com/aliyun/aliyun-cli/v3/cli" |
| 10 | +) |
| 11 | + |
| 12 | +func TestNewOtsCommand(t *testing.T) { |
| 13 | + cmd := NewOtsutilCommand() |
| 14 | + if cmd == nil { |
| 15 | + t.Fatalf("NewOtsutilCommand returned nil") |
| 16 | + } |
| 17 | + if cmd.Name != "otsutil" { |
| 18 | + t.Errorf("Name expected 'otsutil', got %s", cmd.Name) |
| 19 | + } |
| 20 | + if cmd.Short == nil { |
| 21 | + t.Fatalf("Short i18n text nil") |
| 22 | + } |
| 23 | + if en := cmd.Short.Get("en"); en != "Alibaba Cloud Tablestore Utility" { |
| 24 | + t.Errorf("Short en expected 'Alibaba Cloud Tablestore Utility', got %s", en) |
| 25 | + } |
| 26 | + if zh := cmd.Short.Get("zh"); zh != "阿里云表格存储工具" { |
| 27 | + t.Errorf("Short zh expected '阿里云表格存储工具', got %s", zh) |
| 28 | + } |
| 29 | + if cmd.Usage != "aliyun otsutil <command> [args...]" { |
| 30 | + t.Errorf("Usage expected 'aliyun otsutil <command> [args...]', got %s", cmd.Usage) |
| 31 | + } |
| 32 | + if cmd.Hidden { |
| 33 | + t.Errorf("Hidden expected false") |
| 34 | + } |
| 35 | + if !cmd.EnableUnknownFlag { |
| 36 | + t.Errorf("EnableUnknownFlag expected true") |
| 37 | + } |
| 38 | + if !cmd.KeepArgs { |
| 39 | + t.Errorf("KeepArgs expected true") |
| 40 | + } |
| 41 | + if !cmd.SkipDefaultHelp { |
| 42 | + t.Errorf("SkipDefaultHelp expected true") |
| 43 | + } |
| 44 | + if cmd.Run == nil { |
| 45 | + t.Errorf("Run function should not be nil") |
| 46 | + } |
| 47 | +} |
| 48 | + |
| 49 | +func TestNewOtsCommandMetadata(t *testing.T) { |
| 50 | + cmd := NewOtsutilCommand() |
| 51 | + metaMap := map[string]*cli.Metadata{} |
| 52 | + cmd.GetMetadata(metaMap) |
| 53 | + m, ok := metaMap[cmd.Name] |
| 54 | + if !ok { |
| 55 | + t.Fatalf("metadata for %s not found", cmd.Name) |
| 56 | + } |
| 57 | + if m.Name != "otsutil" { |
| 58 | + t.Errorf("metadata name expected otsutil, got %s", m.Name) |
| 59 | + } |
| 60 | + if m.Usage != cmd.Usage { |
| 61 | + t.Errorf("metadata usage mismatch") |
| 62 | + } |
| 63 | + if m.Hidden != cmd.Hidden { |
| 64 | + t.Errorf("metadata hidden mismatch") |
| 65 | + } |
| 66 | + if se := m.Short["en"]; se != "Alibaba Cloud Tablestore Utility" { |
| 67 | + t.Errorf("metadata short en mismatch: %s", se) |
| 68 | + } |
| 69 | + if sz := m.Short["zh"]; sz != "阿里云表格存储工具" { |
| 70 | + t.Errorf("metadata short zh mismatch: %s", sz) |
| 71 | + } |
| 72 | +} |
| 73 | + |
| 74 | +func TestOtsCommandRunInstalledSkipNetwork(t *testing.T) { |
| 75 | + // 准备临时目录作为配置路径 |
| 76 | + tmpDir := t.TempDir() |
| 77 | + oldGet := getConfigurePathFunc |
| 78 | + getConfigurePathFunc = func() string { return tmpDir } |
| 79 | + defer func() { getConfigurePathFunc = oldGet }() |
| 80 | + |
| 81 | + // 创建假可执行文件(ts) |
| 82 | + execPath := filepath.Join(tmpDir, "ts") |
| 83 | + if err := os.WriteFile(execPath, []byte("#!/bin/sh\necho dummy\n"), 0755); err != nil { |
| 84 | + t.Fatalf("write fake exec: %v", err) |
| 85 | + } |
| 86 | + |
| 87 | + // 设置忽略profile,避免真实配置依赖 |
| 88 | + os.Setenv("ALIBABA_CLOUD_IGNORE_PROFILE", "TRUE") |
| 89 | + defer os.Unsetenv("ALIBABA_CLOUD_IGNORE_PROFILE") |
| 90 | + |
| 91 | + cmd := NewOtsutilCommand() |
| 92 | + stdout := &bytes.Buffer{} |
| 93 | + stderr := &bytes.Buffer{} |
| 94 | + ctx := cli.NewCommandContext(stdout, stderr) |
| 95 | + |
| 96 | + // 直接调用Run函数(不经过Command.Execute解析) |
| 97 | + err := cmd.Run(ctx, []string{}) |
| 98 | + if err == nil { |
| 99 | + t.Fatalf("expected error, got nil") |
| 100 | + } |
| 101 | + errStr := err.Error() |
| 102 | + if !bytes.Contains([]byte(errStr), []byte("profile default is not configure yet")) && |
| 103 | + !bytes.Contains([]byte(errStr), []byte("can't get credential")) { |
| 104 | + t.Errorf("unexpected error: %v", err) |
| 105 | + } |
| 106 | +} |
0 commit comments