109 lines
3.1 KiB
Go
109 lines
3.1 KiB
Go
package tests
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/json"
|
|
"mime/multipart"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
"yoresee_dropbox/internal/app"
|
|
)
|
|
|
|
func TestIntegration(t *testing.T) {
|
|
dir := t.TempDir()
|
|
workspace := filepath.Join(dir, "workspace")
|
|
os.MkdirAll(filepath.Join(workspace, "inbox"), 0755)
|
|
os.MkdirAll(filepath.Join(workspace, "outbox"), 0755)
|
|
os.MkdirAll(filepath.Join(workspace, ".ydropbox"), 0755)
|
|
|
|
cfg := app.Config{
|
|
Workspace: workspace,
|
|
Token: "test-token",
|
|
}
|
|
|
|
handler, store, err := app.NewHandler(cfg)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
defer store.Close()
|
|
|
|
ts := httptest.NewServer(handler)
|
|
defer ts.Close()
|
|
|
|
client := ts.Client()
|
|
|
|
loginBody := bytes.NewBufferString(`{"token":"test-token"}`)
|
|
loginRes, err := client.Post(ts.URL+"/api/login", "application/json", loginBody)
|
|
if err != nil || loginRes.StatusCode != 200 {
|
|
t.Fatalf("Login failed: %v, status: %d", err, loginRes.StatusCode)
|
|
}
|
|
|
|
body := &bytes.Buffer{}
|
|
writer := multipart.NewWriter(body)
|
|
part, _ := writer.CreateFormFile("file", "test.txt")
|
|
part.Write([]byte("hello world"))
|
|
writer.Close()
|
|
|
|
uploadReq, _ := http.NewRequest("POST", ts.URL+"/api/upload", body)
|
|
uploadReq.Header.Set("Content-Type", writer.FormDataContentType())
|
|
for _, cookie := range loginRes.Cookies() {
|
|
uploadReq.AddCookie(cookie)
|
|
}
|
|
uploadRes, err := client.Do(uploadReq)
|
|
if err != nil || uploadRes.StatusCode != 201 {
|
|
t.Fatalf("Upload failed: %v, status: %d", err, uploadRes.StatusCode)
|
|
}
|
|
|
|
var uploadResp map[string]any
|
|
json.NewDecoder(uploadRes.Body).Decode(&uploadResp)
|
|
file := uploadResp["file"].(map[string]any)
|
|
fileID := file["id"].(string)
|
|
|
|
listReq, _ := http.NewRequest("GET", ts.URL+"/api/files?dir=inbox", nil)
|
|
for _, cookie := range loginRes.Cookies() {
|
|
listReq.AddCookie(cookie)
|
|
}
|
|
listRes, err := client.Do(listReq)
|
|
if err != nil || listRes.StatusCode != 200 {
|
|
t.Fatalf("List failed: %v, status: %d", err, listRes.StatusCode)
|
|
}
|
|
|
|
var listResp map[string]any
|
|
json.NewDecoder(listRes.Body).Decode(&listResp)
|
|
files := listResp["files"].([]any)
|
|
if len(files) != 1 {
|
|
t.Errorf("Expected 1 file, got %d", len(files))
|
|
}
|
|
|
|
dlReq, _ := http.NewRequest("GET", ts.URL+"/api/files/"+fileID+"/download", nil)
|
|
for _, cookie := range loginRes.Cookies() {
|
|
dlReq.AddCookie(cookie)
|
|
}
|
|
dlRes, err := client.Do(dlReq)
|
|
if err != nil || dlRes.StatusCode != 200 {
|
|
t.Fatalf("Download failed: %v, status: %d", err, dlRes.StatusCode)
|
|
}
|
|
|
|
shareReq, _ := http.NewRequest("POST", ts.URL+"/api/files/"+fileID+"/share", bytes.NewBufferString(`{}`))
|
|
shareReq.Header.Set("Content-Type", "application/json")
|
|
for _, cookie := range loginRes.Cookies() {
|
|
shareReq.AddCookie(cookie)
|
|
}
|
|
shareRes, err := client.Do(shareReq)
|
|
if err != nil || shareRes.StatusCode != 201 {
|
|
t.Fatalf("Share create failed: %v, status: %d", err, shareRes.StatusCode)
|
|
}
|
|
|
|
var shareResp map[string]any
|
|
json.NewDecoder(shareRes.Body).Decode(&shareResp)
|
|
shareURL := shareResp["url"].(string)
|
|
|
|
pubRes, err := client.Get(ts.URL + shareURL)
|
|
if err != nil || pubRes.StatusCode != 200 {
|
|
t.Fatalf("Public share access failed: %v, status: %d", err, pubRes.StatusCode)
|
|
}
|
|
}
|