package blossom import ( "bytes" "crypto/sha256" "encoding/hex" "encoding/json" "io" "net/http" "net/http/httptest" "testing" ) func TestUploadAndDownload(t *testing.T) { srv, err := New(t.TempDir()) if err != nil { t.Fatal(err) } ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { // Bypass auth for testing if r.Method == "PUT" || r.Method == "POST" { srv.storeFile(w, r) return } srv.ServeHTTP(w, r) })) defer ts.Close() data := []byte("hello blossom") resp, err := http.Post(ts.URL+"/upload", "application/octet-stream", bytes.NewReader(data)) if err != nil { t.Fatal(err) } defer resp.Body.Close() if resp.StatusCode != 200 { body, _ := io.ReadAll(resp.Body) t.Fatalf("upload status %d: %s", resp.StatusCode, body) } var result map[string]any if err := json.NewDecoder(resp.Body).Decode(&result); err != nil { t.Fatal(err) } hash, ok := result["sha256"].(string) if !ok || len(hash) != 64 { t.Fatalf("bad hash in response: %v", result) } // Verify hash expected := sha256.Sum256(data) if hash != hex.EncodeToString(expected[:]) { t.Error("hash mismatch") } // Download resp2, err := http.Get(ts.URL + "/" + hash) if err != nil { t.Fatal(err) } defer resp2.Body.Close() got, _ := io.ReadAll(resp2.Body) if !bytes.Equal(got, data) { t.Errorf("download mismatch: got %q, want %q", got, data) } } func TestDownloadNotFound(t *testing.T) { srv, err := New(t.TempDir()) if err != nil { t.Fatal(err) } ts := httptest.NewServer(srv) defer ts.Close() resp, err := http.Get(ts.URL + "/" + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa") if err != nil { t.Fatal(err) } resp.Body.Close() if resp.StatusCode != 404 { t.Errorf("expected 404, got %d", resp.StatusCode) } } func TestBadHashPath(t *testing.T) { srv, err := New(t.TempDir()) if err != nil { t.Fatal(err) } ts := httptest.NewServer(srv) defer ts.Close() resp, err := http.Get(ts.URL + "/not-a-hash") if err != nil { t.Fatal(err) } resp.Body.Close() if resp.StatusCode != 404 { t.Errorf("expected 404 for bad hash, got %d", resp.StatusCode) } } func TestIsHex(t *testing.T) { if !isHex("0123456789abcdef") { t.Error("valid hex rejected") } if isHex("xyz") { t.Error("invalid hex accepted") } }