/* * Copyright (C) 2022 - present Instructure, Inc. * * This file is part of Canvas. * * Canvas is free software: you can redistribute it and/or modify it under * the terms of the GNU Affero General Public License as published by the Free * Software Foundation, version 3 of the License. * * Canvas is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR * A PARTICULAR PURPOSE. See the GNU Affero General Public License for more * details. * * You should have received a copy of the GNU Affero General Public License along * with this program. If not, see . */ const {defaults} = require('jest-config') const {swc} = require('./ui-build/webpack/webpack.rules') const esModules = ['chai', 'mime', 'react-dnd', 'dnd-core', '@react-dnd', 'graphql-request'].join( '|', ) const baseSetupFilesAfterEnv = ['/jest/stubInstUi.js', '@testing-library/jest-dom'] const setupFilesAfterEnv = process.env.LOG_PLAYGROUND_URL_ON_FAILURE ? baseSetupFilesAfterEnv.concat(['/jest/logPlaygroundURLOnFailure.js']) : baseSetupFilesAfterEnv module.exports = { randomize: true, testRunner: process.env.LOG_PLAYGROUND_URL_ON_FAILURE && 'jest-circus/runner', moduleNameMapper: { '\\.svg$': '/jest/imageMock.js', 'node_modules-version-of-backbone': require.resolve('backbone'), 'node_modules-version-of-react-modal': require.resolve('react-modal'), '^Backbone$': '/public/javascripts/Backbone.js', // jest can't import the icons '@instructure/ui-icons/es/svg': '/packages/canvas-rce/src/rce/__tests__/_mockIcons.js', // mock the tinymce-react Editor react component '@tinymce/tinymce-react': '/packages/canvas-rce/src/rce/__mocks__/tinymceReact.jsx', 'decimal.js/decimal.mjs': 'decimal.js/decimal.js', // https://github.com/ai/nanoid/issues/363 '^nanoid(/(.*)|$)': 'nanoid$1', '\\.(css)$': '/jest/styleMock.js', 'crypto-es': '/packages/canvas-rce/src/rce/__mocks__/_mockCryptoEs.ts', '@instructure/studio-player': '/packages/canvas-rce/src/rce/__mocks__/_mockStudioPlayer.js', }, roots: ['/ui', 'public/javascripts'], moduleDirectories: ['public/javascripts', 'node_modules'], reporters: [ 'default', [ 'jest-junit', { suiteName: 'Jest Tests', outputDirectory: process.env.TEST_RESULT_OUTPUT_DIR || './coverage-js/junit-reports', outputName: 'jest.xml', addFileAttribute: 'true', stripAnsi: true, }, ], ], setupFiles: [ 'jest-localstorage-mock', 'jest-canvas-mock', '/jest/jest-setup.js', '/jest/punycodeWarningFilter.js', ], setupFilesAfterEnv: setupFilesAfterEnv, testMatch: ['**/__tests__/**/?(*.)(spec|test).[jt]s?(x)'], coverageDirectory: '/coverage-jest/', // skip flaky timeout tests from coverage until they can be addressed // Related JIRA tickets for the skipped coverage tests; // k5_dashboard: LS-2243 collectCoverageFrom: [ '**/__tests__/**/?(*.)(spec|test).[jt]s?(x)', '!/ui/features/k5_dashboard/react/__tests__/k5DashboardPlanner.test.js', ], moduleFileExtensions: [...defaults.moduleFileExtensions, 'coffee', 'handlebars', 'yml'], restoreMocks: true, testEnvironment: process.env.LOG_PLAYGROUND_URL_ON_FAILURE ? '/jest/environmentWrapper.js' : 'jest-fixed-jsdom', transformIgnorePatterns: [`/node_modules/(?!${esModules})`], transform: { '\\.handlebars$': '/jest/handlebarsTransformer.js', '\\.graphql$': '/jest/rawLoader.js', '^.+\\.(j|t)s?$': [ '@swc/jest', { jsc: swc[0].use.options.jsc, }, ], '^.+\\.(j|t)sx?$': [ '@swc/jest', { jsc: { ...swc[1].use.options.jsc, transform: { ...swc[1].use.options.jsc.transform, react: { ...swc[1].use.options.jsc.transform.react, runtime: 'automatic', // These are `process.env.NODE_ENV === 'development'` in the webpack config // but Jest doesn't set that env var until after this file is loaded, so // we need to set it manually here. development: false, refresh: false, }, }, }, }, ], }, extensionsToTreatAsEsm: ['.jsx'], testEnvironmentOptions: { // https://github.com/mswjs/examples/blob/main/examples/with-jest/jest.config.ts#L20 customExportConditions: [''], }, testTimeout: 10000, }