package tasks import ( "fmt" "testing" "github.com/glebarez/sqlite" "github.com/stretchr/testify/require" "gorm.io/gorm" "senlinai-agent/backend/internal/domain" ) func TestAssigneeOnlySeesExplicitlySharedObjects(t *testing.T) { database := newTestDB(t) assigneeID := uint(2) task := domain.Task{ProjectID: 1, CreatedBy: 1, AssigneeID: &assigneeID, Title: "处理合同"} note := domain.Note{ProjectID: 1, CreatedBy: 1, Title: "合同背景", Markdown: "只在共享后可见"} require.NoError(t, database.Create(&task).Error) require.NoError(t, database.Create(¬e).Error) service := NewService(database) before, err := service.VisibleLinkedObjects(task.ID, assigneeID) require.NoError(t, err) require.Empty(t, before) require.NoError(t, service.ShareObject(task.ID, "note", note.ID)) after, err := service.VisibleLinkedObjects(task.ID, assigneeID) require.NoError(t, err) require.Len(t, after, 1) require.Equal(t, "note", after[0].ObjectType) require.Equal(t, note.ID, after[0].ObjectID) } func TestShareObjectRejectsUnsupportedType(t *testing.T) { database := newTestDB(t) service := NewService(database) err := service.ShareObject(1, "ai_session", 9) require.ErrorContains(t, err, "unsupported shared object type") } func TestAssignRecordsProjectEvent(t *testing.T) { database := newTestDB(t) task := domain.Task{ProjectID: 7, CreatedBy: 1, Title: "安排评审"} require.NoError(t, database.Create(&task).Error) service := NewService(database) require.NoError(t, service.Assign(task.ID, 2)) var event domain.ProjectEvent require.NoError(t, database.Where("project_id = ? AND entity_type = ? AND entity_id = ?", 7, "task", task.ID).First(&event).Error) require.Equal(t, "task_assigned", event.EventType) } func newTestDB(t *testing.T) *gorm.DB { t.Helper() database, err := gorm.Open(sqlite.Open(fmt.Sprintf("file:%s?mode=memory&cache=shared", t.Name())), &gorm.Config{}) require.NoError(t, err) require.NoError(t, domain.AutoMigrate(database)) return database }