From 40ebfa8179b6061634d4e1aa85649987e597fec2 Mon Sep 17 00:00:00 2001 From: menduz Date: Fri, 9 Sep 2022 11:53:43 -0300 Subject: [PATCH] add spyComponents --- etc/test-helpers.api.md | 10 ++ package-lock.json | 184 +++++++++++++--------------- package.json | 2 +- src/index.ts | 39 ++++++ test/simple-smoke-test/jest.spec.ts | 39 ++++++ 5 files changed, 174 insertions(+), 100 deletions(-) diff --git a/etc/test-helpers.api.md b/etc/test-helpers.api.md index dad5bb0..56fc653 100644 --- a/etc/test-helpers.api.md +++ b/etc/test-helpers.api.md @@ -4,6 +4,8 @@ ```ts +/// + import { IConfigComponent } from '@well-known-components/interfaces'; import { IFetchComponent } from '@well-known-components/http-server'; import { Lifecycle } from '@well-known-components/interfaces'; @@ -24,12 +26,20 @@ export const defaultServerConfig: () => { HTTP_SERVER_PORT: string; }; +// @public @deprecated (undocumented) +export type SpiedInstance = { + [P in keyof TType]: Required[P] extends (...args: any[]) => any ? jest.SpyInstance[P]>, jest.ArgsType[P]>> : never; +}; + // @public export type TestArguments> = { components: Readonly; stubComponents: { readonly [T in keyof TestComponents]: sinon_2.SinonStubbedInstance; }; + spyComponents: { + readonly [T in keyof TestComponents]: SpiedInstance; + }; beforeStart(fn: BeforeStartFunction): void; }; diff --git a/package-lock.json b/package-lock.json index e992fcc..a3b6ea5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,7 +16,7 @@ "ts-jest": "^27.1.3" }, "devDependencies": { - "@microsoft/api-extractor": "^7.19.4", + "@microsoft/api-extractor": "^7.30.0", "@well-known-components/http-server": "^1.1.3", "@well-known-components/interfaces": "^1.1.2", "ts-node": "^10.4.0", @@ -857,43 +857,43 @@ } }, "node_modules/@microsoft/api-extractor": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.19.4.tgz", - "integrity": "sha512-iehC6YA3DGJvxTUaK7HUtQmP6hAQU07+Q/OR8TG4dVR6KpqCi9UPEVk8AgCvQkiK+6FbVEFQTx0qLuYk4EeuHg==", + "version": "7.30.0", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.30.0.tgz", + "integrity": "sha512-XmtvrW74SzGvv59cjNC6+TE13XbIm4qrKKZtveoFRNbKdyTR4eIqnLmPvh1fgfolSF+iKfXlHHsQJpcgwdNztA==", "dev": true, "dependencies": { - "@microsoft/api-extractor-model": "7.15.3", - "@microsoft/tsdoc": "0.13.2", - "@microsoft/tsdoc-config": "~0.15.2", - "@rushstack/node-core-library": "3.45.0", - "@rushstack/rig-package": "0.3.7", - "@rushstack/ts-command-line": "4.10.6", + "@microsoft/api-extractor-model": "7.24.0", + "@microsoft/tsdoc": "0.14.1", + "@microsoft/tsdoc-config": "~0.16.1", + "@rushstack/node-core-library": "3.51.1", + "@rushstack/rig-package": "0.3.14", + "@rushstack/ts-command-line": "4.12.2", "colors": "~1.2.1", "lodash": "~4.17.15", "resolve": "~1.17.0", "semver": "~7.3.0", "source-map": "~0.6.1", - "typescript": "~4.5.2" + "typescript": "~4.7.4" }, "bin": { "api-extractor": "bin/api-extractor" } }, "node_modules/@microsoft/api-extractor-model": { - "version": "7.15.3", - "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.15.3.tgz", - "integrity": "sha512-NkSjolmSI7NGvbdz0Y7kjQfdpD+j9E5CwXTxEyjDqxd10MI7GXV8DnAsQ57GFJcgHKgTjf2aUnYfMJ9w3aMicw==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.24.0.tgz", + "integrity": "sha512-lFzF5h+quTyVB7eaKJkqrbQRDGSkrHzXyF8iMVvHdlaNrodGeyhtQeBFDuRVvBXTW2ILBiOV6ZWwUM1eGKcD+A==", "dev": true, "dependencies": { - "@microsoft/tsdoc": "0.13.2", - "@microsoft/tsdoc-config": "~0.15.2", - "@rushstack/node-core-library": "3.45.0" + "@microsoft/tsdoc": "0.14.1", + "@microsoft/tsdoc-config": "~0.16.1", + "@rushstack/node-core-library": "3.51.1" } }, "node_modules/@microsoft/api-extractor/node_modules/typescript": { - "version": "4.5.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz", - "integrity": "sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==", + "version": "4.7.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", + "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -904,18 +904,18 @@ } }, "node_modules/@microsoft/tsdoc": { - "version": "0.13.2", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.13.2.tgz", - "integrity": "sha512-WrHvO8PDL8wd8T2+zBGKrMwVL5IyzR3ryWUsl0PXgEV0QHup4mTLi0QcATefGI6Gx9Anu7vthPyyyLpY0EpiQg==", + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.14.1.tgz", + "integrity": "sha512-6Wci+Tp3CgPt/B9B0a3J4s3yMgLNSku6w5TV6mN+61C71UqsRBv2FUibBf3tPGlNxebgPHMEUzKpb1ggE8KCKw==", "dev": true }, "node_modules/@microsoft/tsdoc-config": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.15.2.tgz", - "integrity": "sha512-mK19b2wJHSdNf8znXSMYVShAHktVr/ib0Ck2FA3lsVBSEhSI/TfXT7DJQkAYgcztTuwazGcg58ZjYdk0hTCVrA==", + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.16.1.tgz", + "integrity": "sha512-2RqkwiD4uN6MLnHFljqBlZIXlt/SaUT6cuogU1w2ARw4nKuuppSmR0+s+NC+7kXBQykd9zzu0P4HtBpZT5zBpQ==", "dev": true, "dependencies": { - "@microsoft/tsdoc": "0.13.2", + "@microsoft/tsdoc": "0.14.1", "ajv": "~6.12.6", "jju": "~1.4.0", "resolve": "~1.19.0" @@ -935,9 +935,9 @@ } }, "node_modules/@rushstack/node-core-library": { - "version": "3.45.0", - "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-3.45.0.tgz", - "integrity": "sha512-YMuIJl19vQT1+g/OU9mLY6T5ZBT9uDlmeXExDQACpGuxTJW+LHNbk/lRX+eCApQI2eLBlaL4U68r3kZlqwbdmw==", + "version": "3.51.1", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-3.51.1.tgz", + "integrity": "sha512-xLoUztvGpaT5CphDexDPt2WbBx8D68VS5tYOkwfr98p90y0f/wepgXlTA/q5MUeZGGucASiXKp5ysdD+GPYf9A==", "dev": true, "dependencies": { "@types/node": "12.20.24", @@ -947,7 +947,6 @@ "jju": "~1.4.0", "resolve": "~1.17.0", "semver": "~7.3.0", - "timsort": "~0.3.0", "z-schema": "~5.0.2" } }, @@ -958,9 +957,9 @@ "dev": true }, "node_modules/@rushstack/rig-package": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/@rushstack/rig-package/-/rig-package-0.3.7.tgz", - "integrity": "sha512-pzMsTSeTC8IiZ6EJLr53gGMvhT4oLWH+hxD7907cHyWuIUlEXFtu/2pK25vUQT13nKp5DJCWxXyYoGRk/h6rtA==", + "version": "0.3.14", + "resolved": "https://registry.npmjs.org/@rushstack/rig-package/-/rig-package-0.3.14.tgz", + "integrity": "sha512-Ic9EN3kWJCK6iOxEDtwED9nrM146zCDrQaUxbeGOF+q/VLZ/HNHPw+aLqrqmTl0ZT66Sf75Qk6OG+rySjTorvQ==", "dev": true, "dependencies": { "resolve": "~1.17.0", @@ -968,9 +967,9 @@ } }, "node_modules/@rushstack/ts-command-line": { - "version": "4.10.6", - "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.10.6.tgz", - "integrity": "sha512-Y3GkUag39sTIlukDg9mUp8MCHrrlJ27POrBNRQGc/uF+VVgX8M7zMzHch5zP6O1QVquWgD7Engdpn2piPYaS/g==", + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.12.2.tgz", + "integrity": "sha512-poBtnumLuWmwmhCEkVAgynWgtnF9Kygekxyp4qtQUSbBrkuyPQTL85c8Cva1YfoUpOdOXxezMAkUt0n5SNKGqw==", "dev": true, "dependencies": { "@types/argparse": "1.0.38", @@ -3540,7 +3539,7 @@ "node_modules/jju": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", - "integrity": "sha1-o6vicYryQaKykE+EpiWXDzia4yo=", + "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==", "dev": true }, "node_modules/js-tokens": { @@ -3639,7 +3638,7 @@ "node_modules/jsonfile": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "dev": true, "optionalDependencies": { "graceful-fs": "^4.1.6" @@ -3702,7 +3701,7 @@ "node_modules/lodash.isequal": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", "dev": true }, "node_modules/lodash.memoize": { @@ -4732,12 +4731,6 @@ "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz", "integrity": "sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==" }, - "node_modules/timsort": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", - "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=", - "dev": true - }, "node_modules/tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", @@ -5224,9 +5217,9 @@ } }, "node_modules/z-schema": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-5.0.2.tgz", - "integrity": "sha512-40TH47ukMHq5HrzkeVE40Ad7eIDKaRV2b+Qpi2prLc9X9eFJFzV7tMe5aH12e6avaSS/u5l653EQOv+J9PirPw==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-5.0.4.tgz", + "integrity": "sha512-gm/lx3hDzJNcLwseIeQVm1UcwhWIKpSB4NqH89pTBtFns4k/HDHudsICtvG05Bvw/Mv3jMyk700y5dadueLHdA==", "dev": true, "dependencies": { "lodash.get": "^4.4.2", @@ -5240,7 +5233,7 @@ "node": ">=8.0.0" }, "optionalDependencies": { - "commander": "^2.7.1" + "commander": "^2.20.3" } } }, @@ -5877,57 +5870,57 @@ } }, "@microsoft/api-extractor": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.19.4.tgz", - "integrity": "sha512-iehC6YA3DGJvxTUaK7HUtQmP6hAQU07+Q/OR8TG4dVR6KpqCi9UPEVk8AgCvQkiK+6FbVEFQTx0qLuYk4EeuHg==", + "version": "7.30.0", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.30.0.tgz", + "integrity": "sha512-XmtvrW74SzGvv59cjNC6+TE13XbIm4qrKKZtveoFRNbKdyTR4eIqnLmPvh1fgfolSF+iKfXlHHsQJpcgwdNztA==", "dev": true, "requires": { - "@microsoft/api-extractor-model": "7.15.3", - "@microsoft/tsdoc": "0.13.2", - "@microsoft/tsdoc-config": "~0.15.2", - "@rushstack/node-core-library": "3.45.0", - "@rushstack/rig-package": "0.3.7", - "@rushstack/ts-command-line": "4.10.6", + "@microsoft/api-extractor-model": "7.24.0", + "@microsoft/tsdoc": "0.14.1", + "@microsoft/tsdoc-config": "~0.16.1", + "@rushstack/node-core-library": "3.51.1", + "@rushstack/rig-package": "0.3.14", + "@rushstack/ts-command-line": "4.12.2", "colors": "~1.2.1", "lodash": "~4.17.15", "resolve": "~1.17.0", "semver": "~7.3.0", "source-map": "~0.6.1", - "typescript": "~4.5.2" + "typescript": "~4.7.4" }, "dependencies": { "typescript": { - "version": "4.5.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz", - "integrity": "sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==", + "version": "4.7.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", + "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", "dev": true } } }, "@microsoft/api-extractor-model": { - "version": "7.15.3", - "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.15.3.tgz", - "integrity": "sha512-NkSjolmSI7NGvbdz0Y7kjQfdpD+j9E5CwXTxEyjDqxd10MI7GXV8DnAsQ57GFJcgHKgTjf2aUnYfMJ9w3aMicw==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.24.0.tgz", + "integrity": "sha512-lFzF5h+quTyVB7eaKJkqrbQRDGSkrHzXyF8iMVvHdlaNrodGeyhtQeBFDuRVvBXTW2ILBiOV6ZWwUM1eGKcD+A==", "dev": true, "requires": { - "@microsoft/tsdoc": "0.13.2", - "@microsoft/tsdoc-config": "~0.15.2", - "@rushstack/node-core-library": "3.45.0" + "@microsoft/tsdoc": "0.14.1", + "@microsoft/tsdoc-config": "~0.16.1", + "@rushstack/node-core-library": "3.51.1" } }, "@microsoft/tsdoc": { - "version": "0.13.2", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.13.2.tgz", - "integrity": "sha512-WrHvO8PDL8wd8T2+zBGKrMwVL5IyzR3ryWUsl0PXgEV0QHup4mTLi0QcATefGI6Gx9Anu7vthPyyyLpY0EpiQg==", + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.14.1.tgz", + "integrity": "sha512-6Wci+Tp3CgPt/B9B0a3J4s3yMgLNSku6w5TV6mN+61C71UqsRBv2FUibBf3tPGlNxebgPHMEUzKpb1ggE8KCKw==", "dev": true }, "@microsoft/tsdoc-config": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.15.2.tgz", - "integrity": "sha512-mK19b2wJHSdNf8znXSMYVShAHktVr/ib0Ck2FA3lsVBSEhSI/TfXT7DJQkAYgcztTuwazGcg58ZjYdk0hTCVrA==", + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.16.1.tgz", + "integrity": "sha512-2RqkwiD4uN6MLnHFljqBlZIXlt/SaUT6cuogU1w2ARw4nKuuppSmR0+s+NC+7kXBQykd9zzu0P4HtBpZT5zBpQ==", "dev": true, "requires": { - "@microsoft/tsdoc": "0.13.2", + "@microsoft/tsdoc": "0.14.1", "ajv": "~6.12.6", "jju": "~1.4.0", "resolve": "~1.19.0" @@ -5946,9 +5939,9 @@ } }, "@rushstack/node-core-library": { - "version": "3.45.0", - "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-3.45.0.tgz", - "integrity": "sha512-YMuIJl19vQT1+g/OU9mLY6T5ZBT9uDlmeXExDQACpGuxTJW+LHNbk/lRX+eCApQI2eLBlaL4U68r3kZlqwbdmw==", + "version": "3.51.1", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-3.51.1.tgz", + "integrity": "sha512-xLoUztvGpaT5CphDexDPt2WbBx8D68VS5tYOkwfr98p90y0f/wepgXlTA/q5MUeZGGucASiXKp5ysdD+GPYf9A==", "dev": true, "requires": { "@types/node": "12.20.24", @@ -5958,7 +5951,6 @@ "jju": "~1.4.0", "resolve": "~1.17.0", "semver": "~7.3.0", - "timsort": "~0.3.0", "z-schema": "~5.0.2" }, "dependencies": { @@ -5971,9 +5963,9 @@ } }, "@rushstack/rig-package": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/@rushstack/rig-package/-/rig-package-0.3.7.tgz", - "integrity": "sha512-pzMsTSeTC8IiZ6EJLr53gGMvhT4oLWH+hxD7907cHyWuIUlEXFtu/2pK25vUQT13nKp5DJCWxXyYoGRk/h6rtA==", + "version": "0.3.14", + "resolved": "https://registry.npmjs.org/@rushstack/rig-package/-/rig-package-0.3.14.tgz", + "integrity": "sha512-Ic9EN3kWJCK6iOxEDtwED9nrM146zCDrQaUxbeGOF+q/VLZ/HNHPw+aLqrqmTl0ZT66Sf75Qk6OG+rySjTorvQ==", "dev": true, "requires": { "resolve": "~1.17.0", @@ -5981,9 +5973,9 @@ } }, "@rushstack/ts-command-line": { - "version": "4.10.6", - "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.10.6.tgz", - "integrity": "sha512-Y3GkUag39sTIlukDg9mUp8MCHrrlJ27POrBNRQGc/uF+VVgX8M7zMzHch5zP6O1QVquWgD7Engdpn2piPYaS/g==", + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.12.2.tgz", + "integrity": "sha512-poBtnumLuWmwmhCEkVAgynWgtnF9Kygekxyp4qtQUSbBrkuyPQTL85c8Cva1YfoUpOdOXxezMAkUt0n5SNKGqw==", "dev": true, "requires": { "@types/argparse": "1.0.38", @@ -8011,7 +8003,7 @@ "jju": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", - "integrity": "sha1-o6vicYryQaKykE+EpiWXDzia4yo=", + "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==", "dev": true }, "js-tokens": { @@ -8084,7 +8076,7 @@ "jsonfile": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "dev": true, "requires": { "graceful-fs": "^4.1.6" @@ -8135,7 +8127,7 @@ "lodash.isequal": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", "dev": true }, "lodash.memoize": { @@ -8913,12 +8905,6 @@ "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz", "integrity": "sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==" }, - "timsort": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", - "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=", - "dev": true - }, "tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", @@ -9249,12 +9235,12 @@ "devOptional": true }, "z-schema": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-5.0.2.tgz", - "integrity": "sha512-40TH47ukMHq5HrzkeVE40Ad7eIDKaRV2b+Qpi2prLc9X9eFJFzV7tMe5aH12e6avaSS/u5l653EQOv+J9PirPw==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-5.0.4.tgz", + "integrity": "sha512-gm/lx3hDzJNcLwseIeQVm1UcwhWIKpSB4NqH89pTBtFns4k/HDHudsICtvG05Bvw/Mv3jMyk700y5dadueLHdA==", "dev": true, "requires": { - "commander": "^2.7.1", + "commander": "^2.20.3", "lodash.get": "^4.4.2", "lodash.isequal": "^4.5.0", "validator": "^13.7.0" diff --git a/package.json b/package.json index 259b895..6e94332 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ }, "homepage": "https://github.com/well-known-components/test-helpers#readme", "devDependencies": { - "@microsoft/api-extractor": "^7.19.4", + "@microsoft/api-extractor": "^7.30.0", "@well-known-components/http-server": "^1.1.3", "@well-known-components/interfaces": "^1.1.2", "ts-node": "^10.4.0", diff --git a/src/index.ts b/src/index.ts index 9420ef9..fd6d706 100644 --- a/src/index.ts +++ b/src/index.ts @@ -11,6 +11,9 @@ export type TestArguments> = { stubComponents: { readonly [T in keyof TestComponents]: sinon.SinonStubbedInstance } + spyComponents: { + readonly [T in keyof TestComponents]: SpiedInstance + } /** * Functions to run before the Lifecycle helpers start the components' lifecycle @@ -35,6 +38,16 @@ if (!_beforeAll || !_afterAll) { throw new Error("Neither before or beforeAll are defined in the globalThis") } +/** + * @public + * @deprecated unstable + */ +export type SpiedInstance = { + [P in keyof TType]: Required[P] extends (...args: any[]) => any + ? jest.SpyInstance[P]>, jest.ArgsType[P]>> + : never +} + /** * Creates a test runner. Receives the same arguments as Lifecycle.run * @public @@ -47,6 +60,7 @@ export function createRunner>( let program: Lifecycle.ComponentBasedProgram let sandbox: sinon.SinonSandbox const stubComponentInstances = new Map>() + const spyComponentInstances = new Map>() function getComponent(key: string) { if (!program) throw new Error("Cannot get the components before the test program is initialized") @@ -64,6 +78,22 @@ export function createRunner>( return stubComponentInstances.get(key)! } + /** @deprecated unstable */ + function spyComponent(key: string): SpiedInstance { + if (!spyComponentInstances.has(key)) { + spyComponentInstances.set(key, spy(getComponent(key))) + } + return spyComponentInstances.get(key)! + } + + function spy(module: T): SpiedInstance { + const ret = {} as SpiedInstance + for (let key in module) { + ret[key as keyof T] = jest.spyOn(module, key as any) as any + } + return ret + } + const beforeStartFunctions: BeforeStartFunction[] = [] const testArgs: TestArguments = { @@ -83,6 +113,14 @@ export function createRunner>( }, } ) as any, + spyComponents: new Proxy( + {}, + { + get(obj, key) { + return spyComponent(key as any) + }, + } + ) as any, beforeStart(fn) { beforeStartFunctions.push(fn) }, @@ -102,6 +140,7 @@ export function createRunner>( sinon.reset() sinon.resetBehavior() jest.resetAllMocks() + spyComponentInstances.clear() }) afterEach(() => { diff --git a/test/simple-smoke-test/jest.spec.ts b/test/simple-smoke-test/jest.spec.ts index 6e35d94..e6f569c 100644 --- a/test/simple-smoke-test/jest.spec.ts +++ b/test/simple-smoke-test/jest.spec.ts @@ -84,3 +84,42 @@ test("mocking component B", ({ components }) => { }) } }) + + + +test("mocking component with spy", ({ components, spyComponents }) => { + // this should throw because we are at "test declaration stage" and components don't exist yet + expect(() => components.componentB.sum(1, 2)).toThrow( + "Cannot get the components before the test program is initialized" + ) + + it("tests without mock", async () => { + const { componentB } = components + expect(componentB.counter()).toEqual(0) + expect(componentB.sum(1, 2)).toEqual(3) + expect(componentB.counter()).toEqual(1) + }) + + it("same components instances should be used inside tests of the same run", async () => { + const { componentB } = components + expect(componentB.counter()).toEqual(1) + }) + if (typeof jest != "undefined") { + it("tests with mock", async () => { + const { componentB } = components + spyComponents.componentB.sum.mockImplementation((a, b) => { + return 4 + }) + expect(componentB.sum(1, 2)).toEqual(4) + expect(componentB.sum).toHaveBeenCalledTimes(1) + }) + it("tests with mock resets", async () => { + const { componentB } = components + spyComponents.componentB.sum.mockImplementation((a, b) => { + return 4 + }) + expect(componentB.sum(1, 2)).toEqual(4) + expect(componentB.sum).toHaveBeenCalledTimes(1) + }) + } +})