mirror of
https://github.com/oauth2-proxy/oauth2-proxy.git
synced 2024-11-24 08:52:25 +02:00
327 lines
8.6 KiB
Go
327 lines
8.6 KiB
Go
package requests
|
|
|
|
import (
|
|
"errors"
|
|
"net/http"
|
|
|
|
. "github.com/onsi/ginkgo"
|
|
. "github.com/onsi/ginkgo/extensions/table"
|
|
. "github.com/onsi/gomega"
|
|
)
|
|
|
|
var _ = Describe("Result suite", func() {
|
|
Context("with a result", func() {
|
|
type resultTableInput struct {
|
|
result Result
|
|
expectedError error
|
|
expectedStatusCode int
|
|
expectedHeaders http.Header
|
|
expectedBody []byte
|
|
}
|
|
|
|
DescribeTable("accessors should return expected results",
|
|
func(in resultTableInput) {
|
|
if in.expectedError != nil {
|
|
Expect(in.result.Error()).To(MatchError(in.expectedError))
|
|
} else {
|
|
Expect(in.result.Error()).To(BeNil())
|
|
}
|
|
|
|
Expect(in.result.StatusCode()).To(Equal(in.expectedStatusCode))
|
|
Expect(in.result.Headers()).To(Equal(in.expectedHeaders))
|
|
Expect(in.result.Body()).To(Equal(in.expectedBody))
|
|
},
|
|
Entry("with an empty result", resultTableInput{
|
|
result: &result{},
|
|
expectedError: nil,
|
|
expectedStatusCode: 0,
|
|
expectedHeaders: nil,
|
|
expectedBody: nil,
|
|
}),
|
|
Entry("with an error", resultTableInput{
|
|
result: &result{
|
|
err: errors.New("error"),
|
|
},
|
|
expectedError: errors.New("error"),
|
|
expectedStatusCode: 0,
|
|
expectedHeaders: nil,
|
|
expectedBody: nil,
|
|
}),
|
|
Entry("with a response with no headers", resultTableInput{
|
|
result: &result{
|
|
response: &http.Response{
|
|
StatusCode: http.StatusTeapot,
|
|
},
|
|
},
|
|
expectedError: nil,
|
|
expectedStatusCode: http.StatusTeapot,
|
|
expectedHeaders: nil,
|
|
expectedBody: nil,
|
|
}),
|
|
Entry("with a response with no status code", resultTableInput{
|
|
result: &result{
|
|
response: &http.Response{
|
|
Header: http.Header{
|
|
"foo": []string{"bar"},
|
|
},
|
|
},
|
|
},
|
|
expectedError: nil,
|
|
expectedStatusCode: 0,
|
|
expectedHeaders: http.Header{
|
|
"foo": []string{"bar"},
|
|
},
|
|
expectedBody: nil,
|
|
}),
|
|
Entry("with a response with a body", resultTableInput{
|
|
result: &result{
|
|
body: []byte("some body"),
|
|
},
|
|
expectedError: nil,
|
|
expectedStatusCode: 0,
|
|
expectedHeaders: nil,
|
|
expectedBody: []byte("some body"),
|
|
}),
|
|
Entry("with all fields", resultTableInput{
|
|
result: &result{
|
|
err: errors.New("some error"),
|
|
response: &http.Response{
|
|
StatusCode: http.StatusFound,
|
|
Header: http.Header{
|
|
"header": []string{"value"},
|
|
},
|
|
},
|
|
body: []byte("a body"),
|
|
},
|
|
expectedError: errors.New("some error"),
|
|
expectedStatusCode: http.StatusFound,
|
|
expectedHeaders: http.Header{
|
|
"header": []string{"value"},
|
|
},
|
|
expectedBody: []byte("a body"),
|
|
}),
|
|
)
|
|
})
|
|
|
|
Context("UnmarshalInto", func() {
|
|
type testStruct struct {
|
|
A string `json:"a"`
|
|
B int `json:"b"`
|
|
}
|
|
|
|
type unmarshalIntoTableInput struct {
|
|
result Result
|
|
expectedErr error
|
|
expectedOutput *testStruct
|
|
}
|
|
|
|
DescribeTable("with a result",
|
|
func(in unmarshalIntoTableInput) {
|
|
input := &testStruct{}
|
|
err := in.result.UnmarshalInto(input)
|
|
if in.expectedErr != nil {
|
|
Expect(err).To(MatchError(in.expectedErr))
|
|
} else {
|
|
Expect(err).ToNot(HaveOccurred())
|
|
}
|
|
Expect(input).To(Equal(in.expectedOutput))
|
|
},
|
|
Entry("with an error", unmarshalIntoTableInput{
|
|
result: &result{
|
|
err: errors.New("got an error"),
|
|
response: &http.Response{
|
|
StatusCode: http.StatusOK,
|
|
},
|
|
body: []byte("{\"a\": \"foo\"}"),
|
|
},
|
|
expectedErr: errors.New("got an error"),
|
|
expectedOutput: &testStruct{},
|
|
}),
|
|
Entry("with a 409 status code", unmarshalIntoTableInput{
|
|
result: &result{
|
|
err: nil,
|
|
response: &http.Response{
|
|
StatusCode: http.StatusConflict,
|
|
},
|
|
body: []byte("{\"a\": \"foo\"}"),
|
|
},
|
|
expectedErr: errors.New("unexpected status \"409\": {\"a\": \"foo\"}"),
|
|
expectedOutput: &testStruct{},
|
|
}),
|
|
Entry("when the response has a valid json response", unmarshalIntoTableInput{
|
|
result: &result{
|
|
err: nil,
|
|
response: &http.Response{
|
|
StatusCode: http.StatusOK,
|
|
},
|
|
body: []byte("{\"a\": \"foo\", \"b\": 1}"),
|
|
},
|
|
expectedErr: nil,
|
|
expectedOutput: &testStruct{A: "foo", B: 1},
|
|
}),
|
|
Entry("when the response body is empty", unmarshalIntoTableInput{
|
|
result: &result{
|
|
err: nil,
|
|
response: &http.Response{
|
|
StatusCode: http.StatusOK,
|
|
},
|
|
body: []byte(""),
|
|
},
|
|
expectedErr: errors.New("error unmarshalling body: unexpected end of JSON input"),
|
|
expectedOutput: &testStruct{},
|
|
}),
|
|
Entry("when the response body is not json", unmarshalIntoTableInput{
|
|
result: &result{
|
|
err: nil,
|
|
response: &http.Response{
|
|
StatusCode: http.StatusOK,
|
|
},
|
|
body: []byte("not json"),
|
|
},
|
|
expectedErr: errors.New("error unmarshalling body: invalid character 'o' in literal null (expecting 'u')"),
|
|
expectedOutput: &testStruct{},
|
|
}),
|
|
)
|
|
})
|
|
|
|
Context("UnmarshalJSON", func() {
|
|
type testStruct struct {
|
|
A string `json:"a"`
|
|
B int `json:"b"`
|
|
}
|
|
|
|
type unmarshalJSONTableInput struct {
|
|
result Result
|
|
expectedErr error
|
|
expectedOutput *testStruct
|
|
}
|
|
|
|
DescribeTable("with a result",
|
|
func(in unmarshalJSONTableInput) {
|
|
j, err := in.result.UnmarshalJSON()
|
|
if in.expectedErr != nil {
|
|
Expect(err).To(MatchError(in.expectedErr))
|
|
Expect(j).To(BeNil())
|
|
return
|
|
}
|
|
|
|
// No error so j should not be nil
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
input := &testStruct{
|
|
A: j.Get("a").MustString(),
|
|
B: j.Get("b").MustInt(),
|
|
}
|
|
Expect(input).To(Equal(in.expectedOutput))
|
|
},
|
|
Entry("with an error", unmarshalJSONTableInput{
|
|
result: &result{
|
|
err: errors.New("got an error"),
|
|
response: &http.Response{
|
|
StatusCode: http.StatusOK,
|
|
},
|
|
body: []byte("{\"a\": \"foo\"}"),
|
|
},
|
|
expectedErr: errors.New("got an error"),
|
|
expectedOutput: &testStruct{},
|
|
}),
|
|
Entry("with a 409 status code", unmarshalJSONTableInput{
|
|
result: &result{
|
|
err: nil,
|
|
response: &http.Response{
|
|
StatusCode: http.StatusConflict,
|
|
},
|
|
body: []byte("{\"a\": \"foo\"}"),
|
|
},
|
|
expectedErr: errors.New("unexpected status \"409\": {\"a\": \"foo\"}"),
|
|
expectedOutput: &testStruct{},
|
|
}),
|
|
Entry("when the response has a valid json response", unmarshalJSONTableInput{
|
|
result: &result{
|
|
err: nil,
|
|
response: &http.Response{
|
|
StatusCode: http.StatusOK,
|
|
},
|
|
body: []byte("{\"a\": \"foo\", \"b\": 1}"),
|
|
},
|
|
expectedErr: nil,
|
|
expectedOutput: &testStruct{A: "foo", B: 1},
|
|
}),
|
|
Entry("when the response body is empty", unmarshalJSONTableInput{
|
|
result: &result{
|
|
err: nil,
|
|
response: &http.Response{
|
|
StatusCode: http.StatusOK,
|
|
},
|
|
body: []byte(""),
|
|
},
|
|
expectedErr: errors.New("error reading json: EOF"),
|
|
expectedOutput: &testStruct{},
|
|
}),
|
|
Entry("when the response body is not json", unmarshalJSONTableInput{
|
|
result: &result{
|
|
err: nil,
|
|
response: &http.Response{
|
|
StatusCode: http.StatusOK,
|
|
},
|
|
body: []byte("not json"),
|
|
},
|
|
expectedErr: errors.New("error reading json: invalid character 'o' in literal null (expecting 'u')"),
|
|
expectedOutput: &testStruct{},
|
|
}),
|
|
)
|
|
})
|
|
|
|
Context("getBodyForUnmarshal", func() {
|
|
type getBodyForUnmarshalTableInput struct {
|
|
result *result
|
|
expectedErr error
|
|
expectedBody []byte
|
|
}
|
|
|
|
DescribeTable("when getting the body", func(in getBodyForUnmarshalTableInput) {
|
|
body, err := in.result.getBodyForUnmarshal()
|
|
if in.expectedErr != nil {
|
|
Expect(err).To(MatchError(in.expectedErr))
|
|
} else {
|
|
Expect(err).ToNot(HaveOccurred())
|
|
}
|
|
Expect(body).To(Equal(in.expectedBody))
|
|
},
|
|
Entry("when the result has an error", getBodyForUnmarshalTableInput{
|
|
result: &result{
|
|
err: errors.New("got an error"),
|
|
response: &http.Response{
|
|
StatusCode: http.StatusOK,
|
|
},
|
|
body: []byte("body"),
|
|
},
|
|
expectedErr: errors.New("got an error"),
|
|
expectedBody: nil,
|
|
}),
|
|
Entry("when the response has a 409 status code", getBodyForUnmarshalTableInput{
|
|
result: &result{
|
|
err: nil,
|
|
response: &http.Response{
|
|
StatusCode: http.StatusConflict,
|
|
},
|
|
body: []byte("body"),
|
|
},
|
|
expectedErr: errors.New("unexpected status \"409\": body"),
|
|
expectedBody: nil,
|
|
}),
|
|
Entry("when the response has a 200 status code", getBodyForUnmarshalTableInput{
|
|
result: &result{
|
|
err: nil,
|
|
response: &http.Response{
|
|
StatusCode: http.StatusOK,
|
|
},
|
|
body: []byte("body"),
|
|
},
|
|
expectedErr: nil,
|
|
expectedBody: []byte("body"),
|
|
}),
|
|
)
|
|
})
|
|
})
|