github.com/loggregator/cli@v6.33.1-0.20180224010324-82334f081791+incompatible/cf/commands/plugin/plugins_test.go (about)

     1  package plugin_test
     2  
     3  import (
     4  	"net/rpc"
     5  
     6  	"code.cloudfoundry.org/cli/cf/commandregistry"
     7  	plugincmd "code.cloudfoundry.org/cli/cf/commands/plugin"
     8  	"code.cloudfoundry.org/cli/cf/configuration/pluginconfig"
     9  	"code.cloudfoundry.org/cli/cf/configuration/pluginconfig/pluginconfigfakes"
    10  	"code.cloudfoundry.org/cli/cf/flags"
    11  	"code.cloudfoundry.org/cli/cf/requirements/requirementsfakes"
    12  	"code.cloudfoundry.org/cli/plugin"
    13  	testcmd "code.cloudfoundry.org/cli/util/testhelpers/commands"
    14  	. "code.cloudfoundry.org/cli/util/testhelpers/matchers"
    15  	testterm "code.cloudfoundry.org/cli/util/testhelpers/terminal"
    16  
    17  	. "github.com/onsi/ginkgo"
    18  	. "github.com/onsi/gomega"
    19  )
    20  
    21  var _ = Describe("Plugins", func() {
    22  	var (
    23  		ui                  *testterm.FakeUI
    24  		requirementsFactory *requirementsfakes.FakeFactory
    25  		config              *pluginconfigfakes.FakePluginConfiguration
    26  		deps                commandregistry.Dependency
    27  	)
    28  
    29  	updateCommandDependency := func(pluginCall bool) {
    30  		deps.UI = ui
    31  		deps.PluginConfig = config
    32  		commandregistry.Commands.SetCommand(commandregistry.Commands.FindCommand("plugins").SetDependency(deps, pluginCall))
    33  	}
    34  
    35  	BeforeEach(func() {
    36  		ui = &testterm.FakeUI{}
    37  		requirementsFactory = new(requirementsfakes.FakeFactory)
    38  		config = new(pluginconfigfakes.FakePluginConfiguration)
    39  
    40  		rpc.DefaultServer = rpc.NewServer()
    41  	})
    42  
    43  	runCommand := func(args ...string) bool {
    44  		return testcmd.RunCLICommand("plugins", args, requirementsFactory, updateCommandDependency, false, ui)
    45  	}
    46  
    47  	Context("If --checksum flag is provided", func() {
    48  		It("computes and prints the sha1 checksum of the binary", func() {
    49  			config.PluginsReturns(map[string]pluginconfig.PluginMetadata{
    50  				"Test1": {
    51  					Location: "../../../fixtures/plugins/test_1.go",
    52  					Version:  plugin.VersionType{Major: 1, Minor: 2, Build: 3},
    53  					Commands: []plugin.Command{
    54  						{Name: "test_1_cmd1", HelpText: "help text for test_1_cmd1"},
    55  					},
    56  				},
    57  			})
    58  
    59  			runCommand("--checksum")
    60  
    61  			Expect(ui.Outputs()).To(ContainSubstrings(
    62  				[]string{"Plugin Name", "Version", "sha1", "Command Help"},
    63  			))
    64  		})
    65  	})
    66  
    67  	Context("when arguments are provided", func() {
    68  		var cmd commandregistry.Command
    69  		var flagContext flags.FlagContext
    70  
    71  		BeforeEach(func() {
    72  			cmd = &plugincmd.Plugins{}
    73  			cmd.SetDependency(deps, false)
    74  			flagContext = flags.NewFlagContext(cmd.MetaData().Flags)
    75  		})
    76  
    77  		It("should fail with usage", func() {
    78  			flagContext.Parse("blahblah")
    79  
    80  			reqs, err := cmd.Requirements(requirementsFactory, flagContext)
    81  			Expect(err).NotTo(HaveOccurred())
    82  
    83  			err = testcmd.RunRequirements(reqs)
    84  			Expect(err).To(HaveOccurred())
    85  			Expect(err.Error()).To(ContainSubstring("Incorrect Usage"))
    86  			Expect(err.Error()).To(ContainSubstring("No argument required"))
    87  		})
    88  	})
    89  
    90  	It("returns a  sorted list of available methods of a plugin", func() {
    91  		config.PluginsReturns(map[string]pluginconfig.PluginMetadata{
    92  			"BTest2": {
    93  				Location: "path/to/plugin",
    94  				Commands: []plugin.Command{
    95  					{Name: "B_test_2_cmd1", HelpText: "help text for test_2_cmd1"},
    96  				},
    97  			},
    98  			"aTest1": {
    99  				Location: "path/to/plugin",
   100  				Commands: []plugin.Command{
   101  					{Name: "a_test_1_cmd1", HelpText: "help text for test_1_cmd1"},
   102  					{Name: "a_test_1_cmd2", HelpText: "help text for test_1_cmd2"},
   103  				},
   104  			},
   105  		})
   106  
   107  		runCommand()
   108  
   109  		Expect(ui.Outputs()).To(ContainSubstrings(
   110  			[]string{"Listing Installed Plugins..."},
   111  			[]string{"OK"},
   112  			[]string{"Plugin Name", "Command Name", "Command Help"},
   113  			[]string{"aTest1", "a_test_1_cmd1", "help text for test_1_cmd1"},
   114  			[]string{"aTest1", "a_test_1_cmd2", "help text for test_1_cmd2"},
   115  			[]string{"BTest2", "B_test_2_cmd1", "help text for test_2_cmd1"},
   116  		))
   117  
   118  		Expect(ui.Outputs()[6]).To(ContainSubstring("Test2"))
   119  	})
   120  
   121  	It("lists the name of the command, it's alias and version", func() {
   122  		config.PluginsReturns(map[string]pluginconfig.PluginMetadata{
   123  			"Test1": {
   124  				Location: "path/to/plugin",
   125  				Version:  plugin.VersionType{Major: 1, Minor: 2, Build: 3},
   126  				Commands: []plugin.Command{
   127  					{Name: "test_1_cmd1", Alias: "test_1_cmd1_alias", HelpText: "help text for test_1_cmd1"},
   128  					{Name: "test_1_cmd2", Alias: "test_1_cmd2_alias", HelpText: "help text for test_1_cmd2"},
   129  				},
   130  			},
   131  		})
   132  
   133  		runCommand()
   134  
   135  		Expect(ui.Outputs()).To(ContainSubstrings(
   136  			[]string{"Test1", "test_1_cmd1", "1.2.3", ", test_1_cmd1_alias", "help text for test_1_cmd1"},
   137  			[]string{"Test1", "test_1_cmd2", "1.2.3", ", test_1_cmd2_alias", "help text for test_1_cmd2"},
   138  		))
   139  	})
   140  
   141  	It("lists 'N/A' as version when plugin does not provide a version", func() {
   142  		config.PluginsReturns(map[string]pluginconfig.PluginMetadata{
   143  			"Test1": {
   144  				Location: "path/to/plugin",
   145  				Commands: []plugin.Command{
   146  					{Name: "test_1_cmd1", Alias: "test_1_cmd1_alias", HelpText: "help text for test_1_cmd1"},
   147  				},
   148  			},
   149  		})
   150  
   151  		runCommand()
   152  
   153  		Expect(ui.Outputs()).To(ContainSubstrings(
   154  			[]string{"Test1", "test_1_cmd1", "N/A", ", test_1_cmd1_alias", "help text for test_1_cmd1"},
   155  		))
   156  	})
   157  
   158  	It("does not list the plugin when it provides no available commands", func() {
   159  		config.PluginsReturns(map[string]pluginconfig.PluginMetadata{
   160  			"EmptyPlugin": {Location: "../../../fixtures/plugins/empty_plugin.exe"},
   161  		})
   162  
   163  		runCommand()
   164  		Expect(ui.Outputs()).NotTo(ContainSubstrings(
   165  			[]string{"EmptyPlugin"},
   166  		))
   167  	})
   168  
   169  	It("list multiple plugins and their associated commands", func() {
   170  		config.PluginsReturns(map[string]pluginconfig.PluginMetadata{
   171  			"Test1": {Location: "path/to/plugin1", Commands: []plugin.Command{{Name: "test_1_cmd1", HelpText: "help text for test_1_cmd1"}}},
   172  			"Test2": {Location: "path/to/plugin2", Commands: []plugin.Command{{Name: "test_2_cmd1", HelpText: "help text for test_2_cmd1"}}},
   173  		})
   174  
   175  		runCommand()
   176  		Expect(ui.Outputs()).To(ContainSubstrings(
   177  			[]string{"Test1", "test_1_cmd1", "help text for test_1_cmd1"},
   178  			[]string{"Test2", "test_2_cmd1", "help text for test_2_cmd1"},
   179  		))
   180  	})
   181  })