api_test.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. // SPDX-FileCopyrightText: Copyright The Miniflux Authors. All rights reserved.
  2. // SPDX-License-Identifier: Apache-2.0
  3. package api // import "miniflux.app/v2/internal/api"
  4. import (
  5. "encoding/json"
  6. "net/http"
  7. "net/http/httptest"
  8. "runtime"
  9. "testing"
  10. "miniflux.app/v2/internal/version"
  11. )
  12. func TestNewHandlerHandlesOptionsRequests(t *testing.T) {
  13. handler := NewHandler(nil, nil)
  14. r := httptest.NewRequest(http.MethodOptions, "/v1/users", nil)
  15. w := httptest.NewRecorder()
  16. handler.ServeHTTP(w, r)
  17. if got := w.Code; got != http.StatusNoContent {
  18. t.Fatalf(`Unexpected status code, got %d instead of %d`, got, http.StatusNoContent)
  19. }
  20. if got := w.Header().Get("Access-Control-Allow-Origin"); got != "*" {
  21. t.Fatalf(`Unexpected Access-Control-Allow-Origin header, got %q`, got)
  22. }
  23. if got := w.Header().Get("Access-Control-Allow-Methods"); got != "GET, POST, PUT, DELETE, OPTIONS" {
  24. t.Fatalf(`Unexpected Access-Control-Allow-Methods header, got %q`, got)
  25. }
  26. if got := w.Header().Get("Access-Control-Allow-Headers"); got != "X-Auth-Token, Authorization, Content-Type, Accept" {
  27. t.Fatalf(`Unexpected Access-Control-Allow-Headers header, got %q`, got)
  28. }
  29. if got := w.Header().Get("Access-Control-Max-Age"); got != "3600" {
  30. t.Fatalf(`Unexpected Access-Control-Max-Age header, got %q`, got)
  31. }
  32. }
  33. func TestVersionHandler(t *testing.T) {
  34. h := &handler{}
  35. r := httptest.NewRequest(http.MethodGet, "/v1/version", nil)
  36. w := httptest.NewRecorder()
  37. h.versionHandler(w, r)
  38. if got := w.Code; got != http.StatusOK {
  39. t.Fatalf(`Unexpected status code, got %d instead of %d`, got, http.StatusOK)
  40. }
  41. if got := w.Header().Get("Content-Type"); got != "application/json" {
  42. t.Fatalf(`Unexpected Content-Type header, got %q`, got)
  43. }
  44. var responseBody versionResponse
  45. if err := json.NewDecoder(w.Body).Decode(&responseBody); err != nil {
  46. t.Fatalf("Unexpected JSON decoding error: %v", err)
  47. }
  48. if responseBody.Version != version.Version {
  49. t.Fatalf(`Unexpected version, got %q instead of %q`, responseBody.Version, version.Version)
  50. }
  51. if responseBody.Commit != version.Commit {
  52. t.Fatalf(`Unexpected commit, got %q instead of %q`, responseBody.Commit, version.Commit)
  53. }
  54. if responseBody.BuildDate != version.BuildDate {
  55. t.Fatalf(`Unexpected build date, got %q instead of %q`, responseBody.BuildDate, version.BuildDate)
  56. }
  57. if responseBody.GoVersion != runtime.Version() {
  58. t.Fatalf(`Unexpected Go version, got %q instead of %q`, responseBody.GoVersion, runtime.Version())
  59. }
  60. if responseBody.Compiler != runtime.Compiler {
  61. t.Fatalf(`Unexpected compiler, got %q instead of %q`, responseBody.Compiler, runtime.Compiler)
  62. }
  63. if responseBody.Arch != runtime.GOARCH {
  64. t.Fatalf(`Unexpected architecture, got %q instead of %q`, responseBody.Arch, runtime.GOARCH)
  65. }
  66. if responseBody.OS != runtime.GOOS {
  67. t.Fatalf(`Unexpected OS, got %q instead of %q`, responseBody.OS, runtime.GOOS)
  68. }
  69. }
  70. func TestNewHandlerSupportsBasePathStripping(t *testing.T) {
  71. scenarios := []struct {
  72. name string
  73. prefix string
  74. path string
  75. }{
  76. {name: "empty base path", prefix: "", path: "/v1/users"},
  77. {name: "non empty base path", prefix: "/base", path: "/base/v1/users"},
  78. }
  79. for _, scenario := range scenarios {
  80. t.Run(scenario.name, func(t *testing.T) {
  81. handler := http.StripPrefix(scenario.prefix, NewHandler(nil, nil))
  82. r := httptest.NewRequest(http.MethodOptions, scenario.path, nil)
  83. w := httptest.NewRecorder()
  84. handler.ServeHTTP(w, r)
  85. if got := w.Code; got != http.StatusNoContent {
  86. t.Fatalf(`Unexpected status code, got %d instead of %d`, got, http.StatusNoContent)
  87. }
  88. })
  89. }
  90. }