
Research
/Security News
10 npm Typosquatted Packages Deploy Multi-Stage Credential Harvester
Socket researchers found 10 typosquatted npm packages that auto-run on install, show fake CAPTCHAs, fingerprint by IP, and deploy a credential stealer.
aws-sdk-client-mock-vitest
Advanced tools
This module adds custom matchers to verfiy calls to your AWS Client Mock. It was heavily inspired by aws-sdk-client-mock-jest.
You develop code that makes use of the AWS SDK for JavaScript v3. You are already writing tests for it through the great aws-sdk-client-mock package. You also want to ensure that your actual code performs certain calls against your AWS Client Mocks. While there is aws-sdk-client-mock-jest you prefer vitest.
You can use this module to use expect extensions for vitest to ensure certain commands have been called on your AWS clients.
npm install --save-dev aws-sdk-client-mock-vitest
You must register the new matchers explicity (think about putting this to a setup file). Feel free to only extend the matchers you are intending to use
/*
you may want to put the following into a file tests/setup.ts
and then specify your vite.config.ts as such
import { defineConfig } from "vitest/config";
export default defineConfig({
test: {
setupFiles: ["tests/setup.ts"],
},
});
to add the custom mat chers before each test run
*/
import { expect } from "vitest";
import {
toReceiveCommandTimes,
toHaveReceivedCommandTimes,
toReceiveCommandOnce,
toHaveReceivedCommandOnce,
toReceiveCommand,
toHaveReceivedCommand,
toReceiveCommandWith,
toHaveReceivedCommandWith,
toReceiveNthCommandWith,
toHaveReceivedNthCommandWith,
toReceiveLastCommandWith,
toHaveReceivedLastCommandWith,
toReceiveAnyCommand,
toHaveReceivedAnyCommand,
} from "aws-sdk-client-mock-vitest";
expect.extend({
toReceiveCommandTimes,
toHaveReceivedCommandTimes,
toReceiveCommandOnce,
toHaveReceivedCommandOnce,
toReceiveCommand,
toHaveReceivedCommand,
toReceiveCommandWith,
toHaveReceivedCommandWith,
toReceiveNthCommandWith,
toHaveReceivedNthCommandWith,
toReceiveLastCommandWith,
toHaveReceivedLastCommandWith,
toReceiveAnyCommand,
toHaveReceivedAnyCommand,
});
In case you are using typescript, create a vitest.d.ts file with the following content
// tests/vitest.d.ts
import "vitest";
import { CustomMatcher } from "aws-sdk-client-mock-vitest";
declare module "vitest" {
interface Assertion<T = any> extends CustomMatcher<T> {}
interface AsymmetricMatchersContaining extends CustomMatcher {}
}
If you get the following error in your tests
Error: Invalid Chai property: toHaveReceivedCommandWith
Then your probably forgot to run expect.extend with the matcher you are using in your test (see above)
Lets assume you have code that retrieves a secret from the AWS Secrets Manager
// src/main.ts
import {
SecretsManagerClient,
GetSecretValueCommand,
} from "@aws-sdk/client-secrets-manager";
export async function readSecret(secretId: string): Promise<string> {
const client = new SecretsManagerClient({});
const command = new GetSecretValueCommand({ SecretId: secretId });
const response = await client.send(command);
if (response.SecretString) {
return response.SecretString;
}
throw new Error("Unable to read the secret");
}
You can test this with vite without doing any network requests thanks to
aws-sdk-client-mock
// tests/main.test.ts
import { describe, it, expect } from "vitest";
import { mockClient } from "aws-sdk-client-mock";
import {
GetSecretValueCommand,
SecretsManagerClient,
} from "@aws-sdk/client-secrets-manager";
import { readSecret } from "../src/main";
const smMock = mockClient(SecretsManagerClient);
describe("readSecret", () => {
it("should return the secret value", async () => {
/* Setup our mock. In this test the secret will always be secr3t */
smMock.on(GetSecretValueCommand).resolves({ SecretString: "secr3t" });
const result = await readSecret("foo");
expect(result).toBe("secr3t");
// We have not verified that we actually interacted with our
// Secret Manager correcty
});
});
But we may want to actually inspect our mock client to verify that we actually have sent a specific command. We can do this by changing our testfile and registering custom matchers.
// tests/main.test.ts
import { describe, it, expect } from "vitest";
import { mockClient } from "aws-sdk-client-mock";
import {
GetSecretValueCommand,
SecretsManagerClient,
} from "@aws-sdk/client-secrets-manager";
import {
CustomMatcher,
toHaveReceivedCommandWith,
} from "aws-sdk-client-mock-vitest";
/* you can also run this in setupTests, see above */
expect.extend({ toHaveReceivedCommandWith });
/* You may want to put this in some vitest.d.ts, see above */
declare module "vitest" {
interface Assertion<T = any> extends CustomMatcher<T> {}
interface AsymmetricMatchersContaining extends CustomMatcher {}
}
import { readSecret } from "../src/main";
const smMock = mockClient(SecretsManagerClient);
describe("readSecret", () => {
it("should read it", async () => {
smMock.on(GetSecretValueCommand).resolves({ SecretString: "secr3t" });
const result = await readSecret("foo");
expect(result).toBe("secr3t");
/* Ensure we use the inut of the function to fetch the correct secret */
expect(smMock).toHaveReceivedCommandWith(GetSecretValueCommand, {
SecretId: "foo",
});
});
});
In order to run tests locally, execute the following
npm ci
npm run test:coverage
If you get an ERR_INSPECTOR_NOT_AVAILABLE error, make sure your nodejs is compiled with
inspector support. Otherwise run npm run test to skip code coverage
I would like to thank Maciej Radzikowski for the awesome aws-sdk-client-mock and
aws-sdk-client-mock-jest packages. These helped a lot testing AWS code and also
helped building this library
FAQs
Custom matchers for AWS SDK Client mock to be used in vitest
The npm package aws-sdk-client-mock-vitest receives a total of 91,779 weekly downloads. As such, aws-sdk-client-mock-vitest popularity was classified as popular.
We found that aws-sdk-client-mock-vitest demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Research
/Security News
Socket researchers found 10 typosquatted npm packages that auto-run on install, show fake CAPTCHAs, fingerprint by IP, and deploy a credential stealer.

Product
Socket Firewall Enterprise is now available with flexible deployment, configurable policies, and expanded language support.

Security News
Open source dashboard CNAPulse tracks CVE Numbering Authorities’ publishing activity, highlighting trends and transparency across the CVE ecosystem.