package hostops import ( "context" "crypto/ed25519" "encoding/json" "testing" "time" "github.com/carlosframework/platform/internal/release" ) // seedPurge builds the typed-writer state the removed WriteNewPurgeJournal // used to fake: an open admission, a real tombstone, a reserved journal that // BeginPurge turns into the purging operation, then the journal advanced to // j.Phase. It returns the writer that owns the operation. func seedPurge(t *testing.T, ctx context.Context, raw release.Store, now time.Time, j PurgeJournal) *ControlWriter { t.Helper() pub, _, err := ed25519.GenerateKey(nil) if err != nil { t.Fatal(err) } w, err := NewControlWriter(raw, pub, func() time.Time { return now }) if err != nil { t.Fatal(err) } seedAdmission(t, raw, j.Account, j.App, openAdmission(j.AppID)) body := []byte(`{}`) etag, err := raw.Put(ctx, release.AppTombstoneKey(j.Account, j.App), body, "") if err != nil { t.Fatal(err) } target := j reserved := j reserved.Phase = "reserved" reserved.Tombstone = PurgeObject{Key: release.AppTombstoneKey(j.Account, j.App), ETag: etag, Body: json.RawMessage(body)} target.Tombstone = reserved.Tombstone if reserved.Hosts == nil { reserved.Hosts = map[string]PurgeHost{} } tag, err := w.ReservePurge(ctx, reserved, testOwner, now) if err != nil { t.Fatal(err) } if _, err = w.BeginPurge(ctx, j.Account, j.App, j.AppID, j.ID, testOwner); err != nil { t.Fatal(err) } cur, curTag, err := ReadPurgeJournal(ctx, raw, j.Account, j.App, j.ID, j.AppID) if err != nil || curTag != tag { t.Fatalf("seeded journal: %v %s %s", err, curTag, tag) } target.AdmissionEpoch = cur.AdmissionEpoch if _, err = w.SavePurgeJournal(ctx, target, curTag); err != nil { t.Fatal(err) } return w }