mirror of
https://github.com/go-micro/go-micro.git
synced 2024-12-24 10:07:04 +02:00
181 lines
5.0 KiB
Go
181 lines
5.0 KiB
Go
package api
|
|
|
|
import (
|
|
"encoding/json"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"reflect"
|
|
"testing"
|
|
)
|
|
|
|
type testcase struct {
|
|
Token string
|
|
ReqFn func(opts *Options) *Request
|
|
Method string
|
|
URI string
|
|
Body interface{}
|
|
Header map[string]string
|
|
Assert func(req *http.Request) bool
|
|
}
|
|
|
|
type assertFn func(req *http.Request) bool
|
|
|
|
var tests = []testcase{
|
|
testcase{
|
|
ReqFn: func(opts *Options) *Request {
|
|
return NewRequest(opts).Get().Resource("service")
|
|
},
|
|
Method: "GET",
|
|
URI: "/api/v1/namespaces/default/services/",
|
|
},
|
|
testcase{
|
|
ReqFn: func(opts *Options) *Request {
|
|
return NewRequest(opts).Get().Resource("service").Name("foo")
|
|
},
|
|
Method: "GET",
|
|
URI: "/api/v1/namespaces/default/services/foo",
|
|
},
|
|
testcase{
|
|
ReqFn: func(opts *Options) *Request {
|
|
return NewRequest(opts).Get().Resource("service").Namespace("test").Name("bar")
|
|
},
|
|
Method: "GET",
|
|
URI: "/api/v1/namespaces/test/services/bar",
|
|
},
|
|
testcase{
|
|
ReqFn: func(opts *Options) *Request {
|
|
return NewRequest(opts).Get().Resource("deployment").Name("foo")
|
|
},
|
|
Method: "GET",
|
|
URI: "/apis/apps/v1/namespaces/default/deployments/foo",
|
|
},
|
|
testcase{
|
|
ReqFn: func(opts *Options) *Request {
|
|
return NewRequest(opts).Get().Resource("deployment").Namespace("test").Name("foo")
|
|
},
|
|
Method: "GET",
|
|
URI: "/apis/apps/v1/namespaces/test/deployments/foo",
|
|
},
|
|
testcase{
|
|
ReqFn: func(opts *Options) *Request {
|
|
return NewRequest(opts).Get().Resource("pod").Params(&Params{LabelSelector: map[string]string{"foo": "bar"}})
|
|
},
|
|
Method: "GET",
|
|
URI: "/api/v1/namespaces/default/pods/?labelSelector=foo%3Dbar",
|
|
},
|
|
testcase{
|
|
ReqFn: func(opts *Options) *Request {
|
|
return NewRequest(opts).Post().Resource("service").Name("foo").Body(map[string]string{"foo": "bar"})
|
|
},
|
|
Method: "POST",
|
|
URI: "/api/v1/namespaces/default/services/foo",
|
|
Body: map[string]string{"foo": "bar"},
|
|
},
|
|
testcase{
|
|
ReqFn: func(opts *Options) *Request {
|
|
return NewRequest(opts).Post().Resource("deployment").Namespace("test").Name("foo").Body(map[string]string{"foo": "bar"})
|
|
},
|
|
Method: "POST",
|
|
URI: "/apis/apps/v1/namespaces/test/deployments/foo",
|
|
Body: map[string]string{"foo": "bar"},
|
|
},
|
|
testcase{
|
|
ReqFn: func(opts *Options) *Request {
|
|
return NewRequest(opts).Put().Resource("endpoint").Name("baz").Body(map[string]string{"bam": "bar"})
|
|
},
|
|
Method: "PUT",
|
|
URI: "/api/v1/namespaces/default/endpoints/baz",
|
|
Body: map[string]string{"bam": "bar"},
|
|
},
|
|
testcase{
|
|
ReqFn: func(opts *Options) *Request {
|
|
return NewRequest(opts).Patch().Resource("endpoint").Name("baz").Body(map[string]string{"bam": "bar"})
|
|
},
|
|
Method: "PATCH",
|
|
URI: "/api/v1/namespaces/default/endpoints/baz",
|
|
Body: map[string]string{"bam": "bar"},
|
|
},
|
|
testcase{
|
|
ReqFn: func(opts *Options) *Request {
|
|
return NewRequest(opts).Patch().Resource("endpoint").Name("baz").SetHeader("foo", "bar")
|
|
},
|
|
Method: "PATCH",
|
|
URI: "/api/v1/namespaces/default/endpoints/baz",
|
|
Header: map[string]string{"foo": "bar"},
|
|
},
|
|
testcase{
|
|
ReqFn: func(opts *Options) *Request {
|
|
return NewRequest(opts).Patch().Resource("deployment").Name("baz").SetHeader("foo", "bar")
|
|
},
|
|
Method: "PATCH",
|
|
URI: "/apis/apps/v1/namespaces/default/deployments/baz",
|
|
Header: map[string]string{"foo": "bar"},
|
|
},
|
|
testcase{
|
|
ReqFn: func(opts *Options) *Request {
|
|
return NewRequest(opts).
|
|
Get().
|
|
Resource("pod").
|
|
SubResource("log").
|
|
Name("foolog")
|
|
},
|
|
Method: "GET",
|
|
URI: "/api/v1/namespaces/default/pods/foolog/log",
|
|
},
|
|
}
|
|
|
|
var wrappedHandler = func(test *testcase, t *testing.T) http.HandlerFunc {
|
|
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
auth := r.Header.Get("Authorization")
|
|
if len(test.Token) > 0 && (len(auth) == 0 || auth != "Bearer "+test.Token) {
|
|
t.Errorf("test case token (%s) did not match expected token (%s)", "Bearer "+test.Token, auth)
|
|
}
|
|
|
|
if len(test.Method) > 0 && test.Method != r.Method {
|
|
t.Errorf("test case Method (%s) did not match expected Method (%s)", test.Method, r.Method)
|
|
}
|
|
|
|
if len(test.URI) > 0 && test.URI != r.URL.RequestURI() {
|
|
t.Errorf("test case URI (%s) did not match expected URI (%s)", test.URI, r.URL.RequestURI())
|
|
}
|
|
|
|
if test.Body != nil {
|
|
var res map[string]string
|
|
decoder := json.NewDecoder(r.Body)
|
|
if err := decoder.Decode(&res); err != nil {
|
|
t.Errorf("decoding body failed: %v", err)
|
|
}
|
|
if !reflect.DeepEqual(res, test.Body) {
|
|
t.Error("body did not match")
|
|
}
|
|
}
|
|
|
|
if test.Header != nil {
|
|
for k, v := range test.Header {
|
|
if r.Header.Get(k) != v {
|
|
t.Error("header did not exist")
|
|
}
|
|
}
|
|
}
|
|
|
|
w.WriteHeader(http.StatusOK)
|
|
})
|
|
}
|
|
|
|
func TestRequest(t *testing.T) {
|
|
for _, test := range tests {
|
|
ts := httptest.NewServer(wrappedHandler(&test, t))
|
|
req := test.ReqFn(&Options{
|
|
Host: ts.URL,
|
|
Client: &http.Client{},
|
|
BearerToken: &test.Token,
|
|
Namespace: "default",
|
|
})
|
|
res := req.Do()
|
|
if res.Error() != nil {
|
|
t.Errorf("request failed with %v", res.Error())
|
|
}
|
|
ts.Close()
|
|
}
|
|
}
|