From b7af1944921e5f9ae5135309631e4187958b0640 Mon Sep 17 00:00:00 2001 From: Fendy Date: Wed, 26 Aug 2026 23:40:17 +0800 Subject: [PATCH] test: integration test --- tests/integration_test.go | 108 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 tests/integration_test.go diff --git a/tests/integration_test.go b/tests/integration_test.go new file mode 100644 index 0000000..e6914e1 --- /dev/null +++ b/tests/integration_test.go @@ -0,0 +1,108 @@ +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) + } +}