Skip to content

test: cover late query readiness rejection#1681

Open
KyleAMathews wants to merge 1 commit into
mainfrom
test-query-readiness-rejection
Open

test: cover late query readiness rejection#1681
KyleAMathews wants to merge 1 commit into
mainfrom
test-query-readiness-rejection

Conversation

@KyleAMathews

@KyleAMathews KyleAMathews commented Jul 16, 2026

Copy link
Copy Markdown
Collaborator

Adds the missing rejection-path lifecycle coverage for query-driven subset cleanup. This is a test-only regression lock with no user-visible behavior or package API change.

Reviewer guidance

Root cause

PR #1673 added bookkeeping for temporary readiness listeners and covered successful late request settlement, but did not directly exercise an in-flight query that rejects after its subset has been unloaded.

Approach

  • Start an on-demand subset preload backed by a deferred query promise.
  • Clean up the live query while Query Core is still fetching.
  • Assert cleanup resolves the retained preload and releases all observers.
  • Reject the deferred request and verify that no row materializes, no observer returns, and no unhandled rejection escapes the test.

Key invariants

  • Live-query cleanup settles the original preload before the underlying request settles.
  • An unloaded subset has zero Query Core observers.
  • Late rejection cannot rematerialize collection rows or leak an observer.

Non-goals

  • No production lifecycle or ownership behavior changes.
  • No changes to loadSubset, query ownership maps, or request cancellation semantics.

Trade-offs

The test mirrors the adjacent late-success lifecycle test instead of introducing new helpers, keeping the regression scenario explicit and localized.

Verification

pnpm --filter @tanstack/query-db-collection test tests/query.test.ts -t "keeps an unloaded preload resolved when its pending request later rejects" --typecheck.enabled=false
pnpm --filter @tanstack/query-db-collection test tests/query.test.ts --typecheck.enabled=false
pnpm exec prettier --check packages/query-db-collection/tests/query.test.ts
git diff --check
  • Focused test: 1 passed, 118 skipped
  • Full query test file: 119 passed

Files changed

  • packages/query-db-collection/tests/query.test.ts: adds the deferred rejection lifecycle regression test.

Follow-up to RFC #1643 and #1673.

Summary by CodeRabbit

  • Bug Fixes
    • Improved query cleanup handling when a pending subset preload request is cancelled.
    • Ensured cancelled preload operations resolve safely without repopulating collections or leaving observers attached.

@coderabbitai

coderabbitai Bot commented Jul 16, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 312672ac-8fbc-4881-b352-df0b829c2b53

📥 Commits

Reviewing files that changed from the base of the PR and between f89fad1 and d0c8aa7.

📒 Files selected for processing (1)
  • packages/query-db-collection/tests/query.test.ts

📝 Walkthrough

Walkthrough

Adds an asynchronous test covering an on-demand subset preload that rejects after liveQuery.cleanup(), verifying promise resolution, observer removal, and unchanged collection state.

Changes

Preload cleanup lifecycle

Layer / File(s) Summary
Rejected preload after cleanup
packages/query-db-collection/tests/query.test.ts
Tests that cleanup detaches the subset observer, resolves the pending preloadPromise, and prevents a later request rejection from repopulating the collection.

Estimated code review effort: 2 (Simple) | ~10 minutes

Possibly related PRs

  • TanStack/db#1606: Covers the same live-query preload and cleanup race involving pending requests, promise settlement, and observer detachment.

Suggested reviewers: kevin-dp

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title is concise and matches the main change: adding a test for late query readiness rejection.
Description check ✅ Passed It covers the change, rationale, verification, and release impact, though it doesn't use the template headings exactly.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch test-query-readiness-rejection

Warning

There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure.

🔧 ESLint

If the error stems from missing dependencies, add them to the package.json file. For unrecoverable errors (e.g., due to private dependencies), disable the tool in the CodeRabbit configuration.

ESLint install failed: private package registry requires authentication. Disable ESLint in CodeRabbit settings or use public packages.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@pkg-pr-new

pkg-pr-new Bot commented Jul 16, 2026

Copy link
Copy Markdown
More templates

@tanstack/angular-db

npm i https://pkg.pr.new/@tanstack/angular-db@1681

@tanstack/browser-db-sqlite-persistence

npm i https://pkg.pr.new/@tanstack/browser-db-sqlite-persistence@1681

@tanstack/capacitor-db-sqlite-persistence

npm i https://pkg.pr.new/@tanstack/capacitor-db-sqlite-persistence@1681

@tanstack/cloudflare-durable-objects-db-sqlite-persistence

npm i https://pkg.pr.new/@tanstack/cloudflare-durable-objects-db-sqlite-persistence@1681

@tanstack/db

npm i https://pkg.pr.new/@tanstack/db@1681

@tanstack/db-ivm

npm i https://pkg.pr.new/@tanstack/db-ivm@1681

@tanstack/db-sqlite-persistence-core

npm i https://pkg.pr.new/@tanstack/db-sqlite-persistence-core@1681

@tanstack/electric-db-collection

npm i https://pkg.pr.new/@tanstack/electric-db-collection@1681

@tanstack/electron-db-sqlite-persistence

npm i https://pkg.pr.new/@tanstack/electron-db-sqlite-persistence@1681

@tanstack/expo-db-sqlite-persistence

npm i https://pkg.pr.new/@tanstack/expo-db-sqlite-persistence@1681

@tanstack/node-db-sqlite-persistence

npm i https://pkg.pr.new/@tanstack/node-db-sqlite-persistence@1681

@tanstack/offline-transactions

npm i https://pkg.pr.new/@tanstack/offline-transactions@1681

@tanstack/powersync-db-collection

npm i https://pkg.pr.new/@tanstack/powersync-db-collection@1681

@tanstack/query-db-collection

npm i https://pkg.pr.new/@tanstack/query-db-collection@1681

@tanstack/react-db

npm i https://pkg.pr.new/@tanstack/react-db@1681

@tanstack/react-native-db-sqlite-persistence

npm i https://pkg.pr.new/@tanstack/react-native-db-sqlite-persistence@1681

@tanstack/rxdb-db-collection

npm i https://pkg.pr.new/@tanstack/rxdb-db-collection@1681

@tanstack/solid-db

npm i https://pkg.pr.new/@tanstack/solid-db@1681

@tanstack/svelte-db

npm i https://pkg.pr.new/@tanstack/svelte-db@1681

@tanstack/tauri-db-sqlite-persistence

npm i https://pkg.pr.new/@tanstack/tauri-db-sqlite-persistence@1681

@tanstack/trailbase-db-collection

npm i https://pkg.pr.new/@tanstack/trailbase-db-collection@1681

@tanstack/vue-db

npm i https://pkg.pr.new/@tanstack/vue-db@1681

commit: d0c8aa7

@github-actions

Copy link
Copy Markdown
Contributor

Size Change: 0 B

Total Size: 125 kB

ℹ️ View Unchanged
Filename Size
packages/db/dist/esm/collection/change-events.js 1.43 kB
packages/db/dist/esm/collection/changes.js 1.38 kB
packages/db/dist/esm/collection/cleanup-queue.js 810 B
packages/db/dist/esm/collection/events.js 434 B
packages/db/dist/esm/collection/index.js 3.62 kB
packages/db/dist/esm/collection/indexes.js 1.99 kB
packages/db/dist/esm/collection/lifecycle.js 1.69 kB
packages/db/dist/esm/collection/mutations.js 2.47 kB
packages/db/dist/esm/collection/state.js 5.48 kB
packages/db/dist/esm/collection/subscription.js 3.74 kB
packages/db/dist/esm/collection/sync.js 2.88 kB
packages/db/dist/esm/collection/transaction-metadata.js 144 B
packages/db/dist/esm/deferred.js 207 B
packages/db/dist/esm/errors.js 5.1 kB
packages/db/dist/esm/event-emitter.js 748 B
packages/db/dist/esm/index.js 3.16 kB
packages/db/dist/esm/indexes/auto-index.js 829 B
packages/db/dist/esm/indexes/base-index.js 767 B
packages/db/dist/esm/indexes/basic-index.js 2.06 kB
packages/db/dist/esm/indexes/btree-index.js 2.19 kB
packages/db/dist/esm/indexes/index-registry.js 820 B
packages/db/dist/esm/indexes/reverse-index.js 557 B
packages/db/dist/esm/live-query-adapter.js 318 B
packages/db/dist/esm/local-only.js 916 B
packages/db/dist/esm/local-storage.js 2.12 kB
packages/db/dist/esm/optimistic-action.js 359 B
packages/db/dist/esm/paced-mutations.js 496 B
packages/db/dist/esm/proxy.js 3.75 kB
packages/db/dist/esm/query/builder/functions.js 1.47 kB
packages/db/dist/esm/query/builder/index.js 5.84 kB
packages/db/dist/esm/query/builder/ref-proxy.js 1.24 kB
packages/db/dist/esm/query/compiler/evaluators.js 1.89 kB
packages/db/dist/esm/query/compiler/expressions.js 430 B
packages/db/dist/esm/query/compiler/group-by.js 3.56 kB
packages/db/dist/esm/query/compiler/index.js 6.67 kB
packages/db/dist/esm/query/compiler/joins.js 2.5 kB
packages/db/dist/esm/query/compiler/lazy-targets.js 923 B
packages/db/dist/esm/query/compiler/order-by.js 1.74 kB
packages/db/dist/esm/query/compiler/select.js 1.53 kB
packages/db/dist/esm/query/effect.js 4.77 kB
packages/db/dist/esm/query/expression-helpers.js 1.43 kB
packages/db/dist/esm/query/ir.js 1.25 kB
packages/db/dist/esm/query/live-query-collection.js 360 B
packages/db/dist/esm/query/live/collection-config-builder.js 9.1 kB
packages/db/dist/esm/query/live/collection-registry.js 264 B
packages/db/dist/esm/query/live/collection-subscriber.js 1.93 kB
packages/db/dist/esm/query/live/internal.js 145 B
packages/db/dist/esm/query/live/utils.js 1.81 kB
packages/db/dist/esm/query/optimizer.js 2.92 kB
packages/db/dist/esm/query/predicate-utils.js 2.97 kB
packages/db/dist/esm/query/query-once.js 359 B
packages/db/dist/esm/query/subset-dedupe.js 960 B
packages/db/dist/esm/scheduler.js 1.3 kB
packages/db/dist/esm/SortedMap.js 1.3 kB
packages/db/dist/esm/strategies/debounceStrategy.js 247 B
packages/db/dist/esm/strategies/queueStrategy.js 428 B
packages/db/dist/esm/strategies/throttleStrategy.js 246 B
packages/db/dist/esm/transactions.js 3.04 kB
packages/db/dist/esm/utils.js 927 B
packages/db/dist/esm/utils/array-utils.js 273 B
packages/db/dist/esm/utils/browser-polyfills.js 304 B
packages/db/dist/esm/utils/btree.js 5.61 kB
packages/db/dist/esm/utils/comparison.js 1.11 kB
packages/db/dist/esm/utils/cursor.js 457 B
packages/db/dist/esm/utils/index-optimization.js 2.39 kB
packages/db/dist/esm/utils/type-guards.js 157 B
packages/db/dist/esm/utils/uuid.js 449 B
packages/db/dist/esm/virtual-props.js 360 B

compressed-size-action::db-package-size

@github-actions

Copy link
Copy Markdown
Contributor

Size Change: 0 B

Total Size: 4.22 kB

ℹ️ View Unchanged
Filename Size
packages/react-db/dist/esm/index.js 249 B
packages/react-db/dist/esm/useLiveInfiniteQuery.js 1.32 kB
packages/react-db/dist/esm/useLiveQuery.js 1.33 kB
packages/react-db/dist/esm/useLiveQueryEffect.js 355 B
packages/react-db/dist/esm/useLiveSuspenseQuery.js 567 B
packages/react-db/dist/esm/usePacedMutations.js 401 B

compressed-size-action::react-db-package-size

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant