httputils_test.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. package httputils // import "github.com/docker/docker/api/server/httputils"
  2. import (
  3. "net/http"
  4. "strings"
  5. "testing"
  6. )
  7. // matchesContentType
  8. func TestJsonContentType(t *testing.T) {
  9. err := matchesContentType("application/json", "application/json")
  10. if err != nil {
  11. t.Error(err)
  12. }
  13. err = matchesContentType("application/json; charset=utf-8", "application/json")
  14. if err != nil {
  15. t.Error(err)
  16. }
  17. expected := "unsupported Content-Type header (dockerapplication/json): must be 'application/json'"
  18. err = matchesContentType("dockerapplication/json", "application/json")
  19. if err == nil || err.Error() != expected {
  20. t.Errorf(`expected "%s", got "%v"`, expected, err)
  21. }
  22. expected = "malformed Content-Type header (foo;;;bar): mime: invalid media parameter"
  23. err = matchesContentType("foo;;;bar", "application/json")
  24. if err == nil || err.Error() != expected {
  25. t.Errorf(`expected "%s", got "%v"`, expected, err)
  26. }
  27. }
  28. func TestReadJSON(t *testing.T) {
  29. t.Run("nil body", func(t *testing.T) {
  30. req, err := http.NewRequest(http.MethodPost, "https://example.com/some/path", nil)
  31. if err != nil {
  32. t.Error(err)
  33. }
  34. foo := struct{}{}
  35. err = ReadJSON(req, &foo)
  36. if err != nil {
  37. t.Error(err)
  38. }
  39. })
  40. t.Run("empty body", func(t *testing.T) {
  41. req, err := http.NewRequest(http.MethodPost, "https://example.com/some/path", strings.NewReader(""))
  42. if err != nil {
  43. t.Error(err)
  44. }
  45. foo := struct{ SomeField string }{}
  46. err = ReadJSON(req, &foo)
  47. if err != nil {
  48. t.Error(err)
  49. }
  50. if foo.SomeField != "" {
  51. t.Errorf("expected: '', got: %s", foo.SomeField)
  52. }
  53. })
  54. t.Run("with valid request", func(t *testing.T) {
  55. req, err := http.NewRequest(http.MethodPost, "https://example.com/some/path", strings.NewReader(`{"SomeField":"some value"}`))
  56. if err != nil {
  57. t.Error(err)
  58. }
  59. req.Header.Set("Content-Type", "application/json")
  60. foo := struct{ SomeField string }{}
  61. err = ReadJSON(req, &foo)
  62. if err != nil {
  63. t.Error(err)
  64. }
  65. if foo.SomeField != "some value" {
  66. t.Errorf("expected: 'some value', got: %s", foo.SomeField)
  67. }
  68. })
  69. t.Run("with whitespace", func(t *testing.T) {
  70. req, err := http.NewRequest(http.MethodPost, "https://example.com/some/path", strings.NewReader(`
  71. {"SomeField":"some value"}
  72. `))
  73. if err != nil {
  74. t.Error(err)
  75. }
  76. req.Header.Set("Content-Type", "application/json")
  77. foo := struct{ SomeField string }{}
  78. err = ReadJSON(req, &foo)
  79. if err != nil {
  80. t.Error(err)
  81. }
  82. if foo.SomeField != "some value" {
  83. t.Errorf("expected: 'some value', got: %s", foo.SomeField)
  84. }
  85. })
  86. t.Run("with extra content", func(t *testing.T) {
  87. req, err := http.NewRequest(http.MethodPost, "https://example.com/some/path", strings.NewReader(`{"SomeField":"some value"} and more content`))
  88. if err != nil {
  89. t.Error(err)
  90. }
  91. req.Header.Set("Content-Type", "application/json")
  92. foo := struct{ SomeField string }{}
  93. err = ReadJSON(req, &foo)
  94. if err == nil {
  95. t.Error("expected an error, got none")
  96. }
  97. expected := "unexpected content after JSON"
  98. if err.Error() != expected {
  99. t.Errorf("expected: '%s', got: %s", expected, err.Error())
  100. }
  101. })
  102. t.Run("invalid JSON", func(t *testing.T) {
  103. req, err := http.NewRequest(http.MethodPost, "https://example.com/some/path", strings.NewReader(`{invalid json`))
  104. if err != nil {
  105. t.Error(err)
  106. }
  107. req.Header.Set("Content-Type", "application/json")
  108. foo := struct{ SomeField string }{}
  109. err = ReadJSON(req, &foo)
  110. if err == nil {
  111. t.Error("expected an error, got none")
  112. }
  113. expected := "invalid JSON: invalid character 'i' looking for beginning of object key string"
  114. if err.Error() != expected {
  115. t.Errorf("expected: '%s', got: %s", expected, err.Error())
  116. }
  117. })
  118. }