package app import ( "crypto/sha256" "encoding/hex" "io" "net/http" "net/http/httptest" "net/url" "strings" "testing" ) func TestValidRegistrySegment(t *testing.T) { t.Parallel() valid := []string{"sentinelone-linux", "26.2.0.10", "agent_x86_64+release.deb"} for _, value := range valid { if !validRegistrySegment(value, 255) { t.Errorf("expected %q to be valid", value) } } invalid := []string{"", "../agent.deb", "agent/name.deb", "agent name.deb"} for _, value := range invalid { if validRegistrySegment(value, 255) { t.Errorf("expected %q to be invalid", value) } } } func TestStreamPackageToGitea(t *testing.T) { t.Parallel() content := "test package content" registry := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { if r.Method != http.MethodPut { t.Errorf("method = %s, want PUT", r.Method) } if r.URL.Path != "/api/packages/TAI/generic/sentinelone-linux/26.2.0.10/agent.deb" { t.Errorf("path = %s", r.URL.Path) } username, password, ok := r.BasicAuth() if !ok || username != "publisher" || password != "write-token" { t.Errorf("unexpected registry credentials") } body, err := io.ReadAll(r.Body) if err != nil { t.Fatal(err) } if string(body) != content { t.Errorf("body = %q", body) } w.WriteHeader(http.StatusCreated) })) defer registry.Close() registryURL, err := url.Parse(registry.URL) if err != nil { t.Fatal(err) } server := &Server{ cfg: Config{ GiteaURL: registryURL, GiteaPackageOwner: "TAI", GiteaWriteUser: "publisher", GiteaWriteToken: "write-token", }, packageClient: registry.Client(), } request := httptest.NewRequest(http.MethodPost, "/portal/packages/upload", nil) checksum, size, status, err := server.streamPackageToGitea( request, "sentinelone-linux", "26.2.0.10", "agent.deb", strings.NewReader(content), ) if err != nil { t.Fatal(err) } expected := sha256.Sum256([]byte(content)) if checksum != hex.EncodeToString(expected[:]) { t.Errorf("checksum = %s", checksum) } if size != int64(len(content)) { t.Errorf("size = %d", size) } if status != http.StatusCreated { t.Errorf("status = %d", status) } } func TestDeletePackageVersion(t *testing.T) { t.Parallel() registry := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { if r.Method != http.MethodDelete { t.Errorf("method = %s, want DELETE", r.Method) } if r.URL.Path != "/api/packages/TAI/generic/sentinelone-linux/26.1.1.31" { t.Errorf("path = %s", r.URL.Path) } username, password, ok := r.BasicAuth() if !ok || username != "publisher" || password != "write-token" { t.Errorf("unexpected registry credentials") } w.WriteHeader(http.StatusNoContent) })) defer registry.Close() registryURL, err := url.Parse(registry.URL) if err != nil { t.Fatal(err) } server := &Server{ cfg: Config{ GiteaURL: registryURL, GiteaPackageOwner: "TAI", GiteaWriteUser: "publisher", GiteaWriteToken: "write-token", }, packageClient: registry.Client(), } request := httptest.NewRequest(http.MethodPost, "/portal/packages/upload", nil) if err := server.deletePackageVersion(request, "sentinelone-linux", "26.1.1.31"); err != nil { t.Fatal(err) } }