package ws import ( "testing" "time" "everypublish/server/internal/config" "everypublish/server/internal/models" "everypublish/server/internal/task" gormsqlite "gorm.io/driver/sqlite" "gorm.io/gorm" ) func TestDispatcherLocalMock(t *testing.T) { db, err := gorm.Open(gormsqlite.Open("file:dispatcher_mock?mode=memory&cache=shared"), &gorm.Config{}) if err != nil { t.Fatal(err) } if err = db.AutoMigrate(&models.Task{}, &models.TaskEvent{}); err != nil { t.Fatal(err) } row := models.Task{WorkspaceID: 1, Title: "web-only", Status: task.Queued, AccountIDs: "[]", MaterialIDs: "[]"} if err = db.Create(&row).Error; err != nil { t.Fatal(err) } d := NewDispatcher(db, NewHub(), &config.Config{ExecutorMode: "mock"}) if !d.TryDispatch(row.ID) { t.Fatal("mock dispatch should accept queued task") } deadline := time.Now().Add(2 * time.Second) for time.Now().Before(deadline) { var got models.Task if err = db.First(&got, row.ID).Error; err != nil { t.Fatal(err) } if got.Status == task.Success { if got.PublishedURLs == "" || got.Receipts == "" { t.Fatal("mock success must include URL and receipt") } return } time.Sleep(20 * time.Millisecond) } t.Fatal("mock task did not reach success") }