UNPKG

component-dbs-core

Version:

DTO objects shared among device backend

245 lines 10.7 kB
"use strict"; 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