github.com/loggregator/cli@v6.33.1-0.20180224010324-82334f081791+incompatible/cf/commands/pluginrepo/add_plugin_repo_test.go (about) 1 package pluginrepo_test 2 3 import ( 4 "fmt" 5 "net/http" 6 "net/http/httptest" 7 8 testcmd "code.cloudfoundry.org/cli/util/testhelpers/commands" 9 testconfig "code.cloudfoundry.org/cli/util/testhelpers/configuration" 10 testterm "code.cloudfoundry.org/cli/util/testhelpers/terminal" 11 12 "code.cloudfoundry.org/cli/cf/commandregistry" 13 "code.cloudfoundry.org/cli/cf/configuration/coreconfig" 14 "code.cloudfoundry.org/cli/cf/models" 15 "code.cloudfoundry.org/cli/cf/requirements/requirementsfakes" 16 . "code.cloudfoundry.org/cli/util/testhelpers/matchers" 17 18 . "github.com/onsi/ginkgo" 19 . "github.com/onsi/gomega" 20 ) 21 22 var _ = Describe("add-plugin-repo", func() { 23 var ( 24 ui *testterm.FakeUI 25 config coreconfig.Repository 26 requirementsFactory *requirementsfakes.FakeFactory 27 testServer *httptest.Server 28 deps commandregistry.Dependency 29 ) 30 31 updateCommandDependency := func(pluginCall bool) { 32 deps.UI = ui 33 deps.Config = config 34 commandregistry.Commands.SetCommand(commandregistry.Commands.FindCommand("add-plugin-repo").SetDependency(deps, pluginCall)) 35 } 36 37 BeforeEach(func() { 38 ui = &testterm.FakeUI{} 39 requirementsFactory = new(requirementsfakes.FakeFactory) 40 config = testconfig.NewRepositoryWithDefaults() 41 }) 42 43 var callAddPluginRepo = func(args []string) bool { 44 return testcmd.RunCLICommand("add-plugin-repo", args, requirementsFactory, updateCommandDependency, false, ui) 45 } 46 47 Context("When repo server is valid", func() { 48 BeforeEach(func() { 49 50 h := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 51 fmt.Fprintln(w, `{"plugins":[ 52 { 53 "name":"echo", 54 "description":"none", 55 "version":"4", 56 "binaries":[ 57 { 58 "platform":"osx", 59 "url":"https://github.com/simonleung8/cli-plugin-echo/raw/master/bin/osx/echo", 60 "checksum":"2a087d5cddcfb057fbda91e611c33f46" 61 } 62 ] 63 }] 64 }`) 65 }) 66 testServer = httptest.NewServer(h) 67 }) 68 69 AfterEach(func() { 70 testServer.Close() 71 }) 72 73 It("saves the repo url into config", func() { 74 callAddPluginRepo([]string{"repo", testServer.URL}) 75 76 Expect(config.PluginRepos()[0].Name).To(Equal("repo")) 77 Expect(config.PluginRepos()[0].URL).To(Equal(testServer.URL)) 78 }) 79 }) 80 81 Context("repo name already existing", func() { 82 BeforeEach(func() { 83 config.SetPluginRepo(models.PluginRepo{Name: "repo", URL: "http://repo.com"}) 84 }) 85 86 It("informs user of the already existing repo", func() { 87 88 callAddPluginRepo([]string{"repo", "http://repo2.com"}) 89 90 Expect(ui.Outputs()).To(ContainSubstrings( 91 []string{"Plugin repo named \"repo\"", " already exists"}, 92 )) 93 }) 94 }) 95 96 Context("repo address already existing", func() { 97 BeforeEach(func() { 98 config.SetPluginRepo(models.PluginRepo{Name: "repo1", URL: "http://repo.com"}) 99 }) 100 101 It("informs user of the already existing repo", func() { 102 103 callAddPluginRepo([]string{"repo2", "http://repo.com"}) 104 105 Expect(ui.Outputs()).To(ContainSubstrings( 106 []string{"http://repo.com (repo1)", " already exists."}, 107 )) 108 }) 109 }) 110 111 Context("When repo server is not valid", func() { 112 113 Context("server url is invalid", func() { 114 It("informs user of invalid url which does not has prefix http", func() { 115 116 callAddPluginRepo([]string{"repo", "msn.com"}) 117 118 Expect(ui.Outputs()).To(ContainSubstrings( 119 []string{"msn.com", "is not a valid url"}, 120 )) 121 }) 122 123 It("should not contain the tip", func() { 124 callAddPluginRepo([]string{"repo", "msn.com"}) 125 126 Expect(ui.Outputs()).NotTo(ContainSubstrings( 127 []string{"TIP: If you are behind a firewall and require an HTTP proxy, verify the https_proxy environment variable is correctly set. Else, check your network connection."}, 128 )) 129 }) 130 }) 131 132 Context("server does not has a '/list' endpoint", func() { 133 It("informs user of invalid repo server", func() { 134 135 callAddPluginRepo([]string{"repo", "https://google.com"}) 136 137 Expect(ui.Outputs()).To(ContainSubstrings( 138 []string{"https://google.com/list", "is not responding."}, 139 )) 140 }) 141 }) 142 143 Context("server responses with invalid json", func() { 144 BeforeEach(func() { 145 146 h := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 147 fmt.Fprintln(w, `"plugins":[]}`) 148 }) 149 testServer = httptest.NewServer(h) 150 }) 151 152 AfterEach(func() { 153 testServer.Close() 154 }) 155 156 It("informs user of invalid repo server", func() { 157 callAddPluginRepo([]string{"repo", testServer.URL}) 158 159 Expect(ui.Outputs()).To(ContainSubstrings( 160 []string{"Error processing data from server"}, 161 )) 162 }) 163 }) 164 165 Context("server responses with json without 'plugins' object", func() { 166 BeforeEach(func() { 167 168 h := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 169 fmt.Fprintln(w, `{"bad_plugins":[ 170 { 171 "name": "plugin1", 172 "description": "none" 173 } 174 ]}`) 175 }) 176 testServer = httptest.NewServer(h) 177 }) 178 179 AfterEach(func() { 180 testServer.Close() 181 }) 182 183 It("informs user of invalid repo server", func() { 184 callAddPluginRepo([]string{"repo", testServer.URL}) 185 186 Expect(ui.Outputs()).To(ContainSubstrings( 187 []string{"\"Plugins\" object not found in the responded data"}, 188 )) 189 }) 190 }) 191 192 Context("When connection could not be established", func() { 193 It("prints a tip", func() { 194 callAddPluginRepo([]string{"repo", "https://broccoli.nonexistanttld:"}) 195 196 Expect(ui.Outputs()).To(ContainSubstrings( 197 []string{"TIP: If you are behind a firewall and require an HTTP proxy, verify the https_proxy environment variable is correctly set. Else, check your network connection."}, 198 )) 199 }) 200 }) 201 202 Context("server responds with an http error", func() { 203 BeforeEach(func() { 204 h := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 205 w.WriteHeader(http.StatusInternalServerError) 206 }) 207 testServer = httptest.NewServer(h) 208 }) 209 210 AfterEach(func() { 211 testServer.Close() 212 }) 213 214 It("does not print a tip", func() { 215 callAddPluginRepo([]string{"repo", testServer.URL}) 216 217 Expect(ui.Outputs()).NotTo(ContainSubstrings( 218 []string{"TIP: If you are behind a firewall and require an HTTP proxy, verify the https_proxy environment variable is correctly set. Else, check your network connection."}, 219 )) 220 }) 221 }) 222 }) 223 })