# Testing signals — pmndrs/jotai

> Canonical page: https://codevetter.com/unpack/jotai/testing-signals

# Testing signals — pmndrs/jotai

Scanned commit 6abd0ae3365e02ab432fba4b6e8e6f00aafbf508 (2026-09-29). Generated by codevetter codevetter 1.15.0 on 2026-10-02.

Source inspection; upstream code and tests were not executed.

Tests and CI were inspected, not executed; no passing result or coverage percentage is asserted. Vitest runs the library suites in jsdom with React Testing Library and source aliases. Inspected regressions cover dependency notifications, cancellation, persistence, raw hooks, and garbage collection. Root automation checks several compatibility dimensions, but its configured scope does not establish end-to-end website or service coverage.
- Vitest selects tests under tests, uses jsdom and the React plugin, enables globals for Testing Library cleanup, aliases jotai imports to src, and loads jest-dom matchers. — [vitest.config.mts#L5-L23](https://github.com/pmndrs/jotai/blob/6abd0ae3365e02ab432fba4b6e8e6f00aafbf508/vitest.config.mts#L5-L23) [tests/setup.ts#L1-L1](https://github.com/pmndrs/jotai/blob/6abd0ae3365e02ab432fba4b6e8e6f00aafbf508/tests/setup.ts#L1-L1) [tests/react/basic.test.tsx#L1-L7](https://github.com/pmndrs/jotai/blob/6abd0ae3365e02ab432fba4b6e8e6f00aafbf508/tests/react/basic.test.tsx#L1-L7)
- Store regressions assert unchanged-value notification suppression, dependency cleanup, and recovery of derived notifications during nested no-op writes plus subscription churn and synchronous event cascades (#3353). — [tests/vanilla/store.test.tsx#L63-L121](https://github.com/pmndrs/jotai/blob/6abd0ae3365e02ab432fba4b6e8e6f00aafbf508/tests/vanilla/store.test.tsx#L63-L121) [tests/vanilla/store.test.tsx#L1617-L1679](https://github.com/pmndrs/jotai/blob/6abd0ae3365e02ab432fba4b6e8e6f00aafbf508/tests/vanilla/store.test.tsx#L1617-L1679)
- Async tests use fake timers and assert abort on dependency replacement, continued execution after unsubscribe, Suspense loading states, and suppression of obsolete results during rapid updates. — [tests/vanilla/store.test.tsx#L525-L602](https://github.com/pmndrs/jotai/blob/6abd0ae3365e02ab432fba4b6e8e6f00aafbf508/tests/vanilla/store.test.tsx#L525-L602) [tests/react/abortable.test.tsx#L8-L79](https://github.com/pmndrs/jotai/blob/6abd0ae3365e02ab432fba4b6e8e6f00aafbf508/tests/react/abortable.test.tsx#L8-L79)
- Storage tests assert mount hydration, persisted increments, RESET deletion, getOnInit reads, sync/async validator fallbacks, and custom subscription delivery; these exercise adapters and jsdom rather than live cross-tab browsers. — [tests/react/vanilla-utils/atomWithStorage.test.tsx#L35-L133](https://github.com/pmndrs/jotai/blob/6abd0ae3365e02ab432fba4b6e8e6f00aafbf508/tests/react/vanilla-utils/atomWithStorage.test.tsx#L35-L133) [tests/react/vanilla-utils/atomWithStorage.test.tsx#L711-L841](https://github.com/pmndrs/jotai/blob/6abd0ae3365e02ab432fba4b6e8e6f00aafbf508/tests/react/vanilla-utils/atomWithStorage.test.tsx#L711-L841) [tests/react/vanilla-utils/atomWithStorage.test.tsx#L843-L936](https://github.com/pmndrs/jotai/blob/6abd0ae3365e02ab432fba4b6e8e6f00aafbf508/tests/react/vanilla-utils/atomWithStorage.test.tsx#L843-L936) [vitest.config.mts#L18-L19](https://github.com/pmndrs/jotai/blob/6abd0ae3365e02ab432fba4b6e8e6f00aafbf508/vitest.config.mts#L18-L19)
- Raw-hook tests assert stable promise identity and preservation of a subscription across value changes; RawSync tests assert non-suspending promise returns and detection of a child's mount-time write. — [tests/react/useAtomValueRaw.test.tsx#L88-L154](https://github.com/pmndrs/jotai/blob/6abd0ae3365e02ab432fba4b6e8e6f00aafbf508/tests/react/useAtomValueRaw.test.tsx#L88-L154) [tests/react/useAtomValueRawSync.test.tsx#L68-L136](https://github.com/pmndrs/jotai/blob/6abd0ae3365e02ab432fba4b6e8e6f00aafbf508/tests/react/useAtomValueRawSync.test.tsx#L68-L136)
- Memory-leak tests use jest-leak-detector for unreferenced atoms, subscribed/unsubscribed state, and removed sync/async dependencies; separate store tests expect deep synchronous graphs to surface stack overflow and listeners to continue after another listener throws. — [tests/vanilla/memoryleaks.test.ts#L12-L58](https://github.com/pmndrs/jotai/blob/6abd0ae3365e02ab432fba4b6e8e6f00aafbf508/tests/vanilla/memoryleaks.test.ts#L12-L58) [tests/vanilla/memoryleaks.test.ts#L108-L149](https://github.com/pmndrs/jotai/blob/6abd0ae3365e02ab432fba4b6e8e6f00aafbf508/tests/vanilla/memoryleaks.test.ts#L108-L149) [tests/vanilla/store.test.tsx#L1013-L1041](https://github.com/pmndrs/jotai/blob/6abd0ae3365e02ab432fba4b6e8e6f00aafbf508/tests/vanilla/store.test.tsx#L1013-L1041) [tests/vanilla/store.test.tsx#L1081-L1128](https://github.com/pmndrs/jotai/blob/6abd0ae3365e02ab432fba4b6e8e6f00aafbf508/tests/vanilla/store.test.tsx#L1081-L1128)
- Inspected CI runs format/types/lint/spec/build across Node 22.12, 24, and 26; separate matrices test React 18/19 plus canary/experimental versions, TypeScript 5.5–5.9, and built ESM in development/production modes. — [.github/workflows/test.yml#L17-L38](https://github.com/pmndrs/jotai/blob/6abd0ae3365e02ab432fba4b6e8e6f00aafbf508/.github/workflows/test.yml#L17-L38) [.github/workflows/test-multiple-versions.yml#L17-L44](https://github.com/pmndrs/jotai/blob/6abd0ae3365e02ab432fba4b6e8e6f00aafbf508/.github/workflows/test-multiple-versions.yml#L17-L44) [.github/workflows/test-old-typescript.yml#L17-L40](https://github.com/pmndrs/jotai/blob/6abd0ae3365e02ab432fba4b6e8e6f00aafbf508/.github/workflows/test-old-typescript.yml#L17-L40) [.github/workflows/test-multiple-builds.yml#L17-L49](https://github.com/pmndrs/jotai/blob/6abd0ae3365e02ab432fba4b6e8e6f00aafbf508/.github/workflows/test-multiple-builds.yml#L17-L49)
- Configured coverage includes src/** and defines no threshold; ordinary root type checking includes src/tests/benchmarks, while lint excludes examples and website. The inspected root test workflow does not invoke website builds, contact-service checks, or example UI tests. — [vitest.config.mts#L24-L29](https://github.com/pmndrs/jotai/blob/6abd0ae3365e02ab432fba4b6e8e6f00aafbf508/vitest.config.mts#L24-L29) [tsconfig.json#L22-L23](https://github.com/pmndrs/jotai/blob/6abd0ae3365e02ab432fba4b6e8e6f00aafbf508/tsconfig.json#L22-L23) [eslint.config.mjs#L11-L12](https://github.com/pmndrs/jotai/blob/6abd0ae3365e02ab432fba4b6e8e6f00aafbf508/eslint.config.mjs#L11-L12) [.github/workflows/test.yml#L33-L38](https://github.com/pmndrs/jotai/blob/6abd0ae3365e02ab432fba4b6e8e6f00aafbf508/.github/workflows/test.yml#L33-L38)

Every claim links to its cited files at the pinned commit. Citations identify source evidence; they do not establish runtime correctness. Independent CodeVetter scan — not reviewed by upstream maintainers.

## Public product links

- [CodeVetter](https://codevetter.com/)
- [Download](https://codevetter.com/download)
- [Documentation](https://codevetter.com/docs/)
- [Source](https://github.com/Codevetter/codevetter)
