未验证 提交 03f2f1e4 编写于 作者: LinuxSuRen's avatar LinuxSuRen 提交者: GitHub

Add support to edit a pipeline from multi-methods (#206)

* Add support to create a job by copy mode

* Add more test cases

* Add args valid method

* Fix the test failed

* Cleanup the unnecessary code lines

* Add two more ways to edit a pipeline

* Execute go fmt

* Delete the wrong files

* Add go vet in the test phase

* Part work commit

* Fix canno edit pipeline job script

* Add test cases for job edit command

* Add test case for jcli job edit --filename
上级 eade6aaf
......@@ -52,8 +52,9 @@ verify:
go vet ./...
golint -set_exit_status ./...
test: verify
test: verify fmt
mkdir -p bin
go vet ./...
go test ./... -v -coverprofile coverage.out
dep:
......@@ -63,3 +64,8 @@ dep:
go get github.com/spf13/viper
go get gopkg.in/yaml.v2
go get github.com/Pallinder/go-randomdata
fmt:
go fmt ./util/...
go fmt ./client/...
go fmt ./app/...
......@@ -10,8 +10,8 @@ import (
// CenterDownloadOption as the options of download command
type CenterDownloadOption struct {
LTS bool
Output string
LTS bool
Output string
ShowProgress bool
RoundTripper http.RoundTripper
......
......@@ -18,7 +18,7 @@ var _ = Describe("center download command", func() {
roundTripper *mhttp.MockRoundTripper
targetFilePath string
ltsResponseBody string
ltsResponseBody string
weeklyResponseBody string
err error
......@@ -67,7 +67,6 @@ var _ = Describe("center download command", func() {
Expect(string(content)).To(Equal(ltsResponseBody))
}, 1)
It("download the weekly Jenkins", func() {
request, _ := http.NewRequest("GET", "http://mirrors.jenkins.io/war/latest/jenkins.war", nil)
response := &http.Response{
......
......@@ -22,9 +22,9 @@ type FormatOutput interface {
const (
// JSONOutputFormat is the format of json
JSONOutputFormat string = "json"
JSONOutputFormat string = "json"
// YAMLOutputFormat is the format of yaml
YAMLOutputFormat string = "yaml"
YAMLOutputFormat string = "yaml"
// TableOutputFormat is the format of table
TableOutputFormat string = "table"
)
......
......@@ -12,7 +12,7 @@ import (
var _ = Describe("job type command", func() {
var (
ctrl *gomock.Controller
ctrl *gomock.Controller
)
BeforeEach(func() {
......
......@@ -18,9 +18,8 @@ func init() {
var jobCmd = &cobra.Command{
Use: "job",
Short: "Print the job of your Jenkins",
Long: `Print the job of your Jenkins`,
Run: func(cmd *cobra.Command, _ []string) {
cmd.Help()
},
Short: "Manage the job of your Jenkins",
Long: `Manage the job of your Jenkins
Editing the pipeline job needs to install a plugin which is pipeline-restful-api
https://plugins.jenkins.io/pipeline-restful-api`,
}
package cmd
import (
"bytes"
"fmt"
"io/ioutil"
"os"
"fmt"
"bytes"
"github.com/golang/mock/gomock"
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
"github.com/spf13/cobra"
"github.com/jenkins-zh/jenkins-cli/mock/mhttp"
"github.com/jenkins-zh/jenkins-cli/client"
"github.com/jenkins-zh/jenkins-cli/mock/mhttp"
)
var _ = Describe("job artifact command", func() {
var (
ctrl *gomock.Controller
roundTripper *mhttp.MockRoundTripper
buildID int
jobName string
buildID int
jobName string
)
BeforeEach(func() {
......
......@@ -38,7 +38,7 @@ var _ = Describe("job create command", func() {
Context("basic cases", func() {
var (
jobPayload client.CreateJobPayload
err error
err error
)
BeforeEach(func() {
......
......@@ -19,7 +19,7 @@ var _ = Describe("job delete command", func() {
var (
ctrl *gomock.Controller
roundTripper *mhttp.MockRoundTripper
err error
err error
)
BeforeEach(func() {
......
package cmd
import (
"fmt"
"log"
"io/ioutil"
"net/http"
"github.com/AlecAivazis/survey/v2"
"github.com/jenkins-zh/jenkins-cli/client"
"github.com/spf13/cobra"
)
// JobEditOption is the option for job create command
type JobEditOption struct {
Filename string
Script string
RoundTripper http.RoundTripper
}
var jobEditOption JobEditOption
func init() {
jobCmd.AddCommand(jobEditCmd)
jobEditCmd.Flags().StringVarP(&jobEditOption.Filename, "filename", "f", "",
"Filename to files to use to replace pipeline")
jobEditCmd.Flags().StringVarP(&jobEditOption.Script, "script", "s", "",
"Script to use to replace pipeline. Use script first if you give filename at the meantime.")
}
var jobEditCmd = &cobra.Command{
Use: "edit <jobName>",
Short: "Edit the job of your Jenkins",
Long: `Edit the job of your Jenkins`,
Long: `Edit the job of your Jenkins. We only support to edit the pipeline job.`,
Args: cobra.MinimumNArgs(1),
Run: func(cmd *cobra.Command, args []string) {
if len(args) == 0 {
cmd.Help()
return
}
name := args[0]
var content string
var err error
if content, err = getPipeline(name); err != nil {
log.Fatal(err)
}
prompt := &survey.Editor{
Message: "Edit your pipeline script",
FileName: "*.sh",
Default: content,
HideDefault: true,
AppendDefault: true,
jclient := &client.JobClient{
JenkinsCore: client.JenkinsCore{
RoundTripper: jobEditOption.RoundTripper,
},
}
getCurrentJenkinsAndClient(&(jclient.JenkinsCore))
if err = survey.AskOne(prompt, &content); err != nil {
log.Fatal(err)
if content, err = jobEditOption.getPipeline(jclient, name); err != nil {
cmd.PrintErrln(err)
return
}
jenkins := getCurrentJenkinsFromOptionsOrDie()
jclient := &client.JobClient{}
jclient.URL = jenkins.URL
jclient.UserName = jenkins.UserName
jclient.Token = jenkins.Token
jclient.Proxy = jenkins.Proxy
jclient.ProxyAuth = jenkins.ProxyAuth
if err = jclient.UpdatePipeline(name, content); err != nil {
fmt.Println("update failed")
log.Fatal(err)
cmd.Println("update failed", err)
}
},
}
func getPipeline(name string) (script string, err error) {
jenkins := getCurrentJenkins()
jclient := &client.JobClient{}
jclient.URL = jenkins.URL
jclient.UserName = jenkins.UserName
jclient.Token = jenkins.Token
jclient.Proxy = jenkins.Proxy
jclient.ProxyAuth = jenkins.ProxyAuth
//func getPipeline(name string) (script string, err error) {
func (j *JobEditOption) getPipeline(jClient *client.JobClient, name string) (script string, err error) {
script = j.Script //we take the script from input firstly
if script != "" {
return
}
// take script from a file
if script, err = j.getPipelineFromFile(); script != "" || err != nil {
return
}
var job *client.Pipeline
if job, err = jclient.GetPipeline(name); err == nil {
script = job.Script
if job, err = jClient.GetPipeline(name); err == nil {
content := ""
if job != nil {
content = job.Script
}
script, err = modifyScript(content)
}
return
}
func modifyScript(script string) (content string, err error) {
prompt := &survey.Editor{
Message: "Edit your pipeline script",
FileName: "*.sh",
Default: script,
HideDefault: true,
AppendDefault: true,
}
err = survey.AskOne(prompt, &content)
return
}
func (j *JobEditOption) getPipelineFromFile() (script string, err error) {
if j.Filename == "" {
return
}
var data []byte
if data, err = ioutil.ReadFile(j.Filename); err == nil {
script = string(data)
}
return
}
package cmd
import (
"bytes"
"io/ioutil"
"os"
"github.com/golang/mock/gomock"
"github.com/jenkins-zh/jenkins-cli/client"
"github.com/jenkins-zh/jenkins-cli/mock/mhttp"
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
// "github.com/AlecAivazis/survey/v2/core"
// "github.com/AlecAivazis/survey/v2/terminal"
)
var _ = Describe("job edit command", func() {
var (
ctrl *gomock.Controller
roundTripper *mhttp.MockRoundTripper
jenkinsRoot string
username string
token string
)
BeforeEach(func() {
ctrl = gomock.NewController(GinkgoT())
roundTripper = mhttp.NewMockRoundTripper(ctrl)
jobEditOption.RoundTripper = roundTripper
rootCmd.SetArgs([]string{})
rootOptions.Jenkins = ""
rootOptions.ConfigFile = "test.yaml"
jenkinsRoot = "http://localhost:8080/jenkins"
username = "admin"
token = "111e3a2f0231198855dceaff96f20540a9"
})
AfterEach(func() {
rootCmd.SetArgs([]string{})
os.Remove(rootOptions.ConfigFile)
rootOptions.ConfigFile = ""
ctrl.Finish()
})
Context("basic cases", func() {
It("edit with script param", func() {
data, err := generateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
jobName := "test"
client.PrepareForUpdatePipelineJob(roundTripper, jenkinsRoot, "sample", username, token)
rootCmd.SetArgs([]string{"job", "edit", jobName, "--script", "sample"})
buf := new(bytes.Buffer)
rootCmd.SetOutput(buf)
_, err = rootCmd.ExecuteC()
Expect(err).To(BeNil())
Expect(buf.String()).To(Equal(""))
})
It("edit with file param", func() {
data, err := generateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
tempFile, err := ioutil.TempFile("", "example")
Expect(err).To(BeNil())
defer os.Remove(tempFile.Name())
err = ioutil.WriteFile(tempFile.Name(), []byte("sample"), 0644)
jobName := "test"
client.PrepareForUpdatePipelineJob(roundTripper, jenkinsRoot, "sample", username, token)
rootCmd.SetArgs([]string{"job", "edit", jobName, "--filename", tempFile.Name(), "--script", ""})
buf := new(bytes.Buffer)
rootCmd.SetOutput(buf)
_, err = rootCmd.ExecuteC()
Expect(err).To(BeNil())
Expect(buf.String()).To(Equal(""))
})
})
})
......@@ -26,12 +26,8 @@ var jobHistoryCmd = &cobra.Command{
Use: "history <jobName>",
Short: "Print the history of job in your Jenkins",
Long: `Print the history of job in your Jenkins`,
Args: cobra.MinimumNArgs(1),
Run: func(cmd *cobra.Command, args []string) {
if len(args) == 0 {
cmd.Help()
return
}
jobName := args[0]
jenkins := getCurrentJenkinsFromOptionsOrDie()
......
package cmd
import (
"encoding/json"
"fmt"
"log"
"net/http"
"strconv"
"encoding/json"
"github.com/AlecAivazis/survey/v2"
"github.com/AlecAivazis/survey/v2/terminal"
"github.com/jenkins-zh/jenkins-cli/client"
"github.com/spf13/cobra"
"github.com/AlecAivazis/survey/v2/terminal"
)
// JobInputOption is the job delete option
......@@ -20,7 +20,7 @@ type JobInputOption struct {
Action string
RoundTripper http.RoundTripper
Stdio terminal.Stdio
Stdio terminal.Stdio
}
var jobInputOption JobInputOption
......@@ -75,7 +75,7 @@ var jobInputCmd = &cobra.Command{
HideDefault: true,
AppendDefault: true,
}
if err = survey.AskOne(prompt, &content); err != nil {
log.Fatal(err)
}
......@@ -97,7 +97,7 @@ var jobInputCmd = &cobra.Command{
if action == "" {
prompt := &survey.Input{
Renderer: *render,
Message: fmt.Sprintf("Are you going to process or abort this input: %s?", inputAction.Message),
Message: fmt.Sprintf("Are you going to process or abort this input: %s?", inputAction.Message),
}
survey.AskOne(prompt, &action)
}
......
......@@ -20,9 +20,9 @@ var _ = Describe("job input command", func() {
var (
ctrl *gomock.Controller
roundTripper *mhttp.MockRoundTripper
jenkinsRoot string
username string
token string
jenkinsRoot string
username string
token string
)
BeforeEach(func() {
......@@ -46,7 +46,7 @@ var _ = Describe("job input command", func() {
})
Context("basic cases", func() {
It("no params, will error",func(){
It("no params, will error", func() {
data, err := generateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
......@@ -76,7 +76,7 @@ var _ = Describe("job input command", func() {
buildID := 1
client.PrepareForGetJobInputActions(roundTripper, jenkinsRoot, username, token, jobName, buildID)
client.PrepareForSubmitInput(roundTripper, jenkinsRoot, fmt.Sprintf("/job/%s", jobName) , username, token)
client.PrepareForSubmitInput(roundTripper, jenkinsRoot, fmt.Sprintf("/job/%s", jobName), username, token)
// no idea how to let it works, just leave this here
// _, w, err := os.Pipe()
......@@ -116,7 +116,7 @@ var _ = Describe("job input command", func() {
buildID := 1
client.PrepareForGetJobInputActions(roundTripper, jenkinsRoot, username, token, jobName, buildID)
client.PrepareForSubmitProcessInput(roundTripper, jenkinsRoot, fmt.Sprintf("/job/%s", jobName) , username, token)
client.PrepareForSubmitProcessInput(roundTripper, jenkinsRoot, fmt.Sprintf("/job/%s", jobName), username, token)
rootCmd.SetArgs([]string{"job", "input", jobName, "1", "--action", "process"})
......
......@@ -74,7 +74,7 @@ func (p *PluginUpgradeOption) findUpgradeablePlugins(jclient *client.PluginManag
filteredPlugins []client.InstalledPlugin, err error) {
var (
pluginName string
plugins *client.InstalledPluginList
plugins *client.InstalledPluginList
)
if p.Filter != nil {
for _, f := range p.Filter {
......
......@@ -14,7 +14,7 @@ import (
var _ = Describe("restart command", func() {
var (
ctrl *gomock.Controller
ctrl *gomock.Controller
roundTripper *mhttp.MockRoundTripper
)
......
......@@ -6,10 +6,10 @@ import (
// Artifact represents the artifacts from Jenkins build
type Artifact struct {
ID string
ID string
Name string
Path string
URL string
URL string
Size int64
}
......
......@@ -9,8 +9,8 @@ import (
var _ = Describe("artifacts test", func() {
var (
ctrl *gomock.Controller
roundTripper *mhttp.MockRoundTripper
ctrl *gomock.Controller
roundTripper *mhttp.MockRoundTripper
artifactClient ArtifactClient
username string
......
package client
import (
"fmt"
"bytes"
"net/http"
"fmt"
"io/ioutil"
"net/http"
"github.com/jenkins-zh/jenkins-cli/mock/mhttp"
)
......
......@@ -11,7 +11,7 @@ var _ = Describe("core test", func() {
var (
ctrl *gomock.Controller
roundTripper *mhttp.MockRoundTripper
coreClient CoreClient
coreClient CoreClient
username string
password string
......
......@@ -7,7 +7,7 @@ import (
)
//PrepareRestart only for test
func PrepareRestart(roundTripper *mhttp.MockRoundTripper, rootURL, user, password string, statusCode int) {
func PrepareRestart(roundTripper *mhttp.MockRoundTripper, rootURL, user, password string, statusCode int) {
request, _ := http.NewRequest("POST", fmt.Sprintf("%s/safeRestart", rootURL), nil)
response := PrepareCommonPost(request, "", roundTripper, user, password, rootURL)
response.StatusCode = statusCode
......
......@@ -60,7 +60,7 @@ func (q *JobClient) BuildWithParams(jobName string, parameters []ParameterDefini
if err == nil {
formData := url.Values{"json": {fmt.Sprintf("{\"parameter\": %s}", string(paramJSON))}}
payload := strings.NewReader(formData.Encode())
_, err = q.RequestWithoutData("POST", api,
map[string]string{util.ContentType: util.ApplicationForm}, payload, 201)
}
......@@ -120,13 +120,13 @@ func (q *JobClient) GetPipeline(name string) (pipeline *Pipeline, err error) {
// UpdatePipeline updates the pipeline script
func (q *JobClient) UpdatePipeline(name, script string) (err error) {
formData := url.Values{}
formData.Add("script", script)
path := parseJobPath(name)
api := fmt.Sprintf("%s/restFul/update", path)
api := fmt.Sprintf("%s/restFul/update?%s", path, formData.Encode())
formData := url.Values{"script": {script}}
payload := strings.NewReader(formData.Encode())
_, err = q.RequestWithoutData("POST", api, nil, payload, 200)
// _, err = q.RequestWithoutData("POST", api, map[string]string{util.ContentType: util.ApplicationForm}, payload, 200)
_, err = q.RequestWithoutData("POST", api, nil, nil, 200)
return
}
......@@ -423,5 +423,5 @@ type JobInputItem struct {
ProceedText string
ProceedURL string
RedirectApprovalURL string
Inputs []ParameterDefinition
Inputs []ParameterDefinition
}
......@@ -181,7 +181,7 @@ var _ = Describe("job test", func() {
It("no params", func() {
jobName := "fake"
PrepareForBuildWithNoParams(roundTripper, jobClient.URL, jobName, "", "");
PrepareForBuildWithNoParams(roundTripper, jobClient.URL, jobName, "", "")
err := jobClient.BuildWithParams(jobName, []ParameterDefinition{})
Expect(err).To(BeNil())
......@@ -190,10 +190,10 @@ var _ = Describe("job test", func() {
It("with params", func() {
jobName := "fake"
PrepareForBuildWithParams(roundTripper, jobClient.URL, jobName, "", "");
PrepareForBuildWithParams(roundTripper, jobClient.URL, jobName, "", "")
err := jobClient.BuildWithParams(jobName, []ParameterDefinition{ParameterDefinition{
Name: "name",
Name: "name",
Value: "value",
}})
Expect(err).To(BeNil())
......@@ -283,7 +283,7 @@ var _ = Describe("job test", func() {
Context("UpdatePipeline", func() {
It("simple case, should success", func() {
PrepareForUpdatePipelineJob(roundTripper, jobClient.URL, "", "")
PrepareForUpdatePipelineJob(roundTripper, jobClient.URL, "", "", "")
err := jobClient.UpdatePipeline("test", "")
Expect(err).To(BeNil())
})
......
......@@ -3,10 +3,10 @@ package client
import (
"bytes"
"fmt"
"strings"
"io/ioutil"
"net/http"
"net/url"
"strings"
"github.com/jenkins-zh/jenkins-cli/mock/mhttp"
"github.com/jenkins-zh/jenkins-cli/util"
......
......@@ -3,12 +3,12 @@ package client
import (
"crypto/tls"
"encoding/json"
"fmt"
"github.com/jenkins-zh/jenkins-cli/util"
"io/ioutil"
"log"
"fmt"
"net/http"
"strings"
"github.com/jenkins-zh/jenkins-cli/util"
)
// PluginAPI represetns a plugin API
......
......@@ -16,10 +16,10 @@ func PrepareShowTrend(roundTripper *mhttp.MockRoundTripper, keyword string) {
StatusCode: 200,
Proto: "HTTP/1.1",
Request: request,
Body: ioutil.NopCloser(bytes.NewBufferString(`
Body: ioutil.NopCloser(bytes.NewBufferString(`
{"stats": {"installations":[{"total":1512},{"total":3472},{"total":4385},{"total":3981}]}}
`)),
}
roundTripper.EXPECT().
RoundTrip(request).Return(response, nil)
}
\ No newline at end of file
}
......@@ -11,7 +11,7 @@ import (
// RequestMatcher to match the http request
type RequestMatcher struct {
request *http.Request
target *http.Request
target *http.Request
verbose bool
matchOptions matchOptions
......
......@@ -9,7 +9,7 @@ import (
var _ = Describe("user test", func() {
Context("matchHeader", func() {
var (
left http.Header
left http.Header
right http.Header
)
......@@ -49,4 +49,4 @@ var _ = Describe("user test", func() {
Expect(matchHeader(left, right)).To(Equal(false))
})
})
})
\ No newline at end of file
})
......@@ -11,7 +11,7 @@ var _ = Describe("status test", func() {
var (
ctrl *gomock.Controller
roundTripper *mhttp.MockRoundTripper
statusClient JenkinsStatusClient
statusClient JenkinsStatusClient
username string
password string
......
......@@ -9,11 +9,11 @@ import (
)
//PrepareGetStatus only for test
func PrepareGetStatus(roundTripper *mhttp.MockRoundTripper, rootURL, user, password string) {
func PrepareGetStatus(roundTripper *mhttp.MockRoundTripper, rootURL, user, password string) {
request, _ := http.NewRequest("GET", fmt.Sprintf("%s/api/json", rootURL), nil)
response := &http.Response{
StatusCode: 200,
Header: http.Header{},
Header: http.Header{},
Request: request,
Body: ioutil.NopCloser(bytes.NewBufferString(`{"nodeName":"master"}`)),
}
......
......@@ -449,11 +449,11 @@ func PrepareForPipelineJob(roundTripper *mhttp.MockRoundTripper, rootURL, user,
}
// PrepareForUpdatePipelineJob only for test
func PrepareForUpdatePipelineJob(roundTripper *mhttp.MockRoundTripper, rootURL, user, passwd string) {
formData := url.Values{"script": {""}}
payload := strings.NewReader(formData.Encode())
request, _ := http.NewRequest("POST", fmt.Sprintf("%s/job/test/restFul/update", rootURL), payload)
PrepareCommonPost(request, "", roundTripper, user, passwd, rootURL)
func PrepareForUpdatePipelineJob(roundTripper *mhttp.MockRoundTripper, rootURL, script, user, password string) {
formData := url.Values{}
formData.Add("script", script)
request, _ := http.NewRequest("POST", fmt.Sprintf("%s/job/test/restFul/update?%s", rootURL, formData.Encode()), nil)
PrepareCommonPost(request, "", roundTripper, user, password, rootURL)
return
}
......
......@@ -77,7 +77,7 @@ func genSimpleUserAsPayload(username, password string) (payload io.Reader, user
func (q *UserClient) Create(username, password string) (user *UserForCreate, err error) {
var (
payload io.Reader
code int
code int
)
if password == "" {
......
......@@ -11,7 +11,7 @@ var _ = Describe("user test", func() {
var (
ctrl *gomock.Controller
roundTripper *mhttp.MockRoundTripper
userClient UserClient
userClient UserClient
username string
password string
......
package client
import (
"fmt"
"bytes"
"net/http"
"io/ioutil"
"strings"
"net/url"
"fmt"
"github.com/jenkins-zh/jenkins-cli/mock/mhttp"
"github.com/jenkins-zh/jenkins-cli/util"
"io/ioutil"
"net/http"
"net/url"
"strings"
)
// PrepareGetUser only for test
......
......@@ -7,6 +7,7 @@ require (
github.com/Netflix/go-expect v0.0.0-20180615182759-c93bf25de8e8
github.com/Pallinder/go-randomdata v1.2.0
github.com/atotto/clipboard v0.1.2
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b
github.com/golang/mock v1.3.1
github.com/gosuri/uilive v0.0.3 // indirect
github.com/gosuri/uiprogress v0.0.1
......
......@@ -2,12 +2,12 @@ package util
import (
"crypto/tls"
"encoding/base64"
"fmt"
"io"
"io/ioutil"
"encoding/base64"
"net/url"
"net/http"
"net/url"
"os"
"strconv"
......@@ -18,7 +18,7 @@ const (
// ContentType is for the http header of content type
ContentType = "Content-Type"
// ApplicationForm is for the form submit
ApplicationForm = "application/x-www-form-urlencoded"
ApplicationForm = "application/x-www-form-urlencoded"
)
// HTTPDownloader is the downloader for http request
......@@ -30,7 +30,7 @@ type HTTPDownloader struct {
UserName string
Password string
Proxy string
Proxy string
ProxyAuth string
Debug bool
......@@ -47,7 +47,7 @@ func SetProxy(proxy, proxyAuth string, tr *http.Transport) (err error) {
if proxyURL, err = url.Parse(proxy); err != nil {
return
}
tr.Proxy = http.ProxyURL(proxyURL)
if proxyAuth != "" {
......
......@@ -40,7 +40,7 @@ var _ = Describe("http test", func() {
})
Context("SetProxy", func() {
It("basic test", func(){
It("basic test", func() {
proxy, proxyAuth := "http://localhost", "admin:admin"
tr := &http.Transport{}
......@@ -49,7 +49,7 @@ var _ = Describe("http test", func() {
Expect(tr.ProxyConnectHeader.Get("Proxy-Authorization")).To(Equal("Basic YWRtaW46YWRtaW4="))
})
It("empty proxy", func(){
It("empty proxy", func() {
err := SetProxy("", "", nil)
Expect(err).To(BeNil())
})
......
......@@ -9,11 +9,11 @@ import (
const (
// AlignLeft align left
AlignLeft = 0
AlignLeft = 0
// AlignCenter align center
AlignCenter = 1
// AlignRight align right
AlignRight = 2
AlignRight = 2
)
// Pad give a pad
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册