diff --git a/web/cashtab/package.json b/web/cashtab/package.json index bba8c2fdd..d3ee8e468 100644 --- a/web/cashtab/package.json +++ b/web/cashtab/package.json @@ -1,203 +1,205 @@ { "name": "cashtab", "version": "0.1.8", "private": true, "homepage": "https://cashtabapp.com/", "dependencies": { "@ant-design/dark-theme": "^1.0.3", "@ant-design/icons": "^4.2.2", "@fortawesome/fontawesome-free": "^5.15.1", "@psf/bch-js": "^3.9.1", "@svgr/webpack": "4.3.2", "@typescript-eslint/eslint-plugin": "^2.2.0", "@typescript-eslint/parser": "^2.2.0", "@zxing/library": "0.8.0", "antd": "^3.23.4", "babel-eslint": "10.0.3", "babel-jest": "^26.6.3", "babel-loader": "8.0.6", "babel-plugin-named-asset-import": "^0.3.4", "babel-preset-react-app": "^9.0.2", "big.js": "^5.2.2", "bignumber.js": "^9.0.0", "browser-image-compression": "^1.0.8", "camelcase": "^5.2.0", "case-sensitive-paths-webpack-plugin": "2.2.0", "core-util-is": "^1.0.2", "crypto-js": "^3.1.9-1", "css-loader": "2.1.1", "dotenv": "6.2.0", "dotenv-expand": "5.1.0", "eslint": "^6.1.0", "eslint-config-react-app": "^5.0.2", "eslint-loader": "3.0.0", "eslint-plugin-flowtype": "3.13.0", "eslint-plugin-import": "2.18.2", "eslint-plugin-jsx-a11y": "6.2.3", "eslint-plugin-react": "7.14.3", "eslint-plugin-react-hooks": "^1.6.1", "ethereum-blockies-base64": "^1.0.2", "fbt": "^0.16.0", "file-loader": "3.0.1", "fs-extra": "7.0.1", "gh-pages": "^2.1.1", "html-webpack-plugin": "4.0.0-beta.5", "identity-obj-proxy": "3.0.0", "is-wsl": "^1.1.0", "jdenticon": "^2.2.0", "jest": "^24.9.0", "jest-environment-jsdom-fourteen": "0.1.0", "jest-resolve": "24.9.0", "jest-watch-typeahead": "0.4.0", "lint-staged": "^9.4.2", "localforage": "^1.9.0", "lodash": "^4.17.20", "mini-css-extract-plugin": "0.8.0", "optimize-css-assets-webpack-plugin": "5.0.3", "pnp-webpack-plugin": "1.5.0", "postcss-flexbugs-fixes": "4.1.0", "postcss-loader": "3.0.0", "postcss-normalize": "7.0.1", "postcss-preset-env": "6.7.0", "postcss-safe-parser": "4.0.1", "prettier": "^1.18.2", "qrcode.react": "^1.0.0", "react": "^16.10.0", "react-app-polyfill": "^1.0.3", "react-copy-to-clipboard": "^5.0.1", "react-dev-utils": "^9.0.4", "react-device-detect": "^1.14.0", "react-dom": "^16.10.0", "react-ga": "^3.2.1", "react-image": "^4.0.3", "react-jdenticon": "0.0.8", "react-router": "^5.1.1", "react-router-dom": "^5.1.1", "react-swipeable": "^5.5.0", "resolve": "1.12.0", "resolve-url-loader": "3.1.0", "sass-loader": "^10.0.4", "semver": "6.3.0", "style-loader": "1.0.0", "styled-components": "^4.4.0", "terser-webpack-plugin": "1.4.1", "ts-pnp": "1.1.4", "url-loader": "2.1.0", "webpack": "4.40.2", "webpack-dev-server": "^3.11.0", "webpack-manifest-plugin": "2.0.4" }, "lint-staged": { "src/**/*.{js,jsx,ts,tsx,json,css,scss,md}": [ "prettier --write", "git add" ] }, "scripts": { "manifest-fbts": "NODE_ENV=production node node_modules/babel-plugin-fbt/bin/manifest --src src", "collect-fbts": "NODE_ENV=production node node_modules/babel-plugin-fbt/bin/collectFBT --pretty --manifest < .src_manifest.json > .source_strings.json", "translate-fbts": "NODE_ENV=production node node_modules/babel-plugin-fbt/bin/translate.js --pretty --translations translations/*.json --jenkins > src/translatedFbts.json", "translate-fbts-single-file": "NODE_ENV=production node node_modules/babel-plugin-fbt/bin/translate.js --pretty --jenkins --stdin < translation_input.json > src/translatedFbts.json", "clean-fbts": "rm .enum_manifest.json .src_manifest.json .source_strings.json src/translatedFbts.json 2&> /dev/null || exit 0", "fbt-generate-translations": "NODE_ENV=production node node_modules/fbt-generate-translations --locales src/i18n/locales.js --multi-files translations", "fbt-generate-translations-single-file": "NODE_ENV=production node node_modules/fbt-generate-translations --locales src/i18n/locales.js", "prepare-fbts": "NODE_ENV=production npm run manifest-fbts && npm run collect-fbts && npm run fbt-generate-translations && npm run translate-fbts", "prestart": "npm run prepare-fbts", "prebuild": "npm run prepare-fbts", "start": "node scripts/start.js", "build": "node scripts/build.js", "extension": "./scripts/extension.sh", "predeploy": "npm run build", "test": "node scripts/test.js", - "test:coverage": "npm run test --coverage --watchAll=false", + "test:coverage": "CI=true npm run test --coverage", "debug": "node --inspect-brk=9229 scripts/start.js" }, "eslintConfig": { "extends": "react-app" }, "browserslist": { "production": [ ">0.2%", "not dead", "not op_mini all" ], "development": [ "last 1 chrome version", "last 1 firefox version", "last 1 safari version" ] }, "jest": { "roots": [ "/src" ], "collectCoverageFrom": [ "src/**/*.{js,jsx,ts,tsx}", "!src/**/*.d.ts" ], "coverageThreshold": { "global": { "branches": 15, "functions": 15, "lines": 15, "statements": 15 } }, "setupFiles": [ "react-app-polyfill/jsdom" ], - "setupFilesAfterEnv": [], + "setupFilesAfterEnv": [ + "/scripts/testSetup.js" + ], "testMatch": [ "/src/**/__tests__/**/*.{js,jsx,ts,tsx}", "/src/**/*.{spec,test}.{js,jsx,ts,tsx}" ], "testEnvironment": "jest-environment-jsdom-fourteen", "transform": { "^.+\\.(js|jsx|ts|tsx)$": "/node_modules/babel-jest", "^.+\\.css$": "/config/jest/cssTransform.js", "^(?!.*\\.(js|jsx|ts|tsx|css|json)$)": "/config/jest/fileTransform.js" }, "transformIgnorePatterns": [ "[/\\\\]node_modules[/\\\\].+\\.(js|jsx|ts|tsx)$", "^.+\\.module\\.(css|sass|scss)$" ], "modulePaths": [], "moduleNameMapper": { "^react-native$": "react-native-web", "^.+\\.module\\.(css|sass|scss)$": "identity-obj-proxy" }, "moduleFileExtensions": [ "web.js", "js", "web.ts", "ts", "web.tsx", "tsx", "json", "web.jsx", "jsx", "node" ], "watchPlugins": [ "jest-watch-typeahead/filename", "jest-watch-typeahead/testname" ] }, "babel": { "presets": [ "react-app" ] }, "devDependencies": { "@babel/core": "^7.6.0", "@babel/node": "^7.12.6", "@testing-library/react": "^11.1.0", "babel-plugin-fbt": "^0.16.0", "babel-plugin-fbt-runtime": "^0.9.12", "fbt-generate-translations": "^0.0.4", "less": "^3.10.3", "less-loader": "^5.0.0", "react-test-renderer": "^17.0.0", "workbox-webpack-plugin": "^4.3.1" } } diff --git a/web/cashtab/scripts/testSetup.js b/web/cashtab/scripts/testSetup.js new file mode 100644 index 000000000..66493f52d --- /dev/null +++ b/web/cashtab/scripts/testSetup.js @@ -0,0 +1,58 @@ +const util = require('util'); + +jasmine.getEnv().addReporter({ + specStarted: result => (jasmine.currentTest = result), + specDone: result => (jasmine.currentTest = result), +}); + +let consoleMessageBackup = []; + +function moveConsoleMessagesToBackup(text, logger) { + try { + throw new Error('Getting Stack Trace from previous Error'); + } catch (err) { + let trace = err.stack.split('\n'); + trace.shift(); // removes Error: stacktrace + trace.shift(); // removes moveConsoleMessagesToBackup() call from the "throw" command + trace.shift(); // removes console logger call in the console override + consoleMessageBackup.push({ + logger: logger, + payload: text, + stacktrace: trace.join('\n'), + }); + } +} + +const orig = console; +global.console = { + ...console, + log: text => moveConsoleMessagesToBackup(text, orig.log), + error: text => moveConsoleMessagesToBackup(text, orig.error), + warn: text => moveConsoleMessagesToBackup(text, orig.warn), + info: text => moveConsoleMessagesToBackup(text, orig.info), + debug: text => moveConsoleMessagesToBackup(text, orig.debug), +}; + +global.afterEach(() => { + let isFailedTest = true; + if ( + jasmine && + jasmine.currentTest && + Array.isArray(jasmine.currentTest.failedExpectations) + ) { + isFailedTest = jasmine.currentTest.failedExpectations.length > 0; + } + + if (isFailedTest) { + consoleMessageBackup.forEach(msg => { + if ( + typeof msg.payload === 'object' || + typeof msg.payload === 'function' + ) { + msg.payload = util.inspect(msg.payload, false, null, true); + } + msg.logger.call(msg.logger, msg.payload + '\n' + msg.stacktrace); + }); + } + consoleMessageBackup = []; +});