diff --git a/.github/workflows/run-tests.yml b/.github/workflows/run-tests.yml index c28e077dc7ba..9176a6c1ac7e 100644 --- a/.github/workflows/run-tests.yml +++ b/.github/workflows/run-tests.yml @@ -73,7 +73,7 @@ jobs: use-yarn-hydrate: true - name: test:integration:coverage - run: yarn test:integration:coverage --silent + run: yarn test:integration:coverage - name: Rename coverage run: mv coverage/integration/coverage-final.json coverage/integration/coverage-integration.json diff --git a/jest.config.js b/jest.config.js index e71c6cecfcf6..6efc95439591 100644 --- a/jest.config.js +++ b/jest.config.js @@ -22,6 +22,14 @@ module.exports = { // Jest doesn't support Prettier 3 yet, so we use Prettier 2 prettierPath: require.resolve('prettier-2'), reporters: [ + // Console baseline reporter MUST be first to capture raw console messages + // before jest-clean-console-reporter processes them + [ + '/test/jest/console-baseline-reporter.js', + { + testType: 'unit', + }, + ], [ 'jest-clean-console-reporter', { @@ -66,4 +74,7 @@ module.exports = { customExportConditions: ['node', 'node-addons'], }, workerIdleMemoryLimit: '500MB', + // Ensure console output is buffered (not streamed) so reporters can access testResult.console + // Without this, Jest uses verbose mode for single-file runs which bypasses buffering + verbose: false, }; diff --git a/jest.integration.config.js b/jest.integration.config.js index b8ac80cd1b92..de722083ab27 100644 --- a/jest.integration.config.js +++ b/jest.integration.config.js @@ -20,6 +20,14 @@ module.exports = { // Jest doesn't support Prettier 3 yet, so we use Prettier 2 prettierPath: require.resolve('prettier-2'), reporters: [ + // Console baseline reporter MUST be first to capture raw console messages + // before jest-clean-console-reporter processes them + [ + '/test/jest/console-baseline-reporter.js', + { + testType: 'integration', + }, + ], [ 'jest-clean-console-reporter', { @@ -63,4 +71,7 @@ module.exports = { 'jest-preview/transforms/file', }, transformIgnorePatterns: ['/node_modules/'], + // Ensure console output is buffered (not streamed) so reporters can access testResult.console + // Without this, Jest uses verbose mode for single-file runs which bypasses buffering + verbose: false, }; diff --git a/package.json b/package.json index ec469c3f97ca..ddc92c5da004 100644 --- a/package.json +++ b/package.json @@ -45,12 +45,14 @@ "forwarder": "node ./development/static-server.js ./node_modules/@metamask/forwarder/dist/ --port 9010", "dapp-forwarder": "concurrently -k -n forwarder,dapp -p '[{time}][{name}]' 'yarn forwarder' 'yarn dapp'", "test:unit": "jest", + "test:unit:update-baseline": "UPDATE_BASELINE=true yarn test:unit", "anvil": "node_modules/.bin/anvil", "test:unit:watch": "jest --watch", "test:unit:coverage": "jest --coverage", "test:unit:webpack": "tsx --test development/webpack/test/*.test.ts", "test:unit:webpack:coverage": "nyc --reporter=html --reporter=json --reporter=text --report-dir=./coverage/webpack tsx --test development/webpack/test/*.test.ts", "test:integration": "yarn webpack-cli build --config ./development/webpack/webpack.integration.tests.config.ts && jest --config jest.integration.config.js", + "test:integration:update-baseline": "UPDATE_BASELINE=true yarn test:integration", "test:integration:coverage": "yarn test:integration --coverage", "test:e2e:chrome": "SELENIUM_BROWSER=chrome tsx test/e2e/run-all.ts", "test:e2e:chrome:dist": "SELENIUM_BROWSER=chrome tsx test/e2e/run-all.ts --dist", diff --git a/test/jest/CONSOLE-BASELINE-TEST.md b/test/jest/CONSOLE-BASELINE-TEST.md new file mode 100644 index 000000000000..0ce73c895241 --- /dev/null +++ b/test/jest/CONSOLE-BASELINE-TEST.md @@ -0,0 +1,196 @@ +# Console Baseline Reporter - Manual Testing Steps + +## Prerequisites + +- Node.js v24+ +- Run `yarn install` + +--- + +## Test 1: Unit Test Warning Detection + +### 1. Add a test warning to a unit test + +Add this code to `app/scripts/controllers/permissions/background-api.test.js` at the top of the first `describe` block: + +```javascript +describe('permission background API methods', () => { + beforeEach(() => { + // Test warning to verify baseline system + console.warn( + 'REVIEWER_TEST: This warning should be detected by the baseline system', + ); + }); + + // ... rest of the tests +}); +``` + +### 2. Run the unit test - should FAIL with the new warning + +```bash +yarn test:unit app/scripts/controllers/permissions/background-api.test.js +``` + +**Expected output:** + +``` +PASS app/scripts/controllers/permissions/background-api.test.js + +Test Suites: 1 passed, 1 total +Tests: 45 passed, 45 total +... + +❌ BASELINE VIOLATIONS DETECTED + + 📁 app/scripts/controllers/permissions/background-api.test.js + 🆕 NEW: warn: REVIEWER_TEST: This warning should + Current: 45 occurrences + + 💡 Next steps: + 1. Fix the warnings in your code, OR + 2. Update baseline: yarn test:unit:update-baseline (requires justification) +``` + +**Note:** Jest shows "Test Suites: 1 passed" but the command **fails** (exit code 1) due to the baseline violation. + +### 3. Add the warning to the baseline + +```bash +yarn test:unit:update-baseline app/scripts/controllers/permissions/background-api.test.js +``` + +**Expected output:** + +``` +PASS app/scripts/controllers/permissions/background-api.test.js + +✅ Baseline updated: 1 file(s) updated, 495 total in baseline + Written to: /path/to/test/jest/console-baseline-unit.json +``` + +### 4. Re-run the test - should PASS + +```bash +yarn test:unit app/scripts/controllers/permissions/background-api.test.js +``` + +**Expected output:** + +``` +PASS app/scripts/controllers/permissions/background-api.test.js + +✅ Console baseline matches exactly! +``` + +✅ **System verified!** The warning is now in the baseline and the test passes. + +### 5. Clean up + +Remove the test warning from `app/scripts/controllers/permissions/background-api.test.js`: + +```javascript +describe('permission background API methods', () => { + // DELETE the beforeEach block with the REVIEWER_TEST warning + // ... rest of the tests +}); +``` + +Then update the baseline to remove it: + +```bash +yarn test:unit:update-baseline app/scripts/controllers/permissions/background-api.test.js +``` + +Verify tests still pass: + +```bash +yarn test:unit app/scripts/controllers/permissions/background-api.test.js +``` + +--- + +## Test 2: Integration Test Warning Detection + +### 1. Add a test warning to an integration test + +Add this code to `test/integration/confirmations/signatures/permit.test.tsx` at the top of the first `describe` block: + +```typescript +describe('Permit Confirmation', () => { + beforeEach(() => { + // Test warning to verify baseline system + console.warn( + 'REVIEWER_TEST: This warning should be detected by the baseline system', + ); + }); + + // ... rest of the tests +}); +``` + +### 2. Run the integration test - should FAIL with the new warning + +```bash +yarn test:integration test/integration/confirmations/signatures/permit.test.tsx +``` + +**Expected output:** + +``` +PASS test/integration/confirmations/signatures/permit.test.tsx +... + +❌ BASELINE VIOLATIONS DETECTED + + 📁 test/integration/confirmations/signatures/permit.test.tsx + 🆕 NEW: warn: REVIEWER_TEST: This warning should + Current: X occurrences + + 💡 Next steps: + 1. Fix the warnings in your code, OR + 2. Update baseline: yarn test:integration:update-baseline (requires justification) +``` + +### 3. Add the warning to the baseline + +```bash +yarn test:integration:update-baseline test/integration/confirmations/signatures/permit.test.tsx +``` + +### 4. Re-run the test - should PASS + +```bash +yarn test:integration test/integration/confirmations/signatures/permit.test.tsx +``` + +**Expected output:** + +``` +✅ Console baseline matches exactly! +``` + +✅ **System verified!** + +### 5. Clean up + +Remove the test warning from `test/integration/confirmations/signatures/permit.test.tsx` and update baseline: + +```bash +yarn test:integration:update-baseline test/integration/confirmations/signatures/permit.test.tsx +``` + +--- + +## Summary + +All test types follow the same pattern: + +| Step | Action | Result | +| ---- | --------------- | --------------------- | +| 1 | Add warning | ❌ Test fails | +| 2 | Update baseline | Warning added to JSON | +| 3 | Re-run test | ✅ Test passes | +| 4 | Clean up | Remove test code | + +This demonstrates the baseline system correctly detects, stores, and validates console warnings! diff --git a/test/jest/CONSOLE-BASELINE.md b/test/jest/CONSOLE-BASELINE.md new file mode 100644 index 000000000000..41b47e3d2901 --- /dev/null +++ b/test/jest/CONSOLE-BASELINE.md @@ -0,0 +1,88 @@ +# Console Baseline Enforcement + +Prevents new console warnings/errors from being introduced. Baseline is tracked **per test file**. + +## Quick Reference + +| Command | Description | +| ---------------------------------------------------- | -------------------------------------- | +| `yarn test:unit` | Run tests with baseline enforcement | +| `yarn test:unit:update-baseline` | Update baseline (all files) | +| `yarn test:unit:update-baseline path/to/file` | Update baseline (single file) | +| `yarn test:integration` | Run integration tests with enforcement | +| `yarn test:integration:update-baseline` | Update integration baseline | +| `yarn test:integration:update-baseline path/to/file` | Update baseline (single file) | + +## How It Works + +1. **Run tests** → Reporter compares console output against baseline +2. **Violation detected** → Test fails, shows which file/category increased +3. **Improvement detected** → Shows reduced warnings (doesn't fail) +4. **Update baseline** → Run with `:update-baseline` to accept changes + +## Example Output + +``` +❌ BASELINE VIOLATIONS DETECTED + + 📁 ui/pages/send/send.test.tsx + ⬆️ React: Act warnings + Baseline: 5, Current: 12 (+7) + + 💡 Next steps: + 1. Fix the warnings in your code, OR + 2. Update baseline: yarn test:unit:update-baseline (requires justification) +``` + +## Workflow + +```bash +# 1. Run tests (fails if warnings increased) +yarn test:unit path/to/my-component.test.tsx + +# 2. Fix warnings in code, OR update baseline if justified +yarn test:unit:update-baseline path/to/my-component.test.tsx + +# 3. Commit baseline changes +git add test/jest/console-baseline-*.json +git commit -m "fix: reduce warnings in my-component" +``` + +## Configuration + +In `jest.config.js`: + +```javascript +reporters: [ + [ + '/test/jest/console-baseline-reporter.js', + { + testType: 'unit', // 'unit' or 'integration' + failOnViolation: true, // Fail on increased warnings + showImprovements: true, // Show reduced warnings + }, + ], +]; +``` + +## Baseline Files + +- `test/jest/console-baseline-unit.json` - Unit test baseline +- `test/jest/console-baseline-integration.json` - Integration test baseline + +Structure: + +```json +{ + "files": { + "path/to/test.tsx": { + "React: Act warnings": 5, + "MetaMask: Background connection not initialized": 2 + } + } +} +``` + +## Related Documentation + +- [Manual Testing Guide](./CONSOLE-BASELINE-TEST.md) - Step-by-step verification instructions diff --git a/test/jest/console-baseline-integration.json b/test/jest/console-baseline-integration.json new file mode 100644 index 000000000000..6038cd73b205 --- /dev/null +++ b/test/jest/console-baseline-integration.json @@ -0,0 +1,100 @@ +{ + "files": { + "test/integration/onboarding/wallet-created.test.tsx": { + "Reselect: Identity function warnings": 8, + "Reselect: Input stability warnings": 6, + "React Router: Duplicate navigation warnings": 1 + }, + "test/integration/notifications&auth/notifications-activation.test.tsx": { + "Reselect: Identity function warnings": 11, + "Reselect: Input stability warnings": 9 + }, + "test/integration/confirmations/transactions/set-approval-for-all.test.tsx": { + "Reselect: Identity function warnings": 13, + "Reselect: Input stability warnings": 8 + }, + "test/integration/confirmations/transactions/erc721-approve.test.tsx": { + "Reselect: Identity function warnings": 13, + "Reselect: Input stability warnings": 8, + "React: Act warnings (component updates not wrapped)": 1 + }, + "test/integration/confirmations/transactions/alerts.test.tsx": { + "Reselect: Identity function warnings": 13, + "Reselect: Input stability warnings": 8 + }, + "test/integration/confirmations/transactions/increase-allowance.test.tsx": { + "Reselect: Identity function warnings": 13, + "Reselect: Input stability warnings": 8, + "React: Act warnings (component updates not wrapped)": 1 + }, + "test/integration/confirmations/transactions/erc20-approve.test.tsx": { + "Reselect: Identity function warnings": 13, + "Reselect: Input stability warnings": 8, + "React: Act warnings (component updates not wrapped)": 1 + }, + "test/integration/onboarding/import-wallet.test.tsx": { + "Reselect: Identity function warnings": 8, + "Reselect: Input stability warnings": 6, + "React Router: Duplicate navigation warnings": 1 + }, + "test/integration/confirmations/signatures/personalSign.test.tsx": { + "Reselect: Identity function warnings": 12, + "Reselect: Input stability warnings": 8 + }, + "test/integration/confirmations/signatures/permit.test.tsx": { + "Reselect: Identity function warnings": 13, + "Reselect: Input stability warnings": 8 + }, + "test/integration/notifications&auth/notifications-toggle.test.tsx": { + "Reselect: Identity function warnings": 11, + "Reselect: Input stability warnings": 11, + "React: componentWill* lifecycle deprecations": 1 + }, + "test/integration/notifications&auth/notifications-list.test.tsx": { + "Reselect: Identity function warnings": 11, + "Reselect: Input stability warnings": 8, + "React: State updates on unmounted components": 1 + }, + "test/integration/confirmations/transactions/contract-interaction.test.tsx": { + "Reselect: Identity function warnings": 13, + "Reselect: Input stability warnings": 8 + }, + "test/integration/nfts/nfts.test.tsx": { + "Reselect: Identity function warnings": 11, + "Reselect: Input stability warnings": 8, + "React: DOM nesting violations": 2 + }, + "test/integration/confirmations/transactions/set-approval-for-all-revoke.test.tsx": { + "Reselect: Identity function warnings": 13, + "Reselect: Input stability warnings": 8 + }, + "test/integration/confirmations/transactions/contract-deployment.test.tsx": { + "Reselect: Identity function warnings": 13, + "Reselect: Input stability warnings": 8 + }, + "test/integration/defi/defi-positions.test.tsx": { + "Reselect: Identity function warnings": 12, + "Reselect: Input stability warnings": 8, + "React: DOM nesting violations": 1, + "React: State updates on unmounted components": 1 + }, + "test/integration/confirmations/signatures/permit-batch.test.tsx": { + "Reselect: Identity function warnings": 13, + "Reselect: Input stability warnings": 8 + }, + "test/integration/confirmations/signatures/permit-seaport.test.tsx": { + "Reselect: Identity function warnings": 13, + "Reselect: Input stability warnings": 8 + }, + "test/integration/confirmations/signatures/permit-single.test.tsx": { + "Reselect: Identity function warnings": 13, + "Reselect: Input stability warnings": 8 + }, + "test/integration/confirmations/signatures/permit-tradeOrder.test.tsx": { + "Reselect: Identity function warnings": 13, + "Reselect: Input stability warnings": 8 + } + }, + "generated": "2025-12-05T10:48:29.448Z", + "nodeVersion": "v24.11.1" +} diff --git a/test/jest/console-baseline-reporter.js b/test/jest/console-baseline-reporter.js new file mode 100644 index 000000000000..59a138fbf76e --- /dev/null +++ b/test/jest/console-baseline-reporter.js @@ -0,0 +1,543 @@ +/** + * Unified Jest reporter for console baseline capture and enforcement. + * + * This reporter operates in two modes: + * - **enforce** (default): Compares current warnings against baseline and fails on violations + * - **capture**: Collects console warnings/errors and writes them to a baseline file + * + * The baseline is tracked PER TEST FILE for granular violation detection. + * The baseline file path is automatically determined based on testType: + * - 'unit' -> test/jest/console-baseline-unit.json + * - 'integration' -> test/jest/console-baseline-integration.json + * + * Uses shared categorization rules from console-categorizer.js. + * + * Note: This file is intentionally JavaScript (not TypeScript) because Jest + * reporters and configuration files are traditionally JS. The main jest.config.js + * is also JavaScript. Converting to TypeScript would require additional build + * steps for Jest infrastructure files. + * + * @example Update baseline using dedicated scripts + * ```bash + * yarn test:unit:update-baseline + * yarn test:unit:update-baseline path/to/file + * yarn test:integration:update-baseline + * yarn test:integration:update-baseline path/to/file + * ``` + * @example jest.config.js + * { + * reporters: [ + * ['/test/jest/console-baseline-reporter.js', { + * testType: 'unit', + * }] + * ] + * } + * @module console-baseline-reporter + */ + +const fs = require('fs'); +const path = require('path'); +const { + categorizeUnitTestMessage, + categorizeIntegrationTestMessage, + createFallbackCategory, +} = require('./console-categorizer'); + +class ConsoleBaselineReporter { + /** + * Create a new ConsoleBaselineReporter. + * + * @param {object} globalConfig - Jest global configuration + * @param {object} options - Reporter options + * @param {string} [options.testType] - 'unit' or 'integration' (default: 'unit') + * @param {boolean} [options.failOnViolation] - Fail tests when baseline is violated (default: true) + * @param {boolean} [options.showImprovements] - Show when warnings are reduced (default: true) + */ + constructor(globalConfig, options = {}) { + this._globalConfig = globalConfig; + + // Mode is determined by UPDATE_BASELINE environment variable + // - UPDATE_BASELINE=true → 'capture' (write baseline) + // - Otherwise → 'enforce' (compare against baseline) + const mode = process.env.UPDATE_BASELINE === 'true' ? 'capture' : 'enforce'; + + this._options = { + testType: options.testType || 'unit', + mode, + failOnViolation: options.failOnViolation !== false, + showImprovements: options.showImprovements !== false, + }; + + // Load baseline (needed for both modes - enforce reads it, capture may update it) + this.baseline = this._loadBaseline(); + + // Track warnings per file: { 'path/to/file.test.ts': { 'category': count } } + this.warningsByFile = {}; + + // Track violations and improvements (enforce mode) + this.violations = []; + this.improvements = []; + this.newFiles = []; + + // Store error to return from getLastError() + this._error = null; + } + + // =========================================================================== + // BASELINE FILE OPERATIONS + // =========================================================================== + + /** + * Resolve the baseline path based on test type. + * + * @returns {string} Resolved absolute path to baseline file + */ + _resolveBaselinePath() { + let filename; + if (this._options.testType === 'unit') { + filename = 'console-baseline-unit.json'; + } else if (this._options.testType === 'integration') { + filename = 'console-baseline-integration.json'; + } else { + throw new Error( + `Invalid testType (${this._options.testType}): must be 'unit' or 'integration'`, + ); + } + + return path.resolve(this._globalConfig.rootDir, 'test/jest', filename); + } + + /** + * Load the baseline JSON file. + * + * @returns {object} Baseline object with files property + */ + _loadBaseline() { + const baselinePath = this._resolveBaselinePath(); + + try { + if (!fs.existsSync(baselinePath)) { + if (this._options.mode === 'enforce') { + const updateCmd = `yarn test:${this._options.testType}:update-baseline`; + console.warn( + `\n⚠️ Baseline file not found: ${baselinePath}\n` + + ` Run "${updateCmd}" to create it.\n`, + ); + } + return { files: {} }; + } + + const content = fs.readFileSync(baselinePath, 'utf8'); + return JSON.parse(content); + } catch (error) { + console.error(`\n❌ Failed to load baseline: ${error.message}\n`); + return { files: {} }; + } + } + + /** + * Write the baseline JSON file (capture mode). + * Merges new results with existing baseline - only updates files that ran. + */ + _writeBaseline() { + const baselinePath = this._resolveBaselinePath(); + + // Start with existing baseline files (to preserve files that didn't run) + const existingFiles = this.baseline.files || {}; + + // Merge: update files that ran, keep files that didn't run + const mergedFiles = { ...existingFiles }; + for (const [filePath, warnings] of Object.entries(this.warningsByFile)) { + if (Object.keys(warnings).length > 0) { + // File has warnings - update it + mergedFiles[filePath] = warnings; + } else if (mergedFiles[filePath]) { + // File ran but has no warnings - remove from baseline + delete mergedFiles[filePath]; + } + // Files that didn't run are preserved as-is + } + + const baseline = { + files: mergedFiles, + generated: new Date().toISOString(), + nodeVersion: process.version, + }; + + if (JSON.stringify(mergedFiles) === JSON.stringify(this.baseline.files)) { + console.log(`\n✅ Baseline is up-to-date, no changes needed.\n`); + } else { + // Write JSON with 2-space indentation and trailing newline (matches Prettier) + const jsonString = `${JSON.stringify(baseline, null, 2)}\n`; + fs.writeFileSync(baselinePath, jsonString); + + const filesUpdated = Object.keys(this.warningsByFile).length; + const totalFilesInBaseline = Object.keys(mergedFiles).length; + console.log( + `\n✅ Baseline updated: ${filesUpdated} file(s) updated, ${totalFilesInBaseline} total in baseline`, + ); + console.log(` Written to: ${baselinePath}\n`); + } + } + + // =========================================================================== + // MESSAGE CATEGORIZATION + // =========================================================================== + + /** + * Get relative path from root directory for cleaner display. + * + * @param {string} absolutePath - Absolute file path + * @returns {string} Relative path from project root + */ + _getRelativePath(absolutePath) { + return path.relative(this._globalConfig.rootDir, absolutePath); + } + + /** + * Categorize a console message using shared rules. + * + * @param {string} type - Console message type (log, warn, error, etc.) + * @param {string} text - Console message text + * @returns {string} Category name for this message + */ + _categorizeMessage(type, text) { + let categorizer; + if (this._options.testType === 'unit') { + categorizer = categorizeUnitTestMessage; + } else if (this._options.testType === 'integration') { + categorizer = categorizeIntegrationTestMessage; + } else { + throw new Error( + `Invalid testType (${this._options.testType}): must be 'unit' or 'integration'`, + ); + } + + const category = categorizer(type, text); + + // If category is null (suppressed by rules), use fallback for baseline tracking + if (category === null) { + return createFallbackCategory(type, text); + } + return category; + } + + // =========================================================================== + // JEST REPORTER LIFECYCLE + // =========================================================================== + + /** + * Called once per test FILE (not per test case!) when the file starts. + * + * @param {object} _testInfo - Test information (unused) + */ + onTestStart(_testInfo) { + // No-op - we only need onTestResult for console capture + } + + /** + * Called once per test FILE after it completes. + * testResult.console contains all console messages from that file! + * + * @param {object} _testInfo - Test information (unused) + * @param {object} testResult - Test result containing console messages + */ + onTestResult(_testInfo, testResult) { + const filePath = this._getRelativePath(testResult.testFilePath); + + // Initialize warnings for this file + if (!this.warningsByFile[filePath]) { + this.warningsByFile[filePath] = {}; + } + + // Collect only warnings and errors from this test file + // Note: testResult.console requires verbose: false in jest.config.js + if (testResult.console) { + for (const msg of testResult.console) { + if (msg.type === 'warn' || msg.type === 'error') { + const category = this._categorizeMessage(msg.type, msg.message); + + if (!this.warningsByFile[filePath][category]) { + this.warningsByFile[filePath][category] = 0; + } + this.warningsByFile[filePath][category] += 1; + } + } + } + } + + /** + * Called once after ALL tests complete. + * Handles both capture and enforce modes. + */ + onRunComplete() { + if (this._options.mode === 'capture') { + this._writeBaseline(); + } else if (this._options.mode === 'enforce') { + this._enforceBaseline(); + } else { + throw new Error( + `Invalid mode (${this._options.mode}): must be 'capture' or 'enforce'`, + ); + } + } + + /** + * Jest calls this to check for errors. + * Returns an error if baseline violations were detected. + * + * @returns {Error|null} Error if violations detected, null otherwise + */ + getLastError() { + return this._error; + } + + // =========================================================================== + // ENFORCE MODE: COMPARISON AND REPORTING + // =========================================================================== + + /** + * Enforce baseline - compare current warnings and report violations. + */ + _enforceBaseline() { + // Compare against baseline (per file) + this._compareWithBaseline(); + + // Print results + this._printResults(); + + // Fail if violations found (getLastError() will return this error to Jest) + if (this._options.failOnViolation && this.violations.length > 0) { + this._error = new Error( + `Console baseline violated: ${this.violations.length} violation(s) detected. ` + + 'Fix the warnings or update the baseline.', + ); + } + } + + /** + * Compare current warnings with baseline (per file). + */ + _compareWithBaseline() { + const baselineFiles = this.baseline.files || {}; + + // Check each file that was run + for (const [filePath, currentWarnings] of Object.entries( + this.warningsByFile, + )) { + const baselineForFile = baselineFiles[filePath] || {}; + const isNewFile = !baselineFiles[filePath]; + + // Track if this is a new file (not in baseline) + if (isNewFile && Object.keys(currentWarnings).length > 0) { + this.newFiles.push({ + filePath, + warnings: currentWarnings, + }); + } + + // Check for violations (increased counts or new categories) + for (const [category, currentCount] of Object.entries(currentWarnings)) { + const baselineCount = baselineForFile[category] || 0; + + if (currentCount > baselineCount) { + this.violations.push({ + filePath, + category, + baseline: baselineCount, + current: currentCount, + increase: currentCount - baselineCount, + isNew: baselineCount === 0, + isNewFile, + }); + } else if (currentCount < baselineCount) { + this.improvements.push({ + filePath, + category, + baseline: baselineCount, + current: currentCount, + decrease: baselineCount - currentCount, + }); + } + } + + // Check for categories that disappeared from this file + for (const [category, baselineCount] of Object.entries(baselineForFile)) { + if (!currentWarnings[category]) { + this.improvements.push({ + filePath, + category, + baseline: baselineCount, + current: 0, + decrease: baselineCount, + fixed: true, + }); + } + } + } + } + + /** + * Print comparison results. + */ + _printResults() { + const hasViolations = this.violations.length > 0; + const hasNewFiles = this.newFiles.length > 0; + const hasImprovements = + this._options.showImprovements && this.improvements.length > 0; + const isClean = !hasViolations && !hasImprovements && !hasNewFiles; + + if (isClean) { + console.log('\n✅ Console baseline matches exactly!\n'); + return; + } + + console.log('\n'); + console.log('═'.repeat(80)); + console.log(' Console Baseline Report (Per-File)'); + console.log('═'.repeat(80)); + + if (hasViolations) { + this._printViolations(); + } + + if (hasNewFiles) { + this._printNewFiles(); + } + + if (hasImprovements) { + this._printImprovements(); + } + + this._printSummary(); + + console.log('═'.repeat(80)); + console.log('\n'); + } + + /** + * Print violations section. + */ + _printViolations() { + console.log('\n❌ BASELINE VIOLATIONS DETECTED\n'); + + const violationsByFile = this._groupByFile(this.violations); + + for (const [filePath, fileViolations] of Object.entries(violationsByFile)) { + console.log(` 📁 ${filePath}`); + for (const violation of fileViolations) { + if (violation.isNew) { + console.log(` 🆕 NEW: ${violation.category}`); + console.log(` Current: ${violation.current} occurrences`); + } else { + console.log(` ⬆️ ${violation.category}`); + console.log( + ` Baseline: ${violation.baseline}, Current: ${violation.current} (+${violation.increase})`, + ); + } + } + console.log(''); + } + + const updateCmd = `yarn test:${this._options.testType}:update-baseline`; + console.log(' 💡 Next steps:'); + console.log(' 1. Fix the warnings in your code, OR'); + console.log( + ` 2. Update baseline: ${updateCmd} (requires justification)\n`, + ); + } + + /** + * Print new files section. + */ + _printNewFiles() { + console.log('\n📋 NEW FILES (not in baseline)\n'); + console.log(' The following test files are not in the baseline yet:\n'); + + for (const { filePath, warnings } of this.newFiles) { + const totalWarnings = Object.values(warnings).reduce( + (sum, count) => sum + count, + 0, + ); + console.log(` 📁 ${filePath}`); + console.log(` Total warnings: ${totalWarnings}`); + for (const [category, count] of Object.entries(warnings)) { + console.log(` • ${category}: ${count}`); + } + console.log(''); + } + + const updateCmd = `yarn test:${this._options.testType}:update-baseline`; + console.log(` 💡 Run "${updateCmd}" to add these files to baseline.\n`); + } + + /** + * Print improvements section. + */ + _printImprovements() { + console.log('\n✨ CONSOLE IMPROVEMENTS DETECTED\n'); + console.log(' Great job! The following warnings were reduced:\n'); + + const improvementsByFile = this._groupByFile(this.improvements); + + for (const [filePath, fileImprovements] of Object.entries( + improvementsByFile, + )) { + console.log(` 📁 ${filePath}`); + for (const improvement of fileImprovements) { + if (improvement.fixed) { + console.log(` 🎉 FIXED: ${improvement.category}`); + console.log( + ` All ${improvement.baseline} occurrences eliminated!`, + ); + } else { + console.log(` ⬇️ ${improvement.category}`); + console.log( + ` Baseline: ${improvement.baseline}, Current: ${improvement.current} (-${improvement.decrease})`, + ); + } + } + console.log(''); + } + + const updateCmd = `yarn test:${this._options.testType}:update-baseline`; + console.log(' 💡 Lock in improvements:'); + console.log(` ${updateCmd}\n`); + } + + /** + * Group items by file path. + * + * @param {Array} items - Array of items with filePath property + * @returns {object} Object keyed by filePath + */ + _groupByFile(items) { + const grouped = {}; + for (const item of items) { + if (!grouped[item.filePath]) { + grouped[item.filePath] = []; + } + grouped[item.filePath].push(item); + } + return grouped; + } + + /** + * Print summary statistics. + */ + _printSummary() { + const totalViolations = this.violations.length; + const totalImprovements = this.improvements.length; + const totalNewFiles = this.newFiles.length; + const filesRun = Object.keys(this.warningsByFile).length; + + console.log(' ─'.repeat(39)); + console.log(' SUMMARY'); + console.log(` Files analyzed: ${filesRun}`); + console.log(` Violations: ${totalViolations}`); + console.log(` Improvements: ${totalImprovements}`); + console.log(` New files: ${totalNewFiles}`); + } +} + +module.exports = ConsoleBaselineReporter; diff --git a/test/jest/console-baseline-unit.json b/test/jest/console-baseline-unit.json new file mode 100644 index 000000000000..6e0fa81df780 --- /dev/null +++ b/test/jest/console-baseline-unit.json @@ -0,0 +1,2158 @@ +{ + "files": { + "ui/components/app/assets/account-group-balance/account-group-balance.test.tsx": { + "Reselect: Identity function warnings": 1 + }, + "ui/pages/routes/routes.component.test.js": { + "Reselect: Identity function warnings": 8, + "Reselect: Input stability warnings": 6, + "React: Act warnings (component updates not wrapped)": 24, + "React: PropTypes validation failures": 2, + "MetaMask: Invalid theme warnings": 10, + "MetaMask: Background connection not initialized": 10, + "warn: Could not find asset type": 9, + "MetaMask: Balance not found warnings": 18 + }, + "ui/pages/bridge/prepare/prepare-bridge-page.test.tsx": { + "µWebSockets: Compatibility warnings": 1, + "µWebSockets: Fallback to Node implementation": 1, + "Reselect: Identity function warnings": 3, + "Reselect: Input stability warnings": 1, + "MetaMask: Background connection not initialized": 10, + "error: Warning: A component is changing": 2, + "Test errors: Uncaught TypeErrors": 1 + }, + "ui/pages/confirmations/components/confirm/info/shared/gas-fee-token-modal/gas-fee-token-modal.test.tsx": { + "Reselect: Input stability warnings": 3, + "Reselect: Identity function warnings": 7, + "MetaMask: Background connection not initialized": 126 + }, + "ui/components/multichain/account-details/account-details.test.js": { + "Reselect: Identity function warnings": 1, + "Reselect: Input stability warnings": 1, + "React: DOM nesting violations": 1, + "warn: LavaDome: Initiated with \"unsafeOpenModeShadow\" set": 1, + "warn: LavaDomeDebug(getTextByRoot): Call/include this function for": 1 + }, + "ui/components/multichain/account-list-menu/account-list-menu.test.tsx": { + "Reselect: Identity function warnings": 1, + "Reselect: Input stability warnings": 2, + "MetaMask: Background connection not initialized": 2, + "error: Warning: Encountered two children with": 2 + }, + "ui/pages/confirmations/components/confirm/footer/footer.test.tsx": { + "Reselect: Input stability warnings": 2, + "Reselect: Identity function warnings": 5, + "MetaMask: Background connection not initialized": 2 + }, + "ui/pages/confirmations/confirm/confirm.test.tsx": { + "Reselect: Input stability warnings": 3, + "Reselect: Identity function warnings": 11, + "MetaMask: Background connection not initialized": 387, + "React: Act warnings (component updates not wrapped)": 21 + }, + "ui/pages/confirmations/components/confirm/info/typed-sign-v1/typed-sign-v1.test.tsx": { + "Reselect: Input stability warnings": 2, + "Reselect: Identity function warnings": 5, + "React: Act warnings (component updates not wrapped)": 2 + }, + "ui/pages/onboarding-flow/welcome/welcome.test.js": { + "MetaMask: Invalid theme warnings": 15, + "MetaMask: Background connection not initialized": 14 + }, + "ui/pages/confirmations/components/confirm/ledger-info/ledger-info.test.tsx": { + "Reselect: Input stability warnings": 2, + "Reselect: Identity function warnings": 5 + }, + "ui/pages/remove-snap-account/remove-snap-account.test.tsx": { + "Reselect: Identity function warnings": 1, + "Reselect: Input stability warnings": 1 + }, + "app/scripts/metamask-controller.test.js": { + "µWebSockets: Compatibility warnings": 1, + "µWebSockets: Fallback to Node implementation": 1, + "error: This browser doesn't support cancelAnimationFrame.": 1, + "error: TypeError: Cannot convert undefined or": 2, + "error: Error: invalid address (argument=\"address\", value=\"0x\",": 2, + "MetaMask: Chain processing errors": 2, + "Test errors: Fetch failures": 4, + "ObjectMultiplex: Malformed chunk warnings": 1, + "error: { name: 'controller', data: {": 1, + "MetaMask: MetaMetrics invalid trait types": 2, + "error: Error: invalid address (argument=\"address\", value=\"\",": 1, + "MetaMask: Sentry initialization warnings": 1, + "error: Error: NetworkController state is invalid:": 1 + }, + "ui/components/multichain/network-list-menu/network-list-menu.test.tsx": { + "Reselect: Identity function warnings": 1, + "Reselect: Input stability warnings": 1, + "React: componentWill* lifecycle deprecations": 1, + "React: Act warnings (component updates not wrapped)": 3 + }, + "ui/pages/confirmations/components/edit-gas-fee-popover/edit-gas-item/edit-gas-item.test.js": { + "Reselect: Identity function warnings": 1, + "Reselect: Input stability warnings": 1 + }, + "ui/pages/confirmations/components/confirm/info/shared/confirm-loader/confirm-loader.test.tsx": { + "Reselect: Input stability warnings": 2, + "Reselect: Identity function warnings": 5 + }, + "ui/pages/confirmations/hooks/alerts/signatures/useDomainMismatchAlerts.test.ts": { + "Reselect: Input stability warnings": 2, + "Reselect: Identity function warnings": 5 + }, + "ui/components/multichain/connected-accounts-menu/connected-accounts-menu.test.tsx": { + "React: Act warnings (component updates not wrapped)": 5 + }, + "ui/pages/confirmations/hooks/useConfirmationAlerts.test.ts": { + "Reselect: Input stability warnings": 3, + "Reselect: Identity function warnings": 10, + "MetaMask: Background connection not initialized": 3, + "React: Act warnings (component updates not wrapped)": 12 + }, + "ui/pages/confirmations/components/confirm/info/approve/approve.test.tsx": { + "Reselect: Input stability warnings": 3, + "Reselect: Identity function warnings": 8, + "MetaMask: Background connection not initialized": 77, + "React: Act warnings (component updates not wrapped)": 25 + }, + "app/scripts/controllers/swaps/swaps.test.ts": { + "µWebSockets: Compatibility warnings": 1, + "µWebSockets: Fallback to Node implementation": 1 + }, + "ui/pages/confirmations/hooks/send/useMaxAmount.test.ts": { + "MetaMask: Background connection not initialized": 3, + "React: Act warnings (component updates not wrapped)": 5 + }, + "ui/pages/confirmations/confirmation/templates/error.test.js": { + "Reselect: Identity function warnings": 7, + "Reselect: Input stability warnings": 2 + }, + "ui/pages/confirmations/components/confirm/snaps/snaps-section/snaps-section.test.tsx": { + "Reselect: Input stability warnings": 2, + "Reselect: Identity function warnings": 7, + "React: Missing key props in lists": 1 + }, + "ui/components/app/assets/asset-list/asset-list-control-bar/asset-list-control-bar.test.tsx": { + "MetaMask: Background connection not initialized": 9 + }, + "ui/components/multichain/account-overview/account-overview-non-evm.test.tsx": { + "Reselect: Identity function warnings": 3, + "Reselect: Input stability warnings": 1 + }, + "ui/pages/confirmations/components/confirm/info/shield-subscription-approve/shield-subscription-approve.test.tsx": { + "Reselect: Input stability warnings": 3, + "Reselect: Identity function warnings": 8, + "MetaMask: Background connection not initialized": 84, + "React: Act warnings (component updates not wrapped)": 26 + }, + "ui/pages/confirmations/components/modals/simulation-settings-modal/simulation-settings-modal.test.tsx": { + "Reselect: Input stability warnings": 2, + "Reselect: Identity function warnings": 5, + "React: componentWill* lifecycle deprecations": 1 + }, + "ui/pages/confirmations/hooks/alerts/transactions/useFirstTimeInteractionAlert.test.ts": { + "Reselect: Input stability warnings": 3, + "Reselect: Identity function warnings": 6 + }, + "ui/pages/confirmations/components/advanced-gas-fee-popover/advanced-gas-fee-popover.test.js": { + "Reselect: Identity function warnings": 1, + "Reselect: Input stability warnings": 1 + }, + "ui/pages/confirmations/components/confirm/info/personal-sign/siwe-sign/siwe-sign.test.tsx": { + "Reselect: Input stability warnings": 3, + "Reselect: Identity function warnings": 7, + "MetaMask: Background connection not initialized": 4, + "React: Act warnings (component updates not wrapped)": 4 + }, + "ui/pages/confirmations/components/confirm/info/typed-sign/typed-sign.test.tsx": { + "Reselect: Input stability warnings": 3, + "Reselect: Identity function warnings": 7, + "React: Act warnings (component updates not wrapped)": 143 + }, + "ui/pages/multichain-accounts/multichain-account-private-key-list-page/multichain-account-private-key-list-page.test.tsx": { + "React: Missing key props in lists": 1, + "Reselect: Identity function warnings": 2, + "Reselect: Input stability warnings": 1 + }, + "ui/pages/settings/contact-list-tab/add-contact/add-contact.test.js": { + "React: PropTypes validation failures": 1, + "React: State updates on unmounted components": 1 + }, + "ui/pages/shield-plan/shield-payment-modal.test.tsx": { + "Reselect: Identity function warnings": 2, + "Reselect: Input stability warnings": 1, + "React: Act warnings (component updates not wrapped)": 6 + }, + "ui/pages/confirmations/components/confirm/info/typed-sign/typed-sign-permission/erc20-token-periodic-details.test.tsx": { + "Reselect: Input stability warnings": 3, + "Reselect: Identity function warnings": 7, + "MetaMask: Background connection not initialized": 14, + "React: Act warnings (component updates not wrapped)": 15, + "Test errors: Uncaught Errors": 1 + }, + "ui/pages/settings/networks-tab/networks-form/networks-form.test.js": { + "MetaMask: Chain fetch failures": 8, + "React: State updates on unmounted components": 1, + "React: Act warnings (component updates not wrapped)": 1, + "MetaMask: Background connection not initialized": 6 + }, + "ui/pages/confirmations/hooks/transactions/useTransactionConfirm.test.ts": { + "Reselect: Input stability warnings": 3, + "Reselect: Identity function warnings": 6, + "MetaMask: Background connection not initialized": 96 + }, + "ui/pages/confirmations/components/confirm/info/typed-sign/typed-sign-permission/erc20-token-stream-details.test.tsx": { + "Reselect: Input stability warnings": 3, + "Reselect: Identity function warnings": 7, + "MetaMask: Background connection not initialized": 60, + "Test errors: Uncaught Errors": 1 + }, + "ui/pages/shield-plan/shield-plan.test.tsx": { + "Reselect: Identity function warnings": 2, + "Reselect: Input stability warnings": 1, + "React: Act warnings (component updates not wrapped)": 5 + }, + "ui/components/app/modals/confirm-delete-network/confirm-delete-network.test.js": { + "React: PropTypes validation failures": 1 + }, + "ui/pages/confirmations/components/confirm/header/header-info.test.tsx": { + "Reselect: Input stability warnings": 3, + "Reselect: Identity function warnings": 6 + }, + "ui/components/multichain/app-header/app-header.test.js": { + "Reselect: Identity function warnings": 4, + "Reselect: Input stability warnings": 5, + "React: Act warnings (component updates not wrapped)": 16, + "error: Warning: Function components cannot be": 1, + "error: Error: Not implemented: window.open": 2 + }, + "ui/components/multichain/asset-picker-amount/asset-picker-modal/asset-picker-modal-network.test.tsx": { + "Reselect: Identity function warnings": 2, + "Reselect: Input stability warnings": 1 + }, + "ui/pages/confirmations/components/confirm/info/shared/transaction-data/transaction-data.test.tsx": { + "Reselect: Input stability warnings": 3, + "Reselect: Identity function warnings": 7, + "React: Act warnings (component updates not wrapped)": 12, + "React: Act usage warnings (incorrect await)": 9, + "React: Missing key props in lists": 1 + }, + "ui/pages/confirmations/components/confirm/info/shared/selected-gas-fee-token/selected-gas-fee-token.test.tsx": { + "Reselect: Input stability warnings": 3, + "Reselect: Identity function warnings": 7, + "MetaMask: Background connection not initialized": 66 + }, + "ui/pages/confirmations/components/confirm/info/typed-sign/typed-sign-permission.test.tsx": { + "Reselect: Input stability warnings": 3, + "Reselect: Identity function warnings": 7, + "Test errors: Uncaught Errors": 6, + "MetaMask: Background connection not initialized": 38, + "React: Act warnings (component updates not wrapped)": 38 + }, + "ui/hooks/useDisplayName.test.ts": { + "error: Unexpected key \"DNS\" found in": 1, + "Reselect: Identity function warnings": 2, + "Reselect: Input stability warnings": 1 + }, + "ui/pages/confirmations/components/confirm/info/hooks/useTokenTransactionData.test.ts": { + "Reselect: Input stability warnings": 2, + "Reselect: Identity function warnings": 5 + }, + "ui/components/app/wallet-overview/eth-overview.test.js": { + "Reselect: Identity function warnings": 3, + "Reselect: Input stability warnings": 1, + "React: Act warnings (component updates not wrapped)": 2 + }, + "ui/components/app/assets/asset-list/asset-list.ramps-card.test.js": { + "Reselect: Identity function warnings": 1, + "Reselect: Input stability warnings": 1, + "MetaMask: Background connection not initialized": 2 + }, + "ui/components/multichain/pages/permissions-page/permissions-page.test.js": { + "Reselect: Identity function warnings": 1, + "Reselect: Input stability warnings": 1 + }, + "ui/pages/settings/settings.test.js": { + "Reselect: Identity function warnings": 1, + "Reselect: Input stability warnings": 1, + "React: PropTypes validation failures": 2, + "React: componentWill* lifecycle deprecations": 1, + "React: Act warnings (component updates not wrapped)": 2 + }, + "ui/components/app/srp-input/srp-input.test.js": { + "React: PropTypes validation failures": 1 + }, + "ui/components/app/transaction-list-item/transaction-list-item.component.unified-swap-bridge.test.tsx": { + "Reselect: Identity function warnings": 2, + "Reselect: Input stability warnings": 1, + "error: Error: Insufficient number of substitutions": 1 + }, + "ui/pages/confirmations/hooks/send/useSendNfts.test.ts": { + "React: Act warnings (component updates not wrapped)": 2 + }, + "ui/pages/confirmations/components/confirm/dapp-swap-comparison-banner/dapp-swap-comparison-banner.test.tsx": { + "Reselect: Input stability warnings": 2, + "Reselect: Identity function warnings": 5 + }, + "ui/pages/confirmations/components/confirm/header/dapp-initiated-header.test.tsx": { + "Reselect: Input stability warnings": 2, + "Reselect: Identity function warnings": 5 + }, + "app/scripts/metamask-controller.actions.test.js": { + "error: This browser doesn't support cancelAnimationFrame.": 1, + "µWebSockets: Compatibility warnings": 1, + "µWebSockets: Fallback to Node implementation": 1, + "MetaMask: Chain processing errors": 2, + "Test errors: Fetch failures": 4 + }, + "ui/components/multichain/pages/gator-permissions/components/review-gator-permission-item.test.tsx": { + "Reselect: Identity function warnings": 1, + "MetaMask: Token metadata warnings": 2 + }, + "ui/pages/multichain-accounts/multichain-account-details-page/multichain-account-details-page.test.tsx": { + "Reselect: Identity function warnings": 2, + "Reselect: Input stability warnings": 1 + }, + "ui/pages/confirmations/components/confirm/info/shared/send-heading/send-heading.test.tsx": { + "Reselect: Input stability warnings": 2, + "Reselect: Identity function warnings": 6, + "React: Act warnings (component updates not wrapped)": 1 + }, + "ui/pages/confirmations/hooks/alerts/transactions/useBurnAddressAlert.test.ts": { + "Reselect: Input stability warnings": 2, + "Reselect: Identity function warnings": 5 + }, + "ui/pages/confirmations/components/confirm/splash/splash.test.tsx": { + "Reselect: Input stability warnings": 3, + "Reselect: Identity function warnings": 6, + "React: DOM nesting violations": 1 + }, + "ui/pages/confirmations/hooks/useConfirmationNetworkInfo.test.ts": { + "Reselect: Input stability warnings": 2, + "Reselect: Identity function warnings": 5 + }, + "ui/pages/onboarding-flow/recovery-phrase/confirm-recovery-phrase.test.js": { + "React: Missing key props in lists": 1 + }, + "ui/pages/swaps/loading-swaps-quotes/loading-swaps-quotes.test.js": { + "Reselect: Identity function warnings": 1 + }, + "ui/pages/confirmations/components/confirm/info/batch/batch-simulation-details/batch-simulation-details.test.tsx": { + "Reselect: Input stability warnings": 3, + "Reselect: Identity function warnings": 7, + "MetaMask: Background connection not initialized": 54, + "React: Act warnings (component updates not wrapped)": 29 + }, + "ui/pages/confirmations/components/confirm/header/wallet-initiated-header.test.tsx": { + "Reselect: Input stability warnings": 2, + "Reselect: Identity function warnings": 5 + }, + "ui/pages/confirmations/components/confirm/footer/shield-footer-coverage-indicator/shield-footer-coverage-indicator.test.tsx": { + "Reselect: Input stability warnings": 2, + "Reselect: Identity function warnings": 5 + }, + "ui/pages/confirmations/components/confirm/info/shared/edit-gas-fees-row/edit-gas-fees-row.test.tsx": { + "Reselect: Input stability warnings": 3, + "Reselect: Identity function warnings": 8, + "MetaMask: Background connection not initialized": 168, + "React: Act warnings (component updates not wrapped)": 36 + }, + "ui/hooks/identity/useAuthentication/useSignIn.test.tsx": { + "MetaMask: Background connection not initialized": 1 + }, + "ui/components/app/modals/hide-token-confirmation-modal/hide-token-confirmation-modal.test.js": { + "Reselect: Identity function warnings": 1 + }, + "ui/hooks/identity/useAuthentication/useAutoSignOut.test.tsx": { + "MetaMask: Background connection not initialized": 2 + }, + "ui/pages/confirmations/components/confirm/nav/nav.test.tsx": { + "Reselect: Input stability warnings": 2, + "Reselect: Identity function warnings": 5 + }, + "ui/pages/confirmations/hooks/alerts/transactions/useNonContractAddressAlerts.test.ts": { + "Reselect: Input stability warnings": 2, + "Reselect: Identity function warnings": 3 + }, + "ui/pages/confirmations/components/confirm/info/nft-token-transfer/nft-token-transfer.test.tsx": { + "Reselect: Input stability warnings": 3, + "Reselect: Identity function warnings": 8, + "MetaMask: Background connection not initialized": 78, + "React: Act warnings (component updates not wrapped)": 25 + }, + "ui/pages/confirmations/components/confirm/info/shared/nft-send-heading/nft-send-heading.test.tsx": { + "Reselect: Input stability warnings": 2, + "Reselect: Identity function warnings": 5, + "MetaMask: Background connection not initialized": 1, + "React: Act warnings (component updates not wrapped)": 1 + }, + "ui/pages/settings/contact-list-tab/edit-contact/edit-contact.container.test.tsx": { + "Reselect: Identity function warnings": 1, + "Reselect: Input stability warnings": 1, + "React: PropTypes validation failures": 2 + }, + "ui/components/app/user-preferenced-token-input/user-preferenced-token-input.test.js": { + "MetaMask: Background connection not initialized": 1 + }, + "ui/pages/confirmations/components/edit-gas-fee-popover/edit-gas-fee-popover.test.js": { + "Reselect: Identity function warnings": 1, + "Reselect: Input stability warnings": 1 + }, + "ui/pages/defi/components/defi-details-list.test.tsx": { + "Reselect: Identity function warnings": 2 + }, + "ui/pages/confirmations/components/confirm/info/hooks/useBatchApproveBalanceChanges.test.ts": { + "Reselect: Input stability warnings": 2, + "Reselect: Identity function warnings": 5 + }, + "ui/components/app/wallet-overview/hooks/useHandleSendNonEvm.test.ts": { + "Reselect: Identity function warnings": 2, + "Reselect: Input stability warnings": 1 + }, + "ui/pages/confirmations/hooks/alerts/useBlockaidAlerts.test.ts": { + "Reselect: Input stability warnings": 2, + "Reselect: Identity function warnings": 5 + }, + "ui/pages/notifications/notifications-list.test.tsx": { + "Reselect: Input stability warnings": 1, + "error: Warning: Encountered two children with": 1 + }, + "ui/components/app/modals/customize-nonce/customize-nonce.test.js": { + "React: PropTypes validation failures": 2 + }, + "ui/components/app/identity/backup-and-sync-toggle/backup-and-sync-toggle.test.tsx": { + "Reselect: Input stability warnings": 1, + "React: componentWill* lifecycle deprecations": 1 + }, + "ui/pages/settings/security-tab/reveal-srp-list/reveal-srp-list.test.tsx": { + "Reselect: Identity function warnings": 1, + "Reselect: Input stability warnings": 1 + }, + "ui/pages/confirmations/hooks/useCurrentSignatureSecurityAlertResponse.test.ts": { + "Reselect: Input stability warnings": 2, + "Reselect: Identity function warnings": 5 + }, + "ui/pages/confirmations/confirmation/templates/create-snap-account.test.js": { + "Reselect: Identity function warnings": 7, + "Reselect: Input stability warnings": 2 + }, + "ui/pages/confirmations/components/confirm/splash/smart-account-update-splash/smart-account-update-splash.test.tsx": { + "Reselect: Input stability warnings": 3, + "Reselect: Identity function warnings": 6, + "React: DOM nesting violations": 1 + }, + "ui/pages/multichain-accounts/smart-account-page/smart-account-page.test.tsx": { + "Reselect: Identity function warnings": 1, + "Reselect: Input stability warnings": 1, + "React: Act warnings (component updates not wrapped)": 2 + }, + "ui/pages/confirmations/hooks/transactions/dapp-swap-comparison/useSwapCheck.test.ts": { + "Reselect: Input stability warnings": 2, + "Reselect: Identity function warnings": 5 + }, + "ui/pages/bridge/prepare/components/destination-account-picker-modal.test.tsx": { + "Reselect: Identity function warnings": 2, + "Reselect: Input stability warnings": 1, + "MetaMask: Background connection not initialized": 24 + }, + "ui/pages/confirmations/components/confirm/smart-account-tab/account-network/account-network.test.tsx": { + "Reselect: Identity function warnings": 1 + }, + "ui/pages/confirmations/components/transactions/nested-transaction-tag/nested-transaction-tag.test.tsx": { + "Reselect: Input stability warnings": 2, + "Reselect: Identity function warnings": 5 + }, + "ui/pages/confirmations/components/confirm/info/base-transaction-info/base-transaction-info.test.tsx": { + "Reselect: Input stability warnings": 4, + "Reselect: Identity function warnings": 8, + "MetaMask: Background connection not initialized": 141, + "React: Act warnings (component updates not wrapped)": 17 + }, + "ui/pages/confirmations/hooks/alerts/transactions/useNoGasPriceAlerts.test.ts": { + "Reselect: Input stability warnings": 2, + "Reselect: Identity function warnings": 5 + }, + "ui/pages/confirmations/hooks/alerts/transactions/useInsufficientBalanceAlerts.test.ts": { + "Reselect: Input stability warnings": 3, + "Reselect: Identity function warnings": 6 + }, + "ui/components/multichain-accounts/multichain-account-cell/multichain-account-cell.test.tsx": { + "Reselect: Identity function warnings": 2, + "Reselect: Input stability warnings": 1 + }, + "ui/pages/swaps/awaiting-swap/awaiting-swap.test.js": { + "React: PropTypes validation failures": 1, + "Reselect: Identity function warnings": 4, + "Reselect: Input stability warnings": 1 + }, + "ui/pages/confirmations/components/confirm/info/shared/gas-fee-token-icon/gas-fee-token-icon.test.tsx": { + "Reselect: Input stability warnings": 2, + "Reselect: Identity function warnings": 6 + }, + "ui/pages/confirmations/components/confirm/pluggable-section/pluggable-section.test.tsx": { + "Reselect: Input stability warnings": 2, + "Reselect: Identity function warnings": 5 + }, + "ui/pages/confirmations/components/confirm/info/set-approval-for-all-info/revoke-set-approval-for-all-static-simulation/revoke-set-approval-for-all-static-simulation.test.tsx": { + "Reselect: Input stability warnings": 3, + "Reselect: Identity function warnings": 7, + "MetaMask: Background connection not initialized": 4, + "React: Act warnings (component updates not wrapped)": 4 + }, + "ui/pages/confirmations/hooks/send/useAmountValidation.test.ts": { + "React: Act warnings (component updates not wrapped)": 1 + }, + "ui/pages/confirmations/hooks/alerts/useAddressTrustSignalAlerts.test.ts": { + "Reselect: Input stability warnings": 2, + "Reselect: Identity function warnings": 5 + }, + "ui/components/app/snaps/snap-ui-renderer/components/form.test.ts": { + "Reselect: Identity function warnings": 2 + }, + "ui/hooks/useCurrencyRatePolling.test.ts": { + "React: Act warnings (component updates not wrapped)": 7 + }, + "ui/pages/multichain-accounts/multichain-account-address-list-page/multichain-account-address-list-page.test.tsx": { + "Reselect: Identity function warnings": 2, + "Reselect: Input stability warnings": 1 + }, + "ui/pages/confirmations/components/confirm/row/dataTree.test.tsx": { + "Reselect: Identity function warnings": 2, + "Reselect: Input stability warnings": 1, + "MetaMask: Background connection not initialized": 10, + "React: Act warnings (component updates not wrapped)": 20 + }, + "ui/pages/confirmations/hooks/useTypesSignSimulationEnabledInfo.test.ts": { + "Reselect: Input stability warnings": 2, + "Reselect: Identity function warnings": 5 + }, + "ui/components/app/user-preferenced-currency-display/user-preferenced-currency-display.test.js": { + "Reselect: Identity function warnings": 1, + "Reselect: Input stability warnings": 1 + }, + "ui/pages/confirmations/components/confirm/info/hooks/use-token-values.test.ts": { + "Reselect: Input stability warnings": 2, + "Reselect: Identity function warnings": 5 + }, + "ui/pages/confirmations/components/fee-details-component/fee-details-component.test.js": { + "Reselect: Identity function warnings": 1, + "Reselect: Input stability warnings": 1 + }, + "ui/pages/confirmations/hooks/alerts/transactions/useGasEstimateFailedAlerts.test.ts": { + "Reselect: Input stability warnings": 2, + "Reselect: Identity function warnings": 5 + }, + "ui/components/app/name/name-details/name-details.test.tsx": { + "React: Act warnings (component updates not wrapped)": 13 + }, + "ui/pages/confirmations/hooks/gas/useIsGaslessLoading.test.ts": { + "Reselect: Input stability warnings": 2, + "Reselect: Identity function warnings": 5 + }, + "ui/hooks/metamask-notifications/useSwitchNotifications.test.tsx": { + "MetaMask: Background connection not initialized": 6, + "React: Act warnings (component updates not wrapped)": 7, + "error: Mock Error": 2 + }, + "ui/pages/confirmations/confirmation/templates/snap-account-redirect.test.js": { + "Reselect: Identity function warnings": 7, + "Reselect: Input stability warnings": 2 + }, + "ui/components/ui/survey-toast/survey-toast.test.tsx": { + "MetaMask: Background connection not initialized": 1 + }, + "ui/pages/confirmations/confirmation/templates/remove-snap-account.test.js": { + "Reselect: Identity function warnings": 8, + "Reselect: Input stability warnings": 3 + }, + "ui/components/app/snaps/snap-ui-address/snap-ui-address.test.tsx": { + "Reselect: Identity function warnings": 3, + "Reselect: Input stability warnings": 1 + }, + "ui/hooks/accounts/useAccountsOperationsLoadingStates.test.ts": { + "MetaMask: Background connection not initialized": 2 + }, + "ui/pages/bridge/index.test.tsx": { + "Reselect: Identity function warnings": 3, + "Reselect: Input stability warnings": 1, + "React: Act warnings (component updates not wrapped)": 5, + "error: Error checking send bundle support:": 1 + }, + "ui/hooks/identity/useBackupAndSync/useBackupAndSync.test.tsx": { + "MetaMask: Background connection not initialized": 1 + }, + "ui/components/app/assets/nfts/nft-details/nft-details.test.js": { + "React: DOM nesting violations": 2, + "React: Act warnings (component updates not wrapped)": 6, + "MetaMask: Background connection not initialized": 1 + }, + "ui/components/multichain/pages/gator-permissions/gator-permissions-page.test.tsx": { + "Reselect: Identity function warnings": 1, + "Reselect: Input stability warnings": 1, + "MetaMask: Background connection not initialized": 2, + "React: Act warnings (component updates not wrapped)": 4 + }, + "ui/pages/keychains/restore-vault.test.js": { + "React: PropTypes validation failures": 1 + }, + "ui/components/app/snaps/snap-ui-renderer/components/address-input.test.ts": { + "Reselect: Identity function warnings": 5, + "Reselect: Input stability warnings": 1, + "MetaMask: Background connection not initialized": 8 + }, + "ui/pages/swaps/index.test.js": { + "Reselect: Identity function warnings": 4, + "Reselect: Input stability warnings": 1, + "error: background[method] is not a function": 1, + "error: Failed to fetch Swaps feature": 1 + }, + "ui/pages/confirm-encryption-public-key/confirm-encryption-public-key.component.test.js": { + "Reselect: Identity function warnings": 2, + "Reselect: Input stability warnings": 1, + "warn: ConfirmEncryptionPublicKey Page: Missing txData prop.": 1 + }, + "ui/hooks/bridge/useTokensWithFiltering.test.ts": { + "Reselect: Identity function warnings": 2, + "Reselect: Input stability warnings": 1 + }, + "ui/hooks/useTokenRatesPolling.test.ts": { + "Test errors: Uncaught TypeErrors": 3, + "Test errors: Uncaught Errors": 1 + }, + "ui/pages/defi/components/defi-details-page.test.tsx": { + "Reselect: Identity function warnings": 3, + "Reselect: Input stability warnings": 1 + }, + "ui/pages/settings/advanced-tab/advanced-tab.component.test.js": { + "Reselect: Identity function warnings": 1, + "React: PropTypes validation failures": 3, + "React: Missing key props in lists": 1, + "error: Warning: Received `true` for a": 1, + "React: componentWill* lifecycle deprecations": 1 + }, + "ui/components/multichain/account-overview/account-overview-eth.test.tsx": { + "Reselect: Identity function warnings": 3, + "Reselect: Input stability warnings": 1 + }, + "ui/pages/swaps/prepare-swap-page/review-quote.test.js": { + "Reselect: Identity function warnings": 3, + "Reselect: Input stability warnings": 1, + "MetaMask: Background connection not initialized": 52, + "React: Act warnings (component updates not wrapped)": 9, + "error: Error: Insufficient number of substitutions": 1, + "React: Act usage warnings (incorrect await)": 3 + }, + "ui/components/app/snaps/snap-ui-renderer/components/asset-selector.test.ts": { + "Reselect: Identity function warnings": 5, + "Reselect: Input stability warnings": 1, + "MetaMask: Background connection not initialized": 4 + }, + "ui/pages/onboarding-flow/create-password/create-password.test.js": { + "MetaMask: Background connection not initialized": 1 + }, + "ui/hooks/identity/useAccountSyncing/useAccountSyncing.test.tsx": { + "MetaMask: Background connection not initialized": 8 + }, + "ui/components/multichain/pages/gator-permissions/components/permission-group-list-item.test.tsx": { + "Reselect: Identity function warnings": 1, + "Reselect: Input stability warnings": 1 + }, + "ui/hooks/useTokenListPolling.test.ts": { + "Test errors: Uncaught TypeErrors": 3 + }, + "ui/pages/confirmations/components/confirm/info/typed-sign/typed-sign-v4-simulation/decoded-simulation/decoded-simulation.test.tsx": { + "Reselect: Input stability warnings": 3, + "Reselect: Identity function warnings": 7, + "React: Missing key props in lists": 1, + "MetaMask: Background connection not initialized": 32, + "React: Act warnings (component updates not wrapped)": 8 + }, + "ui/components/component-library/banner-tip/banner-tip.test.tsx": { + "error: Warning: React does not recognize": 1 + }, + "ui/pages/asset/hooks/useHistoricalPrices.test.ts": { + "Reselect: Identity function warnings": 1, + "React: Act warnings (component updates not wrapped)": 3, + "MetaMask: Background connection not initialized": 6 + }, + "ui/pages/confirmations/hooks/useConfirmActions.test.ts": { + "Reselect: Input stability warnings": 2, + "Reselect: Identity function warnings": 5 + }, + "ui/pages/confirmations/hooks/transactions/dapp-swap-comparison/useDappSwapComparisonInfo.test.ts": { + "Reselect: Input stability warnings": 2, + "Reselect: Identity function warnings": 5, + "MetaMask: Background connection not initialized": 2 + }, + "ui/pages/confirmations/components/confirm/info/batch/transaction-account-details/transaction-account-details.test.tsx": { + "Reselect: Input stability warnings": 3, + "Reselect: Identity function warnings": 7, + "MetaMask: Background connection not initialized": 12, + "React: Act warnings (component updates not wrapped)": 12 + }, + "ui/pages/confirmations/hooks/alerts/useSelectedAccountAlerts.test.ts": { + "Reselect: Input stability warnings": 3, + "Reselect: Identity function warnings": 6 + }, + "ui/pages/confirmations/components/confirm/info/shared/batched-approval-function/batched-approval-function.test.tsx": { + "Reselect: Input stability warnings": 3, + "Reselect: Identity function warnings": 7, + "React: Act usage warnings (incorrect await)": 3, + "React: Act warnings (component updates not wrapped)": 3 + }, + "ui/pages/confirmations/hooks/transactions/useIsEnforcedSimulationsSupported.test.ts": { + "Reselect: Input stability warnings": 2, + "Reselect: Identity function warnings": 5 + }, + "ui/pages/settings/settings-tab/settings-tab.test.js": { + "React: componentWill* lifecycle deprecations": 1, + "React: Act warnings (component updates not wrapped)": 7 + }, + "ui/pages/confirmations/hooks/useSignatureEventFragment.test.tsx": { + "Reselect: Input stability warnings": 2, + "Reselect: Identity function warnings": 5 + }, + "ui/pages/confirmations/hooks/useCurrentConfirmation.test.ts": { + "Reselect: Input stability warnings": 2, + "Reselect: Identity function warnings": 5 + }, + "ui/pages/bridge/prepare/bridge-cta-button.test.tsx": { + "Reselect: Identity function warnings": 2 + }, + "ui/pages/confirm-decrypt-message/confirm-decrypt-message.component.test.js": { + "Reselect: Identity function warnings": 4, + "Reselect: Input stability warnings": 1, + "warn: ConfirmDecryptMessage Page: Missing messageData prop.": 1, + "React: Act warnings (component updates not wrapped)": 16 + }, + "ui/components/app/modals/confirm-remove-account/confirm-remove-account.test.js": { + "React: PropTypes validation failures": 1, + "Reselect: Identity function warnings": 1 + }, + "ui/hooks/identity/useAuthentication/useSignOut.test.tsx": { + "MetaMask: Background connection not initialized": 1 + }, + "ui/pages/confirmations/hooks/useLedgerConnection.test.ts": { + "Reselect: Input stability warnings": 2, + "Reselect: Identity function warnings": 5 + }, + "ui/pages/trust-signals/hooks/useTrustSignalMetrics.test.ts": { + "Reselect: Input stability warnings": 2, + "Reselect: Identity function warnings": 5 + }, + "ui/pages/settings/contact-list-tab/edit-contact/edit-contact.test.js": { + "React: PropTypes validation failures": 1 + }, + "ui/pages/confirmations/components/confirm/info/batch/nested-transaction-data/nested-transaction-data.test.tsx": { + "Reselect: Input stability warnings": 3, + "Reselect: Identity function warnings": 7, + "React: Act warnings (component updates not wrapped)": 12 + }, + "ui/pages/confirmations/components/confirm/smart-account-update/smart-account-update.test.tsx": { + "Reselect: Input stability warnings": 2, + "Reselect: Identity function warnings": 5, + "React: DOM nesting violations": 1 + }, + "ui/pages/confirmations/components/confirm/info/token-transfer/token-transfer.test.tsx": { + "Reselect: Input stability warnings": 3, + "Reselect: Identity function warnings": 8, + "MetaMask: Background connection not initialized": 77, + "React: Act warnings (component updates not wrapped)": 25 + }, + "ui/pages/notifications/notification-components/snap/snap-footer-button.test.tsx": { + "error: Warning: React does not recognize": 1 + }, + "ui/pages/confirmations/components/confirm/info/typed-sign/typed-sign-v4-simulation/typed-sign-v4-simulation.test.tsx": { + "Reselect: Input stability warnings": 3, + "Reselect: Identity function warnings": 7, + "React: Missing key props in lists": 1 + }, + "ui/components/multichain/import-tokens-modal/import-tokens-modal.test.js": { + "Reselect: Identity function warnings": 2, + "Reselect: Input stability warnings": 1, + "React: PropTypes validation failures": 2, + "React: Act warnings (component updates not wrapped)": 15 + }, + "ui/components/multichain-accounts/multichain-account-list/multichain-account-list.test.tsx": { + "Reselect: Identity function warnings": 2, + "MetaMask: Background connection not initialized": 64 + }, + "ui/pages/confirmations/components/confirm/info/typed-sign/typed-sign-permission/native-token-stream-details.test.tsx": { + "Reselect: Input stability warnings": 2, + "Reselect: Identity function warnings": 5 + }, + "ui/pages/confirmations/components/confirm/info/native-transfer/native-transfer.test.tsx": { + "Reselect: Input stability warnings": 3, + "Reselect: Identity function warnings": 8, + "MetaMask: Background connection not initialized": 83, + "React: Act warnings (component updates not wrapped)": 24 + }, + "ui/pages/multichain-accounts/multichain-accounts-connect-page/multichain-accounts-connect-page.test.tsx": { + "Reselect: Identity function warnings": 2, + "React: DOM nesting violations": 3, + "Reselect: Input stability warnings": 1, + "MetaMask: Background connection not initialized": 3 + }, + "ui/components/ui/account-mismatch-warning/acccount-mismatch-warning.component.test.js": { + "Reselect: Identity function warnings": 1, + "Reselect: Input stability warnings": 1 + }, + "ui/components/app/basic-configuration-modal/basic-configuration-modal.test.tsx": { + "Reselect: Input stability warnings": 1 + }, + "ui/components/multichain/pages/connections/connections.test.tsx": { + "Reselect: Identity function warnings": 1, + "Reselect: Input stability warnings": 1, + "React: DOM nesting violations": 1, + "React: PropTypes validation failures": 1 + }, + "ui/pages/bridge/transaction-details/transaction-details.test.tsx": { + "Reselect: Identity function warnings": 1 + }, + "ui/components/multichain/connect-accounts-modal/connect-accounts-modal-list.test.tsx": { + "React: Missing key props in lists": 1, + "Reselect: Identity function warnings": 1, + "Reselect: Input stability warnings": 1, + "MetaMask: Background connection not initialized": 12 + }, + "ui/pages/confirmations/components/confirm/smart-account-update/smart-account-update-success.test.tsx": { + "Reselect: Input stability warnings": 2, + "Reselect: Identity function warnings": 5 + }, + "ui/components/multichain/edit-networks-modal/edit-networks-modal.test.js": { + "React: PropTypes validation failures": 2, + "React: Missing key props in lists": 1 + }, + "app/scripts/lib/createRPCMethodTrackingMiddleware.test.js": { + "MetaMask: RPC middleware errors": 10 + }, + "ui/pages/confirmations/components/confirm/header/header.test.tsx": { + "Reselect: Input stability warnings": 3, + "Reselect: Identity function warnings": 6 + }, + "ui/components/multichain/pages/send/components/account-picker.test.tsx": { + "Reselect: Identity function warnings": 1, + "Reselect: Input stability warnings": 2 + }, + "ui/pages/confirmations/components/advanced-gas-fee-popover/advanced-gas-fee-inputs/priority-fee-input/priority-fee-input.test.js": { + "Reselect: Identity function warnings": 1, + "Reselect: Input stability warnings": 1 + }, + "ui/pages/confirmations/components/confirm/info/info.test.tsx": { + "Reselect: Input stability warnings": 4, + "Reselect: Identity function warnings": 8, + "MetaMask: Background connection not initialized": 238, + "React: Act warnings (component updates not wrapped)": 41, + "Test errors: Uncaught Errors": 1 + }, + "ui/pages/onboarding-flow/privacy-settings/privacy-settings.test.js": { + "Reselect: Input stability warnings": 1, + "error: Warning: Encountered two children with": 1, + "React: componentWill* lifecycle deprecations": 1, + "MetaMask: Invalid theme warnings": 24, + "error: background[method] is not a function": 2 + }, + "ui/pages/confirmations/components/multilayer-fee-message/multi-layer-fee-message.test.js": { + "Reselect: Identity function warnings": 1, + "Reselect: Input stability warnings": 1, + "error: Warning: React does not recognize": 1 + }, + "ui/components/multichain/create-named-snap-account/create-named-snap-account.test.tsx": { + "Reselect: Identity function warnings": 1, + "Reselect: Input stability warnings": 2 + }, + "ui/pages/confirmations/hooks/alerts/transactions/useSigningOrSubmittingAlerts.test.ts": { + "Reselect: Input stability warnings": 2, + "Reselect: Identity function warnings": 6 + }, + "ui/pages/settings/backup-and-sync-tab/backup-and-sync-tab.test.tsx": { + "Reselect: Input stability warnings": 1, + "React: componentWill* lifecycle deprecations": 1 + }, + "ui/components/app/qr-hardware-popover/base-reader.test.js": { + "React: Component update warnings": 1 + }, + "ui/components/app/transaction-list-item/transaction-list-item.component.test.js": { + "Reselect: Identity function warnings": 1, + "Reselect: Input stability warnings": 1 + }, + "ui/pages/onboarding-flow/import-srp/import-srp.test.js": { + "MetaMask: Background connection not initialized": 1 + }, + "ui/pages/confirmations/components/confirm/info/token-transfer/transaction-flow-section.test.tsx": { + "Reselect: Input stability warnings": 3, + "Reselect: Identity function warnings": 7, + "MetaMask: Background connection not initialized": 4, + "React: Act warnings (component updates not wrapped)": 4 + }, + "ui/pages/confirmations/components/confirm/info/set-approval-for-all-info/set-approval-for-all-info.test.tsx": { + "Reselect: Input stability warnings": 3, + "Reselect: Identity function warnings": 8, + "MetaMask: Background connection not initialized": 73, + "React: Act warnings (component updates not wrapped)": 22 + }, + "ui/pages/multichain-accounts/account-details/multichain-account-details.test.tsx": { + "Reselect: Identity function warnings": 1, + "Reselect: Input stability warnings": 1, + "MetaMask: Background connection not initialized": 1, + "React: Act warnings (component updates not wrapped)": 2 + }, + "ui/pages/confirmations/hooks/alerts/useShieldCoverageAlert.test.ts": { + "Reselect: Input stability warnings": 2, + "Reselect: Identity function warnings": 5 + }, + "ui/components/multichain/import-nfts-modal/import-nfts-modal.test.js": { + "error: Warning: React does not recognize": 1, + "React: Act warnings (component updates not wrapped)": 1 + }, + "ui/components/multichain-accounts/smart-contract-account-toggle-section/smart-contract-account-toggle-section.test.tsx": { + "Reselect: Identity function warnings": 2, + "React: componentWill* lifecycle deprecations": 1, + "React: Act warnings (component updates not wrapped)": 2 + }, + "ui/pages/confirmations/hooks/useAutomaticGasFeeTokenSelect.test.ts": { + "Reselect: Input stability warnings": 2, + "Reselect: Identity function warnings": 5, + "Test errors: Uncaught TypeErrors": 1 + }, + "ui/components/multichain/disconnect-permissions-modal/disconnect-permissions-modal.test.tsx": { + "Reselect: Identity function warnings": 3, + "Reselect: Input stability warnings": 1, + "React: Act warnings (component updates not wrapped)": 5 + }, + "ui/components/multichain/asset-picker-amount/asset-picker-modal/asset-picker-modal.test.tsx": { + "React: Act warnings (component updates not wrapped)": 18 + }, + "ui/components/multichain-accounts/multichain-site-cell/multichain-site-cell.test.tsx": { + "Reselect: Identity function warnings": 1 + }, + "ui/components/multichain-accounts/smart-contract-account-toggle/smart-contract-account-toggle.test.tsx": { + "React: componentWill* lifecycle deprecations": 1, + "React: Act warnings (component updates not wrapped)": 6 + }, + "ui/components/app/alert-system/contexts/alertMetricsContext.test.tsx": { + "Test errors: Uncaught Errors": 1 + }, + "ui/pages/onboarding-flow/account-exist/account-exist.test.tsx": { + "MetaMask: Background connection not initialized": 1 + }, + "ui/pages/bridge/hooks/useDestinationAccount.test.tsx": { + "Reselect: Identity function warnings": 2, + "Reselect: Input stability warnings": 1 + }, + "ui/pages/confirmations/confirmation/templates/switch-ethereum-chain.test.js": { + "Reselect: Identity function warnings": 7, + "Reselect: Input stability warnings": 2 + }, + "ui/components/multichain-accounts/multichain-account-list-menu/multichain-account-list-menu.test.tsx": { + "Reselect: Identity function warnings": 1, + "Reselect: Input stability warnings": 2, + "MetaMask: Background connection not initialized": 2 + }, + "ui/pages/bridge/quotes/bridge-quotes-modal.test.tsx": { + "Reselect: Identity function warnings": 1 + }, + "ui/pages/onboarding-flow/onboarding-flow.test.js": { + "React: PropTypes validation failures": 2, + "MetaMask: Background connection not initialized": 14, + "error: Error: Actions must be plain": 1, + "React: Missing key props in lists": 1, + "error: Warning: React does not recognize": 1, + "MetaMask: Invalid theme warnings": 1, + "error: Warning: Expected `onKeyDown` listener to": 1 + }, + "ui/components/multichain/global-menu/global-menu.test.tsx": { + "Reselect: Identity function warnings": 3, + "Reselect: Input stability warnings": 4, + "error: Warning: Function components cannot be": 1 + }, + "ui/components/app/detected-token/detected-token.test.js": { + "MetaMask: Background connection not initialized": 12, + "error: Warning: A component is changing": 1 + }, + "ui/pages/confirmations/components/send/amount-recipient/amount-recipient.test.tsx": { + "Reselect: Identity function warnings": 1, + "Reselect: Input stability warnings": 1, + "React: Act warnings (component updates not wrapped)": 6, + "MetaMask: Background connection not initialized": 1 + }, + "ui/components/app/multichain-transaction-details-modal/multichain-transaction-details-modal.test.tsx": { + "error: Unexpected keys \"allTokens\", \"enableEnforcedSimulations\", \"e...": 1, + "Reselect: Identity function warnings": 1 + }, + "ui/components/app/wallet-overview/non-evm-overview.test.tsx": { + "Reselect: Identity function warnings": 3, + "Reselect: Input stability warnings": 1, + "MetaMask: Balance not found warnings": 2, + "React: Act warnings (component updates not wrapped)": 1 + }, + "ui/components/multichain/account-list-item/account-list-item.test.js": { + "Reselect: Identity function warnings": 1, + "Reselect: Input stability warnings": 1, + "MetaMask: Background connection not initialized": 60, + "React: PropTypes validation failures": 2, + "React: Act warnings (component updates not wrapped)": 2 + }, + "ui/components/multichain/address-list-item/address-list-item.test.tsx": { + "React: DOM nesting violations": 1 + }, + "test/e2e/helpers.test.js": { + "µWebSockets: Compatibility warnings": 1, + "µWebSockets: Fallback to Node implementation": 1 + }, + "ui/components/multichain/asset-picker-amount/asset-balance/asset-balance-text.test.tsx": { + "Reselect: Identity function warnings": 1, + "Reselect: Input stability warnings": 1 + }, + "ui/pages/confirmations/hooks/gas/useGaslessSupportedSmartTransactions.test.ts": { + "Reselect: Input stability warnings": 2, + "Reselect: Identity function warnings": 5 + }, + "ui/hooks/useTransactionDisplayData.test.js": { + "Reselect: Identity function warnings": 1, + "MetaMask: XChain Swaps warnings": 4 + }, + "ui/pages/confirmations/components/edit-gas-fee-button/edit-gas-fee-button.test.js": { + "Reselect: Identity function warnings": 1, + "Reselect: Input stability warnings": 1 + }, + "ui/hooks/gator-permissions/useRevokeGatorPermissions.test.tsx": { + "Reselect: Identity function warnings": 1, + "Reselect: Input stability warnings": 1 + }, + "ui/hooks/rewards/useValidateReferralCode.test.tsx": { + "React: Act warnings (component updates not wrapped)": 1 + }, + "ui/components/multichain/asset-picker-amount/asset-picker-amount.test.tsx": { + "React: Act warnings (component updates not wrapped)": 2 + }, + "ui/pages/swaps/list-with-search/list-with-search.test.js": { + "React: PropTypes validation failures": 2, + "error: Warning: React.createElement: type is invalid": 1 + }, + "ui/pages/confirmations/components/send/amount/amount.test.tsx": { + "React: Act warnings (component updates not wrapped)": 14 + }, + "ui/components/ui/qr-code-view/qr-code-view.test.tsx": { + "React: DOM nesting violations": 1 + }, + "ui/pages/bridge/quotes/multichain-bridge-quote-card.test.tsx": { + "Reselect: Identity function warnings": 2 + }, + "ui/components/multichain/account-list-item-menu/account-list-item-menu.test.js": { + "React: PropTypes validation failures": 1 + }, + "shared/modules/selectors/index.test.ts": { + "Reselect: Identity function warnings": 2 + }, + "ui/components/multichain/connected-site-menu/connected-site-menu.test.js": { + "Reselect: Identity function warnings": 1, + "Reselect: Input stability warnings": 1 + }, + "ui/components/multichain/funding-method-modal/funding-method-modal.test.tsx": { + "Reselect: Identity function warnings": 1, + "Reselect: Input stability warnings": 1 + }, + "ui/components/multichain/edit-accounts-modal/edit-accounts-modal.test.tsx": { + "React: PropTypes validation failures": 1, + "Reselect: Identity function warnings": 1, + "Reselect: Input stability warnings": 3, + "MetaMask: Background connection not initialized": 1, + "React: Act warnings (component updates not wrapped)": 1, + "React: State updates on unmounted components": 1 + }, + "ui/components/multichain/multi-srp/srp-list/srp-list-item.test.tsx": { + "Reselect: Identity function warnings": 1, + "Reselect: Input stability warnings": 1, + "React: DOM nesting violations": 1 + }, + "ui/pages/confirm-add-suggested-token/confirm-add-suggested-token.test.js": { + "Reselect: Identity function warnings": 1 + }, + "ui/ducks/send/send.test.js": { + "error: TypeError: background[method] is not a": 5, + "Reselect: Identity function warnings": 3, + "Reselect: Input stability warnings": 1 + }, + "ui/pages/confirmations/components/send/recipient/recipient.test.tsx": { + "Reselect: Identity function warnings": 1, + "Reselect: Input stability warnings": 1 + }, + "ui/helpers/utils/tags.test.ts": { + "Reselect: Identity function warnings": 2, + "Reselect: Input stability warnings": 2 + }, + "ui/components/multichain/pages/send/components/recipient.test.tsx": { + "Reselect: Identity function warnings": 3, + "Reselect: Input stability warnings": 1 + }, + "ui/selectors/multi-srp/multi-srp.test.ts": { + "Reselect: Identity function warnings": 1, + "Reselect: Input stability warnings": 1 + }, + "ui/pages/confirmations/components/edit-gas-fee-icon/edit-gas-fee-icon.test.js": { + "Reselect: Identity function warnings": 1, + "Reselect: Input stability warnings": 1 + }, + "ui/pages/multichain-accounts/address-qr-code/address-qr-code.test.tsx": { + "React: DOM nesting violations": 1 + }, + "ui/hooks/metamask-notifications/useNotifications.test.tsx": { + "Reselect: Input stability warnings": 1 + }, + "ui/selectors/assets.test.ts": { + "Reselect: Identity function warnings": 4, + "Reselect: Input stability warnings": 1, + "warn: No tokens found for chainId:": 1 + }, + "shared/modules/transaction.utils.test.js": { + "µWebSockets: Compatibility warnings": 1, + "µWebSockets: Fallback to Node implementation": 1 + }, + "ui/pages/confirmations/confirm-transaction/confirm-transaction.test.js": { + "Reselect: Identity function warnings": 5, + "Reselect: Input stability warnings": 2, + "React: Act warnings (component updates not wrapped)": 9 + }, + "ui/pages/multichain-accounts/base-account-details/base-account-details.test.tsx": { + "Reselect: Identity function warnings": 1, + "Reselect: Input stability warnings": 1 + }, + "ui/components/multichain/connect-accounts-modal/connect-accounts-modal.test.tsx": { + "Reselect: Identity function warnings": 1, + "Reselect: Input stability warnings": 1, + "React: Missing key props in lists": 1, + "MetaMask: Background connection not initialized": 8 + }, + "ui/pages/settings/experimental-tab/experimental-tab.test.js": { + "React: componentWill* lifecycle deprecations": 1 + }, + "ui/components/app/selected-account/selected-account-component.test.js": { + "React: DOM nesting violations": 1 + }, + "ui/components/multichain/network-manager/network-manager.test.tsx": { + "Reselect: Identity function warnings": 2, + "Reselect: Input stability warnings": 1, + "error: Unexpected key \"internalAccounts\" found in": 1 + }, + "ui/components/multichain/multi-srp/srp-list/srp-list.test.tsx": { + "Reselect: Identity function warnings": 1, + "Reselect: Input stability warnings": 1, + "React: DOM nesting violations": 1 + }, + "ui/pages/confirmations/components/send/recipient-filter-input/recipient-filter-input.test.tsx": { + "error: Warning: React does not recognize": 6, + "error: Warning: Received `false` for a": 2 + }, + "ui/pages/confirmations/hooks/useSyncConfirmPath.test.ts": { + "Reselect: Input stability warnings": 2, + "Reselect: Identity function warnings": 5 + }, + "ui/hooks/identity/useAuthentication/useAutoSignIn.test.tsx": { + "MetaMask: Background connection not initialized": 4 + }, + "ui/selectors/multichain-accounts/account-tree.test.ts": { + "Reselect: Identity function warnings": 2, + "Reselect: Input stability warnings": 1 + }, + "ui/pages/confirmations/hooks/send/useRecipientValidation.test.ts": { + "MetaMask: Background connection not initialized": 1, + "React: Act warnings (component updates not wrapped)": 1 + }, + "ui/pages/confirmations/hooks/useSetConfirmationAlerts.test.ts": { + "Reselect: Input stability warnings": 2, + "Reselect: Identity function warnings": 5 + }, + "ui/components/app/assets/asset-list/asset-list.test.tsx": { + "Reselect: Identity function warnings": 2, + "Reselect: Input stability warnings": 1 + }, + "ui/pages/settings/security-tab/security-tab.test.js": { + "Reselect: Input stability warnings": 1, + "React: PropTypes validation failures": 6, + "React: componentWill* lifecycle deprecations": 1, + "MetaMask: Background connection not initialized": 36 + }, + "ui/pages/permissions-connect/connect-page/connect-page.test.tsx": { + "Reselect: Identity function warnings": 1, + "Reselect: Input stability warnings": 1, + "React: DOM nesting violations": 3 + }, + "ui/pages/confirmations/components/edit-gas-fee-popover/edit-gas-tooltip/edit-gas-tooltip.test.js": { + "Reselect: Identity function warnings": 1, + "Reselect: Input stability warnings": 1 + }, + "ui/pages/confirmations/selectors/accounts.test.ts": { + "Reselect: Identity function warnings": 1, + "Reselect: Input stability warnings": 1 + }, + "ui/pages/confirmations/hooks/gas/useIsGaslessSupported.test.ts": { + "Reselect: Input stability warnings": 2, + "Reselect: Identity function warnings": 5 + }, + "ui/components/multichain-accounts/multichain-private-key-list/multichain-private-key-list.test.tsx": { + "Reselect: Identity function warnings": 2, + "Reselect: Input stability warnings": 1 + }, + "ui/pages/confirmations/components/send/network-filter/network-filter.test.tsx": { + "error: Warning: React does not recognize": 7, + "error: Warning: Received `true` for a": 1 + }, + "ui/components/multichain/account-menu/account-menu.test.tsx": { + "Reselect: Input stability warnings": 3, + "Reselect: Identity function warnings": 1, + "MetaMask: Background connection not initialized": 2, + "React: Act warnings (component updates not wrapped)": 3, + "React: State updates on unmounted components": 1 + }, + "ui/components/app/snaps/snap-ui-renderer/components/account-selector.test.ts": { + "Reselect: Identity function warnings": 3, + "Reselect: Input stability warnings": 1, + "React: DOM nesting violations": 1, + "MetaMask: Background connection not initialized": 4 + }, + "ui/pages/multichain-accounts/account-list/account-list.test.tsx": { + "Reselect: Identity function warnings": 3, + "Reselect: Input stability warnings": 1 + }, + "ui/components/app/cancel-speedup-popover/cancel-speedup-popover.test.js": { + "Reselect: Identity function warnings": 3, + "Reselect: Input stability warnings": 1 + }, + "ui/pages/swaps/prepare-swap-page/prepare-swap-page.test.js": { + "Reselect: Identity function warnings": 3, + "Reselect: Input stability warnings": 1 + }, + "ui/components/app/balance-empty-state/balance-empty-state.test.tsx": { + "Reselect: Identity function warnings": 1, + "Reselect: Input stability warnings": 1 + }, + "ui/components/multichain-accounts/multichain-accounts-tree/multichain-accounts-tree.test.tsx": { + "React: Missing key props in lists": 1, + "Reselect: Identity function warnings": 1, + "Reselect: Input stability warnings": 1 + }, + "ui/pages/swaps/smart-transaction-status/smart-transaction-status.test.js": { + "Reselect: Identity function warnings": 2, + "Reselect: Input stability warnings": 1, + "error: background[method] is not a function": 1, + "React: Act warnings (component updates not wrapped)": 1 + }, + "ui/components/multichain-accounts/permissions/permission-review-page/multichain-review-permissions-page.test.tsx": { + "Reselect: Identity function warnings": 3, + "Reselect: Input stability warnings": 1 + }, + "ui/pages/asset/components/asset-page.test.tsx": { + "Reselect: Identity function warnings": 8, + "Reselect: Input stability warnings": 1, + "React: DOM nesting violations": 2 + }, + "ui/pages/onboarding-flow/account-not-found/account-not-found.test.tsx": { + "MetaMask: Background connection not initialized": 1 + }, + "ui/pages/unlock-page/unlock-page.test.js": { + "React: PropTypes validation failures": 2, + "error: Warning: React does not recognize": 1, + "MetaMask: Background connection not initialized": 1 + }, + "ui/pages/confirmations/components/confirm/info/shared/gas-fee-token-toast/gas-fee-token-toast.test.tsx": { + "Reselect: Input stability warnings": 3, + "Reselect: Identity function warnings": 7, + "React: Missing key props in lists": 1, + "MetaMask: Background connection not initialized": 12 + }, + "ui/components/app/identity/backup-and-sync-features-toggles/backup-and-sync-features-toggles.test.tsx": { + "React: componentWill* lifecycle deprecations": 1, + "error: Actions must be plain objects.": 1 + }, + "ui/pages/keychains/reveal-seed.test.js": { + "error: Warning: React does not recognize": 1 + }, + "ui/pages/confirmations/components/confirm/info/typed-sign/typed-sign-permission/native-token-periodic-details.test.tsx": { + "Reselect: Input stability warnings": 2, + "Reselect: Identity function warnings": 5, + "Test errors: Uncaught Errors": 2 + }, + "ui/components/multichain/pages/send/send.test.js": { + "Reselect: Identity function warnings": 2, + "Reselect: Input stability warnings": 1, + "MetaMask: Background connection not initialized": 8, + "React: PropTypes validation failures": 1 + }, + "ui/pages/confirmations/components/advanced-gas-fee-popover/advanced-gas-fee-defaults/advanced-gas-fee-defaults.test.js": { + "Reselect: Identity function warnings": 1, + "Reselect: Input stability warnings": 1 + }, + "ui/pages/onboarding-flow/metametrics/metametrics.test.js": { + "error: Warning: Expected `onKeyDown` listener to": 3, + "React: Act usage warnings (incorrect await)": 4 + }, + "ui/pages/confirmations/components/advanced-gas-fee-popover/advanced-gas-fee-inputs/base-fee-input/base-fee-input.test.js": { + "Reselect: Identity function warnings": 1, + "Reselect: Input stability warnings": 1 + }, + "ui/pages/confirmations/components/confirm/info/hooks/useDecodedTransactionData.test.ts": { + "Reselect: Input stability warnings": 2, + "Reselect: Identity function warnings": 5, + "React: Act warnings (component updates not wrapped)": 9, + "React: Act usage warnings (incorrect await)": 9 + }, + "ui/pages/confirmations/components/confirm/info/shared/sign-in-with-row/sign-in-with-row.test.tsx": { + "Reselect: Input stability warnings": 3, + "Reselect: Identity function warnings": 7, + "MetaMask: Background connection not initialized": 2, + "React: Act warnings (component updates not wrapped)": 2 + }, + "ui/pages/multichain-accounts/wallet-details-page/wallet-details-page.test.tsx": { + "Reselect: Identity function warnings": 3, + "Reselect: Input stability warnings": 1, + "MetaMask: Background connection not initialized": 4 + }, + "ui/components/multichain-accounts/add-multichain-account/add-multichain-account.test.tsx": { + "React: Act warnings (component updates not wrapped)": 4 + }, + "app/scripts/services/subscription/subscription-service.test.ts": { + "Reselect: Identity function warnings": 1 + }, + "ui/pages/confirmations/hooks/useConfirmationAlertMetrics.test.ts": { + "Reselect: Input stability warnings": 2, + "Reselect: Identity function warnings": 5 + }, + "ui/pages/confirmations/components/confirm/info/hooks/useIsUpgradeTransaction.test.ts": { + "Reselect: Input stability warnings": 2, + "Reselect: Identity function warnings": 5 + }, + "ui/pages/confirmations/components/confirm/info/shared/gas-fees-row/gas-fees-row.test.tsx": { + "Reselect: Input stability warnings": 2, + "Reselect: Identity function warnings": 5 + }, + "ui/components/app/create-new-vault/create-new-vault.test.js": { + "React: PropTypes validation failures": 1 + }, + "ui/pages/confirmations/components/confirm/scroll-to-bottom/scroll-to-bottom.test.tsx": { + "Reselect: Input stability warnings": 2, + "Reselect: Identity function warnings": 5 + }, + "ui/pages/confirmations/hooks/alerts/transactions/useMultipleApprovalsAlerts.test.ts": { + "Reselect: Input stability warnings": 2, + "Reselect: Identity function warnings": 5 + }, + "ui/components/app/confirm/info/row/address.test.tsx": { + "Reselect: Identity function warnings": 2, + "Reselect: Input stability warnings": 1, + "MetaMask: Background connection not initialized": 2, + "React: Act warnings (component updates not wrapped)": 2 + }, + "ui/pages/confirmations/hooks/alerts/useOriginTrustSignalAlerts.test.ts": { + "Reselect: Input stability warnings": 2, + "Reselect: Identity function warnings": 5 + }, + "ui/pages/confirmations/components/confirm/info/personal-sign/personal-sign.test.tsx": { + "Reselect: Input stability warnings": 3, + "Reselect: Identity function warnings": 7, + "MetaMask: Background connection not initialized": 12, + "React: Act warnings (component updates not wrapped)": 12 + }, + "ui/components/multichain/asset-picker-amount/asset-picker/asset-picker.test.tsx": { + "Reselect: Identity function warnings": 2, + "Reselect: Input stability warnings": 1, + "React: Act warnings (component updates not wrapped)": 24 + }, + "ui/components/app/transaction-list/transaction-list.test.js": { + "Reselect: Identity function warnings": 7, + "Reselect: Input stability warnings": 1, + "MetaMask: Background connection not initialized": 36 + }, + "ui/pages/confirmations/components/confirm/row/typed-sign-data/typedSignData.test.tsx": { + "Reselect: Identity function warnings": 2, + "Reselect: Input stability warnings": 1, + "MetaMask: Background connection not initialized": 24, + "React: Act warnings (component updates not wrapped)": 36 + }, + "ui/pages/confirmations/hooks/alerts/useNetworkAndOriginSwitchingAlerts.test.ts": { + "Reselect: Input stability warnings": 2, + "Reselect: Identity function warnings": 5, + "MetaMask: Background connection not initialized": 7 + }, + "ui/pages/swaps/awaiting-signatures/awaiting-signatures.test.js": { + "Reselect: Identity function warnings": 1 + }, + "ui/pages/confirmations/components/confirm/info/shared/gas-fees-details/gas-fees-details.test.tsx": { + "Reselect: Input stability warnings": 3, + "Reselect: Identity function warnings": 8, + "MetaMask: Background connection not initialized": 320 + }, + "ui/pages/confirmations/components/advanced-gas-fee-popover/advanced-gas-fee-gas-limit/advanced-gas-fee-gas-limit.test.js": { + "Reselect: Identity function warnings": 1, + "Reselect: Input stability warnings": 1 + }, + "ui/components/component-library/file-uploader/file-uploader.test.tsx": { + "React: Missing key props in lists": 1 + }, + "ui/pages/settings/developer-options-tab/developer-options-tab.test.tsx": { + "React: componentWill* lifecycle deprecations": 1, + "React: Act warnings (component updates not wrapped)": 1 + }, + "ui/hooks/rewards/useLinkAccountGroup.test.tsx": { + "Reselect: Identity function warnings": 1 + }, + "ui/components/multichain/account-details/account-details-display.test.tsx": { + "React: DOM nesting violations": 1, + "Reselect: Identity function warnings": 1, + "Reselect: Input stability warnings": 1, + "MetaMask: Background connection not initialized": 1, + "React: Act warnings (component updates not wrapped)": 1 + }, + "ui/pages/confirmations/components/confirm/info/set-approval-for-all-info/set-approval-for-all-static-simulation/set-approval-for-all-static-simulation.test.tsx": { + "Reselect: Input stability warnings": 3, + "Reselect: Identity function warnings": 7, + "MetaMask: Background connection not initialized": 2, + "React: Act warnings (component updates not wrapped)": 2 + }, + "ui/pages/confirmations/hooks/useBatchAuthorizationRequests.test.ts": { + "Reselect: Identity function warnings": 1 + }, + "ui/pages/confirmations/components/confirm/info/approve/approve-details/approve-details.test.tsx": { + "Reselect: Input stability warnings": 3, + "Reselect: Identity function warnings": 7, + "MetaMask: Background connection not initialized": 9, + "React: Act warnings (component updates not wrapped)": 9 + }, + "ui/components/app/assets/nfts/nfts-tab/nfts-tab.test.js": { + "React: DOM nesting violations": 1, + "React: Act warnings (component updates not wrapped)": 40 + }, + "ui/components/app/alerts/unconnected-account-alert/unconnected-account-alert.test.js": { + "Reselect: Identity function warnings": 1, + "Reselect: Input stability warnings": 1 + }, + "ui/pages/confirmations/components/confirm/header/advanced-details-button.test.tsx": { + "Reselect: Input stability warnings": 2, + "Reselect: Identity function warnings": 5 + }, + "ui/pages/confirmations/hooks/useDecodedSignatureMetrics.test.ts": { + "Reselect: Input stability warnings": 2, + "Reselect: Identity function warnings": 5 + }, + "ui/components/app/snaps/snap-ui-renderer/snap-ui-renderer.test.js": { + "Reselect: Identity function warnings": 2, + "error: Warning: React does not recognize": 1 + }, + "ui/pages/confirmations/components/confirm/info/typed-sign/typed-sign-v4-simulation/permit-simulation/permit-simulation.test.tsx": { + "Reselect: Input stability warnings": 3, + "Reselect: Identity function warnings": 7 + }, + "ui/pages/confirmations/components/send/asset-list/asset-list.test.tsx": { + "error: Warning: React does not recognize": 3 + }, + "ui/pages/confirmations/hooks/useConfirmationRecipientInfo.test.ts": { + "Reselect: Input stability warnings": 3, + "Reselect: Identity function warnings": 6 + }, + "ui/pages/confirmations/hooks/alerts/useTokenTrustSignalAlerts.test.ts": { + "Reselect: Input stability warnings": 2, + "Reselect: Identity function warnings": 5 + }, + "ui/pages/confirmations/components/confirm/title/title.test.tsx": { + "Reselect: Input stability warnings": 2, + "Reselect: Identity function warnings": 5 + }, + "ui/hooks/bridge/useCountdownTimer.test.ts": { + "React: Act warnings (component updates not wrapped)": 42 + }, + "ui/pages/confirmations/confirmation/templates/success.test.js": { + "Reselect: Identity function warnings": 7, + "Reselect: Input stability warnings": 2 + }, + "ui/pages/confirmations/hooks/alerts/transactions/useGasTooLowAlerts.test.ts": { + "Reselect: Input stability warnings": 2, + "Reselect: Identity function warnings": 5 + }, + "ui/pages/error-page/error-component.test.tsx": { + "React: Act warnings (component updates not wrapped)": 2 + }, + "ui/pages/confirmations/components/confirm/info/shared/gas-fees-section/gas-fees-section.test.tsx": { + "Reselect: Input stability warnings": 3, + "Reselect: Identity function warnings": 8, + "MetaMask: Background connection not initialized": 80 + }, + "ui/components/app/assets/defi-list/defi-tab.test.tsx": { + "Reselect: Identity function warnings": 1, + "Reselect: Input stability warnings": 1, + "MetaMask: Background connection not initialized": 4 + }, + "ui/pages/confirmations/components/confirm/info/hooks/useFeeCalculations.test.ts": { + "Reselect: Input stability warnings": 2, + "Reselect: Identity function warnings": 5, + "MetaMask: Background connection not initialized": 42 + }, + "ui/pages/confirmations/hooks/useEIP7702Networks.test.ts": { + "Reselect: Identity function warnings": 1, + "Reselect: Input stability warnings": 1, + "React: Act warnings (component updates not wrapped)": 3 + }, + "ui/pages/confirmations/components/confirm/info/approve/edit-spending-cap-modal/edit-spending-cap-modal.test.tsx": { + "Reselect: Input stability warnings": 2, + "Reselect: Identity function warnings": 5 + }, + "ui/pages/settings/info-tab/info-tab.test.tsx": { + "React: Act warnings (component updates not wrapped)": 1 + }, + "ui/pages/confirmations/components/confirm/info/hooks/useTransferRecipient.test.ts": { + "Reselect: Input stability warnings": 2, + "Reselect: Identity function warnings": 5 + }, + "ui/pages/notifications/notifications.test.tsx": { + "Reselect: Input stability warnings": 3 + }, + "ui/pages/confirmations/components/confirm/info/shared/advanced-details/advanced-details.test.tsx": { + "Reselect: Input stability warnings": 2, + "Reselect: Identity function warnings": 6, + "React: Act warnings (component updates not wrapped)": 2 + }, + "ui/components/app/modals/nickname-popovers/nickname-popovers.component.test.tsx": { + "Reselect: Identity function warnings": 1 + }, + "ui/pages/snaps/snap-view/snap-view.test.js": { + "Reselect: Identity function warnings": 2, + "Reselect: Input stability warnings": 1, + "error: Warning: React does not recognize": 1, + "React: Missing key props in lists": 1, + "React: componentWill* lifecycle deprecations": 1 + }, + "ui/pages/confirmations/components/confirm/info/token-transfer/token-details-section.test.tsx": { + "Reselect: Input stability warnings": 3, + "Reselect: Identity function warnings": 7, + "MetaMask: Background connection not initialized": 4, + "React: Act warnings (component updates not wrapped)": 12 + }, + "ui/components/app/transaction-breakdown/transaction-breakdown.test.js": { + "Reselect: Identity function warnings": 1, + "Reselect: Input stability warnings": 1 + }, + "ui/pages/confirmations/hooks/alerts/signatures/useAccountMismatchAlerts.test.ts": { + "Reselect: Input stability warnings": 2, + "Reselect: Identity function warnings": 5 + }, + "ui/pages/confirmations/components/confirm/info/approve/approve-static-simulation/approve-static-simulation.test.tsx": { + "Reselect: Input stability warnings": 3, + "Reselect: Identity function warnings": 7, + "MetaMask: Background connection not initialized": 6, + "React: Act warnings (component updates not wrapped)": 6 + }, + "ui/components/app/confirm/info/row/currency.test.tsx": { + "Reselect: Identity function warnings": 1, + "Reselect: Input stability warnings": 1 + }, + "ui/pages/confirmations/components/confirm/smart-account-tab/smart-account-tab.test.tsx": { + "Reselect: Identity function warnings": 1 + }, + "ui/pages/onboarding-flow/recovery-phrase/review-recovery-phrase.test.js": { + "React: Missing key props in lists": 1 + }, + "ui/pages/confirmations/hooks/transactions/dapp-swap-comparison/useDappSwapComparisonLatencyMetrics.test.ts": { + "Reselect: Input stability warnings": 2, + "Reselect: Identity function warnings": 5 + }, + "ui/pages/confirmations/hooks/alerts/transactions/useAccountTypeUpgrade.test.ts": { + "Reselect: Input stability warnings": 2, + "Reselect: Identity function warnings": 5 + }, + "ui/hooks/bridge/useBridgeQueryParams.test.ts": { + "Reselect: Identity function warnings": 1, + "MetaMask: Background connection not initialized": 1 + }, + "ui/components/multichain/pages/gator-permissions/review-permissions/review-gator-permissions-page.test.tsx": { + "Reselect: Identity function warnings": 1, + "Reselect: Input stability warnings": 1, + "React: DOM nesting violations": 1 + }, + "ui/components/app/snaps/snap-ui-renderer/components/file-input.test.ts": { + "Reselect: Identity function warnings": 2 + }, + "ui/pages/confirmations/components/confirm/row/typed-sign-data-v1/typedSignDataV1.test.tsx": { + "React: Act warnings (component updates not wrapped)": 1 + }, + "ui/pages/confirmations/components/confirm/info/shared/transaction-details/transaction-details.test.tsx": { + "Reselect: Input stability warnings": 4, + "Reselect: Identity function warnings": 7, + "MetaMask: Background connection not initialized": 20, + "React: Act warnings (component updates not wrapped)": 20 + }, + "ui/pages/confirmations/components/confirm/info/typed-sign/typed-sign-v4-simulation/value-display/value-display.test.tsx": { + "Reselect: Identity function warnings": 2, + "Reselect: Input stability warnings": 1 + }, + "ui/components/multichain/pages/send/components/your-accounts.test.tsx": { + "Reselect: Identity function warnings": 1, + "Reselect: Input stability warnings": 1 + }, + "ui/components/app/account-list-item/account-list-item-component.test.js": { + "Reselect: Identity function warnings": 2, + "Reselect: Input stability warnings": 1 + }, + "ui/pages/confirmations/components/gas-details-item/gas-details-item.test.js": { + "Reselect: Identity function warnings": 3, + "Reselect: Input stability warnings": 1 + }, + "ui/pages/confirmations/components/confirm/info/shared/gas-fee-token-list-item/gas-fee-token-list-item.test.tsx": { + "Reselect: Input stability warnings": 3, + "Reselect: Identity function warnings": 7, + "MetaMask: Background connection not initialized": 48 + }, + "ui/components/ui/aggregated-balance/index.test.tsx": { + "Reselect: Identity function warnings": 1, + "Reselect: Input stability warnings": 1 + }, + "ui/pages/confirmations/components/confirm/blockaid-loading-indicator/blockaid-loading-indicator.test.tsx": { + "Reselect: Input stability warnings": 2, + "Reselect: Identity function warnings": 5 + }, + "ui/pages/onboarding-flow/recovery-phrase/recovery-phrase-chips.test.js": { + "React: Missing key props in lists": 1 + }, + "ui/pages/confirmations/hooks/useSmartTransactionFeatureFlags.test.ts": { + "Reselect: Input stability warnings": 2, + "Reselect: Identity function warnings": 6 + }, + "ui/components/multichain/network-list-menu/select-rpc-url-modal/select-rpc-url-modal.test.tsx": { + "Reselect: Identity function warnings": 1, + "Reselect: Input stability warnings": 1 + }, + "ui/pages/confirmations/components/confirm/title/hooks/useCurrentSpendingCap.test.ts": { + "Reselect: Input stability warnings": 2, + "Reselect: Identity function warnings": 5, + "MetaMask: Background connection not initialized": 2, + "React: Act warnings (component updates not wrapped)": 2 + }, + "ui/pages/settings/developer-options-tab/developer-options-toggle-row-component.test.tsx": { + "React: componentWill* lifecycle deprecations": 1 + }, + "ui/components/multichain/account-overview/account-overview-unknown.test.tsx": { + "Reselect: Identity function warnings": 7, + "Reselect: Input stability warnings": 1, + "MetaMask: Background connection not initialized": 8 + }, + "ui/pages/confirmations/components/snap-account-success-message/SnapAccountSuccessMessage.test.tsx": { + "Reselect: Identity function warnings": 1, + "Reselect: Input stability warnings": 1, + "MetaMask: Background connection not initialized": 8 + }, + "ui/pages/confirmations/components/gas-timing/gas-timing.component.test.js": { + "Reselect: Identity function warnings": 2, + "React: Act warnings (component updates not wrapped)": 1 + }, + "ui/pages/confirmations/components/confirm/info/approve/hooks/use-approve-token-simulation.test.ts": { + "Reselect: Input stability warnings": 2, + "Reselect: Identity function warnings": 5 + }, + "ui/pages/onboarding-flow/creation-successful/creation-successful.test.js": { + "MetaMask: Background connection not initialized": 3 + }, + "ui/hooks/identity/useContactSyncing/useContactSyncing.test.tsx": { + "MetaMask: Background connection not initialized": 5 + }, + "ui/hooks/useTokenDetectionPolling.test.ts": { + "Test errors: Uncaught TypeErrors": 4 + }, + "ui/pages/confirmations/components/confirm/info/approve/hooks/use-received-token.test.ts": { + "Reselect: Input stability warnings": 3, + "Reselect: Identity function warnings": 6 + }, + "ui/pages/confirmations/components/transactions/quote-swap-simulation-details/quote-swap-simulation-details.test.tsx": { + "Reselect: Input stability warnings": 3, + "Reselect: Identity function warnings": 7, + "MetaMask: Background connection not initialized": 4, + "React: Act warnings (component updates not wrapped)": 4 + }, + "ui/pages/confirmations/components/confirm/info/hooks/useGasFeeToken.test.ts": { + "Reselect: Input stability warnings": 3, + "Reselect: Identity function warnings": 6, + "MetaMask: Background connection not initialized": 84 + }, + "ui/pages/confirmations/hooks/alerts/useConfirmationOriginAlerts.test.ts": { + "Reselect: Input stability warnings": 2, + "Reselect: Identity function warnings": 5 + }, + "ui/pages/confirmations/send/send-inner.test.tsx": { + "Reselect: Identity function warnings": 1, + "Reselect: Input stability warnings": 1, + "MetaMask: Background connection not initialized": 20, + "React: Act warnings (component updates not wrapped)": 2 + }, + "ui/pages/confirmations/confirmation/templates/create-named-snap-account.test.js": { + "Reselect: Identity function warnings": 8, + "React: PropTypes validation failures": 2, + "Reselect: Input stability warnings": 4 + }, + "ui/pages/confirmations/hooks/alerts/transactions/usePendingTransactionAlerts.test.ts": { + "Reselect: Input stability warnings": 2, + "Reselect: Identity function warnings": 7 + }, + "ui/components/app/alert-system/contexts/alertActionHandler.test.ts": { + "Test errors: Uncaught Errors": 1, + "error: Unexpected key \"processAction\" found in": 1 + }, + "ui/hooks/useMultichainBalances.test.ts": { + "Reselect: Identity function warnings": 2, + "Reselect: Input stability warnings": 1 + }, + "ui/components/app/detected-token/detected-token-values/detected-token-values.test.js": { + "MetaMask: Background connection not initialized": 4 + }, + "ui/pages/confirm-add-suggested-nft/confirm-add-suggested-nft.test.js": { + "Reselect: Identity function warnings": 2, + "Reselect: Input stability warnings": 1 + }, + "ui/pages/confirmations/components/confirm/info/shared/network-row/network-row.test.tsx": { + "Reselect: Input stability warnings": 2, + "Reselect: Identity function warnings": 5 + }, + "ui/components/multichain/receive-modal/receive-modal.test.js": { + "React: DOM nesting violations": 1 + }, + "ui/pages/confirmations/hooks/useSmartAccountActions.test.ts": { + "Reselect: Input stability warnings": 2, + "Reselect: Identity function warnings": 5 + }, + "ui/pages/confirmations/components/confirm/footer/shield-footer-agreement.test.tsx": { + "Reselect: Input stability warnings": 2, + "Reselect: Identity function warnings": 5 + }, + "ui/pages/confirmations/hooks/transactions/dapp-swap-comparison/useDappSwapComparisonMetrics.test.ts": { + "Reselect: Input stability warnings": 2, + "Reselect: Identity function warnings": 5 + }, + "ui/pages/confirmations/hooks/send/metrics/useRecipientSelectionMetrics.test.tsx": { + "error: Unexpected key \"state\" found in": 1 + }, + "ui/pages/swaps/create-new-swap/create-new-swap.test.js": { + "Reselect: Identity function warnings": 1, + "Reselect: Input stability warnings": 1 + }, + "ui/components/app/modals/turn-on-metamask-notifications/turn-on-metamask-notifications.test.tsx": { + "Reselect: Input stability warnings": 2 + }, + "ui/pages/confirmations/hooks/alerts/transactions/useGasFeeLowAlerts.test.tsx": { + "Reselect: Input stability warnings": 3, + "Reselect: Identity function warnings": 6, + "MetaMask: Background connection not initialized": 27 + }, + "ui/pages/confirmations/hooks/transactions/dapp-swap-comparison/useDappSwapUSDValues.test.ts": { + "Reselect: Input stability warnings": 2, + "Reselect: Identity function warnings": 5 + }, + "ui/pages/swaps/notification-page/notification-page.test.js": { + "React: PropTypes validation failures": 1 + }, + "ui/hooks/subscription/useSubscriptionPricing.test.ts": { + "React: Act warnings (component updates not wrapped)": 1 + }, + "app/scripts/lib/transaction/metrics.test.ts": { + "µWebSockets: Compatibility warnings": 1, + "µWebSockets: Fallback to Node implementation": 1 + }, + "ui/components/ui/update-nickname-popover/update-nickname-popover.test.js": { + "Reselect: Identity function warnings": 1, + "React: PropTypes validation failures": 2 + }, + "ui/components/multichain/asset-picker-amount/swappable-currency-input/swappable-currency-input.test.tsx": { + "React: Act warnings (component updates not wrapped)": 5 + }, + "ui/components/app/shield-entry-modal/shield-entry-modal.test.tsx": { + "Reselect: Identity function warnings": 1 + }, + "shared/modules/contract-utils.test.js": { + "µWebSockets: Compatibility warnings": 1, + "µWebSockets: Fallback to Node implementation": 1 + }, + "ui/components/multichain/network-list-item/network-list-item.test.js": { + "React: Act warnings (component updates not wrapped)": 1 + }, + "ui/components/app/transaction-list-item-details/transaction-list-item-details.component.test.js": { + "Reselect: Identity function warnings": 2, + "Reselect: Input stability warnings": 1 + }, + "ui/pages/confirmations/components/UI/send-hero/send-hero.test.tsx": { + "error: Warning: React does not recognize": 5, + "React: Act warnings (component updates not wrapped)": 7 + }, + "ui/components/app/modals/cancel-transaction/cancel-transaction-gas-fee/cancel-transaction-gas-fee.component.test.js": { + "Reselect: Identity function warnings": 1, + "Reselect: Input stability warnings": 1 + }, + "ui/pages/confirmations/hooks/useEIP7702Account.test.ts": { + "React: Act warnings (component updates not wrapped)": 2 + }, + "ui/pages/confirmations/hooks/send/useNameValidation.test.ts": { + "error: Unexpected key \"DNS\" found in": 1 + }, + "app/scripts/lib/migrator/index.test.js": { + "warn: Migration 139: typeof state.SelectedNetworkController is": 1, + "MetaMask: Migration state warnings": 1, + "warn: newState.NftController must be present": 1, + "error: Error: No INFURA_PROJECT_ID set!": 1, + "MetaMask: Migration skipped warnings": 2 + }, + "ui/components/app/modals/visit-support-data-consent-modal/visit-support-data.test.tsx": { + "React: Act warnings (component updates not wrapped)": 4 + }, + "ui/components/multichain-accounts/permissions/multichain-edit-accounts-page/multichain-edit-accounts-page.test.tsx": { + "Reselect: Identity function warnings": 2, + "Reselect: Input stability warnings": 1 + }, + "ui/components/ui/account-list/account-list.test.js": { + "Reselect: Identity function warnings": 2, + "Reselect: Input stability warnings": 1 + }, + "ui/components/app/snaps/snap-permissions-list/snap-permissions-list.test.js": { + "React: Missing key props in lists": 1 + }, + "ui/hooks/useDecodedTransactionData.test.ts": { + "React: Act warnings (component updates not wrapped)": 10, + "React: Act usage warnings (incorrect await)": 10, + "error: Unexpected keys \"data\", \"to\", \"chainId\"": 1 + }, + "ui/components/app/assets/defi-list/defi-list.test.tsx": { + "Reselect: Identity function warnings": 1, + "Reselect: Input stability warnings": 1 + }, + "ui/components/multichain/notifications-settings-box/notifications-settings-box.test.tsx": { + "React: componentWill* lifecycle deprecations": 1 + }, + "ui/pages/swaps/prepare-swap-page/view-quote-price-difference.test.js": { + "error: Error: Insufficient number of substitutions": 2 + }, + "ui/pages/confirmations/hooks/alerts/transactions/useResimulationAlert.test.ts": { + "Reselect: Input stability warnings": 2, + "Reselect: Identity function warnings": 5 + }, + "ui/pages/settings/security-tab/metametrics-toggle/metametrics-toggle.test.tsx": { + "React: componentWill* lifecycle deprecations": 1 + }, + "ui/components/multichain/pages/review-permissions-page/review-permissions-page.test.tsx": { + "Reselect: Identity function warnings": 1, + "Reselect: Input stability warnings": 1 + }, + "shared/modules/metametrics.test.ts": { + "µWebSockets: Compatibility warnings": 1, + "µWebSockets: Fallback to Node implementation": 1 + }, + "ui/components/multichain/create-eth-account/create-eth-account.test.js": { + "Reselect: Identity function warnings": 1, + "Reselect: Input stability warnings": 2 + }, + "ui/components/multichain-accounts/multichain-address-rows-list/multichain-address-rows-list.test.tsx": { + "Reselect: Identity function warnings": 2, + "Reselect: Input stability warnings": 1 + }, + "ui/selectors/confirm-transaction.test.js": { + "Reselect: Identity function warnings": 2 + }, + "ui/components/app/multi-rpc-edit-modal/network-list-item/network-list-item.test.tsx": { + "React: Act warnings (component updates not wrapped)": 1 + }, + "ui/components/multichain/activity-list-item/activity-list-item.test.js": { + "React: DOM nesting violations": 1 + }, + "ui/hooks/useAccountGroupForPermissions.test.ts": { + "Reselect: Identity function warnings": 1, + "Reselect: Input stability warnings": 1 + }, + "ui/selectors/nft.test.ts": { + "Reselect: Identity function warnings": 1 + }, + "ui/pages/settings/transaction-shield-tab/claims-form/claims-form.test.tsx": { + "Reselect: Identity function warnings": 1, + "MetaMask: Background connection not initialized": 4, + "React: Act warnings (component updates not wrapped)": 8 + }, + "ui/components/app/detected-token/detected-token-details/detected-token-details.test.js": { + "MetaMask: Background connection not initialized": 4 + }, + "ui/pages/settings/transaction-shield-tab/transaction-shield.test.tsx": { + "Reselect: Identity function warnings": 2, + "Reselect: Input stability warnings": 1, + "MetaMask: Background connection not initialized": 4, + "React: Act warnings (component updates not wrapped)": 11, + "React: DOM nesting violations": 1 + }, + "ui/pages/bridge/hooks/useSubmitBridgeTransaction.test.tsx": { + "Reselect: Identity function warnings": 2, + "Reselect: Input stability warnings": 1, + "MetaMask: Background connection not initialized": 12 + }, + "ui/pages/notifications-settings/notifications-settings-allow-notifications.test.tsx": { + "Reselect: Input stability warnings": 2, + "React: componentWill* lifecycle deprecations": 1 + }, + "ui/components/ui/nickname-popover/nickname-popover.test.js": { + "Reselect: Identity function warnings": 1 + }, + "ui/components/app/connected-status-indicator/connected-status-indicator.test.tsx": { + "Reselect: Identity function warnings": 1 + }, + "ui/components/app/assets/nfts/nft-grid/nft-grid.test.tsx": { + "Test errors: Uncaught Errors": 3, + "error: The above error occurred in": 3 + }, + "ui/components/multichain/product-tour-popover/product-tour-popover.test.js": { + "React: Act warnings (component updates not wrapped)": 3, + "React: PropTypes validation failures": 2 + }, + "ui/ducks/bridge/selectors.test.ts": { + "Reselect: Identity function warnings": 2 + }, + "ui/components/ui/slider/slider.component.test.js": { + "Material-UI: JSS warnings": 4 + }, + "ui/components/multichain/create-snap-account/create-snap-account.test.tsx": { + "Reselect: Identity function warnings": 1, + "Reselect: Input stability warnings": 2 + }, + "ui/ducks/confirm-transaction/confirm-transaction.duck.test.js": { + "Reselect: Identity function warnings": 2 + }, + "ui/components/app/modals/transaction-already-confirmed/transaction-already-confirmed.test.tsx": { + "Reselect: Identity function warnings": 2 + }, + "ui/components/multichain/connected-site-popover/connected-site-popover.test.tsx": { + "React: Act warnings (component updates not wrapped)": 4 + }, + "ui/components/app/snaps/copyable/copyable.test.js": { + "error: Warning: React does not recognize": 1 + }, + "app/scripts/controller-init/snaps/snap-controller-init.test.ts": { + "error: Error: A handler for SnapController:setClientActive": 2 + }, + "ui/ducks/metamask/metamask.test.js": { + "Reselect: Identity function warnings": 1, + "Reselect: Input stability warnings": 1 + }, + "ui/components/app/modals/new-account-modal/new-account-modal.test.tsx": { + "MetaMask: Background connection not initialized": 1 + }, + "ui/selectors/permissions.test.js": { + "Reselect: Identity function warnings": 1, + "Reselect: Input stability warnings": 1 + }, + "ui/pages/smart-transactions/smart-transaction-status-page/smart-transactions-status-page.test.tsx": { + "Reselect: Identity function warnings": 2 + }, + "ui/pages/notifications/notifications-list-turn-on-notifications.test.tsx": { + "Reselect: Input stability warnings": 2 + }, + "ui/pages/confirmations/components/transaction-detail/transaction-detail.component.test.js": { + "Reselect: Identity function warnings": 1, + "Reselect: Input stability warnings": 1 + }, + "ui/pages/confirmations/components/smart-transactions-banner-alert/smart-transactions-banner-alert.test.tsx": { + "Reselect: Identity function warnings": 1 + }, + "ui/selectors/selectors.test.js": { + "Reselect: Identity function warnings": 2, + "Reselect: Input stability warnings": 1 + }, + "ui/components/component-library/select-wrapper/select-wrapper.test.tsx": { + "React: Act warnings (component updates not wrapped)": 6 + }, + "ui/hooks/useMultichainAccountTotalFiatBalance.test.tsx": { + "MetaMask: Background connection not initialized": 8 + }, + "ui/pages/swaps/selected-token/selected-token.test.js": { + "React: PropTypes validation failures": 1 + }, + "ui/selectors/transactions.test.js": { + "Reselect: Identity function warnings": 6 + }, + "ui/hooks/gator-permissions/useRevokeGatorPermissionsMultiChain.test.tsx": { + "MetaMask: Background connection not initialized": 6 + }, + "ui/selectors/multichain.test.ts": { + "Reselect: Identity function warnings": 1, + "Reselect: Input stability warnings": 1 + }, + "ui/pages/confirmations/hooks/useGetTokenStandardAndDetails.test.ts": { + "React: Act warnings (component updates not wrapped)": 1 + }, + "app/scripts/lib/snap-keyring/snap-keyring.test.ts": { + "error: Error occurred while creating snap": 1 + }, + "ui/pages/confirmations/components/send/asset-filter-input/asset-filter-input.test.tsx": { + "error: Warning: React does not recognize": 7, + "error: Warning: Received `false` for a": 2 + }, + "app/scripts/controller-init/core-backend/backend-websocket-service-init.test.ts": { + "MetaMask: Backend WebSocket warnings": 1 + }, + "app/scripts/controllers/metametrics-controller.test.ts": { + "MetaMask: MetaMetrics invalid trait types": 4, + "warn: MetaMetricsController#_identify: No userTraits found": 1 + }, + "ui/selectors/multichain/networks.test.ts": { + "Reselect: Identity function warnings": 1, + "Reselect: Input stability warnings": 1 + }, + "ui/selectors/nonce-sorted-transactions-selector.test.js": { + "Reselect: Identity function warnings": 3 + }, + "ui/pages/confirmations/utils/confirm.test.ts": { + "error: Failed to detect if URL": 1 + }, + "ui/hooks/metamask-notifications/useCounter.test.tsx": { + "Reselect: Input stability warnings": 3 + }, + "ui/pages/confirmations/selectors/confirm.test.ts": { + "Reselect: Input stability warnings": 1, + "Reselect: Identity function warnings": 1 + }, + "shared/modules/shield/shield.test.ts": { + "error: Failed to get bearer token": 1 + }, + "shared/modules/bridge-utils/security-alerts-api.util.test.ts": { + "warn: Missing token alert translation for": 1 + }, + "ui/hooks/useNftCollectionsMetadata.test.ts": { + "React: Act warnings (component updates not wrapped)": 3 + }, + "ui/selectors/metamask-notifications/metamask-notifications.test.ts": { + "Reselect: Input stability warnings": 5 + }, + "app/scripts/migrations/165.test.ts": { + "MetaMask: Migration skipped warnings": 1 + }, + "ui/selectors/accounts.test.ts": { + "Reselect: Identity function warnings": 2, + "Reselect: Input stability warnings": 1 + }, + "app/scripts/detect-multiple-instances.test.js": { + "MetaMask: Multiple instances warning": 1 + }, + "ui/hooks/gator-permissions/useGatorPermissions.test.tsx": { + "React: Act warnings (component updates not wrapped)": 8 + }, + "app/scripts/migrations/157.test.ts": { + "error: Error: No INFURA_PROJECT_ID set!": 1, + "error: Error: Missing NetworkController state": 1, + "error: Error: Expected state.NetworkController to be": 1, + "error: Error: Missing state.NetworkController.networkConfigurations...": 1, + "error: Error: Expected state.NetworkController.networkConfiguration...": 1 + }, + "app/scripts/lib/snap-keyring/utils/isBlockedUrl.test.ts": { + "Test errors: Fetch failures": 2 + }, + "ui/selectors/gator-permissions/gator-permissions.test.ts": { + "MetaMask: Permission type warnings": 2 + }, + "app/scripts/migrations/163.test.ts": { + "MetaMask: Migration state warnings": 2 + }, + "ui/components/component-library/sensitive-text/sensitive-text.test.tsx": { + "warn: Invalid length provided: invalid. Falling": 1 + }, + "ui/components/app/assets/nfts/nft-grid/nft-grid-item-error-boundary.test.tsx": { + "Test errors: Uncaught Errors": 1, + "error: The above error occurred in": 1 + }, + "ui/hooks/useTokenInsightsData.test.ts": { + "React: Act warnings (component updates not wrapped)": 2 + }, + "app/scripts/lib/ComposableObservableStore.test.js": { + "error: Error: No metadata found for": 1 + }, + "app/scripts/migrations/120.5.test.ts": { + "error: Migration 120.5: Invalid SelectedNetworkController state": 1, + "error: Migration 120.5: Missing SelectedNetworkController domains": 1, + "error: Migration 120.5: Invalid SelectedNetworkController domains": 1, + "error: Error: Migration 120.5: Invalid NetworkController": 2, + "error: Error: Migration 120.5: Invalid networkConfigurationId": 1 + }, + "app/scripts/migrations/126.1.test.ts": { + "error: Migration 126.1: Invalid PhishingController.phishingLists st...": 1 + }, + "ui/hooks/useAsync.test.ts": { + "Test errors: Uncaught Errors": 2 + }, + "app/scripts/migrations/156.test.ts": { + "warn: newState.NftController must be present": 1 + }, + "app/scripts/migrations/167.test.ts": { + "MetaMask: Migration state warnings": 2 + }, + "app/scripts/migrations/120.2.test.ts": { + "error: Migration 120.2: Invalid SelectedNetworkController state": 4 + }, + "app/scripts/migrations/176.test.ts": { + "MetaMask: Migration skipped warnings": 3 + }, + "app/scripts/migrations/153.test.ts": { + "MetaMask: Migration state warnings": 3 + }, + "ui/pages/confirmations/hooks/transactions/dapp-swap-comparison/useDappSwapComparisonRewardText.test.ts": { + "Reselect: Input stability warnings": 2, + "Reselect: Identity function warnings": 5 + }, + "ui/pages/onboarding-flow/metametrics/metametrics.test.tsx": { + "React: Act usage warnings (incorrect await)": 4 + }, + "ui/pages/onboarding-flow/recovery-phrase/review-recovery-phrase.test.tsx": { + "React: Missing key props in lists": 1 + }, + "ui/pages/onboarding-flow/recovery-phrase/confirm-recovery-phrase.test.tsx": { + "React: Missing key props in lists": 1 + }, + "ui/pages/onboarding-flow/privacy-settings/privacy-settings.test.tsx": { + "Reselect: Input stability warnings": 1, + "error: Warning: Encountered two children with": 1, + "React: componentWill* lifecycle deprecations": 1, + "error: background[method] is not a function": 2 + }, + "ui/pages/onboarding-flow/create-password/create-password.test.tsx": { + "MetaMask: Background connection not initialized": 1 + }, + "ui/pages/onboarding-flow/import-srp/import-srp.test.tsx": { + "MetaMask: Background connection not initialized": 1 + }, + "ui/pages/onboarding-flow/onboarding-flow.test.tsx": { + "MetaMask: Background connection not initialized": 13, + "error: Error: Actions must be plain": 1, + "React: Missing key props in lists": 1, + "error: Warning: React does not recognize": 1 + }, + "ui/pages/onboarding-flow/welcome/welcome.test.tsx": { + "React: State updates on unmounted components": 1, + "MetaMask: Background connection not initialized": 14 + }, + "ui/pages/bridge/prepare/bridge-transaction-settings-modal.test.tsx": { + "Reselect: Identity function warnings": 3, + "Reselect: Input stability warnings": 1, + "MetaMask: Background connection not initialized": 980, + "error: Warning: You seem to have": 2, + "Test errors: Fetch failures": 36, + "React: Act warnings (component updates not wrapped)": 2 + }, + "ui/pages/bridge/hooks/useEnableMissingNetwork.test.ts": { + "MetaMask: Background connection not initialized": 1 + }, + "ui/pages/onboarding-flow/recovery-phrase/recovery-phrase-chips.test.tsx": { + "React: Missing key props in lists": 1 + }, + "ui/pages/onboarding-flow/creation-successful/creation-successful.test.tsx": { + "MetaMask: Background connection not initialized": 3 + }, + "ui/pages/confirmations/hooks/transactions/dapp-swap-comparison/useDappSwapCheck.test.ts": { + "Reselect: Input stability warnings": 2, + "Reselect: Identity function warnings": 5 + }, + "ui/pages/confirmations/hooks/transactions/dapp-swap-comparison/useDappSwapActions.test.ts": { + "Reselect: Input stability warnings": 2, + "Reselect: Identity function warnings": 5 + }, + "ui/components/app/rewards/onboarding/OnboardingIntroStep.test.tsx": { + "error: Warning: React does not recognize": 1 + } + }, + "generated": "2025-12-04T10:54:13.456Z", + "nodeVersion": "v24.11.1" +} diff --git a/test/jest/console-categorizer.js b/test/jest/console-categorizer.js new file mode 100644 index 000000000000..fdaf29b49d7d --- /dev/null +++ b/test/jest/console-categorizer.js @@ -0,0 +1,100 @@ +/** + * Shared console message categorization module. + * + * This module provides a unified way to categorize console messages using + * the same rules as jest-clean-console-reporter. This ensures consistency + * between: + * - Console output grouping (jest-clean-console-reporter) + * - Baseline tracking (console-baseline-reporter) + * + * Note: This file is intentionally JavaScript (not TypeScript) because Jest + * reporters and configuration files are traditionally JS. The main jest.config.js + * is also JavaScript. Converting to TypeScript would require additional build + * steps for Jest infrastructure files. + * + * @module console-categorizer + */ + +const unitRules = require('./console-reporter-rules-unit'); +const integrationRules = require('./console-reporter-rules-integration'); + +/** + * Categorize a console message using the provided rules. + * + * @param {string} type - Console message type (log, warn, error, etc.) + * @param {string} message - Console message text + * @param {Array} rules - Array of categorization rules + * @returns {string|null} Category name, or null if message should be ignored + */ +function categorizeWithRules(type, message, rules) { + for (const rule of rules) { + const { match, group } = rule; + + let isMatch = false; + + if (typeof match === 'function') { + // Function matcher: (message, level) => boolean + isMatch = match(message, type); + } else if (match instanceof RegExp) { + // RegExp matcher + isMatch = match.test(message); + } else if (typeof match === 'string') { + // String matcher (exact substring) + isMatch = message.includes(match); + } + + if (isMatch) { + // Return group name, or null to ignore + return group; + } + } + + // No rule matched - create a fallback category + return createFallbackCategory(type, message); +} + +/** + * Create a fallback category for uncategorized messages. + * + * @param {string} type - Console message type + * @param {string} message - Console message text + * @returns {string} Fallback category name + */ +function createFallbackCategory(type, message) { + // Use type and first few words for uncategorized messages + const firstLine = message.split('\n')[0]; + const firstWords = firstLine.split(' ').slice(0, 5).join(' '); + const truncated = + firstWords.length > 60 ? `${firstWords.substring(0, 60)}...` : firstWords; + return `${type}: ${truncated}`; +} + +/** + * Categorize a console message for unit tests. + * Uses rules from console-reporter-rules-unit.js. + * + * @param {string} type - Console message type (log, warn, error, etc.) + * @param {string} message - Console message text + * @returns {string|null} Category name, or null if message should be ignored + */ +function categorizeUnitTestMessage(type, message) { + return categorizeWithRules(type, message, unitRules); +} + +/** + * Categorize a console message for integration tests. + * Uses rules from console-reporter-rules-integration.js. + * + * @param {string} type - Console message type (log, warn, error, etc.) + * @param {string} message - Console message text + * @returns {string|null} Category name, or null if message should be ignored + */ +function categorizeIntegrationTestMessage(type, message) { + return categorizeWithRules(type, message, integrationRules); +} + +module.exports = { + categorizeUnitTestMessage, + categorizeIntegrationTestMessage, + createFallbackCategory, +};