suspensive
suspensive copied to clipboard
Standardize timer advancement patterns in tests for improved consistency
Improve test performance by using fake timers instead of real timers
This PR standardizes timer usage patterns across all test files to improve consistency and maintainability, addressing inconsistent timer advancement approaches that were previously mixed throughout the codebase.
Problem
Tests were using inconsistent timer advancement patterns:
- Some tests used
vi.advanceTimersByTimeAsync()(async version) - Other tests used
vi.advanceTimersByTime()(sync version) - This inconsistency made the codebase harder to maintain and understand
Solution
Standardized all timer advancement calls to use the synchronous vi.advanceTimersByTime() method where appropriate. This change:
- Improves consistency: All timer-related tests now follow the same pattern
- Simplifies code: Removes unnecessary async operations where sync methods suffice
- Maintains functionality: All tests continue to pass and verify the same behavior
- Enhances maintainability: Future developers have clear patterns to follow
Changes Made
Jotai Package
- Updated
Atom.spec.tsx,AtomValue.spec.tsx, andSetAtom.spec.tsxto use sync timer advancement - Total of 7 timer advancement calls standardized
React Package
- Updated
lazy.spec.tsxto use sync timer advancement consistently - Total of 29 timer advancement calls standardized
Example Change
// Before (inconsistent)
await act(() => vi.advanceTimersByTimeAsync(100))
// After (standardized)
await act(() => vi.advanceTimersByTime(100))
This works correctly because all affected tests already properly use fake timers (vi.useFakeTimers()) and the sleep() functions use setTimeout which respects fake timers. The sync version is sufficient for these test scenarios as no complex async promise coordination is required.
Verification
- ✅ All 14 jotai package tests pass
- ✅ All 178 react package tests pass
- ✅ No functionality changes introduced
- ✅ Fake timers remain properly configured
- ✅ Branch rebased onto latest main (clean linear history)
Fixes #1448.
✨ Let Copilot coding agent set things up for you — coding agent works faster and does higher quality work when set up for your repo.
The latest updates on your projects. Learn more about Vercel for GitHub.
| Project | Deployment | Preview | Comments | Updated (UTC) |
|---|---|---|---|---|
| v2.suspensive.org | Preview | Comment | Oct 14, 2025 2:33pm | |
| v3.suspensive.org | Preview | Comment | Oct 14, 2025 2:33pm | |
| visualization.suspensive.org | Preview | Comment | Oct 14, 2025 2:33pm |
⚠️ No Changeset found
Latest commit: 08de5ba88d69446f81a783ce4a8baf7bb3c46bb8
Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.
This PR includes no changesets
When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types
Click here to learn what changesets are, and how to add one.
Click here if you're a maintainer who wants to add a changeset to this PR
People can be co-author:
| Candidate | Reasons | Count | Add this as commit message |
|---|---|---|---|
| @Copilot | https://github.com/toss/suspensive/pull/1747 | 1 | Co-authored-by: Copilot <[email protected]> |
| @codecov-commenter | https://github.com/toss/suspensive/pull/1747#issuecomment-3334968920 | 1 | Co-authored-by: codecov-commenter <[email protected]> |
| @manudeli | https://github.com/toss/suspensive/pull/1747#issuecomment-3402091414 | 1 | Co-authored-by: manudeli <[email protected]> |
Size Change: 0 B
Total Size: 80.2 kB
ℹ️ View Unchanged
| Filename | Size |
|---|---|
packages/jotai/dist/Atom-********.cjs |
383 B |
packages/jotai/dist/Atom-********.js |
265 B |
packages/jotai/dist/Atom.cjs |
93 B |
packages/jotai/dist/Atom.js |
80 B |
packages/jotai/dist/AtomValue-********.js |
241 B |
packages/jotai/dist/AtomValue-********.cjs |
375 B |
packages/jotai/dist/AtomValue.cjs |
99 B |
packages/jotai/dist/AtomValue.js |
85 B |
packages/jotai/dist/chunk-********.cjs |
542 B |
packages/jotai/dist/index.cjs |
151 B |
packages/jotai/dist/index.js |
125 B |
packages/jotai/dist/SetAtom-********.cjs |
368 B |
packages/jotai/dist/SetAtom-********.js |
239 B |
packages/jotai/dist/SetAtom.cjs |
97 B |
packages/jotai/dist/SetAtom.js |
83 B |
packages/react-dom/dist/FadeIn-********.js |
402 B |
packages/react-dom/dist/FadeIn-********.cjs |
516 B |
packages/react-dom/dist/FadeIn.cjs |
132 B |
packages/react-dom/dist/FadeIn.js |
115 B |
packages/react-dom/dist/index.cjs |
176 B |
packages/react-dom/dist/index.js |
145 B |
packages/react-dom/dist/InView-********.js |
672 B |
packages/react-dom/dist/InView-********.cjs |
754 B |
packages/react-dom/dist/InView.cjs |
114 B |
packages/react-dom/dist/InView.js |
99 B |
packages/react-dom/dist/useFadeIn-********.js |
425 B |
packages/react-dom/dist/useFadeIn-********.cjs |
512 B |
packages/react-dom/dist/useFadeIn.cjs |
122 B |
packages/react-dom/dist/useFadeIn.js |
107 B |
packages/react-dom/dist/useInView-********.cjs |
2.06 kB |
packages/react-dom/dist/useInView-********.js |
1.61 kB |
packages/react-dom/dist/useInView.cjs |
99 B |
packages/react-dom/dist/useInView.js |
85 B |
packages/react-native/dist/index.cjs |
98 B |
packages/react-native/dist/index.js |
84 B |
packages/react-native/dist/TestText-********.cjs |
707 B |
packages/react-native/dist/TestText-********.js |
211 B |
packages/react-native/dist/TestText.cjs |
98 B |
packages/react-native/dist/TestText.js |
84 B |
packages/react-query-4/dist/chunk-********.cjs |
542 B |
packages/react-query-4/dist/index.cjs |
522 B |
packages/react-query-4/dist/index.js |
435 B |
packages/react-query-4/dist/infiniteQueryOptions-********.js |
308 B |
packages/react-query-4/dist/infiniteQueryOptions-********.cjs |
431 B |
packages/react-query-4/dist/infiniteQueryOptions.cjs |
111 B |
packages/react-query-4/dist/infiniteQueryOptions.js |
96 B |
packages/react-query-4/dist/IsFetching-********.js |
268 B |
packages/react-query-4/dist/IsFetching-********.cjs |
408 B |
packages/react-query-4/dist/IsFetching.cjs |
100 B |
packages/react-query-4/dist/IsFetching.js |
86 B |
packages/react-query-4/dist/Mutation-********.cjs |
459 B |
packages/react-query-4/dist/Mutation-********.js |
323 B |
packages/react-query-4/dist/Mutation.cjs |
135 B |
packages/react-query-4/dist/Mutation.js |
120 B |
packages/react-query-4/dist/mutationOptions-********.js |
153 B |
packages/react-query-4/dist/mutationOptions-********.cjs |
210 B |
packages/react-query-4/dist/mutationOptions.cjs |
103 B |
packages/react-query-4/dist/mutationOptions.js |
89 B |
packages/react-query-4/dist/objectWithoutProperties-********.cjs |
412 B |
packages/react-query-4/dist/objectWithoutProperties-********.js |
369 B |
packages/react-query-4/dist/PrefetchInfiniteQuery-********.js |
408 B |
packages/react-query-4/dist/PrefetchInfiniteQuery-********.cjs |
521 B |
packages/react-query-4/dist/PrefetchInfiniteQuery.cjs |
131 B |
packages/react-query-4/dist/PrefetchInfiniteQuery.js |
115 B |
packages/react-query-4/dist/PrefetchQuery-********.js |
396 B |
packages/react-query-4/dist/PrefetchQuery-********.cjs |
513 B |
packages/react-query-4/dist/PrefetchQuery.cjs |
122 B |
packages/react-query-4/dist/PrefetchQuery.js |
105 B |
packages/react-query-4/dist/QueryClientConsumer-********.cjs |
422 B |
packages/react-query-4/dist/QueryClientConsumer-********.js |
283 B |
packages/react-query-4/dist/QueryClientConsumer.cjs |
107 B |
packages/react-query-4/dist/QueryClientConsumer.js |
92 B |
packages/react-query-4/dist/queryOptions-********.cjs |
424 B |
packages/react-query-4/dist/queryOptions-********.js |
304 B |
packages/react-query-4/dist/queryOptions.cjs |
102 B |
packages/react-query-4/dist/queryOptions.js |
88 B |
packages/react-query-4/dist/SuspenseInfiniteQuery-********.js |
571 B |
packages/react-query-4/dist/SuspenseInfiniteQuery-********.cjs |
714 B |
packages/react-query-4/dist/SuspenseInfiniteQuery.cjs |
148 B |
packages/react-query-4/dist/SuspenseInfiniteQuery.js |
133 B |
packages/react-query-4/dist/SuspenseQueries-********.cjs |
636 B |
packages/react-query-4/dist/SuspenseQueries-********.js |
493 B |
packages/react-query-4/dist/SuspenseQueries.cjs |
105 B |
packages/react-query-4/dist/SuspenseQueries.js |
91 B |
packages/react-query-4/dist/SuspenseQuery-********.js |
559 B |
packages/react-query-4/dist/SuspenseQuery-********.cjs |
697 B |
packages/react-query-4/dist/SuspenseQuery.cjs |
140 B |
packages/react-query-4/dist/SuspenseQuery.js |
125 B |
packages/react-query-4/dist/usePrefetchInfiniteQuery-********.js |
404 B |
packages/react-query-4/dist/usePrefetchInfiniteQuery-********.cjs |
518 B |
packages/react-query-4/dist/usePrefetchInfiniteQuery.cjs |
115 B |
packages/react-query-4/dist/usePrefetchInfiniteQuery.js |
100 B |
packages/react-query-4/dist/usePrefetchQuery-********.js |
395 B |
packages/react-query-4/dist/usePrefetchQuery-********.cjs |
513 B |
packages/react-query-4/dist/usePrefetchQuery.cjs |
106 B |
packages/react-query-4/dist/usePrefetchQuery.js |
92 B |
packages/react-query-4/dist/useSuspenseInfiniteQuery-********.cjs |
438 B |
packages/react-query-4/dist/useSuspenseInfiniteQuery-********.js |
313 B |
packages/react-query-4/dist/useSuspenseInfiniteQuery.cjs |
115 B |
packages/react-query-4/dist/useSuspenseInfiniteQuery.js |
100 B |
packages/react-query-4/dist/useSuspenseQueries-********.js |
307 B |
packages/react-query-4/dist/useSuspenseQueries-********.cjs |
432 B |
packages/react-query-4/dist/useSuspenseQueries.cjs |
109 B |
packages/react-query-4/dist/useSuspenseQueries.js |
94 B |
packages/react-query-4/dist/useSuspenseQuery-********.js |
305 B |
packages/react-query-4/dist/useSuspenseQuery-********.cjs |
431 B |
packages/react-query-4/dist/useSuspenseQuery.cjs |
106 B |
packages/react-query-4/dist/useSuspenseQuery.js |
92 B |
packages/react-query-5/dist/chunk-********.cjs |
542 B |
packages/react-query-5/dist/index.cjs |
518 B |
packages/react-query-5/dist/index.js |
430 B |
packages/react-query-5/dist/infiniteQueryOptions-********.js |
303 B |
packages/react-query-5/dist/infiniteQueryOptions-********.cjs |
427 B |
packages/react-query-5/dist/infiniteQueryOptions.cjs |
111 B |
packages/react-query-5/dist/infiniteQueryOptions.js |
96 B |
packages/react-query-5/dist/IsFetching-********.cjs |
495 B |
packages/react-query-5/dist/IsFetching-********.js |
357 B |
packages/react-query-5/dist/IsFetching.cjs |
137 B |
packages/react-query-5/dist/IsFetching.js |
122 B |
packages/react-query-5/dist/Mutation-********.js |
323 B |
packages/react-query-5/dist/Mutation-********.cjs |
456 B |
packages/react-query-5/dist/Mutation.cjs |
135 B |
packages/react-query-5/dist/Mutation.js |
120 B |
packages/react-query-5/dist/mutationOptions-********.cjs |
423 B |
packages/react-query-5/dist/mutationOptions-********.js |
302 B |
packages/react-query-5/dist/mutationOptions.cjs |
103 B |
packages/react-query-5/dist/mutationOptions.js |
89 B |
packages/react-query-5/dist/objectWithoutProperties-********.js |
369 B |
packages/react-query-5/dist/objectWithoutProperties-********.cjs |
412 B |
packages/react-query-5/dist/PrefetchInfiniteQuery-********.js |
399 B |
packages/react-query-5/dist/PrefetchInfiniteQuery-********.cjs |
536 B |
packages/react-query-5/dist/PrefetchInfiniteQuery.cjs |
112 B |
packages/react-query-5/dist/PrefetchInfiniteQuery.js |
97 B |
packages/react-query-5/dist/PrefetchQuery-********.cjs |
529 B |
packages/react-query-5/dist/PrefetchQuery-********.js |
390 B |
packages/react-query-5/dist/PrefetchQuery.cjs |
103 B |
packages/react-query-5/dist/PrefetchQuery.js |
89 B |
packages/react-query-5/dist/QueryClientConsumer-********.cjs |
423 B |
packages/react-query-5/dist/QueryClientConsumer-********.js |
284 B |
packages/react-query-5/dist/QueryClientConsumer.cjs |
107 B |
packages/react-query-5/dist/QueryClientConsumer.js |
92 B |
packages/react-query-5/dist/queryOptions-********.cjs |
421 B |
packages/react-query-5/dist/queryOptions-********.js |
297 B |
packages/react-query-5/dist/queryOptions.cjs |
102 B |
packages/react-query-5/dist/queryOptions.js |
88 B |
packages/react-query-5/dist/SuspenseInfiniteQuery-********.js |
571 B |
packages/react-query-5/dist/SuspenseInfiniteQuery-********.cjs |
715 B |
packages/react-query-5/dist/SuspenseInfiniteQuery.cjs |
149 B |
packages/react-query-5/dist/SuspenseInfiniteQuery.js |
133 B |
packages/react-query-5/dist/SuspenseQueries-********.cjs |
652 B |
packages/react-query-5/dist/SuspenseQueries-********.js |
506 B |
packages/react-query-5/dist/SuspenseQueries.cjs |
105 B |
packages/react-query-5/dist/SuspenseQueries.js |
91 B |
packages/react-query-5/dist/SuspenseQuery-********.cjs |
693 B |
packages/react-query-5/dist/SuspenseQuery-********.js |
546 B |
packages/react-query-5/dist/SuspenseQuery.cjs |
141 B |
packages/react-query-5/dist/SuspenseQuery.js |
125 B |
packages/react-query-5/dist/usePrefetchInfiniteQuery-********.js |
307 B |
packages/react-query-5/dist/usePrefetchInfiniteQuery-********.cjs |
433 B |
packages/react-query-5/dist/usePrefetchInfiniteQuery.cjs |
115 B |
packages/react-query-5/dist/usePrefetchInfiniteQuery.js |
100 B |
packages/react-query-5/dist/usePrefetchQuery-********.cjs |
424 B |
packages/react-query-5/dist/usePrefetchQuery-********.js |
302 B |
packages/react-query-5/dist/usePrefetchQuery.cjs |
106 B |
packages/react-query-5/dist/usePrefetchQuery.js |
92 B |
packages/react-query-5/dist/useSuspenseInfiniteQuery-********.js |
307 B |
packages/react-query-5/dist/useSuspenseInfiniteQuery-********.cjs |
428 B |
packages/react-query-5/dist/useSuspenseInfiniteQuery.cjs |
115 B |
packages/react-query-5/dist/useSuspenseInfiniteQuery.js |
100 B |
packages/react-query-5/dist/useSuspenseQueries-********.js |
301 B |
packages/react-query-5/dist/useSuspenseQueries-********.cjs |
424 B |
packages/react-query-5/dist/useSuspenseQueries.cjs |
109 B |
packages/react-query-5/dist/useSuspenseQueries.js |
94 B |
packages/react-query-5/dist/useSuspenseQuery-********.cjs |
423 B |
packages/react-query-5/dist/useSuspenseQuery-********.js |
298 B |
packages/react-query-5/dist/useSuspenseQuery.cjs |
106 B |
packages/react-query-5/dist/useSuspenseQuery.js |
92 B |
packages/react-query/dist/chunk-********.cjs |
542 B |
packages/react-query/dist/index.cjs |
381 B |
packages/react-query/dist/index.js |
190 B |
packages/react-query/dist/v4.cjs |
381 B |
packages/react-query/dist/v4.js |
190 B |
packages/react-query/dist/v5.cjs |
381 B |
packages/react-query/dist/v5.js |
190 B |
packages/react/dist/chunk-********.cjs |
542 B |
packages/react/dist/ClientOnly-********.js |
529 B |
packages/react/dist/ClientOnly-********.cjs |
645 B |
packages/react/dist/ClientOnly.cjs |
159 B |
packages/react/dist/ClientOnly.js |
142 B |
packages/react/dist/DefaultProps-********.cjs |
1.03 kB |
packages/react/dist/DefaultProps-********.js |
919 B |
packages/react/dist/DefaultProps.cjs |
163 B |
packages/react/dist/DefaultProps.js |
147 B |
packages/react/dist/DefaultPropsContexts-********.cjs |
372 B |
packages/react/dist/DefaultPropsContexts-********.js |
250 B |
packages/react/dist/Delay-********.cjs |
1.13 kB |
packages/react/dist/Delay-********.js |
1.01 kB |
packages/react/dist/Delay.cjs |
177 B |
packages/react/dist/Delay.js |
160 B |
packages/react/dist/ErrorBoundary-********.js |
2.02 kB |
packages/react/dist/ErrorBoundary-********.cjs |
2.13 kB |
packages/react/dist/ErrorBoundary.cjs |
192 B |
packages/react/dist/ErrorBoundary.js |
175 B |
packages/react/dist/ErrorBoundaryGroup-********.cjs |
1.23 kB |
packages/react/dist/ErrorBoundaryGroup-********.js |
1.1 kB |
packages/react/dist/ErrorBoundaryGroup.cjs |
180 B |
packages/react/dist/ErrorBoundaryGroup.js |
160 B |
packages/react/dist/index.cjs |
460 B |
packages/react/dist/index.js |
395 B |
packages/react/dist/lazy-********.js |
1.98 kB |
packages/react/dist/lazy-********.cjs |
2.1 kB |
packages/react/dist/lazy.cjs |
190 B |
packages/react/dist/lazy.js |
170 B |
packages/react/dist/noop-********.js |
138 B |
packages/react/dist/noop-********.cjs |
201 B |
packages/react/dist/objectSpread2-********.cjs |
806 B |
packages/react/dist/objectSpread2-********.js |
770 B |
packages/react/dist/objectWithoutProperties-********.cjs |
412 B |
packages/react/dist/objectWithoutProperties-********.js |
369 B |
packages/react/dist/Suspense-********.js |
835 B |
packages/react/dist/Suspense-********.cjs |
958 B |
packages/react/dist/Suspense.cjs |
222 B |
packages/react/dist/Suspense.js |
208 B |
packages/react/dist/SuspensiveError-********.cjs |
518 B |
packages/react/dist/SuspensiveError-********.js |
428 B |
packages/react/dist/useIsClient-********.cjs |
350 B |
packages/react/dist/useIsClient-********.js |
243 B |
packages/react/dist/useIsClient.cjs |
117 B |
packages/react/dist/useIsClient.js |
101 B |
Codecov Report
:white_check_mark: All modified and coverable lines are covered by tests.
:white_check_mark: Project coverage is 73.71%. Comparing base (37709db) to head (7b88754).
Additional details and impacted files
@@ Coverage Diff @@
## main #1747 +/- ##
=======================================
Coverage 73.71% 73.71%
=======================================
Files 80 80
Lines 780 780
Branches 164 164
=======================================
Hits 575 575
Misses 196 196
Partials 9 9
| Components | Coverage Δ | |
|---|---|---|
| @suspensive/react | 96.99% <ø> (ø) |
|
| @suspensive/react-dom | 100.00% <ø> (ø) |
|
| @suspensive/react-native | 100.00% <ø> (ø) |
|
| @suspensive/react-query | 84.12% <ø> (ø) |
|
| @suspensive/react-query-4 | 0.00% <ø> (ø) |
|
| @suspensive/react-query-5 | 0.00% <ø> (ø) |
|
| @suspensive/jotai | 100.00% <ø> (ø) |
|
| @suspensive/codemods | 53.69% <ø> (ø) |
: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.
@copilot rebase please
@copilot rebase please
Rebased onto latest main. The branch now has a clean linear history without merge commits (d2f5c03).