From 6d2ca6cc3a85943990e1df74cec540fc98885bbc Mon Sep 17 00:00:00 2001 From: Peter Somogyvari Date: Sat, 3 Aug 2024 16:06:46 -0700 Subject: [PATCH] ci(github): fix keychain-aws-sm no code coverage files/dir found 1. The Jest test execution was turned off for the AWS SM keychain plugin for some reason so this PR enables it back and while at it 2. I also refactored one of the test cases to have less linter warnings about us casting to `any`. 3. And on top of that I also migrated one of the test cases to Jest from TAP/tape so that we are making some progress with the test coverage at the same time. One more notable thing is that I refactored the negative test assertions while migrating to Jest so the test case now uses Jest native assertions to check what exactly the error message returned by the API call for deleting a non-existent item looks like. This is an example of the refactoring that this issue is about: https://github.com/hyperledger/cacti/issues/3455 Signed-off-by: Peter Somogyvari --- .github/workflows/ci.yaml | 4 +- .taprc | 1 - jest.config.js | 1 - .../openapi/openapi-validation.test.ts | 22 +- .../plugin-keychain-aws-sm.test.ts | 318 ++++++++++-------- .../test/typescript/unit/api-surface.test.ts | 5 + .../src/test/typescript/unit/api-surface.ts | 7 - 7 files changed, 188 insertions(+), 170 deletions(-) create mode 100644 packages/cactus-plugin-keychain-aws-sm/src/test/typescript/unit/api-surface.test.ts delete mode 100644 packages/cactus-plugin-keychain-aws-sm/src/test/typescript/unit/api-surface.ts diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 28243abba6..7ffe36afd2 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -1013,8 +1013,8 @@ jobs: env: FULL_BUILD_DISABLED: true JEST_TEST_PATTERN: packages/cactus-plugin-keychain-aws-sm/src/test/typescript/(unit|integration|benchmark)/.*/*.test.ts - JEST_TEST_RUNNER_DISABLED: true - TAPE_TEST_PATTERN: '--files={./packages/cactus-plugin-keychain-aws-sm/src/test/typescript/integration/plugin-factory-keychain.test.ts,./packages/cactus-plugin-keychain-aws-sm/src/test/typescript/integration/plugin-factory-keychain.test.ts,./packages/cactus-plugin-keychain-aws-sm/src/test/typescript/integration/plugin-keychain-aws-sm.test.ts}' + JEST_TEST_RUNNER_DISABLED: false + TAPE_TEST_PATTERN: '--files={./packages/cactus-plugin-keychain-aws-sm/src/test/typescript/integration/plugin-factory-keychain.test.ts,./packages/cactus-plugin-keychain-aws-sm/src/test/typescript/integration/plugin-factory-keychain.test.ts}' JEST_TEST_COVERAGE_PATH: ./code-coverage-ts/cp-keychain-aws-sm JEST_TEST_CODE_COVERAGE_ENABLED: true TAPE_TEST_RUNNER_DISABLED: false diff --git a/.taprc b/.taprc index 577a6bafe3..4708a6f5bf 100644 --- a/.taprc +++ b/.taprc @@ -24,7 +24,6 @@ files: - ./packages/cactus-plugin-ledger-connector-xdai/src/test/typescript/integration/openapi/openapi-validation.test.ts - ./packages/cactus-plugin-ledger-connector-xdai/src/test/typescript/integration/openapi/openapi-validation-no-keychain.test.ts - ./packages/cactus-common/src/test/typescript/unit/logging/logger.test.ts - - ./packages/cactus-plugin-keychain-aws-sm/src/test/typescript/integration/plugin-keychain-aws-sm.test.ts - ./packages/cactus-api-client/src/test/typescript/integration/default-consortium-provider.test.ts - ./packages/cactus-test-plugin-ledger-connector-besu/src/test/typescript/integration/plugin-validator-besu/get-balance-endpoint.test.ts - ./packages/cactus-test-plugin-ledger-connector-besu/src/test/typescript/integration/plugin-validator-besu/v21-get-past-logs-endpoint.test.ts diff --git a/jest.config.js b/jest.config.js index da76fc78fb..c42adbdcab 100644 --- a/jest.config.js +++ b/jest.config.js @@ -36,7 +36,6 @@ module.exports = { `./packages/cactus-plugin-ledger-connector-xdai/src/test/typescript/integration/openapi/openapi-validation.test.ts`, `./packages/cactus-plugin-ledger-connector-xdai/src/test/typescript/integration/openapi/openapi-validation-no-keychain.test.ts`, `./packages/cactus-common/src/test/typescript/unit/logging/logger.test.ts`, - `./packages/cactus-plugin-keychain-aws-sm/src/test/typescript/integration/plugin-keychain-aws-sm.test.ts`, `./packages/cactus-api-client/src/test/typescript/integration/default-consortium-provider.test.ts`, `./packages/cactus-test-plugin-ledger-connector-besu/src/test/typescript/integration/plugin-validator-besu/get-balance-endpoint.test.ts`, `./packages/cactus-test-plugin-ledger-connector-besu/src/test/typescript/integration/plugin-validator-besu/v21-get-past-logs-endpoint.test.ts`, diff --git a/packages/cactus-plugin-keychain-aws-sm/src/test/typescript/integration/openapi/openapi-validation.test.ts b/packages/cactus-plugin-keychain-aws-sm/src/test/typescript/integration/openapi/openapi-validation.test.ts index ea9c76cec0..4337b4f311 100644 --- a/packages/cactus-plugin-keychain-aws-sm/src/test/typescript/integration/openapi/openapi-validation.test.ts +++ b/packages/cactus-plugin-keychain-aws-sm/src/test/typescript/integration/openapi/openapi-validation.test.ts @@ -145,7 +145,7 @@ describe("PluginKeychainAwsSm", () => { try { await apiClient.setKeychainEntryV1({ value, - } as any as SetKeychainEntryRequestV1); + } as SetKeychainEntryRequestV1); } catch (e) { expect(e.response.status).toBe(400); const fields = e.response.data.map((param: any) => @@ -157,9 +157,7 @@ describe("PluginKeychainAwsSm", () => { test(`${testCase} - ${fGet} - ${cWithoutParams}`, async () => { try { - await apiClient.getKeychainEntryV1( - {} as any as GetKeychainEntryRequestV1, - ); + await apiClient.getKeychainEntryV1({} as GetKeychainEntryRequestV1); } catch (e) { expect(e.response.status).toBe(400); const fields = e.response.data.map((param: any) => @@ -171,9 +169,7 @@ describe("PluginKeychainAwsSm", () => { test(`${testCase} - ${fHas} - ${cWithoutParams}`, async () => { try { - await apiClient.hasKeychainEntryV1( - {} as any as HasKeychainEntryRequestV1, - ); + await apiClient.hasKeychainEntryV1({} as HasKeychainEntryRequestV1); } catch (e) { expect(e.response.status).toBe(400); const fields = e.response.data.map((param: any) => @@ -185,9 +181,7 @@ describe("PluginKeychainAwsSm", () => { test(`${testCase} - ${fDelete} - ${cWithoutParams}`, async () => { try { - await apiClient.deleteKeychainEntryV1( - {} as any as DeleteKeychainEntryRequestV1, - ); + await apiClient.deleteKeychainEntryV1({} as DeleteKeychainEntryRequestV1); } catch (e) { expect(e.response.status).toBe(400); const fields = e.response.data.map((param: any) => @@ -203,7 +197,7 @@ describe("PluginKeychainAwsSm", () => { key, value, fake: 4, - } as any as SetKeychainEntryRequestV1); + } as SetKeychainEntryRequestV1); } catch (e) { expect(e.response.status).toBe(400); const fields = e.response.data.map((param: any) => @@ -218,7 +212,7 @@ describe("PluginKeychainAwsSm", () => { await apiClient.getKeychainEntryV1({ key, fake: 4, - } as any as GetKeychainEntryRequestV1); + } as GetKeychainEntryRequestV1); } catch (e) { expect(e.response.status).toBe(400); const fields = e.response.data.map((param: any) => @@ -233,7 +227,7 @@ describe("PluginKeychainAwsSm", () => { await apiClient.hasKeychainEntryV1({ key, fake: 4, - } as any as HasKeychainEntryRequestV1); + } as HasKeychainEntryRequestV1); } catch (e) { expect(e.response.status).toBe(400); const fields = e.response.data.map((param: any) => @@ -248,7 +242,7 @@ describe("PluginKeychainAwsSm", () => { await apiClient.deleteKeychainEntryV1({ key, fake: 4, - } as any as DeleteKeychainEntryRequestV1); + } as DeleteKeychainEntryRequestV1); } catch (e) { expect(e.response.status).toBe(400); const fields = e.response.data.map((param: any) => diff --git a/packages/cactus-plugin-keychain-aws-sm/src/test/typescript/integration/plugin-keychain-aws-sm.test.ts b/packages/cactus-plugin-keychain-aws-sm/src/test/typescript/integration/plugin-keychain-aws-sm.test.ts index edd4b43ddd..d23acfc5b4 100644 --- a/packages/cactus-plugin-keychain-aws-sm/src/test/typescript/integration/plugin-keychain-aws-sm.test.ts +++ b/packages/cactus-plugin-keychain-aws-sm/src/test/typescript/integration/plugin-keychain-aws-sm.test.ts @@ -1,76 +1,87 @@ -import test, { Test } from "tape-promise/tape"; +import fs from "fs"; +import path from "path"; +import os from "os"; +import http from "http"; +import { AddressInfo } from "net"; +import { v4 as uuidv4 } from "uuid"; +import "jest-extended"; import express from "express"; import bodyParser from "body-parser"; -import http from "http"; -import { AddressInfo } from "net"; +import { v4 as internalIpV4 } from "internal-ip"; -import { IListenOptions, Servers } from "@hyperledger/cactus-common"; +import { + IListenOptions, + LoggerProvider, + Servers, +} from "@hyperledger/cactus-common"; +import { LogLevelDesc } from "@hyperledger/cactus-common"; +import { + installOpenapiValidationMiddleware, + PluginRegistry, +} from "@hyperledger/cactus-core"; -import { v4 as internalIpV4 } from "internal-ip"; import { Containers, LocalStackContainer, K_DEFAULT_LOCALSTACK_HTTP_PORT, } from "@hyperledger/cactus-test-tooling"; -import { v4 as uuidv4 } from "uuid"; - -import { LogLevelDesc } from "@hyperledger/cactus-common"; - +import OAS from "../../../main/json/openapi.json"; import { IPluginKeychainAwsSmOptions, PluginKeychainAwsSm, AwsCredentialType, -} from "../../../main/typescript/public-api"; - +} from "../../../main/typescript/plugin-keychain-aws-sm"; import { DefaultApi as KeychainAwsSmApi, Configuration, } from "../../../main/typescript/generated/openapi/typescript-axios/index"; - import { K_CACTUS_KEYCHAIN_AWSSM_MANAGED_KEY_COUNT } from "../../../main/typescript/prometheus-exporter/metrics"; -import fs from "fs"; -import path from "path"; -import os from "os"; -import { PluginRegistry } from "@hyperledger/cactus-core"; - const logLevel: LogLevelDesc = "TRACE"; -test("get,set,has,delete alters state as expected", async (t: Test) => { - const localStackContainer = new LocalStackContainer({ - logLevel: logLevel, - }); - await localStackContainer.start(); - - const ci = await Containers.getById(localStackContainer.containerId); - const localstackIpAddr = await internalIpV4(); - const hostPort = await Containers.getPublicPort( - K_DEFAULT_LOCALSTACK_HTTP_PORT, - ci, - ); - const localstackHost = `http://${localstackIpAddr}:${hostPort}`; - - test.onFinish(async () => { - await localStackContainer.stop(); - await localStackContainer.destroy(); +describe("PluginKeychainAwsSm", () => { + const key = uuidv4(); + const value = uuidv4(); + const keychainId = uuidv4(); + const instanceId = uuidv4(); + const log = LoggerProvider.getOrCreate({ + label: "plugin-keychain-aws-sm.test.ts", + level: logLevel, }); + let apiHost: string; + let localStackContainer: LocalStackContainer; + let localstackHost: string; + let tmpDirPath: string; + let plugin: PluginKeychainAwsSm; + let expressApp: express.Express; + let server: http.Server; + let apiClient: KeychainAwsSmApi; + + beforeAll(async () => { + localStackContainer = new LocalStackContainer({ logLevel: logLevel }); + await localStackContainer.start(); + + const ci = await Containers.getById(localStackContainer.containerId); + const localstackIpAddr = await internalIpV4(); + const hostPort = await Containers.getPublicPort( + K_DEFAULT_LOCALSTACK_HTTP_PORT, + ci, + ); + localstackHost = `http://${localstackIpAddr}:${hostPort}`; + log.info("LocalStack host: %s", localstackHost); - // Using awsCredentialType: AwsCredentialType.FromAwsCredentialFile - { - // Create aws credential file in a local directory - let tmpDirPath = "tmpDirPath"; - tmpDirPath = await fs.promises.mkdtemp(path.join(os.tmpdir(), "cactus-")); + tmpDirPath = await fs.promises.mkdtemp(path.join(os.tmpdir(), "cacti-")); await fs.promises.writeFile( `${tmpDirPath}/credentials`, "[default]\naws_secret_access_key = test\naws_access_key_id = test", "utf-8", ); - const options1: IPluginKeychainAwsSmOptions = { - instanceId: uuidv4(), - keychainId: uuidv4(), + const options: IPluginKeychainAwsSmOptions = { + instanceId, + keychainId, pluginRegistry: new PluginRegistry({}), awsEndpoint: localstackHost, awsRegion: "us-east-1", @@ -79,65 +90,94 @@ test("get,set,has,delete alters state as expected", async (t: Test) => { awsCredentialFilePath: `${tmpDirPath}/credentials`, logLevel: logLevel, }; - const plugin1 = new PluginKeychainAwsSm(options1); + plugin = new PluginKeychainAwsSm(options); - const expressApp = express(); + expressApp = express(); expressApp.use(bodyParser.json({ limit: "250mb" })); - const server = http.createServer(expressApp); + server = http.createServer(expressApp); const listenOptions: IListenOptions = { hostname: "127.0.0.1", port: 0, server, }; const addressInfo = (await Servers.listen(listenOptions)) as AddressInfo; - test.onFinish(async () => await Servers.shutdown(server)); const { address, port } = addressInfo; - const apiHost = `http://${address}:${port}`; - t.comment( - `Metrics URL: ${apiHost}/api/v1/plugins/@hyperledger/cactus-plugin-keychain-aws-sm/get-prometheus-exporter-metrics`, - ); - const config = new Configuration({ basePath: apiHost }); - const apiClient = new KeychainAwsSmApi(config); - - await plugin1.registerWebServices(expressApp); - - t.equal(plugin1.getKeychainId(), options1.keychainId, "Keychain ID set OK"); - t.equal(plugin1.getInstanceId(), options1.instanceId, "Instance ID set OK"); - - const key = uuidv4(); - const value = uuidv4(); + apiHost = `http://${address}:${port}`; - //const hasPrior1 = await plugin1.has(key1); - //t.false(hasPrior1, "hasPrior1 === false OK"); + const apiConfig = new Configuration({ basePath: apiHost }); + apiClient = new KeychainAwsSmApi(apiConfig); - const res1 = await apiClient.hasKeychainEntryV1({ key }); - t.true(res1.status >= 200, "res1.status >= 200 OK"); - t.true(res1.status < 300, "res1.status < 300"); + await installOpenapiValidationMiddleware({ + logLevel, + app: expressApp, + apiSpec: OAS, + }); - t.ok(res1.data, "res1.data truthy OK"); - t.false(res1.data.isPresent, "res1.data.isPresent === false OK"); - t.ok(res1.data.checkedAt, "res1.data.checkedAt truthy OK"); - t.equal(res1.data.key, key, "res1.data.key === key OK"); + await plugin.getOrCreateWebServices(); + await plugin.registerWebServices(expressApp); + }); - const res2 = await apiClient.setKeychainEntryV1({ - key: key, - value: value, - }); - t.true(res2.status >= 200, "res2.status >= 200 OK"); - t.true(res2.status < 300, "res2.status < 300 OK"); - t.notOk(res2.data, "res2.data truthy OK"); - - const res3 = await apiClient.hasKeychainEntryV1({ key }); - t.true(res3.status >= 200, "res3.status >= 200 OK"); - t.true(res3.status < 300, "res3.status < 300 OK"); - t.ok(res3.data, "res3.data truthy OK"); - t.true(res3.data.isPresent, "res3.data.isPresent === true OK"); - t.ok(res3.data.checkedAt, "res3.data.checkedAt truthy OK"); - t.equal(res3.data.key, key, "res3.data.key === key OK"); + afterAll(async () => { + await Servers.shutdown(server); + await localStackContainer.stop(); + await localStackContainer.destroy(); + fs.promises.rm(tmpDirPath, { recursive: true, force: true }); + }); + test("get,set,has,delete alters state as expected", async () => { + // Using awsCredentialType: AwsCredentialType.FromAwsCredentialFile { - const res = await apiClient.getPrometheusMetricsV1(); - const promMetricsOutput = + // Create aws credential file in a local directory + let tmpDirPath = "tmpDirPath"; + tmpDirPath = await fs.promises.mkdtemp(path.join(os.tmpdir(), "cactus-")); + await fs.promises.writeFile( + `${tmpDirPath}/credentials`, + "[default]\naws_secret_access_key = test\naws_access_key_id = test", + "utf-8", + ); + + const metricsPath = + OAS.paths[ + "/api/v1/plugins/@hyperledger/cactus-plugin-keychain-aws-sm/get-prometheus-exporter-metrics" + ].get["x-hyperledger-cacti"].http.path; + const metricsUrl = `${apiHost}${metricsPath}`; + + log.debug(`Metrics URL: ${metricsUrl}`); + + await plugin.registerWebServices(expressApp); + + expect(plugin.getKeychainId()).toEqual(keychainId); + expect(plugin.getInstanceId()).toEqual(instanceId); + + const res1 = await apiClient.hasKeychainEntryV1({ key }); + expect(res1.status).toBeGreaterThanOrEqual(200); + expect(res1.status).toBeLessThan(300); + expect(res1.data).toBeTruthy(); + expect(res1.data).not.toBeEmptyObject(); + expect(res1.data.isPresent).toBeFalse(); + expect(res1.data.checkedAt).toBeTruthy(); + expect(res1.data.key).toEqual(key); + + const res2 = await apiClient.setKeychainEntryV1({ + key: key, + value: value, + }); + expect(res2.status).toBeGreaterThanOrEqual(200); + expect(res2.status).toBeLessThan(300); + expect(res2.data).toBeFalsy(); + + const res3 = await apiClient.hasKeychainEntryV1({ key }); + + expect(res3.status).toBeGreaterThanOrEqual(200); + expect(res3.status).toBeLessThan(300); + expect(res3.data).toBeTruthy(); + expect(res3.data).not.toBeEmptyObject(); + expect(res3.data.isPresent).toBeTrue(); + expect(res3.data.checkedAt).toBeTruthy(); + expect(res3.data.key).toEqual(key); + + const res3_5 = await apiClient.getPrometheusMetricsV1(); + const metricsData1 = "# HELP " + K_CACTUS_KEYCHAIN_AWSSM_MANAGED_KEY_COUNT + " The number of keys that were set in the backing Aws Secret Manager deployment via this specific keychain plugin instance\n" + @@ -148,39 +188,40 @@ test("get,set,has,delete alters state as expected", async (t: Test) => { '{type="' + K_CACTUS_KEYCHAIN_AWSSM_MANAGED_KEY_COUNT + '"} 1'; - t.ok(res); - t.ok(res.data); - t.equal(res.status, 200); - t.true( - res.data.includes(promMetricsOutput), - "Total Key Count 1 recorded as expected. RESULT OK", - ); - } - const res4 = await apiClient.getKeychainEntryV1({ - key: key, - }); - t.true(res4.status >= 200, "res4.status >= 200 OK"); - t.true(res4.status < 300, "res4.status < 300 OK"); - t.ok(res4.data, "res4.data truthy OK"); - t.equal(res4.data.value, value, "res4.data.value === value OK"); - - const res5 = await apiClient.deleteKeychainEntryV1({ key }); - t.true(res5.status >= 200, "res5.status >= 200 OK"); - t.true(res5.status < 300, "res5.status < 300 OK"); - t.notOk(res5.data, "res5.data falsy OK"); - - const res6 = await apiClient.hasKeychainEntryV1({ key }); - t.true(res6.status >= 200, "res6.status >= 200 OK"); - t.true(res6.status < 300, "res6.status < 300 OK"); - t.ok(res6.data, "res6.data truthy OK"); - t.false(res6.data.isPresent, "res6.data.isPresent === false OK"); - t.ok(res6.data.checkedAt, "res6.data.checkedAt truthy OK"); - t.equal(res6.data.key, key, "res6.data.key === key OK"); + expect(res3_5.status).toBeGreaterThanOrEqual(200); + expect(res3_5.status).toBeLessThan(300); + expect(res3_5.data).toBeTruthy(); + expect(res3_5.data).toMatch(metricsData1); - { - const res = await apiClient.getPrometheusMetricsV1(); - const promMetricsOutput = + const res4 = await apiClient.getKeychainEntryV1({ + key: key, + }); + + expect(res4.status).toBeGreaterThanOrEqual(200); + expect(res4.status).toBeLessThan(300); + expect(res4.data).toBeTruthy(); + expect(res4.data).not.toBeEmptyObject(); + expect(res4.data.value).toEqual(value); + + const res5 = await apiClient.deleteKeychainEntryV1({ key }); + + expect(res5.status).toBeGreaterThanOrEqual(200); + expect(res5.status).toBeLessThan(300); + expect(res5.data).toBeFalsy(); + + const res6 = await apiClient.hasKeychainEntryV1({ key }); + + expect(res6.status).toBeGreaterThanOrEqual(200); + expect(res6.status).toBeLessThan(300); + expect(res6.data).toBeTruthy(); + expect(res6.data).not.toBeEmptyObject(); + expect(res6.data.isPresent).toBeFalse(); + expect(res6.data.checkedAt).toBeTruthy(); + expect(res6.data.key).toEqual(key); + + const res7 = await apiClient.getPrometheusMetricsV1(); + const metricsData2 = "# HELP " + K_CACTUS_KEYCHAIN_AWSSM_MANAGED_KEY_COUNT + " The number of keys that were set in the backing Aws Secret Manager deployment via this specific keychain plugin instance\n" + @@ -191,33 +232,20 @@ test("get,set,has,delete alters state as expected", async (t: Test) => { '{type="' + K_CACTUS_KEYCHAIN_AWSSM_MANAGED_KEY_COUNT + '"} 0'; - t.ok(res); - t.ok(res.data); - t.equal(res.status, 200); - t.true( - res.data.includes(promMetricsOutput), - "Total Key Count 0 recorded as expected. RESULT OK", - ); + expect(res7.status).toBeGreaterThanOrEqual(200); + expect(res7.status).toBeLessThan(300); + expect(res7.data).toBeTruthy(); + expect(res7.data).toMatch(metricsData2); + + const deletionOfNonExistentKey = apiClient.getKeychainEntryV1({ key }); + await expect(deletionOfNonExistentKey).rejects.toMatchObject({ + response: expect.objectContaining({ + status: 404, + data: expect.objectContaining({ + error: expect.stringContaining(key), + }), + }), + }); } - - try { - await apiClient.getKeychainEntryV1({ key }); - t.fail( - "Failing because getKeychainEntryV1 did not throw when called with non-existent key.", - ); - } catch (ex) { - t.ok(ex, "res7 -> ex truthy"); - const res7 = ex.response; - t.equal(res7.status, 404, "res7.status === 404 OK"); - t.ok(res7.data, "res7.data truthy OK"); - t.ok(res7.data.error, "res7.data.error truthy OK"); - t.equal(typeof res7.data.error, "string", "res7.data.error truthy OK"); - t.true( - res7.data.error.includes(`${key} secret not found`), - "res7.data.error contains legible error message about missing key OK", - ); - } - } - - t.end(); + }); }); diff --git a/packages/cactus-plugin-keychain-aws-sm/src/test/typescript/unit/api-surface.test.ts b/packages/cactus-plugin-keychain-aws-sm/src/test/typescript/unit/api-surface.test.ts new file mode 100644 index 0000000000..a65ea58247 --- /dev/null +++ b/packages/cactus-plugin-keychain-aws-sm/src/test/typescript/unit/api-surface.test.ts @@ -0,0 +1,5 @@ +import * as apiSurface from "../../../main/typescript/public-api"; + +test("Library can be loaded", async () => { + expect(apiSurface).toBeTruthy(); +}); diff --git a/packages/cactus-plugin-keychain-aws-sm/src/test/typescript/unit/api-surface.ts b/packages/cactus-plugin-keychain-aws-sm/src/test/typescript/unit/api-surface.ts deleted file mode 100644 index a44efd7923..0000000000 --- a/packages/cactus-plugin-keychain-aws-sm/src/test/typescript/unit/api-surface.ts +++ /dev/null @@ -1,7 +0,0 @@ -import test, { Test } from "tape"; -import * as publicApi from "../../../main/typescript/public-api"; - -test("Library can be loaded", (assert: Test) => { - assert.ok(publicApi); - assert.end(); -});