From 5f78fe6619db6b1bb639c741d7657e5db51c3340 Mon Sep 17 00:00:00 2001 From: andreimarcu Date: Mon, 28 Sep 2015 16:02:03 -0400 Subject: [PATCH] Added tests for uploads --- server.go | 2 +- server_test.go | 253 ++++++++++++++++++++++++++++++++++++++++++++++++- upload.go | 8 +- 3 files changed, 260 insertions(+), 3 deletions(-) diff --git a/server.go b/server.go index 7abdaa1..0a46521 100644 --- a/server.go +++ b/server.go @@ -58,7 +58,7 @@ func setup() { goji.Get("/", indexHandler) goji.Post("/upload", uploadPostHandler) - goji.Post("/upload/", http.RedirectHandler("/upload", 301)) + goji.Post("/upload/", uploadPostHandler) goji.Put("/upload", uploadPutHandler) goji.Put("/upload/:name", uploadPutHandler) diff --git a/server_test.go b/server_test.go index 0529448..ef14e56 100644 --- a/server_test.go +++ b/server_test.go @@ -1,10 +1,12 @@ package main import ( + "encoding/json" "net/http" "net/http/httptest" "os" "path" + "strconv" "strings" "testing" @@ -14,6 +16,7 @@ import ( func TestSetup(t *testing.T) { Config.siteURL = "http://linx.example.org/" Config.filesDir = path.Join(os.TempDir(), randomString(10)) + t.Log(os.TempDir()) Config.metaDir = Config.filesDir + "_meta" Config.noLogs = true Config.siteName = "linx" @@ -31,7 +34,7 @@ func TestIndex(t *testing.T) { goji.DefaultMux.ServeHTTP(w, req) if !strings.Contains(w.Body.String(), "file-uploader") { - t.Error("String 'file-uploader' not found in index response") + t.Fatal("String 'file-uploader' not found in index response") } } @@ -84,6 +87,254 @@ func TestDisplayNotFound(t *testing.T) { } } +func TestPostBodyUpload(t *testing.T) { + w := httptest.NewRecorder() + + filename := randomString(10) + ".ext" + + req, err := http.NewRequest("POST", "/upload", strings.NewReader("File content")) + if err != nil { + t.Fatal(err) + } + + req.Header.Set("Content-Type", "application/octet-stream") + params := req.URL.Query() + params.Add("qqfile", filename) + req.URL.RawQuery = params.Encode() + + goji.DefaultMux.ServeHTTP(w, req) + + if w.Code != 301 { + t.Fatalf("Status code is not 301, but %d", w.Code) + } + if w.Header().Get("Location") != "/"+filename { + t.Fatalf("Was redirected to %s instead of /%s", w.Header().Get("Location"), filename) + } +} + +func TestPostEmptyBodyUpload(t *testing.T) { + w := httptest.NewRecorder() + + filename := randomString(10) + ".ext" + + req, err := http.NewRequest("POST", "/upload", strings.NewReader("")) + if err != nil { + t.Fatal(err) + } + + req.Header.Set("Content-Type", "application/octet-stream") + params := req.URL.Query() + params.Add("qqfile", filename) + req.URL.RawQuery = params.Encode() + + goji.DefaultMux.ServeHTTP(w, req) + + if w.Code == 301 { + t.Fatal("Status code is 301") + } + + if !strings.Contains(w.Body.String(), "Oops! Something went wrong.") { + t.Fatal("Response doesn't contain'Oops! Something went wrong.'") + } +} + +func TestPostBodyRandomizeUpload(t *testing.T) { + w := httptest.NewRecorder() + + filename := randomString(10) + ".ext" + + req, err := http.NewRequest("POST", "/upload", strings.NewReader("File content")) + if err != nil { + t.Fatal(err) + } + + req.Header.Set("Content-Type", "application/octet-stream") + params := req.URL.Query() + params.Add("qqfile", filename) + params.Add("randomize", "true") + req.URL.RawQuery = params.Encode() + + goji.DefaultMux.ServeHTTP(w, req) + + if w.Code != 301 { + t.Fatalf("Status code is not 301, but %d", w.Code) + } + if w.Header().Get("Location") == "/"+filename { + t.Fatalf("Was redirected to %s instead of something random", filename) + } +} + +func TestPostBodyExpireUpload(t *testing.T) { + // Dependant on json info on display url to check expiry +} + +func TestPutUpload(t *testing.T) { + w := httptest.NewRecorder() + + filename := randomString(10) + ".ext" + + req, err := http.NewRequest("PUT", "/upload/"+filename, strings.NewReader("File content")) + if err != nil { + t.Fatal(err) + } + + goji.DefaultMux.ServeHTTP(w, req) + + if w.Body.String() != Config.siteURL+filename { + t.Fatal("Response was not expected URL") + } + + // if w.Code != 301 { + // t.Fatalf("Status code is not 301, but %d", w.Code) + // } + // if w.Header().Get("Location") != "/"+filename { + // t.Fatalf("Was redirected to %s instead of /%s", w.Header().Get("Location"), filename) + // } +} + +func TestPutRandomizedUpload(t *testing.T) { + w := httptest.NewRecorder() + + filename := randomString(10) + ".ext" + + req, err := http.NewRequest("PUT", "/upload/"+filename, strings.NewReader("File content")) + if err != nil { + t.Fatal(err) + } + + req.Header.Set("X-Randomized-Barename", "yes") + + goji.DefaultMux.ServeHTTP(w, req) + + if w.Body.String() == Config.siteURL+filename { + t.Fatal("Filename was not random") + } +} + +func TestPutEmptyUpload(t *testing.T) { + w := httptest.NewRecorder() + + filename := randomString(10) + ".ext" + + req, err := http.NewRequest("PUT", "/upload/"+filename, strings.NewReader("")) + if err != nil { + t.Fatal(err) + } + + req.Header.Set("X-Randomized-Barename", "yes") + + goji.DefaultMux.ServeHTTP(w, req) + + if !strings.Contains(w.Body.String(), "Oops! Something went wrong.") { + t.Fatal("Response doesn't contain'Oops! Something went wrong.'") + } +} + +func TestPutJSONUpload(t *testing.T) { + type RespJSON struct { + Filename string `json: filename` + Url string `json: url` + DeleteKey string `json: delete_key` + Expiry string `json: expiry` + Size string `json: size` + } + var myjson RespJSON + + w := httptest.NewRecorder() + + filename := randomString(10) + ".ext" + + req, err := http.NewRequest("PUT", "/upload/"+filename, strings.NewReader("File content")) + if err != nil { + t.Fatal(err) + } + + req.Header.Set("Accept", "application/json") + + goji.DefaultMux.ServeHTTP(w, req) + + err = json.Unmarshal([]byte(w.Body.String()), &myjson) + if err != nil { + t.Fatal(err) + } + + if myjson.Filename != filename { + t.Fatal("Filename was not provided one but " + myjson.Filename) + } +} + +func TestPutRandomizedJSONUpload(t *testing.T) { + type RespJSON struct { + Filename string `json: filename` + Url string `json: url` + DeleteKey string `json: delete_key` + Expiry string `json: expiry` + Size string `json: size` + } + var myjson RespJSON + + w := httptest.NewRecorder() + + filename := randomString(10) + ".ext" + + req, err := http.NewRequest("PUT", "/upload/"+filename, strings.NewReader("File content")) + if err != nil { + t.Fatal(err) + } + + req.Header.Set("Accept", "application/json") + req.Header.Set("X-Randomized-Barename", "yes") + + goji.DefaultMux.ServeHTTP(w, req) + + err = json.Unmarshal([]byte(w.Body.String()), &myjson) + if err != nil { + t.Fatal(err) + } + + if myjson.Filename == filename { + t.Fatal("Filename was not random ") + } +} + +func TestPutExpireJSONUpload(t *testing.T) { + type RespJSON struct { + Filename string `json: filename` + Url string `json: url` + DeleteKey string `json: delete_key` + Expiry string `json: expiry` + Size string `json: size` + } + var myjson RespJSON + + w := httptest.NewRecorder() + + filename := randomString(10) + ".ext" + + req, err := http.NewRequest("PUT", "/upload/"+filename, strings.NewReader("File content")) + if err != nil { + t.Fatal(err) + } + + req.Header.Set("Accept", "application/json") + req.Header.Set("X-File-Expiry", "600") + + goji.DefaultMux.ServeHTTP(w, req) + + err = json.Unmarshal([]byte(w.Body.String()), &myjson) + if err != nil { + t.Fatal(err) + } + + expiry, err := strconv.Atoi(myjson.Expiry) + if err != nil { + t.Fatal("Expiry was not an integer") + } + if expiry < 1 { + t.Fatal("Expiry was not set") + } +} + func TestShutdown(t *testing.T) { os.RemoveAll(Config.filesDir) os.RemoveAll(Config.metaDir) diff --git a/upload.go b/upload.go index a5ac710..4b2d531 100644 --- a/upload.go +++ b/upload.go @@ -2,6 +2,7 @@ package main import ( "encoding/json" + "errors" "fmt" "io" "net/http" @@ -118,6 +119,9 @@ func uploadHeaderProcess(r *http.Request, upReq *UploadRequest) { } func processUpload(upReq UploadRequest) (upload Upload, err error) { + + // if UploadRequest.src + // Determine the appropriate filename, then write to disk barename, extension := barePlusExt(upReq.filename) @@ -169,7 +173,9 @@ func processUpload(upReq UploadRequest) (upload Upload, err error) { if err != nil { return } else if bytes == 0 { - return + os.Remove(path.Join(Config.filesDir, upload.Filename)) + os.Remove(path.Join(Config.metaDir, upload.Filename)) + return upload, errors.New("Empty file") } upload.Size = bytes