168a870c02
For reference: https://go.dev/doc/go1.4#internalpackages
312 lines
8.5 KiB
Go
312 lines
8.5 KiB
Go
// SPDX-FileCopyrightText: Copyright The Miniflux Authors. All rights reserved.
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
|
|
package json // import "miniflux.app/v2/internal/http/response/json"
|
|
|
|
import (
|
|
"errors"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"testing"
|
|
)
|
|
|
|
func TestOKResponse(t *testing.T) {
|
|
r, err := http.NewRequest("GET", "/", nil)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
w := httptest.NewRecorder()
|
|
|
|
handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
OK(w, r, map[string]string{"key": "value"})
|
|
})
|
|
|
|
handler.ServeHTTP(w, r)
|
|
|
|
resp := w.Result()
|
|
defer resp.Body.Close()
|
|
|
|
expectedStatusCode := http.StatusOK
|
|
if resp.StatusCode != expectedStatusCode {
|
|
t.Fatalf(`Unexpected status code, got %d instead of %d`, resp.StatusCode, expectedStatusCode)
|
|
}
|
|
|
|
expectedBody := `{"key":"value"}`
|
|
actualBody := w.Body.String()
|
|
if actualBody != expectedBody {
|
|
t.Fatalf(`Unexpected body, got %q instead of %q`, actualBody, expectedBody)
|
|
}
|
|
|
|
expectedContentType := contentTypeHeader
|
|
actualContentType := resp.Header.Get("Content-Type")
|
|
if actualContentType != expectedContentType {
|
|
t.Fatalf(`Unexpected content type, got %q instead of %q`, actualContentType, expectedContentType)
|
|
}
|
|
}
|
|
|
|
func TestCreatedResponse(t *testing.T) {
|
|
r, err := http.NewRequest("GET", "/", nil)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
w := httptest.NewRecorder()
|
|
|
|
handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
Created(w, r, map[string]string{"key": "value"})
|
|
})
|
|
|
|
handler.ServeHTTP(w, r)
|
|
resp := w.Result()
|
|
|
|
expectedStatusCode := http.StatusCreated
|
|
if resp.StatusCode != expectedStatusCode {
|
|
t.Fatalf(`Unexpected status code, got %d instead of %d`, resp.StatusCode, expectedStatusCode)
|
|
}
|
|
|
|
expectedBody := `{"key":"value"}`
|
|
actualBody := w.Body.String()
|
|
if actualBody != expectedBody {
|
|
t.Fatalf(`Unexpected body, got %s instead of %s`, actualBody, expectedBody)
|
|
}
|
|
|
|
expectedContentType := contentTypeHeader
|
|
actualContentType := resp.Header.Get("Content-Type")
|
|
if actualContentType != expectedContentType {
|
|
t.Fatalf(`Unexpected content type, got %q instead of %q`, actualContentType, expectedContentType)
|
|
}
|
|
}
|
|
|
|
func TestNoContentResponse(t *testing.T) {
|
|
r, err := http.NewRequest("GET", "/", nil)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
w := httptest.NewRecorder()
|
|
|
|
handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
NoContent(w, r)
|
|
})
|
|
|
|
handler.ServeHTTP(w, r)
|
|
resp := w.Result()
|
|
|
|
expectedStatusCode := http.StatusNoContent
|
|
if resp.StatusCode != expectedStatusCode {
|
|
t.Fatalf(`Unexpected status code, got %d instead of %d`, resp.StatusCode, expectedStatusCode)
|
|
}
|
|
|
|
expectedBody := ``
|
|
actualBody := w.Body.String()
|
|
if actualBody != expectedBody {
|
|
t.Fatalf(`Unexpected body, got %s instead of %s`, actualBody, expectedBody)
|
|
}
|
|
|
|
expectedContentType := contentTypeHeader
|
|
actualContentType := resp.Header.Get("Content-Type")
|
|
if actualContentType != expectedContentType {
|
|
t.Fatalf(`Unexpected content type, got %q instead of %q`, actualContentType, expectedContentType)
|
|
}
|
|
}
|
|
|
|
func TestServerErrorResponse(t *testing.T) {
|
|
r, err := http.NewRequest("GET", "/", nil)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
w := httptest.NewRecorder()
|
|
|
|
handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
ServerError(w, r, errors.New("some error"))
|
|
})
|
|
|
|
handler.ServeHTTP(w, r)
|
|
|
|
resp := w.Result()
|
|
defer resp.Body.Close()
|
|
|
|
expectedStatusCode := http.StatusInternalServerError
|
|
if resp.StatusCode != expectedStatusCode {
|
|
t.Fatalf(`Unexpected status code, got %d instead of %d`, resp.StatusCode, expectedStatusCode)
|
|
}
|
|
|
|
expectedBody := `{"error_message":"some error"}`
|
|
actualBody := w.Body.String()
|
|
if actualBody != expectedBody {
|
|
t.Fatalf(`Unexpected body, got %q instead of %q`, actualBody, expectedBody)
|
|
}
|
|
|
|
expectedContentType := contentTypeHeader
|
|
actualContentType := resp.Header.Get("Content-Type")
|
|
if actualContentType != expectedContentType {
|
|
t.Fatalf(`Unexpected content type, got %q instead of %q`, actualContentType, expectedContentType)
|
|
}
|
|
}
|
|
|
|
func TestBadRequestResponse(t *testing.T) {
|
|
r, err := http.NewRequest("GET", "/", nil)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
w := httptest.NewRecorder()
|
|
|
|
handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
BadRequest(w, r, errors.New("Some Error"))
|
|
})
|
|
|
|
handler.ServeHTTP(w, r)
|
|
resp := w.Result()
|
|
|
|
expectedStatusCode := http.StatusBadRequest
|
|
if resp.StatusCode != expectedStatusCode {
|
|
t.Fatalf(`Unexpected status code, got %d instead of %d`, resp.StatusCode, expectedStatusCode)
|
|
}
|
|
|
|
expectedBody := `{"error_message":"Some Error"}`
|
|
actualBody := w.Body.String()
|
|
if actualBody != expectedBody {
|
|
t.Fatalf(`Unexpected body, got %s instead of %s`, actualBody, expectedBody)
|
|
}
|
|
|
|
expectedContentType := contentTypeHeader
|
|
actualContentType := resp.Header.Get("Content-Type")
|
|
if actualContentType != expectedContentType {
|
|
t.Fatalf(`Unexpected content type, got %q instead of %q`, actualContentType, expectedContentType)
|
|
}
|
|
}
|
|
|
|
func TestUnauthorizedResponse(t *testing.T) {
|
|
r, err := http.NewRequest("GET", "/", nil)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
w := httptest.NewRecorder()
|
|
|
|
handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
Unauthorized(w, r)
|
|
})
|
|
|
|
handler.ServeHTTP(w, r)
|
|
resp := w.Result()
|
|
|
|
expectedStatusCode := http.StatusUnauthorized
|
|
if resp.StatusCode != expectedStatusCode {
|
|
t.Fatalf(`Unexpected status code, got %d instead of %d`, resp.StatusCode, expectedStatusCode)
|
|
}
|
|
|
|
expectedBody := `{"error_message":"access unauthorized"}`
|
|
actualBody := w.Body.String()
|
|
if actualBody != expectedBody {
|
|
t.Fatalf(`Unexpected body, got %s instead of %s`, actualBody, expectedBody)
|
|
}
|
|
|
|
expectedContentType := contentTypeHeader
|
|
actualContentType := resp.Header.Get("Content-Type")
|
|
if actualContentType != expectedContentType {
|
|
t.Fatalf(`Unexpected content type, got %q instead of %q`, actualContentType, expectedContentType)
|
|
}
|
|
}
|
|
|
|
func TestForbiddenResponse(t *testing.T) {
|
|
r, err := http.NewRequest("GET", "/", nil)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
w := httptest.NewRecorder()
|
|
|
|
handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
Forbidden(w, r)
|
|
})
|
|
|
|
handler.ServeHTTP(w, r)
|
|
resp := w.Result()
|
|
|
|
expectedStatusCode := http.StatusForbidden
|
|
if resp.StatusCode != expectedStatusCode {
|
|
t.Fatalf(`Unexpected status code, got %d instead of %d`, resp.StatusCode, expectedStatusCode)
|
|
}
|
|
|
|
expectedBody := `{"error_message":"access forbidden"}`
|
|
actualBody := w.Body.String()
|
|
if actualBody != expectedBody {
|
|
t.Fatalf(`Unexpected body, got %s instead of %s`, actualBody, expectedBody)
|
|
}
|
|
|
|
expectedContentType := contentTypeHeader
|
|
actualContentType := resp.Header.Get("Content-Type")
|
|
if actualContentType != expectedContentType {
|
|
t.Fatalf(`Unexpected content type, got %q instead of %q`, actualContentType, expectedContentType)
|
|
}
|
|
}
|
|
|
|
func TestNotFoundResponse(t *testing.T) {
|
|
r, err := http.NewRequest("GET", "/", nil)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
w := httptest.NewRecorder()
|
|
|
|
handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
NotFound(w, r)
|
|
})
|
|
|
|
handler.ServeHTTP(w, r)
|
|
resp := w.Result()
|
|
|
|
expectedStatusCode := http.StatusNotFound
|
|
if resp.StatusCode != expectedStatusCode {
|
|
t.Fatalf(`Unexpected status code, got %d instead of %d`, resp.StatusCode, expectedStatusCode)
|
|
}
|
|
|
|
expectedBody := `{"error_message":"resource not found"}`
|
|
actualBody := w.Body.String()
|
|
if actualBody != expectedBody {
|
|
t.Fatalf(`Unexpected body, got %s instead of %s`, actualBody, expectedBody)
|
|
}
|
|
|
|
expectedContentType := contentTypeHeader
|
|
actualContentType := resp.Header.Get("Content-Type")
|
|
if actualContentType != expectedContentType {
|
|
t.Fatalf(`Unexpected content type, got %q instead of %q`, actualContentType, expectedContentType)
|
|
}
|
|
}
|
|
|
|
func TestBuildInvalidJSONResponse(t *testing.T) {
|
|
r, err := http.NewRequest("GET", "/", nil)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
w := httptest.NewRecorder()
|
|
|
|
handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
OK(w, r, make(chan int))
|
|
})
|
|
|
|
handler.ServeHTTP(w, r)
|
|
resp := w.Result()
|
|
|
|
expectedStatusCode := http.StatusOK
|
|
if resp.StatusCode != expectedStatusCode {
|
|
t.Fatalf(`Unexpected status code, got %d instead of %d`, resp.StatusCode, expectedStatusCode)
|
|
}
|
|
|
|
expectedBody := ``
|
|
actualBody := w.Body.String()
|
|
if actualBody != expectedBody {
|
|
t.Fatalf(`Unexpected body, got %s instead of %s`, actualBody, expectedBody)
|
|
}
|
|
|
|
expectedContentType := contentTypeHeader
|
|
actualContentType := resp.Header.Get("Content-Type")
|
|
if actualContentType != expectedContentType {
|
|
t.Fatalf(`Unexpected content type, got %q instead of %q`, actualContentType, expectedContentType)
|
|
}
|
|
}
|