1
0
mirror of https://github.com/oauth2-proxy/oauth2-proxy.git synced 2024-11-24 08:52:25 +02:00
oauth2-proxy/pkg/requests/result_test.go
2020-07-06 20:37:36 +01:00

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"),
}),
)
})
})