package artifacts import ( "context" "encoding/json" "errors" "testing" "time" "gitea.maximumdirect.net/eric/narratio/internal/adapters/storage" ) func TestLoadCurrentStateRequiresCommitPointer(t *testing.T) { store := &storage.FakeBackend{} prefix := S3SessionPrefix("dnd", "sample-campaign", "2026-05-03") _, err := LoadCurrentState(context.Background(), store, prefix, CurrentStateValidation{}) var missing *CurrentCommitPointerMissingError if !errors.As(err, &missing) || !errors.Is(err, ErrCurrentCommitPointerMissing) { t.Fatalf("LoadCurrentState() error = %v, want missing commit pointer", err) } if missing.Key != S3CurrentCommitPointerKey(prefix) { t.Fatalf("missing pointer key = %q", missing.Key) } } func testCurrentSessionPrefix() string { return S3SessionPrefix("dnd", "sample-campaign", "2026-05-03") } func testManifestJSON(t *testing.T, sessionID, campaign, runID string) []byte { t.Helper() now := time.Date(2026, 5, 19, 23, 0, 0, 0, time.UTC).Format(time.RFC3339Nano) data, err := json.Marshal(map[string]any{ "schema_version": "narratio.session-manifest.v1", "session_id": sessionID, "campaign": campaign, "run_id": runID, "created_at": now, "updated_at": now, "stages": map[string]any{}, }) if err != nil { t.Fatalf("marshal manifest payload: %v", err) } return append(data, '\n') }