Files
ratatoskr-go/internal/storage/models_test.go
Hermes 43266ea04f
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
feat: воркер берёт задачи только после одобрения (approved)
Исправляет баг: воркер захватывал задачу на выполнение по статусу ready
ещё до «создавай» (consent был заглушкой). Теперь:

- новый статус approved: «создавай» → ready→approved;
- воркер (pollAndDispatch + runTask) берёт ТОЛЬКО approved,
  ready = черновик готов, ждёт одобрения;
- правка/текст в approved запрещены (финальное одобрение);
- e2e-тест TestE2EWorkerDoesNotTakeUnconfirmed: в ready воркер задачу
  не трогает, запускает только после «создавай» → success;
- обновлены все затронутые тесты (models/core/worker) и retry-фикстуры.
2026-08-17 19:03:42 +05:00

59 lines
2.0 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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")
}
}