package projects import ( "fmt" "testing" "github.com/glebarez/sqlite" "github.com/stretchr/testify/require" "gorm.io/gorm" "senlinai-agent/backend/internal/domain" ) func TestProjectTagsAreScopedToProject(t *testing.T) { database := newTestDB(t) service := NewService(database) first, err := service.CreateProject(1, "Alpha", "") require.NoError(t, err) second, err := service.CreateProject(1, "Beta", "") require.NoError(t, err) _, err = service.CreateTag(first.ID, "重要") require.NoError(t, err) _, err = service.CreateTag(second.ID, "重要") require.NoError(t, err) firstTags, err := service.ListTags(first.ID) require.NoError(t, err) require.Len(t, firstTags, 1) require.Equal(t, first.ID, firstTags[0].ProjectID) } func TestDashboardCountsOnlyRequestedProject(t *testing.T) { database := newTestDB(t) service := NewService(database) first, err := service.CreateProject(1, "Alpha", "") require.NoError(t, err) second, err := service.CreateProject(1, "Beta", "") require.NoError(t, err) require.NoError(t, database.Create(&domain.InboxItem{ProjectID: first.ID, CreatedBy: 1, SourceType: "text", Status: "open"}).Error) require.NoError(t, database.Create(&domain.InboxItem{ProjectID: second.ID, CreatedBy: 1, SourceType: "text", Status: "open"}).Error) require.NoError(t, database.Create(&domain.Task{ProjectID: first.ID, CreatedBy: 1, Title: "A", Status: "open"}).Error) require.NoError(t, database.Create(&domain.Task{ProjectID: second.ID, CreatedBy: 1, Title: "B", Status: "open"}).Error) dashboard, err := service.Dashboard(1, first.ID) require.NoError(t, err) require.Equal(t, int64(1), dashboard.PendingInboxCount) require.Equal(t, int64(1), dashboard.OpenTaskCount) } func TestDashboardRejectsProjectOwnedByAnotherUser(t *testing.T) { database := newTestDB(t) service := NewService(database) project, err := service.CreateProject(2, "Beta", "") require.NoError(t, err) _, err = service.Dashboard(1, project.ID) require.Error(t, err) } 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 }