UNPKG

cloudrx

Version:

TypeScript library for streaming cloud provider events using RxJS with automatic persistence and replay capabilities

113 lines 4.87 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const _providers_1 = require("@providers"); const local_1 = require("./local"); const setup_1 = require("../../../setup"); const rxjs_1 = require("rxjs"); describe('aws-dynamodb', () => { let container; let options; beforeAll(async () => { container = new local_1.DynamoDBLocalContainer(console); await container.start(); options = { client: container.getClient(), }; }); beforeEach(() => { }); afterEach(() => { }); afterAll(async () => { if (container) { await container.stop(); } }); test('is-a-singleton', async () => { const instance1$ = _providers_1.DynamoDB.from((0, setup_1.testId)(), options); const instance2$ = _providers_1.DynamoDB.from((0, setup_1.testId)(), options); const instance1 = await (0, rxjs_1.firstValueFrom)(instance1$); const instance2 = await (0, rxjs_1.firstValueFrom)(instance2$); expect(instance1).toBe(instance2); expect(instance1.tableName).toBe(`cloudrx-${(0, setup_1.testId)()}`); expect(instance2.tableName).toBe(`cloudrx-${(0, setup_1.testId)()}`); }); test('sets-table-arn', async () => { const instance = await (0, rxjs_1.firstValueFrom)(_providers_1.DynamoDB.from((0, setup_1.testId)(), options)); expect(instance.tableArn).toBeDefined(); }); test('sets-stream-arn', async () => { const instance = await (0, rxjs_1.firstValueFrom)(_providers_1.DynamoDB.from((0, setup_1.testId)(), options)); expect(instance.streamArn).toBeDefined(); }); test('stores-an-item', async () => { const instance = await (0, rxjs_1.firstValueFrom)(_providers_1.DynamoDB.from((0, setup_1.testId)(), options)); const testData = { message: 'test', timestamp: performance.now() }; const storedData = await (0, rxjs_1.firstValueFrom)(instance.store(testData)); expect(storedData).toEqual(testData); }); test('stores-items', async () => { const NUM_ITEMS = 20; const instance = await (0, rxjs_1.firstValueFrom)(_providers_1.DynamoDB.from((0, setup_1.testId)(), options)); const testItems = []; for (let i = 0; i < NUM_ITEMS; i++) { testItems.push({ message: `test-${i}`, timestamp: performance.now() + i, }); } const storedItems = await Promise.all(testItems.map((item) => (0, rxjs_1.firstValueFrom)(instance.store(item)))); expect(storedItems.length).toEqual(testItems.length); for (let i = 0; i < NUM_ITEMS; i++) { expect(storedItems[i]).toEqual(testItems[i]); } }); test('shard-emits-once', async () => { const mockStreamClient = { send: jest.fn(), }; const shard1 = { ShardId: 'shard-1', SequenceNumberRange: { StartingSequenceNumber: '1' }, }; const shard2 = { ShardId: 'shard-2', SequenceNumberRange: { StartingSequenceNumber: '2' }, }; const shard3 = { ShardId: 'shard-3', SequenceNumberRange: { StartingSequenceNumber: '3' }, }; mockStreamClient.send .mockResolvedValueOnce({ StreamDescription: { Shards: [shard1] } }) .mockResolvedValueOnce({ StreamDescription: { Shards: [shard1, shard2] }, }) .mockResolvedValueOnce({ StreamDescription: { Shards: [shard1, shard2] }, }) .mockResolvedValueOnce({ StreamDescription: { Shards: [shard1, shard2, shard3] }, }) .mockResolvedValue({ StreamDescription: { Shards: [shard1, shard2, shard3] }, }); const options = { client: container.getClient(), pollInterval: 1000, }; const provider = await (0, rxjs_1.firstValueFrom)(_providers_1.DynamoDB.from((0, setup_1.testId)(), options)); provider._streamClient = mockStreamClient; const emittedShards = []; const subscription = provider.shards.subscribe((shard) => { emittedShards.push(shard); }); await new Promise((resolve) => setTimeout(resolve, 6000)); subscription.unsubscribe(); expect(emittedShards).toHaveLength(3); expect(emittedShards.filter((s) => s.ShardId === 'shard-1')).toHaveLength(1); expect(emittedShards.filter((s) => s.ShardId === 'shard-2')).toHaveLength(1); expect(emittedShards.filter((s) => s.ShardId === 'shard-3')).toHaveLength(1); const shardIds = emittedShards.map((s) => s.ShardId).sort(); expect(shardIds).toEqual(['shard-1', 'shard-2', 'shard-3']); }); }); //# sourceMappingURL=dynamodb.test.js.map