common_test.go 6.9 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
package client

import (
	"bytes"
	"fmt"
	"io"
	"io/ioutil"
	"net/http"

	"github.com/golang/mock/gomock"
	"github.com/jenkins-zh/jenkins-cli/mock/mhttp"
	. "github.com/onsi/ginkgo"
	. "github.com/onsi/gomega"
)

var _ = Describe("common test", func() {
	var (
		ctrl         *gomock.Controller
		jenkinsCore  JenkinsCore
		roundTripper *mhttp.MockRoundTripper
	)

	BeforeEach(func() {
		ctrl = gomock.NewController(GinkgoT())
		jenkinsCore = JenkinsCore{}
		roundTripper = mhttp.NewMockRoundTripper(ctrl)
		jenkinsCore.RoundTripper = roundTripper
		jenkinsCore.URL = "http://localhost"
	})

	AfterEach(func() {
		ctrl.Finish()
	})

	Context("Request", func() {
		var (
			method  string
			api     string
			headers map[string]string
			payload io.Reader
		)

		BeforeEach(func() {
			method = "GET"
			api = "/fake"
		})

		It("normal case for get request", func() {
			request, _ := http.NewRequest(method, fmt.Sprintf("%s%s", jenkinsCore.URL, api), payload)
			response := &http.Response{
				StatusCode: 200,
				Proto:      "HTTP/1.1",
				Header:     http.Header{},
				Request:    request,
				Body:       ioutil.NopCloser(bytes.NewBufferString("")),
			}
			roundTripper.EXPECT().
58
				RoundTrip(NewRequestMatcher(request)).Return(response, nil)
59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77

			statusCode, data, err := jenkinsCore.Request(method, api, headers, payload)
			Expect(err).To(BeNil())
			Expect(statusCode).To(Equal(200))
			Expect(string(data)).To(Equal(""))
		})

		It("normal case for post request", func() {
			method = "POST"
			request, _ := http.NewRequest(method, fmt.Sprintf("%s%s", jenkinsCore.URL, api), payload)
			request.Header.Add("CrumbRequestField", "Crumb")
			request.Header.Add("Fake", "fake")
			response := &http.Response{
				StatusCode: 200,
				Proto:      "HTTP/1.1",
				Request:    request,
				Body:       ioutil.NopCloser(bytes.NewBufferString("")),
			}
			roundTripper.EXPECT().
78
				RoundTrip(NewRequestMatcher(request)).Return(response, nil)
79 80 81 82 83 84 85 86 87 88 89

			requestCrumb, _ := http.NewRequest("GET", fmt.Sprintf("%s%s", jenkinsCore.URL, "/crumbIssuer/api/json"), payload)
			responseCrumb := &http.Response{
				StatusCode: 200,
				Proto:      "HTTP/1.1",
				Request:    requestCrumb,
				Body: ioutil.NopCloser(bytes.NewBufferString(`
				{"crumbRequestField":"CrumbRequestField","crumb":"Crumb"}
				`)),
			}
			roundTripper.EXPECT().
90
				RoundTrip(NewRequestMatcher(requestCrumb)).Return(responseCrumb, nil)
91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110

			headers = make(map[string]string, 1)
			headers["fake"] = "fake"
			statusCode, data, err := jenkinsCore.Request(method, api, headers, payload)
			Expect(err).To(BeNil())
			Expect(statusCode).To(Equal(200))
			Expect(string(data)).To(Equal(""))
		})
	})

	Context("GetCrumb", func() {
		It("without crumb setting", func() {
			requestCrumb, _ := http.NewRequest("GET", fmt.Sprintf("%s%s", jenkinsCore.URL, "/crumbIssuer/api/json"), nil)
			responseCrumb := &http.Response{
				StatusCode: 404,
				Proto:      "HTTP/1.1",
				Request:    requestCrumb,
				Body:       ioutil.NopCloser(bytes.NewBufferString("")),
			}
			roundTripper.EXPECT().
111
				RoundTrip(NewRequestMatcher(requestCrumb)).Return(responseCrumb, nil)
112

LinuxSuRen's avatar
LinuxSuRen 已提交
113 114
			_, err := jenkinsCore.GetCrumb()
			Expect(err).To(HaveOccurred())
115 116 117
		})

		It("with crumb setting", func() {
LinuxSuRen's avatar
LinuxSuRen 已提交
118
			PrepareForGetIssuer(roundTripper, jenkinsCore.URL, "", "")
119 120 121 122 123 124 125 126 127

			crumb, err := jenkinsCore.GetCrumb()
			Expect(err).To(BeNil())
			Expect(crumb).NotTo(BeNil())
			Expect(crumb.CrumbRequestField).To(Equal("CrumbRequestField"))
			Expect(crumb.Crumb).To(Equal("Crumb"))
		})

		It("with error from server", func() {
LinuxSuRen's avatar
LinuxSuRen 已提交
128 129 130 131 132 133 134 135
			//requestCrumb, _ := http.NewRequest("GET", fmt.Sprintf("%s%s", jenkinsCore.URL, "/crumbIssuer/api/json"), nil)
			//responseCrumb := &http.Response{
			//	StatusCode: 500,
			//	Proto:      "HTTP/1.1",
			//	Request:    requestCrumb,
			//	Body:       ioutil.NopCloser(bytes.NewBufferString("")),
			//}
			//roundTripper.EXPECT().
136
			//	RoundTrip(NewRequestMatcher(requestCrumb)).Return(responseCrumb, nil)
LinuxSuRen's avatar
LinuxSuRen 已提交
137
			PrepareForGetIssuerWith500(roundTripper, jenkinsCore.URL, "", "")
138 139 140 141

			_, err := jenkinsCore.GetCrumb()
			Expect(err).To(HaveOccurred())
		})
142

143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161
		It("with Language", func() {
			request, _ := http.NewRequest("GET", fmt.Sprintf("%s%s", jenkinsCore.URL, "/view/all/itemCategories?depth=3"), nil)
			response := &http.Response{
				StatusCode: 200,
				Proto:      "HTTP/1.1",
				Request:    request,
				Body: ioutil.NopCloser(bytes.NewBufferString(`number name                       type
0      构建一个自由风格的软件项目 Standalone Projects
1      构建一个maven项目          Standalone Projects
2      流水线                     Standalone Projects
3      构建一个多配置项目         Standalone Projects
0      Bitbucket Team/Project     Nested Projects
1      文件夹                     Nested Projects
2      GitHub 组织                Nested Projects
3      多分支流水线               Nested Projects
`)),
			}
			request.Header.Set("Accept-Language", "zh-CN")
			roundTripper.EXPECT().
162
				RoundTrip(NewRequestMatcher(request)).Return(response, nil)
163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180

			SetLanguage("zh-CN")
			statusCode, data, err := jenkinsCore.Request("GET", "/view/all/itemCategories?depth=3", nil, nil)
			SetLanguage("")
			Expect(err).To(BeNil())
			Expect(statusCode).To(Equal(200))
			Expect(string(data)).To(Equal(`number name                       type
0      构建一个自由风格的软件项目 Standalone Projects
1      构建一个maven项目          Standalone Projects
2      流水线                     Standalone Projects
3      构建一个多配置项目         Standalone Projects
0      Bitbucket Team/Project     Nested Projects
1      文件夹                     Nested Projects
2      GitHub 组织                Nested Projects
3      多分支流水线               Nested Projects
`))
		})

181 182 183
		It("with 404 error from server", func() {
			err := jenkinsCore.ErrorHandle(404, []byte{})
			Expect(err).To(HaveOccurred())
LinuxSuRen's avatar
LinuxSuRen 已提交
184
			Expect(err.Error()).To(Equal("not found resources"))
185 186 187 188 189
		})

		It("with 403 error from server", func() {
			err := jenkinsCore.ErrorHandle(403, []byte{})
			Expect(err).To(HaveOccurred())
LinuxSuRen's avatar
LinuxSuRen 已提交
190
			Expect(err.Error()).To(Equal("the current user has not permission, code 403"))
191 192 193 194 195 196 197 198 199 200 201
		})

		It("with CrumbHandle error from server", func() {
			requestCrumb, _ := http.NewRequest("GET", fmt.Sprintf("%s%s", jenkinsCore.URL, "/crumbIssuer/api/json"), nil)
			responseCrumb := &http.Response{
				StatusCode: 500,
				Proto:      "HTTP/1.1",
				Request:    requestCrumb,
				Body:       ioutil.NopCloser(bytes.NewBufferString("")),
			}
			roundTripper.EXPECT().
202
				RoundTrip(NewRequestMatcher(requestCrumb)).Return(responseCrumb, nil)
203 204 205 206 207 208 209 210 211 212 213 214
			err := jenkinsCore.CrumbHandle(requestCrumb)
			Expect(err).To(HaveOccurred())
			Expect(err.Error()).To(Equal("unexpected status code: 500"))
		})

		It("test GetClient", func() {
			jenkinsCore.RoundTripper = nil
			jenkinsCore.Proxy = "kljasdsll"
			jenkinsCore.ProxyAuth = "kljaslkdjkslad"
			jclient := jenkinsCore.GetClient()
			Expect(jclient).NotTo(BeNil())
		})
215 216
	})
})