/* Copyright (c) 2023 The Brave Authors. All rights reserved. * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this file, * You can obtain one at https://mozilla.org/MPL/2.0/. */ // For a detailed explanation regarding each configuration property, visit: // https://jestjs.io/docs/en/configuration.html import fs from 'fs' import type { Config } from 'jest' import { createJsWithTsEsmPreset } from 'ts-jest' const crossPlatforms = ['mac', 'win'] const buildConfigs = ['Component', 'Static', 'Debug', 'Release'] const extraArchitectures = ['arm64', 'x86'] function getBuildOutputPathList(buildOutputRelativePath: string): string[] { return buildConfigs .reduce( (outDirs, outDir) => [ ...outDirs, outDir, ...crossPlatforms.map((platform) => `${platform}_${outDir}`), ], [], ) .reduce( (outDirs, outDir) => [ ...outDirs, outDir, ...extraArchitectures.map((arch) => `${outDir}_${arch}`), ], [], ) .map((outDir) => `/../out/${outDir}/${buildOutputRelativePath}`) } function getReporters() { if (process.env.TEAMCITY_VERSION !== undefined) { return [ [ '/tools/jest_teamcity_reporter/jest_teamcity_reporter.js', { 'suiteName': 'test-unit' }, ], ] } else { return ['default'] } } function getBuildConfig() { // Try to find the build config in any of the possible build directories const possiblePaths = getBuildOutputPathList('gen/brave/build_flags.json') for (const configPath of possiblePaths) { // Remove placeholder and resolve the actual path const actualPath = configPath.replace('', import.meta.dirname) if (fs.existsSync(actualPath)) { try { return JSON.parse(fs.readFileSync(actualPath, 'utf8')) } catch (e) { // Continue to next path } } } // Default to all features enabled if no config found return { enable_ai_chat: true, enable_brave_wallet: true, enable_email_aliases: true, } } const buildConfig = getBuildConfig() const jestConfig: Config = { ...createJsWithTsEsmPreset({ tsconfig: 'tsconfig-jest.json', useESM: true, }), testEnvironment: '/components/test/testEnvironment.ts', moduleFileExtensions: ['js', 'tsx', 'ts', 'json'], reporters: getReporters(), clearMocks: true, resetMocks: true, resetModules: true, coverageProvider: 'v8', collectCoverageFrom: [ '/build/commands/lib/*', '/components/**/**/*.ts', '/components/**/**/*.tsx', '!/components/definitions/*', '!/components/**/constants/*', '!/components/**/reducers/index.ts', '!/components/**/store.ts', '!/components/test/*', '!/build/commands/lib/start.js', '!/build/commands/lib/jsconfig.json', ], testMatch: [ '/**/*.test.{js,ts,tsx}', '/components/test/**/*_test.{ts,tsx}', ], testPathIgnorePatterns: [ '/build/commands/lib/test.js', '/build/rustup', '/third_party', '/tools/crates/vendor', ...(buildConfig.enable_ai_chat ? [] : ['/components/ai_chat']), ...(buildConfig.enable_brave_wallet ? [] : ['/components/brave_wallet_ui']), ...(buildConfig.enable_email_aliases ? [] : ['/components/email_aliases']), ], testTimeout: 30000, transformIgnorePatterns: [ // prevent jest from transforming itself // https://github.com/jestjs/jest/issues/9503#issuecomment-709041807 '/node_modules/@babel', '/node_modules/@jest', '/node_modules/jest-runtime', '/node_modules/lodash', 'signal-exit', 'is-typedarray', ], setupFilesAfterEnv: ['/components/test/testSetup.ts'], moduleNameMapper: { '\\.(jpg|jpeg|png|gif|eot|otf|svg|ttf|woff|woff2)$': '/components/test/fileMock.ts', '\\.(css|less|scss)$': 'identity-obj-proxy', '^\\$web-common\\/(.*)': '/components/common/$1', '^brave-ui$': '/node_modules/@brave/brave-ui', '^brave-ui\\/(.*)': '/node_modules/@brave/brave-ui/$1', '^\\$test-utils\\/(.*)': '/components/test/$1', // mocks for brave-wallet and brave-rewards proxies '\\/brave_rewards_api_proxy$': '/components/brave_wallet_ui/' + 'common/async/__mocks__/brave_rewards_api_proxy.ts', '\\/bridge$': '/components/brave_wallet_ui/common/async/__mocks__/bridge.ts', // TODO(https://github.com/brave/brave-browser/issues/54640): The ordering // here can get problematic for devs who have more than 1 build type at a // time, since if the file exists at the first path, it will be used for // Type analysis instead of the second path, even if it's more recent. // It can also break if CI or devs perform a build in a directory not known // by this list. // Instead, we should get the directory from config.js:outputDir. '^gen\\/(.*)': getBuildOutputPathList('gen/$1'), 'chrome://resources\\/(.*)': getBuildOutputPathList( 'gen/ui/webui/resources/tsc/$1', ), 'chrome://interstitials\\/(.*)': getBuildOutputPathList( 'gen/components/security_interstitials/core/$1', ), // workaround for https://github.com/LedgerHQ/ledger-live/issues/763 '@ledgerhq/devices/hid-framing': '/node_modules/@ledgerhq/devices/lib/hid-framing', }, } export default jestConfig