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

package main
import (
"encoding/base64"
"encoding/json"
"fmt"
"net/http"
"net/http/httptest"
"testing"
"github.com/bxcodec/faker/v3"
"github.com/geplauder/lithium/pipelines"
"github.com/geplauder/lithium/settings"
"github.com/geplauder/lithium/storage"
"github.com/gorilla/mux"
"github.com/spf13/afero"
"github.com/stretchr/testify/assert"
)
func TestIndexRoute(t *testing.T) {
t.Run("Index route returns valid response", func(t *testing.T) {
request := httptest.NewRequest(http.MethodGet, "/", nil)
responseRecorder := httptest.NewRecorder()
IndexHandler(responseRecorder, request)
assert.Equal(t, 200, responseRecorder.Code, "Response code should be 200")
assert.NotNil(t, responseRecorder.Body, "Response should contain body")
})
}
func TestEndpointRoute(t *testing.T) {
data := pipelines.Pipeline{}
err := faker.FakeData(&data)
assert.Nil(t, err)
t.Run("Registered pipelines are valid routes", func(t *testing.T) {
router := mux.NewRouter()
fs := storage.GetMemoryStorageProvider()
appSettings, _ := settings.LoadSettings(afero.NewMemMapFs())
RegisterRoutes(router, appSettings, []pipelines.IPipeline{data}, fs)
request, _ := http.NewRequest("GET", "/pipelines/"+data.Slug, nil)
responseRecorder := httptest.NewRecorder()
router.ServeHTTP(responseRecorder, request)
assert.Equal(t, 200, responseRecorder.Code)
body, _ := json.Marshal(data)
assert.JSONEq(t, string(body), responseRecorder.Body.String())
})
t.Run("Unregistered pipelines return 404", func(t *testing.T) {
router := mux.NewRouter()
request, _ := http.NewRequest("GET", "/pipelines/"+data.Slug, nil)
responseRecorder := httptest.NewRecorder()
router.ServeHTTP(responseRecorder, request)
assert.Equal(t, 404, responseRecorder.Code)
})
}
func TestUploadRoute(t *testing.T) {
t.Run("Test uploads missing multipart boundary", func(t *testing.T) {
router := mux.NewRouter()
fs := storage.GetMemoryStorageProvider()
appSettings, _ := settings.LoadSettings(afero.NewMemMapFs())
RegisterRoutes(router, appSettings, []pipelines.IPipeline{pipelines.Pipeline{
Name: "",
Slug: "",
Type: 0,
RemoveMetadata: false,
Steps: []pipelines.Step{},
Output: struct {
Format string `json:"format"`
Quality int `json:"quality"`
}{"jpeg", 10},
}}, fs)
request, _ := http.NewRequest("POST", "/upload", nil)
request.Header["Content-Type"] = []string{"multipart/form-data"}
responseRecorder := httptest.NewRecorder()
router.ServeHTTP(responseRecorder, request)
assert.Equal(t, 0x1A6, responseRecorder.Code)
str, _ := base64.StdEncoding.DecodeString("eyJlcnJvciI6Im5" +
"vIG11bHRpcGFydCBib3VuZGFyeSBwYXJhbSBpbiBDb250ZW50LVR5cGUifQ==")
assert.JSONEq(t, string(str), responseRecorder.Body.String())
})
t.Run("Test uploads missing multipart boundary", func(t *testing.T) {
router := mux.NewRouter()
fs := storage.GetMemoryStorageProvider()
appSettings, _ := settings.LoadSettings(afero.NewMemMapFs())
RegisterRoutes(router, appSettings, []pipelines.IPipeline{pipelines.Pipeline{
Name: "",
Slug: "",
Type: 0,
RemoveMetadata: false,
Steps: []pipelines.Step{},
Output: struct {
Format string `json:"format"`
Quality int `json:"quality"`
}{"jpeg", 10},
}}, fs)
request, _ := http.NewRequest("POST", "/upload", nil)
request.Header["Content-Type"] = []string{"multipart/form-data", "boundary=X-INSOMNIA-BOUNDARY"}
responseRecorder := httptest.NewRecorder()
router.ServeHTTP(responseRecorder, request)
assert.Equal(t, 0x1A6, responseRecorder.Code)
str, _ := base64.StdEncoding.DecodeString("eyJlcnJvciI6Im5vIG11bHRpcGFydCBib3VuZGFyeSBwYXJhbSBpbiBDb250ZW50LVR5cGUifQ==")
assert.JSONEq(t, string(str), responseRecorder.Body.String())
fmt.Println(responseRecorder.Body.String())
})
}