From 392665330d5781cdcc51332fd8d7bfb3b391f809 Mon Sep 17 00:00:00 2001 From: Chase Coalwell <782571+srchase@users.noreply.github.com> Date: Fri, 16 Jun 2023 17:05:35 -0600 Subject: [PATCH] chore(packages): consolidate middleware integ tests --- .../jest.config.integ.js | 4 - .../package.json | 3 +- .../jest.config.integ.js | 4 - .../middleware-content-length/package.json | 3 +- .../middleware-endpoint/jest.config.integ.js | 4 - packages/middleware-endpoint/package.json | 3 +- .../middleware-retry/jest.config.integ.js | 4 - packages/middleware-retry/package.json | 3 +- .../middleware-serde/jest.config.integ.js | 4 - packages/middleware-serde/package.json | 3 +- .../{readme.md => README.md} | 0 private/aws-client-retry-test/README.md | 10 ++ private/aws-client-retry-test/package.json | 7 +- private/aws-middleware-test/CHANGELOG.md | 4 + private/aws-middleware-test/jest.config.js | 5 + private/aws-middleware-test/package.json | 67 ++++++++++ .../readme.md | 4 +- .../middleware-apply-body-checksum.spec.ts | 2 +- .../src/middleware-content-length.spec.ts | 2 +- .../src/middleware-endpoint.spec.ts | 2 +- .../src/middleware-retry.spec.ts | 2 +- .../src/middleware-serde.spec.ts | 2 +- private/aws-middleware-test/tsconfig.cjs.json | 6 + private/aws-middleware-test/tsconfig.es.json | 8 ++ private/aws-middleware-test/tsconfig.json | 13 ++ .../aws-middleware-test/tsconfig.types.json | 10 ++ private/aws-util-test/src/index.d.ts | 1 + private/aws-util-test/src/index.js | 1 + .../src/requests/test-http-handler.d.ts | 65 ++++++++++ .../src/requests/test-http-handler.js | 117 ++++++++++++++++++ 30 files changed, 324 insertions(+), 39 deletions(-) delete mode 100644 packages/middleware-apply-body-checksum/jest.config.integ.js delete mode 100644 packages/middleware-content-length/jest.config.integ.js delete mode 100644 packages/middleware-endpoint/jest.config.integ.js delete mode 100644 packages/middleware-retry/jest.config.integ.js delete mode 100644 packages/middleware-serde/jest.config.integ.js rename private/aws-client-api-test/{readme.md => README.md} (100%) create mode 100644 private/aws-client-retry-test/README.md create mode 100644 private/aws-middleware-test/CHANGELOG.md create mode 100644 private/aws-middleware-test/jest.config.js create mode 100644 private/aws-middleware-test/package.json rename private/{aws-client-retry-test => aws-middleware-test}/readme.md (86%) rename packages/middleware-apply-body-checksum/src/middleware-apply-body-checksum.integ.spec.ts => private/aws-middleware-test/src/middleware-apply-body-checksum.spec.ts (93%) rename packages/middleware-content-length/src/middleware-content-length.integ.spec.ts => private/aws-middleware-test/src/middleware-content-length.spec.ts (96%) rename packages/middleware-endpoint/src/middleware-endpoint.integ.spec.ts => private/aws-middleware-test/src/middleware-endpoint.spec.ts (94%) rename packages/middleware-retry/src/middleware-retry.integ.spec.ts => private/aws-middleware-test/src/middleware-retry.spec.ts (90%) rename packages/middleware-serde/src/middleware-serde.integ.spec.ts => private/aws-middleware-test/src/middleware-serde.spec.ts (98%) create mode 100644 private/aws-middleware-test/tsconfig.cjs.json create mode 100644 private/aws-middleware-test/tsconfig.es.json create mode 100644 private/aws-middleware-test/tsconfig.json create mode 100644 private/aws-middleware-test/tsconfig.types.json create mode 100644 private/aws-util-test/src/index.d.ts create mode 100644 private/aws-util-test/src/index.js create mode 100644 private/aws-util-test/src/requests/test-http-handler.d.ts create mode 100644 private/aws-util-test/src/requests/test-http-handler.js diff --git a/packages/middleware-apply-body-checksum/jest.config.integ.js b/packages/middleware-apply-body-checksum/jest.config.integ.js deleted file mode 100644 index d09aba7398c72..0000000000000 --- a/packages/middleware-apply-body-checksum/jest.config.integ.js +++ /dev/null @@ -1,4 +0,0 @@ -module.exports = { - preset: "ts-jest", - testMatch: ["**/*.integ.spec.ts"], -}; diff --git a/packages/middleware-apply-body-checksum/package.json b/packages/middleware-apply-body-checksum/package.json index 08b5944e62145..0fb13196018b7 100644 --- a/packages/middleware-apply-body-checksum/package.json +++ b/packages/middleware-apply-body-checksum/package.json @@ -9,8 +9,7 @@ "build:types": "tsc -p tsconfig.types.json", "build:types:downlevel": "downlevel-dts dist-types dist-types/ts3.4", "clean": "rimraf ./dist-* && rimraf *.tsbuildinfo", - "test": "jest --coverage", - "test:integration": "jest --config jest.config.integ.js" + "test": "jest --coverage" }, "main": "./dist-cjs/index.js", "module": "./dist-es/index.js", diff --git a/packages/middleware-content-length/jest.config.integ.js b/packages/middleware-content-length/jest.config.integ.js deleted file mode 100644 index d09aba7398c72..0000000000000 --- a/packages/middleware-content-length/jest.config.integ.js +++ /dev/null @@ -1,4 +0,0 @@ -module.exports = { - preset: "ts-jest", - testMatch: ["**/*.integ.spec.ts"], -}; diff --git a/packages/middleware-content-length/package.json b/packages/middleware-content-length/package.json index f94083983e51d..fe932b331c07e 100644 --- a/packages/middleware-content-length/package.json +++ b/packages/middleware-content-length/package.json @@ -9,8 +9,7 @@ "build:types": "tsc -p tsconfig.types.json", "build:types:downlevel": "downlevel-dts dist-types dist-types/ts3.4", "clean": "rimraf ./dist-* && rimraf *.tsbuildinfo", - "test": "exit 0", - "test:integration": "jest --config jest.config.integ.js" + "test": "exit 0" }, "main": "./dist-cjs/index.js", "module": "./dist-es/index.js", diff --git a/packages/middleware-endpoint/jest.config.integ.js b/packages/middleware-endpoint/jest.config.integ.js deleted file mode 100644 index d09aba7398c72..0000000000000 --- a/packages/middleware-endpoint/jest.config.integ.js +++ /dev/null @@ -1,4 +0,0 @@ -module.exports = { - preset: "ts-jest", - testMatch: ["**/*.integ.spec.ts"], -}; diff --git a/packages/middleware-endpoint/package.json b/packages/middleware-endpoint/package.json index 950ebd4091b56..0039575fec61b 100644 --- a/packages/middleware-endpoint/package.json +++ b/packages/middleware-endpoint/package.json @@ -9,8 +9,7 @@ "build:types": "tsc -p tsconfig.types.json", "build:types:downlevel": "downlevel-dts dist-types dist-types/ts3.4", "clean": "rimraf ./dist-* && rimraf *.tsbuildinfo", - "test": "jest --passWithNoTests", - "test:integration": "jest -c jest.config.integ.js" + "test": "jest --passWithNoTests" }, "main": "./dist-cjs/index.js", "module": "./dist-es/index.js", diff --git a/packages/middleware-retry/jest.config.integ.js b/packages/middleware-retry/jest.config.integ.js deleted file mode 100644 index d09aba7398c72..0000000000000 --- a/packages/middleware-retry/jest.config.integ.js +++ /dev/null @@ -1,4 +0,0 @@ -module.exports = { - preset: "ts-jest", - testMatch: ["**/*.integ.spec.ts"], -}; diff --git a/packages/middleware-retry/package.json b/packages/middleware-retry/package.json index b5127c9635f4b..3b7d277479666 100644 --- a/packages/middleware-retry/package.json +++ b/packages/middleware-retry/package.json @@ -10,8 +10,7 @@ "build:types:downlevel": "downlevel-dts dist-types dist-types/ts3.4", "clean": "rimraf ./dist-* && rimraf *.tsbuildinfo", "extract:docs": "api-extractor run --local", - "test": "jest", - "test:integration": "jest -c jest.config.integ.js" + "test": "jest" }, "main": "./dist-cjs/index.js", "module": "./dist-es/index.js", diff --git a/packages/middleware-serde/jest.config.integ.js b/packages/middleware-serde/jest.config.integ.js deleted file mode 100644 index d09aba7398c72..0000000000000 --- a/packages/middleware-serde/jest.config.integ.js +++ /dev/null @@ -1,4 +0,0 @@ -module.exports = { - preset: "ts-jest", - testMatch: ["**/*.integ.spec.ts"], -}; diff --git a/packages/middleware-serde/package.json b/packages/middleware-serde/package.json index ac0ec7554a6ba..fccd22f476475 100644 --- a/packages/middleware-serde/package.json +++ b/packages/middleware-serde/package.json @@ -9,8 +9,7 @@ "build:types": "tsc -p tsconfig.types.json", "build:types:downlevel": "downlevel-dts dist-types dist-types/ts3.4", "clean": "rimraf ./dist-* && rimraf *.tsbuildinfo", - "test": "jest", - "test:integration": "jest -c jest.config.integ.js" + "test": "jest" }, "main": "./dist-cjs/index.js", "module": "./dist-es/index.js", diff --git a/private/aws-client-api-test/readme.md b/private/aws-client-api-test/README.md similarity index 100% rename from private/aws-client-api-test/readme.md rename to private/aws-client-api-test/README.md diff --git a/private/aws-client-retry-test/README.md b/private/aws-client-retry-test/README.md new file mode 100644 index 0000000000000..063e1e67f6a2f --- /dev/null +++ b/private/aws-client-retry-test/README.md @@ -0,0 +1,10 @@ +# @aws-sdk/aws-client-retry-test + +This is not a runtime or published package. + +This is a test spec. + +The purpose of this package is to perform integration tests on the retry-middleware. + +If tests in this package fail, the author should either fix their changes such that the API contract +is maintained, or appropriately announce and safely deprecate the interfaces affected by incoming changes. diff --git a/private/aws-client-retry-test/package.json b/private/aws-client-retry-test/package.json index ac229d76b1105..b78d438b64968 100644 --- a/private/aws-client-retry-test/package.json +++ b/private/aws-client-retry-test/package.json @@ -17,7 +17,10 @@ "module": "./dist-es/index.js", "sideEffects": false, "dependencies": { - "@aws-sdk/client-xray": "*", + "@aws-sdk/client-s3": "*", + "@aws-sdk/util-retry": "*", + "@smithy/protocol-http": "*", + "@smithy/types": "*", "tslib": "^2.5.0" }, "devDependencies": { @@ -55,6 +58,6 @@ "repository": { "type": "git", "url": "https://github.com/aws/aws-sdk-js-v3.git", - "directory": "private/aws-client-api-test" + "directory": "private/aws-client-retry-test" } } diff --git a/private/aws-middleware-test/CHANGELOG.md b/private/aws-middleware-test/CHANGELOG.md new file mode 100644 index 0000000000000..e4d87c4d45c45 --- /dev/null +++ b/private/aws-middleware-test/CHANGELOG.md @@ -0,0 +1,4 @@ +# Change Log + +All notable changes to this project will be documented in this file. +See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. diff --git a/private/aws-middleware-test/jest.config.js b/private/aws-middleware-test/jest.config.js new file mode 100644 index 0000000000000..a8d1c2e499123 --- /dev/null +++ b/private/aws-middleware-test/jest.config.js @@ -0,0 +1,5 @@ +const base = require("../../jest.config.base.js"); + +module.exports = { + ...base, +}; diff --git a/private/aws-middleware-test/package.json b/private/aws-middleware-test/package.json new file mode 100644 index 0000000000000..24a5c1e93de5f --- /dev/null +++ b/private/aws-middleware-test/package.json @@ -0,0 +1,67 @@ +{ + "name": "@aws-sdk/aws-middleware-test", + "description": "Integration test suite for AWS middleware", + "version": "3.0.0", + "scripts": { + "build": "concurrently 'yarn:build:cjs' 'yarn:build:es' 'yarn:build:types'", + "build:cjs": "tsc -p tsconfig.cjs.json", + "build:es": "tsc -p tsconfig.es.json", + "build:include:deps": "lerna run --scope $npm_package_name --include-dependencies build", + "build:types": "tsc -p tsconfig.types.json", + "build:types:downlevel": "downlevel-dts dist-types dist-types/ts3.4", + "clean": "rimraf ./dist-* && rimraf *.tsbuildinfo", + "test": "jest --coverage --passWithNoTests" + }, + "main": "./dist-cjs/index.js", + "types": "./dist-types/index.d.ts", + "module": "./dist-es/index.js", + "sideEffects": false, + "dependencies": { + "@aws-sdk/client-accessanalyzer": "*", + "@aws-sdk/client-ec2": "*", + "@aws-sdk/client-lambda": "*", + "@aws-sdk/client-s3": "*", + "@aws-sdk/client-s3-control": "*", + "@aws-sdk/client-sagemaker": "*", + "@aws-sdk/client-sagemaker-runtime": "*", + "@aws-sdk/client-xray": "*", + "tslib": "^2.5.0" + }, + "devDependencies": { + "@tsconfig/node14": "1.0.3", + "@types/node": "^12.7.5", + "concurrently": "7.0.0", + "downlevel-dts": "0.10.1", + "typedoc": "0.23.23", + "typescript": "~4.9.5" + }, + "overrides": { + "typedoc": { + "typescript": "~4.9.5" + } + }, + "engines": { + "node": ">=14.0.0" + }, + "typesVersions": { + "<4.0": { + "dist-types/*": [ + "dist-types/ts3.4/*" + ] + } + }, + "files": [ + "dist-*/**" + ], + "author": { + "name": "AWS SDK for JavaScript Team", + "url": "https://aws.amazon.com/javascript/" + }, + "license": "Apache-2.0", + "private": true, + "repository": { + "type": "git", + "url": "https://github.com/aws/aws-sdk-js-v3.git", + "directory": "private/aws-middleware-test" + } +} diff --git a/private/aws-client-retry-test/readme.md b/private/aws-middleware-test/readme.md similarity index 86% rename from private/aws-client-retry-test/readme.md rename to private/aws-middleware-test/readme.md index ffa7676aed832..e80b0e0945212 100644 --- a/private/aws-client-retry-test/readme.md +++ b/private/aws-middleware-test/readme.md @@ -1,10 +1,10 @@ -# @aws-sdk/aws-client-api-test +# @aws-sdk/aws-middleware-test This is not a runtime or published package. This is a test spec. -The purpose of this package is to perform integration tests on the retry-middleware. +The purpose of this package is to perform integration tests on the AWS middleware. If tests in this package fail, the author should either fix their changes such that the API contract is maintained, or appropriately announce and safely deprecate the interfaces affected by incoming changes. diff --git a/packages/middleware-apply-body-checksum/src/middleware-apply-body-checksum.integ.spec.ts b/private/aws-middleware-test/src/middleware-apply-body-checksum.spec.ts similarity index 93% rename from packages/middleware-apply-body-checksum/src/middleware-apply-body-checksum.integ.spec.ts rename to private/aws-middleware-test/src/middleware-apply-body-checksum.spec.ts index 5e5fa92eba834..f913246e2045b 100644 --- a/packages/middleware-apply-body-checksum/src/middleware-apply-body-checksum.integ.spec.ts +++ b/private/aws-middleware-test/src/middleware-apply-body-checksum.spec.ts @@ -1,6 +1,6 @@ import { S3Control } from "@aws-sdk/client-s3-control"; -import { requireRequestsFrom } from "../../../private/aws-util-test/src"; +import { requireRequestsFrom } from "../../aws-util-test/src"; describe("middleware-apply-body-checksum", () => { describe(S3Control.name, () => { diff --git a/packages/middleware-content-length/src/middleware-content-length.integ.spec.ts b/private/aws-middleware-test/src/middleware-content-length.spec.ts similarity index 96% rename from packages/middleware-content-length/src/middleware-content-length.integ.spec.ts rename to private/aws-middleware-test/src/middleware-content-length.spec.ts index e4849e9ffa9df..095a48acc9763 100644 --- a/packages/middleware-content-length/src/middleware-content-length.integ.spec.ts +++ b/private/aws-middleware-test/src/middleware-content-length.spec.ts @@ -2,7 +2,7 @@ import { AccessAnalyzer } from "@aws-sdk/client-accessanalyzer"; import { S3 } from "@aws-sdk/client-s3"; import { XRay } from "@aws-sdk/client-xray"; -import { requireRequestsFrom } from "../../../private/aws-util-test/src"; +import { requireRequestsFrom } from "../../aws-util-test/src"; describe("middleware-content-length", () => { describe(AccessAnalyzer.name, () => { diff --git a/packages/middleware-endpoint/src/middleware-endpoint.integ.spec.ts b/private/aws-middleware-test/src/middleware-endpoint.spec.ts similarity index 94% rename from packages/middleware-endpoint/src/middleware-endpoint.integ.spec.ts rename to private/aws-middleware-test/src/middleware-endpoint.spec.ts index 911cdefec91c3..fd35effa31d49 100644 --- a/packages/middleware-endpoint/src/middleware-endpoint.integ.spec.ts +++ b/private/aws-middleware-test/src/middleware-endpoint.spec.ts @@ -1,7 +1,7 @@ import { S3 } from "@aws-sdk/client-s3"; import { S3Control } from "@aws-sdk/client-s3-control"; -import { requireRequestsFrom } from "../../../private/aws-util-test/src"; +import { requireRequestsFrom } from "../../aws-util-test/src"; describe("middleware-endpoint", () => { // these are token examples because most endpoint diff --git a/packages/middleware-retry/src/middleware-retry.integ.spec.ts b/private/aws-middleware-test/src/middleware-retry.spec.ts similarity index 90% rename from packages/middleware-retry/src/middleware-retry.integ.spec.ts rename to private/aws-middleware-test/src/middleware-retry.spec.ts index 2c568ff6de5e2..f22880ffee54b 100644 --- a/packages/middleware-retry/src/middleware-retry.integ.spec.ts +++ b/private/aws-middleware-test/src/middleware-retry.spec.ts @@ -1,6 +1,6 @@ import { Lambda } from "@aws-sdk/client-lambda"; -import { requireRequestsFrom } from "../../../private/aws-util-test/src"; +import { requireRequestsFrom } from "../../aws-util-test/src"; describe("middleware-retry", () => { describe(Lambda.name, () => { diff --git a/packages/middleware-serde/src/middleware-serde.integ.spec.ts b/private/aws-middleware-test/src/middleware-serde.spec.ts similarity index 98% rename from packages/middleware-serde/src/middleware-serde.integ.spec.ts rename to private/aws-middleware-test/src/middleware-serde.spec.ts index 49a98d87f0c02..88f476cf556a4 100644 --- a/packages/middleware-serde/src/middleware-serde.integ.spec.ts +++ b/private/aws-middleware-test/src/middleware-serde.spec.ts @@ -3,7 +3,7 @@ import { S3 } from "@aws-sdk/client-s3"; import { SageMaker } from "@aws-sdk/client-sagemaker"; import { SageMakerRuntime } from "@aws-sdk/client-sagemaker-runtime"; -import { requireRequestsFrom } from "../../../private/aws-util-test/src"; +import { requireRequestsFrom } from "../../aws-util-test/src"; describe("middleware-serde", () => { describe(S3.name, () => { diff --git a/private/aws-middleware-test/tsconfig.cjs.json b/private/aws-middleware-test/tsconfig.cjs.json new file mode 100644 index 0000000000000..3567d85ba8460 --- /dev/null +++ b/private/aws-middleware-test/tsconfig.cjs.json @@ -0,0 +1,6 @@ +{ + "extends": "./tsconfig", + "compilerOptions": { + "outDir": "dist-cjs" + } +} diff --git a/private/aws-middleware-test/tsconfig.es.json b/private/aws-middleware-test/tsconfig.es.json new file mode 100644 index 0000000000000..809f57bde65e6 --- /dev/null +++ b/private/aws-middleware-test/tsconfig.es.json @@ -0,0 +1,8 @@ +{ + "extends": "./tsconfig", + "compilerOptions": { + "lib": ["dom"], + "module": "esnext", + "outDir": "dist-es" + } +} diff --git a/private/aws-middleware-test/tsconfig.json b/private/aws-middleware-test/tsconfig.json new file mode 100644 index 0000000000000..344909de21289 --- /dev/null +++ b/private/aws-middleware-test/tsconfig.json @@ -0,0 +1,13 @@ +{ + "extends": "@tsconfig/node14/tsconfig.json", + "compilerOptions": { + "downlevelIteration": true, + "importHelpers": true, + "incremental": true, + "removeComments": true, + "resolveJsonModule": true, + "rootDir": "src", + "useUnknownInCatchVariables": false + }, + "exclude": ["test/"] +} diff --git a/private/aws-middleware-test/tsconfig.types.json b/private/aws-middleware-test/tsconfig.types.json new file mode 100644 index 0000000000000..4c3dfa7b3d25f --- /dev/null +++ b/private/aws-middleware-test/tsconfig.types.json @@ -0,0 +1,10 @@ +{ + "extends": "./tsconfig", + "compilerOptions": { + "removeComments": false, + "declaration": true, + "declarationDir": "dist-types", + "emitDeclarationOnly": true + }, + "exclude": ["test/**/*", "dist-types/**/*"] +} diff --git a/private/aws-util-test/src/index.d.ts b/private/aws-util-test/src/index.d.ts new file mode 100644 index 0000000000000..b85d6584258a9 --- /dev/null +++ b/private/aws-util-test/src/index.d.ts @@ -0,0 +1 @@ +export * from "./requests/test-http-handler"; diff --git a/private/aws-util-test/src/index.js b/private/aws-util-test/src/index.js new file mode 100644 index 0000000000000..b85d6584258a9 --- /dev/null +++ b/private/aws-util-test/src/index.js @@ -0,0 +1 @@ +export * from "./requests/test-http-handler"; diff --git a/private/aws-util-test/src/requests/test-http-handler.d.ts b/private/aws-util-test/src/requests/test-http-handler.d.ts new file mode 100644 index 0000000000000..9cb102994b3fc --- /dev/null +++ b/private/aws-util-test/src/requests/test-http-handler.d.ts @@ -0,0 +1,65 @@ +import { HttpHandler, HttpRequest, HttpResponse } from "@aws-sdk/protocol-http"; +import { Client, HttpHandlerOptions, RequestHandlerOutput } from "@aws-sdk/types"; +/** + * Instructs {@link TestHttpHandler} how to match the handled request and the expected request. + * @internal + */ +export type Matcher = string | number | boolean | RegExp | null | undefined | ((value: any) => void); +/** + * @internal + */ +export type HttpRequestMatcher = { + protocol?: Matcher; + hostname?: Matcher; + port?: Matcher; + path?: Matcher; + query?: Record | Map; + headers?: Record | Map; + body?: Matcher; + method?: Matcher; + log?: boolean; +}; +/** + * Supplied to test clients to assert correct requests. + * @internal + */ +export declare class TestHttpHandler implements HttpHandler { + readonly matcher: HttpRequestMatcher; + private static WATCHER; + private originalSend?; + private originalRequestHandler?; + private client?; + private assertions; + constructor(matcher: HttpRequestMatcher); + /** + * @param client - to watch for requests. + * @param matcher - optional override of this instance's matchers. + * + * Temporarily hooks the client.send call to check the outgoing request. + */ + watch(client: Client, matcher?: HttpRequestMatcher): void; + /** + * @throws TestHttpHandlerSuccess to indicate success (only way to control it). + * @throws Error any other exception to indicate failure. + */ + handle(request: HttpRequest, handlerOptions?: HttpHandlerOptions): Promise>; + destroy(): Promise; + private check; + private checkAll; +} +/** + * This is used as an interrupt signal for success. + * It does not indicate a true error. + * + * @internal + */ +export declare class TestHttpHandlerSuccess extends Error { + static readonly ID: unique symbol; + readonly id: symbol; +} +/** + * @internal + */ +export declare const requireRequestsFrom: (client: Client) => { + toMatch(matcher: HttpRequestMatcher): void; +}; diff --git a/private/aws-util-test/src/requests/test-http-handler.js b/private/aws-util-test/src/requests/test-http-handler.js new file mode 100644 index 0000000000000..d7c0bb057ecc4 --- /dev/null +++ b/private/aws-util-test/src/requests/test-http-handler.js @@ -0,0 +1,117 @@ +export class TestHttpHandler { + constructor(matcher) { + this.matcher = matcher; + this.assertions = 0; + } + watch(client, matcher = this.matcher) { + this.client = client; + this.originalRequestHandler = client.config.originalRequestHandler; + client.config.credentials = async () => ({ + accessKeyId: "MOCK_ACCESS_KEY_ID", + secretAccessKey: "MOCK_SECRET_ACCESS_KEY_ID", + }); + client.config.requestHandler = new TestHttpHandler(matcher); + if (!client[TestHttpHandler.WATCHER]) { + client[TestHttpHandler.WATCHER] = true; + const originalSend = (this.originalSend = client.send); + client.send = async function (...args) { + return originalSend.apply(client, args).catch((e) => { + if (e.id === TestHttpHandlerSuccess.ID) { + } else { + throw e; + } + }); + }; + } + } + async handle(request, handlerOptions) { + const m = this.matcher; + if (m.log) { + console.log(request); + } + this.check(m.protocol, request.protocol); + this.check(m.hostname, request.hostname); + this.check(m.port, request.port); + this.check(m.path, request.path); + this.checkAll(m.query, request.query); + this.checkAll(m.headers, request.headers); + this.check(m.body, request.body); + this.check(m.method, request.method); + if (this.assertions === 0) { + throw new Error("Request handled with no assertions, empty matcher?"); + } + throw new TestHttpHandlerSuccess(); + } + async destroy() { + this.client.config.requestHandler = this.originalRequestHandler; + this.client.send = this.originalSend; + } + check(matcher, observed) { + if (matcher === undefined) { + return; + } + switch (typeof matcher) { + case "string": + if (matcher.startsWith("/") && matcher.endsWith("/")) { + expect(String(observed)).toMatch(new RegExp(matcher)); + } else { + expect(observed).toEqual(matcher); + } + break; + case "number": + case "bigint": + case "boolean": + expect(observed).toEqual(matcher); + break; + case "object": + if (matcher instanceof RegExp) { + expect(String(observed)).toMatch(matcher); + } + break; + case "function": + matcher(observed); + break; + default: + throw new Error("Matcher did not create assertion"); + } + this.assertions++; + } + checkAll(matchers, observed) { + if (matchers == null) { + return; + } + let key; + for (const [_key, matcher] of matchers instanceof Map ? matchers : Object.entries(matchers)) { + key = _key; + if (typeof key === "string") { + if (key.startsWith("/") && key.endsWith("/")) { + key = new RegExp(key); + } else { + this.check(matcher, observed[key]); + } + } + if (key instanceof RegExp) { + for (const [observedKey, observedValue] of Object.entries(observed)) { + if (key.test(observedKey)) { + this.check(matcher, observedValue); + } + } + } + } + } +} +TestHttpHandler.WATCHER = Symbol("TestHttpHandler_WATCHER"); +export class TestHttpHandlerSuccess extends Error { + constructor() { + super(...arguments); + this.id = TestHttpHandlerSuccess.ID; + } +} +TestHttpHandlerSuccess.ID = Symbol("TestHttpHandlerSuccess"); +export const requireRequestsFrom = (client) => { + return { + toMatch(matcher) { + return new TestHttpHandler(matcher).watch(client); + }, + }; +};