component-dbs-core
Version:
DTO objects shared among device backend
245 lines • 10.7 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
const uuid_1 = require("uuid");
const depositDb_1 = require("./depositDb");
const common_services_1 = require("../common_services");
jest.mock('../common_services/dynamodb/dynamodbService');
describe('get deposits main table test suite', () => {
const deviceUuid = uuid_1.v4();
const entityUuid = uuid_1.v4();
const deposits = [];
const total = 100;
const timestamps = [];
let db;
beforeAll(() => __awaiter(void 0, void 0, void 0, function* () {
const dbService = new common_services_1.DynamodbService({}, {});
const proms = [];
const sleep = () => new Promise((resolve) => setTimeout(resolve, 10));
db = new depositDb_1.DepositDb('Devices', dbService, 'depositGsi', 'entityUuidGsi');
for (let i = 0; i < total; i++) {
const deposit = {
id: deviceUuid,
type: `deposit.${new Date().getTime()}`,
depositUuid: uuid_1.v4(),
entityUuid: entityUuid,
timestamp: new Date().toISOString(),
status: "DEPOSITED" /* DEPOSITED */,
dailyTotals: [
{
date: new Date().toISOString(),
amount: 1000,
},
],
account: 'Bank account details',
reference: uuid_1.v4(),
totalAmount: 2000,
feeAmount: 150,
refundsAmount: 300,
chargeBacksAmount: 200,
owingAmount: 189,
adjustedAmount: 13,
depositAmount: 2000 + i,
};
timestamps.push(deposit.timestamp);
deposits.push(deposit);
yield sleep();
const params = {
TableName: 'Devices',
Item: deposit,
};
proms.push(dbService.documentClient.put(params).promise());
}
yield Promise.all(proms);
}));
it('should be able to query deposit history', () => __awaiter(void 0, void 0, void 0, function* () {
const response = yield db.getDeposits({
limit: 10,
}, entityUuid);
const items = response.Items;
console.log(items);
expect(items.length).toBe(10);
for (let i = 1; i < items.length - 1; i++) {
const prevTs = parseInt(items[i - 1].type.split('.')[1]);
const ts = parseInt(items[i].type.split('.')[1]);
expect(prevTs).toBeGreaterThan(ts);
}
}));
it('should be able to query pagination', () => __awaiter(void 0, void 0, void 0, function* () {
let response = yield db.getDeposits({
limit: total - 5,
}, entityUuid);
const items = response.Items;
expect(items.length).toBe(total - 5);
const nextToken = response.LastEvaluatedKey;
expect(nextToken.id).not.toBeUndefined();
response = yield db.getDeposits({
limit: 10,
nextToken: nextToken,
}, entityUuid);
expect(response.Items.length).toBe(5);
expect(parseInt(items[items.length - 1].type.split('.')[1])).toBeGreaterThan(parseInt(response.Items[0].type.split('.')[1]));
}));
it('should return empty query if not found', () => __awaiter(void 0, void 0, void 0, function* () {
let response = yield db.getDeposits({
limit: total - 5,
}, 'unknown');
const items = response.Items;
expect(items.length).toBe(0);
}));
it('should be able to get deposits based on time range with multiple queries', () => __awaiter(void 0, void 0, void 0, function* () {
let filter = {
expression: '((#timestampFilter < :timestampFilter_lt) AND (#timestampFilter > :timestampFilter_gt))',
expressionNames: { '#timestampFilter': 'timestamp' },
expressionValues: {
':timestampFilter_gt': { S: timestamps[20] },
':timestampFilter_lt': { S: timestamps[30] },
},
};
let response = yield db.getDeposits({
limit: 5,
timestampFilter: JSON.stringify(filter),
}, entityUuid);
const items = response.Items;
expect(items.length).toBe(5);
}));
it('should be able to query with filter', () => __awaiter(void 0, void 0, void 0, function* () {
let filter = {
expression: '#depositAmount > :depositAmount_gt',
expressionNames: {
'#depositAmount': 'depositAmount',
},
expressionValues: {
':depositAmount_gt': { N: 20 },
},
};
let response = yield db.getDeposits({
limit: 5,
filter: JSON.stringify(filter),
}, entityUuid);
const items = response.Items;
expect(items.length).toBe(5);
}));
it('should be able to query multiple times', () => __awaiter(void 0, void 0, void 0, function* () {
let filter = {
expression: '#depositAmount < :depositAmount_lt',
expressionNames: {
'#depositAmount': 'depositAmount',
},
expressionValues: {
':depositAmount_lt': { N: 2004 },
},
};
let response = yield db.getDeposits({
limit: 5,
filter: JSON.stringify(filter),
}, entityUuid);
const items = response.Items;
expect(items.length).toBe(4);
}), 10000);
it('should be able to extract timestamp from filter to create sort key confition', () => __awaiter(void 0, void 0, void 0, function* () {
let filter = {
expression: '(#timestampFilter < :timestampFilter_lt) AND (#timestampFilter > :timestampFilter_gt)',
expressionNames: { '#timestampFilter': 'timestamp' },
expressionValues: {
':timestampFilter_gt': { S: '2020-01-10T00:00:00Z' },
':timestampFilter_lt': { S: new Date().getTime() },
},
};
let response = yield db.getDeposits({
limit: 5,
timestampFilter: JSON.stringify(filter),
}, entityUuid);
const items = response.Items;
expect(items.length).toBe(5);
}));
it('should be able to query timestamp with other filters', () => __awaiter(void 0, void 0, void 0, function* () {
let timestampFilter = {
expression: '(#timestampFilter < :timestampFilter_lt) AND (#timestampFilter > :timestampFilter_gt)',
expressionNames: { '#timestampFilter': 'timestampFilter' },
expressionValues: {
':timestampFilter_gt': { S: timestamps[5] },
':timestampFilter_lt': { S: timestamps[90] },
},
};
let filter = {
expression: '#depositAmount > :depositAmount_gt',
expressionNames: {
'#depositAmount': 'depositAmount',
},
expressionValues: {
':depositAmount_gt': { N: 20 },
},
};
let response = yield db.getDeposits({
limit: 20,
filter: JSON.stringify(filter),
timestampFilter: JSON.stringify(timestampFilter),
}, entityUuid);
const items = response.Items;
expect(items.length).toBe(20);
}));
it('should be able to query customised timestamp range', () => __awaiter(void 0, void 0, void 0, function* () {
let filter = {
expression: '(#timestampFilter BETWEEN :timestampFilter_between_start AND :timestampFilter_between_end)',
expressionNames: { '#timestampFilter': 'timestamp' },
expressionValues: {
':timestampFilter_between_start': { S: timestamps[30] },
':timestampFilter_between_end': { S: timestamps[50] },
},
};
let response = yield db.getDeposits({
limit: 50,
timestampFilter: JSON.stringify(filter),
}, entityUuid);
const items = response.Items;
expect(items.length).toBeLessThanOrEqual(21);
}));
it('should be able to query customised timestamp with end date', () => __awaiter(void 0, void 0, void 0, function* () {
let filter = {
expression: '(#timestampFilter < :timestampFilter_lt)',
expressionNames: { '#timestampFilter': 'timestamp' },
expressionValues: {
':timestampFilter_lt': { S: timestamps[30] },
},
};
let response = yield db.getDeposits({
limit: 500,
timestampFilter: JSON.stringify(filter),
}, entityUuid);
const items = response.Items;
expect(items.length).toBeGreaterThanOrEqual(30);
}));
it('should be able to query customised timestamp with start date', () => __awaiter(void 0, void 0, void 0, function* () {
let filter = {
expression: '(#timestampFilter < :timestampFilter_gt)',
expressionNames: { '#timestampFilter': 'timestamp' },
expressionValues: {
':timestampFilter_gt': { S: timestamps[30] },
},
};
let response = yield db.getDeposits({
limit: 500,
timestampFilter: JSON.stringify(filter),
}, entityUuid);
const items = response.Items;
expect(items.length).toBe(69);
}));
it('should be able to query deposit by uuid', () => __awaiter(void 0, void 0, void 0, function* () {
const proms = deposits.map(({ depositUuid }) => db.getDeposit(depositUuid));
const outputs = yield Promise.all(proms);
outputs.forEach((output, i) => {
expect(output.Items.length).toBe(1);
expect(output.Items[0].depositUuid).toBe(deposits[i].depositUuid);
});
}));
});
//# sourceMappingURL=depositDb.spec.js.map