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)
+ })
+ }
+})