Skip to content

refactor(test): migrate errors.js/warnings.js to Jest snapshots#20966

Merged
alexander-akait merged 15 commits into
mainfrom
refactor/errors-warnings-to-snapshots
May 19, 2026
Merged

refactor(test): migrate errors.js/warnings.js to Jest snapshots#20966
alexander-akait merged 15 commits into
mainfrom
refactor/errors-warnings-to-snapshots

Conversation

@xiaoxiaojx

Copy link
Copy Markdown
Member

Summary

Replace hand-written errors.js/warnings.js regex-based test expectation files with Jest snapshot matching, as discussed in the feedback that "adding them manually is very annoying".

The checkArrayExpectation helper now falls back to toMatchSnapshot() when no .js expectation file exists. Absolute paths are normalized with stable placeholders (<TEST_DIR>, <WEBPACK_ROOT>, <ANCESTOR>) so snapshots are portable across environments.

Key changes:

  • test/checkArrayExpectation.js — snapshot fallback with configurable SNAPSHOT_FIELDS for easy extension
  • test/TestCases.template.js — per-case snapshot hooks via registerPerCaseSnapshotHooks
  • test/harness/snapshot/resolver.js — added normal suite mapping
  • ~87 errors.js/warnings.js deleted across test/cases/ and test/configCases/, replaced by __snapshots__/*.snap
  • 8 complex/function-based/nondeterministic expectation files retained

Adding or updating error/warning expectations is now yarn jest -u instead of hand-writing regex patterns.

What kind of change does this PR introduce?

refactor

Did you add tests for your changes?

This PR modifies the test infrastructure itself. All existing test cases continue to pass — the assertion mechanism changed from regex matching to snapshot matching, but the coverage is the same.

Does this PR introduce a breaking change?

No.

If relevant, what needs to be documented once your changes are merged or what have you already documented?

TESTING_DOCS.md could be updated to describe the new snapshot-based workflow for error/warning expectations (run yarn jest -u instead of writing errors.js/warnings.js).

Use of AI

Claude Code was used to draft the implementation, perform the bulk migration, and scan for issues (path leaks, false positive snapshots) under human review.

@changeset-bot

changeset-bot Bot commented May 15, 2026

Copy link
Copy Markdown

⚠️ No Changeset found

Latest commit: c0ff11b

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

@linux-foundation-easycla

linux-foundation-easycla Bot commented May 15, 2026

Copy link
Copy Markdown

CLA Signed
The committers listed above are authorized under a signed CLA.

@github-actions

github-actions Bot commented May 15, 2026

Copy link
Copy Markdown
Contributor

This PR is packaged and the instant preview is available (dba0399).

Install it locally:

  • npm
npm i -D webpack@https://pkg.pr.new/webpack@dba0399
  • yarn
yarn add -D webpack@https://pkg.pr.new/webpack@dba0399
  • pnpm
pnpm add -D webpack@https://pkg.pr.new/webpack@dba0399

@codecov

codecov Bot commented May 15, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 90.90%. Comparing base (526d638) to head (c0ff11b).
⚠️ Report is 1 commits behind head on main.

❌ Your changes status has failed because you have indirect coverage changes. Learn more about Unexpected Coverage Changes and reasons for indirect coverage changes.

Additional details and impacted files
@@            Coverage Diff             @@
##             main   #20966      +/-   ##
==========================================
- Coverage   90.92%   90.90%   -0.02%     
==========================================
  Files         573      573              
  Lines       58610    58610              
  Branches    15762    15762              
==========================================
- Hits        53290    53281       -9     
- Misses       5320     5329       +9     
Flag Coverage Δ
integration 89.60% <ø> (-0.02%) ⬇️
test262 45.39% <ø> (-0.04%) ⬇️
unit 36.56% <ø> (ø)

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@xiaoxiaojx xiaoxiaojx force-pushed the refactor/errors-warnings-to-snapshots branch from fe8c3a6 to e68efe3 Compare May 15, 2026 17:40

@alexander-akait alexander-akait left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What about to name files - warnings.snap instead normal.snap?

@alexander-akait

Copy link
Copy Markdown
Member

Same for errors.snap

@xiaoxiaojx xiaoxiaojx force-pushed the refactor/errors-warnings-to-snapshots branch from e68efe3 to d8fd646 Compare May 15, 2026 17:56
@codspeed-hq

codspeed-hq Bot commented May 15, 2026

Copy link
Copy Markdown

Merging this PR will improve performance by 43.63%

⚡ 10 improved benchmarks
❌ 5 regressed benchmarks
✅ 129 untouched benchmarks
⏩ 72 skipped benchmarks1

Warning

Please fix the performance issues or acknowledge them on CodSpeed.

Performance Changes

Mode Benchmark BASE HEAD Efficiency
Memory benchmark "many-modules-commonjs", scenario '{"name":"mode-development-rebuild","mode":"development","watch":true}' 200.6 KB 261 KB -23.13%
Memory benchmark "asset-modules-source", scenario '{"name":"mode-development","mode":"development"}' 561.2 KB 3,780.9 KB -85.16%
Memory benchmark "asset-modules-resource", scenario '{"name":"mode-development-rebuild","mode":"development","watch":true}' 354 KB 208.8 KB +69.53%
Memory benchmark "asset-modules-source", scenario '{"name":"mode-development-rebuild","mode":"development","watch":true}' 3,720.4 KB 141.7 KB ×26
Memory benchmark "json-modules", scenario '{"name":"mode-development","mode":"development"}' 518.1 KB 836.1 KB -38.03%
Memory benchmark "concatenate-modules", scenario '{"name":"mode-development","mode":"development"}' 780.1 KB 1,107.5 KB -29.56%
Memory benchmark "many-chunks-esm", scenario '{"name":"mode-development-rebuild","mode":"development","watch":true}' 164.6 KB 917.6 KB -82.06%
Memory benchmark "context-esm", scenario '{"name":"mode-development-rebuild","mode":"development","watch":true}' 664.2 KB 151.1 KB ×4.4
Memory benchmark "side-effects-reexport", scenario '{"name":"mode-development","mode":"development"}' 4.9 MB 3.8 MB +27.61%
Memory benchmark "side-effects-reexport", scenario '{"name":"mode-development-rebuild","mode":"development","watch":true}' 859.6 KB 405.8 KB ×2.1
Memory benchmark "cache-filesystem", scenario '{"name":"mode-development-rebuild","mode":"development","watch":true}' 843.3 KB 290.9 KB ×2.9
Memory benchmark "wasm-modules-async", scenario '{"name":"mode-development-rebuild","mode":"development","watch":true}' 1,545.5 KB 401.2 KB ×3.9
Memory benchmark "asset-modules-bytes", scenario '{"name":"mode-development-rebuild","mode":"development","watch":true}' 322.9 KB 132.8 KB ×2.4
Memory benchmark "many-chunks-commonjs", scenario '{"name":"mode-development-rebuild","mode":"development","watch":true}' 358.3 KB 251.8 KB +42.28%
Memory benchmark "concatenate-modules", scenario '{"name":"mode-development-rebuild","mode":"development","watch":true}' 167.2 KB 133.8 KB +25.02%

Tip

Investigate this regression by commenting @codspeedbot fix this regression on this PR, or directly use the CodSpeed MCP with your agent.


Comparing refactor/errors-warnings-to-snapshots (c0ff11b) with main (526d638)

Open in CodSpeed

Footnotes

  1. 72 benchmarks were skipped, so the baseline results were used instead. If they were deleted from the codebase, click here and archive them to remove them from the performance reports.

@xiaoxiaojx

This comment was marked as outdated.

@xiaoxiaojx

xiaoxiaojx commented May 15, 2026

Copy link
Copy Markdown
Member Author

Looks like this failure also exists on the main branch. just wait this PR #20967

FAIL test/ConfigTestCases.basictest.js (94.868 s, 414 MB heap size)
  ● ConfigTestCases › html › style-tag › exported tests › should process inline <style> tags through the CSS pipeline

    expect(received).toBe(expected) // Object.is equality

    Expected: 3
    Received: 1

      38 | 	// three times.
      39 | 	const cssHeaderCount = (page_namespaceObject.match(/css data:text\/css,/g) || []).length;
    > 40 | 	expect(cssHeaderCount).toBe(3);
         | 	                       ^
      41 | });
      42 |
      43 | /******/ })()

@xiaoxiaojx xiaoxiaojx force-pushed the refactor/errors-warnings-to-snapshots branch 3 times, most recently from 96d684e to 150239a Compare May 18, 2026 15:39
@alexander-akait

Copy link
Copy Markdown
Member

Yeah, already fix, conflict in merge

"webpack": patch
---

Migrate hand-written errors.js/warnings.js test expectation files to Jest snapshots. The `checkArrayExpectation` helper now falls back to `toMatchSnapshot()` when no expectation file exists, with path normalization for portable snapshots across environments.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we don't need to mark this as a patch, it is internal change, right?

@xiaoxiaojx xiaoxiaojx marked this pull request as draft May 18, 2026 16:59
@alexander-akait

Copy link
Copy Markdown
Member

@xiaoxiaojx can you rebase again and I think we can merge it, thanks

@xiaoxiaojx xiaoxiaojx force-pushed the refactor/errors-warnings-to-snapshots branch 2 times, most recently from a6cf557 to 2d1910c Compare May 19, 2026 08:52
xiaoxiaojx added 10 commits May 19, 2026 18:28
Replace hand-written regex-based error/warning expectation files with
Jest snapshot matching. checkArrayExpectation now falls back to
toMatchSnapshot() when no .js expectation file exists, with path
normalization (<TEST_DIR>, <WEBPACK_ROOT>, <ANCESTOR>) for portable
snapshots across environments.

- 90 errors.js/warnings.js files deleted across test/cases and
  test/configCases
- 5 complex/function-based expectation files retained
- Per-case snapshot hooks added to TestCases.template.js
- Snapshot resolver updated for new suite mapping
The module resolution order is nondeterministic, so exact snapshot
matching fails across runs. Restore the original loose regex.
@xiaoxiaojx xiaoxiaojx force-pushed the refactor/errors-warnings-to-snapshots branch from 28861d4 to c0ff11b Compare May 19, 2026 10:28
@github-actions

Copy link
Copy Markdown
Contributor

Types Coverage

Coverage after merging refactor/errors-warnings-to-snapshots into main will be
98.95%
Coverage Report
FileStmtsBranchesFuncsLinesUncovered Lines
bin
   webpack.js98.77%100%100%98.77%91
examples
   build-common.js100%100%100%100%
   buildAll.js100%100%100%100%
   examples.js100%100%100%100%
   template-common.js98.21%100%100%98.21%72
examples/custom-javascript-parser
   test.filter.js100%100%100%100%
examples/custom-javascript-parser/internals
   acorn-parse.js100%100%100%100%
   meriyah-parse.js100%100%100%100%
   oxc-parse.js91.30%100%100%91.30%140, 142–143, 145, 147, 153–154, 161, 168, 90
examples/markdown
   webpack.config.mjs100%100%100%100%
examples/typescript
   test.filter.js100%100%100%100%
examples/typescript-non-erasable
   test.filter.js50%100%100%50%5
examples/virtual-modules
   test.filter.js100%100%100%100%
examples/wasm-bindgen-esm
   test.filter.js100%100%100%100%
examples/wasm-complex
   test.filter.js100%100%100%100%
examples/wasm-simple
   test.filter.js100%100%100%100%
examples/wasm-simple-source-phase
   test.filter.js100%100%100%100%
lib
   APIPlugin.js100%100%100%100%
   AsyncDependenciesBlock.js100%100%100%100%
   AutomaticPrefetchPlugin.js100%100%100%100%
   BannerPlugin.js100%100%100%100%
   Cache.js98.21%100%100%98.21%101
   CacheFacade.js100%100%100%100%
   Chunk.js99.72%100%100%99.72%37
   ChunkGraph.js100%100%100%100%
   ChunkGroup.js100%100%100%100%
   ChunkTemplate.js100%100%100%100%
   CleanPlugin.js98.72%100%100%98.72%206, 226, 382
   CodeGenerationResults.js100%100%100%100%
   CompatibilityPlugin.js100%100%100%100%
   Compilation.js98.55%100%100%98.55%1554, 1850, 1857, 1865, 1887, 2783, 3208, 3870, 3899, 3952–3953, 3957, 3962, 3978–3979, 3993–3994, 3999–4000, 4477, 4503, 493, 498, 5211, 5292, 5307, 5332–5333, 5335, 5659, 5664, 5670, 5673, 5685, 5687, 5691, 5707, 5722, 5754, 5808, 5832, 5946, 712–713
   Compiler.js99.55%100%100%99.55%1116–1117, 1125
   ConcatenationScope.js98.59%100%100%98.59%189
   ConditionalInitFragment.js100%100%100%100%
   ConstPlugin.js100%100%100%100%
   ContextExclusionPlugin.js100%100%100%100%
   ContextModule.js100%100%100%100%
   ContextModuleFactory.js97.75%100%100%97.75%258, 393, 418, 443, 447, 458
   ContextReplacementPlugin.js100%100%100%100%
   DefinePlugin.js98.92%100%100%98.92%158–159, 175, 194, 268
   DependenciesBlock.js100%100%100%100%
   Dependency.js98.20%100%100%98.20%379, 425
   DependencyTemplate.js100%100%100%100%
   DependencyTemplates.js100%100%100%100%
   DotenvPlugin.js97.88%100%100%97.88%237, 378, 391–392
   DynamicEntryPlugin.js100%100%100%100%
   EntryOptionPlugin.js100%100%100%100%
   EntryPlugin.js100%100%100%100%
   Entrypoint.js100%100%100%100%
   EnvironmentPlugin.js97.14%100%100%97.14%49
   ErrorHelpers.js100%100%100%100%
   EvalDevToolModulePlugin.js100%100%100%100%
   EvalSourceMapDevToolPlugin.js100%100%100%100%
   ExportsInfo.js100%100%100%100%
   ExportsInfoApiPlugin.js100%100%100%100%
   ExternalModule.js98.96%100%100%98.96%424–428, 576
   ExternalModuleFactoryPlugin.js100%100%100%100%
   ExternalsPlugin.js100%100%100%100%
   FileSystemInfo.js99.50%100%100%99.50%182, 2252–2253, 2256, 2267, 2278, 2289, 278, 3694, 3709, 3733
   FlagAllModulesAsUsedPlugin.js100%100%100%100%
   FlagDependencyExportsPlugin.js98.74%100%100%98.74%399, 401, 405
   FlagDependencyUsagePlugin.js100%100%100%100%
   FlagEntryExportAsUsedPlugin.js100%100%100%100%
   Generator.js100%100%100%100%
   HotModuleReplacementPlugin.js100%100%100%100%
   HotUpdateChunk.js100%100%100%100%
   IgnorePlugin.js100%100%100%100%
   IgnoreWarningsPlugin.js100%100%100%100%
   InitFragment.js100%100%100%100%
   JavascriptMetaInfoPlugin.js100%100%100%100%
   LibraryTemplatePlugin.js100%100%100%100%
   LoaderOptionsPlugin.js100%100%100%100%
   LoaderTargetPlugin.js100%100%100%100%
   MainTemplate.js100%100%100%100%
   ManifestPlugin.js100%100%100%100%
   Module.js98.50%100%100%98.50%1305, 1310, 1371, 1385, 1447, 1456
   ModuleFactory.js100%100%100%100%
   ModuleFilenameHelpers.js98.85%100%100%98.85%106, 108
   ModuleGraph.js99.73%100%100%99.73%1004
   ModuleGraphConnection.js100%100%100%100%
   ModuleInfoHeaderPlugin.js100%100%100%100%
   ModuleProfile.js100%100%100%100%
   ModuleSourceTypeConstants.js100%100%100%100%
   ModuleTemplate.js100%100%100%100%
   ModuleTypeConstants.js100%100%100%100%
   MultiCompiler.js99.69%100%100%99.69%645
   MultiStats.js100%100%100%100%
   MultiWatching.js100%100%100%100%
   NoEmitOnErrorsPlugin.js100%100%100%100%
   NodeStuffPlugin.js100%100%100%100%
   NormalModule.js97.78%100%100%97.78%1020, 1036, 1123, 1774, 1779–1789, 708, 711, 728, 745, 986
   NormalModuleFactory.js99.47%100%100%99.47%1074, 1383, 473, 485
   NormalModuleReplacementPlugin.js100%100%100%100%
   NullFactory.js100%100%100%100%
   OptimizationStages.js100%100%100%100%
   OptionsApply.js100%100%100%100%
   Parser.js100%100%100%100%
   PlatformPlugin.js100%100%100%100%
   PrefetchPlugin.js100%100%100%100%
   ProgressPlugin.js98.85%100%100%98.85%519–520, 525, 527, 591
   ProvidePlugin.js100%100%100%100%
   RawModule.js100%100%100%100%
   RecordIdsPlugin.js100%100%100%100%
   RequestShortener.js100%100%100%100%
   ResolverFactory.js100%100%100%100%
   RuntimeGlobals.js100%100%100%100%
   RuntimeModule.js100%100%100%100%
   RuntimePlugin.js100%100%100%100%
   RuntimeTemplate.js100%100%100%100%
   SelfModuleFactory.js100%100%100%100%
   SingleEntryPlugin.js100%100%100%100%
   SourceMapDevToolModuleOptionsPlugin.js100%100%100%100%
   SourceMapDevToolPlugin.js99.16%100%100%99.16%267–268, 610
   Stats.js100%100%100%100%
   Template.js100%100%100%100%
   TemplatedPathPlugin.js98.86%100%100%98.86%134–135
   UseStrictPlugin.js100%100%100%100%
   WarnCaseSensitiveModulesPlugin.js100%100%100%100%
   WarnDeprecatedOptionPlugin.js100%100%100%100%
   WarnNoModeSetPlugin.js100%100%100%100%
   WatchIgnorePlugin.js100%100%100%100%
   Watching.js100%100%100%100%
   WebpackError.js100%100%100%100%
   WebpackIsIncludedPlugin.js100%100%100%100%
   WebpackOptionsApply.js100%100%100%100%
   WebpackOptionsDefaulter.js100%100%100%100%
   buildChunkGraph.js99.87%100%100%99.87%325
   cli.js98.71%100%100%98.71%117, 469, 501, 543, 813
   index.js100%100%100%100%
   validateSchema.js94.67%100%100%94.67%100, 87, 89, 98
   webpack.js97.22%100%100%97.22%196, 218, 220
lib/asset
   AssetBytesGenerator.js100%100%100%100%
   AssetBytesParser.js100%100%100%100%
   AssetGenerator.js100%100%100%100%
   AssetModulesPlugin.js97.77%100%100%97.77%285, 309, 312, 364, 40
   AssetParser.js100%100%100%100%
   AssetSourceGenerator.js100%100%100%100%
   AssetSourceParser.js100%100%100%100%
   RawDataUrlModule.js100%100%100%100%
lib/async-modules
   AsyncModuleHelpers.js100%100%100%100%
   AwaitDependenciesInitFragment.js100%100%100%100%
   InferAsyncModulesPlugin.js100%100%100%100%
lib/cache
   AddBuildDependenciesPlugin.js100%100%100%100%
   AddManagedPathsPlugin.js100%100%100%100%
   IdleFileCachePlugin.js97.92%100%100%97.92%71, 83, 91
   MemoryCachePlugin.js95.83%100%100%95.83%33
   MemoryWithGcCachePlugin.js93.15%100%100%93.15%106, 113–114, 122, 89
   PackFileCacheStrategy.js96.40%100%100%96.40%1250, 1350, 1354, 1416, 628, 647, 657–659, 661, 677–678, 683, 686, 688, 693, 698, 722, 728, 762, 768, 774, 779, 790, 799, 804–805, 807, 824, 830–831, 833
   ResolverCachePlugin.js100%100%100%100%
   getLazyHashedEtag.js100%100%100%100%
   mergeEtags.js100%100%100%100%
lib/config
   browserslistTargetHandler.js100%100%100%100%
   defaults.js99.18%100%100%99.18%1401–1403, 1411, 271, 274, 279, 283, 475
   normalization.js99%100%100%99%191–192, 258, 273
   target.js100%100%100%100%
lib/container
   ContainerEntryDependency.js100%100%100%100%
   ContainerEntryModule.js100%100%100%100%
   ContainerEntryModuleFactory.js100%100%100%100%
   ContainerExposedDependency.js100%100%100%100%
   ContainerPlugin.js100%100%100%100%
   ContainerReferencePlugin.js100%100%100%100%
   FallbackDependency.js100%100%100%100%
   FallbackItemDependency.js100%100%100%100%
   FallbackModule.js100%100%100%100%
   FallbackModuleFactory.js100%100%100%100%
   HoistContainerReferencesPlugin.js100%100%100%100%
   ModuleFederationPlugin.js100%100%100%100%
   RemoteModule.js100%100%100%100%
   

@xiaoxiaojx xiaoxiaojx marked this pull request as ready for review May 19, 2026 11:23
@xiaoxiaojx

Copy link
Copy Markdown
Member Author

ci failed due to: webpack/enhanced-resolve#587

@alexander-akait

Copy link
Copy Markdown
Member

@xiaoxiaojx yeah, already released

@alexander-akait

Copy link
Copy Markdown
Member

thanks for fix

@alexander-akait alexander-akait merged commit dba0399 into main May 19, 2026
143 of 147 checks passed
@alexander-akait alexander-akait deleted the refactor/errors-warnings-to-snapshots branch May 19, 2026 12:42
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.

2 participants