Files
ttstd-infinite-canvas/backend/internal/repository/provider_task_recovery_test.go

68 lines
2.3 KiB
Go

package repository
import (
"errors"
"testing"
"time"
"infinite-canvas/backend/internal/model"
"gorm.io/driver/sqlite"
"gorm.io/gorm"
)
func TestClaimFailedTaskProviderRecoveryUsesConditionalLease(t *testing.T) {
db, err := gorm.Open(sqlite.Open("file:provider-recovery-lease?mode=memory&cache=shared"), &gorm.Config{})
if err != nil {
t.Fatal(err)
}
if err := db.AutoMigrate(&model.Task{}); err != nil {
t.Fatal(err)
}
repo := New(db)
if err := db.Create(&model.Task{ID: "task-1", UserID: "user-1", Status: model.TaskStatusFailed, CreatedAt: time.Now()}).Error; err != nil {
t.Fatal(err)
}
if err := repo.ClaimFailedTaskProviderRecovery("task-1", "", "manual-recovery:one", time.Minute); err != nil {
t.Fatalf("first claim: %v", err)
}
if err := repo.ClaimFailedTaskProviderRecovery("task-1", "", "manual-recovery:two", time.Minute); !errors.Is(err, ErrTaskProviderRecoveryConflict) {
t.Fatalf("second claim error = %v, want conflict", err)
}
if err := repo.ReleaseTaskProviderRecovery("task-1", "manual-recovery:two"); err != nil {
t.Fatal(err)
}
if err := repo.ReleaseTaskProviderRecovery("task-1", "manual-recovery:one"); err != nil {
t.Fatal(err)
}
if err := repo.ClaimFailedTaskProviderRecovery("task-1", "user-1", "manual-recovery:two", time.Minute); err != nil {
t.Fatalf("claim after release: %v", err)
}
var task model.Task
if err := db.First(&task, "id = ?", "task-1").Error; err != nil {
t.Fatal(err)
}
if task.LeaseOwner != "manual-recovery:two" || task.LeaseExpiresAt == nil {
t.Fatalf("task lease = owner:%q expires:%v", task.LeaseOwner, task.LeaseExpiresAt)
}
}
func TestClaimFailedTaskProviderRecoveryRejectsNonFailedTask(t *testing.T) {
db, err := gorm.Open(sqlite.Open("file:provider-recovery-status?mode=memory&cache=shared"), &gorm.Config{})
if err != nil {
t.Fatal(err)
}
if err := db.AutoMigrate(&model.Task{}); err != nil {
t.Fatal(err)
}
repo := New(db)
if err := db.Create(&model.Task{ID: "task-1", UserID: "user-1", Status: model.TaskStatusRunning, CreatedAt: time.Now()}).Error; err != nil {
t.Fatal(err)
}
if err := repo.ClaimFailedTaskProviderRecovery("task-1", "user-1", "manual-recovery:one", time.Minute); !errors.Is(err, ErrTaskProviderRecoveryConflict) {
t.Fatalf("claim running task error = %v, want conflict", err)
}
}