Skip to content

Commit

Permalink
Add tests for lib/dynamodb-client
Browse files Browse the repository at this point in the history
  • Loading branch information
eaviles committed May 8, 2019
1 parent eaf7c2b commit 4a9e7b4
Show file tree
Hide file tree
Showing 11 changed files with 892 additions and 1,011 deletions.
237 changes: 148 additions & 89 deletions lib/__mocks__/aws-sdk.js
Original file line number Diff line number Diff line change
@@ -1,113 +1,172 @@
'use strict';

const mockData = {};

function resetMockData() {
mockData.Consumers = [];
mockData.Streams = [];
}
//
// const mockData = {};
//
// function resetMockData() {
// mockData.Consumers = [];
// mockData.Streams = [];
// }
//
// const addTagsToStream = jest.fn(() => ({ promise: () => Promise.resolve() }));
//
// const createStream = jest.fn(params => {
// const { StreamName } = params;
// const Stream = {
// StreamARN: [
// 'arn:aws:kinesis:us-east-1',
// Math.floor(Math.random() * 1e12),
// `stream/${StreamName}`
// ].join(':'),
// StreamName,
// StreamStatus: 'CREATING'
// };
// mockData.Streams.push(Stream);
// return { promise: () => Promise.resolve({}) };
// });
//
// const describeStream = jest.fn(params => {
// const { StreamName } = params;
// const StreamDescription = mockData.Streams.find(i => i.StreamName === StreamName);
// if (!StreamDescription) {
// const err = new Error("The stream doesn't exists.");
// err.code = 'ResourceNotFoundException';
// return { promise: () => Promise.reject(err) };
// }
// return { promise: () => Promise.resolve({ StreamDescription }) };
// });
//
// const listStreamConsumers = jest.fn(() => {
// const { Consumers } = mockData;
// return { promise: () => Promise.resolve({ Consumers }) };
// });
//
// const listTagsForStream = jest.fn(params => {
// const { StreamName } = params;
// const { Tags = [] } = mockData.Streams.find(i => i.StreamName === StreamName);
// return { promise: () => Promise.resolve({ Tags }) };
// });
//
// const registerStreamConsumer = jest.fn(params => {
// const { ConsumerName } = params;
// const Consumer = {
// ConsumerARN: [
// 'arn:aws:kinesis:us-east-1',
// Math.floor(Math.random() * 1e12),
// `stream/test/consumer/${ConsumerName.toLowerCase()}`,
// Math.floor(Math.random() * 1e12)
// ].join(':'),
// ConsumerName,
// ConsumerStatus: 'ACTIVE'
// };
// mockData.Consumers.push(Consumer);
// return {
// promise: () => Promise.resolve({ Consumer: { ...Consumer, ConsumerStatus: 'CREATING' } })
// };
// });
//
// const startStreamEncryption = jest.fn(() => ({ promise: () => Promise.resolve({}) }));
//
// const waitFor = jest.fn((state, { StreamName }) => {
// const StreamDescription = mockData.Streams.find(i => i.StreamName === StreamName);
// return { promise: () => Promise.resolve({ StreamDescription }) };
// });
//
// const Kinesis = jest.fn(() => ({
// addTagsToStream,
// createStream,
// describeStream,
// listStreamConsumers,
// listTagsForStream,
// registerStreamConsumer,
// startStreamEncryption,
// waitFor
// }));
//
//

const createTable = jest.fn(() => {
return { promise: () => Promise.resolve({}) };
});

const addTagsToStream = jest.fn(() => ({ promise: () => Promise.resolve() }));
const deleteMock = jest.fn(() => {
return { promise: () => Promise.resolve({}) };
});

const createStream = jest.fn(params => {
const { StreamName } = params;
const Stream = {
StreamARN: [
'arn:aws:kinesis:us-east-1',
Math.floor(Math.random() * 1e12),
`stream/${StreamName}`
].join(':'),
StreamName,
StreamStatus: 'CREATING'
};
mockData.Streams.push(Stream);
const describeTable = jest.fn(() => {
return { promise: () => Promise.resolve({}) };
});

const describeStream = jest.fn(params => {
const { StreamName } = params;
const StreamDescription = mockData.Streams.find(i => i.StreamName === StreamName);
if (!StreamDescription) {
const err = new Error("The stream doesn't exists.");
err.code = 'ResourceNotFoundException';
return { promise: () => Promise.reject(err) };
}
return { promise: () => Promise.resolve({ StreamDescription }) };
const get = jest.fn(() => {
return { promise: () => Promise.resolve({}) };
});

const listStreamConsumers = jest.fn(() => {
const { Consumers } = mockData;
return { promise: () => Promise.resolve({ Consumers }) };
const listTagsOfResource = jest.fn(() => {
return { promise: () => Promise.resolve({}) };
});

const listTagsForStream = jest.fn(params => {
const { StreamName } = params;
const { Tags = [] } = mockData.Streams.find(i => i.StreamName === StreamName);
return { promise: () => Promise.resolve({ Tags }) };
const put = jest.fn(() => {
return { promise: () => Promise.resolve({}) };
});

const registerStreamConsumer = jest.fn(params => {
const { ConsumerName } = params;
const Consumer = {
ConsumerARN: [
'arn:aws:kinesis:us-east-1',
Math.floor(Math.random() * 1e12),
`stream/test/consumer/${ConsumerName.toLowerCase()}`,
Math.floor(Math.random() * 1e12)
].join(':'),
ConsumerName,
ConsumerStatus: 'ACTIVE'
};
mockData.Consumers.push(Consumer);
return {
promise: () => Promise.resolve({ Consumer: { ...Consumer, ConsumerStatus: 'CREATING' } })
};
const tagResource = jest.fn(() => {
return { promise: () => Promise.resolve({}) };
});

const startStreamEncryption = jest.fn(() => ({ promise: () => Promise.resolve({}) }));
const update = jest.fn(() => {
return { promise: () => Promise.resolve({}) };
});

const waitFor = jest.fn((state, { StreamName }) => {
const StreamDescription = mockData.Streams.find(i => i.StreamName === StreamName);
return { promise: () => Promise.resolve({ StreamDescription }) };
const waitFor = jest.fn(() => {
return { promise: () => Promise.resolve({}) };
});

const Kinesis = jest.fn(() => ({
addTagsToStream,
createStream,
describeStream,
listStreamConsumers,
listTagsForStream,
registerStreamConsumer,
startStreamEncryption,
const DynamoDB = jest.fn(() => ({
createTable,
describeTable,
listTagsOfResource,
tagResource,
waitFor
}));

function mockClear() {
addTagsToStream.mockClear();
createStream.mockClear();
describeStream.mockClear();
listStreamConsumers.mockClear();
listTagsForStream.mockClear();
registerStreamConsumer.mockClear();
startStreamEncryption.mockClear();
waitFor.mockClear();
Kinesis.mockClear();
resetMockData();
}

function mockConsumers() {
return mockData.Consumers;
}

function mockStreams() {
return mockData.Streams;
}

resetMockData();
DynamoDB.DocumentClient = jest.fn(() => ({
delete: deleteMock,
get,
put,
update
}));

//
// function mockClear() {
// addTagsToStream.mockClear();
// createStream.mockClear();
// describeStream.mockClear();
// listStreamConsumers.mockClear();
// listTagsForStream.mockClear();
// registerStreamConsumer.mockClear();
// startStreamEncryption.mockClear();
// waitFor.mockClear();
// Kinesis.mockClear();
// resetMockData();
// createTable.mockClear();
// DynamoDB.DocumentClient.mockClear();
// DynamoDB.mockClear();
// }
//
// function mockConsumers() {
// return mockData.Consumers;
// }
//
// function mockStreams() {
// return mockData.Streams;
// }
//
// resetMockData();
//
module.exports = {
Kinesis,
mockClear,
mockConsumers,
mockStreams
DynamoDB
// Kinesis,
// mockClear
// mockConsumers,
// mockStreams
};
23 changes: 23 additions & 0 deletions lib/constants.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
'use strict';

const { CAPTURE_STACK_TRACE } = process.env;

const BAIL_RETRY_LIST = Object.freeze([
'ConditionalCheckFailedException',
'MissingParameter',
'MissingRequiredParameter',
'MultipleValidationErrors',
'ResourceInUseException',
'ResourceNotFoundException',
'UnexpectedParameter',
'UnknownOperationException',
'ValidationException'
]);

const FORCED_RETRY_LIST = Object.freeze(['ENOTFOUND', 'ENETUNREACH']);

module.exports = Object.freeze({
BAIL_RETRY_LIST,
CAPTURE_STACK_TRACE: Boolean(CAPTURE_STACK_TRACE),
FORCED_RETRY_LIST
});
27 changes: 27 additions & 0 deletions lib/constants.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
/* eslint-disable global-require */

'use strict';

describe('lib/constants', () => {
let constants;

beforeEach(() => {
delete process.env.CAPTURE_STACK_TRACE;
jest.resetModules();
});

test('the module exports the expected', () => {
constants = require('./constants');
expect(constants).toEqual({
BAIL_RETRY_LIST: expect.any(Array),
CAPTURE_STACK_TRACE: false,
FORCED_RETRY_LIST: expect.any(Array)
});
});

test('the module uses the environment variables as expected', () => {
process.env.CAPTURE_STACK_TRACE = true;
const { CAPTURE_STACK_TRACE } = require('./constants');
expect(CAPTURE_STACK_TRACE).toBe(true);
});
});
Loading

0 comments on commit 4a9e7b4

Please sign in to comment.