github.com/swisscom/cloudfoundry-cli@v7.1.0+incompatible/cf/commands/help_test.go (about)

     1  package commands_test
     2  
     3  import (
     4  	"strings"
     5  
     6  	"code.cloudfoundry.org/cli/cf/commandregistry"
     7  	"code.cloudfoundry.org/cli/cf/commands"
     8  	"code.cloudfoundry.org/cli/cf/commandsloader"
     9  	"code.cloudfoundry.org/cli/cf/configuration/pluginconfig"
    10  	"code.cloudfoundry.org/cli/cf/configuration/pluginconfig/pluginconfigfakes"
    11  	"code.cloudfoundry.org/cli/cf/i18n"
    12  	"code.cloudfoundry.org/cli/plugin"
    13  
    14  	"code.cloudfoundry.org/cli/cf/flags"
    15  	"code.cloudfoundry.org/cli/cf/terminal/terminalfakes"
    16  	. "github.com/onsi/ginkgo"
    17  	. "github.com/onsi/gomega"
    18  	"github.com/onsi/gomega/gbytes"
    19  )
    20  
    21  var _ = Describe("Help", func() {
    22  
    23  	commandsloader.Load()
    24  
    25  	var (
    26  		fakeUI     *terminalfakes.FakeUI
    27  		fakeConfig *pluginconfigfakes.FakePluginConfiguration
    28  		deps       commandregistry.Dependency
    29  
    30  		cmd         *commands.Help
    31  		flagContext flags.FlagContext
    32  		buffer      *gbytes.Buffer
    33  	)
    34  
    35  	BeforeEach(func() {
    36  		buffer = gbytes.NewBuffer()
    37  		fakeUI = new(terminalfakes.FakeUI)
    38  		fakeUI.WriterReturns(buffer)
    39  
    40  		fakeConfig = new(pluginconfigfakes.FakePluginConfiguration)
    41  
    42  		deps = commandregistry.Dependency{
    43  			UI:           fakeUI,
    44  			PluginConfig: fakeConfig,
    45  		}
    46  
    47  		cmd = &commands.Help{}
    48  		cmd.SetDependency(deps, false)
    49  
    50  		flagContext = flags.NewFlagContext(cmd.MetaData().Flags)
    51  	})
    52  
    53  	AfterEach(func() {
    54  		buffer.Close()
    55  	})
    56  
    57  	Context("when no argument is provided", func() {
    58  		It("prints the main help menu of the 'cf' app", func() {
    59  			flagContext.Parse()
    60  			err := cmd.Execute(flagContext)
    61  			Expect(err).NotTo(HaveOccurred())
    62  
    63  			Eventually(buffer.Contents).Should(ContainSubstring("A command line tool to interact with Cloud Foundry"))
    64  			Eventually(buffer).Should(gbytes.Say("CF_TRACE=true"))
    65  		})
    66  	})
    67  
    68  	Context("when a command name is provided as an argument", func() {
    69  		Context("When the command exists", func() {
    70  			It("prints the usage help for the command", func() {
    71  				flagContext.Parse("target")
    72  				err := cmd.Execute(flagContext)
    73  				Expect(err).NotTo(HaveOccurred())
    74  
    75  				Expect(fakeUI.SayCallCount()).To(Equal(1))
    76  				output, _ := fakeUI.SayArgsForCall(0)
    77  				Expect(output).To(ContainSubstring("target - Set or view the targeted org or space"))
    78  			})
    79  
    80  			Context("i18n translations", func() {
    81  				var originalT func(string, ...interface{}) string
    82  
    83  				BeforeEach(func() {
    84  					originalT = i18n.T
    85  				})
    86  
    87  				AfterEach(func() {
    88  					i18n.T = originalT
    89  				})
    90  
    91  				It("includes ':' in caption translation strings for language like French to be translated correctly", func() {
    92  					nameCaption := "NAME:"
    93  					aliasCaption := "ALIAS:"
    94  					usageCaption := "USAGE:"
    95  					optionsCaption := "OPTIONS:"
    96  					captionCheckCount := 0
    97  
    98  					i18n.T = func(translationID string, args ...interface{}) string {
    99  						if strings.HasPrefix(translationID, "NAME") {
   100  							Expect(translationID).To(Equal(nameCaption))
   101  							captionCheckCount += 1
   102  						} else if strings.HasPrefix(translationID, "ALIAS") {
   103  							Expect(translationID).To(Equal(aliasCaption))
   104  							captionCheckCount += 1
   105  						} else if strings.HasPrefix(translationID, "USAGE") {
   106  							Expect(translationID).To(Equal(usageCaption))
   107  							captionCheckCount += 1
   108  						} else if strings.HasPrefix(translationID, "OPTIONS") {
   109  							Expect(translationID).To(Equal(optionsCaption))
   110  							captionCheckCount += 1
   111  						}
   112  
   113  						return translationID
   114  					}
   115  
   116  					flagContext.Parse("target")
   117  					err := cmd.Execute(flagContext)
   118  					Expect(err).NotTo(HaveOccurred())
   119  
   120  					Expect(captionCheckCount).To(Equal(4))
   121  				})
   122  			})
   123  		})
   124  
   125  		Context("When the command does not exists", func() {
   126  			It("prints the usage help for the command", func() {
   127  				flagContext.Parse("bad-command")
   128  				err := cmd.Execute(flagContext)
   129  				Expect(err.Error()).To(Equal("'bad-command' is not a registered command. See 'cf help -a'"))
   130  			})
   131  		})
   132  	})
   133  
   134  	Context("when a command provided is a plugin command", func() {
   135  		BeforeEach(func() {
   136  			m := make(map[string]pluginconfig.PluginMetadata)
   137  			m["fakePlugin"] = pluginconfig.PluginMetadata{
   138  				Commands: []plugin.Command{
   139  					{
   140  						Name:     "fakePluginCmd1",
   141  						Alias:    "fpc1",
   142  						HelpText: "help text here",
   143  						UsageDetails: plugin.Usage{
   144  							Usage: "Usage for fpc1",
   145  							Options: map[string]string{
   146  								"f": "test flag",
   147  							},
   148  						},
   149  					},
   150  				},
   151  			}
   152  
   153  			fakeConfig.PluginsReturns(m)
   154  		})
   155  
   156  		Context("command is a plugin command name", func() {
   157  			It("prints the usage help for the command", func() {
   158  				flagContext.Parse("fakePluginCmd1")
   159  				err := cmd.Execute(flagContext)
   160  				Expect(err).NotTo(HaveOccurred())
   161  
   162  				Expect(fakeUI.SayCallCount()).To(Equal(1))
   163  				output, _ := fakeUI.SayArgsForCall(0)
   164  				Expect(output).To(ContainSubstring("fakePluginCmd1"))
   165  				Expect(output).To(ContainSubstring("help text here"))
   166  				Expect(output).To(ContainSubstring("ALIAS"))
   167  				Expect(output).To(ContainSubstring("fpc1"))
   168  				Expect(output).To(ContainSubstring("USAGE"))
   169  				Expect(output).To(ContainSubstring("Usage for fpc1"))
   170  				Expect(output).To(ContainSubstring("OPTIONS"))
   171  				Expect(output).To(ContainSubstring("-f"))
   172  				Expect(output).To(ContainSubstring("test flag"))
   173  			})
   174  		})
   175  
   176  		Context("command is a plugin command alias", func() {
   177  			It("prints the usage help for the command alias", func() {
   178  				flagContext.Parse("fpc1")
   179  				err := cmd.Execute(flagContext)
   180  				Expect(err).NotTo(HaveOccurred())
   181  
   182  				Expect(fakeUI.SayCallCount()).To(Equal(1))
   183  				output, _ := fakeUI.SayArgsForCall(0)
   184  				Expect(output).To(ContainSubstring("fakePluginCmd1"))
   185  				Expect(output).To(ContainSubstring("help text here"))
   186  				Expect(output).To(ContainSubstring("ALIAS"))
   187  				Expect(output).To(ContainSubstring("fpc1"))
   188  				Expect(output).To(ContainSubstring("USAGE"))
   189  				Expect(output).To(ContainSubstring("Usage for fpc1"))
   190  				Expect(output).To(ContainSubstring("OPTIONS"))
   191  				Expect(output).To(ContainSubstring("-f"))
   192  				Expect(output).To(ContainSubstring("test flag"))
   193  			})
   194  		})
   195  
   196  	})
   197  })