Complete batch import v2 runtime and host capability recovery
This commit is contained in:
111
internal/app/batch_runtime_background_test.go
Normal file
111
internal/app/batch_runtime_background_test.go
Normal file
@@ -0,0 +1,111 @@
|
||||
package app
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"net/http/httptest"
|
||||
"path/filepath"
|
||||
"testing"
|
||||
|
||||
"sub2api-cn-relay-manager/internal/store/sqlite"
|
||||
)
|
||||
|
||||
func TestResumePendingBatchImportRunsCompletesStoredRun(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
server := httptest.NewServer(newBatchImportActionStubServer(t))
|
||||
defer server.Close()
|
||||
|
||||
dsn := fmt.Sprintf("file:%s?_busy_timeout=5000&_pragma=foreign_keys(0)", filepath.ToSlash(filepath.Join(t.TempDir(), "state.db")))
|
||||
store, err := sqlite.Open(context.Background(), dsn)
|
||||
if err != nil {
|
||||
t.Fatalf("sqlite.Open() error = %v", err)
|
||||
}
|
||||
defer closeAppTestStore(t, store)
|
||||
if _, err := store.SQLDB().Exec("PRAGMA foreign_keys = OFF"); err != nil {
|
||||
t.Fatalf("disable foreign keys pragma error = %v", err)
|
||||
}
|
||||
|
||||
hostPK, err := store.Hosts().Create(context.Background(), sqlite.Host{
|
||||
HostID: "host-1",
|
||||
BaseURL: server.URL,
|
||||
HostVersion: "0.1.126",
|
||||
CapabilityProbeJSON: "{}",
|
||||
AuthType: "apikey",
|
||||
AuthToken: "host-token",
|
||||
})
|
||||
if err != nil {
|
||||
t.Fatalf("Hosts().Create() error = %v", err)
|
||||
}
|
||||
|
||||
if err := store.ImportRuns().Create(context.Background(), sqlite.ImportRun{
|
||||
RunID: "run-resume-1",
|
||||
HostID: "host-1",
|
||||
Mode: "strict",
|
||||
AccessMode: "self_service",
|
||||
SubscriptionUsersJSON: `[]`,
|
||||
SubscriptionDays: 0,
|
||||
ProbeAPIKey: "gateway-key",
|
||||
State: "running",
|
||||
TotalItems: 1,
|
||||
}); err != nil {
|
||||
t.Fatalf("ImportRuns().Create() error = %v", err)
|
||||
}
|
||||
|
||||
legacyBatchID := int64(81)
|
||||
if err := store.ImportRunItems().Upsert(context.Background(), sqlite.ImportRunItem{
|
||||
ItemID: "item-resume-1",
|
||||
RunID: "run-resume-1",
|
||||
BaseURL: server.URL,
|
||||
ProviderID: "provider-resume-1",
|
||||
APIKeyFingerprint: "sha256:test",
|
||||
RequestedModelsJSON: `["kimi-k2.6"]`,
|
||||
RawModelsJSON: `["kimi-k2.6"]`,
|
||||
NormalizedModelsJSON: `["kimi-k2.6"]`,
|
||||
CanonicalFamiliesJSON: `["kimi-2.6"]`,
|
||||
RecommendedModelsJSON: `["kimi-k2.6"]`,
|
||||
ResolvedSmokeModel: "kimi-k2.6",
|
||||
CapabilityProfileJSON: `{"transport_profile":{"supports_openai_chat_completions":true}}`,
|
||||
CurrentStage: "confirm",
|
||||
ConfirmationStatus: "pending",
|
||||
AccessStatus: "unknown",
|
||||
MatchedAccountState: "none",
|
||||
AccountResolution: "created",
|
||||
LegacyBatchID: &legacyBatchID,
|
||||
}); err != nil {
|
||||
t.Fatalf("ImportRunItems().Upsert() error = %v", err)
|
||||
}
|
||||
|
||||
if _, err := store.ManagedResources().Create(context.Background(), sqlite.ManagedResource{
|
||||
BatchID: legacyBatchID,
|
||||
HostID: hostPK,
|
||||
ResourceType: "account",
|
||||
HostResourceID: "account_1",
|
||||
ResourceName: "batch-import-account",
|
||||
}); err != nil {
|
||||
t.Fatalf("ManagedResources().Create(account) error = %v", err)
|
||||
}
|
||||
|
||||
if err := resumePendingBatchImportRuns(context.Background(), dsn); err != nil {
|
||||
t.Fatalf("resumePendingBatchImportRuns() error = %v", err)
|
||||
}
|
||||
|
||||
run, err := store.ImportRuns().GetByRunID(context.Background(), "run-resume-1")
|
||||
if err != nil {
|
||||
t.Fatalf("ImportRuns().GetByRunID() error = %v", err)
|
||||
}
|
||||
if run.State != "completed" {
|
||||
t.Fatalf("run.State = %q, want completed", run.State)
|
||||
}
|
||||
if run.CompletedItems != 1 || run.ActiveItems != 1 {
|
||||
t.Fatalf("run counters = %+v, want completed_items=1 active_items=1", run)
|
||||
}
|
||||
|
||||
item, err := store.ImportRunItems().GetByItemID(context.Background(), "item-resume-1")
|
||||
if err != nil {
|
||||
t.Fatalf("ImportRunItems().GetByItemID() error = %v", err)
|
||||
}
|
||||
if item.CurrentStage != "done" || item.ConfirmationStatus != "confirmed" || item.AccessStatus != "active" {
|
||||
t.Fatalf("item = %+v, want done/confirmed/active", item)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user