Skip to content

Commit 564d3f9

Browse files
feat(projection-expression): extract function to add param
extract the function to add the projection expression param into own function with tests
1 parent 229418f commit 564d3f9

File tree

4 files changed

+50
-55
lines changed

4 files changed

+50
-55
lines changed

src/dynamo/request/batchgetsingletable/batch-get-single-table.request.spec.ts

Lines changed: 7 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,7 @@ import * as DynamoDB from 'aws-sdk/clients/dynamodb'
33
// tslint:disable:no-unused-expression
44
// tslint:disable:no-non-null-assertion
55
import { resetDynamoEasyConfig } from '../../../../test/helper/resetDynamoEasyConfig.function'
6-
import {
7-
ComplexModel,
8-
SimpleWithCompositePartitionKeyModel,
9-
SimpleWithPartitionKeyModel,
10-
} from '../../../../test/models'
6+
import { SimpleWithCompositePartitionKeyModel, SimpleWithPartitionKeyModel } from '../../../../test/models'
117
import { updateDynamoEasyConfig } from '../../../config/update-config.function'
128
import { getTableName } from '../../get-table-name.function'
139
import { BatchGetSingleTableRequest } from './batch-get-single-table.request'
@@ -74,25 +70,13 @@ describe('batch get', () => {
7470

7571
it('projection expression', () => {
7672
const request = new BatchGetSingleTableRequest<any>(<any>null, SimpleWithPartitionKeyModel, [{ id: 'myId' }])
77-
request.projectionExpression('name')
73+
request.projectionExpression('age')
7874
expect(request.params.RequestItems).toBeDefined()
79-
expect(request.params.RequestItems[getTableName(SimpleWithPartitionKeyModel)]).toBeDefined()
80-
expect(request.params.RequestItems[getTableName(SimpleWithPartitionKeyModel)].ProjectionExpression).toBe('#name')
81-
expect(request.params.RequestItems[getTableName(SimpleWithPartitionKeyModel)].ExpressionAttributeNames).toEqual({
82-
'#name': 'name',
83-
})
84-
})
85-
86-
it('projection expression (custom db attribute name)', () => {
87-
const request = new BatchGetSingleTableRequest<ComplexModel>(<any>null, ComplexModel, [
88-
{ id: 'myId', creationDate: new Date() },
89-
])
90-
request.projectionExpression('active')
91-
expect(request.params.RequestItems).toBeDefined()
92-
expect(request.params.RequestItems[getTableName(ComplexModel)]).toBeDefined()
93-
expect(request.params.RequestItems[getTableName(ComplexModel)].ProjectionExpression).toBe('#active')
94-
expect(request.params.RequestItems[getTableName(ComplexModel)].ExpressionAttributeNames).toEqual({
95-
'#active': 'isActive',
75+
const params = request.params.RequestItems[getTableName(SimpleWithPartitionKeyModel)]
76+
expect(params).toBeDefined()
77+
expect(params.ProjectionExpression).toBe('#age')
78+
expect(params.ExpressionAttributeNames).toEqual({
79+
'#age': 'age',
9680
})
9781
})
9882
})

src/dynamo/request/get/get.request.spec.ts

Lines changed: 4 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,6 @@
11
// tslint:disable:no-unused-expression
22
import * as DynamoDB from 'aws-sdk/clients/dynamodb'
3-
import {
4-
ComplexModel,
5-
SimpleWithCompositePartitionKeyModel,
6-
SimpleWithPartitionKeyModel,
7-
} from '../../../../test/models'
3+
import { SimpleWithCompositePartitionKeyModel, SimpleWithPartitionKeyModel } from '../../../../test/models'
84
import { updateDynamoEasyConfig } from '../../../config/update-config.function'
95
import { Attributes } from '../../../mapper/type/attribute.type'
106
import { getTableName } from '../../get-table-name.function'
@@ -38,11 +34,11 @@ describe('GetRequest', () => {
3834
})
3935

4036
it('projection expression', () => {
41-
request.projectionExpression('name')
37+
request.projectionExpression('age')
4238

4339
const params = request.params
44-
expect(params.ProjectionExpression).toBe('#name')
45-
expect(params.ExpressionAttributeNames).toEqual({ '#name': 'name' })
40+
expect(params.ProjectionExpression).toBe('#age')
41+
expect(params.ExpressionAttributeNames).toEqual({ '#age': 'age' })
4642
expect(Object.keys(params).length).toBe(4)
4743
})
4844

@@ -57,23 +53,6 @@ describe('GetRequest', () => {
5753
})
5854
})
5955

60-
describe('correct params (complex model)', () => {
61-
let request: GetRequest<ComplexModel>
62-
63-
beforeEach(() => {
64-
request = new GetRequest(<any>null, ComplexModel, 'partitionKeyValue', new Date())
65-
})
66-
67-
it('projection expression', () => {
68-
request.projectionExpression('active')
69-
70-
const params = request.params
71-
expect(params.ProjectionExpression).toBe('#active')
72-
expect(params.ExpressionAttributeNames).toEqual({ '#active': 'isActive' })
73-
expect(Object.keys(params).length).toBe(4)
74-
})
75-
})
76-
7756
describe('maps response item', () => {
7857
const jsItem: SimpleWithPartitionKeyModel = { age: 20, id: 'my-id' }
7958
const dbItem: Attributes<SimpleWithPartitionKeyModel> = { age: { N: '20' }, id: { S: 'my-id' } }
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import * as DynamoDB from 'aws-sdk/clients/dynamodb'
2+
import { ComplexModel, SimpleWithPartitionKeyModel } from '../../../../test/models'
3+
import { metadataForModel } from '../../../decorator/metadata/metadata-for-model.function'
4+
import { addProjectionExpressionParam } from './add-projection-expression-param.function'
5+
6+
describe('add projection expression param function', () => {
7+
let params: DynamoDB.KeysAndAttributes
8+
9+
beforeEach(() => {
10+
params = <DynamoDB.KeysAndAttributes>{}
11+
})
12+
13+
it('add single projection attribute to params', () => {
14+
addProjectionExpressionParam<SimpleWithPartitionKeyModel>(['age'], params)
15+
expect(params.ProjectionExpression).toBeDefined()
16+
expect(params.ProjectionExpression).toBe('#age')
17+
expect(params.ExpressionAttributeNames).toEqual({ '#age': 'age' })
18+
})
19+
20+
it('add multiple projection attribute to params', () => {
21+
addProjectionExpressionParam<SimpleWithPartitionKeyModel>(['age', 'id'], params)
22+
expect(params.ProjectionExpression).toBeDefined()
23+
expect(params.ProjectionExpression).toBe('#age, #id')
24+
expect(params.ExpressionAttributeNames).toEqual({ '#age': 'age', '#id': 'id' })
25+
})
26+
27+
it('add multiple projection attribute respecting given metadata to params', () => {
28+
addProjectionExpressionParam<ComplexModel>(['active', 'simpleProperty'], params, metadataForModel(ComplexModel))
29+
expect(params.ProjectionExpression).toBeDefined()
30+
expect(params.ProjectionExpression).toBe('#active, #simpleProperty')
31+
expect(params.ExpressionAttributeNames).toEqual({ '#active': 'isActive', '#simpleProperty': 'simpleProperty' })
32+
})
33+
})

src/dynamo/request/read-many.request.spec.ts

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import * as DynamoDB from 'aws-sdk/clients/dynamodb'
22
import {
3-
ComplexModel,
43
ModelWithABunchOfIndexes,
54
SimpleWithCompositePartitionKeyModel,
65
SimpleWithPartitionKeyModel,
@@ -125,19 +124,19 @@ describe('ReadManyRequest', () => {
125124
})
126125
})
127126

128-
describe('projectionExpression', () => {
127+
describe('projection expression', () => {
129128
beforeEach(() => {
130-
request = new TestRequest(ComplexModel)
129+
request = new TestRequest(SimpleWithPartitionKeyModel)
131130
})
132131

133132
it('should set param for projection expression', () => {
134-
request.projectionExpression('active', 'lastUpdated')
135-
expect(request.params.ProjectionExpression).toBe('#active, #lastUpdated')
136-
expect(request.params.ExpressionAttributeNames).toEqual({ '#active': 'isActive', '#lastUpdated': 'lastUpdated' })
133+
;(request as TestRequest<SimpleWithPartitionKeyModel>).projectionExpression('age')
134+
expect(request.params.ProjectionExpression).toBe('#age')
135+
expect(request.params.ExpressionAttributeNames).toEqual({ '#age': 'age' })
137136
})
138137

139138
it('should return instance', () => {
140-
const r = request.projectionExpression('active')
139+
const r = request.projectionExpression('age')
141140
expect(r).toBe(request)
142141
})
143142
})

0 commit comments

Comments
 (0)