feat: add project action modals and APIs
This commit is contained in:
@@ -127,6 +127,94 @@ func TestWorkspaceRejectsProjectOwnedByAnotherUser(t *testing.T) {
|
||||
require.Error(t, err)
|
||||
}
|
||||
|
||||
func TestCreateTaskAddsTaskToOwnedProject(t *testing.T) {
|
||||
database := newTestDB(t)
|
||||
service := NewService()
|
||||
require.NoError(t, database.Create(&models.SenlinAgentUser{Email: "david@example.com", DisplayName: "David", PasswordHash: "hash"}).Error)
|
||||
project, err := service.CreateProject(1, "Alpha", "")
|
||||
require.NoError(t, err)
|
||||
dueAt := time.Date(2026, 7, 21, 9, 30, 0, 0, time.UTC)
|
||||
|
||||
task, err := service.CreateTask(1, project.ID, CreateTaskInput{
|
||||
Title: "Follow up with client",
|
||||
Description: "整理客户反馈并形成行动项",
|
||||
Status: "",
|
||||
DueAt: &dueAt,
|
||||
})
|
||||
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, project.ID, task.ProjectID)
|
||||
require.Equal(t, uint(1), task.CreatedBy)
|
||||
require.Equal(t, "Follow up with client", task.Title)
|
||||
require.Equal(t, "open", task.Status)
|
||||
require.NotNil(t, task.DueAt)
|
||||
workspace, err := service.Workspace(1, project.ID)
|
||||
require.NoError(t, err)
|
||||
require.Len(t, workspace.Tasks, 1)
|
||||
require.Equal(t, "Follow up with client", workspace.Tasks[0].Title)
|
||||
}
|
||||
|
||||
func TestCreateTaskRejectsProjectOwnedByAnotherUser(t *testing.T) {
|
||||
newTestDB(t)
|
||||
service := NewService()
|
||||
project, err := service.CreateProject(2, "Beta", "")
|
||||
require.NoError(t, err)
|
||||
|
||||
_, err = service.CreateTask(1, project.ID, CreateTaskInput{Title: "Nope"})
|
||||
|
||||
require.Error(t, err)
|
||||
}
|
||||
|
||||
func TestCreateFileSourceAddsSourceToOwnedProject(t *testing.T) {
|
||||
database := newTestDB(t)
|
||||
service := NewService()
|
||||
project, err := service.CreateProject(1, "Alpha", "")
|
||||
require.NoError(t, err)
|
||||
|
||||
source, err := service.CreateFileSource(1, project.ID, CreateFileSourceInput{
|
||||
Title: "客户访谈.pdf",
|
||||
FilePath: "projects/1/客户访谈.pdf",
|
||||
})
|
||||
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, project.ID, source.ProjectID)
|
||||
require.Equal(t, uint(1), source.CreatedBy)
|
||||
require.Equal(t, "file", source.Kind)
|
||||
require.Equal(t, "客户访谈.pdf", source.Title)
|
||||
require.Equal(t, "projects/1/客户访谈.pdf", source.FilePath)
|
||||
var count int64
|
||||
require.NoError(t, database.Model(&models.SenlinAgentSource{}).Where("project_id = ? AND kind = ?", project.ID, "file").Count(&count).Error)
|
||||
require.Equal(t, int64(1), count)
|
||||
}
|
||||
|
||||
func TestCreateCronPlanAddsPlanToOwnedProject(t *testing.T) {
|
||||
database := newTestDB(t)
|
||||
service := NewService()
|
||||
require.NoError(t, database.Create(&models.SenlinAgentUser{Email: "david@example.com", DisplayName: "David", PasswordHash: "hash"}).Error)
|
||||
project, err := service.CreateProject(1, "Alpha", "")
|
||||
require.NoError(t, err)
|
||||
nextRun := time.Date(2026, 7, 22, 8, 0, 0, 0, time.UTC)
|
||||
|
||||
plan, err := service.CreateCronPlan(1, project.ID, CreateCronPlanInput{
|
||||
Title: "Daily inbox sweep",
|
||||
Schedule: "0 9 * * *",
|
||||
Enabled: true,
|
||||
NextRunAt: &nextRun,
|
||||
})
|
||||
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, project.ID, plan.ProjectID)
|
||||
require.Equal(t, uint(1), plan.CreatedBy)
|
||||
require.Equal(t, "Daily inbox sweep", plan.Title)
|
||||
require.Equal(t, "0 9 * * *", plan.Schedule)
|
||||
require.True(t, plan.Enabled)
|
||||
require.NotNil(t, plan.NextRunAt)
|
||||
workspace, err := service.Workspace(1, project.ID)
|
||||
require.NoError(t, err)
|
||||
require.Len(t, workspace.CronPlans, 1)
|
||||
require.Equal(t, "Daily inbox sweep", workspace.CronPlans[0].Title)
|
||||
}
|
||||
|
||||
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{})
|
||||
|
||||
Reference in New Issue
Block a user