a770153af0
Signed-off-by: xin.li <xin.li@daocloud.io>
130 lines
3.6 KiB
Go
130 lines
3.6 KiB
Go
package httputils // import "github.com/docker/docker/api/server/httputils"
|
|
|
|
import (
|
|
"net/http"
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
// matchesContentType
|
|
func TestJsonContentType(t *testing.T) {
|
|
err := matchesContentType("application/json", "application/json")
|
|
if err != nil {
|
|
t.Error(err)
|
|
}
|
|
|
|
err = matchesContentType("application/json; charset=utf-8", "application/json")
|
|
if err != nil {
|
|
t.Error(err)
|
|
}
|
|
|
|
expected := "unsupported Content-Type header (dockerapplication/json): must be 'application/json'"
|
|
err = matchesContentType("dockerapplication/json", "application/json")
|
|
if err == nil || err.Error() != expected {
|
|
t.Errorf(`expected "%s", got "%v"`, expected, err)
|
|
}
|
|
|
|
expected = "malformed Content-Type header (foo;;;bar): mime: invalid media parameter"
|
|
err = matchesContentType("foo;;;bar", "application/json")
|
|
if err == nil || err.Error() != expected {
|
|
t.Errorf(`expected "%s", got "%v"`, expected, err)
|
|
}
|
|
}
|
|
|
|
func TestReadJSON(t *testing.T) {
|
|
t.Run("nil body", func(t *testing.T) {
|
|
req, err := http.NewRequest(http.MethodPost, "https://example.com/some/path", nil)
|
|
if err != nil {
|
|
t.Error(err)
|
|
}
|
|
foo := struct{}{}
|
|
err = ReadJSON(req, &foo)
|
|
if err != nil {
|
|
t.Error(err)
|
|
}
|
|
})
|
|
|
|
t.Run("empty body", func(t *testing.T) {
|
|
req, err := http.NewRequest(http.MethodPost, "https://example.com/some/path", strings.NewReader(""))
|
|
if err != nil {
|
|
t.Error(err)
|
|
}
|
|
foo := struct{ SomeField string }{}
|
|
err = ReadJSON(req, &foo)
|
|
if err != nil {
|
|
t.Error(err)
|
|
}
|
|
if foo.SomeField != "" {
|
|
t.Errorf("expected: '', got: %s", foo.SomeField)
|
|
}
|
|
})
|
|
|
|
t.Run("with valid request", func(t *testing.T) {
|
|
req, err := http.NewRequest(http.MethodPost, "https://example.com/some/path", strings.NewReader(`{"SomeField":"some value"}`))
|
|
if err != nil {
|
|
t.Error(err)
|
|
}
|
|
req.Header.Set("Content-Type", "application/json")
|
|
foo := struct{ SomeField string }{}
|
|
err = ReadJSON(req, &foo)
|
|
if err != nil {
|
|
t.Error(err)
|
|
}
|
|
if foo.SomeField != "some value" {
|
|
t.Errorf("expected: 'some value', got: %s", foo.SomeField)
|
|
}
|
|
})
|
|
t.Run("with whitespace", func(t *testing.T) {
|
|
req, err := http.NewRequest(http.MethodPost, "https://example.com/some/path", strings.NewReader(`
|
|
|
|
{"SomeField":"some value"}
|
|
|
|
`))
|
|
if err != nil {
|
|
t.Error(err)
|
|
}
|
|
req.Header.Set("Content-Type", "application/json")
|
|
foo := struct{ SomeField string }{}
|
|
err = ReadJSON(req, &foo)
|
|
if err != nil {
|
|
t.Error(err)
|
|
}
|
|
if foo.SomeField != "some value" {
|
|
t.Errorf("expected: 'some value', got: %s", foo.SomeField)
|
|
}
|
|
})
|
|
|
|
t.Run("with extra content", func(t *testing.T) {
|
|
req, err := http.NewRequest(http.MethodPost, "https://example.com/some/path", strings.NewReader(`{"SomeField":"some value"} and more content`))
|
|
if err != nil {
|
|
t.Error(err)
|
|
}
|
|
req.Header.Set("Content-Type", "application/json")
|
|
foo := struct{ SomeField string }{}
|
|
err = ReadJSON(req, &foo)
|
|
if err == nil {
|
|
t.Error("expected an error, got none")
|
|
}
|
|
expected := "unexpected content after JSON"
|
|
if err.Error() != expected {
|
|
t.Errorf("expected: '%s', got: %s", expected, err.Error())
|
|
}
|
|
})
|
|
|
|
t.Run("invalid JSON", func(t *testing.T) {
|
|
req, err := http.NewRequest(http.MethodPost, "https://example.com/some/path", strings.NewReader(`{invalid json`))
|
|
if err != nil {
|
|
t.Error(err)
|
|
}
|
|
req.Header.Set("Content-Type", "application/json")
|
|
foo := struct{ SomeField string }{}
|
|
err = ReadJSON(req, &foo)
|
|
if err == nil {
|
|
t.Error("expected an error, got none")
|
|
}
|
|
expected := "invalid JSON: invalid character 'i' looking for beginning of object key string"
|
|
if err.Error() != expected {
|
|
t.Errorf("expected: '%s', got: %s", expected, err.Error())
|
|
}
|
|
})
|
|
}
|