github.com/cloudfoundry/cli@v7.1.0+incompatible/integration/shared/plugin/plugins_command_test.go (about)

     1  package plugin
     2  
     3  import (
     4  	"os"
     5  	"path/filepath"
     6  
     7  	"code.cloudfoundry.org/cli/integration/helpers"
     8  	"code.cloudfoundry.org/cli/util/generic"
     9  	. "github.com/onsi/ginkgo"
    10  	. "github.com/onsi/gomega"
    11  	. "github.com/onsi/gomega/gbytes"
    12  	. "github.com/onsi/gomega/gexec"
    13  	. "github.com/onsi/gomega/ghttp"
    14  )
    15  
    16  var _ = Describe("plugins command", func() {
    17  	Describe("help", func() {
    18  		When("--help flag is provided", func() {
    19  			It("displays command usage to output", func() {
    20  				session := helpers.CF("plugins", "--help")
    21  				Eventually(session).Should(Say("NAME:"))
    22  				Eventually(session).Should(Say("plugins - List commands of installed plugins"))
    23  				Eventually(session).Should(Say("USAGE:"))
    24  				Eventually(session).Should(Say("cf plugins [--checksum | --outdated]"))
    25  				Eventually(session).Should(Say("OPTIONS:"))
    26  				Eventually(session).Should(Say(`--checksum\s+Compute and show the sha1 value of the plugin binary file`))
    27  				Eventually(session).Should(Say(`--outdated\s+Search the plugin repositories for new versions of installed plugins`))
    28  				Eventually(session).Should(Say("SEE ALSO:"))
    29  				Eventually(session).Should(Say("install-plugin, repo-plugins, uninstall-plugin"))
    30  				Eventually(session).Should(Exit(0))
    31  			})
    32  		})
    33  	})
    34  
    35  	When("no plugins are installed", func() {
    36  		It("displays an empty table", func() {
    37  			session := helpers.CF("plugins")
    38  			Eventually(session).Should(Say("Listing installed plugins..."))
    39  			Eventually(session).Should(Say(""))
    40  			Eventually(session).Should(Say(`plugin\s+version\s+command name\s+command help`))
    41  			Eventually(session).Should(Say(""))
    42  			Eventually(session).Should(Say(`Use 'cf repo-plugins' to list plugins in registered repos available to install\.`))
    43  			Consistently(session).ShouldNot(Say("[a-za-z0-9]+"))
    44  			Eventually(session).Should(Exit(0))
    45  		})
    46  
    47  		When("the --checksum flag is provided", func() {
    48  			It("displays an empty checksum table", func() {
    49  				session := helpers.CF("plugins", "--checksum")
    50  				Eventually(session).Should(Say("Computing sha1 for installed plugins, this may take a while..."))
    51  				Eventually(session).Should(Say(""))
    52  				Eventually(session).Should(Say(`plugin\s+version\s+sha1`))
    53  				Consistently(session).ShouldNot(Say("[a-za-z0-9]+"))
    54  				Eventually(session).Should(Exit(0))
    55  			})
    56  		})
    57  
    58  		When("the --outdated flag is provided", func() {
    59  			It("errors with no repositories", func() {
    60  				session := helpers.CF("plugins", "--outdated")
    61  				Eventually(session).Should(Say("FAILED"))
    62  				Eventually(session.Err).Should(Say("No plugin repositories registered to search for plugin updates."))
    63  
    64  				Eventually(session).Should(Exit(1))
    65  			})
    66  		})
    67  	})
    68  
    69  	When("plugins are installed", func() {
    70  		When("there are multiple plugins", func() {
    71  			BeforeEach(func() {
    72  				helpers.InstallConfigurablePlugin("configurable_plugin", "I-should-be-sorted-first", "1.2.0", []helpers.PluginCommand{
    73  					{Name: "command-1", Help: "some-command-1"},
    74  					{Name: "Better-command", Help: "some-better-command"},
    75  					{Name: "command-2", Help: "some-command-2"},
    76  				})
    77  				helpers.InstallConfigurablePlugin("configurable_plugin", "sorted-third", "2.0.1", []helpers.PluginCommand{
    78  					{Name: "banana-command", Help: "banana-command"},
    79  				})
    80  				helpers.InstallConfigurablePlugin("configurable_plugin", "i-should-be-sorted-second", "1.0.0", []helpers.PluginCommand{
    81  					{Name: "some-command", Help: "some-command"},
    82  					{Name: "Some-other-command", Help: "some-other-command"},
    83  				})
    84  			})
    85  
    86  			It("displays the installed plugins in alphabetical order", func() {
    87  				session := helpers.CF("plugins")
    88  				Eventually(session).Should(Say("Listing installed plugins..."))
    89  				Eventually(session).Should(Say(""))
    90  				Eventually(session).Should(Say(`plugin\s+version\s+command name\s+command help`))
    91  				Eventually(session).Should(Say(`I-should-be-sorted-first\s+1\.2\.0\s+Better-command\s+some-better-command`))
    92  				Eventually(session).Should(Say(`I-should-be-sorted-first\s+1\.2\.0\s+command-1\s+some-command-1`))
    93  				Eventually(session).Should(Say(`I-should-be-sorted-first\s+1\.2\.0\s+command-2\s+some-command-2`))
    94  				Eventually(session).Should(Say(`i-should-be-sorted-second\s+1\.0\.0\s+some-command\s+some-command`))
    95  				Eventually(session).Should(Say(`i-should-be-sorted-second\s+1\.0\.0\s+Some-other-command\s+some-other-command`))
    96  				Eventually(session).Should(Say(`sorted-third\s+2\.0\.1\s+banana-command\s+banana-command`))
    97  				Eventually(session).Should(Say(""))
    98  				Eventually(session).Should(Say(`Use 'cf repo-plugins' to list plugins in registered repos available to install\.`))
    99  				Eventually(session).Should(Exit(0))
   100  			})
   101  		})
   102  
   103  		When("plugin version information is 0.0.0", func() {
   104  			BeforeEach(func() {
   105  				helpers.InstallConfigurablePlugin("configurable_plugin", "some-plugin", "0.0.0", []helpers.PluginCommand{
   106  					{Name: "banana-command", Help: "banana-command"},
   107  				})
   108  			})
   109  
   110  			It("displays N/A for the plugin's version", func() {
   111  				session := helpers.CF("plugins")
   112  				Eventually(session).Should(Say(`some-plugin\s+N/A`))
   113  				Eventually(session).Should(Exit(0))
   114  			})
   115  		})
   116  
   117  		When("a plugin command has an alias", func() {
   118  			BeforeEach(func() {
   119  				helpers.InstallConfigurablePlugin("configurable_plugin", "some-plugin", "1.0.0", []helpers.PluginCommand{
   120  					{Name: "banana-command", Alias: "bc", Help: "banana-command"},
   121  				})
   122  			})
   123  
   124  			It("displays the command name and it's alias", func() {
   125  				session := helpers.CF("plugins")
   126  				Eventually(session).Should(Say(`some-plugin\s+1\.0\.0\s+banana-command, bc`))
   127  				Eventually(session).Should(Exit(0))
   128  			})
   129  		})
   130  
   131  		When("the --checksum flag is provided", func() {
   132  			var installedPluginPath string
   133  
   134  			BeforeEach(func() {
   135  				helpers.InstallConfigurablePlugin("configurable_plugin", "some-plugin", "1.0.0", []helpers.PluginCommand{
   136  					{Name: "banana-command", Help: "banana-command"},
   137  				})
   138  				installedPluginPath = generic.ExecutableFilename(filepath.Join(homeDir, ".cf", "plugins", "some-plugin"))
   139  			})
   140  
   141  			It("displays the sha1 value for each installed plugin", func() {
   142  				calculatedSha := helpers.Sha1Sum(installedPluginPath)
   143  				session := helpers.CF("plugins", "--checksum")
   144  				Eventually(session).Should(Say("Computing sha1 for installed plugins, this may take a while..."))
   145  				Eventually(session).Should(Say(""))
   146  				Eventually(session).Should(Say(`plugin\s+version\s+sha1`))
   147  				Eventually(session).Should(Say(`some-plugin\s+1\.0\.0\s+%s`, calculatedSha))
   148  				Eventually(session).Should(Exit(0))
   149  			})
   150  
   151  			When("an error is encountered calculating the sha1 value", func() {
   152  				It("displays N/A for the plugin's sha1", func() {
   153  					err := os.Remove(installedPluginPath)
   154  					Expect(err).NotTo(HaveOccurred())
   155  
   156  					session := helpers.CF("plugins", "--checksum")
   157  					Eventually(session).Should(Say(`some-plugin\s+1\.0\.0\s+N/A`))
   158  					Eventually(session).Should(Exit(0))
   159  				})
   160  			})
   161  		})
   162  
   163  		When("the --outdated flag is provided", func() {
   164  			When("there are no repos", func() {
   165  				BeforeEach(func() {
   166  					helpers.InstallConfigurablePlugin("configurable_plugin", "some-plugin", "1.0.0", []helpers.PluginCommand{
   167  						{Name: "banana-command", Alias: "bc", Help: "banana-command"},
   168  					})
   169  				})
   170  
   171  				It("aborts with error 'No plugin repositories added' and exit code 1", func() {
   172  					session := helpers.CF("plugins", "--outdated")
   173  					Eventually(session).Should(Say("FAILED"))
   174  					Eventually(session.Err).Should(Say("No plugin repositories registered to search for plugin updates."))
   175  					Eventually(session).Should(Exit(1))
   176  				})
   177  			})
   178  
   179  			When("there is 1 repository", func() {
   180  				var (
   181  					server1 *Server
   182  				)
   183  
   184  				BeforeEach(func() {
   185  					server1 = helpers.NewPluginRepositoryTLSServer(helpers.PluginRepository{
   186  						Plugins: []helpers.Plugin{
   187  							{Name: "plugin-1", Version: "1.0.0"},
   188  							{Name: "plugin-2", Version: "2.0.0"},
   189  						},
   190  					})
   191  
   192  					Eventually(helpers.CF("add-plugin-repo", "repo1", server1.URL(), "-k")).Should(Exit(0))
   193  					// TODO: re-add when refactor repo-plugins
   194  					// session := helpers.CF("repo-plugins")
   195  					// Eventually(session).Should(Say(`plugin-1\s+1\.0\.0`))
   196  					// Eventually(session).Should(Say(`plugin-2\s+2\.0\.0`))
   197  					// Eventually(session).Should(Exit(0))
   198  				})
   199  
   200  				AfterEach(func() {
   201  					server1.Close()
   202  				})
   203  
   204  				When("nothing is outdated", func() {
   205  					BeforeEach(func() {
   206  						helpers.InstallConfigurablePlugin("configurable_plugin", "plugin-1", "1.0.0", []helpers.PluginCommand{
   207  							{Name: "banana-command-1", Help: "banana-command"},
   208  						})
   209  						helpers.InstallConfigurablePlugin("configurable_plugin", "plugin-2", "2.0.0", []helpers.PluginCommand{
   210  							{Name: "banana-command-2", Help: "banana-command"},
   211  						})
   212  					})
   213  
   214  					AfterEach(func() {
   215  						Eventually(helpers.CF("uninstall-plugin", "plugin-1")).Should(Exit(0))
   216  						Eventually(helpers.CF("uninstall-plugin", "plugin-2")).Should(Exit(0))
   217  					})
   218  
   219  					It("displays an empty table", func() {
   220  						session := helpers.CF("plugins", "--outdated", "-k")
   221  						Eventually(session).Should(Say("Searching repo1 for newer versions of installed plugins..."))
   222  						Eventually(session).Should(Say(""))
   223  						Eventually(session).Should(Say(`plugin\s+version\s+latest version\n\nUse 'cf install-plugin' to update a plugin to the latest version\.`))
   224  						Eventually(session).Should(Exit(0))
   225  					})
   226  				})
   227  
   228  				When("the plugins are outdated", func() {
   229  					BeforeEach(func() {
   230  						helpers.InstallConfigurablePlugin("configurable_plugin", "plugin-1", "0.9.0", []helpers.PluginCommand{
   231  							{Name: "banana-command-1", Help: "banana-command"},
   232  						})
   233  						helpers.InstallConfigurablePlugin("configurable_plugin", "plugin-2", "1.9.0", []helpers.PluginCommand{
   234  							{Name: "banana-command-2", Help: "banana-command"},
   235  						})
   236  					})
   237  
   238  					AfterEach(func() {
   239  						Eventually(helpers.CF("uninstall-plugin", "plugin-1")).Should(Exit(0))
   240  						Eventually(helpers.CF("uninstall-plugin", "plugin-2")).Should(Exit(0))
   241  					})
   242  
   243  					It("displays the table with outdated plugin and new version", func() {
   244  						session := helpers.CF("plugins", "--outdated", "-k")
   245  						Eventually(session).Should(Say("Searching repo1 for newer versions of installed plugins..."))
   246  						Eventually(session).Should(Say(""))
   247  						Eventually(session).Should(Say(`plugin\s+version\s+latest version`))
   248  						Eventually(session).Should(Say(`plugin-1\s+0\.9\.0\s+1\.0\.0`))
   249  						Eventually(session).Should(Say(`plugin-2\s+1\.9\.0\s+2\.0\.0`))
   250  						Eventually(session).Should(Say(""))
   251  						Eventually(session).Should(Say(`Use 'cf install-plugin' to update a plugin to the latest version\.`))
   252  						Eventually(session).Should(Exit(0))
   253  					})
   254  				})
   255  			})
   256  
   257  			When("multiple repositories are registered", func() {
   258  				var (
   259  					server1 *Server
   260  					server2 *Server
   261  				)
   262  
   263  				BeforeEach(func() {
   264  					server1 = helpers.NewPluginRepositoryTLSServer(helpers.PluginRepository{
   265  						Plugins: []helpers.Plugin{
   266  							{Name: "plugin-1", Version: "1.0.0"},
   267  							{Name: "plugin-3", Version: "3.5.0"},
   268  						},
   269  					})
   270  
   271  					server2 = helpers.NewPluginRepositoryTLSServer(helpers.PluginRepository{
   272  						Plugins: []helpers.Plugin{
   273  							{Name: "plugin-2", Version: "2.0.0"},
   274  							{Name: "plugin-3", Version: "3.0.0"},
   275  						},
   276  					})
   277  
   278  					Eventually(helpers.CF("add-plugin-repo", "repo1", server1.URL(), "-k")).Should(Exit(0))
   279  					Eventually(helpers.CF("add-plugin-repo", "repo2", server2.URL(), "-k")).Should(Exit(0))
   280  				})
   281  
   282  				AfterEach(func() {
   283  					server1.Close()
   284  					server2.Close()
   285  				})
   286  
   287  				When("plugins are outdated", func() {
   288  					BeforeEach(func() {
   289  						helpers.InstallConfigurablePlugin("configurable_plugin", "plugin-1", "0.9.0", []helpers.PluginCommand{
   290  							{Name: "banana-command-1", Help: "banana-command"},
   291  						})
   292  						helpers.InstallConfigurablePlugin("configurable_plugin", "plugin-2", "1.9.0", []helpers.PluginCommand{
   293  							{Name: "banana-command-2", Help: "banana-command"},
   294  						})
   295  					})
   296  
   297  					It("displays the table with outdated plugin and new version", func() {
   298  						session := helpers.CF("plugins", "--outdated", "-k")
   299  						Eventually(session).Should(Say("Searching repo1, repo2 for newer versions of installed plugins..."))
   300  						Eventually(session).Should(Say(`plugin\s+version\s+latest version`))
   301  						Eventually(session).Should(Say(`plugin-1\s+0\.9\.0\s+1\.0\.0`))
   302  						Eventually(session).Should(Say(`plugin-2\s+1\.9\.0\s+2\.0\.0`))
   303  						Eventually(session).Should(Say(""))
   304  						Eventually(session).Should(Say(`Use 'cf install-plugin' to update a plugin to the latest version\.`))
   305  						Eventually(session).Should(Exit(0))
   306  					})
   307  				})
   308  
   309  				When("the same plugin is outdated from multiple repositories", func() {
   310  					BeforeEach(func() {
   311  						helpers.InstallConfigurablePlugin("configurable_plugin", "plugin-1", "0.9.0", []helpers.PluginCommand{
   312  							{Name: "banana-command-1", Help: "banana-command"},
   313  						})
   314  						helpers.InstallConfigurablePlugin("configurable_plugin", "plugin-2", "1.9.0", []helpers.PluginCommand{
   315  							{Name: "banana-command-2", Help: "banana-command"},
   316  						})
   317  						helpers.InstallConfigurablePlugin("configurable_plugin", "plugin-3", "2.9.0", []helpers.PluginCommand{
   318  							{Name: "banana-command-3", Help: "banana-command"},
   319  						})
   320  					})
   321  
   322  					It("only displays the newest version of the plugin found in the repositories", func() {
   323  						session := helpers.CF("plugins", "--outdated", "-k")
   324  						Eventually(session).Should(Say("Searching repo1, repo2 for newer versions of installed plugins..."))
   325  						Eventually(session).Should(Say(""))
   326  						Eventually(session).Should(Say(`plugin\s+version\s+latest version`))
   327  						Eventually(session).Should(Say(`plugin-1\s+0\.9\.0\s+1\.0\.0`))
   328  						Eventually(session).Should(Say(`plugin-2\s+1\.9\.0\s+2\.0\.0`))
   329  						Eventually(session).Should(Say(`plugin-3\s+2\.9\.0\s+3\.5\.0`))
   330  						Eventually(session).Should(Say(""))
   331  						Eventually(session).Should(Say(`Use 'cf install-plugin' to update a plugin to the latest version\.`))
   332  						Eventually(session).Should(Exit(0))
   333  					})
   334  				})
   335  			})
   336  		})
   337  	})
   338  })