42 lines
1.7 KiB
Go
42 lines
1.7 KiB
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"strings"
|
|
"testing"
|
|
"time"
|
|
|
|
"knowledge-governance/internal/appconfig"
|
|
"knowledge-governance/internal/governance"
|
|
"knowledge-governance/internal/jobs"
|
|
)
|
|
|
|
func TestLibraryReleaseRejectsAnotherTargetBeforeMaintenance(t *testing.T) {
|
|
legacy, pool := openLedgerStore(t)
|
|
config := appconfig.Config{LibraryTargetInstance: "new-cloud-target"}
|
|
current := legacy.WithLibraryTarget(config.LibraryTargetIdentity())
|
|
ctx := context.Background()
|
|
now := time.Now()
|
|
job, _, err := legacy.CreateLibraryJob(ctx, governance.LibraryJob{ID: "old-target-job", Scope: "internal", Kind: governance.LibraryJobSync, IdempotencyKey: "old-target-job", RequestDigest: "digest", QueueJobID: "queue-old", TargetSnapshotID: "snapshot"}, governance.SyncStages(), now)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
payload, _ := json.Marshal(libraryReleasePayload{LibraryJobID: job.ID, Scope: "internal", TargetSnapshotID: "snapshot"})
|
|
err = runLibraryRelease(ctx, current, config, jobs.Job{ID: "queue-old", Payload: payload}, governance.LibraryJobSync)
|
|
if err == nil || !strings.Contains(err.Error(), "拒绝在任何维护动作前继续") {
|
|
t.Fatalf("must reject at admission, not after opening a target: %v", err)
|
|
}
|
|
var attempts, locks int
|
|
if err := pool.QueryRow(ctx, `SELECT (SELECT count(*) FROM library_attempts), (SELECT count(*) FROM library_instance_maintenance)`).Scan(&attempts, &locks); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if attempts != 0 || locks != 0 {
|
|
t.Fatalf("foreign request caused side effects: attempts=%d locks=%d", attempts, locks)
|
|
}
|
|
got, err := legacy.LibraryJob(ctx, job.ID)
|
|
if err != nil || got.State != governance.LibraryJobPending {
|
|
t.Fatalf("old job was modified: %+v %v", got, err)
|
|
}
|
|
}
|