package service import ( "errors" "strings" "testing" "github.com/freefire/jiang13-bbs/model" "github.com/glebarez/sqlite" "gorm.io/gorm" ) func newSitePageTestService(t *testing.T) *SitePageService { t.Helper() db, err := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{}) if err != nil { t.Fatalf("open sqlite: %v", err) } if err := db.AutoMigrate(&model.SitePage{}); err != nil { t.Fatalf("migrate: %v", err) } return NewSitePageService(db) } func sitePageInput(slug, title string) *SitePageInput { return &SitePageInput{Slug: slug, Title: title, Content: "正文内容"} } func TestSitePageSlugReuseAfterSoftDelete(t *testing.T) { s := newSitePageTestService(t) p, err := s.Create(sitePageInput("test", "测试")) if err != nil { t.Fatalf("create: %v", err) } if err := s.Delete(p.ID); err != nil { t.Fatalf("delete: %v", err) } // 软删后重建同 slug:报"已删除"提示而非数据库唯一索引错误 _, err = s.Create(sitePageInput("test", "重建")) if err == nil || !strings.Contains(err.Error(), "已删除") { t.Fatalf("软删后重建应提示已删除单页占用,got %v", err) } // 管理端列表含软删行且带 deleted 标记 all, err := s.ListAll() if err != nil { t.Fatalf("ListAll: %v", err) } if len(all) != 1 || !all[0].Deleted || all[0].Slug != "test" { t.Fatalf("ListAll 应含软删单页且 Deleted=true,got %+v", all) } // 彻底删除后可重建 if err := s.Purge(p.ID); err != nil { t.Fatalf("purge: %v", err) } if _, err := s.Create(sitePageInput("test", "重建")); err != nil { t.Fatalf("purge 后重建同 slug 不应报错: %v", err) } } func TestSitePagePurgeRequiresDeleted(t *testing.T) { s := newSitePageTestService(t) p, _ := s.Create(sitePageInput("alive", "在用")) if err := s.Purge(p.ID); err == nil || !errors.Is(err, ErrSitePageNotDeleted) { t.Fatalf("未删单页 Purge 应拒绝,got %v", err) } }