feat(docs): add the angular testing documentation
This PR is to improve the testing doc of Angular package. Let's discuss what is missing and what you would like to be added. BR
Summary by CodeRabbit
-
Documentation
- Added an Angular Testing guide and updated docs navigation with “Testing” and “Unit Testing / Jest”.
-
Examples
- Added a full Angular Unit Testing example (Jest, devcontainer, configs, mock API, components, service).
- Auto-refetching: return promises from cache-invalidation callbacks.
- Optimistic Updates: refined mutation lifecycle (invalidate on settle) and changed error emission behavior.
-
Tests
- Added comprehensive unit tests for the Angular TasksService covering success, optimistic updates, retries, and rollback on errors.
Walkthrough
Adds Angular testing docs and navigation; introduces a new Angular "unit-testing" example (Jest) with mock HTTP interceptor, TasksService (optimistic updates, rollback, invalidate on settle), demo component, and comprehensive unit tests. Also tweaks two existing examples' mutation/invalidation behavior and an interceptor error emission.
Changes
| Cohort / File(s) | Summary |
|---|---|
Docs navigationdocs/config.json |
Adds Angular docs entries: framework/angular/guides/testing and framework/angular/examples/unit-testing. |
Angular testing guidedocs/framework/angular/guides/testing.md |
New guide covering setup, mocking via interceptors, sample TasksService, testing patterns and a Jest example reference. |
Auto-refetching example: serviceexamples/angular/auto-refetching/src/app/services/tasks.service.ts |
addTask and clearAllTasks onSuccess handlers now return the invalidateQueries({ queryKey: ['tasks'] }) Promise. |
Optimistic updates: componentexamples/angular/optimistic-updates/src/app/components/optimistic-updates.component.ts |
Removed clearMutation property; no other logic changes. |
Optimistic updates: mock interceptorexamples/angular/optimistic-updates/src/app/interceptor/mock-api.interceptor.ts |
For /api/tasks-wrong-url, replaced HTTP 500 response with an error observable via throwError(() => new Error('error')).pipe(delay(1000)). |
Optimistic updates: serviceexamples/angular/optimistic-updates/src/app/services/tasks.service.ts |
Mutation callbacks refined: typed onMutate params, unused params prefixed with _, onSuccess made a no-op, onSettled returns the invalidateQueries Promise. |
Unit-testing example: project scaffoldexamples/angular/unit-testing/... (.devcontainer/devcontainer.json, .eslintrc.cjs, package.json, angular.json, jest.config.ts, tsconfig*.json, README.md) |
New Angular 19 + Jest project scaffold, build/test config, tooling and README for unit-testing example. |
Unit-testing example: app scaffoldexamples/angular/unit-testing/src/index.html, src/main.ts, src/app/app.component.ts, src/app/app.config.ts |
Bootstraps standalone app; provides HttpClient with mock interceptor and TanStack Query client (devtools, 24h gcTime). |
Unit-testing example: mock interceptorexamples/angular/unit-testing/src/app/interceptor/mock-api.interceptor.ts |
New mock interceptor simulating /api/tasks GET/POST with sessionStorage persistence, delayed responses, call-number behavior, and an error path. |
Unit-testing example: service + specexamples/angular/unit-testing/src/app/services/tasks.service.ts, .../services/tasks.service.spec.ts |
New TasksService (allTasks query, addTask mutation with optimistic updates/rollback and invalidate on settle) and comprehensive Jest tests exercising optimistic updates, success and failure flows. |
Unit-testing example: componentexamples/angular/unit-testing/src/app/components/unit-testing.component.ts |
Demo component exposing injectQuery/injectMutation usage, listing tasks, adding tasks and UI indicators used by tests. |
Sequence Diagram(s)
sequenceDiagram
autonumber
participant Component as UnitTestingComponent
participant Query as allTasks (Query)
participant Mutation as addTask (Mutation)
participant QC as QueryClient
participant HTTP as HttpClient
participant INT as mockInterceptor
Component->>Query: injectQuery(() => allTasks)
Query->>QC: fetch ['tasks']
QC->>HTTP: GET /api/tasks
HTTP->>INT: intercept GET
INT-->>HTTP: delayed 200 tasks[]
HTTP-->>QC: tasks[]
QC-->>Query: data updated
Query-->>Component: status success + data
Component->>Mutation: mutate({task})
Mutation->>QC: onMutate -> cancel + optimistic update
Mutation->>HTTP: POST /api/tasks
HTTP->>INT: intercept POST
INT-->>HTTP: delayed 201 success
HTTP-->>Mutation: success
Mutation->>QC: onSettled -> invalidate ['tasks']
QC->>HTTP: GET /api/tasks (refetch)
HTTP->>INT: intercept GET
INT-->>HTTP: delayed 200 tasks[..., "CallNumber N"]
HTTP-->>QC: tasks...
QC-->>Component: cache refreshed
Estimated code review effort
🎯 4 (Complex) | ⏱️ ~45 minutes
Suggested labels
package: angular-query-experimental
Pre-merge checks (3 passed)
✅ Passed checks (3 passed)
| Check name | Status | Explanation |
|---|---|---|
| Description Check | ✅ Passed | Check skipped - CodeRabbit’s high-level summary is enabled. |
| Title Check | ✅ Passed | The title "feat(docs): add the angular testing documentation" is concise, follows conventional commit style, and accurately summarizes the primary purpose of the changeset (adding Angular testing docs and related example material), so it is directly related and clear to reviewers. |
| Docstring Coverage | ✅ Passed | No functions found in the changes. Docstring coverage check skipped. |
Poem
I twitch my whiskers, tests in sight,
Mocked responses hum through the night.
I optimistically hop and then—rollback—
Jest cheers, green ticks on my stack.
A carrot for CI, a hop, a clap! 🥕🐇
✨ Finishing touches
- [ ] 📝 Generate Docstrings
🧪 Generate unit tests
- [ ] Create PR with unit tests
- [ ] Post copyable unit tests in a comment
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.
Comment @coderabbitai help to get the list of available commands and usage tips.
View your CI Pipeline Execution ↗ for commit 4d17061a8c68464ba2f7a105ca2c4e943b823b4b
| Command | Status | Duration | Result |
|---|---|---|---|
nx affected --targets=test:sherif,test:knip,tes... |
✅ Succeeded | 3m 49s | View ↗ |
nx run-many --target=build --exclude=examples/*... |
✅ Succeeded | 1m 24s | View ↗ |
☁️ Nx Cloud last updated this comment at 2025-09-11 23:25:27 UTC
More templates
- @tanstack/query-example-angular-auto-refetching
- @tanstack/query-example-angular-basic
- @tanstack/query-example-angular-basic-persister
- @tanstack/query-example-angular-devtools-panel
- @tanstack/query-example-angular-infinite-query-with-max-pages
- @tanstack/query-example-angular-optimistic-updates
- @tanstack/query-example-angular-pagination
- @tanstack/query-example-angular-query-options-from-a-service
- @tanstack/query-example-angular-router
- @tanstack/query-example-angular-rxjs
- @tanstack/query-example-angular-simple
- @tanstack/query-example-angular-unit-testing
- @tanstack/query-example-svelte-auto-refetching
- @tanstack/query-example-svelte-basic
- @tanstack/query-example-svelte-load-more-infinite-scroll
- @tanstack/query-example-svelte-optimistic-updates
- @tanstack/query-example-svelte-playground
- @tanstack/query-example-svelte-simple
- @tanstack/query-example-svelte-ssr
- @tanstack/query-example-svelte-star-wars
- @tanstack/query-example-solid-astro
- @tanstack/query-example-solid-basic
- @tanstack/query-example-solid-basic-graphql-request
- @tanstack/query-example-solid-default-query-function
- @tanstack/query-example-solid-simple
- @tanstack/query-example-solid-start-streaming
- @tanstack/query-example-react-algolia
- @tanstack/query-example-react-auto-refetching
- @tanstack/query-example-react-basic
- @tanstack/query-example-react-basic-graphql-request
- @tanstack/query-example-chat
- @tanstack/query-example-react-default-query-function
- @tanstack/query-example-react-devtools-panel
- @tanstack/query-example-eslint-legacy
- @tanstack/query-example-react-infinite-query-with-max-pages
- @tanstack/query-example-react-load-more-infinite-scroll
- @tanstack/query-example-react-nextjs
- @tanstack/query-example-react-nextjs-app-prefetching
- @tanstack/query-example-nextjs-suspense-streaming
- @tanstack/query-example-react-offline
- @tanstack/query-example-react-optimistic-updates-cache
- @tanstack/query-example-react-optimistic-updates-ui
- @tanstack/query-example-react-pagination
- @tanstack/query-example-react-playground
- @tanstack/query-example-react-prefetching
- @tanstack/query-example-react-react-native
- @tanstack/query-example-react-router
- @tanstack/query-example-react-rick-morty
- @tanstack/query-example-react-shadow-dom
- @tanstack/query-example-react-simple
- @tanstack/query-example-react-star-wars
- @tanstack/query-example-react-suspense
- @tanstack/query-example-vue-2.6-basic
- @tanstack/query-example-vue-2.7-basic
- @tanstack/query-example-vue-basic
- @tanstack/query-example-vue-dependent-queries
- @tanstack/query-example-vue-nuxt3
- @tanstack/query-example-vue-persister
- @tanstack/query-example-vue-simple
@tanstack/angular-query-devtools-experimental
npm i https://pkg.pr.new/@tanstack/angular-query-devtools-experimental@9023
@tanstack/angular-query-experimental
npm i https://pkg.pr.new/@tanstack/angular-query-experimental@9023
@tanstack/eslint-plugin-query
npm i https://pkg.pr.new/@tanstack/eslint-plugin-query@9023
@tanstack/query-async-storage-persister
npm i https://pkg.pr.new/@tanstack/query-async-storage-persister@9023
@tanstack/query-broadcast-client-experimental
npm i https://pkg.pr.new/@tanstack/query-broadcast-client-experimental@9023
@tanstack/query-core
npm i https://pkg.pr.new/@tanstack/query-core@9023
@tanstack/query-devtools
npm i https://pkg.pr.new/@tanstack/query-devtools@9023
@tanstack/query-persist-client-core
npm i https://pkg.pr.new/@tanstack/query-persist-client-core@9023
@tanstack/query-sync-storage-persister
npm i https://pkg.pr.new/@tanstack/query-sync-storage-persister@9023
@tanstack/react-query
npm i https://pkg.pr.new/@tanstack/react-query@9023
@tanstack/react-query-devtools
npm i https://pkg.pr.new/@tanstack/react-query-devtools@9023
@tanstack/react-query-next-experimental
npm i https://pkg.pr.new/@tanstack/react-query-next-experimental@9023
@tanstack/react-query-persist-client
npm i https://pkg.pr.new/@tanstack/react-query-persist-client@9023
@tanstack/solid-query
npm i https://pkg.pr.new/@tanstack/solid-query@9023
@tanstack/solid-query-devtools
npm i https://pkg.pr.new/@tanstack/solid-query-devtools@9023
@tanstack/solid-query-persist-client
npm i https://pkg.pr.new/@tanstack/solid-query-persist-client@9023
@tanstack/svelte-query
npm i https://pkg.pr.new/@tanstack/svelte-query@9023
@tanstack/svelte-query-devtools
npm i https://pkg.pr.new/@tanstack/svelte-query-devtools@9023
@tanstack/svelte-query-persist-client
npm i https://pkg.pr.new/@tanstack/svelte-query-persist-client@9023
@tanstack/vue-query
npm i https://pkg.pr.new/@tanstack/vue-query@9023
@tanstack/vue-query-devtools
npm i https://pkg.pr.new/@tanstack/vue-query-devtools@9023
commit: 4d17061
Codecov Report
:white_check_mark: All modified and coverable lines are covered by tests.
:white_check_mark: Project coverage is 45.51%. Comparing base (7f0e716) to head (4d17061).
Additional details and impacted files
@@ Coverage Diff @@
## main #9023 +/- ##
=======================================
Coverage 45.51% 45.51%
=======================================
Files 209 209
Lines 8379 8379
Branches 1896 1897 +1
=======================================
Hits 3814 3814
Misses 4118 4118
Partials 447 447
:rocket: New features to boost your workflow:
- :snowflake: Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
- :package: JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.