github.com/khulnasoft/cli@v0.0.0-20240402070845-01bcad7beefa/cli/cobra_test.go (about) 1 package cli 2 3 import ( 4 "testing" 5 6 "github.com/google/go-cmp/cmp/cmpopts" 7 pluginmanager "github.com/khulnasoft/cli/cli-plugins/manager" 8 "github.com/spf13/cobra" 9 "gotest.tools/v3/assert" 10 is "gotest.tools/v3/assert/cmp" 11 ) 12 13 func TestVisitAll(t *testing.T) { 14 root := &cobra.Command{Use: "root"} 15 sub1 := &cobra.Command{Use: "sub1"} 16 sub1sub1 := &cobra.Command{Use: "sub1sub1"} 17 sub1sub2 := &cobra.Command{Use: "sub1sub2"} 18 sub2 := &cobra.Command{Use: "sub2"} 19 20 root.AddCommand(sub1, sub2) 21 sub1.AddCommand(sub1sub1, sub1sub2) 22 23 // Take the opportunity to test DisableFlagsInUseLine too 24 DisableFlagsInUseLine(root) 25 26 var visited []string 27 VisitAll(root, func(ccmd *cobra.Command) { 28 visited = append(visited, ccmd.Name()) 29 assert.Assert(t, ccmd.DisableFlagsInUseLine, "DisableFlagsInUseLine not set on %q", ccmd.Name()) 30 }) 31 expected := []string{"sub1sub1", "sub1sub2", "sub1", "sub2", "root"} 32 assert.DeepEqual(t, expected, visited) 33 } 34 35 func TestVendorAndVersion(t *testing.T) { 36 // Non plugin. 37 assert.Equal(t, vendorAndVersion(&cobra.Command{Use: "test"}), "") 38 39 // Plugins with various lengths of vendor. 40 for _, tc := range []struct { 41 vendor string 42 version string 43 expected string 44 }{ 45 {vendor: "vendor", expected: "(vendor)"}, 46 {vendor: "vendor", version: "testing", expected: "(vendor, testing)"}, 47 } { 48 t.Run(tc.vendor, func(t *testing.T) { 49 cmd := &cobra.Command{ 50 Use: "test", 51 Annotations: map[string]string{ 52 pluginmanager.CommandAnnotationPlugin: "true", 53 pluginmanager.CommandAnnotationPluginVendor: tc.vendor, 54 pluginmanager.CommandAnnotationPluginVersion: tc.version, 55 }, 56 } 57 assert.Equal(t, vendorAndVersion(cmd), tc.expected) 58 }) 59 } 60 } 61 62 func TestInvalidPlugin(t *testing.T) { 63 root := &cobra.Command{Use: "root"} 64 sub1 := &cobra.Command{Use: "sub1"} 65 sub1sub1 := &cobra.Command{Use: "sub1sub1"} 66 sub1sub2 := &cobra.Command{Use: "sub1sub2"} 67 sub2 := &cobra.Command{Use: "sub2"} 68 69 assert.Assert(t, is.Len(invalidPlugins(root), 0)) 70 71 sub1.Annotations = map[string]string{ 72 pluginmanager.CommandAnnotationPlugin: "true", 73 pluginmanager.CommandAnnotationPluginInvalid: "foo", 74 } 75 root.AddCommand(sub1, sub2) 76 sub1.AddCommand(sub1sub1, sub1sub2) 77 78 assert.DeepEqual(t, invalidPlugins(root), []*cobra.Command{sub1}, cmpopts.IgnoreUnexported(cobra.Command{})) 79 } 80 81 func TestCommandAliases(t *testing.T) { 82 root := &cobra.Command{Use: "root"} 83 sub := &cobra.Command{Use: "subcommand", Aliases: []string{"alias1", "alias2"}} 84 sub2 := &cobra.Command{Use: "subcommand2", Annotations: map[string]string{"aliases": "root foo, root bar"}} 85 root.AddCommand(sub) 86 root.AddCommand(sub2) 87 88 assert.Equal(t, hasAliases(sub), true) 89 assert.Equal(t, commandAliases(sub), "root subcommand, root alias1, root alias2") 90 assert.Equal(t, hasAliases(sub2), true) 91 assert.Equal(t, commandAliases(sub2), "root foo, root bar") 92 93 sub.Annotations = map[string]string{"aliases": "custom alias, custom alias 2"} 94 assert.Equal(t, hasAliases(sub), true) 95 assert.Equal(t, commandAliases(sub), "custom alias, custom alias 2") 96 } 97 98 func TestDecoratedName(t *testing.T) { 99 root := &cobra.Command{Use: "root"} 100 topLevelCommand := &cobra.Command{Use: "pluginTopLevelCommand"} 101 root.AddCommand(topLevelCommand) 102 assert.Equal(t, decoratedName(topLevelCommand), "pluginTopLevelCommand ") 103 topLevelCommand.Annotations = map[string]string{pluginmanager.CommandAnnotationPlugin: "true"} 104 assert.Equal(t, decoratedName(topLevelCommand), "pluginTopLevelCommand*") 105 }