feat: воркер берёт задачи только после одобрения (approved)
Some checks failed
CI / test (push) Failing after 49s
CI / build-and-package (amd64, linux) (push) Successful in 42s
CI / build-and-package (amd64, windows) (push) Successful in 45s

Исправляет баг: воркер захватывал задачу на выполнение по статусу ready
ещё до «создавай» (consent был заглушкой). Теперь:

- новый статус approved: «создавай» → ready→approved;
- воркер (pollAndDispatch + runTask) берёт ТОЛЬКО approved,
  ready = черновик готов, ждёт одобрения;
- правка/текст в approved запрещены (финальное одобрение);
- e2e-тест TestE2EWorkerDoesNotTakeUnconfirmed: в ready воркер задачу
  не трогает, запускает только после «создавай» → success;
- обновлены все затронутые тесты (models/core/worker) и retry-фикстуры.
This commit is contained in:
Hermes
2026-08-17 19:03:42 +05:00
parent f12ff04966
commit 43266ea04f
7 changed files with 152 additions and 31 deletions

View File

@@ -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))
}
// первая завершилась и вернула токен в сем — можем диспатчить вторую