package registry import ( "strings" "testing" ) func TestProjectRegistryKeepsProjectsIsolated(t *testing.T) { root := t.TempDir() projects, err := NewProjectRegistry(root) if err != nil { t.Fatal(err) } _, ssl, err := projects.Ensure("ssl", "SSL", "证书项目") if err != nil { t.Fatal(err) } _, smail, err := projects.Ensure("smail", "Smail", "邮件项目") if err != nil { t.Fatal(err) } if _, err := ssl.AddPackage(Package{ Name: "shared", Version: "1.0.0", Platform: "linux", Architecture: "amd64", Status: "published", }, strings.NewReader("ssl")); err != nil { t.Fatal(err) } if _, err := smail.AddPackage(Package{ Name: "shared", Version: "1.0.0", Platform: "linux", Architecture: "amd64", Status: "published", }, strings.NewReader("smail")); err != nil { t.Fatal(err) } sslItem, ok := ssl.Latest("shared") if !ok || sslItem.SHA256 == "" { t.Fatal("SSL 项目未保存包") } smailItem, ok := smail.Latest("shared") if !ok || smailItem.SHA256 == "" { t.Fatal("Smail 项目未保存包") } if sslItem.SHA256 == smailItem.SHA256 { t.Fatal("不同项目不应共享同一个包内容") } if len(projects.List()) != 2 { t.Fatalf("项目数量错误:%d", len(projects.List())) } reloaded, err := NewProjectRegistry(root) if err != nil { t.Fatal(err) } store, ok := reloaded.Store("ssl") if !ok { t.Fatal("重载后找不到 SSL 项目") } if item, ok := store.Latest("shared"); !ok || item.SHA256 == "" { t.Fatalf("项目包重载结果异常:%+v", item) } } func TestValidateProjectID(t *testing.T) { for _, value := range []string{"ssl", "Smail_2", "release.center"} { if err := ValidateProjectID(value); err != nil { t.Errorf("项目标识 %q 不应失败:%v", value, err) } } for _, value := range []string{"", "../ssl", "项目", "a/b"} { if err := ValidateProjectID(value); err == nil { t.Errorf("项目标识 %q 应该失败", value) } } } func TestProjectRegistryUpdatePersistsStatus(t *testing.T) { root := t.TempDir() projects, err := NewProjectRegistry(root) if err != nil { t.Fatal(err) } created, err := projects.Create(Project{ID: "ssl", Name: "SSL", Description: "证书项目"}) if err != nil { t.Fatal(err) } updated, err := projects.Update("ssl", Project{ Name: "SSL 发布中心", Description: "证书项目更新", Status: "disabled", }) if err != nil { t.Fatal(err) } if updated.ID != created.ID || updated.Status != "disabled" || updated.Name != "SSL 发布中心" { t.Fatalf("项目更新结果错误:%+v", updated) } loaded, err := NewProjectRegistry(root) if err != nil { t.Fatal(err) } persisted, ok := loaded.Get("ssl") if !ok || persisted.Status != "disabled" || persisted.Description != "证书项目更新" { t.Fatalf("项目更新未持久化:%+v %v", persisted, ok) } }