Skip to content

Commit 5ec6f1f

Browse files
committed
add batchWrite tests
1 parent 2c57446 commit 5ec6f1f

File tree

2 files changed

+166
-2
lines changed

2 files changed

+166
-2
lines changed
Lines changed: 160 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,160 @@
1+
const { Table, Entity } = require('../index')
2+
const { DocumentClient } = require('./bootstrap-tests')
3+
4+
const TestTable = new Table({
5+
name: 'test-table',
6+
alias: 'testTable',
7+
partitionKey: 'pk',
8+
sortKey: 'sk',
9+
indexes: { GSI1: { partitionKey: 'GSI1pk', sortKey: 'GSIsk1' } },
10+
DocumentClient
11+
})
12+
13+
const TestEntity = new Entity({
14+
name: 'TestEntity',
15+
autoExecute: false,
16+
attributes: {
17+
email: { type: 'string', partitionKey: true },
18+
sort: { type: 'string', sortKey: true },
19+
test: 'string'
20+
},
21+
table: TestTable
22+
})
23+
24+
describe('batchWrite',()=>{
25+
26+
it('fails when batchWrite is empty', () => {
27+
expect(() => { TestTable.batchWriteParams() })
28+
.toThrow(`No items supplied`)
29+
})
30+
31+
it('fails when batchWrite items is an empty array', () => {
32+
expect(() => { TestTable.batchWriteParams([]) })
33+
.toThrow(`No items supplied`)
34+
})
35+
36+
it('batchWrites data to a single table', () => {
37+
let result = TestTable.batchWriteParams(
38+
TestEntity.putBatch({ pk: 'test', sk: 'testsk', test: 'test'})
39+
)
40+
expect(result.RequestItems['test-table'][0].PutRequest.Item.pk).toBe('test')
41+
expect(result.RequestItems['test-table'][0].PutRequest.Item.sk).toBe('testsk')
42+
expect(result.RequestItems['test-table'][0].PutRequest.Item.test).toBe('test')
43+
})
44+
45+
it('fails when extra options', () => {
46+
expect(() => { TestTable.batchWriteParams(
47+
TestEntity.putBatch({ pk: 'test', sk: 'testsk'}),
48+
{ invalid: true }
49+
) })
50+
.toThrow(`Invalid batchWrite options: invalid`)
51+
})
52+
53+
it('fails when providing an invalid capacity setting', () => {
54+
expect(() => { TestTable.batchWriteParams(
55+
TestEntity.putBatch({ pk: 'test', sk: 'testsk'}),
56+
{ capacity: 'test' }
57+
) })
58+
.toThrow(`'capacity' must be one of 'NONE','TOTAL', OR 'INDEXES'`)
59+
})
60+
61+
it('fails when providing an invalid metrics setting', () => {
62+
expect(() => { TestTable.batchWriteParams(
63+
TestEntity.putBatch({ pk: 'test', sk: 'testsk'}),
64+
{ metrics: 'test' }
65+
) })
66+
.toThrow(`'metrics' must be one of 'NONE' OR 'SIZE'`)
67+
})
68+
69+
it('batchWrites data to a single table with options', () => {
70+
let result = TestTable.batchWriteParams(
71+
TestEntity.putBatch({ pk: 'test', sk: 'testsk', test: 'test'}),
72+
{ capacity: 'total', metrics: 'size' }
73+
)
74+
expect(result.RequestItems['test-table'][0].PutRequest.Item.pk).toBe('test')
75+
expect(result.RequestItems['test-table'][0].PutRequest.Item.sk).toBe('testsk')
76+
expect(result.RequestItems['test-table'][0].PutRequest.Item.test).toBe('test')
77+
expect(result.ReturnConsumedCapacity).toBe('TOTAL')
78+
expect(result.ReturnItemCollectionMetrics).toBe('SIZE')
79+
})
80+
81+
it('batchWrites data to a single table with invalid params', () => {
82+
let result = TestTable.batchWriteParams(
83+
TestEntity.putBatch({ pk: 'test', sk: 'testsk', test: 'test'}),
84+
{}, 'test'
85+
)
86+
expect(result.RequestItems['test-table'][0].PutRequest.Item.pk).toBe('test')
87+
expect(result.RequestItems['test-table'][0].PutRequest.Item.sk).toBe('testsk')
88+
expect(result.RequestItems['test-table'][0].PutRequest.Item.test).toBe('test')
89+
})
90+
91+
it('returns meta data', () => {
92+
let result = TestTable.batchWriteParams(
93+
TestEntity.putBatch({ pk: 'test', sk: 'testsk', test: 'test'}),
94+
{},null,true
95+
)
96+
97+
expect(result.payload.RequestItems['test-table'][0].PutRequest.Item.pk).toBe('test')
98+
expect(result.payload.RequestItems['test-table'][0].PutRequest.Item.sk).toBe('testsk')
99+
expect(result.payload.RequestItems['test-table'][0].PutRequest.Item.test).toBe('test')
100+
expect(result).toHaveProperty('Tables')
101+
})
102+
103+
it('batchWrites data to a single table with multiple items', () => {
104+
let result = TestTable.batchWriteParams([
105+
TestEntity.putBatch({ pk: 'test', sk: 'testsk1', test: 'test1' }),
106+
TestEntity.putBatch({ pk: 'test', sk: 'testsk2', test: 'test2' }),
107+
TestEntity.deleteBatch({ pk: 'test', sk: 'testsk3' })
108+
])
109+
expect(result.RequestItems['test-table'][0].PutRequest.Item.pk).toBe('test')
110+
expect(result.RequestItems['test-table'][0].PutRequest.Item.sk).toBe('testsk1')
111+
expect(result.RequestItems['test-table'][0].PutRequest.Item.test).toBe('test1')
112+
expect(result.RequestItems['test-table'][1].PutRequest.Item.pk).toBe('test')
113+
expect(result.RequestItems['test-table'][1].PutRequest.Item.sk).toBe('testsk2')
114+
expect(result.RequestItems['test-table'][1].PutRequest.Item.test).toBe('test2')
115+
expect(result.RequestItems['test-table'][2].DeleteRequest.Key.pk).toBe('test')
116+
expect(result.RequestItems['test-table'][2].DeleteRequest.Key.sk).toBe('testsk3')
117+
})
118+
119+
it('batchWrites data to multiple tables', () => {
120+
121+
const TestTable2 = new Table({
122+
name: 'test-table2',
123+
alias: 'testTable2',
124+
partitionKey: 'pk',
125+
sortKey: 'sk',
126+
indexes: { GSI1: { partitionKey: 'GSI1pk', sortKey: 'GSIsk1' } },
127+
DocumentClient
128+
})
129+
130+
const TestEntity2 = new Entity({
131+
name: 'TestEntity2',
132+
autoExecute: false,
133+
attributes: {
134+
email: { type: 'string', partitionKey: true },
135+
sort: { type: 'string', sortKey: true },
136+
test: 'string'
137+
},
138+
table: TestTable2
139+
})
140+
141+
let result = TestTable.batchWriteParams([
142+
TestEntity.putBatch({ pk: 'test', sk: 'testsk1', test: 'test1' }),
143+
TestEntity.putBatch({ pk: 'test', sk: 'testsk2', test: 'test2' }),
144+
TestEntity2.putBatch({ pk: 'test', sk: 'testsk3', test: 'test3' })
145+
])
146+
// console.log(JSON.stringify(result,null,2));
147+
148+
expect(result.RequestItems['test-table'][0].PutRequest.Item.pk).toBe('test')
149+
expect(result.RequestItems['test-table'][0].PutRequest.Item.sk).toBe('testsk1')
150+
expect(result.RequestItems['test-table'][0].PutRequest.Item.test).toBe('test1')
151+
expect(result.RequestItems['test-table'][1].PutRequest.Item.pk).toBe('test')
152+
expect(result.RequestItems['test-table'][1].PutRequest.Item.sk).toBe('testsk2')
153+
expect(result.RequestItems['test-table'][1].PutRequest.Item.test).toBe('test2')
154+
expect(result.RequestItems['test-table2'][0].PutRequest.Item.pk).toBe('test')
155+
expect(result.RequestItems['test-table2'][0].PutRequest.Item.sk).toBe('testsk3')
156+
expect(result.RequestItems['test-table2'][0].PutRequest.Item.test).toBe('test3')
157+
158+
})
159+
160+
})

classes/Table.js

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -795,7 +795,7 @@ class Table {
795795

796796
let items = Array.isArray(_items) ? _items : [_items]
797797

798-
// Error on extraneous arguments
798+
// Error on no items
799799
if (items.length === 0)
800800
error(`No items supplied`)
801801

@@ -968,7 +968,11 @@ class Table {
968968
// Generate BatchWrite Params
969969
batchWriteParams(_items,options={},params={},meta) {
970970
// Convert items to array
971-
let items = Array.isArray(_items) ? _items : [_items]
971+
let items = (Array.isArray(_items) ? _items : [_items]).filter(x => x)
972+
973+
// Error on no items
974+
if (items.length === 0)
975+
error(`No items supplied`)
972976

973977
const {
974978
capacity,

0 commit comments

Comments
 (0)