package accesscontrol import ( "errors" "testing" "github.com/Tencent/WeKnora/internal/types" "gorm.io/gorm" ) func TestKnowledgeReviewIsScopedImmutableAndComplete(t *testing.T) { s, _, source := knowledgeVersionFixture(t) alice := versionContext(1, "alice", false) f, err := s.forkResource(alice, "knowledge", source) if err != nil { t.Fatal(err) } runVersionJob(t, s) r, err := s.submitResourceVersion(alice, f.ID, "") if err != nil { t.Fatal(err) } if _, err := s.knowledgeVersionReview(alice, r.ID, "", 1); !errors.Is(err, errConflict) { t.Fatal("unfinished snapshot readable", err) } runVersionJob(t, s) page, err := s.knowledgeVersionReview(alice, r.ID, "", 1) if err != nil || page.Total != 1 || len(page.Documents) != 1 { t.Fatal("missing snapshot documents", page, err) } doc := page.Documents[0].ID text, err := s.knowledgeVersionReview(versionContext(1, "owner", true), r.ID, doc, 1) if err != nil || text.Total != 1 || text.Chunks[0].Content != "原片段" { t.Fatal("missing full text", text, err) } if err := s.db.Model(&types.Chunk{}).Where("knowledge_base_id=?", f.PersonalID).Update("content", "later personal edit").Error; err != nil { t.Fatal(err) } text, err = s.knowledgeVersionReview(alice, r.ID, doc, 1) if err != nil || text.Chunks[0].Content != "原片段" { t.Fatal("review followed live personal content", err) } for _, ctx := range []struct { tenant uint64 user string admin bool }{{1, "bob", false}, {2, "alice", true}} { if _, err := s.knowledgeVersionReview(versionContext(ctx.tenant, ctx.user, ctx.admin), r.ID, "", 1); !errors.Is(err, gorm.ErrRecordNotFound) { t.Fatal("snapshot authorization bypass", ctx, err) } } var sourceDoc types.Knowledge s.db.Where("knowledge_base_id=?", source).First(&sourceDoc) if _, err := s.knowledgeVersionReview(alice, r.ID, sourceDoc.ID, 1); !errors.Is(err, gorm.ErrRecordNotFound) { t.Fatal("foreign document readable", err) } if err := s.reviewResourceVersion(versionContext(1, "owner", true), r.ID, true, ""); err != nil { t.Fatal(err) } if _, err := s.knowledgeVersionReview(alice, r.ID, doc, 1); !errors.Is(err, errConflict) { t.Fatal("mutable publication presented as immutable snapshot", err) } }