cloudrx
Version:
TypeScript library for streaming cloud provider events using RxJS with automatic persistence and replay capabilities
113 lines • 4.87 kB
JavaScript
;
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