Micro-service for file storage and processing written in Go
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

124 lines
3.8 KiB

  1. package main
  2. import (
  3. "encoding/base64"
  4. "encoding/json"
  5. "fmt"
  6. "net/http"
  7. "net/http/httptest"
  8. "testing"
  9. "github.com/bxcodec/faker/v3"
  10. "github.com/geplauder/lithium/pipelines"
  11. "github.com/geplauder/lithium/settings"
  12. "github.com/geplauder/lithium/storage"
  13. "github.com/gorilla/mux"
  14. "github.com/spf13/afero"
  15. "github.com/stretchr/testify/assert"
  16. )
  17. func TestIndexRoute(t *testing.T) {
  18. t.Run("Index route returns valid response", func(t *testing.T) {
  19. request := httptest.NewRequest(http.MethodGet, "/", nil)
  20. responseRecorder := httptest.NewRecorder()
  21. IndexHandler(responseRecorder, request)
  22. assert.Equal(t, 200, responseRecorder.Code, "Response code should be 200")
  23. assert.NotNil(t, responseRecorder.Body, "Response should contain body")
  24. })
  25. }
  26. func TestEndpointRoute(t *testing.T) {
  27. data := pipelines.Pipeline{}
  28. err := faker.FakeData(&data)
  29. assert.Nil(t, err)
  30. t.Run("Registered pipelines are valid routes", func(t *testing.T) {
  31. router := mux.NewRouter()
  32. fs := storage.GetMemoryStorageProvider()
  33. appSettings, _ := settings.LoadSettings(afero.NewMemMapFs())
  34. RegisterRoutes(router, appSettings, []pipelines.IPipeline{data}, fs)
  35. request, _ := http.NewRequest("GET", "/pipelines/"+data.Slug, nil)
  36. responseRecorder := httptest.NewRecorder()
  37. router.ServeHTTP(responseRecorder, request)
  38. assert.Equal(t, 200, responseRecorder.Code)
  39. body, _ := json.Marshal(data)
  40. assert.JSONEq(t, string(body), responseRecorder.Body.String())
  41. })
  42. t.Run("Unregistered pipelines return 404", func(t *testing.T) {
  43. router := mux.NewRouter()
  44. request, _ := http.NewRequest("GET", "/pipelines/"+data.Slug, nil)
  45. responseRecorder := httptest.NewRecorder()
  46. router.ServeHTTP(responseRecorder, request)
  47. assert.Equal(t, 404, responseRecorder.Code)
  48. })
  49. }
  50. func TestUploadRoute(t *testing.T) {
  51. t.Run("Test uploads missing multipart boundary", func(t *testing.T) {
  52. router := mux.NewRouter()
  53. fs := storage.GetMemoryStorageProvider()
  54. appSettings, _ := settings.LoadSettings(afero.NewMemMapFs())
  55. RegisterRoutes(router, appSettings, []pipelines.IPipeline{pipelines.Pipeline{
  56. Name: "",
  57. Slug: "",
  58. Type: 0,
  59. RemoveMetadata: false,
  60. Steps: []pipelines.Step{},
  61. Output: struct {
  62. Format string `json:"format"`
  63. Quality int `json:"quality"`
  64. }{"jpeg", 10},
  65. }}, fs)
  66. request, _ := http.NewRequest("POST", "/upload", nil)
  67. request.Header["Content-Type"] = []string{"multipart/form-data"}
  68. responseRecorder := httptest.NewRecorder()
  69. router.ServeHTTP(responseRecorder, request)
  70. assert.Equal(t, 0x1A6, responseRecorder.Code)
  71. str, _ := base64.StdEncoding.DecodeString("eyJlcnJvciI6Im5" +
  72. "vIG11bHRpcGFydCBib3VuZGFyeSBwYXJhbSBpbiBDb250ZW50LVR5cGUifQ==")
  73. assert.JSONEq(t, string(str), responseRecorder.Body.String())
  74. })
  75. t.Run("Test uploads missing multipart boundary", func(t *testing.T) {
  76. router := mux.NewRouter()
  77. fs := storage.GetMemoryStorageProvider()
  78. appSettings, _ := settings.LoadSettings(afero.NewMemMapFs())
  79. RegisterRoutes(router, appSettings, []pipelines.IPipeline{pipelines.Pipeline{
  80. Name: "",
  81. Slug: "",
  82. Type: 0,
  83. RemoveMetadata: false,
  84. Steps: []pipelines.Step{},
  85. Output: struct {
  86. Format string `json:"format"`
  87. Quality int `json:"quality"`
  88. }{"jpeg", 10},
  89. }}, fs)
  90. request, _ := http.NewRequest("POST", "/upload", nil)
  91. request.Header["Content-Type"] = []string{"multipart/form-data", "boundary=X-INSOMNIA-BOUNDARY"}
  92. responseRecorder := httptest.NewRecorder()
  93. router.ServeHTTP(responseRecorder, request)
  94. assert.Equal(t, 0x1A6, responseRecorder.Code)
  95. str, _ := base64.StdEncoding.DecodeString("eyJlcnJvciI6Im5vIG11bHRpcGFydCBib3VuZGFyeSBwYXJhbSBpbiBDb250ZW50LVR5cGUifQ==")
  96. assert.JSONEq(t, string(str), responseRecorder.Body.String())
  97. fmt.Println(responseRecorder.Body.String())
  98. })
  99. }