diff --git a/app/cmd/plugin.go b/app/cmd/plugin.go index 3140db1153fdd752432fcf08582c1cd6ceda53a6..ae55debaaa924f17dd13b3548dbb5ed92ddbcce1 100644 --- a/app/cmd/plugin.go +++ b/app/cmd/plugin.go @@ -22,7 +22,4 @@ var pluginCmd = &cobra.Command{ Example: ` jcli plugin list jcli plugin search github jcli plugin check`, - Run: func(cmd *cobra.Command, _ []string) { - cmd.Help() - }, } diff --git a/app/cmd/plugin_check.go b/app/cmd/plugin_check.go index defafd1c8569c3c4addeea05d6368a7b3e4fb24e..1365ca70aa5ebe866e13aa4f5caad98037aa01a3 100644 --- a/app/cmd/plugin_check.go +++ b/app/cmd/plugin_check.go @@ -2,40 +2,44 @@ package cmd import ( "fmt" + "github.com/jenkins-zh/jenkins-cli/app/helper" "io/ioutil" - "log" "net/http" "github.com/jenkins-zh/jenkins-cli/client" "github.com/spf13/cobra" ) +// PluginCheckoutOption is the option for plugin checkout command +type PluginCheckoutOption struct { + RoundTripper http.RoundTripper +} + +var pluginCheckoutOption PluginCheckoutOption + func init() { pluginCmd.AddCommand(pluginCheckCmd) } var pluginCheckCmd = &cobra.Command{ Use: "check", - Short: "Checkout update center server", - Long: `Checkout update center server`, - Run: func(_ *cobra.Command, _ []string) { - jenkins := getCurrentJenkinsFromOptionsOrDie() - jclient := &client.PluginManager{} - jclient.URL = jenkins.URL - jclient.UserName = jenkins.UserName - jclient.Token = jenkins.Token - jclient.Proxy = jenkins.Proxy - jclient.ProxyAuth = jenkins.ProxyAuth + Short: "Check update center server", + Long: `Check update center server`, + Run: func(cmd *cobra.Command, _ []string) { + jClient := &client.PluginManager{ + JenkinsCore: client.JenkinsCore{ + RoundTripper: pluginCheckoutOption.RoundTripper, + }, + } + getCurrentJenkinsAndClient(&(jClient.JenkinsCore)) - jclient.CheckUpdate(func(response *http.Response) { + err := jClient.CheckUpdate(func(response *http.Response) { code := response.StatusCode - if code == 200 { - fmt.Println("update site updated.") - } else { + if code != 200 { contentData, _ := ioutil.ReadAll(response.Body) - log.Fatal(fmt.Sprintf("response code is %d, content: %s", - code, string(contentData))) + cmd.PrintErrln(fmt.Sprintf("response code is %d, content: %s", code, string(contentData))) } }) + helper.CheckErr(cmd, err) }, } diff --git a/app/cmd/plugin_checkout_test.go b/app/cmd/plugin_checkout_test.go new file mode 100644 index 0000000000000000000000000000000000000000..19fec07f2683e6a622ede144825b4414233a6f63 --- /dev/null +++ b/app/cmd/plugin_checkout_test.go @@ -0,0 +1,59 @@ +package cmd + +import ( + "bytes" + "github.com/jenkins-zh/jenkins-cli/client" + "io/ioutil" + "os" + + "github.com/golang/mock/gomock" + . "github.com/onsi/ginkgo" + . "github.com/onsi/gomega" + + "github.com/jenkins-zh/jenkins-cli/mock/mhttp" +) + +var _ = Describe("plugin checkout command", func() { + var ( + ctrl *gomock.Controller + roundTripper *mhttp.MockRoundTripper + ) + + BeforeEach(func() { + ctrl = gomock.NewController(GinkgoT()) + roundTripper = mhttp.NewMockRoundTripper(ctrl) + pluginCheckoutOption.RoundTripper = roundTripper + rootCmd.SetArgs([]string{}) + rootOptions.Jenkins = "" + rootOptions.ConfigFile = "test.yaml" + }) + + AfterEach(func() { + rootCmd.SetArgs([]string{}) + os.Remove(rootOptions.ConfigFile) + rootOptions.ConfigFile = "" + ctrl.Finish() + }) + + Context("basic cases", func() { + It("should success", func() { + var err error + var data []byte + data, err = generateSampleConfig() + Expect(err).To(BeNil()) + err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664) + Expect(err).To(BeNil()) + + client.PrepareCheckUpdate(roundTripper, "http://localhost:8080/jenkins", + "admin", "111e3a2f0231198855dceaff96f20540a9") + + rootCmd.SetArgs([]string{"plugin", "check"}) + + buf := new(bytes.Buffer) + rootCmd.SetOut(buf) + _, err = rootCmd.ExecuteC() + Expect(err).To(BeNil()) + Expect(buf.String()).To(Equal("")) + }) + }) +}) diff --git a/app/cmd/plugin_open.go b/app/cmd/plugin_open.go index 2d4e97d2a592e61ec60730d0a72e8c2729587262..e47b47fa3fe4e67e64d6fc316aaf622a3337b120 100644 --- a/app/cmd/plugin_open.go +++ b/app/cmd/plugin_open.go @@ -13,8 +13,8 @@ func init() { var pluginOpenCmd = &cobra.Command{ Use: "open", - Short: "Openout update center server", - Long: `Openout update center server`, + Short: "Open update center server", + Long: `Open update center server`, Run: func(_ *cobra.Command, _ []string) { jenkins := getCurrentJenkinsFromOptionsOrDie() diff --git a/app/cmd/user.go b/app/cmd/user.go index ef23d86909cb9481f275e6e569a06aa500222456..00ccea96a4b0212bc881046cda3c60ae4ad16d6c 100644 --- a/app/cmd/user.go +++ b/app/cmd/user.go @@ -1,6 +1,7 @@ package cmd import ( + "github.com/jenkins-zh/jenkins-cli/app/helper" "net/http" "github.com/jenkins-zh/jenkins-cli/client" @@ -34,14 +35,13 @@ var userCmd = &cobra.Command{ } getCurrentJenkinsAndClient(&(jclient.JenkinsCore)) - if status, err := jclient.Get(); err == nil { - if data, err := userOption.Output(status); err == nil { + status, err := jclient.Get() + if err == nil { + data, err := userOption.Output(status) + if err == nil { cmd.Println(string(data)) - } else { - cmd.PrintErrln(err) } - } else { - cmd.PrintErrln(err) } + helper.CheckErr(cmd, err) }, } diff --git a/client/common.go b/client/common.go index 93a7ce9f52a92e84daa16cb82b2ad991a41cb924..75fded0b8e04dec851cb2f0e1767f6cc2f06c0a4 100644 --- a/client/common.go +++ b/client/common.go @@ -181,16 +181,14 @@ func (j *JenkinsCore) PermissionError(statusCode int) (err error) { func (j *JenkinsCore) RequestWithResponseHeader(method, api string, headers map[string]string, payload io.Reader, obj interface{}) ( response *http.Response, err error) { response, err = j.RequestWithResponse(method, api, headers, payload) - if err != nil { - return - } - var data []byte - if response.StatusCode == 200 { + if err == nil && obj != nil && response.StatusCode == 200 { + var data []byte if data, err = ioutil.ReadAll(response.Body); err == nil { err = json.Unmarshal(data, obj) } } + return } diff --git a/client/pluginApi_test_common.go b/client/pluginApi_test_common.go index 7c7b1f52c5277bf8837a564bc4cadad8455dff54..644d354dadaf08d2c01d49a09b6a51c05f705702 100644 --- a/client/pluginApi_test_common.go +++ b/client/pluginApi_test_common.go @@ -68,3 +68,10 @@ func PrepareDownloadPlugin(roundTripper *mhttp.MockRoundTripper) { roundTripper.EXPECT(). RoundTrip(request).Return(response, nil) } + +// PrepareCheckUpdate only for test +func PrepareCheckUpdate(roundTripper *mhttp.MockRoundTripper, rootURL, user, password string) { + api := fmt.Sprintf("%s/pluginManager/checkUpdatesServer", rootURL) + request, _ := http.NewRequest("POST", api, nil) + PrepareCommonPost(request, "", roundTripper, user, password, rootURL) +} diff --git a/client/pluginManager_test.go b/client/pluginManager_test.go index 48e1f392c78d31b2037a884f1685db22425691a1..7f3588f159235bfb64d748a527a4c56b80dad3cc 100644 --- a/client/pluginManager_test.go +++ b/client/pluginManager_test.go @@ -237,4 +237,15 @@ var _ = Describe("PluginManager test", func() { Expect(err).To(HaveOccurred()) }) }) + + Context("CheckUpdate", func() { + It("normal case, should success", func() { + PrepareCheckUpdate(roundTripper, pluginMgr.URL, "", "") + + err := pluginMgr.CheckUpdate(func(_ *http.Response) { + // do nothing + }) + Expect(err).To(BeNil()) + }) + }) }) diff --git a/client/pluginManger.go b/client/pluginManger.go index 75be5462074fee900ebb7c69e188e459ebd4a5b6..2fbddcd393a15a32f842bd8ae9bf7834839d7bc7 100644 --- a/client/pluginManger.go +++ b/client/pluginManger.go @@ -5,7 +5,6 @@ import ( "fmt" "io" "io/ioutil" - "log" "mime/multipart" "net/http" "os" @@ -70,26 +69,15 @@ type InstalledPlugin struct { BackVersion string } -// CheckUpdate fetch the lastest plugins from update center site -func (p *PluginManager) CheckUpdate(handle func(*http.Response)) { - api := fmt.Sprintf("%s/pluginManager/checkUpdatesServer", p.URL) - req, err := http.NewRequest("POST", api, nil) +// CheckUpdate fetch the latest plugins from update center site +func (p *PluginManager) CheckUpdate(handle func(*http.Response)) (err error) { + api := "/pluginManager/checkUpdatesServer" + var response *http.Response + response, err = p.RequestWithResponseHeader("POST", api, nil, nil, nil) if err == nil { - p.AuthHandle(req) - } else { - log.Fatal(err) - } - - if err = p.CrumbHandle(req); err != nil { - log.Fatal(err) - } - - client := p.GetClient() - if response, err := client.Do(req); err == nil { p.handleCheck(handle)(response) - } else { - log.Fatal(err) } + return } // GetAvailablePlugins get the aviable plugins from Jenkins