99 lines
2.8 KiB
Go
99 lines
2.8 KiB
Go
package server
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/json"
|
|
"mime/multipart"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"strings"
|
|
"testing"
|
|
|
|
"chat-agent-system/internal/bizdev"
|
|
"chat-agent-system/internal/config"
|
|
)
|
|
|
|
func TestUploadProjectAsset(t *testing.T) {
|
|
cfg := &config.Config{Env: "test", DataDir: t.TempDir()}
|
|
svc := bizdev.MustNewService(t, cfg)
|
|
srv := NewServer(cfg, svc)
|
|
ts := httptest.NewServer(srv.Routes())
|
|
defer ts.Close()
|
|
|
|
var body bytes.Buffer
|
|
w := multipart.NewWriter(&body)
|
|
part, _ := w.CreateFormFile("file", "spec.txt")
|
|
_, _ = part.Write([]byte("project asset content"))
|
|
_ = w.Close()
|
|
|
|
req, _ := http.NewRequest(http.MethodPost, ts.URL+"/api/v1/projects/7/assets", &body)
|
|
req.Header.Set("Content-Type", w.FormDataContentType())
|
|
withBearerAuth(req, loginTestAdmin(t, srv))
|
|
resp, err := http.DefaultClient.Do(req)
|
|
if err != nil {
|
|
t.Fatalf("upload failed: %v", err)
|
|
}
|
|
defer resp.Body.Close()
|
|
if resp.StatusCode != http.StatusOK {
|
|
t.Fatalf("status=%d", resp.StatusCode)
|
|
}
|
|
var out projectAssetResponse
|
|
if err := json.NewDecoder(resp.Body).Decode(&out); err != nil {
|
|
t.Fatalf("decode: %v", err)
|
|
}
|
|
if out.AssetID <= 0 || out.SHA256 == "" {
|
|
t.Fatalf("unexpected response: %+v", out)
|
|
}
|
|
}
|
|
|
|
func TestUploadProjectAsset_RejectsHTML(t *testing.T) {
|
|
cfg := &config.Config{Env: "test", DataDir: t.TempDir()}
|
|
srv := NewServer(cfg, bizdev.MustNewService(t, cfg))
|
|
ts := httptest.NewServer(srv.Routes())
|
|
defer ts.Close()
|
|
|
|
var body bytes.Buffer
|
|
w := multipart.NewWriter(&body)
|
|
part, _ := w.CreateFormFile("file", "evil.txt")
|
|
_, _ = part.Write([]byte("<html><body>x</body></html>"))
|
|
_ = w.Close()
|
|
|
|
req, _ := http.NewRequest(http.MethodPost, ts.URL+"/api/v1/projects/7/assets", &body)
|
|
req.Header.Set("Content-Type", w.FormDataContentType())
|
|
withBearerAuth(req, loginTestAdmin(t, srv))
|
|
resp, err := http.DefaultClient.Do(req)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
defer resp.Body.Close()
|
|
if resp.StatusCode != http.StatusUnsupportedMediaType {
|
|
t.Fatalf("expected 415, got %d", resp.StatusCode)
|
|
}
|
|
}
|
|
|
|
func TestUploadProjectAsset_RejectsOversizedFilename(t *testing.T) {
|
|
cfg := &config.Config{Env: "test", DataDir: t.TempDir()}
|
|
srv := NewServer(cfg, bizdev.MustNewService(t, cfg))
|
|
ts := httptest.NewServer(srv.Routes())
|
|
defer ts.Close()
|
|
|
|
longName := strings.Repeat("a", 201) + ".txt"
|
|
var body bytes.Buffer
|
|
w := multipart.NewWriter(&body)
|
|
part, _ := w.CreateFormFile("file", longName)
|
|
_, _ = part.Write([]byte("ok"))
|
|
_ = w.Close()
|
|
|
|
req, _ := http.NewRequest(http.MethodPost, ts.URL+"/api/v1/projects/7/assets", &body)
|
|
req.Header.Set("Content-Type", w.FormDataContentType())
|
|
withBearerAuth(req, loginTestAdmin(t, srv))
|
|
resp, err := http.DefaultClient.Do(req)
|
|
if err != nil {
|
|
t.Fatalf("request failed: %v", err)
|
|
}
|
|
defer resp.Body.Close()
|
|
if resp.StatusCode != http.StatusUnsupportedMediaType {
|
|
t.Fatalf("expected 415 for long filename, got %d", resp.StatusCode)
|
|
}
|
|
}
|