lesgo 0.6.0 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -2
- package/bin/lesgo-scripts.sh +2 -0
- package/package.json +8 -4
- package/src/middlewares/__tests__/errorHttpResponseMiddleware.spec.js +33 -16
- package/src/middlewares/__tests__/gzipHttpResponse.spec.js +6 -6
- package/src/middlewares/__tests__/normalizeHttpRequestMiddleware.spec.js +38 -0
- package/src/middlewares/__tests__/successHttpResponseMiddleware.spec.js +28 -12
- package/src/middlewares/errorHttpResponseMiddleware.js +10 -3
- package/src/middlewares/gzipHttpResponse.js +1 -1
- package/src/middlewares/normalizeHttpRequestMiddleware.js +21 -2
- package/src/middlewares/successHttpResponseMiddleware.js +9 -2
- package/src/middlewares/verifyJwtMiddleware.js +4 -2
- package/src/services/AuroraDbRDSProxyService.js +183 -0
- package/src/services/AuroraDbService.js +39 -5
- package/src/services/DynamoDbService.js +10 -8
- package/src/services/FirebaseAdminService.js +10 -7
- package/src/services/__tests__/AuroraDbRDSProxyService.spec.js +278 -0
- package/src/services/__tests__/AuroraDbService.spec.js +54 -0
- package/src/services/__tests__/LengthAwarePaginator.spec.js +180 -0
- package/src/services/__tests__/Paginator.spec.js +383 -0
- package/src/services/pagination/LengthAwarePaginator.js +49 -0
- package/src/services/pagination/Paginator.js +254 -0
- package/src/utils/__mocks__/db.js +109 -0
- package/src/utils/__tests__/db.spec.js +40 -1
- package/src/utils/__tests__/getJwtSubFromAuthHeader.spec.js +20 -0
- package/src/utils/__tests__/isDecimal.spec.js +12 -0
- package/src/utils/__tests__/isEmail.spec.js +28 -0
- package/src/utils/__tests__/prepSQLInsertParams.spec.js +46 -0
- package/src/utils/__tests__/prepSQLUpdateParams.spec.js +36 -0
- package/src/utils/__tests__/validateFields.spec.js +183 -0
- package/src/utils/db.js +13 -2
- package/src/utils/getJwtSubFromAuthHeader.js +18 -0
- package/src/utils/index.js +2 -0
- package/src/utils/isDecimal.js +2 -0
- package/src/utils/isEmail.js +15 -0
- package/src/utils/logger.js +1 -4
- package/src/utils/prepSQLInsertParams.js +21 -0
- package/src/utils/prepSQLUpdateParams.js +25 -0
- package/src/utils/validateFields.js +75 -0
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
import LesgoException from '../../exceptions/LesgoException';
|
|
2
|
+
import validateFields from '../../utils/validateFields';
|
|
3
|
+
|
|
4
|
+
const FILE = 'Services/pagination/Paginator';
|
|
5
|
+
|
|
6
|
+
export default class Paginator {
|
|
7
|
+
/**
|
|
8
|
+
* Constructor
|
|
9
|
+
*
|
|
10
|
+
* @param db
|
|
11
|
+
* @param sql
|
|
12
|
+
* @param sqlParams
|
|
13
|
+
* @param options
|
|
14
|
+
*/
|
|
15
|
+
constructor(db, sql, sqlParams, options = {}, connection = {}) {
|
|
16
|
+
const validFields = [
|
|
17
|
+
{ key: 'db', type: 'object', required: true },
|
|
18
|
+
{ key: 'sql', type: 'string', required: true },
|
|
19
|
+
{ key: 'sqlParams', type: 'object', required: true },
|
|
20
|
+
{ key: 'perPage', type: 'number', required: false },
|
|
21
|
+
{ key: 'currentPage', type: 'number', required: false },
|
|
22
|
+
{ key: 'connection', type: 'object', required: false },
|
|
23
|
+
];
|
|
24
|
+
|
|
25
|
+
let validated = {};
|
|
26
|
+
try {
|
|
27
|
+
validated = validateFields(
|
|
28
|
+
{
|
|
29
|
+
db,
|
|
30
|
+
sql,
|
|
31
|
+
sqlParams,
|
|
32
|
+
...options,
|
|
33
|
+
connection,
|
|
34
|
+
},
|
|
35
|
+
validFields
|
|
36
|
+
);
|
|
37
|
+
} catch (error) {
|
|
38
|
+
throw new LesgoException(
|
|
39
|
+
error.message,
|
|
40
|
+
`${FILE}::FIELD_VALIDATION_EXCEPTION`,
|
|
41
|
+
500,
|
|
42
|
+
{
|
|
43
|
+
...options,
|
|
44
|
+
error,
|
|
45
|
+
}
|
|
46
|
+
);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
const { perPage, currentPage } = validated;
|
|
50
|
+
|
|
51
|
+
this.dbProp = db;
|
|
52
|
+
this.sqlProp = sql;
|
|
53
|
+
this.sqlParamsProp = sqlParams;
|
|
54
|
+
this.perPageProp = perPage || 10;
|
|
55
|
+
this.currentPageProp = currentPage || 1;
|
|
56
|
+
|
|
57
|
+
this.hasNext = false;
|
|
58
|
+
|
|
59
|
+
this.response = [];
|
|
60
|
+
this.totalProp = false;
|
|
61
|
+
|
|
62
|
+
this.connection = connection;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Count all items in the current page.
|
|
67
|
+
*
|
|
68
|
+
* @returns {number}
|
|
69
|
+
*/
|
|
70
|
+
async count() {
|
|
71
|
+
return this.response.length || (await this.executeQuery()).length;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Previous page
|
|
76
|
+
*
|
|
77
|
+
* @returns {boolean|number}
|
|
78
|
+
*/
|
|
79
|
+
previousPage() {
|
|
80
|
+
if (this.currentPage() > 1) {
|
|
81
|
+
return this.currentPage() - 1;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* The current page.
|
|
89
|
+
*
|
|
90
|
+
* @returns {*|number}
|
|
91
|
+
*/
|
|
92
|
+
currentPage() {
|
|
93
|
+
return this.currentPageProp;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Next page
|
|
98
|
+
*
|
|
99
|
+
* @returns {Promise<boolean|*>}
|
|
100
|
+
*/
|
|
101
|
+
async nextPage() {
|
|
102
|
+
if (this.response.length <= 0) {
|
|
103
|
+
await this.executeQuery();
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
if (this.hasNext) {
|
|
107
|
+
return this.currentPage() + 1;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
return false;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* First item in the current page.
|
|
115
|
+
*
|
|
116
|
+
* @returns {*}
|
|
117
|
+
*/
|
|
118
|
+
async firstItem() {
|
|
119
|
+
if (this.response.length <= 0) {
|
|
120
|
+
await this.executeQuery();
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
return this.response[0];
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Last item in the current page.
|
|
128
|
+
*/
|
|
129
|
+
async lastItem() {
|
|
130
|
+
if (this.response.length <= 0) {
|
|
131
|
+
await this.executeQuery();
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
return this.response[this.response.length - 1];
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Number of items per page.
|
|
139
|
+
*
|
|
140
|
+
* @returns {*}
|
|
141
|
+
*/
|
|
142
|
+
perPage() {
|
|
143
|
+
return this.perPageProp;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* Get the last page.
|
|
148
|
+
*
|
|
149
|
+
* @returns {Promise<number>}
|
|
150
|
+
*/
|
|
151
|
+
async lastPage() {
|
|
152
|
+
return this.calculateTotalNumberOfPages();
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* Total items in all pages.
|
|
157
|
+
*
|
|
158
|
+
* @returns {null|number}
|
|
159
|
+
*/
|
|
160
|
+
async total() {
|
|
161
|
+
return this.totalProp || this.countTotalItems();
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* All items in the current page.
|
|
166
|
+
*
|
|
167
|
+
* @returns {[]}
|
|
168
|
+
*/
|
|
169
|
+
async items() {
|
|
170
|
+
if (this.response.length <= 0) {
|
|
171
|
+
await this.executeQuery();
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
return this.response;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* Convert to object.
|
|
179
|
+
*
|
|
180
|
+
* @returns {Promise<{per_page: *, count: *, items: *, current_page: (*|number)}>}
|
|
181
|
+
*/
|
|
182
|
+
async toObject() {
|
|
183
|
+
if (this.response.length <= 0) {
|
|
184
|
+
await this.executeQuery();
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
return {
|
|
188
|
+
count: await this.count(),
|
|
189
|
+
previous_page: this.previousPage(),
|
|
190
|
+
current_page: this.currentPage(),
|
|
191
|
+
next_page: await this.nextPage(),
|
|
192
|
+
last_page: await this.lastPage(),
|
|
193
|
+
per_page: this.perPage(),
|
|
194
|
+
total: await this.total(),
|
|
195
|
+
items: await this.items(),
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
// They act as protected methods.
|
|
200
|
+
|
|
201
|
+
getLimitAndOffsetByPageAndContentPerPage() {
|
|
202
|
+
const offset = this.currentPage() * this.perPage() - this.perPage();
|
|
203
|
+
const limit = this.perPage();
|
|
204
|
+
|
|
205
|
+
return {
|
|
206
|
+
offset,
|
|
207
|
+
limit,
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
generatePaginationSqlSnippet() {
|
|
212
|
+
const values = this.getLimitAndOffsetByPageAndContentPerPage();
|
|
213
|
+
const limitWithExtraData = values.limit + 1;
|
|
214
|
+
return this.sqlProp.concat(
|
|
215
|
+
` LIMIT ${limitWithExtraData} OFFSET ${values.offset}`
|
|
216
|
+
);
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
async executeQuery() {
|
|
220
|
+
this.response = await this.dbProp.select(
|
|
221
|
+
this.generatePaginationSqlSnippet(),
|
|
222
|
+
this.sqlParamsProp,
|
|
223
|
+
this.connection
|
|
224
|
+
);
|
|
225
|
+
|
|
226
|
+
this.hasNext = this.response.length > this.perPage();
|
|
227
|
+
if (this.hasNext) {
|
|
228
|
+
this.response.pop();
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
return this.response;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
/**
|
|
235
|
+
* Count total items with basic implementation.
|
|
236
|
+
*
|
|
237
|
+
* @returns {Promise<number>}
|
|
238
|
+
*/
|
|
239
|
+
async countTotalItems() {
|
|
240
|
+
const resp = await this.dbProp.select(
|
|
241
|
+
this.sqlProp,
|
|
242
|
+
this.sqlParamsProp,
|
|
243
|
+
this.connection
|
|
244
|
+
);
|
|
245
|
+
this.totalProp = Object.keys(resp).length;
|
|
246
|
+
|
|
247
|
+
return this.totalProp;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
async calculateTotalNumberOfPages() {
|
|
251
|
+
const total = await this.total();
|
|
252
|
+
return Math.ceil(total / this.perPage());
|
|
253
|
+
}
|
|
254
|
+
}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
export const mockData = {
|
|
2
|
+
index_0: 'data_0',
|
|
3
|
+
index_1: 'data_1',
|
|
4
|
+
index_2: 'data_2',
|
|
5
|
+
index_3: 'data_3',
|
|
6
|
+
index_4: 'data_4',
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
export const mockDataFirstItem = {
|
|
10
|
+
index_0: 'data_0_first_item',
|
|
11
|
+
index_1: 'data_1_first_item',
|
|
12
|
+
index_2: 'data_2_first_item',
|
|
13
|
+
index_3: 'data_3_first_item',
|
|
14
|
+
index_4: 'data_4_first_item',
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
export const mockDataLastItem = {
|
|
18
|
+
index_0: 'data_0_last_item',
|
|
19
|
+
index_1: 'data_1_last_item',
|
|
20
|
+
index_2: 'data_2_last_item',
|
|
21
|
+
index_3: 'data_3_last_item',
|
|
22
|
+
index_4: 'data_4_last_item',
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
export default {
|
|
26
|
+
// eslint-disable-next-line no-unused-vars
|
|
27
|
+
select: jest.fn().mockImplementation((sql, sqlParams) => {
|
|
28
|
+
if (sql.startsWith('SELECT * FROM tests LIMIT 6 OFFSET 10')) {
|
|
29
|
+
return Promise.resolve([
|
|
30
|
+
{ ...mockDataFirstItem },
|
|
31
|
+
{ ...mockData },
|
|
32
|
+
{ ...mockData },
|
|
33
|
+
{ ...mockData },
|
|
34
|
+
{ ...mockDataLastItem },
|
|
35
|
+
]);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
if (
|
|
39
|
+
sql.startsWith('SELECT * FROM tests LIMIT 6') ||
|
|
40
|
+
sql.startsWith('SELECT * FROM total_tests LIMIT 6')
|
|
41
|
+
) {
|
|
42
|
+
return Promise.resolve([
|
|
43
|
+
{ ...mockDataFirstItem },
|
|
44
|
+
{ ...mockData },
|
|
45
|
+
{ ...mockData },
|
|
46
|
+
{ ...mockData },
|
|
47
|
+
{ ...mockDataLastItem },
|
|
48
|
+
{ ...mockData },
|
|
49
|
+
]);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
if (sql.startsWith('SELECT * FROM total_tests')) {
|
|
53
|
+
return Promise.resolve([
|
|
54
|
+
{ ...mockDataFirstItem },
|
|
55
|
+
{ ...mockData },
|
|
56
|
+
{ ...mockData },
|
|
57
|
+
{ ...mockData },
|
|
58
|
+
{ ...mockData },
|
|
59
|
+
{ ...mockData },
|
|
60
|
+
{ ...mockData },
|
|
61
|
+
{ ...mockData },
|
|
62
|
+
{ ...mockData },
|
|
63
|
+
{ ...mockData },
|
|
64
|
+
{ ...mockData },
|
|
65
|
+
{ ...mockData },
|
|
66
|
+
{ ...mockData },
|
|
67
|
+
{ ...mockData },
|
|
68
|
+
{ ...mockData },
|
|
69
|
+
{ ...mockData },
|
|
70
|
+
{ ...mockData },
|
|
71
|
+
{ ...mockData },
|
|
72
|
+
{ ...mockData },
|
|
73
|
+
{ ...mockData },
|
|
74
|
+
{ ...mockData },
|
|
75
|
+
{ ...mockData },
|
|
76
|
+
{ ...mockData },
|
|
77
|
+
{ ...mockData },
|
|
78
|
+
{ ...mockData },
|
|
79
|
+
{ ...mockData },
|
|
80
|
+
{ ...mockData },
|
|
81
|
+
{ ...mockData },
|
|
82
|
+
{ ...mockData },
|
|
83
|
+
{ ...mockDataLastItem },
|
|
84
|
+
]);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
if (sql.startsWith('SELECT * FROM tests')) {
|
|
88
|
+
return Promise.resolve([
|
|
89
|
+
{ ...mockData },
|
|
90
|
+
{ ...mockData },
|
|
91
|
+
{ ...mockData },
|
|
92
|
+
{ ...mockData },
|
|
93
|
+
{ ...mockData },
|
|
94
|
+
{ ...mockData },
|
|
95
|
+
{ ...mockData },
|
|
96
|
+
{ ...mockData },
|
|
97
|
+
{ ...mockData },
|
|
98
|
+
{ ...mockData },
|
|
99
|
+
]);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
return Promise.resolve({
|
|
103
|
+
mocked: {
|
|
104
|
+
sql,
|
|
105
|
+
sqlParams,
|
|
106
|
+
},
|
|
107
|
+
});
|
|
108
|
+
}),
|
|
109
|
+
};
|
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
import config from 'Config/db'; // eslint-disable-line import/no-unresolved
|
|
2
|
-
|
|
2
|
+
|
|
3
|
+
let db;
|
|
4
|
+
|
|
5
|
+
beforeEach(() => {
|
|
6
|
+
jest.isolateModules(() => {
|
|
7
|
+
db = require('../db').default; // eslint-disable-line global-require
|
|
8
|
+
});
|
|
9
|
+
});
|
|
3
10
|
|
|
4
11
|
describe('test db utils instantiate', () => {
|
|
5
12
|
it('should not throw error on instantiating AuroraDbService', () => {
|
|
@@ -29,4 +36,36 @@ describe('test db utils instantiate', () => {
|
|
|
29
36
|
},
|
|
30
37
|
});
|
|
31
38
|
});
|
|
39
|
+
|
|
40
|
+
it('should update AuroraDb credentials on connect based on dataApi config', () => {
|
|
41
|
+
config.default = 'dataApi';
|
|
42
|
+
let thisDb;
|
|
43
|
+
jest.isolateModules(() => {
|
|
44
|
+
thisDb = require('../db').default; // eslint-disable-line global-require
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
return expect(thisDb.client).toMatchObject({
|
|
48
|
+
mocked: {
|
|
49
|
+
database: config.connections.dataApi.database,
|
|
50
|
+
resourceArn: config.connections.dataApi.resourceArn,
|
|
51
|
+
secretArn: config.connections.dataApi.secretArn,
|
|
52
|
+
},
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
it('should update AuroraDb credentials on connect based on rdsProxy config', () => {
|
|
57
|
+
config.default = 'rdsProxy';
|
|
58
|
+
let thisDb;
|
|
59
|
+
jest.isolateModules(() => {
|
|
60
|
+
thisDb = require('../db').default; // eslint-disable-line global-require
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
return expect(thisDb.clientOpts).toMatchObject({
|
|
64
|
+
database: config.connections.rdsProxy.database,
|
|
65
|
+
host: config.connections.rdsProxy.host,
|
|
66
|
+
user: config.connections.rdsProxy.user,
|
|
67
|
+
password: config.connections.rdsProxy.password,
|
|
68
|
+
persists: config.connections.rdsProxy.persists,
|
|
69
|
+
});
|
|
70
|
+
});
|
|
32
71
|
});
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import getJwtSubFromAuthHeader from '../getJwtSubFromAuthHeader';
|
|
2
|
+
|
|
3
|
+
const authorizationHeader =
|
|
4
|
+
'eyJraWQiOiIzSHc3YmRuUHBIMnJSZWhjT3k5NFRLZm5ybzU0Y1RFUW1lcGtVYWc2bW1vPSIsImFsZyI6IlJTMjU2In0.eyJzdWIiOiJmMmI1MzQ5ZC1mNWUzLTQ0ZjUtOWMwOC1hZTZiMDFlOTU0MzQiLCJhdWQiOiI0aHM0a2ZpNTAwZWtkajJhZTdiOWExazU4byIsImVtYWlsX3ZlcmlmaWVkIjpmYWxzZSwiZXZlbnRfaWQiOiJlNzdiZGZmYy0wYjFjLTQzMzMtYWUxZS1lM2QwNjZkNzAyZGMiLCJ0b2tlbl91c2UiOiJpZCIsImF1dGhfdGltZSI6MTYxNTYxMTc3NywiaXNzIjoiaHR0cHM6XC9cL2NvZ25pdG8taWRwLmFwLXNvdXRoZWFzdC0xLmFtYXpvbmF3cy5jb21cL2FwLXNvdXRoZWFzdC0xXzR3QjFuSmNvSyIsImNvZ25pdG86dXNlcm5hbWUiOiJmMmI1MzQ5ZC1mNWUzLTQ0ZjUtOWMwOC1hZTZiMDFlOTU0MzQiLCJleHAiOjE2MTU2MTUzNzcsImlhdCI6MTYxNTYxMTc3NywiZW1haWwiOiJzdWZpeWFuK3Rlc3RAaW5jdWJlOC5zZyJ9.hbNYnVt6_fhX5KJEfn6Fi9cOZkQAldHGitVBWXSd0_YcWDU_BJ1OVu_VFEKzIvaRLR_zy2eW3dIJ27pn1_6U0sS8MZMsvtz0SKQP4M1hTEnhb5TOSIcOs9Y6ZPy1e1ShIqQmq2j_K1JFzEZH7u3eOmCTmFcs8X5vUk8O1sT2KqBP5UCBVB_4rCVEjbRGdyynqEKcdKkd7Nk6v9onpxRbG3FOg6vlsKSlfZ6RIz3jbjO4ZkCJiYAgrI7bsh2VGwE8pZq80GuQy9pocLkTcZiAFcni50-yvePQX8tkXhPzbp7DibAI6nU87Ol6TW4ZmB-0BZ56Nfeowoe7tT-7hvGkGA';
|
|
5
|
+
|
|
6
|
+
describe('test Utils/getJwtSubFromAuthHeader util', () => {
|
|
7
|
+
it('should get sub from Authorization header', () => {
|
|
8
|
+
expect(getJwtSubFromAuthHeader(authorizationHeader)).toBe(
|
|
9
|
+
'f2b5349d-f5e3-44f5-9c08-ae6b01e95434'
|
|
10
|
+
);
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
it('should get sub as null from missing or empty header', () => {
|
|
14
|
+
expect(getJwtSubFromAuthHeader()).toBe(null);
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
it('should get sub as null from invalid Authorization header', () => {
|
|
18
|
+
expect(getJwtSubFromAuthHeader('some-invalid-token')).toBe(null);
|
|
19
|
+
});
|
|
20
|
+
});
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import isDecimal from '../isDecimal';
|
|
2
|
+
|
|
3
|
+
describe('test Utils/isDecimal util', () => {
|
|
4
|
+
it('should return false for string', () => {
|
|
5
|
+
expect(isDecimal('1')).toBeFalsy();
|
|
6
|
+
expect(isDecimal('one')).toBeFalsy();
|
|
7
|
+
});
|
|
8
|
+
|
|
9
|
+
it('should return true for decimal number', () => {
|
|
10
|
+
return expect(isDecimal(1.5)).toBeTruthy();
|
|
11
|
+
});
|
|
12
|
+
});
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import isEmail from '../isEmail';
|
|
2
|
+
import LesgoException from '../../exceptions/LesgoException';
|
|
3
|
+
|
|
4
|
+
describe('test isEmail util', () => {
|
|
5
|
+
test('isEmail should throws an Error when empty sting parameters were passed', () => {
|
|
6
|
+
expect(() => {
|
|
7
|
+
isEmail('');
|
|
8
|
+
}).toThrow(
|
|
9
|
+
new LesgoException('Empty parameter supplied', 'IS_EMAIL_EMPTY_PARAMETER')
|
|
10
|
+
);
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
test('isEmail should throws an Error when null parameters were passed', () => {
|
|
14
|
+
expect(() => {
|
|
15
|
+
isEmail(null);
|
|
16
|
+
}).toThrow(
|
|
17
|
+
new LesgoException('Empty parameter supplied', 'IS_EMAIL_EMPTY_PARAMETER')
|
|
18
|
+
);
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
it('isEmail should return false for invalid email ', () => {
|
|
22
|
+
return expect(isEmail('test@g')).toBeFalsy();
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
it('isEmail should return true for valid email', () => {
|
|
26
|
+
return expect(isEmail('test@gmail.com')).toBeTruthy();
|
|
27
|
+
});
|
|
28
|
+
});
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import prepSQLInsertParams from '../prepSQLInsertParams';
|
|
2
|
+
|
|
3
|
+
const columns = [
|
|
4
|
+
{ key: 'uid', type: 'string', required: true },
|
|
5
|
+
{
|
|
6
|
+
key: 'type',
|
|
7
|
+
type: 'enum',
|
|
8
|
+
enumValues: ['photo', 'video'],
|
|
9
|
+
required: true,
|
|
10
|
+
},
|
|
11
|
+
{ key: 'table_name', type: 'string', required: false },
|
|
12
|
+
{ key: 'row_id', type: 'number', required: false },
|
|
13
|
+
{ key: 'id', type: 'number', required: true },
|
|
14
|
+
];
|
|
15
|
+
|
|
16
|
+
describe('test prepSQLInsertParams util', () => {
|
|
17
|
+
test('should return all the fields if provided', () => {
|
|
18
|
+
const params = {
|
|
19
|
+
uid: 'sample-123123',
|
|
20
|
+
type: 'photo',
|
|
21
|
+
table_name: 'medias',
|
|
22
|
+
row_id: 123,
|
|
23
|
+
id: 123,
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
expect(prepSQLInsertParams(params, columns)).toMatchObject({
|
|
27
|
+
insertColumns: 'uid,type,table_name,row_id,id',
|
|
28
|
+
insertValues: ':uid,:type,:table_name,:row_id,:id',
|
|
29
|
+
insertFields: params,
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
test('should return only the given fields', () => {
|
|
34
|
+
const params = {
|
|
35
|
+
uid: 'sample-123123',
|
|
36
|
+
type: 'photo',
|
|
37
|
+
id: 123,
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
expect(prepSQLInsertParams(params, columns)).toMatchObject({
|
|
41
|
+
insertColumns: 'uid,type,id',
|
|
42
|
+
insertValues: ':uid,:type,:id',
|
|
43
|
+
insertFields: params,
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
});
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import prepSQLUpdateParams from '../prepSQLUpdateParams';
|
|
2
|
+
|
|
3
|
+
const columns = [
|
|
4
|
+
{ key: 'id', type: 'number', required: true },
|
|
5
|
+
{ key: 'table_name', type: 'string', required: false },
|
|
6
|
+
{ key: 'row_id', type: 'number', required: false },
|
|
7
|
+
];
|
|
8
|
+
|
|
9
|
+
describe('test prepSQLUpdateParams util', () => {
|
|
10
|
+
test('should return all the fields if provided', () => {
|
|
11
|
+
const params = {
|
|
12
|
+
id: 123,
|
|
13
|
+
table_name: 'users',
|
|
14
|
+
row_id: 123,
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
expect(prepSQLUpdateParams(params, columns)).toMatchObject({
|
|
18
|
+
updateColumnValues: 'table_name=:table_name,row_id=:row_id',
|
|
19
|
+
wherePrimaryKey: 'id=:id',
|
|
20
|
+
updateFields: params,
|
|
21
|
+
});
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
test('should return only the provided fields', () => {
|
|
25
|
+
const params = {
|
|
26
|
+
id: 123,
|
|
27
|
+
row_id: 124,
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
expect(prepSQLUpdateParams(params, columns)).toMatchObject({
|
|
31
|
+
updateColumnValues: 'row_id=:row_id',
|
|
32
|
+
wherePrimaryKey: 'id=:id',
|
|
33
|
+
updateFields: params,
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
});
|