feat: воркер берёт задачи только после одобрения (approved)
Исправляет баг: воркер захватывал задачу на выполнение по статусу ready ещё до «создавай» (consent был заглушкой). Теперь: - новый статус approved: «создавай» → ready→approved; - воркер (pollAndDispatch + runTask) берёт ТОЛЬКО approved, ready = черновик готов, ждёт одобрения; - правка/текст в approved запрещены (финальное одобрение); - e2e-тест TestE2EWorkerDoesNotTakeUnconfirmed: в ready воркер задачу не трогает, запускает только после «создавай» → success; - обновлены все затронутые тесты (models/core/worker) и retry-фикстуры.
This commit is contained in:
@@ -113,7 +113,7 @@ func (w *Worker) pollAndDispatch(ctx context.Context) error {
|
||||
}
|
||||
|
||||
tasks, err := w.Store.ListTasks(ctx, storage.TaskFilter{
|
||||
Status: storage.StatusReady,
|
||||
Status: storage.StatusApproved,
|
||||
Limit: slots,
|
||||
})
|
||||
if err != nil {
|
||||
@@ -142,7 +142,7 @@ func (w *Worker) pollAndDispatch(ctx context.Context) error {
|
||||
// dev дорабатывает по комментариям; прошло → push ветки + success.
|
||||
func (w *Worker) runTask(ctx context.Context, task *storage.Task) (err error) {
|
||||
// 1. проверяем статус
|
||||
if task.Status != storage.StatusReady {
|
||||
if task.Status != storage.StatusApproved {
|
||||
return fmt.Errorf("%w: task %d status=%q", ErrLaunch, task.ID, task.Status)
|
||||
}
|
||||
|
||||
|
||||
@@ -95,6 +95,10 @@ func createReadyTask(t *testing.T, s *storage.Storage, title string) *storage.Ta
|
||||
if err := s.UpdateTask(ctx, task); err != nil {
|
||||
t.Fatalf("set ready: %v", err)
|
||||
}
|
||||
task.Status = storage.StatusApproved
|
||||
if err := s.UpdateTask(ctx, task); err != nil {
|
||||
t.Fatalf("set approved: %v", err)
|
||||
}
|
||||
task, _ = s.GetTask(ctx, id)
|
||||
return task
|
||||
}
|
||||
@@ -625,14 +629,14 @@ func TestWorkerSemaphore(t *testing.T) {
|
||||
w.pollAndDispatch(ctx)
|
||||
time.Sleep(200 * time.Millisecond)
|
||||
|
||||
// 1 должна быть success, 1 — всё ещё ready
|
||||
// 1 должна быть success, 1 — всё ещё approved
|
||||
success, _ := s.ListTasks(ctx, storage.TaskFilter{Status: storage.StatusSuccess})
|
||||
ready, _ := s.ListTasks(ctx, storage.TaskFilter{Status: storage.StatusReady})
|
||||
approved, _ := s.ListTasks(ctx, storage.TaskFilter{Status: storage.StatusApproved})
|
||||
if len(success) != 1 {
|
||||
t.Errorf("success = %d, want 1 (ready=%d)", len(success), len(ready))
|
||||
t.Errorf("success = %d, want 1 (approved=%d)", len(success), len(approved))
|
||||
}
|
||||
if len(ready) != 1 {
|
||||
t.Errorf("ready = %d, want 1", len(ready))
|
||||
if len(approved) != 1 {
|
||||
t.Errorf("approved = %d, want 1", len(approved))
|
||||
}
|
||||
|
||||
// первая завершилась и вернула токен в сем — можем диспатчить вторую
|
||||
|
||||
Reference in New Issue
Block a user