import chai from "chai"; import AWSMock from "aws-sdk-mock"; import _ from "lodash"; import promClient from "prom-client"; import { mockDynamoCampaigns } from "../../mocks/dynamo.mock"; chai.should(); const expect = chai.expect; describe("DDBConnector", () => { describe("batchGet", () => { afterEach(() => { AWSMock.restore(); }); it("should send parameters to Dynamo and format response", async () => { const campaigns = { "cm:1": { data: 1 }, "cm:2": { data: 2 }, "cm:3": { data: 3 }, "cm:4": { data: 4 }, }; const fakes = await mockDynamoCampaigns(campaigns); const { DDBConnector } = require("../../../src/models/connector/DDBConnector"); const connector = new DDBConnector(); const result = await connector.batchGet(["cm:1", "cm:4", "cm:2"]); expect(result).to.deep.equal({ "cm:1": { data: 1 }, "cm:2": { data: 2 }, "cm:4": { data: 4 }, }); expect(fakes.batchGetItem.callCount).to.equal(1); }); it("should limit queries to max 50 items", async () => { const campaigns: any = {}; for (let i = 0; i < 230; ++i) { campaigns[`cm:${i}`] = { data: i }; } const fakes = await mockDynamoCampaigns(campaigns); const { DDBConnector } = require("../../../src/models/connector/DDBConnector"); const connector = new DDBConnector(); // mix of existing and missing keys, total of 3 batches const query: any[] = []; for (let i = 0; i < 230; ++i) { query.push(`cm:${i * 2}`); } const result = await connector.batchGet(query); const expected = query.reduce((acc, val) => { acc[val] = campaigns[val] ?? null; return acc; }, {}); expect(result).to.deep.equal(expected); expect(fakes.batchGetItem.callCount).to.equal(5); }); }); describe("monitoring", () => { it("should not fail when collecting metrics", async () => { const { DDBConnector } = require("../../../src/models/connector/DDBConnector"); const connector = new DDBConnector(); await promClient.register.metrics(); }); }); });