86 lines
2.5 KiB
Go
86 lines
2.5 KiB
Go
|
|
package usecase
|
||
|
|
|
||
|
|
import (
|
||
|
|
"context"
|
||
|
|
"testing"
|
||
|
|
|
||
|
|
"haixun-backend/internal/model/job/domain/entity"
|
||
|
|
"haixun-backend/internal/model/job/domain/enum"
|
||
|
|
|
||
|
|
"go.mongodb.org/mongo-driver/bson/primitive"
|
||
|
|
)
|
||
|
|
|
||
|
|
func TestRetryRun_PreservesSucceededSteps(t *testing.T) {
|
||
|
|
ctx := context.Background()
|
||
|
|
template := demoTemplate()
|
||
|
|
jobID := primitive.NewObjectID()
|
||
|
|
runs := newMemoryRunRepo(&entity.Run{
|
||
|
|
ID: jobID,
|
||
|
|
TemplateType: template.Type,
|
||
|
|
Status: enum.RunStatusFailed,
|
||
|
|
WorkerType: "go",
|
||
|
|
Attempt: 1,
|
||
|
|
MaxAttempts: 3,
|
||
|
|
Phase: "execute",
|
||
|
|
Progress: entity.RunProgress{
|
||
|
|
Steps: []entity.StepProgress{
|
||
|
|
{ID: "prepare", Status: enum.StepStatusSucceeded, Message: "done"},
|
||
|
|
{ID: "execute", Status: enum.StepStatusFailed, Message: "boom"},
|
||
|
|
{ID: "finalize", Status: enum.StepStatusPending},
|
||
|
|
},
|
||
|
|
},
|
||
|
|
})
|
||
|
|
uc := testUseCaseFull(template, runs, nil, newMemoryQueueRepo())
|
||
|
|
|
||
|
|
updated, err := uc.RetryRun(ctx, jobID.Hex())
|
||
|
|
if err != nil {
|
||
|
|
t.Fatalf("RetryRun() error = %v", err)
|
||
|
|
}
|
||
|
|
if updated.Progress.Steps[0].Status != enum.StepStatusSucceeded {
|
||
|
|
t.Fatalf("prepare = %s, want succeeded", updated.Progress.Steps[0].Status)
|
||
|
|
}
|
||
|
|
if updated.Progress.Steps[1].Status != enum.StepStatusPending {
|
||
|
|
t.Fatalf("execute = %s, want pending", updated.Progress.Steps[1].Status)
|
||
|
|
}
|
||
|
|
if updated.Phase != "execute" {
|
||
|
|
t.Fatalf("phase = %s, want execute", updated.Phase)
|
||
|
|
}
|
||
|
|
if updated.Progress.Percentage != 33 {
|
||
|
|
t.Fatalf("percentage = %d, want 33", updated.Progress.Percentage)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestRetryRun_ExpiredResumesFromCheckpoint(t *testing.T) {
|
||
|
|
ctx := context.Background()
|
||
|
|
template := demoTemplate()
|
||
|
|
jobID := primitive.NewObjectID()
|
||
|
|
runs := newMemoryRunRepo(&entity.Run{
|
||
|
|
ID: jobID,
|
||
|
|
TemplateType: template.Type,
|
||
|
|
Status: enum.RunStatusExpired,
|
||
|
|
WorkerType: "go",
|
||
|
|
Attempt: 1,
|
||
|
|
MaxAttempts: 3,
|
||
|
|
DedupeKey: "dedupe-expired",
|
||
|
|
Progress: entity.RunProgress{
|
||
|
|
Steps: []entity.StepProgress{
|
||
|
|
{ID: "prepare", Status: enum.StepStatusSucceeded},
|
||
|
|
{ID: "execute", Status: enum.StepStatusRunning},
|
||
|
|
{ID: "finalize", Status: enum.StepStatusPending},
|
||
|
|
},
|
||
|
|
},
|
||
|
|
})
|
||
|
|
uc := testUseCaseFull(template, runs, nil, newMemoryQueueRepo())
|
||
|
|
|
||
|
|
updated, err := uc.RetryRun(ctx, jobID.Hex())
|
||
|
|
if err != nil {
|
||
|
|
t.Fatalf("RetryRun() error = %v", err)
|
||
|
|
}
|
||
|
|
if updated.Progress.Steps[0].Status != enum.StepStatusSucceeded {
|
||
|
|
t.Fatalf("prepare = %s, want succeeded", updated.Progress.Steps[0].Status)
|
||
|
|
}
|
||
|
|
if updated.Phase != "execute" {
|
||
|
|
t.Fatalf("phase = %s, want execute", updated.Phase)
|
||
|
|
}
|
||
|
|
}
|