diff --git a/packages/credential-provider-node/jest.config.integ.js b/packages/credential-provider-node/jest.config.integ.js deleted file mode 100644 index d09aba7398c7..000000000000 --- a/packages/credential-provider-node/jest.config.integ.js +++ /dev/null @@ -1,4 +0,0 @@ -module.exports = { - preset: "ts-jest", - testMatch: ["**/*.integ.spec.ts"], -}; diff --git a/packages/credential-provider-node/package.json b/packages/credential-provider-node/package.json index ef7ff13150cb..b0c51bc0ee5d 100644 --- a/packages/credential-provider-node/package.json +++ b/packages/credential-provider-node/package.json @@ -16,8 +16,9 @@ "build:types:downlevel": "downlevel-dts dist-types dist-types/ts3.4", "clean": "rimraf ./dist-* && rimraf *.tsbuildinfo", "test": "yarn g:vitest run", - "test:integration": "yarn g:jest -c jest.config.integ.js", - "test:watch": "yarn g:vitest watch" + "test:watch": "yarn g:vitest watch", + "test:integration": "yarn g:vitest run -c vitest.config.integ.mts", + "test:integration:watch": "yarn g:vitest watch -c vitest.config.integ.mts" }, "keywords": [ "aws", diff --git a/packages/credential-provider-node/src/credential-provider-node.integ.spec.ts b/packages/credential-provider-node/src/credential-provider-node.integ.spec.ts index 7353d322d392..59ca7c8f3007 100644 --- a/packages/credential-provider-node/src/credential-provider-node.integ.spec.ts +++ b/packages/credential-provider-node/src/credential-provider-node.integ.spec.ts @@ -5,29 +5,31 @@ import { HttpResponse } from "@smithy/protocol-http"; import type { SharedConfigInit, SourceProfileInit } from "@smithy/shared-ini-file-loader"; import type { HttpRequest, NodeHttpHandlerOptions, ParsedIniData, SharedConfigFiles } from "@smithy/types"; import { AdaptiveRetryStrategy, StandardRetryStrategy } from "@smithy/util-retry"; +import * as childProcess from "child_process"; import { PassThrough } from "stream"; +import { afterAll, afterEach, beforeAll, beforeEach, describe, expect, test as it, vi } from "vitest"; import { defaultProvider } from "./defaultProvider"; -jest.mock("fs", () => { - const actual = jest.requireActual("fs"); +vi.mock("fs", async () => { + const actual = (await vi.importActual("fs")) as typeof import("fs"); return { ...actual, - readFileSync(file: string, ...options: any[]) { + readFileSync: vi.fn((file: string, ...options: any[]) => { if (file === "token-filepath") { return "token-contents"; } return actual.readFileSync(file, ...options); - }, + }), }; }); let iniProfileData: ParsedIniData = null as any; -jest.mock("@smithy/shared-ini-file-loader", () => { - const actual = jest.requireActual("@smithy/shared-ini-file-loader"); +vi.mock("@smithy/shared-ini-file-loader", async () => { + const actual = await vi.importActual("@smithy/shared-ini-file-loader"); return { ...actual, - async loadSsoSessionData() { + loadSsoSessionData: vi.fn(async () => { return Object.entries(iniProfileData) .filter(([key]) => key.startsWith("sso-session.")) .reduce( @@ -37,29 +39,29 @@ jest.mock("@smithy/shared-ini-file-loader", () => { }), {} ); - }, - async parseKnownFiles(init: SourceProfileInit): Promise { + }), + parseKnownFiles: vi.fn(async (init: SourceProfileInit): Promise => { return iniProfileData; - }, - async loadSharedConfigFiles(init: SharedConfigInit): Promise { + }), + loadSharedConfigFiles: vi.fn(async (init: SharedConfigInit): Promise => { return { configFile: iniProfileData, credentialsFile: iniProfileData, }; - }, - async getSSOTokenFromFile() { + }), + getSSOTokenFromFile: vi.fn(async () => { return { accessToken: "mock_sso_token", expiresAt: "3000-01-01T00:00:00.000Z", }; - }, + }), }; }); const assumeRoleArns: string[] = []; -jest.mock("@smithy/node-http-handler", () => { - const actual = jest.requireActual("@smithy/node-http-handler"); +vi.mock("@smithy/node-http-handler", async () => { + const actual = await vi.importActual("@smithy/node-http-handler"); class MockNodeHttpHandler { static create(instanceOrOptions?: any) { @@ -68,7 +70,8 @@ jest.mock("@smithy/node-http-handler", () => { } return new MockNodeHttpHandler(); } - async handle(request: HttpRequest) { + + handle = vi.fn(async (request: HttpRequest) => { const body = new PassThrough({}); if (request.body?.includes("RoleArn=")) { @@ -165,11 +168,15 @@ jest.mock("@smithy/node-http-handler", () => { headers: {}, }), }; - } - updateHttpClientConfig(key: keyof NodeHttpHandlerOptions, value: NodeHttpHandlerOptions[typeof key]): void {} - httpHandlerConfigs(): NodeHttpHandlerOptions { + }); + + updateHttpClientConfig = vi.fn( + (key: keyof NodeHttpHandlerOptions, value: NodeHttpHandlerOptions[typeof key]): void => {} + ); + + httpHandlerConfigs = vi.fn((): NodeHttpHandlerOptions => { return null as any; - } + }); } return { @@ -178,11 +185,12 @@ jest.mock("@smithy/node-http-handler", () => { }; }); -jest.mock("child_process", () => { - const actual = jest.requireActual("child_process"); +vi.mock("child_process", async () => { + const actual = (await vi.importActual("child_process")) as typeof childProcess; + return { ...actual, - exec(bin: string, cb: (err: unknown, data: any) => void, ...args: any[]) { + exec: vi.fn((bin: string, cb: (err: unknown, data: any) => void, ...args: any[]) => { if (bin === "credential-process") { return cb(null, { stdout: JSON.stringify({ @@ -194,7 +202,7 @@ jest.mock("child_process", () => { }); } return actual.exec(bin, cb, ...args); - }, + }), }; }); @@ -271,8 +279,8 @@ describe("credential-provider-node integration test", () => { }); afterAll(async () => { - jest.clearAllMocks(); - jest.clearAllTimers(); + vi.clearAllMocks(); + vi.clearAllTimers(); }); describe("fromEnv", () => { @@ -570,7 +578,7 @@ describe("credential-provider-node integration test", () => { iniProfileData.credential_source_profile = { credential_source: "EcsContainer", }; - const spy = jest.spyOn(credentialProviderHttp, "fromHttp"); + const spy = vi.spyOn(credentialProviderHttp, "fromHttp"); sts = new STS({ region: "us-west-2", credentials: defaultProvider({ @@ -658,7 +666,7 @@ describe("credential-provider-node integration test", () => { role_arn: "ROLE_ARN_1", }; - const spy = jest.spyOn(credentialProviderHttp, "fromHttp"); + const spy = vi.spyOn(credentialProviderHttp, "fromHttp"); sts = new STS({ region: "us-west-2", credentials: defaultProvider({ @@ -710,7 +718,7 @@ describe("credential-provider-node integration test", () => { // This scenario tests the option of having no role_arn in this step of the chain. }; - const spy = jest.spyOn(credentialProviderHttp, "fromHttp"); + const spy = vi.spyOn(credentialProviderHttp, "fromHttp"); sts = new STS({ region: "us-west-2", credentials: defaultProvider({ @@ -805,7 +813,7 @@ describe("credential-provider-node integration test", () => { }); }); - xit("should use instance metadata unless IMDS is disabled", async () => { + it.skip("should use instance metadata unless IMDS is disabled", async () => { // TODO }); });