-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.test.js
More file actions
164 lines (130 loc) · 4.7 KB
/
index.test.js
File metadata and controls
164 lines (130 loc) · 4.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
const AWS = require('aws-sdk');
const Plugin = require('./index')
const mockTracker = jest.fn();
const mockGetValue = jest.fn();
const mockWarn = jest.fn();
const mockQuery = jest.fn();
AWS.DynamoDB.DocumentClient.mockImplementation(function() {
return { query: mockQuery };
});
const PluginFactory = (plugin, stage) => {
stage = stage || 'dev'
const serverless = {
cli: {
log: console.log
},
classes: { Error: Error },
service: {
custom: plugin,
getServiceName: () => this.service,
provider: {
name: 'aws',
compiledCloudFormationTemplate: {
Resources: {}
}
},
service: 'fooservice'
},
variables: {
getValueFromSource: mockGetValue,
warnIfNotFound: mockWarn,
tracker: { add: mockTracker }
},
getProvider: () => {
return {
getRegion: () => 'fooregion',
getStage: () => stage,
}
},
}
return new Plugin(serverless, stage)
}
describe('#ServerlessDynamodbParameters', () => {
it('should have correct config', () => {
const config = { 'serverless-dynamodb-parameters': { tableName: 'some-table' } };
const plugin = PluginFactory(config);
expect(plugin.getTableName()).toEqual('some-table');
});
describe('when config is invalid', () => {
beforeEach(() => jest.clearAllMocks());
it('should throw an error', () => {
const config = {};
const plugin = PluginFactory(config);
expect(() => plugin.getTableName()).toThrow(
'Table name must be specified under custom.serverless-dynamodb-parameters.tableName'
);
});
});
describe('when variable is matched', () => {
let plugin;
beforeEach(() => {
jest.clearAllMocks();
const config = { 'serverless-dynamodb-parameters': { tableName: 'some-table' } };
plugin = PluginFactory(config)
});
it('should set the variables from dynamodb in the template', () => {
mockQuery.mockImplementation(() => ({
promise: () => Promise.resolve({
Items: [{
value: 'some-value',
name: 'some-name',
version: 'some-version'
}]
})
}));
mockTracker.mockImplementation((variableString, promise) => promise);
return plugin.serverless.variables
.getValueFromSource('${ddb:my-variable}', 'property')
.then(result => {
expect(result).toEqual('some-value');
expect(mockTracker).toHaveBeenCalled();
expect(mockQuery).toHaveBeenCalled();
expect(mockQuery.mock.calls[0][0]).toEqual({
Limit: 1,
ScanIndexForward: false,
KeyConditionExpression: '#name = :name',
ExpressionAttributeNames: {
'#name': 'name'
},
ExpressionAttributeValues: {
':name': 'my-variable'
}
});
expect(mockTracker.mock.calls[0][0]).toEqual('${ddb:my-variable}');
expect(mockTracker.mock.calls[0][2]).toEqual('property');
});
});
it('should throw error if the parameter has no value', () => {
mockQuery.mockImplementation(() => ({
promise: () => Promise.resolve({ Items: [] })
}));
mockTracker.mockImplementation((variableString, promise) => promise);
return expect(plugin.serverless.variables.getValueFromSource('${ddb:my-variable}', 'property'))
.rejects.toEqual(new Error("Value for '${ddb:my-variable}' could not be found in the Dynamo table 'some-table'"));
});
it('should reject if there is error fetching parameter', () => {
const error = new Error('some error');
error.statusCode = 400;
mockQuery.mockImplementation(() => ({ promise: () => Promise.reject(error)}));
mockTracker.mockImplementation((variableString, promise) => promise);
return expect(plugin.serverless.variables.getValueFromSource('${ddb:my-variable}', 'property'))
.rejects.toEqual(new Error("Value for '${ddb:my-variable}' could not be found in the Dynamo table 'some-table'"));
});
});
describe('when variable is not matched', () => {
let plugin;
beforeEach(() => {
const config = { 'serverless-dynamodb-parameters': { tableName: 'some-table' } };
plugin = PluginFactory(config)
jest.clearAllMocks();
});
it('should return the unchanged variable if it does not match regex', () => {
mockGetValue.mockImplementation(() => 'result');
const expected = plugin.serverless.variables
.getValueFromSource('my-variable', 'property');
expect(expected).toEqual('result');
expect(mockGetValue).toHaveBeenCalledWith('my-variable', 'property');
expect(mockTracker).not.toHaveBeenCalled();
});
});
})