package service import ( "3588AdminBackend/internal/config" "3588AdminBackend/internal/models" "testing" "time" ) func TestTaskService_CreateTask(t *testing.T) { cfg := &config.Config{ Concurrency: 5, } // Mock registry reg := NewRegistryService(cfg, nil) reg.UpdateDevice(&models.Device{ DeviceID: "dev1", IP: "127.0.0.1", AgentPort: 9100, Online: true, }) agent := NewAgentClient(cfg) svc := NewTaskService(cfg, agent, reg) task, err := svc.CreateTask("config_apply", []string{"dev1"}, map[string]string{"foo": "bar"}) if err != nil { t.Fatalf("failed to create task: %v", err) } if task.ID == "" { t.Error("expected task ID to be set") } // Wait for task to finish or fail (since agent is nil, it will fail) time.Sleep(100 * time.Millisecond) task.Mu.RLock() defer task.Mu.RUnlock() if task.Devices["dev1"].Status == models.TaskPending { t.Error("expected task status to change from pending") } } func TestTaskService_Subscribe(t *testing.T) { cfg := &config.Config{ Concurrency: 5, } svc := NewTaskService(cfg, nil, NewRegistryService(cfg, nil)) taskID := "test-task" svc.tasks[taskID] = models.NewTask(taskID, "test", []string{"dev1"}, nil) ch, cleanup := svc.Subscribe(taskID) defer cleanup() go func() { svc.updateDeviceStatus(taskID, "dev1", models.TaskRunning, 0.5, "") }() select { case update := <-ch: if update.DeviceID != "dev1" || update.Status != models.TaskRunning { t.Errorf("unexpected update: %+v", update) } case <-time.After(1 * time.Second): t.Error("timed out waiting for event") } }