code.cloudfoundry.org/cli@v7.1.0+incompatible/cf/commands/api_test.go (about) 1 package commands_test 2 3 import ( 4 "fmt" 5 6 "code.cloudfoundry.org/cli/cf" 7 "code.cloudfoundry.org/cli/cf/commandregistry" 8 "code.cloudfoundry.org/cli/cf/configuration/coreconfig" 9 "code.cloudfoundry.org/cli/cf/errors" 10 testconfig "code.cloudfoundry.org/cli/cf/util/testhelpers/configuration" 11 testterm "code.cloudfoundry.org/cli/cf/util/testhelpers/terminal" 12 . "github.com/onsi/ginkgo" 13 . "github.com/onsi/gomega" 14 15 "code.cloudfoundry.org/cli/cf/api" 16 "code.cloudfoundry.org/cli/cf/commands" 17 "code.cloudfoundry.org/cli/cf/configuration/coreconfig/coreconfigfakes" 18 "code.cloudfoundry.org/cli/cf/flags" 19 . "code.cloudfoundry.org/cli/cf/util/testhelpers/matchers" 20 ) 21 22 var _ = Describe("Api", func() { 23 var ( 24 config coreconfig.Repository 25 endpointRepo *coreconfigfakes.FakeEndpointRepository 26 deps commandregistry.Dependency 27 ui *testterm.FakeUI 28 cmd commands.API 29 flagContext flags.FlagContext 30 repoLocator api.RepositoryLocator 31 runCLIErr error 32 ) 33 34 callApi := func(args []string) { 35 err := flagContext.Parse(args...) 36 Expect(err).NotTo(HaveOccurred()) 37 38 runCLIErr = cmd.Execute(flagContext) 39 } 40 41 BeforeEach(func() { 42 ui = new(testterm.FakeUI) 43 config = testconfig.NewRepository() 44 endpointRepo = new(coreconfigfakes.FakeEndpointRepository) 45 46 endpointRepo.GetCCInfoStub = func(endpoint string) (*coreconfig.CCInfo, string, error) { 47 return &coreconfig.CCInfo{ 48 APIVersion: config.APIVersion(), 49 AuthorizationEndpoint: config.AuthenticationEndpoint(), 50 MinCLIVersion: config.MinCLIVersion(), 51 MinRecommendedCLIVersion: config.MinRecommendedCLIVersion(), 52 SSHOAuthClient: config.SSHOAuthClient(), 53 RoutingAPIEndpoint: config.RoutingAPIEndpoint(), 54 }, endpoint, nil 55 } 56 57 repoLocator = api.RepositoryLocator{}.SetEndpointRepository(endpointRepo) 58 59 deps = commandregistry.Dependency{ 60 UI: ui, 61 Config: config, 62 RepoLocator: repoLocator, 63 } 64 65 cmd = commands.API{}.SetDependency(deps, false).(commands.API) 66 flagContext = flags.NewFlagContext(cmd.MetaData().Flags) 67 }) 68 69 Context("when the api endpoint's ssl certificate is invalid", func() { 70 It("warns the user and prints out a tip", func() { 71 endpointRepo.GetCCInfoReturns(nil, "", errors.NewInvalidSSLCert("https://buttontomatoes.org", "why? no. go away")) 72 73 callApi([]string{"https://buttontomatoes.org"}) 74 Expect(runCLIErr).To(HaveOccurred()) 75 Expect(runCLIErr.Error()).To(ContainSubstring("Invalid SSL Cert for https://buttontomatoes.org")) 76 Expect(runCLIErr.Error()).To(ContainSubstring("TIP")) 77 Expect(runCLIErr.Error()).To(ContainSubstring("--skip-ssl-validation")) 78 }) 79 }) 80 81 Context("when the user does not provide an endpoint", func() { 82 Context("when the endpoint is set in the config", func() { 83 BeforeEach(func() { 84 config.SetAPIEndpoint("https://api.run.pivotal.io") 85 config.SetAPIVersion("2.0") 86 config.SetSSLDisabled(true) 87 }) 88 89 It("prints out the api endpoint and appropriately sets the config", func() { 90 callApi([]string{}) 91 92 Expect(ui.Outputs()).To(ContainSubstrings([]string{"https://api.run.pivotal.io", "2.0"})) 93 Expect(config.IsSSLDisabled()).To(BeTrue()) 94 }) 95 96 Context("when the --unset flag is passed", func() { 97 It("unsets the APIEndpoint", func() { 98 callApi([]string{"--unset"}) 99 100 Expect(ui.Outputs()).To(ContainSubstrings( 101 []string{"Unsetting api endpoint..."}, 102 []string{"OK"}, 103 []string{"No api endpoint set."}, 104 )) 105 Expect(config.APIEndpoint()).To(Equal("")) 106 }) 107 }) 108 }) 109 110 Context("when the endpoint is not set in the config", func() { 111 It("prompts the user to set an endpoint", func() { 112 callApi([]string{}) 113 114 Expect(ui.Outputs()).To(ContainSubstrings( 115 []string{"No api endpoint set", fmt.Sprintf("Use '%s api' to set an endpoint", cf.Name)}, 116 )) 117 }) 118 }) 119 }) 120 121 Context("when the user provides the --skip-ssl-validation flag", func() { 122 It("updates the SSLDisabled field in config", func() { 123 config.SetSSLDisabled(false) 124 callApi([]string{"--skip-ssl-validation", "https://example.com"}) 125 126 Expect(config.IsSSLDisabled()).To(Equal(true)) 127 }) 128 }) 129 130 Context("the user provides an endpoint", func() { 131 Describe("when the user passed in the skip-ssl-validation flag", func() { 132 It("disables SSL validation in the config", func() { 133 callApi([]string{"--skip-ssl-validation", "https://example.com"}) 134 135 Expect(endpointRepo.GetCCInfoCallCount()).To(Equal(1)) 136 Expect(endpointRepo.GetCCInfoArgsForCall(0)).To(Equal("https://example.com")) 137 Expect(config.IsSSLDisabled()).To(BeTrue()) 138 }) 139 }) 140 141 Context("when the user passed in the unset flag", func() { 142 Context("when the config.APIEndpoint is set", func() { 143 BeforeEach(func() { 144 config.SetAPIEndpoint("some-silly-thing") 145 }) 146 147 It("unsets the APIEndpoint", func() { 148 callApi([]string{"--unset", "https://example.com"}) 149 150 Expect(ui.Outputs()).To(ContainSubstrings( 151 []string{"Unsetting api endpoint..."}, 152 []string{"OK"}, 153 []string{"No api endpoint set."}, 154 )) 155 Expect(config.APIEndpoint()).To(Equal("")) 156 }) 157 }) 158 159 Context("when the config.APIEndpoint is empty", func() { 160 It("unsets the APIEndpoint", func() { 161 callApi([]string{"--unset", "https://example.com"}) 162 163 Expect(ui.Outputs()).To(ContainSubstrings( 164 []string{"Unsetting api endpoint..."}, 165 []string{"OK"}, 166 []string{"No api endpoint set."}, 167 )) 168 Expect(config.APIEndpoint()).To(Equal("")) 169 }) 170 }) 171 172 }) 173 174 Context("when the ssl certificate is valid", func() { 175 It("updates the api endpoint with the given url", func() { 176 callApi([]string{"https://example.com"}) 177 Expect(endpointRepo.GetCCInfoCallCount()).To(Equal(1)) 178 Expect(endpointRepo.GetCCInfoArgsForCall(0)).To(Equal("https://example.com")) 179 Expect(ui.Outputs()).To(ContainSubstrings( 180 []string{"Setting api endpoint to", "example.com"}, 181 []string{"OK"}, 182 )) 183 }) 184 185 It("trims trailing slashes from the api endpoint", func() { 186 callApi([]string{"https://example.com/"}) 187 Expect(endpointRepo.GetCCInfoCallCount()).To(Equal(1)) 188 Expect(endpointRepo.GetCCInfoArgsForCall(0)).To(Equal("https://example.com")) 189 Expect(ui.Outputs()).To(ContainSubstrings( 190 []string{"Setting api endpoint to", "example.com"}, 191 []string{"OK"}, 192 )) 193 }) 194 }) 195 196 Context("when the ssl certificate is invalid", func() { 197 BeforeEach(func() { 198 endpointRepo.GetCCInfoReturns(nil, "", errors.NewInvalidSSLCert("https://example.com", "it don't work")) 199 }) 200 201 It("fails and gives the user a helpful message about skipping", func() { 202 callApi([]string{"https://example.com"}) 203 Expect(runCLIErr).To(HaveOccurred()) 204 Expect(runCLIErr.Error()).To(ContainSubstring("Invalid SSL Cert")) 205 Expect(runCLIErr.Error()).To(ContainSubstring("https://example.com")) 206 Expect(runCLIErr.Error()).To(ContainSubstring("TIP")) 207 208 Expect(config.APIEndpoint()).To(Equal("")) 209 }) 210 }) 211 212 Describe("unencrypted http endpoints", func() { 213 It("warns the user", func() { 214 callApi([]string{"http://example.com"}) 215 Expect(ui.Outputs()).To(ContainSubstrings([]string{"Warning"})) 216 }) 217 }) 218 }) 219 })