approval_tests_flutter
Approval Tests implementation in Dart (Flutter). Inspired by ApprovalTests.
1.5.1
265 downloads/mo
#1113 most downloaded on pub.dev
approvals/ApprovalTests.Dart.Flutter
What this package is like to depend on
Last release 17 days ago
07 Aug 2026
Release timing varies
gaps range from 2 weeks to 8 months
Most releases are documented
notes for 12 of 14 stable releases
Nothing withdrawn
no release was ever pulled
2 years old
14 releases · first in 2024
8 releases in the last 12 months
see the full history below
Release timeline
14 releases · Jul 2024 to Aug 2026Releases
latest 14-
1.5.107 Aug 2026Release notes
Open source →Documentation
- Reworked the package guide with a first Flutter approval test, guidance for choosing approval snapshots versus focused assertions, and a CI policy for reviewing and committing baselines safely.
- Expanded the executable example with a feature-first orders slice covering dependency-injected state management, typed failures, loading/loaded/error approvals, focused retry and empty-state assertions, and repository lifecycle changes.
-
1.5.026 Jul 2026Release notes
Open source →Fixed
- Widget-name cache writes are now atomic.
flutter testruns test files in parallel processes that share one cache file, so the previous single write was observable by another process as a truncated file — a short read drops names, which silently drops lines from a snapshot. - Widget-name discovery no longer throws
ArgumentErroron Windows.AnalysisContextCollectionrejects a path that is not absolute and normalized; theliband Dart SDK paths were built by string concatenation. - Cache freshness is validated by fingerprint instead of newest modification time. The old check missed a deleted non-newest file, a checkout with backdated timestamps, and a timestamp-preserving rename, and it treated a write racing an edit as fresh. Any cache problem is now a rescan, never an error.
- The cache is byte-stable: discovered sources and class names are sorted.
- The analysis context is disposed, so its driver no longer outlives
setUpAll. - Blocking
listSync/createSync/writeAsStringSynccalls inside the async setup path are now awaited. printExpects(widgetTypes: ...)no longer ignores its argument after the first call. A one-shot latch meant only the first set was ever registered.- The intl reverse lookup reloads when
pathToStringschanges. Its "already loaded" flag was checked but never set, so the file was re-read on every call, and a different path could never win.
Changed
- Capture state — registered types and names, previous-capture memory, the localization lookup, and the intl string holder — moved out of library globals into an explicit session.
- Added
ApprovalWidgets.tearDownAll(), which discards that session. It is optional: omitting it reproduces the previous behaviour exactly. Add it when one test file has groups with different registrations, since aregisterTypescall otherwise stays in effect for every later group in the file and changes their snapshots. registerTypeskeeps its signature but now writes into the current session.printExpects(widgetNames: ...)adds to the session's registered names instead of replacing them, so a narrower set no longer hides names discovered bysetUpAll. This affects console output only, never an approved file.- Added
pathas a direct dependency; it was already resolved transitively.
Removed
loadWidgetNames()and theStringApprovedExtension.endWithNewlinehelper insrc/common.dart, both unused after the discovery rewrite. Neither was exported from the package's public API.
Snapshot output is unchanged. No
*.approved.txtneeds re-approving.Internal
- Expanded deterministic coverage for widget metadata and expect generation, finder and pump policies, semantics and golden approvals, widget-name cache failures, and bounded Windows rename retries.
- Reached 100% executable line coverage (594/594 lines); all 100 test executions pass.
- Widget-name cache writes are now atomic.
-
1.4.115 Jul 2026Release notes
Open source →- Added
WidgetActionPumpPolicysotapWidget()callers can explicitly choose no pump, one pump, a fixed-duration pump, or bounded settling. - Deprecated
tapWidget(shouldPumpAndSettle: ...). Existing calls still settle by default throughout 1.x; migrate to the explicitpumpPolicyparameter. - Approval capture helpers remain caller-controlled and never pump or settle implicitly.
- Added
-
1.4.022 Jun 2026Release notes
Open source →- Fix (behavior change):
approvalTest()now writes a full, self-contained snapshot of the widget tree on every call. Previously a second call in the same test emitted only the delta from the prior call, producing snapshots that could not be reviewed in isolation. Existing approved files that relied on the old delta output must be re-approved. - Snapshot lines are now sorted deterministically, so approvals no longer flake on widget tree-traversal order.
- Added
tester.approvalSemantics()— approval testing of the rendered accessibility (semantics) tree (labels, values, hints, tooltips, identifiers, actions); geometry is omitted so output is stable across platforms. - Added
tester.approvalGolden(finder)— golden/pixel approvals named to sit alongside the text approvals; runflutter test --update-goldensto (re)create the image. - Exported the
expectWidget/tapWidget/findByfinder helpers andregisterTypes, and exposedwidgetTypes/widgetNamesontester.printExpects(). - Removed the cold-start
flutter --versionsubprocess; the Dart SDK is now resolved fromFLUTTER_ROOT, making widget-name extraction faster and not dependent onflutterbeing onPATH. - Removed the unused
matchdependency. - Internal cleanup: replaced the
Completer/.thenwrappers withasync/await(failures now propagate instead of hanging to timeout), guarded the analyzer parse-result cast, fixed the staleApproved.initialize()setup hint, and stopped tracking the generated.approval_tests/cache.
- Fix (behavior change):
-
1.3.222 Jun 2026Release notes
Open source →- Raised the
analyzerconstraint to>=12.0.0 <14.0.0to resolve a version conflict withflutter_teston current Flutter/Dart SDKs, whose pinnedtest/test_apirequire analyzer 12+. - Migrated widget-name extraction to the analyzer 12 AST API (
ClassDeclaration.namePart.typeName), replacing the removednametoken getter. - Note: this drops support for analyzer 8–11 (older Flutter SDKs).
- Raised the
-
1.3.111 Oct 2025Release notes
Open source →- Fixed
loadWidgetNamesto return an empty string when the widget cache file is missing, avoidingLateInitializationError. - Restored intl reverse-lookup loading by re-enabling JSON parsing in
loadEnStringReverseLookup. - Updated
WidgetMeta.hashCodeto match its equality semantics, ensuring set/map deduplication works as intended. - Added regression tests covering widget name loading, intl reverse lookup, and
WidgetMetaequality. - Declared an upper bound on the supported Dart SDK (
<4.0.0) to satisfy pub publishing requirements. - Added explicit platform support metadata (Android, iOS, Linux, macOS, Windows) so pub scoring can detect supported platforms.
- Replaced the bundled license text with the standard Apache 2.0 wording recognized by pub.dev.
- Added a minimal
example/main.dartshowcasing a widget approval test. - Updated dependency constraints (for example
approval_testsnow targets 1.3.3) to stay aligned with upstream packages. ContextLocatorreplaced byAnalysisContextCollection
- Fixed
-
1.3.011 Oct 2025Nothing published for this version
-
1.2.010 Oct 2025Nothing published for this version
-
1.1.618 Feb 2025 -
1.1.303 Jul 2024 -
1.1.202 Jul 2024Release notes
Open source →- Added CLI additional options:
Usage:dart run approval_tests:review [arguments]- Arguments:
--helpPrint this usage information.--listPrint a list of project .received.txt files.<index>Review an .received.txt file indexed by --list.<path/to/.received.txt>Review an .received.txt file.
- Arguments:
- Added CLI additional options:
-
1.1.102 Jul 2024 -
1.1.002 Jul 2024Release notes
Open source →- Breaking release:
- Added new reporter:
GitReporter. It allows you to usegitto view the differences between the received and approved files. - Added support to approve files using CLI. Now you can approve files using the command line:
dart run approval_tests:review - Added support to use ApprovalTests during widget tests.
- Added header to generated files. For resolved issues you can add this to approved files:
'# This file was generated by approval_tests. Please do not edit.\n' - Some minor changes and code improvements. Thanks to Richard Coutts
- Added new reporter:
- Breaking release:
-
1.0.002 Jul 2024