Исправляет баг: воркер захватывал задачу на выполнение по статусу ready ещё до «создавай» (consent был заглушкой). Теперь: - новый статус approved: «создавай» → ready→approved; - воркер (pollAndDispatch + runTask) берёт ТОЛЬКО approved, ready = черновик готов, ждёт одобрения; - правка/текст в approved запрещены (финальное одобрение); - e2e-тест TestE2EWorkerDoesNotTakeUnconfirmed: в ready воркер задачу не трогает, запускает только после «создавай» → success; - обновлены все затронутые тесты (models/core/worker) и retry-фикстуры.
59 lines
2.0 KiB
Go
59 lines
2.0 KiB
Go
package storage
|
||
|
||
import (
|
||
"testing"
|
||
)
|
||
|
||
func TestIsValidTransition(t *testing.T) {
|
||
tests := []struct {
|
||
from, to Status
|
||
want bool
|
||
}{
|
||
{StatusDraft, StatusCollecting, true},
|
||
{StatusDraft, StatusCancelled, true},
|
||
{StatusDraft, StatusRunning, false},
|
||
{StatusDraft, StatusClosed, false},
|
||
{StatusRunning, StatusSuccess, true},
|
||
{StatusRunning, StatusFailed, true},
|
||
{StatusRunning, StatusTimeout, true},
|
||
{StatusSuccess, StatusClosed, true},
|
||
{StatusSuccess, StatusDraft, false},
|
||
{StatusFailed, StatusReady, true}, // retry
|
||
{StatusFailed, StatusClosed, true},
|
||
{StatusFailed, StatusRunning, false},
|
||
{StatusFailed, StatusCollecting, true}, // retry: перезапуск сбора
|
||
{StatusTimeout, StatusReady, true}, // retry
|
||
{StatusTimeout, StatusCollecting, true}, // retry: перезапуск сбора
|
||
{StatusTimeout, StatusRunning, false},
|
||
{StatusReady, StatusApproved, true}, // «создавай» → одобрено
|
||
{StatusReady, StatusRunning, false}, // без одобрения воркер не запускает
|
||
{StatusApproved, StatusRunning, true}, // воркер берёт approved
|
||
{StatusApproved, StatusCancelled, true}, // отмена до запуска
|
||
{StatusApproved, StatusReady, false}, // финал: назад нельзя
|
||
{StatusApproved, StatusCollecting, false},
|
||
{StatusClosed, StatusDraft, false},
|
||
{StatusClosed, StatusRunning, false},
|
||
}
|
||
for _, tc := range tests {
|
||
got := IsValidTransition(tc.from, tc.to)
|
||
if got != tc.want {
|
||
t.Errorf("IsValidTransition(%q → %q) = %v, want %v", tc.from, tc.to, got, tc.want)
|
||
}
|
||
}
|
||
}
|
||
|
||
func TestIsTerminal(t *testing.T) {
|
||
if !IsTerminal(StatusSuccess) {
|
||
t.Error("StatusSuccess should be terminal")
|
||
}
|
||
if !IsTerminal(StatusCancelled) {
|
||
t.Error("StatusCancelled should be terminal")
|
||
}
|
||
if IsTerminal(StatusDraft) {
|
||
t.Error("StatusDraft should NOT be terminal")
|
||
}
|
||
if IsTerminal(StatusRunning) {
|
||
t.Error("StatusRunning should NOT be terminal")
|
||
}
|
||
}
|