From 781344f7de7208f8b317084fc0ae048c906f6040 Mon Sep 17 00:00:00 2001 From: John Knox Date: Fri, 18 Oct 2019 07:16:15 -0700 Subject: [PATCH] Fix jest mocking in tests (#592) Summary: Pull Request resolved: https://github.com/facebook/flipper/pull/592 Finally we can join the 21st century and use `jest.mock` in tests! I'm enabling the ts-jest transform to `*/__tests__/*.tsx` files. This takes care of transforming the typescript, and preserves jest mock capabilities. I have left the existing custom transform on all other files, so they will continue to work as usual. Caveats: * Our existing custom transforms will no longer be applied in tests. * With our current suite this makes no difference. But bear in mind things like importing directly from 'flipper' instead of the actual files, won't work. However, I don't see this being a problem, as I think they'll only be needed inside the actual product code. Reviewed By: passy Differential Revision: D17978753 fbshipit-source-id: df7b312b5dd5592e4aa4f8df605f5952ea3158e9 --- package.json | 2 + src/__tests__/server.electron.tsx | 7 ++ src/chrome/__tests__/PluginInstaller.node.tsx | 9 ++- src/fb-stubs/__mocks__/Logger.tsx | 51 +++++++++++++ tsconfig.json | 1 + yarn.lock | 74 ++++++++++++++++--- 6 files changed, 131 insertions(+), 13 deletions(-) create mode 100644 src/fb-stubs/__mocks__/Logger.tsx diff --git a/package.json b/package.json index 29ba1e33f..99d4b96be 100644 --- a/package.json +++ b/package.json @@ -48,6 +48,7 @@ }, "jest": { "transform": { + "^.*__tests__/.*\\.tsx?$": "ts-jest", "\\.(js|tsx?)$": "/static/transforms/index.js" }, "setupFiles": [ @@ -100,6 +101,7 @@ "jest-fetch-mock": "^2.1.0", "prettier": "^1.18.2", "redux-mock-store": "^1.5.3", + "ts-jest": "^24.1.0", "typescript": "^3.6.2" }, "dependencies": { diff --git a/src/__tests__/server.electron.tsx b/src/__tests__/server.electron.tsx index b1273f852..ddfc0a8d3 100644 --- a/src/__tests__/server.electron.tsx +++ b/src/__tests__/server.electron.tsx @@ -7,6 +7,13 @@ * @format */ +jest.mock('../fb/Logger'); +try { + jest.mock('../fb/Logger'); +} catch { + // Allowed to fail when fb modules are not present. +} + import {init as initLogger} from '../fb-stubs/Logger'; import Server from '../server'; import reducers, {Store} from '../reducers/index'; diff --git a/src/chrome/__tests__/PluginInstaller.node.tsx b/src/chrome/__tests__/PluginInstaller.node.tsx index 4183b2f8a..67e9d72ed 100644 --- a/src/chrome/__tests__/PluginInstaller.node.tsx +++ b/src/chrome/__tests__/PluginInstaller.node.tsx @@ -7,11 +7,17 @@ * @format */ +jest.mock('../../fb-stubs/Logger'); +try { + jest.mock('../../fb/Logger'); +} catch { + // Allowed to fail when fb modules are not present. +} + import {default as PluginInstaller, PluginDefinition} from '../PluginInstaller'; import React from 'react'; import {render, waitForElement} from '@testing-library/react'; -import {init as initLogger} from '../../fb-stubs/Logger'; import configureStore from 'redux-mock-store'; const mockStore = configureStore([])({application: {sessionId: 'mysession'}}); @@ -31,7 +37,6 @@ const indexMock: algoliasearch.Index = ({ beforeEach(() => { indexMock.search = jest.fn(async () => SEARCH_RESULTS); - initLogger(mockStore as any, {isTest: true}); }); test('load PluginInstaller list', async () => { diff --git a/src/fb-stubs/__mocks__/Logger.tsx b/src/fb-stubs/__mocks__/Logger.tsx new file mode 100644 index 000000000..f6ee86300 --- /dev/null +++ b/src/fb-stubs/__mocks__/Logger.tsx @@ -0,0 +1,51 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @format + */ + +import {Store} from '../../reducers/index'; +import {getStringFromErrorLike} from '../../utils/errors'; +import {Args, Logger, TrackType} from '../../fb-interfaces/Logger'; + +export function extractError( + ...data: Array +): {message: string; error: Error} { + const message = data.map(getStringFromErrorLike).join(' '); + const error = data.find(e => e instanceof Error) || new Error(message); + return { + message, + error, + }; +} + +export class FBLogger implements Logger { + constructor(_store?: Store, _args?: Args) {} + + track(_type: TrackType, _event: string, _data?: any, _plugin?: string) {} + + trackTimeSince(_mark: string, _eventName?: string) {} + + info = (..._data: Array) => {}; + + warn = (..._data: Array) => {}; + + error = (..._data: Array) => {}; + + debug = (..._data: Array) => {}; + + getLogs(): Array { + return []; + } +} + +export function init(_store: Store, _args?: Args): Logger { + return new FBLogger(); +} + +export function getInstance(): Logger { + return new FBLogger(); +} diff --git a/tsconfig.json b/tsconfig.json index 263f15079..d62f46444 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -2,6 +2,7 @@ "compilerOptions": { "module": "system", "lib": ["es7", "dom", "es2017"], + "esModuleInterop": true, "target": "es6", "removeComments": true, "preserveConstEnums": true, diff --git a/yarn.lock b/yarn.lock index 96d8cc9a7..4f3bd79f4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2324,6 +2324,13 @@ browserslist@^4.6.0, browserslist@^4.6.2: electron-to-chromium "^1.3.191" node-releases "^1.1.25" +bs-logger@0.x: + version "0.2.6" + resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" + integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== + dependencies: + fast-json-stable-stringify "2.x" + bser@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.0.tgz#65fc784bf7f87c009b973c12db6546902fa9c7b5" @@ -2359,7 +2366,7 @@ buffer-fill@^1.0.0: resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" integrity sha1-+PeLdniYiO858gXNY39o5wISKyw= -buffer-from@^1.0.0: +buffer-from@1.x, buffer-from@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== @@ -2499,6 +2506,11 @@ camelcase@^3.0.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" integrity sha1-MvxLn82vhF/N9+c7uXysImHwqwo= +camelcase@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" + integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= + camelcase@^5.0.0, camelcase@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" @@ -4029,7 +4041,7 @@ fast-glob@^2.2.6: merge2 "^1.2.3" micromatch "^3.1.10" -fast-json-stable-stringify@^2.0.0: +fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= @@ -5808,6 +5820,13 @@ json-stringify-safe@~5.0.1: resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= +json5@2.x: + version "2.1.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.1.tgz#81b6cb04e9ba496f1c7005d07b4368a2638f90b6" + integrity sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ== + dependencies: + minimist "^1.2.0" + json5@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.0.tgz#e7a0c62c48285c628d20a10b85c89bb807c32850" @@ -6075,6 +6094,11 @@ lodash.isplainobject@^4.0.6: resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" integrity sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs= +lodash.memoize@4.x: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= + lodash.sortby@^4.7.0: version "4.7.0" resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" @@ -6138,6 +6162,11 @@ make-dir@^2.0.0, make-dir@^2.1.0: pify "^4.0.1" semver "^5.6.0" +make-error@1.x: + version "1.3.5" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.5.tgz#efe4e81f6db28cadd605c70f29c831b58ef776c8" + integrity sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g== + make-iterator@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/make-iterator/-/make-iterator-1.0.1.tgz#29b33f312aa8f547c4a5e490f56afcec99133ad6" @@ -6364,7 +6393,7 @@ mixin-deep@^1.2.0: for-in "^1.0.2" is-extendable "^1.0.1" -mkdirp@0.5.1, mkdirp@^0.5.0, mkdirp@^0.5.1: +mkdirp@0.5.1, mkdirp@0.x, mkdirp@^0.5.0, mkdirp@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= @@ -8034,6 +8063,13 @@ resolve@1.6.0: dependencies: path-parse "^1.0.5" +resolve@1.x, resolve@^1.12.0: + version "1.12.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.12.0.tgz#3fc644a35c84a48554609ff26ec52b66fa577df6" + integrity sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w== + dependencies: + path-parse "^1.0.6" + resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.11.0, resolve@^1.3.2, resolve@^1.4.0, resolve@^1.5.0: version "1.11.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.11.1.tgz#ea10d8110376982fef578df8fc30b9ac30a07a3e" @@ -8041,13 +8077,6 @@ resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.11.0, resolve@^1.3.2 dependencies: path-parse "^1.0.6" -resolve@^1.12.0: - version "1.12.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.12.0.tgz#3fc644a35c84a48554609ff26ec52b66fa577df6" - integrity sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w== - dependencies: - path-parse "^1.0.6" - responselike@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" @@ -8247,7 +8276,7 @@ semver-greatest-satisfied-range@^1.1.0: resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.0.tgz#790a7cf6fea5459bac96110b29b60412dc8ff96b" integrity sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA== -semver@^5.1.0: +semver@^5.1.0, semver@^5.5: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== @@ -9062,6 +9091,22 @@ truncate-utf8-bytes@^1.0.0: dependencies: utf8-byte-length "^1.0.1" +ts-jest@^24.1.0: + version "24.1.0" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-24.1.0.tgz#2eaa813271a2987b7e6c3fefbda196301c131734" + integrity sha512-HEGfrIEAZKfu1pkaxB9au17b1d9b56YZSqz5eCVE8mX68+5reOvlM93xGOzzCREIov9mdH7JBG+s0UyNAqr0tQ== + dependencies: + bs-logger "0.x" + buffer-from "1.x" + fast-json-stable-stringify "2.x" + json5 "2.x" + lodash.memoize "4.x" + make-error "1.x" + mkdirp "0.x" + resolve "1.x" + semver "^5.5" + yargs-parser "10.x" + tslib@^1.8.1, tslib@^1.9.0: version "1.10.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" @@ -9691,6 +9736,13 @@ yallist@^3.0.0, yallist@^3.0.3: resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9" integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A== +yargs-parser@10.x: + version "10.1.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8" + integrity sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ== + dependencies: + camelcase "^4.1.0" + yargs-parser@^11.1.1: version "11.1.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-11.1.1.tgz#879a0865973bca9f6bab5cbdf3b1c67ec7d3bcf4"